软件工程作业:个人项目-WC项目

项目相关要求

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

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

具体功能要求:

程序处理用户需求的模式为:

wc.exe [parameter] [file_name]

  • 基本功能列表:

wc.exe -c file.c //返回文件 file.c 的字符数

wc.exe -w file.c //返回文件 file.c 的词的数目

wc.exe -l file.c //返回文件 file.c 的行数

  • 扩展功能:

    -s 递归处理目录下符合条件的文件。

    -a 返回更复杂的数据(代码行 / 空行 / 注释行)。

    • 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

    • 代码行:本行包括多于一个字符的代码。

    • 注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

} //注释

在这种情况下,这一行属于注释行。

  • 高级功能:

    • -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

    • 需求举例: wc.exe -s -a *.c

返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。


1.项目Github地址

我的github的项目:

https://github.com/JoyGin/wc

2.遇到的困难及解决方法

困难一:

判读命令中参数输入的合法性

创建了一个Set,将合法的参数初始化进去,若从命令中截取的参数不在集合内,则判为输入错误,重新输入。

此方法可以避免反复的循环判断

代码如下:

    private static Set<String> set=new HashSet<String>();//存放正确的参数集合
//将命令转换成map,map中包含参数数组和文件名
public static Map<String,String[]> converse(String cmd) {
set.add("-c");set.add("-w");set.add("-l");set.add("-s");set.add("-a");//初始化合法参数集合
Map<String,String[]> paramAndFile=new HashMap<String,String[]>();
String[] paramWithPath=cmd.split(" ");
String[] param=new String[paramWithPath.length-1];
for(int i=0;i<paramWithPath.length;i++) {
if(i==paramWithPath.length-1) {
paramAndFile.put("fileName",new String[] {paramWithPath[i]});
}else {
if(!set.contains(paramWithPath[i])) return null;
else param[i]=paramWithPath[i];
}
}
paramAndFile.put("parameters",param);
return paramAndFile;
}

图形化界面:

一开始不知道从何下手,后来查找资料发现java的swing

    public static void graphic() {
chooser = new JFileChooser();
int value = chooser.showOpenDialog(null);
if (value == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
String filename = file.getAbsolutePath();
Map<String,Integer> map=count(filename);
print(true,null,map);
}
}

3.关键代码or设计说明

统计行数、字符数、单词数、注释行数、空白行数、代码行数,最终以Map返回,若返回为null说明路径错误,外部函数可以通过这个判断:

    //计算字符数、行数等
public static Map<String,Integer> count(String fileName) {
Map<String,Integer> map=new HashMap<String,Integer>();
int lineCount = 0;//行数
int wordCount = 0;//单词数
int charCount = 0;//字符数
int nullLineCount = 0;// 空行数
int codeLineCount = 0;// 代码行数
int noteLineCount = 0;// 注释行数
File file = new File(fileName);
if (file.exists()) {
try {
//文件流读取文件
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
lineCount++;
sb.append(line);
charCount += line.length();
//去掉首尾空格
line = line.trim();
// 空白行
if (line == "" || line.length() <= 1) {
nullLineCount++;
continue;
}
// 注释行
int a = line.indexOf("/");
int b = line.substring(a + 1).indexOf("/");
if (b == 0) {
noteLineCount++;
continue;
}
codeLineCount++;// 代码行
}
wordCount = sb.toString().split("\\s+").length;//单词行
br.close();
isr.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
map.put("lineCount", lineCount);
map.put("wordCount", wordCount);
map.put("charCount", charCount);
map.put("nullLineCount", nullLineCount);
map.put("codeLineCount", codeLineCount);
map.put("noteLineCount", noteLineCount);
return map;
} else {
System.out.println("path error");
return null;
}
}

图形化界面效果:

进行单元测试:



