一,Github地址:https://github.com/mushan520/WC.git

二、PSP表格:

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40   45
· Estimate · 估计这个任务需要多少时间 40 45
Development 开发 1240 1165
· Analysis · 需求分析  60   70  
· Design Spec · 生成设计文档 50 50
· Design Review · 设计复审  30 45
· Coding Standard · 代码规范 30 30
· Design · 具体设计 80 60
· Coding · 具体编码 900 800
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 60 80
Reporting 报告 100 120
· Test Report · 测试报告 30 50
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 40 40
合计   1380 1330

 

三、解题思路

  WC项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

①基本功能列表

  1. -c    [文件名]  返回文件的字符数
  2. -w   [文件名]  返回文件词的数目
  3. -l     [文件名]  返回文件的行数

②扩展功能列表

  1. -s   递归处理目录下符合条件的文件。
  2. -a   返回更复杂的数据(代码行 / 空行 / 注释行)。

阅读完项目的需求后,整个项目的流程主要就是接收具体的参数对指定的文件进行具体的操作。以下为解题思路:

 main函数中:通过输入的命令来判断执行各个功能函数,将输入的命令传到count文件,用指令来判断需要执行的方法,文件路径作为参数。readLine读取数据并记录下来,拼接为一行,在使用正则表达式进行判断以此统计单词数;使用JAVA的readLine功能统计行数;把切割的词的长度统计字符;同理,使用正则表达式判断记录空行 / 注释行 / 代码行等。

四、设计实现过程 

1.流程图

主函数调用count类来进行相关统计,用searchFile类来读取文件

2.项目目录

3.代码

package com.zwb.wc;

import java.io.IOException;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class wc {
public static void main(String[] args) throws IOException {
while (true) {
System.out.println("输入:-c 文件名 返回文件的字符数");
System.out.println("输入:-w 文件名 返回文件词的数目");
System.out.println("输入:-l 文件名 返回文件的行数");
System.out.println("输入:-a 文件名 返回文件的代码行 / 空行 / 注释行");
System.out.println("输入:-all 文件名 返回文件的字符数 /词数 /行数/注释行 /空行 /代码行 ");
System.out.print("请输入命令:");
Scanner s = new Scanner(System.in);
String m =s.nextLine();
String arr[]=m.split("\\s"); count.command(arr[1], arr[0]); }
}
} class searchFile { public static void foundFilePath(String path, String fileName) throws IOException { File file = new File(path);
if (file.exists()) {
File[] files = file.listFiles();
if (null == files || files.length == 0) {
System.out.println("文件夹是空的!");
return;
} else {
for (File file2 : files) {
if (file2.getName().contains(fileName)) {
System.out.println("文件:" + file2.getAbsolutePath());
count.command(file2.getAbsolutePath(), "-all");
}
}
}
} else {
System.out.println("文件不存在!");
}
}
} class count{
static int cntCode = 0, cntNode = 0, cntSpace = 0;
static boolean flagNode = false;
public static void command(String path, String type) throws IOException {
BufferedReader br = null;
int countWord = 0;
int countChar = 0;
int countLine = 0;
String str = "";
String strCount = ""; try { br = new BufferedReader(new FileReader(path));
}catch(Exception e) {
System.out.println("输入的参数有误");
return;
} while((str = br.readLine()) != null ){
// 计算行数
countLine++;
// 计算特殊行的数目
if (type.equals("-a")||type.equals("-all")) {
pattern(str);
} str = str + " ";
strCount += str;
}
for(int i=0;i<strCount.split(" ").length;i++){
if (type.equals("-c")||type.equals("-all")) {
countChar += strCount.split(" ")[i].length();
}
if (type.equals("-w")||type.equals("-all")) {
String s = strCount.split(" ")[i].replaceAll("[\\p{P}+~$`^=|<>~`$^+=|<>¥×]" , "");
boolean word = !s.equals("");
if(word) {
countWord++;
}
}
} if (type.equals("-w")||type.equals("-all")) {
System.out.println("单词数:" + countWord);
}
if (type.equals("-c")||type.equals("-all")) {
System.out.println("字符数:" + countChar);
}
if (type.equals("-l")||type.equals("-all")) {
System.out.println("行数:" + countLine);
}
if (type.equals("-a")||type.equals("-all")) {
System.out.println("注释行: " + cntNode);
System.out.println("空行: " + cntSpace);
System.out.println("代码行: " + cntCode);
}
System.out.println();
br.close();
cntNode = 0;
cntSpace = 0;
cntCode = 0;
flagNode = false;
} // 计算特殊行的数量
public static void pattern(String line) {
String regxNodeBegin = "\\s*/\\*.*";
String regxNodeEnd = ".*\\*/\\s*";
String regx = "//.*";
String regxSpace = "\\s*";
if(line.matches(regxNodeBegin) && line.matches(regxNodeEnd)){
++cntNode;
return ;
}
if(line.matches(regxNodeBegin)){
++cntNode;
flagNode = true;
} else if(line.matches(regxNodeEnd)){
++cntNode;
flagNode = false;
} else if(line.matches(regxSpace))
++cntSpace;
else if(line.matches(regx))
++cntNode;
else if(flagNode)
++cntNode;
else ++cntCode;
}
}

  4.测试

