项目地址:我的GIT项目地址
-
PSP表格
- ###分析:发现自己预估的时间和实际时间差别较大。因为语言上的熟悉程度不够,所以浪费了很多时间在学习相关语法和修改Bug中,还有慢慢的修改自己的错误逻辑。在准备阶段、测试和修改方面耗费了很多时间,造成了开发过程时间较长。自己实际写文档速度与预估的不太一致,包括写设计、测试、总结文档等。主要是对于这些东西的熟练度不够,平常写的少,一下子要写也写的特别的慢。
-
项目思路
-
功能的确定:
- 对程序设计语言源文件统计字符数、单词数、行数。统计结果以指定格式输出到默认文件中。
- 可执行程序命名为:wc.exe,该程序处理用户需求的模式为:wc.exe [parameter] [input_file_name]。
- 一个测试程序命名为:wc_1.exe ,该程序直接运行即可运行设定好测试数据。
- 存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录。
- 其他自定义存储文件放在与wc.exe同目录下。
-
设计流程:
-
用户输入
-
数据获取
- find the target
- X.c
- X.txt
- get the command
- -c
- -w
- -l
- -o
- find the target
-
非法判断
- input wrong command!
-
错误提示
- can't find the file!
-
功能执行
- use BufferrReader to count the numbers of char in every line and sum it.(-c)
- use split function to divided every line with space and " , " .(-w)
- use readLine function to add lines.(-l)
- use BufferrWriter and FileWriter to write.(-o)
-
数据显示
- the charNum is
- the wordNum is
- the lineNum is
-
数据存储
-
-
注意事项:
- 对于字符统计功能所需要注意的地方:空格,水平制表符,换行符,均算字符。
- 对于单词统计所需要注意的地方:由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
- 其他注意事项:多个参数可以共用同一个输入文件,-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
-
-
设计实现
-
基本分类
- 程序只有一个类,所有的功能放在不同的方法里,并在主函数中被调用。
- CharCount类负责统计字符个数。
- WordsCount类负责统计单词个数。
- LineCount类负责统计行数。
- OutFile类负责将相关信息写入文档。
-
运行版本
- 所有逻辑判断写在主函数里,在主函数中调用其他方法。
-
测试版本
- 将逻辑判断写在Command类中,在Command类中根据需求调用其他4个不同的类。
- 增加一个Test类,里面写了10种测试。
- 通过在主函数调用Test类的方法来自动进行测试。
-
-
部分代码
主函数逻辑判断:
//find the target
for(int i = 0; i < str.length; i++) {
if(str[i].endsWith(".c")) {
fileName=str[i];
flag1=true;
}
else if(str[i].endsWith(".txt")&&str[i-1].equals("-o")) {
outFile=str[i];
}
}
int j=0;
//find the function and do it
for(int i = 0; i < str.length; i++) {
if(str[i].equals("-c")) {
if(!flag1) {
System.out.println("input wrong command!");
System.exit(0);
}
flag2=true;
charNum=CharCount(fileName);
if(charNum<0)return;
func[j]="字符数为:"+charNum+"
";
j++;
}
else if(str[i].equals("-w")) {
if(!flag1) {
System.out.println("input wrong command!");
System.exit(0);
}
flag2=true;
wordNum=WordsCount(fileName);
if(wordNum<0)return;
func[j]="单词数为:"+wordNum+"
";
j++;
}
else if(str[i].equals("-l")) {
if(!flag1) {
System.out.println("input wrong command!");
System.exit(0);
}
flag2=true;
lineNum=LineCount(fileName);
if(lineNum<0)return;
func[j]="行数为:"+lineNum+"
";
j++;
}
else if(!flag2) {
System.out.println("input wrong command!");
System.exit(0);
}
}
OutFile(fileName,outFile,func,j);
单词统计
//use split function to divided every line with space and , .
public static int WordsCount(String fileName) {
int wordNum= 0;
String line=null;
try {
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
while((line = br.readLine()) != null){
wordNum+=line.split(" |,").length;
}
br.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("can't find the file!");
System.exit(0);
}
System.out.println("the wordNum is: " + wordNum);
return wordNum;
}
-
测试设计
分为正确和错误指令,对每种情况进行多次测试,尽量的将每种情况考虑进去了,但是测试的次数还不够。-
正确输入
-
5种不同的正确输入
-
-
错误输入
-
5种不同的错误输入
-
-
如图所示:
-
运行效果
运行版本cmd运行:
测试版本cmd运行:
-
反思总结
-
通过这一次的项目,我学习了很多我从前没有了解过得东西。包括利用PSP文档对自己的整个项目开发过程进行预估分析反思,git/博客园等平台和工具。同时我也尝试了把java项目转成exe,虽然在实施这些东西中遇到了很多问题,但是exe目前也能够运行了。(按照博客中的步骤一步一步来的,将jre打包进了exe里。但是在没有安装java环境的电脑里,还是运行的有问题,会提示没有jvm!)在这个项目的实现过程中,也遇到了很多问题,经过了自主学习和长时间的调试测试,问题基本已经解决了。在测试设计上,因为软件测试方面,现在接触还不是很多,也不太擅长,我尽量用我自己能够思考到最全面的方式进行了测试。
-
我会好好利用这些网上资源,在这个开放的平台上阅读更多文章、提升自我。在开放的社区,浏览更多优秀的代码,项目。
-
-
参考相关资料: