结对伙伴学号 | 201831061427 |
---|---|
结对伙伴姓名 | 赵强 |
伙伴博客地址 | https://www.cnblogs.com/Drac/ |
Github地址 | https://github.com/dracssr/WordCount |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
Estimate | 估计这个任务需要多少时间 | 40 | 30 |
Development | 开发 | 200 | 200 |
Analysis | 需求分析 (包括学习新技术) | 50 | 40 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 (和同事审核设计文档) | 25 | 25 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
Design | 具体设计 | 100 | 80 |
Coding | 具体编码 | 600 | 630 |
Code Review | 代码复审 | 25 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 30 | 20 |
Test Report | 测试报告 | 25 | 30 |
Size Measurement | 计算工作量 | 30 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计 | 40 | 50 |
合计 | 1220 | 1290 |
- 思路:因为基础还不够扎实,所以我们在独立设计代码过程中遇到了很多问题,花费了大量时间。最后我们决定先共同编译好代码,再慢慢修正。
讨论过程

PS:比较羞涩,就不拍脸啦。
设计实现过程
代码设计流程如下:

代码实现
#include<iostream> #include<string> #include<cstring> #include<stdlib.h> #include<ctype.h> #include<fstream> #define N 20 using namespace std; /*定义结构体*/ typedef struct wenjian{ char data[N]; int shu; struct wenjian *zuo; struct wenjian *you; }wenjian,*bwenjian; class Word{//定义一个词汇的类 public: Word(); int get_word(int start, int end, char* p, char* word); void create_wenjian(char* m, bwenjian& b); void Order(bwenjian b, FILE* q); int sum; int j; int i; char liang[N]; char liang1[N]; char word[N]; char fwen[20]; }; /*初始化*/ Word::Word() { sum = 0; j = 0; i = 0; } /*定义获取单词数的函数*/ int Word::get_word(int start, int end, char* p, char* word) { memset(word, 0, sizeof(char)); for ( i = start; i<end; i++)//使用循环读取文件 { if (isalpha(p[i])) { word[j] = p[i]; j++; } else if (j == 0) { continue; } else { word[j] = '\0'; j = 0; sum++; break; } } return i; } /*查找函数*/ void Word::create_wenjian(char* m, bwenjian& b) { strcpy(liang, m); liang[0] = tolower(m[0]); if (b == NULL) { b = (bwenjian)malloc(sizeof(wenjian));//创建堆栈 strcpy(b->data, m); b->shu = 1; b->zuo = NULL; b->you = NULL; } else { strcpy(liang1, b->data); liang1[0] = tolower(b->data[0]); if (strcmp(liang, liang1) == -1) { create_wenjian(m, b->zuo); } else if (strcmp(liang, liang1) == 1) { create_wenjian(m, b->you); } else { b->shu++; } } } /*写入文件*/ void Word::Order(bwenjian b, FILE* q) { if (b != NULL) { Order(b->zuo, q); fprintf(q, "world:%-10s 次数:%-9d\n", b->data, b->shu); printf("world:%-10s 次数:%-9d\n", b->data, b->shu); Order(b->you, q); } } int main() { Word w;//定义Word的类 while (true) { memset(w.fwen, 0, sizeof(w.fwen)); cout << "请输入你想打开的函数" << endl; cin >> w.fwen; FILE *q; q=fopen(w.fwen,"rb"); if (q==NULL) { cout << "打开文件失败!" << endl; return false; } cout << "已打开!" << w.fwen << endl; //开始进行文件统计 fseek(q, 0, SEEK_END); int len = ftell(q); rewind(q); char *p = new char[len + 1]; p[len] = 0; fread(p, 1, len, q); fclose(q); cout << p << endl; bwenjian b = NULL; while (w.i<len) { w.i = w.get_word(w.i, len, p, w.word); if (strlen(w.word) == 0) { break; } w.create_wenjian(w.word, b); } memset(w.fwen, 0, sizeof(w.fwen)); cout<<"\n"<<"请输入写你想存储的文件: "<<endl; cin >> w.fwen; q=fopen(w.fwen,"w"); if (q == NULL) { cout << "不能写入文件" << endl; return false; } fprintf(q, "词频统计结果: \n"); cout<<"词频统计结果:\n"<<endl; fprintf(q, "\n"); w.Order(b,q); fprintf(q, "\n"); fprintf(q, "world总数: %d\n", w.sum); printf("world总数:%d\n", w.sum); fclose(q); cout<<"\n" << "已写入文件:" << w.fwen << endl; } return 0; }
代码说明
(运行测试与结果)


总结
这次作业对我个人来说难度是挺大的,因为不会使用Github,在刚刚入手的时候花费了大量时间。还有就是代码实现过程,我们在代码分工编译时遇到了不少问题,尤其是最后代码合并的时候报错层出不穷,所以只有最后决定坐在一起写代码,还不停请教大佬。心得体会就是仍然需要扩大自己的代码量,开始工作之前一定要提前大致想好该怎么弄,有个基本的策划,这样可以节省不少工作时间。然后回去把怎么用GIT软件弄熟悉,尽量减少对他人的询问,提高独立编译的能力。