1.作业成果
代码地址:https://gitee.com/easy-yy/first_homework_wc
2.作业要求
作业简述:根据WordCount的需求描述,先编程实现,再编写单元测试,最后撰写博客。实现以下需求说明中的基本功能。
3. WordCount需求说明
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
3.1 基本功能
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的单词总数
wc.exe -l file.c //返回文件 file.c 的总行数
wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
5.编码过程
PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
· Planning | · 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 15 |
· Development | · 开发 | 100 | 0 |
· Analysis | · 需求分析 (包括学习新技术) | 5 | 5 |
· Design Spec | · 生成设计文档 | 5 | 5 |
· Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
· Coding | · 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
· Code Review | · 具体设计 | 50 | 20 |
· Test | · 具体编码 | 30 | 100 |
· Reporting | · 代码复审 | 20 | 10 |
· Test Report | · 报告 | 30 | 50 |
· Size Measurement | · 测试报告 | 30 | 0 |
· Postmortem & Process | · 计算工作量 | 20 | 0 |
· Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 0 |
· 合计 | 360 | 235 |
6.IDE环境
Windows 10 + eclipse
7.程序设计
设计了2个类来完成这项任务
wcfunction:写入其中代码字符数,词数和行数的方法。
wctest:写入主函数main,并写出测试上面3个方法的测试代码。
8.关键代码说明
8.1行数统计
//文件行数统计函数 int getlinenumber(String filename) throws IOException { int linenum = 0; File file = new File(filename); if(file.exists()) { //读取文件 FileReader fr = new FileReader(filename); //读取文件行数 LineNumberReader lnr = new LineNumberReader(fr); while(lnr.readLine()!= null) { linenum=lnr.getLineNumber(); } lnr.close(); fr.close(); }else { System.out.println("文件不存在,请重新输入文件!"); } return linenum; }
8.2字符数统计
//文件字符统计函数 int getCharacternumber(String filename) throws IOException { int number = 0; String[] strword = null; File file = new File(filename); if(file.exists()) { //读取文件 FileReader fr = new FileReader(filename); br = new BufferedReader(fr); String line = null; String str=null; StringBuffer sbf = new StringBuffer(); while((line=br.readLine())!= null) { sbf.append(line); str = sbf.toString(); strword = str.split("\\s+"); } for(int i=0;i<strword.length;i++) { Pattern pattern = Pattern.compile("[0-9a-zA-Z]*"); Matcher matcher = pattern.matcher(strword[i]); if(matcher.find()) { number+=matcher.regionEnd(); } } br.close(); fr.close(); }else { System.out.println("文件不存在,请重新输入文件!"); } return number; }
8.3 词数统计
//文件词统计函数 int getwordnumber(String filename) throws IOException { int num=0; String[] strword = null; File file = new File(filename); if(file.exists()) { //读取文件 FileReader fr = new FileReader(filename); br = new BufferedReader(fr); String line = null; StringBuffer sbf = new StringBuffer(); while((line=br.readLine())!= null) { sbf.append(line); String str = sbf.toString(); //正则表达式替换符号 str = str.replaceAll("[\\p{Nd}\\u9fa5-\\uffe5\\p{Punct}\\s&&[^-]]", " "); //按空格将内容分割 strword = str.split("\\s+"); num=strword.length; } br.close(); fr.close(); }else { System.out.println("文件不存在,请重新输入文件!"); } return num; }
9.测试结果
测试结论
- 1、缺少相应的提示性语言来告诉使用者运行结果。
- 2、麻烦的是,需要手动输入测试的文件地址。
- 3.其中问题在于:将输出结果转为txt时候出现问题,还没有来得及修改。
10.参考文章
https://www.cnblogs.com/K-mengmengpi/p/9614405.html