Github项目地址:https://github.com/jat0824/wc.git

项目相关要求

  wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。具体功能要求:程序处理用户需求的模式为:

wc.exe [parameter] [file_name]


PSP

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

遇到的困难及解决方法

  • 问题描述做过的尝试

    • 1、关于如何将参数传入main方法的问题
    • 2、如何统计词数
    • 3、如何判别注释段是否结束
    • 4、通配符的处理
  • 做过的尝试

    • 1、用Scanner类获取参数输入->使用main函数的argv数组获取参数输入

    • 2、逐行读取文件,除去特殊字符后用空格分离该行,返回数组长度

    • 3、设置了两个变量来记录注释段的开始字符个数和结束字符个数,只有两个变量相等的时候才表示注释段结束

    • 4、将通配符按正则表达式的规则替换掉了*和?

  • 成功解决问题

  • 收获:了解了main函数参数的作用,学习并运用了正则表达式,多角度思考问题

设计实现过程

包含以下几个函数:

  1、stringcount():实现-c、-l操作:统计文件字符数或行数

  2、wordcount():实现-w操作:统计指定文件中词的个数

  3、handleall():实现-s操作:递归读取目录下符合条件的文件,加入List

  4、moredata  ()  :实现-a操作: 统计代码行/空行/注释行

  5、Checkfile  ()  :判断需要处理的是目录还是文件

  6、deal  ()  :按正则表达式处理含通配符的文件名

  7、main():主方法

实现过程:

  在主方法中判断输入的参数并进行相应的操作,-s操作需要先调用Checkfile  () 函数,在Checkfile  () 函数中调用了deal  () 函数规范文件名,然后再调用了handleall()函数处理符合条件的文件。

关键代码

-s、-a操作实现:

在主函数中:首先判断参数是否为-s,然后调用Checkfile()方法判断输入的最后一个参数是目录还是文件,最后通过handleall()方法对符合条件的文件进行后续操作。

// 判断需要处理的是目录还是文件
public static void Checkfile()
{int pathlen = filename.get(0).length();int filelen = 0;String name = null;String file = filename.get(0);// 判断是否为文件名,是否含有通配符if (file.replaceAll("[^//.^//*^//?]", "").length()==0)  {handleall(file, "");}else{if (file.contains("/")){String[] n = file.split("/");name = n[n.length-1];filelen = name.length();handleall(file.substring(0, pathlen-filelen), deal(name));}else{handleall("", deal(file));}}
}// 实现-s操作:递归读取目录下符合条件的文件,加入List
public static List<String> handleall(String path, String name) {Matcher m = null;if (path.equals("")){dir = new File("src");}else {dir = new File(path);}File[] files = dir.listFiles();if (files == null){System.out.println("该目录为空!");}for (File f : files){if (f.isFile()) {if (name.equals("")){filename.add(f.getAbsolutePath());}else {Pattern p = Pattern.compile(name);m = p.matcher(f.getName());if (m.matches()){filename.add(f.getAbsolutePath());}}}else if (f.isDirectory()) {handleall(f.getAbsolutePath(), name);}}return filename;
}// 按正则表达式处理含通配符的文件名
public static String deal(String name)
{name = name.replace(".", "#");name = name.replaceAll("#", "\\.");name = name.replace("*", "#");name = name.replaceAll("#", ".*");name = name.replace("?", "#");name = name.replaceAll("#", ".?");name = "^" + name + "$";// System.out.println(name);return name;
}// 实现-a操作public static String moredata(int first) throws IOException {int line = 0;int null_line = 0;  // 空行// 用于匹配注释段的起始(/*)与结束(*/),只有当cp1==cp2时注释段才结束int cp1 = 0;    int cp2 = 0;// 标记整段注释的起始行数int note = 0;   int end = 0;int note_line = 0;  // 注释行int code_line = 0;  // 代码行File files = new File(filename.get(first));if (files.exists()) {    // 判断文件是否存在BufferedReader br = new BufferedReader(new FileReader(files));String st = null;while ((st = br.readLine())!=null) {   // 如果文件中最后一行为空行则最后一行不算一行++line;// 将字符串中的空格、回车、换行符、制表符去掉String s = st.replaceAll("\\s*|\t|\r|\n", "");  if (s.equals("") || s.equals("{") || s.equals("}")) {   // 判断空行用s.equals("")// 注释段中的空行不算在空行数中,算在注释行数中if (s.equals("") && cp1!=cp2){;}else {null_line++;}}else if (s.startsWith("//") || s.startsWith("{//") || s.startsWith("}//")){note_line++;}else if (s.startsWith("/*")){cp1++;if (line>note && note!=0){continue;}else {note = line;}}else if (s.endsWith("*/")) {cp2++;if (line>end){end = line;}else {continue;}if (cp2 == cp1){note_line += end-note+1;}}// 代码行=总行数-注释行-空行code_line = line-note_line-null_line;}br.close();System.out.println("文件" + filename.get(first) + "的代码行/空行/注释行 分别为: " + code_line + "/" + null_line + "/" + note_line);return code_line + "/" + null_line + "/" + note_line;} else {System.out.println(files.getPath() + " 文件不存在!");return "no such file!";}}

  • Checkfile()方法用于判断输入的路径是目录还是文件,再通过handleall()方法将各符合条件的文件绝对路径存入List表中。输入的是目录则递归对该目录下的所有文件进行后续操作,输入的是文件则直接对符合条件的文件进行后续操作(默认的文件路径在src目录下)

  • deal()方法是按正则表达式的规则处理含通配符的文件名,例如:输入的文件名为 *.?d 则经过处理后文件名为 ^.*..?d$

    • 其中^和$分别表示正则表达式的起始和终止
    • . 匹配除"\r\n"之外的任何单个字符; * 表示零次或多次匹配前面的字符或子表达式; ?表示零次或一次匹配前面的字符或子表达式;
  • moredata()方法中实现了对代码行、空行、注释行的统计,其中注释行的统计主要设置了两个int类变量cp1和cp2 对读取的每一行字符串进行判断,是否为"/*"开头,是则cp1++,是否为"*/"结尾,是则cp2++。因此只有当cp1==cp2的时候注释段才结束,这样设计主要针对注释段中含有注释段的特殊情况。并且注释段中的空行算在注释行数不算在空行数。

  • 运行结果截图:

    • 输入命令:

    • 结果输出:

测试运行

运行测试单元文件,运行结果截图:

项目小结

在一开始分析需求的时候没有彻底分析清楚需求,导致设计的时候没有考虑全面,在快结束的时候才发现需求没有完全实现。而且有些功能会有些不能解决的情况,例如:-w功能统计词数的时候如果两个词都顶格,分布在相邻两行或者中间隔着若干空行,则该功能会将两个词算为一个词。下次开发的时候不能粗略的按照自己的理解看完需求就马上开始设计,应该认真的看完需求文档之后再进行设计。在代码规范方面,应该在平时写代码的时候就养成好习惯,在需要解释说明的地方写好注释,代码的格式也应该有自己的风格。在开发完后可以给自己的项目写个用户说明文档以便用户使用。

           

转载于:https://www.cnblogs.com/x-j1/p/9648250.html

个人项目:wc程序(java)相关推荐

  1. java个人介绍代码_个人项目WC(Java)

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

  2. 微信读书登陆界面java_(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好...

    转载地址:(JAVA后端)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 一.环境搭建 相关环境软件:JDK1 ...

  3. (微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好

    转载地址:(微信小程序)微信小程序-毕设级项目搭建-微信阅读小程序(内含源码,微信小程序+java逻辑后台+vue管理系统)~不求完美,实现就好 转载请注明出处 作者:Happy王子乐 个人网站(整理 ...

  4. 驾校分期-众筹项目java前后端分离项目vue(微信小程序+java前后端源码下载)

    可以idea直接打开,mysql数据库项目,前后端分离项目vue,分期可自动设置,自动换算金额 驾校分期-众筹项目java前后端分离项目vue(微信小程序+java前后端源码下载)

  5. Implementation of WC in JAVA

    Implementation of WC in JAVA github地址 相关要求 基本功能 -c [文件名] 返回文件的字符数 (实现) -w [文件名] 返回文件的词的数目 (实现) -l [文 ...

  6. 用gradle启动java项目_构建Java项目

    #构建Java项目# 上一节我们简要介绍了如何编写一个单机的To Do应用,接下来要打包部署成可执行的应用,我们需要编译源代码,生成的class文件需要打包到JAR文件中.JDK提供了javac 和j ...

  7. 为什么我会在2012年的新企业Java项目中使用Java EE而不是Spring

    这个问题经常出现. 我的新项目也在2011年11月发布. 在这个新的Enterprise Java项目中,我将使用Java EE(JEE)代替Spring框架. 我知道:关于此主题的文章,博客和论坛讨 ...

  8. 微信运动步数:小程序+Java后端,源码可下载

    微信运动步数:小程序+Java后端 更多资源:www.jeeweixin.com 功能说明: 1.获取和展示用户的微信运动步数,计算卡路里: 2.用户打开小程序即可实现步数打卡入库: 3.通过日历展示 ...

  9. 视频教程-SpringBoot后台CRM项目(第一季)-Java

    SpringBoot后台CRM项目(第一季) 2011年毕业后在澳门 遊澳集团(UO Group)旗下某IT科技公司从事 android,php,j2ee开发工作,负责 国际短信发送系统.银联支付业务 ...

最新文章

  1. 聊聊这两年学习slam啃过的书!
  2. 转换时间格式24小时_国内(上海)原油期货交易的具体时间段?是24小时交易吗?...
  3. 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔
  4. 获取用户精准地理位置信息(百度地图)
  5. Missing you is a kind of my deep-pain in my life
  6. ComboBox联动
  7. 【转载】define与typedef区别与联系
  8. jQuery操作cookie
  9. 面试题,你觉得什么样的产品适合做成saas?
  10. 微服务升级_SpringCloud Alibaba工作笔记0010---Gateway配置动态路由
  11. 为Mac任意命令设置快捷键
  12. okhttp3 请求html页面,OkHttp3简单使用教程(一):请求和响应
  13. 用mindspore写了一个decouplehead模块,在yolov5上使用时报错
  14. 奶茶店的线上线下营销策略
  15. tif文件转为shp文件_在arcgis中怎么把tif格式的遥感图像转换为矢量图
  16. android 静态工厂方法,Android 源码中的静态工厂方法
  17. 关于cv2.cvtColor函数的一些小小的思考
  18. 面试常见问题回答技巧(70题)
  19. 如何寻找创业合伙人、搭建创业团队?
  20. 消息称华为深圳研发基地员工坠楼 官方称不知情

热门文章

  1. NYOJ276 比较字母大小
  2. python语言中strike_Python学习笔记
  3. 单纯形法求最小值的检验数_【运筹学】单纯形法(笔记和思考)
  4. 【Pytorch神经网络理论篇】 21 信息熵与互信息:联合熵+条件熵+交叉熵+相对熵/KL散度/信息散度+JS散度
  5. 【Pytorch神经网络实战案例】04 使用Pytorch实现线性回归
  6. 数据结构之平衡树:红黑树的介绍与Python代码实现——17
  7. LeetCode 858. 镜面反射(最小公倍数/最大公约数)
  8. LeetCode 1169. 查询无效交易
  9. 剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)
  10. LeetCode 621. 任务调度器(贪心)