4.PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 15
· Estimate · 估计这个任务需要多少时间 30 15
Development 开发 595 725
· Analysis · 需求分析 (包括学习新技术) 120 150
· Design Spec · 生成设计文档 30 15
· Design Review · 设计复审 (和同事审核设计文档) 15 13
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 7
· Design · 具体设计 60 10
· Coding · 具体编码 180 300
· Code Review · 代码复审 60 30
· Test · 测试(自我测试,修改代码,提交修改) 120 180
Reporting 报告 55 50
· Test Report · 测试报告 30 25
· Size Measurement · 计算工作量 10 5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 15 20
合计 680 770

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 266 266 680 680 熟悉java语言面向对象的特性,初步掌握软件测试能力,初始熟悉软件开发的基本流程和时间规划,对PSP表格有了解的基础上再加深了理解

软件工程作业:个人项目—wc项目的更多相关文章

  1. 实践简单的项目WC

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

  2. 软件工程wc项目,基于py

    ###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...

  3. 软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序

    软件工程第三个程序:“WC项目” —— 文件信息统计(Word Count ) 命令行程序 格式:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数 ...

  4. 在PyCharm 软件中设置你的项目 使用的Python版本

    在PyCharm 软件中设置你的项目 使用的Python版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 就运行不了:使用python3编 ...

  5. 个人项目-wc

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

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

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

  7. 个人项目—WC

     一,Github地址:https://github.com/mushan520/WC.git 二.PSP表格: PSP2.1 Personal Software Process Stages 预估耗 ...

  8. 个人项目wc

    github地址:https://github.com/YTFFBX/wc 1.题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行单元测试.回归测试.效 ...

  9. 软件工程作业 - word count

    (编程和软件工程作业系列) 实践最简单的项目:WC 实践是理论的基础和验证标准,希望读者贯彻“做中学”的思想,动手实现下面的项目,并和别人的成绩相比较,分析产生差距的原因. 1. 实现一个简单而完整的 ...

  10. 毕业设计代做,各种系统微服务项目ssm项目,员工管理系统,微信小程序,购物商城,二手商城系统,销售系统,等等

    毕业设计代做,各种系统,微服务项目,ssm项目 小程序,商城等,期末作业等都可以,价格好说,长期接单, 有项目说明书,软件介绍相关文档,答辩的时候包过,知识点对接好,给你讲解等, 毕业设计代做,各种系 ...

随机推荐

  1. ffmpeg 截取视频

    ffmpeg -ss 00:00:03 -t 22 -i output20230301.mp4 output20230301_0.mp4 -ss:开始时间 -t:持续时间 -i:输入 接着是输出

  2. String类对象的常用操作及方法

    在Java中,String类包含有50多个方法来实现字符串的各种操作,以下介绍一些我们需要经常使用的方法.1.字符串的连接public String concat(String str) 该方法的参数 ...

  3. cublas fp16

    编译选项: nvcc 4.cpp -o test_gemm  -lcudart -lcuda -lcublas -std=c++11 #include <sys/time.h> #incl ...

  4. 图形学的up

    https://space.bilibili.com/512313464 c++ 路线有前者的经历https://mp.weixin.qq.com/s?__biz=Mzg2MDU0ODM3MA==&a ...

  5. surfaceview+mediaplayer

    public class VideosurfaceView extends SurfaceView implements SurfaceHolder.Callback, MediaPlayer.OnP ...

  6. mybatis自增主键的获取

    实体类 package org.example.entity; public class User { private Integer id; private String name; private ...

  7. 钉钉机器人webhook的使用

    1.群启动webhook机器人:右上角设置--智能助手---添加机器人---其他机器人 2.获取webhook地址 3.调用方式不一样,则访问方式就不一样 ---------------------- ...

  8. 关于el-dialog弹窗组件关闭报错事件

    以下写法,向父组件抛出关闭事件, (正常点击弹窗footer的关闭时没有报错,但是点击空白处及右上角的×号,就会报以上错误) 原因, close事件为已经关闭了弹窗后的事件,官方还给出了  befor ...

  9. maven工程运行环境修改 maven的java工程取mysql数据库数据

    maven工程运行环境修改  <plugins> <plugin> <!-- https://mvnrepository.com/artifact/org.apache. ...

  10. Docker emqx实践

    把emqx服务迁移到另一台服务器上 1.新服务器安装docker apt  install docker.io 1.从服务器上导出镜像 导出镜像文件: docker export 55d48d3a13 ...