软件工程作业:个人项目-WC项目

项目相关要求

wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

具体功能要求:

程序处理用户需求的模式为:

wc.exe [parameter] [file_name]

  • 基本功能列表:

wc.exe -c file.c //返回文件 file.c 的字符数

wc.exe -w file.c //返回文件 file.c 的词的数目

wc.exe -l file.c //返回文件 file.c 的行数

  • 扩展功能:

    -s 递归处理目录下符合条件的文件。

    -a 返回更复杂的数据(代码行 / 空行 / 注释行)。

    • 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

    • 代码行:本行包括多于一个字符的代码。

    • 注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

} //注释

在这种情况下,这一行属于注释行。

  • 高级功能:

    • -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

    • 需求举例: wc.exe -s -a *.c

返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。


1.项目Github地址

我的github的项目:

https://github.com/JoyGin/wc

2.遇到的困难及解决方法

困难一:

判读命令中参数输入的合法性

创建了一个Set,将合法的参数初始化进去,若从命令中截取的参数不在集合内,则判为输入错误,重新输入。

此方法可以避免反复的循环判断

代码如下:

    private static Set<String> set=new HashSet<String>();//存放正确的参数集合
//将命令转换成map,map中包含参数数组和文件名
public static Map<String,String[]> converse(String cmd) {
set.add("-c");set.add("-w");set.add("-l");set.add("-s");set.add("-a");//初始化合法参数集合
Map<String,String[]> paramAndFile=new HashMap<String,String[]>();
String[] paramWithPath=cmd.split(" ");
String[] param=new String[paramWithPath.length-1];
for(int i=0;i<paramWithPath.length;i++) {
if(i==paramWithPath.length-1) {
paramAndFile.put("fileName",new String[] {paramWithPath[i]});
}else {
if(!set.contains(paramWithPath[i])) return null;
else param[i]=paramWithPath[i];
}
}
paramAndFile.put("parameters",param);
return paramAndFile;
}

图形化界面:

一开始不知道从何下手,后来查找资料发现java的swing

    public static void graphic() {
chooser = new JFileChooser();
int value = chooser.showOpenDialog(null);
if (value == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
String filename = file.getAbsolutePath();
Map<String,Integer> map=count(filename);
print(true,null,map);
}
}

3.关键代码or设计说明

统计行数、字符数、单词数、注释行数、空白行数、代码行数,最终以Map返回,若返回为null说明路径错误,外部函数可以通过这个判断:

    //计算字符数、行数等
public static Map<String,Integer> count(String fileName) {
Map<String,Integer> map=new HashMap<String,Integer>();
int lineCount = 0;//行数
int wordCount = 0;//单词数
int charCount = 0;//字符数
int nullLineCount = 0;// 空行数
int codeLineCount = 0;// 代码行数
int noteLineCount = 0;// 注释行数
File file = new File(fileName);
if (file.exists()) {
try {
//文件流读取文件
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
lineCount++;
sb.append(line);
charCount += line.length();
//去掉首尾空格
line = line.trim();
// 空白行
if (line == "" || line.length() <= 1) {
nullLineCount++;
continue;
}
// 注释行
int a = line.indexOf("/");
int b = line.substring(a + 1).indexOf("/");
if (b == 0) {
noteLineCount++;
continue;
}
codeLineCount++;// 代码行
}
wordCount = sb.toString().split("\\s+").length;//单词行
br.close();
isr.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
map.put("lineCount", lineCount);
map.put("wordCount", wordCount);
map.put("charCount", charCount);
map.put("nullLineCount", nullLineCount);
map.put("codeLineCount", codeLineCount);
map.put("noteLineCount", noteLineCount);
return map;
} else {
System.out.println("path error");
return null;
}
}

图形化界面效果:

进行单元测试:



4.PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 15
· Estimate · 估计这个任务需要多少时间 30 15
Development 开发 595 725
· Analysis · 需求分析 (包括学习新技术) 120 150
· Design Spec · 生成设计文档 30 15
· Design Review · 设计复审 (和同事审核设计文档) 15 13
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 7
· Design · 具体设计 60 10
· Coding · 具体编码 180 300
· Code Review · 代码复审 60 30
· Test · 测试(自我测试,修改代码,提交修改) 120 180
Reporting 报告 55 50
· Test Report · 测试报告 30 25
· Size Measurement · 计算工作量 10 5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 15 20
合计 680 770

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 266 266 680 680 熟悉java语言面向对象的特性,初步掌握软件测试能力,初始熟悉软件开发的基本流程和时间规划,对PSP表格有了解的基础上再加深了理解

