我的GitHub地址:https://github.com/Yuetao1219/lessons

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 的行数

项目分析与实现

1.统计文本文件,首先要读入文件,并确保文件存在并可读。用exists()方法和canRead()方法对输入的文件进行判断。代码如下:

2.对于要执行的操作,用-c统计字符,-l统计行数,-w统计单词,-z统计字母。设计思路:以字符串的形式输入一个或多个操作符,用空格隔开。然后用split()方法将字符串以空格分成一个或多个字符串数组,最后遍历数组实现想执行的操作。

3.统计字符数和行数。用read()方法依次扫描文件内的每一个字符,遇到'\n',则rows++,遇到!(' '&&'\n'),则chars++。

4.统计单词。这个也是相对比较难的操作。因为对代码中单词的定义是不明确的,比如:int(算是一个单词吗?),char_count(算是一个单词or两个单词)。既然要统计,就得找到一个明确的标准。我的标准是,对于两个及两个以上连续的字母则为一个单词,除字母以外的字符作为单词与单词之间的分隔符。例如:对于前述的例子,int 算是一个单词,char_count算是两个单词char和count。于是,既然找到了是否是单词的定义,那么怎样用代码来实现?

前面的统计字符数和行数都是直接对文本文件进行依次扫描,那么统计单词,就是在统计字母的基础上,加上一个flag对字母是否连续进行判断,以此到达统计单词的目的。代码如下:

首先判断是否是字母,如果是,则flag++,不是,则flag置0。当flag>=2(满足至少两个字母连续),且当前字母不是字母,则words++。

遇到的困难:我最开始想到上面这个思路后,用代码实现,我只是对flag>=2&&a不是字母进行了判断,并words++,flag=0。没有想到当flag=1时a不是字母的情况,此时,没有将flag置0,尽管代码没有被报错,但是,我运行程序后,多次输入不同的测试文件,得出的输出值都是错误。后来,我仔细分析了该段代码,找到了代码不严谨而导致错误的地方,没有对扫描会出现的所有情况进行逐一分析,只想到了大多数情况,忽略了一些不起眼的小问题而导致这段代码进行了错误的计算。经过思考和改正代码,然后又输入多个不同文件进行验证,都得到了理想的输出结果。

测试:

总结:代码量比较少,但是基本实现了对文本文件的字符数、行数、单词和字母的统计,还没有实现对空行数、注释行数和代码行数进行统计,需要改进和升级的地方还有很多。条条大路通罗马,对于这个项目要求,一定有很多的方案和设计,以及更简洁的代码,所谓简洁,不只是代码量少,而且时间复杂度低。

PSP

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

最新文章

  1. 10——operator=返回reference to *this
  2. 2016-06-13:NAT原理
  3. poj3304Segments(直线与多条线段相交)
  4. Android——ScrollView
  5. 3月22日 html(三)css样式表
  6. 资本助力转型 TCL攻守转换(转型、并购、过冬前一定要保留强大的战略预备队)
  7. JavaScript+svg绘制的一个饼状图
  8. 如何通过get,set方法访问到父类的私有属性
  9. js == 运算规则解析
  10. Apache Flink 漫谈系列 - JOIN 算子
  11. LOJ #2587「APIO2018」铁人两项
  12. Spring的IOC/DI使用到的技术
  13. SpringBoot Logback配置,SpringBoot日志配置
  14. 1.7.6方法stop()与java.lang.threadDeath异常
  15. POST、GET请求中文参数乱码问题
  16. qxx 项目总结
  17. 如何利用jQuery post传递含特殊字符的数据【转】
  18. LaTeX 编辑软件WinEdt使用简要介绍
  19. 字符串模式匹配算法1 - BF和KMP算法
  20. SpringMVC传值(对象或字符串)给前台js

热门文章

  1. Tkinter Cursors
  2. linux中args工具
  3. BeginInvoke 方法真的是新开一个线程进行异步调用吗?
  4. SpringData JPA示例
  5. JSP页面中的时间显示问题
  6. a+b_1
  7. kibana-4.6.3-linux-x86_64.tar.gz的安装(图文详解)(升级)
  8. keepalived + nginx实现高可用
  9. 通过Curl 对url进行encode操作
  10. plsql中的光标