个人项目—WC
一,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 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
①基本功能列表
- -c [文件名] 返回文件的字符数
- -w [文件名] 返回文件词的数目
- -l [文件名] 返回文件的行数
②扩展功能列表
- -s 递归处理目录下符合条件的文件。
- -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的更多相关文章
- 个人项目-wc
个人项目-WC (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...
- 实践简单的项目WC
#include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...
- 个人项目——wc源程序特征统计
这一次要做的项目是wc——统计程序文件特征的命令行程序. 根据需求需求得到的模式为:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需 ...
- 实现项目WC
软件的需求分析 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 - ...
- 个人项目-WC(C/C++ 兼容Linux和Windows)
一.Github地址 https://github.com/S-TRAVELER/WC 实现的功能: 支持 -c 支持 -w 支持 -l 支持 -s 支持 -a 图形界面 多参数(文件名或通配符表达式 ...
- 个人项目-WC (java实现)
一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- 个人项目-WC(Java实现)
一.Github项目地址: https://github.com/kestrelcjx/-WC-Java- 二.PSP表格 PSP2.1 Personal Software Process Stage ...
- 个人项目 wc(java实现)
一.Github网址: https://github.com/Clarazhangbw/Wc.exe 二.PSP表 PSP2.1 Personal Software Process Stages 预估 ...
- 个人项目WC(Python实现)
一.GitHub地址 https://github.com/hoka-17/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际 ...
随机推荐
- nodejs相关框架
sails https://sailsjs.com/documentation/concepts koa koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 ...
- flutter 高德地图选择位置信息返回
添加依赖:(注意,作者一直更新维护,请以最新的版本添加) amap_map_fluttify: ^ amap_search_fluttify: ^ 代码实现: import 'package:amap ...
- 查看ssh有没有被黑的IP
#grep "Failed password " /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr ...
- Anaconda(三)
五.TensorFlow安装 这一天由于版本问题走了太多弯路.之前用的conda版本是最新的,自带Python3.7.5,装了之后倒是各种包都能装,用命令: pip install xxx conda ...
- GPL & LGPL
Reference https://www.cnblogs.com/findumars/p/3556883.html GPL 我 们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apach ...
- Vue打包发布到Tomcat后,刷新报错404解决方法
在应用下面加 WEB-INF 建 web.xml 内容如下 <?xml version="1.0" encoding="ISO-8859-1"?> ...
- “无法启动IIS Express Web服务器”的解决办法
“无法启动IIS Express Web服务器”的解决办法 听语音 原创 | 浏览:259 | 更新:2019-07-15 13:02 1 2 3 4 5 6 7 分步阅读 在使用visual stu ...
- Kubernetes 原理架构介绍(一)
目录 一.Kubernetes 是什么 二.Kubernetes 设计架构 三.Kubernetes的核心技术概念和API对象 Cluster Master Node Pod Controller D ...
- CentOS7开机进入紧急模式EmergencyMode的解决办法
这个情况主要是 修改了 /etc/fstab 文件 vi /etc/fstab 文件 如果之前添加过一行 把添加的一行注释掉 如果之前没有添加过,把挂载到 /home 这一行取消注释 操作之后 记得 ...
- PHP设计模式 - 备忘录模式
备忘录模式又叫做快照模式(Snapshot)或 Token 模式,备忘录模式的用意是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在合适的时候将该对象恢复到原先 ...