一、Fork仓库的Github项目地址和伙伴的地址
Github项目地址:https://github.com/WHYNOTEN/WordCount.git
合作同学作业地址:https://www.cnblogs.com/SW-P-WY/p/10657136.html
合作人:wnagyang、zhourong
二、PSP表格(事实上实际耗费时间比预估时间要长)
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
890 | 1435 |
|
· Estimate |
· 估计这个任务需要多少时间 |
890 | 1435 |
|
Development |
开发 |
770 | 1270 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
40 | 50 |
|
· Design Spec |
· 生成设计文档 |
30 | 35 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
50 | 60 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 | 15 |
|
· Design |
· 具体设计 |
30 | 50 |
|
· Coding |
· 具体编码 |
420 | 900 |
|
· Code Review |
· 代码复审 |
60 | 40 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 | 120 |
|
Reporting |
报告 |
120 | 165 |
|
· Test Report |
· 测试报告 |
60 | 80 |
|
· Size Measurement |
· 计算工作量 |
30 | 60 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 25 |
|
合计 |
900 | 1435 |
绘制PSP表格总结:以前编写项目的时候并未有设计和预算的过程,个人感觉编写表格和事先设计好进程,更有利于完成项目。因为在完成的过程中对自己进行到那个地方心里有个数。
三.计算接口模块的设计与实现过程
1.需求分析(由两人共同商议)
基础功能:
1.统计文件字符数(统计字符这一块,对提取文本中字符问题,出现了乱码,后来商讨了下解决不同文本转码的问题)
2.统计单词总数(单词必须四个英文字母开头,后面可以为数字,不区分大小写)
3.统计文件中有效行数
4.统计文件中单词单词总数,按频率排序,对于相同频率单词按字典顺序排列
5.按照字典顺序输出到文件中
6.调用程序时,通过命令行传入文件读取和写入路径
新功能:
1.输出前n个频率最高的单词(直接新增加一个列表保存输出的前n个单词)
2.指定一个词组长度,输出词组及其出现频率
3.多参数混合使用(封装)
实现所有需求思路:
- 需求主要是对于文本中内容的提取,这里就要用到正则表达,之前没有涉及到过就看了下群里同学分享的链接。(用到正则的部分是伙伴编写的,个人不是很会使用正则)
- 对于行数提取则可以通过读取文件(按行提取内容)时,判断提取内容是否为null来解决。
- 统计频率可以通过字典这种Key,Value这种存储方式来进行统计,排序则通过字典排序实现。
- 对于命令行传入参数可以通过Main(string[] args)中对args进行解析来实现。
- 新功能输出前n个频率最高可以直接输出字典内容即可。
- 伙伴询问助教老师后确定同样可以利用字典统计词组并输出(-m的功能是和伙伴“吵了一架的”,因为他觉得构架和基础功能无异,由我编写)
- 第三个功能主要是对于Main方法args参数的解析,可以利用字典保存参数及其内容
最终确定主要写两个.cs文件,其中一个对功能实现,另外一个进行功能类调用,这样测试时即只需要对功能类函数进行测试即可,基本功能由笔者实现,对于新功能有合作者实现,最终整合在功能中:
Function.cs:主要实现对文本内容的提取筛选实现需求功能;
Program.cs:对命令行参数进行分析(GetMand()),调用Function.cs对文本内容分析,实现功能(Main()).
算法关键在于正则表达式的书写以及将内容写入字典整合:
文件读取代码:
//读取文件中的字符数目并保存文件内容 public void GetChar() { //打开文件 FileInfo file = new FileInfo(this.path); //定义读取文件对象 StreamReader sw = file.OpenText(); //按行进行读取,不为空行记录行数并保存内容,返回null打断循环 while (true) { //对文件读取内容进行判断,如果不为空用变量接收,行数加一 string temp = sw.ReadLine(); if (temp != null) { account++; this.content += temp; } //为空则停止 else { break; } } }