结对编程
结对编程实验报告
GIT仓库地址 | https://github.com/ycl-web/WordCount |
---|---|
结对伙伴 | 延昌磊201831061410 |
延昌磊博客 | https://www.cnblogs.com/ycldbk/ |
徐鹏博客 | https://www.cnblogs.com/liangtingyu/ |
一、psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 120 | 120 |
· Estimate | · 估计这个任务需要多少时间 | 2200 | 3060 |
Development | 开发 | 700 | 650 |
· Analysis | · 需求分析 (包括学习新技术) | 350 | 400 |
· Design Spec | · 生成设计文档 | 100 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 60 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 300 | 320 |
· Coding | · 具体编码 | 700 | 750 |
· Code Review | · 代码复审 | 200 | 150 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 250 |
Reporting | 报告 | 50 | 60 |
· Test Report | · 测试报告 | 50 | 60 |
· Size Measurement | · 计算工作量 | 60 | 60 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 3110 | 3060 |
二、函数思路
以上为函数思路导图
1.要求
1.统计文件的字符数只需要统计Ascii码,汉字不需考虑
- 空格,水平制表符,换行符,均算字符
- 英文字母:A-Z,a-z
- 字母数字符号:A-Z,a-z,0-9
- 分割符:空格,非字母数字符号
- 例:file123是一个单词,123file不是一个单词。file,File和FILE是同一个单词
- 输出的单词统一为小写格式
2.统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
3.统计文件的有效行数:任何包含非空白字符的行,都需要统计。
4.统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
- 按照字典序输出到文件txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
2.实现
首先说明,这个作业对于我们有一些难度,作为刚刚开始学习c++的学生,认为这次作业有些难度,所以任务没有完全完成,但一定是尽我们两人全力做出来的函数,请包涵!
我们在这个程序中实现了以上四个功能。
首先,我们将这四个功能用四个函数分别实现四个功能,然后再在main函数中调用这四个函数。以下为我们程序的主要函数。
实现读取字符数量功能:
int CharNum(char * filename)
{
int count = 0;
char ch;
FILE *file;
fopen_s(&file, filename, "rt");
for (; (ch = fgetc(file)) != EOF;)
{
if (ch >= 0 && ch <= 255)
count++;
}
fclose(file);
return count;
}
实现单词种类:
int WordNum(char * filename)
{
map<string, int> Word_Num_map;
char ch;
FILE *file;
fopen_s(&file, filename, "rt");
int flag = 0;
int count = 0;
for (; (ch = fgetc(file)) != EOF;)
{
if ((ch >= 97 && ch <= 122) || (ch >= 65 && ch <= 90))//英文字母
{
if (flag >= 0)flag++;
if (flag < 0)flag--;
}
else if (ch >= 48 && ch <= 57)//数字
{
if (flag >= 4)flag++;
else flag = -1;
}
else //非字母数字符号
{
if (flag >= 4) { count++; flag = 0; }
else { flag = 0; }
}
}
fclose(file);
return count;
}
实现行数:
int LineNum(char * filename)
{
FILE *file;
fopen_s(&file, filename, "rt");
int count = 0;
char ch;
int flag = 0;
for (; (ch = fgetc(file)) != EOF;)
{
if (ch == '\n')
{
if (flag > 0)count++;
flag = 0;
}
else if (ch != ' '&&ch != '\t')
{
flag++;
}
}if (flag > 0)count++;
fclose(file);
return count;
}
bool CmpByValue(const PAIR& lhs, const PAIR& rhs)
{
return (lhs.second != rhs.second) ? lhs.second > rhs.second : lhs.first < rhs.first;
}
实现各个单词出现次数:
int Word_Fre(char * filename)
{
map<string, int> Word_Num_map;
char ch;
string word;
int flag = 0;
FILE *file;
fopen_s(&file, filename, "r");
for (; (ch = fgetc(file)) != EOF;)
{
if ('A' <= ch && ch <= 'Z')
ch = ch + 32;
if (ch >= 'a' && ch <= 'z')//英文字母
{
if (flag >= 0) { flag++; word = word + ch; }
if (flag < 0) { flag = 0; word = ""; }
}
else if (ch >= 48 && ch <= 57)//数字
{
if (flag >= 4) { flag++; word = word + ch; }
else { flag = 0; word = ""; }
}
else //非字母数字符号
{
if (flag >= 4)
{
Word_Num_map[word]++;
word = "";
flag = 0;
}
else { flag = 0; word = ""; }
}
}
if (flag >= 4)
{
Word_Num_map[word]++;
}
vector <PAIR> Word_Num_vec(Word_Num_map.begin(), Word_Num_map.end());
sort(Word_Num_vec.begin(), Word_Num_vec.end(), CmpByValue);
if (Word_Num_vec.size() < 10)
for (int i = 0; i != Word_Num_vec.size(); ++i) {
const char *ss = Word_Num_vec[i].first.c_str();
cout << '<' << ss << '>' << ":" << ' ' << Word_Num_vec[i].second << endl;
}
else
for (int i = 0; i != 10; ++i) {
const char *ss = Word_Num_vec[i].first.c_str();
cout << '<' << ss << '>' << ":" << ' ' << Word_Num_vec[i].second << endl;
}
return 0;
}
主函数:
int main() {
cout << "输入文件名:";
char name[50];
cin >> name;
int a, b, c;
Word_Fre(name);
b=LineNum(name);
c=WordNum(name);
a=CharNum(name);
cout << "<charnumber> = " << a << endl;
cout << "<linenumber> = " << b << endl;
cout << "<wordnumber> = " << c << endl;
system("pause");
getchar();
return 0;
}
运行截图
三、代码复审
当我们互相交流代码时发现没有添加异常处理,所以在原有基础上,在所有函数中加入了
if(!file)
{cout<<"error!请输入正确文件名!"}
四、异常处理
当输入文件名不存在时,程序会提示输入正确文件名: