软工第四次作业
GIT地址 | https://github.com/xzx63321/WordCount |
---|---|
结对伙伴 | 肖子轩 |
伙伴学号 | 201831061329 |
伙伴博客地址 | https://www.cnblogs.com/xzx23361/ |
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 2595 | 1800 |
Development | 开发 | 1300 | 1400 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 80 |
· Design Spec | · 生成设计文档 | 60 | 90 |
· Design Review | · 设计复审 (和同事审核设计文档) | 40 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 100 | 130 |
· Coding | · 具体编码 | 630 | 750 |
· Code Review | · 代码复审 | 40 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 140 |
Reporting | 报告 | 90 | 90 |
· Test Report | · 测试报告 | 40 | 60 |
· Size Measurement | · 计算工作量 | 40 | 40 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 2595 | 2970 |
二、程序实现
1、解题思路
项目要求:
1.统计有效行数
2.字符个数num(英文字母,换行符,空格,水平制表符均为字符,)
3.统计单词个数(要求单词以四个英文字母开头),并把单词按字典序输出到文件中,输出频率最高的10个单词
思路:首先在主程序中写入打开文件的程序,建立一个文件指针指向打开的文件,然后将指针传入编写字符统计函数,单词统计函数,行数统计函数,单词输出函数,文件写入函数来完成项目要求
2、实现过程
主函数中编写键盘输入文件名的读入的文件,并调用各编写的函数:
int main()
{
ifstream in;
string filename; //声明变量 存储文件名
cout << "Please input filename to Open:" << endl; //提示输入文件名
getline(cin, filename, '\n'); //接收输入文件名
in.open(filename);
if (!in)
{
cout << "error" << endl;
exit(0);
}
wordnumber(in);
linesnumber(in);
wordsnumber(in);
in.close();
return 0;
}
单词统计函数:
void wordsnumber(ifstream &ch)
{
ch.clear();
ch.seekg(0, ios::beg);
char word[30] = {0},st;
int i = 0,num=0,j=0,flag=0;
while (!ch.eof()) /*统计文件中有多少个单词*/
{
ch.read(&st, 1);
word[i] = st;
i++;
if(st==' '||st=='\t'||st=='\n')
{
if (word[i - 1] != ' ' || word[i - 1] != '\t' || word[i - 1] != '\n')
{
if (i >= 3)
{
for (j = 0; j < 4; j++)
{
if (word[j] > 'a'&&word[j]<'z' || word[j]>'A'&&word[j] < 'Z')
flag++;
if (flag >= 4)
{
num++;
for (j = 0; j < i; j++)
word[j] = 0;
i = 0;
}
}
for (j = 0; j < i; j++)
word[j] = 0;
i = 0;
}
}
}
}
行数统计函数:
void linesnumber(ifstream &ch)//行数统计
{
ch.clear();
ch.seekg(0, ios::beg);
char d ;
int num=1;
while (!ch.eof())
{
ch.read(&d, 1);
if (d == '\n')
num++;
}
cout << "有效行数为:" << num << endl;
}
字符统计函数:
void wordnumber(ifstream &ch) //字符统计
{
string d;
int num = 0;
while (getline(ch, d)) //以行为单位读入文件
if(d > "a"&&d<"z" || d>"A"&&d < "Z" || d>"0"&& d <"9"||d==" ")
num += d.size(); //累计字符数
cout << "字符数: "<< num << endl;
}
3、运行截图
三.代码复审
1.这一次编程中负责的程序中的文件部分,我的队友负责函数部分,在两人代码合成的过程中出现了很多错误(例如两人讨论不够充分导致函数类型不同而引起的合并问题)。
2.由于两人代码量不高,所以此项目中的很多部分两人合作都不能完成,这是代码出现很大漏洞。
四.总结分析
1.结对
1.面对这个项目,我选择了室友作为队友,我负责文件部分,他负责函数部分,这让我第一次体会到结对编程的魅力。
2.在过程中两个人的函数都出现了一些问题,但通过两人的商讨,很多问题都被解决。
2.总结
1.本次结对编程发现自己在编写代码的过程中还是很吃力,尤其是在结对任务中,怕自己跟不上队友的节奏。
2.总结上自己还是从本次作业中学习到了很多,除了对软件的熟练度,对还没有学习的c++文件操作也有了一定的了解。