第二次作业

在此处输入标题

对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中


项目码云地址:https://gitee.com/WeiDaDeXiongJun/swpu

一.使用的语言和工具

使用语言是Java语言(只要掌握了思想,哪个语言都一样..)
使用的打包工具是Jar2Exe(强烈不建议使用exe4j......真的很烦人的.一直打包的时候报错)
Jar2Exe下载地址:http://www.jar2exe.com/
Jar2Exe教程:https://blog.csdn.net/isea533/article/details/9147927

二.项目截图

具体代码资源请点击链接:https://gitee.com/WeiDaDeXiongJun/swpu 进行下载
直接上干货:
java项目结构截图:
代码示例如下:
主函数部分:

工具对象部分:

三.代码部分

新增加的功能
统计行数,空行,代码行

代码部分

 //统计注释行、空行、代码行
    public void countDiffLine(String path) {
        int annotationLineNum = 0;
        int codeLineNum = 0;
        int nullLineNum = 0;
        String line;
        BufferedReader br = null;
        // 注释匹配器(匹配单行、多行、文档注释)
        Pattern annotationLinePattern = Pattern.compile("(//)|(/\\*)|(^\\s*\\*)|(^\\s*\\*+/)");    
        try {
            br = new BufferedReader(new FileReader(path));
            while((line = br.readLine()) != null){
                if(annotationLinePattern.matcher(line).find()) {//注释行       
                    annotationLineNum++;
                }else if (line.matches("\\s*\\p{Graph}?\\s*")) {//空行
                    nullLineNum++;
                }else {                 
                    codeLineNum++;
                }               
            }
            System.out.println("空白行数是: " + nullLineNum);
            System.out.println("注释行数是: " + annotationLineNum);
            System.out.println("代码行	数是: " + codeLineNum);
            br.close();
        } catch (IOException e) {
            System.out.println(path + "文件名错误");
        }   
    }
**主函数代码:**

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
public class Wc {

public static void main(String[] args) throws IOException {

// 生成一个工具对象用于调用他的内部的方法
wcFunction function=new wcFunction();
System.out.println("-c 返回文件 file.c 的字符数\n" +"-w 返回文件 file.c 的词的数目 \n" +"-l 返回文件 file.c 的行数");
System.out.println("-o 文件路径 (生成result文件)\n");
System.out.println("----------------------------------------------------------------------------------------------------------");
System.out.println("请输入命令:(格式为:命令 文件路径)");

    while(true){

// 流处理处理输入的文件数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input=br.readLine();
// 将输入以空格进行分割,command分割成数组进行存储工作
String[] commond=input.split(" ");
// 使用switch输入的命令进行分割
switch(commond[0]) {
case "-c":
int num1=function.getCharNumber(commond[1]);
System.out.println("字符数:"+num1);
break;
case "-w":
int num2=function.getWordNumber(commond[1]);
System.out.println("单词数:"+num2);
break;
case "-l":
int num3=function.getLineNumber(commond[1]);
System.out.println("行数:"+num3);
break;
case"-o":
function.outFile(commond[1]);
break;
default:
System.out.println("命令不正确,请重新输入!");
break;
}
}

}

}

**功能代码**

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class wcFunction {
// 获取字符个数的函数
int getCharNumber(String fileName) throws IOException {
int count=0;
File file=new File(fileName);
// line用于记录每一行的数据
String line=null;
if(file.exists())
{
// FileReader(file)将文件读入
BufferedReader br=new BufferedReader(new FileReader(file));
while ((line = br.readLine()) != null)
{
// 生成对象
Pattern p = Pattern.compile("\s*|\t|\r|\n");
Matcher m = p.matcher(line);
line = m.replaceAll("");
count += line.length();//按行统计字符
}
}
else{
System.out.println("文件不存在,请重新输入:");
}
return count;

}

// 获取字数
int getWordNumber(String fileName) throws IOException{
int count=0;
File file=new File(fileName);
String[] word=null;
if(file.exists()){
BufferedReader br=new BufferedReader(new FileReader(file));
String line=null;
StringBuilder sbr=new StringBuilder();
while((line=br.readLine())!=null){
sbr.append(line);
String string=sbr.toString();
string=string.replaceAll("\W", " ");//用空格替换非词字符
word=string.split("\s+");//按空格将字符串拆分后放入字符串数组中
count=word.length;//数组的长度就是词的数目
}
br.close();
}
else{
System.out.println("文件不存在,请重新输入:");
}
// 解决split进行分割时候的截取第一个字符的问题
int lineNum=getLineNumber(fileName);
if(lineNum0){
count=0;
}
else if(lineNum
1){
count=count;
}
else
{
count=lineNum+count-1;
}
return count;

}

// 获取行数
int getLineNumber(String fileName) throws IOException{
int count=0;
File file=new File(fileName);
if(file.exists()){
BufferedReader br=new BufferedReader(new FileReader(file));
while(br.readLine()!=null){
count++;
}
}
else{
System.out.println("文件不存在,请重新输入:");
}
return count;
}
// 控制台内容输出到控制指定的文档中进行保存
void outFile(String fileName) throws FileNotFoundException{
PrintStream print=new PrintStream(fileName);
System.setOut(print);
}

}

##四.测试部分
###测试的过程记录
思路:先进行**单元测试**,随后进行集成**黑盒测试法**:
**单元测试部分:**
1:getCharNumber()单元测试
>对函数getCharNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923220752913-624403499.png)
对函数getCharNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923220946573-483548307.png)

2:对getWordNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923221414939-1503496271.png)
>对getWordNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923221455756-704397362.png)

3:对getLineNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923221533460-615211913.png)
>对getLineNumber()进行Junit单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923221555675-939920629.png)

4:对outFile()单元测试
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923221948465-1542323896.png)
1:输入错误的命令:
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923223611172-1425835768.png)

**黑盒测试部分**
<span style="color:red">**特别说明软件在使用之前一定要先生成result.txt文件才能有效的将统计的文字的信息保存到result.txt文件中**</span>

1:输入不正确命令时候(结果是需要重新输入):
>![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923224246508-1823344785.png)

2:测试生成记录文件reslut.txt(结果成功生成result.txt文件)
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923224155017-1821066009.png)

测试用例如下图所示:
![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923224507162-1678327105.png)

3:测试统计字符数(测试成功):
>![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923224754488-522410870.png)


4:测试统计单词数(测试成功):
>![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923225042505-138203484.png)

5:测试统计行数(测试成功):
>![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923225154961-506708672.png)

6测试输出函数(测试成功)
>![](https://img2018.cnblogs.com/blog/1487166/201809/1487166-20180923225413374-534203838.png)

7测试统计各个行数,空行,注释行(测试成功)
![](https://img2018.cnblogs.com/blog/1487166/201810/1487166-20181020173955881-1247852710.png)

##五心德总结
该项目主要运用到的思想是 <span style="color:red"></span>  <span style="color:red">面向对象的思想</span>,
1:使用spilt()函数对输入的命令进行分解,并且返回成数组形式进行存储,随后就可以使用<span style="color:red">switch</span>进行不同命令的操作的选择.
2:将功能进行划分分别去使用不同的函数实现不同的c w l 的功能中间使用到了大量的<span style="color:red">IO知识</span>不了解的小伙伴请多参考几篇博客进行知识补充.
posted @ 2018-09-23 22:58  伟大的熊君  阅读(224)  评论(1编辑  收藏  举报