本次作业gitee地址:https://gitee.com/ackary/WordCount
一、项目简介
本项目主要实现的功能是统计一个程序设计语言源文件的字符数、单词数、行数,之后将统计结果输出到result.txt文件。可执行程序为wc.exe,实现形式如下:
wc.exe -c file.c //返回文件file.c的字符数
wc.exe -w file.c //返回文件file.c的单词数
wc.exe -l file.c //返回文件file.c的代码行数
wc.exe -o result.txt //将统计结果输出到文件result.txt
二、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
30 |
50 |
· Estimate |
· 估计这个任务需要多少时间 |
600 |
840 |
Development |
开发 |
500 |
720 |
· Analysis |
· 需求分析 (包括学习新技术) |
100 |
130 |
· Design Spec |
· 生成设计文档 |
|
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
|
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
50 |
· Design |
· 具体设计 |
40 |
30 |
· Coding |
· 具体编码 |
400 |
450 |
· Code Review |
· 代码复审 |
30 |
40 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
90 |
150 |
Reporting |
报告 |
30 |
50 |
· Test Report |
· 测试报告 |
|
|
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
40 |
|
合计 |
560 |
820 |
三、解题思路
我实现了本项目的基础功能部分,对这部分功能的思路还是十分清晰。由于基础功能部分实现起来较为容易,因此我直接将所有代码全部写在一个类basicCount中,按功能划分主要有统计功能模块(由函数wordCount()实现)、结果输出模块(在main()主函数中实现)。
1、统计功能模块
该模块主要实现字符统计、单词统计、行数统计这三个基本功能,算法相对简单,基本思路就是使用Java IO流的知识逐字符的读取源文件file.c,通过readline()方法返回每一行字符的长度就是该行字符的个数;每次读完一行,对应的行数加1;当读取到 “ ,与 空格” 后对应的单词数加1。
2、结果输出模块
该模块就是通过获取对应指令然后输出对应的统计结果,‘-c’输出统计的字符总数,‘-w’输出统计的单词总数,‘-l’输出统计的总行数,‘-o’指定对应的输出文件。
四、程序设计
1、命令处理及判断
for(int i=0;i<args.length;i++)
{
switch(args[i]){
case "-c":{
System.out.println("字符个数:" + charNum);
break;
}
case "-w":{
System.out.println("单词个数:" + wordNum);
break;
}
case "-l":{
System.out.println("代码行数:" + lineNum);
break;
}
case "-o":{
String resultTxt="";
for(int j=0;j<args.length;j++){
if(args[j].equals("-c"))
resultTxt=resultTxt+"\r\n"+"字符个数:" + charNum;
if(args[j].equals("-w"))
resultTxt=resultTxt+"\r\n"+"单词个数:" + wordNum;
if(args[j].equals("-l"))
resultTxt=resultTxt+"\r\n"+"代码行数:" + lineNum;
}
}
}
}
2、文件读取和计数
public void wordCount(String inputFile) throws IOException{
String lineString = null;
String[] buffer;
File infile=new File(inputFile);
BufferedReader bf = new BufferedReader(new FileReader(infile));
while((lineString=bf.readLine())!=null){
buffer=lineString.split(",| "); //当读取到“ ,与 空格”后,结束赋值
for(int i=0;i<buffer.length;i++){
if(!buffer[i].equals(""))
wordNum++;
}
lineNum++;
charNum+=lineString.length();
}
bf.close();
}
3、输出结果到指定文件
File outfile = new File(outputFile);
outfile.createNewFile(); // 创建新文件
BufferedWriter bw = new BufferedWriter(new FileWriter(outfile));
bw.write(resultTxt);
bw.flush(); // 将缓存区内容压入文件
bw.close(); //关闭文件
五、代码测试
1、字符统计测试
输入:wc.exe –c file.c
期望输出:字符个数:244
实际输出:字符个数:244
分析:符合预期
2、单词统计测试
输入:wc.exe –w file.c
期望输出:单词个数:49
实际输出:单词个数:49
分析:符合预期
3、行数统计测试
输入:wc.exe –l file.c
期望输出:代码行数:19
实际输出:代码行数:19
分析:符合预期
4、输出文件测试
输入:wc.exe -c -w -l file.c -o result.txt
期望输出:
字符个数:244
单词个数:49
代码行数:19
实际输出:
字符个数:244
单词个数:49
代码行数:19
分析:符合预期
六、参考文献链接
使用exe4j将java文件打成exe文件运行详细教程:https://blog.csdn.net/zzzgd_666/article/details/80756430
FileInputStream、InputStreamReader和BufferedReader几种读取文件的区别:https://blog.csdn.net/pkx1993/article/details/80991812
Java中main方法参数String args[]的使用:https://www.cnblogs.com/xy-hong/p/7197725.html
七、项目总结
总的来说,我个人认为我这次的项目还存在很大的不足之处,我所实现的功能有限,代码也存在一定的问题,但是通过本次的项目,我还是有较大的收获。首先,通过本次作业,我对于Java的知识有了进一步的了解,因为我本身对Java的了解不是很多,而这次的作业我之所以选择用Java语言来编写,最主要还是想要通过实际的编程来提高我对这门语言的了解,结果我还是比较满意的,我确实收获了许多有关Java的知识,特别是Java IO部分的知识,这对于我的学习非常有用;其次呢,通过本次作业,我也对《系统分析与设计》这门课程理解更深了,作为程序员,我们不仅要有良好的编程基础,还要熟练掌握对代码的测试能力,更要有对一个项目的整体把控能力,我认为这次填写的PSP表格就是对于我们有关这方面的很好训练,我也会在今后的项目过程中不断强调自己这样去做,这是我们所需要具备的能力。
原文:https://www.cnblogs.com/ackary/p/9697199.html