GIT地址 | git地址 |
---|---|
结对伙伴 | 曲晨阳201831061313 |
伙伴博客 | 伙伴博客地址 |
一、要求分析 |
此次做业的的题目是设计一个叫作word count的软件,来实现如下基础功能,和若干附加功能。git
a) 统计字符数github
b) 统计单词数编程
c) 统计最多的10个单词及其词频
如下是需求分析流程图和函数介绍
数组
二、模块分析函数
第一步咱们应该要把文件里面的文本给读取出来,咱们想出来的办法就是把整个文本读取储存到一个string str里面性能
fstream fs("example.txt"); stringstream ss; ss << fs.rdbuf(); string str = ss.str(); cout << str << endl; void getinstr(stringstream &s) { str = s.str(); }
把文本存到字符串以后就方便字符的统计单元测试
//统计字符数 int countzifu() { int i = 0; int sum = 0; while (str[i] != '\0') { if (str[i] <= 126 && str[i] >= 32 || str[i] == 10 || str[i] == 13) sum++; i++; } return sum; cout << endl << "字符个数:" << sum << endl; tongji << "字符个数:" << sum << '\n'; }
而后再对文本字符串进行遍历,遇到空格或者逗号句号,就中止,而后把前面的部分存入另外一个字符串,而后一个文本就被分红了若干个字符串,存入一个string a[]里面。测试
string b[500];\\用于存放单词的字符串数组 while (str[i] != '\0') { if (str[i] != 32 && str[i] != 44 && str[i] != 46) { b[n] = b[n] + str[i]; i++; } else { n++; i++; } }
以后就是对存放好的字符串数组挨个判断是否为有效单词,并把大写字母转换成小写,并存入用于存放单词的数组string。
这里须要两个函数设计
判断字符串a是不是有效单词,如果,返回1,不是返回0.3d
int judgeword(string a) { int i = a.size(), n; if (i < 4) { return 0; } for (n = 0; n < 4; n++) { if (a[n] < 65 || 91 <= a[n] && a[n] < 96 || a[n]>123 && a[n] < 127) return 0; } return 1; }
turn(string)函数
把string里面的每一个大写字母转换成小写以便后续的剔除重复单词,和计算频数
void turn(string& a) { int n = 0; while (a[n] != '\0') { if ('A' <= a[n] && a[n] <= 'Z') a[n] = a[n] + 32; n++; } }
`
存放有效单词的循环
for (j = 0; j < n; j++) { if (judgeword(b[j]) == 1) { turn(b[j]); c[count] = b[j]; count++; } }
其中count就为有效单词数
对上面处理好的有效单词数组进行遍历,若是在计数单词数组中已经出现了,则相应的计数数组+1,若未出现过,则加入计数单词数组,相应的计数数组设为1.
{ int j, k, p = 0, t = 0, i; string b[500]; int count[500]; int count1[500]; int count3[500]; for (k = 0; k < n; k++) { count[k] = 1; for (j = 0; j < n; j++) { if (b[j] == a[k]) { count[j]++; break; } } if (j == n) { b[p] = a[k]; p++; } }
而后对计数数组进行遍历,记下最大10个数的序号就好。
for (k = 0; k < n; k++) { count1[k] = count[k]; count3[k] = k; } for (i = 0; i < n - 1; ++i) { // 二重循环完成选择排序 k = i; for (j = i + 1; j < n; ++j) { if (count1[k] < count1[j]) k = j; } if (k != i) { t = count1[k]; count1[k] = count1[i]; count1[i] = t; t = count3[i]; // 辅助数组同步操做 count3[i] = count3[k]; count3[k] = t; } } for (k = 0; k < 10; k++) { cout << '<' << b[count3[k]] << ">: " << count[count3[k]] << endl; tongji << '<' << b[count3[k]] << ">: " << count[count3[k]] << '\n'; } }
(1)首先此次结对编程让我充分体会到团体的力量,若是是我单打独斗必定不会这么快就完成这个任务,当我初次看到这个任务时,我是十分头疼的,可是伙伴的出现不只分担了编程技术,还让我内心十分踏实至少不是单打独斗了。 (2)经过此次和伙伴的合做,我学到了一点就是,我在对变量起名时应该更加注意,不该该只用a,b,等等,而且应该添加必定的注释,此次的注释大可能是我伙伴办完加注的。 (3)关于函数的独立性,应该避免一个函数实现多个功能,函数的杂糅会加剧后期测试的麻烦程度,