2018-9-17 22:00PM,以博客提交至班级博客时间为准
要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html;
https://edu.cnblogs.com/campus/buaa/BUAASummerSETraining/homework/2013;
https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1816W/homework/2085 。html
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具有其余扩展功能,并可以快速地处理多个文件。java
输入文件名以命令行参数传入。例如咱们在命令行窗口(cmd)中输入:git
//C语言类 wordCount.exe input.txt //Java语言 java wordCount input.txt
则会统计input.txt中的如下几个指标github
A-Z
,a-z
A-Z
,a-z
,0-9
file123
是一个单词,1file
不是一个单词。file
,File
和FILE
是同一个单词输出的格式为算法
characters: number words: number lines: number <word1>: number <word2>: number ...
在写了一些代码开胃以后,你们都完成了一份知足基本功能的代码。
你们的代码都各有特点,若是如今咱们要把这个功能放到不一样的环境中去(例如,命令行,Windows图形界面程序,网页程序,手机App),就会碰到困难:代码散落在各个函数中,很难剥离出来做为一个独立的模块运行以知足不一样的需求。
同时咱们也看到,不一样的代码解决不一样层面的问题:windows
这些代码的种类不一样,混杂在一块儿对于后期的维护扩展很不友好,因此它们的组织结构就须要精心的整理和优化。
咱们但愿把基本功能里的:架构
这三个功能独立出来,成为一个独立的模块(class library, DLL, 或其它),这样的话,命令行和GUI的程序都能使用同一份代码。为了方便起见,咱们称之为计算核心"Core模块",这个模块至少能够在几个地方使用:app
把计算核心在单元测试框架中作过完备的测试后,咱们就能够在算法层级保证了这个模块的正确性。
但咱们知道软件并不是只有计算核心,实际的软件是交付给最终用户的软件,除了计算核心外,还须要有必定的界面和必要的辅助功能。
这个Core模块和使用它的其余模块之间则要经过必定的API来交流。
API应该怎么设计呢?
为了方便起见,咱们能够从下面的最简单的接口开始(仅举例,你的代码里可能没有这个函数):框架
int countChar(File *file)
这个函数表示输出一个文件指针,返回这个文件的字符数。
假设咱们用Core封装了这个接口,那么咱们的测试程序能够是这样:ide
File *in = fopen("input.txt","r"); int count = 100; Assert(countChar(in) == count);
固然,这样的测试程序并不充分,但愿你们测试时不要像这样偷懒。
如今咱们封装了接口,咱们要对咱们的代码进行正确性验证。
另外一方面咱们都知道健壮性对于软件来讲是很是必要的,请各位使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;另外,请准备至少10个测试用例确保你的程序可以正确处理各类状况,而且不会崩溃。
对待错误的输入,可以尽量精确报错(就像编译器同样)。
你能够有“容错性”的出错设计,但必须输出必要的提示或说明。
如今咱们已经有了一个基础的词频统计软件,若是它经过了足够多的单元测试,那它可能也已是一个比较完善的词频统计软件了。可是一个软件光正确了还不够,还须要有必定的性能。
那么,如何让软件又快又好地执行呢?那就须要咱们找到执行消耗时间最久的模块,而后不断地优化改进它。那么,如何知道哪些语句是软件的时间瓶颈呢,这就须要用到效能分析。
使用 Visual Studio 进行 C++ 效能分析:https://docs.microsoft.com/en-us/visualstudio/profiling/beginners-guide-to-performance-profiling
使用 JProfiler 进行 Java 效能分析:http://www.javashuo.com/article/p-urvgxxxt-hn.html
关于效能分析的更多资料,能够查看:http://www.cnblogs.com/xinz/archive/2011/11/20/2255809.html
参照“效能测试、分析、改进,再效能测试”的流程,找出关键模块消耗最大的函数,而后分析一下:该如何改进这个程序?
值得注意的一点是,效能分析只在真正有性能问题时才会有显著结果。也就是说,学员在进行效能分析时,可能统计一个只有100行的文件并看不出来有什么差别,也看不出来哪里消耗最大。此时可使用更大的参数试试,好比统计一个有1000,000行的文件,再使用效能分析工具测试消耗时间最多的模块,再进行改进。
助教在测试时,将运行自动测试程序编译源文件并运行,进行批量测试,所以请保证项目的组织目录符合要求.
对于使用Java语言的项目有如下两点要求:
【以学号为名的文件夹中】的目录下必须有src文件夹
201621123000(文件夹名字为学号,这里以学号201621123000为例) |- src |- Main.java(主程序,能够从命令行接收参数) |- lib.java(包含其它自定义函数,能够有多个,对名字不作要求)
对于使用C++语言的项目有如下两点要求:
【以学号为名的文件夹中】的目录下必须有src文件夹,在src文件夹中是可在VS2017下编译运行的解决方案,解决方案的名字必须为 WordCount,一个C++工程示例组织目录以下所示:
201621123000(文件夹名字为学号,这里以学号201621123000为例) |- src |- WordCount.sln |- WordCount |- stdafx.cpp |- stdafx.h |- WordCount.cpp |- WordCount.vcxproj
本次博客做业总分 20分,由如下部分组成:
本次程序做业总分40分,由如下部分组成:
注:
PSP模版表格以下,第3列和第4列分别对应第2列条目的估计时间和真实时间,模版表格里的时间只是示意。
PSP2.1 | 我的开发流程 | 预估耗费时间(分钟) | 实际耗费时间(分钟) |
Planning | 计划 | 8 | 6 |
· Estimate | 明确需求和其余相关因素,估计每一个阶段的时间成本 | 8 | 6 |
Development | 开发 | 82 | 88 |
· Analysis | 需求分析 (包括学习新技术) | 6 | 10 |
· Design Spec | 生成设计文档 | 5 | 6 |
· Design Review | 设计复审 | 4 | 6 |
· Coding Standard | 代码规范 | 3 | 3 |
· Design | 具体设计 | 10 | 12 |
· Coding | 具体编码 | 36 | 21 |
· Code Review | 代码复审 | 7 | 9 |
· Test | 测试(自我测试,修改代码,提交修改) | 13 | 21 |
Reporting | 报告 | 9 | 6 |
· | 测试报告 | 3 | 2 |
· | 计算工做量 | 2 | 1 |
· | 并提出过程改进计划 | 3 | 3 |