第二次作业

在此处输入标题

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


项目码云地址: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项目结构截图:第二次作业_第1张图片
代码示例如下:
主函数部分:
第二次作业_第2张图片

工具对象部分:
第二次作业_第3张图片

三.代码部分

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

代码部分

 //统计注释行、空行、代码行
    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(lineNum==0){
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单元测试
第二次作业_第4张图片
对函数getCharNumber()进行Junit单元测试
第二次作业_第5张图片

2:对getWordNumber()进行Junit单元测试
第二次作业_第6张图片

对getWordNumber()进行Junit单元测试
第二次作业_第7张图片

3:对getLineNumber()进行Junit单元测试
第二次作业_第8张图片

对getLineNumber()进行Junit单元测试
第二次作业_第9张图片

4:对outFile()单元测试
第二次作业_第10张图片
1:输入错误的命令:
第二次作业_第11张图片

黑盒测试部分
特别说明软件在使用之前一定要先生成result.txt文件才能有效的将统计的文字的信息保存到result.txt文件中

1:输入不正确命令时候(结果是需要重新输入):

第二次作业_第12张图片

2:测试生成记录文件reslut.txt(结果成功生成result.txt文件)
第二次作业_第13张图片

测试用例如下图所示:
第二次作业_第14张图片

3:测试统计字符数(测试成功):

第二次作业_第15张图片

4:测试统计单词数(测试成功):

第二次作业_第16张图片

5:测试统计行数(测试成功):

第二次作业_第17张图片

6测试输出函数(测试成功)

第二次作业_第18张图片

7测试统计各个行数,空行,注释行(测试成功)
第二次作业_第19张图片

五心德总结

该项目主要运用到的思想是 面向对象的思想,
1:使用spilt()函数对输入的命令进行分解,并且返回成数组形式进行存储,随后就可以使用switch进行不同命令的操作的选择.
2:将功能进行划分分别去使用不同的函数实现不同的c w l 的功能中间使用到了大量的IO知识不了解的小伙伴请多参考几篇博客进行知识补充.

你可能感兴趣的:(第二次作业)