①测试文件C:\Users\62750\Desktop\wcproject\TXT.txt

②测试结果

③代码覆盖

由于代码组织不太会,放在了同一个java源文件中,导致代码覆盖率低,仅为:7.4%

五、总结分析

  由于对java的了解不深,在做这次个人项目的时候越发感觉到自己的不足。在本次项目开发中,重新学习了java基础,并且学习加深了正则表达式的使用。于此同时,第一次学会使用coverage插件进行代码覆盖率的统计。因为经验不足,导致代码覆盖率很低。在参考了其他同学的项目后,发现自己真的太菜了。必须好好加油。还有第一次学会使用GitHub,受益匪浅。按照软件工程的知道,使我了解了项目开发原来有怎么多学问,通过这次作业,自己主要是学会怎么从零开始一个程序的设计,对时间的安排,对功能的评估等等工程知识,我相信这次的项目作业对我以后的项目开发会有蛮大的帮助的。

 

个人项目—WC的更多相关文章

  1. 个人项目-wc

    个人项目-WC   (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...

  2. 实践简单的项目WC

    #include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...

  3. 个人项目——wc源程序特征统计

    这一次要做的项目是wc——统计程序文件特征的命令行程序. 根据需求需求得到的模式为:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需 ...

  4. 实现项目WC

    软件的需求分析 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 - ...

  5. 个人项目-WC(C/C++ 兼容Linux和Windows)

    一.Github地址 https://github.com/S-TRAVELER/WC 实现的功能: 支持 -c 支持 -w 支持 -l 支持 -s 支持 -a 图形界面 多参数(文件名或通配符表达式 ...

  6. 个人项目-WC (java实现)

    一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  7. 个人项目-WC(Java实现)

    一.Github项目地址: https://github.com/kestrelcjx/-WC-Java- 二.PSP表格 PSP2.1 Personal Software Process Stage ...

  8. 个人项目 wc(java实现)

    一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...

  9. 个人项目WC(Python实现)

    一.GitHub地址 https://github.com/hoka-17/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际 ...

随机推荐

  1. MySQL 设计与开发规范2

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

  2. 使用 Laravel 自带的用户系统 包括登录注册功能以及错误处理

    一.默认 Laravel 不会自动帮你装上用户系统, 二.但是我们可以从默认首页的代码中看到,登录注册按钮被隐藏了 三.需要手动输入命令进行安装 php artisan make:auth 安装完成后 ...

  3. 003-Python3-基础语法-运行方式、代码基础要求、运算符[算数运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符]、运算符优先级

    一.基础语法 参看地址:https://www.runoob.com/python3/python3-tutorial.html 1.1.运行方式 1.文件方式 编写一个hello.py文件, pri ...

  4. 2019 GDD TensorFlow

    https://www.tensorflow.org/ https://tensorflow.google.cn/     (中文站点) 现场PPT照片:    https://pan.baidu.c ...

  5. 初识RxSwift

    初识Observable Observable<T> 这个类就是Rx框架的基础, 我们可以称他为可观察序列, 他的作用就是可以异步的产生一系列的Event(事件), 即一个Observab ...

  6. JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...

  7. LODOP打印URL显示和隐藏进度条

    不建议使用ADD_PRINT_URL:由于Lodop借用IE下载引擎,与非IE浏览器之间目前不能传递Session(Cookies),所以需要安全验证的页面不要用URL方式打印,要用页面已经下载好的内 ...

  8. SpringBoot示例教程(一)MySQL与Mybatis基础用法

    示例需求 在Springboot2框架中,使用Mysql和Mybatis功能:1. Mysql+Datasource集成2. Mybatis+XML用法详解 数据库准备 采用了Oracle中的scot ...

  9. mysql:获取某个表的所有字段

    select COLUMN_NAME from information_schema.COLUMNS where table_name = '表名' and table_schema = '数据库名' ...

  10. python的mysql数据库操作

    python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...