一、Fork仓库地址
github地址 | git地址 |
结对伙伴 | 李虹霖 |
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 90 | 90 |
Development | 开发 | 150 | 160 |
Analysis | 需求分析 (包括学习新技术) | 100 | 100 |
Design Spec | 生成设计文档 | 100 | 100 |
Design Review | 设计复审 (和同事审核设计文档) | 150 | 150 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 100 | 100 |
Design | 具体设计 | 100 | 110 |
Coding | 具体编码 | 450 | 460 |
Code Review | · 代码复审 | 100 | 100 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 150 | 150 |
Test Report | 测试报告 | 120 | 120 |
Size Measurement | 计算工作量 | 60 | 60 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 70 | 70 |
合计 | 1920 | 1950 |
三、 计算模块接口的设计与实现过程
流程图
功能的实现及代码分析
ifstream fp("D://PPC//test.txt", ios::in); int NUM = 0; while (!fp.eof()) { NUM++; fp.getline(character, 100); cout<<endl<<character<<' '<<strlen(character)<<endl; if (strlen(character) > 0) { num_row++; } //num_ascii++; for (int i = 0; i < strlen(character); i++) { if (isupper(character[i])) { character[i] = tolower(character[i]); } }//将文件中的大写字母转化为小写字母 /* for (int i = 0; i < strlen(character); i++) { if (character[i] >= 0 && character[i] <= 255) { if (character[i] == ' ') { length = length + 1; } else { length = 0; } if (length <= 1) { word[max] = character[i]; max++; } }* }*/ for (int j = 0; j < strlen(character); j++)//文件中中一行的字符 { if ((j==0||character[j]==' ') && character[j+1] >= 97 && character[j+1] <= 122) { if(j==0&&character[0] >= 97 && character[0] <= 122) { Num=1; for (j1 = j + 1; j1 < j + 4; j1++) { if (character[j1] >= 97 && character[j1] <= 122) Num++; } } else if(character[j]==' '&&character[j+1] >= 97 && character[j+1] <= 122) { Num=0; for (j1 = j + 1; j1 <= j + 4; j1++) { if (character[j1] >= 97 && character[j1] <= 122) Num++; } } if (Num == 4) { Sum++; if(j==0) { for(j2=j;j2<strlen(character);j2++) { if(character[j2]==' ') break; word[max]=character[j2]; max++; } j=j2; } else { for(j2=j+1;j2<strlen(character);j2++) { if(character[j2]==' ') break; word[max]=character[j2]; max++; } j=j2; } } word[max]=' '; max=max+1; //j = j1; } } for (int i = 0; i < strlen(character); i++) { if (character[i] >= 0 && character[i] <= 255) { num_ascii++; } } }
这是初期的代码,因为对于C++语法的不熟悉,所以在刚开始的时候没有想到使用vextor这个类来存储字符串,以至于前期遇到了阻碍,困扰了很多时间。最后还是李宏霖同学提出的建议,使用vextor这个类来存储文件的内容。
程序初期运行的结果:
改进之后的程序:
void WordText::GetFile(string path) { WordText text; int num_word[200]; int Max = 0; fp.open(path); int k, j, max = 0; int number = 0; char zm[2000]; int num_blank[200], Num, min = 0; int num = 0; int num_row = 0; //int num_word = 0; vector<char> ch; ch.push_back(' '); char character[1000]; int length = 0; int i; while (!fp.eof()) { fp.getline(character, 100); length=text.Ascii_Num(character) + length; if (strlen(character) > 0) num_row++; for (int i = 0; i < strlen(character); i++)//这段循环的作用是将从文件中读出的字符串中的大写字母转化为小写字母 { if (isupper(character[i])) { character[i] = tolower(character[i]); } } for (int i = 0; i < strlen(character); i++)//对vexter类进行写入操作 { ch.push_back(character[i]); } ch.push_back(' '); } cout << "lines:" << num_row << endl;//输出有效行数 cout << "charactere: "<< length << endl;//输出Ascii码字符数 for (i = 0; i < ch.size(); i++)//判断单词的个数 { if (i != (ch.size() - 1)) { if (ch.at(i) == ' '&&ch.at(i + 1) >= 97 && ch.at(i + 1) <= 122) { num = 0; for (j = i + 1; j <= i + 4; j++) { if (ch.at(j) >= 97 && ch.at(j) <= 122) num++; } if (num == 4) { //num_word++; for (j = i; j < ch.size(); j++) { if (j > i&&ch.at(j) == ' ') break; zm[max] = ch.at(j); max++; } } //i = j; } } } for (vector<char>::iterator iter = ch.begin(); iter != ch.end(); iter++) { if ((iter+1)!=ch.end()&&(*iter) == ' ' && (*(iter + 1) == ' ')) { iter = ch.erase(iter); iter--; } } for (int i = 0; i < max; i++) { if (i != 0 && zm[i] == ' ') { num_blank[min] = i; min++; } } int SUM = 0; for (i = 0; i < max; i++) { if (zm[i] == ' ') { SUM++; } } cout << "words:" << SUM << endl;//输出单词的总数 Word_Hz(zm,max);//调用计算单词频数的函数 }
这是一个总的函数,为外部提供了一个借口。这是一个总的函数,里面实现了对文件的读取, 对文件内容中Ascii码字符数的统计,单词数量的计算,有效行数的统计,最后通过筛选,调用了 单词出现的频数的函数Word_Hz,实现了基本的功能。
四、代码规范
我们编写的代码涉及到了C和C++语言,所以参考的该博客介绍的编程规范
五、 代码互审
在编程的同时进行审查,及时解决了出现的问题。
六、性能测试
性能测试:
单元测试:
七、总结:
由于此次的作业难度较为困难,所以在课下花了很多的时间来学习与这次作业相关的知识。
但是还是很遗憾,有些功能没有完善出来。
由于我关于C++方面的知识掌握得不是很牢靠,所以前期的编码对于我来说较有难度,不过在之
后的不断学习中,自己对于C++的语法也有了进一步的掌握,编码的速度也就随之增快了,
自己也很幸运,能和李虹霖组队一起完成此次的结对编程作业.