一、Github地址

https://github.com/S-TRAVELER/WC

实现的功能:

  •   支持 -c
  •   支持 -w
  •   支持 -l
  •   支持 -s
  •   支持 -a
  •   图形界面
  • 多参数(文件名或通配符表达式)
  •   跨系统平台
  •   多种编程语言
  •   支持中文

  

二、PSP表格

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


三、解题思路

由于之前开发基本是在Linux上,看到题目提到exe,于是就计划在Linux平台上开发完基本功能,再兼容Windows平台。

3.1 跨平台

由于考虑了跨平台(Linux+Windows),所以选择了CMake+Qt 的组合;用CMake来实现跨平台的编译,Qt实现跨平台图形界面显示。

  在源码中,除了Gui是Qt实现不需要自己考虑跨平台,其他的功能的实现均需要自己进行系统判断,再进行相应平台的操作。

3.2 程序基本实现

为了提高程序的可扩展性,对命令、选项解析、统计器分别进行了松耦合的处理;使得选项解器、统计器可以不同需求进行策略替换;命令通过继承的方式进行装饰,以增强命令的功能。然后,再构建一个单例的命令注册器,对命令进行管理(看到这里,你大概可以猜到命令注册器让这个程序可以同时支持多个命令,而不仅仅是一个wc命令),提高了可扩展性。

3.2 通配符的支持

通配符的实现思路是把通配符表达式转化为正则表达式,然后实现目录轮询器,然后进行递归遍历,把符合通配符的文件名作为参数进行回调。注:由于Linux的终端和Windows的CMD会对通配符进行解析,所以需要用双引号(Windows的是单引号)把通配符表达式括起来。

3.3 图形界面

图形界面是使用Qt来实现,Qt提供了比较美观的用户界面。

3.4 多语言支持(自定义为-L)

这个功能算是对统计注释行、代码行的选项(-a)的扩展。在实现题目要求的功能时,认识到不同语言具有不同的注释方式,可以让用户进行语言选择,然后再根据用户选择的语言的注释语法进行统计。

通过配置文件的方式,读入不同语言的注释语法,实现了在不需要重新编译的情况下对语言种类进行扩展。

3.5 支持中文

  在写完Gui后,意识到原本写的Counter对中文不友好,于是重写了Counter的代码。由于中文占用多个字节(Linux占用3个,Windows占用2个),所以需要分系统使用正则表达式进行统计,以同时支持中文和英文。


四、设计实现

五、测试运行

程序在终端运行时,输出的内容依次为:行数、词数/字数、文件大小(B)、注释行、空行、文件名

5.1 文件测试

文件依次为(注:为了方便呈现效果,故在测试时输出文件内容):

  • 空文件
  • 只有一个字符的文件
  • 只有一个词的文件
  • 只有一行的文件
  • 一个典型的源文件

5.2 输入不存在的文件

Linux:

Windows:

5.3 不选择文件

Linux:

Windows:

5.4 无选项测试

Linux:

Windows:

5.5 多文件测试

Linux:

Windows:

5.6 通配符测试

Linux:

Windows:

5.7 递归目录

Linux:

Windows:

 5.8 图形界面测试

Linux:

Windows:

5.9 查看帮助

5.10 代码覆盖率

六、项目总结

  本次项目选用C/C++作为开发语言、CMake+Qt作为开发工具、GCov\LCov做代码覆盖率检查。

  本次开发努力遵循使用面向对象的思想解决问题,不断地考虑软件模块的层次,尽量降低模块的耦合度。在设计软件模块方面花的时间比较多。此外,本次开发兼容了Linux和Windows两个系统,在写兼容代码的部分也花了比较多的时间。

这次开发过程中也采用了基于对象的编程思想,以及使用比较多的回调函数,以提高代码的复用率,这也是自己比较满意的地方;但是还是存在不足,代码冗余度还是比较高。

 