软件工程作业:个人项目—wc项目的更多相关文章

  1. 实践简单的项目WC

    #include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...

  2. 软件工程wc项目,基于py

    ###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...

  3. 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

    软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...

  4. 在PyCharm 软件中设置你的项目 使用的Python版本

    在PyCharm 软件中设置你的项目 使用的Python版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 就运行不了:使用python3编 ...

  5. 个人项目-wc

    个人项目-WC   (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...

  6. 个人项目-WC(Java实现)

    一.Github项目地址: https://github.com/kestrelcjx/-WC-Java- 二.PSP表格 PSP2.1 Personal Software Process Stage ...

  7. 个人项目—WC

     一,Github地址:https://github.com/mushan520/WC.git 二.PSP表格: PSP2.1 Personal Software Process Stages 预估耗 ...

  8. 个人项目wc

    github地址:https://github.com/YTFFBX/wc 1.题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行单元测试.回归测试.效 ...

  9. 软件工程作业 - word count

    (编程和软件工程作业系列) 实践最简单的项目:WC 实践是理论的基础和验证标准,希望读者贯彻“做中学”的思想,动手实现下面的项目,并和别人的成绩相比较,分析产生差距的原因. 1. 实现一个简单而完整的 ...

  10. 毕业设计代做,各种系统微服务项目ssm项目,员工管理系统,微信小程序,购物商城,二手商城系统,销售系统,等等

    毕业设计代做,各种系统,微服务项目,ssm项目 小程序,商城等,期末作业等都可以,价格好说,长期接单, 有项目说明书,软件介绍相关文档,答辩的时候包过,知识点对接好,给你讲解等, 毕业设计代做,各种系 ...

随机推荐

  1. git bash 笔记

    下载和安装 官网下载地址:https://git-scm.com/ 国内镜像下载地址:https://registry.npmmirror.com/binary.html?path=git-for-w ...

  2. @JsonFormat

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8" 不管是前端传后台,还是后台传前端, ...

  3. WPF BackSpace 回退到上一个页面

    在Wpf程序中,有时候点击到某些控件后,再按下[BackSpace]键,画面会回到上一个 TextBox可能自己处理了,所以没有这一个现象. 解决方案是: 在App.xaml.cs 的 Initial ...

  4. uniapp文件复制,重命名以及删除

    查找某目录下的文件 plus.io.resolveLocalFileSystemURL(        "_www/static/本地.png",            funct ...

  5. 画ERA5气压层剖面图(含地形)

    气象上一般使用气压垂直坐标系,在不同的气压层绘制变量.ERA5再分析数据的最低气压层是1000 hPa.实际上,由于地形起伏,一些位置的地面气压低于1000 hPa,一些位置的地面气压高于1000 h ...

  6. tomcat代理,监控及性能优化

    第1章 tomcat简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同 ...

  7. R6-1 输入年份和天数,输出对应的年、月、日

    R6-1 输入年份和天数,输出对应的年.月.日 分数 15 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 要求定义和调用函数month_day ( year, yeardy, *****pm ...

  8. 一种简单方便的postgresql插件multicorn安装方法 ---yum install multicorn10.x86_64

    Yum 安装multicorn的方法,一下子解决了之前make&make install方式安装的各种问题必须记录一下. 1.yum search multicorn----找到需要的包 2. ...

  9. Queries Gym - 100741A - 树状数组

    给定 \(n\) 和 \(m\),对于 \(n\) 个数字 \(a_i\),进行下列三种操作: (1) + p r: 将 p 位置的元素加上 r, 输出此时 p 位置的值: (2) - p r : 将 ...

  10. jQuery 使用手册(一)

    一:核心部分$(expr)说明:该函数可以通过css选择器,Xpath或html代码来匹配目标元素,所有的jQuery操作都以此为基础参数:expr:字符串,一个查询表达式或一段html字符串例子:未 ...