Github网页链接:https://github.com/Jiangyankai/test1
(注:采用了1504成建伟的代码) 

 

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

 

Planning

计划

 

 

 

· Estimate

· 估计这个任务需要多少时间

 20

 30

 

Development

开发

 

 

 

· Analysis

· 需求分析 (包括学习新技术)

 60

 120

 

· Design Spec

· 生成设计文档

 60

 120

 

· Design Review

· 设计复审 (和同事审核设计文档)

 50

 50

 

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 60

 130

 

· Design

· 具体设计

 300

 400

 

· Coding

· 具体编码

 360

 300

 

· Code Review

· 代码复审

 60

 80

 

· Test

· 测试(自我测试,修改代码,提交修改)

 100

 120

 

Reporting

报告

 

 

 

· Test Report

· 测试报告

 60

 120

 

· Size Measurement

· 计算工作量

 20

 20

 

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 40

 

 

合计

 1180

 1530

1.需求分许
这个项目的需求可以概括为:对程序设计语言源文件统计字符数,单词书,行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。大体思路分为一读取命令行,二统计各项数据,打算采用自底向上一层层来实现相应功能。最后再通过使用编译器生成jar包后,由第三方软件exe4j即可将jar包转换成exe文件。


2.程序设计实现过程
可以划分为主函数和调用函数
其中调用又可以分为五个方面 
参数处理 文件写入 读行 读字符 以及读单词
流程图如下:

3. 代码说明

基本功能:
while((line=br.readLine())!=null)
{

linecount++;
sb.append(line);
charcount+=line.length();
String[] split = line.split("\\s++|\\.|,|\\;|\\(|\\)|\\[|\\]|\\<|\\>|\\=|\\-|\\+|\\*|\\/|\\{|\\}|\\_"); 
for (int i = 0; i < split.length; i++) { 
// 获取到每一个单词 
Integer integer = map.get(split[i]); 
// 如果这个单词在map中没有,赋值1 
if(null==integer){ 
map.put(split[i], 1); 
}else{ 
// 如果有,在原来的个数上加上一 
map.put(split[i], ++integer); 


}

// 遍历,根据key获取所对应的value 
Set<String> keySet = map.keySet(); 
for (String string : keySet)
if(!(string.equals("")))//{
wordcount+=map.get(string);
// System.out.println(string);}
br.close();
isr.close();
fis.close();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(UnsupportedEncodingException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
String message=null;
if(action1.equals("-l"))
message=(sourcefile+", 行数:"+linecount+"\r\n");//换行"\r\n"不是"\n"
else if(action1.equals("-c"))
message=(sourcefile+", 字符数:"+charcount+"\r\n");//换行"\r\n"不是"\n"
else if(action1.equals("-w"))
message=(sourcefile+", 单词数:"+wordcount+"\r\n");//换行"\r\n"不是"\n"
return message;
}


扩展功能:
static String moredata(String myfile)throws FileNotFoundException { 
File file=new File(myfile);
// 记录注释行数 
long annotationLine = 0; 
// 记录空白行数 
long blankLine = 0; 
// 记录有效代码的行数 
long codeLine = 0; 
//假注释
long notLine=0;
if (file == null || !file.exists()) 
throw new FileNotFoundException(file + ",文件不存在!"); 
BufferedReader br = null; 
// 判断此行是否为注释行 
boolean comment = false; 
int whiteLines = 0; 
int commentLines = 0; 
int normalLines = 0; 
try { 
br = new BufferedReader(new FileReader(file)); 
String line = ""; 
while ((line = br.readLine()) != null) { 
line = line.trim(); 
if (line.matches("^[//s&&[^//n]]*$")||line.equals("{")||line.equals("}")) { 
// 空行 :本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”
whiteLines++; 

/* 本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
* }//注释
*/
else if (line.startsWith("/*") && !line.endsWith("*/")||((line.startsWith("{/*")||line.startsWith("}/*"))&&!line.endsWith("*/"))){
// 判断此行为"/*"开头的注释行 
commentLines++; 
comment = true; 
} else if (comment == true && !line.endsWith("*/")&&!line.startsWith("*/")) { 
// 为多行注释中的一行(不是开头和结尾)
notLine++;
commentLines++; 
} else if (comment == true && (line.endsWith("*/")||line.startsWith("*/"))) { 
// 为多行注释的结束行 
commentLines++; 
comment = false; 
} else if (line.startsWith("//")|| line.startsWith("}//")||line.startsWith("{//")||
((line.startsWith("{/*") ||line.startsWith("}/*")||line.startsWith("/*")) && line.endsWith("*/"))) { 
// 单行注释行 
commentLines++; 
} else { 
// 正常代码行 
//System.out.println(line);
normalLines++; 



4.测试设计过程
本次测试采用白盒测试的方法(结构测试)白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。
测试用例分为10种,分别对相应功能进行测试,并对组合的功能进行整体测试。如下:

1. wc.exe -w -c -l test.c

2. wc.exe -w -c D:\test\test.c

3,wc.exe -w test.c -e stoplist.txt -o out.txt

4. wc.exe -a -c -l -w test.c -e stoplist.txt

5. wc.exe -a -c test.c -o out.txt

6. wc.exe -s -w test.c -e stoplist.txt

7. wc.exe -w -l D:\test\test.c -o out.txt

8.wc.exe -a -l -c -w test.c

9.wc.exe -l test.c -e stoplist.txt

10. wc.exe -s -w test.c -o out.txt



 

5.总结
本次课程设计让我受益匪浅,同时也知道了自己的不足。在本次课程设计中,绝大部分的代码都是运用的4班陈建伟同学的,同时也请他跟我做了详细的讲解才得以弄懂。

6.参考文献链接
https://www.baidu.com/
http://www.cnblogs.com/xinz/archive/2011/10/22/2220872.html
https://baike.baidu.com/item/%E7%99%BD%E7%9B%92%E6%B5%8B%E8%AF%95/934440?fr=aladdin
《编译技术》

转载于:https://www.cnblogs.com/Jiangyk/p/8625871.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