| 作业要求地址 | https://www.cnblogs.com/harry240/p/11524113.html |
| GitHub项目地址 | https://github.com/anranbixin/WordCount |
| 结对伙伴的博客 | https://www.cnblogs.com/step-enter/p/11644293.html |
1、PSP表格
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
30 |
40 |
|
· Estimate |
· 估计这个任务需要多少时间 |
1200 |
1440 |
|
Development |
开发 |
1080 |
1200 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
40 |
50 |
|
· Design Spec |
· 生成设计文档 |
20 |
20 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
30 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
|
· Design |
· 具体设计 |
60 |
50 |
|
· Coding |
· 具体编码 |
700 |
960 |
|
· Code Review |
· 代码复审 |
60 |
50 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
150 |
|
Reporting |
报告 |
30 |
20 |
|
· Test Report |
· 测试报告 |
60 |
40 |
|
· Size Measurement |
· 计算工作量 |
30 |
20 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
20 |
|
|
合计 |
1230 |
1480 |
2、计算模块接口的设计与实现过程
2.1项目分析(项目需求)
(1)应具备的功能
- 统计文件的字符数
要求:1、汉字不考虑,空格、空格,水平制表符,换行符,均算字符,
2、输出的单词统一为小写格式
- 统计文件的单词总数
要求:1、至少以4个英文字母开头,且可以跟上字母数字符号
2、单词以分隔符分割,且不区分大小写
- 统计文件的有效行数
要求:任何包含非空白字符的行都需要统计
- 统计文件中各单词的频数
要求:1、最终只输出频率最高的10个
2、频率相同的单词,优先输出字典序靠前的单词。
- 按照字典序输出到文件txt(默认为output.txt)
要求:1、字典里面的单词已经过频数排序
2、输出的文件可任意指定
3、输出的量可控
(2)新功能
- 词组统计
要求:能统计文件夹中指定长度的词组的词频
- 自定义输出
要求:能输出用户指定的前n多的单词与其数量
- 多参数的混合使用
要求:格式为 -i input路径 -o output路径 -n 参数 -m 参数
(3)附加功能(这个功能我们两个决定选择性的实现)
- 用户交互界面绘制
2.2项目思路
-- 首先假设给出的路径已知,分别为(便于我们之后要进行指令读入造成的代码修改):
(1)读入文件路径:D:\VS_practice\wordCount\wordCount\bin\Debug\input.txt
(2)写入文件路径:D:\VS_practice\wordCount\wordCount\bin\Debug\output.txt
注意:1、这里我们程序运行的当前路径为:D:\VS_practice\wordCount\wordCount\bin\Debug
2、我们只需要调用语句,即可获得当前程序路径,之后加上我们的文件名即可
//获取当前文件路径 string currentpath = Directory.GetCurrentDirectory();
(3)数据的读取上,我们考虑到文件内容如果很大会影响数据的读取,我们采用的是content.ReadLine()进行单行的读取,这里也是会出现问题的,值得注意的一点是:在读入的input.txt文件里面,每一行英文必须是要用空格或者其他符号结尾,不然在后面使用Regex(Regex我会在后面单独提到)进行单词的提取上会出现错误
-- 程序如何才能实现:
(1)我们预计设计两个.cs文件,一个为主函数.cs文件(program.cs),一个为函数.cs文件(port.cs)
(2)数据的存储:使用string 变量来存储字符数,list<> 来存储提取出来的单词,dictionary<string,int> 来存储单词以及其的频率(这里要使用到dictionary的两个参数的使用,key和)
(3)头文件的调用:文件的输入输出需要使用到StreamWriter,因此需要调用IO头文件;提取单词需要使用到System.Text.RegularExpressions.Regex,因此需要调用Text.RegularExpressions头文件
//文件流的输入输出 using System.IO; //正则表达式 using System.Text.RegularExpressions;
补充:
这里知识点的我参考了其他的博客:https://www.cnblogs.com/liangsetian/archive/2011/07/05/2098280.html
(4)获取字符数、单词数、频数等等,直接使用函数返回即可
(5)指定输出和指定单词组的输出都是涉及函数涉及,在之后会进行详解,这里输出会使用到遍历foreach ( element in list or dictionary)
(6)多参数的混合使用里面涉及到cmd命令,此时需要使用到args[i],通过Main方法中的string[] args参数来获取
补充:这里我进行了知识点的搜索(args),博客源为:https://blog.csdn.net/eric_k1m/article/details/37518579
-- 程序的流程大致为下图所示:
基础功能模块和新功能模块:
2.3接口的设计与代码的实现过程
-- 首先进行基础功能的接口设计与实现
这里我使用的是五个函数,首先必须依次调用Getcharacters(path);Withdraword();Tolower();Wordfrequency();这四函数,以实现初始化,中途涉及函数的调用,函数需要进行依次的设计,这四个函数需要依次进行实现,否则出来的结果是不正确的。例如:还没有进行字符的录入,但是你要输出单词这就是无法实现的。以下依次为5个函数的设计(4个基本+1个输出):
(1)进行字符的读取,这里我们必须要将待读取的文件的路径传进来,我们将函数设计为:public void Getcharacters(string path),在里面我们使用了ReadLine()来对path里面的文档进行一行一行的读取,然后将读取的字符直接存储于account_chara字符串里面
//读取文件,string account_chara用于存储字符 public void Getcharacters(string path) { StreamReader content = new StreamReader(path); //定义字符临时变量 string temp = content.ReadLine(); //读取 while (temp != null) { account_chara = account_chara + temp; account_line++; temp = content.ReadLine(); } //最后一行读入无效,将其删去 account_line -= 1; }