软工作业1:wc.exe项目开发(java)
Github地址:https://github.com/Zzhaomin/learngit
项目相关要求 :
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 返回更复杂的数据(代码行 / 空行 / 注释行)。(实现)
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
[file_name]: 文件或目录名,可以处理一般通配符。
高级功能:
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wc.exe -s -a *.c
返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
遇到的困难及解决方法
- 困难描述
1. 一开始接触到题目时,就不知道如何输入命令和文件路径
2.对如何运用正则表达式去统计单词数这一方面不太懂
3.不懂得如何写测试单元
- 做过哪些尝试
1.百度搜索,然后看到了一些关于输入命令,空格,然后再输入文件路径,拆分成两部分使用的方法
2.收集一些关于正则表达式的学习资料,认真学习正则表达式
3.百度搜索如何写单元测试,以及问同学
- 是否解决
困难描述中的1、2两个困难都解决了,但困难描述3中如何写好单元测试还没有解决,写的单元测试有错
- 有何收获
1.重温了很多关于java的内容,例如输入输出流、switch等。
2.对正则表达式有一定的了解;懂得写一些比较简单的表达式
3.虽然单元测试没有写正确,但在尝试过程中也了解了单元测试的重要性。
设计实现过程
接收控制台输入,判断命令和文件路径是否正确,然后用switch语句读取命令,判断命令,调用各类方法。
代码说明
1.实现返回文件字符数目的功能
逐行读取文件,累加每一行的长度,直到文件被读取完。
//统计字符数目
public static int cCount() throws IOException {
cCount = 0;
File file = new File(File);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while ((line = br.readLine()) != null) {
cCount += line.length();
}
return cCount;
}
2.实现返回文件词数的功能
逐行读取文件,去除每一行起始和结束的空格,然后用split("\\s+").length统计词数
//统计词的数目
public static int wCount() throws IOException {
wCount = 0;
File file = new File(File);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
line = line.trim();//删除起始和结尾的空格
wCount = sb.toString().split("\\s+").length;
}
return wCount;
}
3.实现返回文件总行数的功能
逐行读取文件,每读取一行,行数+1,直到读取完文件。
//统计行数总数
public static int lCount() throws IOException {
lCount = 0;
File file = new File(File);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine())!= null) {
lCount = lCount +1;
}
return lCount;
}
4.实现统计代码行数、空白行数、注释行数的功能
逐行读取文件,根据判断line是否为空或长度是否小于等于1,为空或长度小于等于1空白行加1,判断行里是否连续出现//,若有注释行加1,其他情况代码行加1,一直读完整个文件
//统计代码行数、空白行数、注释行数
public static void moreLineCount() throws IOException {
codeLineCount = 0;
nullLineCount = 0;
noteLineCount = 0;
File file = new File(File);
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
if (line == "" || line.length() <= 1) {
nullLineCount = nullLineCount + 1;
continue;
}
int a = line.indexOf("/");//返回第一次出现的指定子字符串在此字符串中的索引。
int b = line.substring(a + 1).indexOf("/");
if (b == 0) {
noteLineCount++;
continue;
}
codeLineCount++;
}
}
5.main方法
判断输入的文件路径是否有误,没有就用switch调用方法得出相应的输出
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
System.out.print("wc.exe ");
Scanner s = new Scanner(System.in);
command = s.nextLine();
string = command.split(" ");
string1 = string[0];
File = string[1]; File file = new File(File);
if (file.exists()) {
switch(string1) {
case "-c" :
System.out.println("字符数目 :" + cCount());
break;
case "-w" :
System.out.println("词的数目 :" + wCount());
break;
case "-l" :
System.out.println("行数数目 : " + lCount());
break;
case "-a" :
moreLineCount();
System.out.println("代码行数 : " + codeLineCount);
System.out.println("空白行数 : " + nullLineCount);
System.out.println("注释行数 : " + noteLineCount);
break;
default : System.out.println("没有此命令");
}
}
else {
System.out.println("文件路径输入有误或者文件路径不存在");
} }
测试运行
1.空白文件测试结果
测试结果正确
2.只有一个字符的文件测试结果
3.一个源文件的测试结果
PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
20 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
20 |
15 |
Development |
开发 |
300 | 250 |
· Analysis |
· 需求分析 (包括学习新技术) |
300 | 350 |
· Design Spec |
· 生成设计文档 |
60 | 30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 | 20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 | 30 |
· Design |
· 具体设计 |
60 | 70 |
· Coding |
· 具体编码 |
300 | 400 |
· Code Review |
· 代码复审 |
100 | 120 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
200 | 300 |
Reporting |
报告 |
120 | 180 |
· Test Report |
· 测试报告 |
60 | 60 |
· Size Measurement |
· 计算工作量 |
60 | 70 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 40 |
合计 |
1730 | 1955 |
项目小结
1.对于java语言比较陌生,很多知识点都忘了,这次任务对于我来说有很大的难度,最终能把项目做出来还是很开心的
2.很多时候都是靠百度来解决问题,明确到搜索资料的重要性
3.对于Git、GitHub有了初步的了解。在初次建库上传代码时,出现了很多问题。一开始用命令行不成功,后来在eclispe里安装插件进行上传也是失败了,最后又尝试用命令行上传成功了
4.对于单元测试还是不懂。
软工作业1:wc.exe项目开发(java)的更多相关文章
- 软件工程个人作业(wc.exe项目)
一.项目Github地址 https://github.com/huangzihaohzh/WordCounter 二.PSP表格 PSP2.1 Personal Software Process S ...
- 软工作业PSP与单元测试训练:java语言判断电子邮箱格式
任务说明(二选一): 一.实现模块判断传入的身份证号码的正确性: 二.实现模块判断传入的电子邮箱账号的正确性: 实现要求: 一.实现功能模块: 1. 判断邮箱地址是否为空: 2. 判断邮箱地址是否 ...
- [软工作业]-软件案例分析-CSDN
[软工作业]-软件案例分析-CSDN(app) 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 ...
- 软工作业-----Alpha版本第一周小结
软工作业-----Alpha版本第一周小结 Part1.第一周周计划记录 姓名 学号 周前计划安排 每周工作记录 自我打分 yrz(队长) 1417 1.进行任务分析 2.任务分配 ...
- 软工作业No.1。Java实现WC.exe
网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...
- 软工作业1—java实现wc.exe
github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c //返回文件 file.c 的字符数 ...
- 软工作业-wc(Python实现)
GitHub地址:GitHub PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 40 · Esti ...
- 软工作业-Wc
Wc.exe wc.exe是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行 ...
- 个人项目作业(wc.exe)
1.GitHub项目地址 https://github.com/QiuBin666/WC 项目介绍: 题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行 ...
随机推荐
- jvm是怎样调用方法的
jvm内部有五种调用方法的指令 invokeinterface 用以调用接口方法,在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用.(Invoke interface method) ...
- HDOJ5876(补图的最短路)
Sparse Graph Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- ARM-Linux内核移植之(一)——内核启动流程分析
内核版本:2.6.22 为什么要采用这样一个较低的版本进行移植了,因为韦东山大牛说了,低版本的才能学到东西,越是高版本需要移植时做的工作量越少,学的东西越少. 内核启动分为三个阶段,第一是运行hea ...
- C#中Monitor对象与Lock关键字的区别分析
这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(ob ...
- PHP函数(三)-递归函数
递归函数就是函数本身在内部调用自己 <?php function DiGui($n){ echo $n." "; if($n>0) DiGui($n-1); else ...
- 简单 JS 弹出层 背景变暗
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VMWARE 虚拟机新增硬盘,格式化分区,并挂载
VMWARE 虚拟机新增 硬盘 并挂载 一台虚拟机上安装ORACLE12c 需要分一块硬盘挂载数据文件 日志文件 以及归档文件 1. 关闭虚拟机 2. 编辑虚拟机设置 选择[编辑虚拟机设置]并打开,将 ...
- Centos7下快速安装Mongo3.2
Centos7下快速安装Mongo3.2 一般安装Mongo推荐源码安装,有时候为了快部署测试环境,或者仅仅是想装个mongo shell,这时候yum安装是最合适的方式, 下面介绍一下如何在Cent ...
- 【知识碎片】JavaScript篇
40.选择器组合 逗号是多选择器空格 是子子孙孙尖括号 只找儿子 39.失去焦点事件blur $("input").blur(function(){ $("input& ...
- java 调用webservice (asmx) 客户端开发示例
这是本人第一次写博客,其实就是自己做个笔记,写的很粗糙,也希望能给跟我遇到同样问题的你一点帮助. 因为最近有个项目要调用webservice接口,之前接触的都是Java开发服务端和客户端的接口,开发前 ...