第四次个人作业
2019-10-14 21:53 JOJO的奇妙代码 阅读(208) 评论(1) 编辑 收藏 举报第四次作业:结对编程
GIT地址 | git地址 |
---|---|
结对伙伴 | 曲晨阳201831061313 |
伙伴博客 | 伙伴博客地址 |
one、题目的分析
1、要求分析 |
2、模块分析
一、文件初步处理
第一步我们应该要把文件里面的文本给读取出来,我们想出来的办法就是把整个文本读取储存到一个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.
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就为有效单词数
四、统计单词出现的频数,并且输出前10个高频单词
对上面处理好的有效单词数组进行遍历,如果在计数单词数组中已经出现了,则相应的计数数组+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';
}
}
五、运行结果
two、测试及改善
一、以下是对代码的性能分析
二、以下是单元测试
three结对感想
(1)首先这次结对编程让我充分体会到团体的力量,如果是我单打独斗一定不会这么快就完成这个任务,当我初次看到这个任务时,我是十分头疼的,但是伙伴的出现不仅分担了编程技术,还让我心里十分踏实至少不是单打独斗了。
(2)通过这次和伙伴的合作,我学到了一点就是,我在对变量起名时应该更加注意,不应该只用a,b,等等,并且应该添加一定的注释,这次的注释大多是我伙伴办完加注的。
(3)关于函数的独立性,应该避免一个函数实现多个功能,函数的杂糅会加重后期测试的麻烦程度,