结对编程

Posted ycldbk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对编程相关的知识,希望对你有一定的参考价值。

结对编程实验报告

GIT仓库地址 https://github.com/ycl-web/WordCount
结对伙伴 徐鹏201831061408
延昌磊博客 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 == ‘ ‘)
{
if (flag > 0)count++;
flag = 0;
}
else if (ch != ‘ ‘&&ch != ‘ ‘)
{
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!请输入正确文件名!"}

四、异常处理

当输入文件名不存在时,程序会提示输入正确文件名:

技术图片

五、性能分析

技术图片

技术图片

技术图片

技术图片

六、结对编程照片留念

技术图片

以上是关于结对编程的主要内容,如果未能解决你的问题,请参考以下文章

结对编程的总结

软工结对编程代码审查

结对编程

《代码大全》阅读笔记-21-协同构建

结对编程作业

软件工程结对编程