软件工程第四次作业
github地址:项目地址
伙伴地址
一、结对过程
结对编码过程:我与结对编码的同伴,首先是各自分别阅读项目条件,之后开始讨论各自对于这次作业的理解。随后我们把自己要做的工作细致的分工,最重要的一点是缺点二人代码的连接方式,以便尽可能少的对代码进行不必要的修改,最后把写好的代码互相交换来审阅达到找出错误的目的。最后紧行代码的汇总调试,得到想要的结果。
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
190 |
275 |
Development |
开发 |
30 |
90 |
· Analysis |
· 需求分析 (包括学习新技术) |
12 |
15 |
· Design Spec |
· 生成设计文档 |
18 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
5 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
· 具体设计 |
5 |
15 |
· Coding |
· 具体编码 |
30 |
35 |
· Code Review |
· 代码复审 |
10 |
10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
20 |
Reporting |
报告 |
10 |
10 |
· Test Report |
· 测试报告 |
10 |
10 |
· Size Measurement |
· 计算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
|
合计 |
190 |
275 |
(1)、解题思路
将作业分成两个部分,即文件的传入以及字符的识别与计数。由我来负责计数的相关函数实现。对于字符的计数,为了节约内存打算使用动态的内存申请,通过遍历链表来判断是否是新字符以及增加次数,同时用结构体来进一步的简化代码。首先是关于c++的空间申请,因为从未学习所以在博客园上寻找相关的知识内容。为了衔接二这的函数打算用数组来传入字符。
(2)、设计实现过程
为了使得字符与字符数量紧密结合与代码简化,我决定使用结构体来经行工作,同时建立一个类来捆绑相关函数的使用同时确保数据的安全性,其私有成员是字符总数与一个指向结构体的指针(其作用为头指针)。函数分为指针初始化函数,字符计数函数,与链表打印函数。字符计数函数形参为字符数组,完成与文件操作的交接。
(3)、代码规范
对于命名除了无关变量之外其余全部使用英文命名,如果存在多个英文则使用' _ '字符隔开,其余空格与缩进完全遵循vs2019自动隔开。
代码互审:在完成一个模块后互相审核与测试,其中代码错误有链表头指针为空,文件地址不正确,数组的数据溢出
(4)、性能分析
消耗最大函数为:
int fun(char b[]) { int a; set(); for (a = 0; b[a] != '\0'; a++) { char_counter(b[a]); } return 0; }
嵌入了其他两个函数。
代码改进:最开始是打算把识别与计算分开后来发现这么一来会遍历两次链表,造成效率降低,后来使用if语句来实现是否为新字符,以此来进行操作。
(5)、代码说明
class way_to_char { public: int set() { use = new struct zifu; use->next = NULL; if (use == NULL) { cout << "分配内存失败" << endl; } cout << use << endl; return 0; } int char_counter(char b) { if (use == NULL) { return 0; } struct zifu* p; for (p = use->next; p != NULL; p = p->next) { if (p->word == b) { p->number++; char_number++; return 0; } } p = new struct zifu; p->word = b; p->number = 1; p->next = use->next; use->next = p; char_number++; return 0; } int show() { if (use == NULL) return 0; struct zifu* p; char stead; cout << "总的字符数为" << char_number << endl; for (p = use->next; p != NULL; p = p->next) { if (p->word >= 65 && p->word <= 90) stead = p->word + 32; else stead = p->word; cout << "字符为" << stead << "出现次数为" << p->number << endl; } return 0; } int fun(char b[]) { int a; set(); for (a = 0; b[a] != '\0'; a++) { char_counter(b[a]); } return 0; } private: struct zifu* use; int char_number = 0; };
对字符及其操作封装为一个类来,包含链表创建,字符计数与识别和打印。保护数据与实现代码简洁。
(6)、心路与收获
二人合作刚开始是有些不能接受,感觉会大幅的降低劳动效率,并且不愿意听取他人的意见。但是慢慢的发现二人合作,相互的代码审核,能够极大的提高自己的代码质量,同时工作量的减小能够使得自己能够更加专注于自己的工作部分。双人合作更容易暴露出自己的代码问题,能够帮助自己提高编码水平。现在看来结对编程能够提高代码质量与效率。