个人项目-WC(C/C++ 兼容Linux和Windows)的更多相关文章

  1. phantomjs的使用+Java代码+依赖js(兼容Linux和windows版本)

    1.  在使用phantomjs的时候需要下载phantomjs,网上有window版本和Linux版本.将phantomjs放在Linux上的指定位置之后(如下面的/home/tpl/phantom ...

  2. java中构建同时兼容linux和windows程序时遇到的文件路径分割符问题解决方案

    最近在做一个自动上传文件的客户端,因为 file.getAbsolutePath()  在Mac和linux下的分割符是“/”,而在windows操作系统下的分割符则是“\”,我们程序中固然可以通过调 ...

  3. java读properties的通用类,兼容linux和windows

    package util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; / ...

  4. Linux和Windows兼容

    1. 介绍 我们知道Linux上的应用程序是ELF格式的,而Windows则是PE格式 所以要解决这个问题首先二进制加载问题:其次,就是API问题,两者的API完全不同要实现兼容,就需要构建一个虚拟层 ...

  5. paip.log4j兼容linux windows 路径设置

    paip.log4j兼容linux windows 路径设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  6. Java项目打包在CMD或者Linux下运行

    Java项目打包在CMD或者Linux下运行 1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压

  7. shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)

    shell脚本兼容linux/unix与windows/cygwin的基础 :统一文本格式为:unix文本格式,即于LF为换行符(推荐方案) 在notepad上设置:编辑->档案格式转换-> ...

  8. 如何将项目部署到远程的Linux机器上的tomcat上

    下面来练习一下如何将本地的一个项目部署到远程的Linux机器上去. 第一步:将要部署到Linux机器上的项目打成一个war包 war包有一个好处tomcat可以自动解压 第二步:将打好的war上传到L ...

  9. 【转】前后端分离的项目如何部署发布到Linux

    前后端分离的项目如何部署发布到Linux 前期准备 1.服务器的基本配置信息2.本机远程连接服务器的工具(xshell.xftp或者mobaXterm等等,看你自己喜欢) 第一步:部署环境 1.安装j ...

随机推荐

  1. 一 、爬虫的认识与http

    一 .爬虫的认识与http 互联网应用架构  一般采用c/s架构,b/s架构或者m/s架构 c/s 即 client server 客户端 服务端 b/s 即 browser server 浏览器 服 ...

  2. XGBoost缺失值引发的问题及其深度分析

    1. 背景 XGBoost模型作为机器学习中的一大“杀器”,被广泛应用于数据科学竞赛和工业领域,XGBoost官方也提供了可运行于各种平台和环境的对应代码,如适用于Spark分布式训练的XGBoost ...

  3. Audit Object Changes 审核对象更改

    Important 重要 The Audit Trail module is not supported by the Entity Framework ORM in the current vers ...

  4. delphi使用Foxit Quick PDF Library读写pdf文本和图片

    简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...

  5. Android TeaPickerView数据级联选择器

    数据级联选择器.三级联动.二级联动.层级联动.多数据筛选.必藏 (Data Cascade Selector, Hierarchical Structure, Multiple Data Screen ...

  6. 关于thymeleaf中th:if的使用

    运用于判断表达式中时,关系判断使用 gt / ge / eq / lt / le / ne (即:使用缩写) gt: great than(大于)> ge: great equal(大于等于)& ...

  7. 强大的django-debug-toolbar,django项目性能分析工具

    强大的django-debug-toolbar,django项目性能分析工具 给大家介绍一个用于django中debug模式下查看网站性能等其他信息的插件django-debug-toolbar 首先 ...

  8. RTP Payload Format for H264 Video

    基础传输结构 rtp中对于h264数据的存储分为两层,分别是 VCL: video coding layer 视频编码层 这是h264中block, macro block 以及 slice级别的定义 ...

  9. Markdown数学公式语法

    详细网址:Markdown数学公式语法

  10. Charles 使用笔记

     一.介绍 Charles 属于抓包软件. Charles 多平台支持,mac.windows.linux. Charles 是收费软件,可以免费试用 30 天.试用期过后,未付费的用户仍然可以继续使 ...