结对项目——四则运算
一、Github项目地址
二、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
|
· Estimate |
· 估计这个任务需要多少时间 |
60 |
|
Development |
开发 |
3600 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
300 |
|
· Design Spec |
· 生成设计文档 |
100 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
100 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
100 |
|
· Design |
· 具体设计 |
1200 |
|
· Coding |
· 具体编码 |
1200 |
|
· Code Review |
· 代码复审 |
300 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
300 |
|
Reporting |
报告 |
300 |
|
· Test Report |
· 测试报告 |
100 |
|
· Size Measurement |
· 计算工作量 |
100 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
100 |
|
合计 |
|
4500 |
|
三、效能分析
在优化算法上面大概花了1200分钟。
一开始想通过创建数组对已经计算过的函数进行标记从而避免重复计算,但是由于这样消化过大,转为了把两个数的计算结果赋值给第一个数,并将之后的数字和符号都向前移动一位。
消耗最大的是主函数中的这一段:
for (realquestionnum = 0; realquestionnum < num; realquestionnum++) { //运算函数 signalnum23 = 0; for (n = 0; n < length; n++) if (sign[realquestionnum][n] == 2 || sign[realquestionnum][n] == 3) signalnum23++; //计算除号乘号的个数 for (n = 0; n < length; n++) { m = sign[realquestionnum][n]; printf("%d", m); if (m == 2 || m == 3) { //若是乘法或者除法 直接计算 calculate(sign[m], &count[realquestionnum][n], &count[realquestionnum][n + 1]); result[realquestionnum].zi = count[realquestionnum][n].zi; result[realquestionnum].mu = count[realquestionnum][n].mu; printf("%d %d\n", result[realquestionnum].zi, result[realquestionnum].mu); signalnum23--; //已经运算则 for (p = n; p + 2 <= length; p++) //把符号和数字向前推一格 { count[realquestionnum][p + 1] = count[realquestionnum][p + 2]; sign[realquestionnum][p] = sign[realquestionnum][p + 1]; } length--; n = 0; } else if (signalnum23 == 0) { //是加法而且 calculate(sign[m], &count[realquestionnum][n], &count[realquestionnum][n + 1]); result[realquestionnum] = count[realquestionnum][n]; for (p = n; p + 2 <= length; p++) { //把符号和数字向前推一格 count[realquestionnum][p + 1] = count[realquestionnum][p + 2]; sign[realquestionnum][p] = sign[realquestionnum][p + 1]; length--; } } else continue; } }
四、设计实现过程
用结构体表示分数
typedef struct number { int zi; //保存 int mu; //保存分母 }Number;
共有五个函数,其中
主函数用于调用各个函数,进行输入,存储,输出
gcd函数用于求最大公约数
lcm函数用于求最小公倍数
symbolize函数用于分数化简
calculate函数用于计算函数并化简存入左边数
五、代码说明
int gcd(int a, int b){ //求最大公约数 return b == 0 ? a : gcd(b, a % b); }
int lcm(int a, int b) { //求最小公倍数:相乘除以最大公约数 return a * b / gcd(a, b); }
void symbolize(Number *num) { //分数化简 int n = gcd(num->zi, num->mu); num->zi /= n; //上下除以最大公约数即可化简 num->mu /= n; }
void calculate(char signal, Number *left, Number *right) { // 计算函数并化简,结果保存在左边的数中 int n,m,z; n = lcm(left->mu, right->mu); m = gcd(left->mu, right->mu); if (signal == '+') { z = left->zi * right->mu / m + right->zi * left->mu / m; //求分子 left->mu = n; left->zi = z; symbolize(left); } if (signal == '-') { z = left->zi * right->mu / m - right->zi * left->mu / m; //求分子 left->mu = n; left->zi = z; symbolize(left); } if (signal == '*') { left->mu = left->mu * right->mu; left->zi = left->zi * right->zi; symbolize(left); } if (signal == '/') { left->mu = left->mu * right->zi; left->zi = left->zi * right->mu; symbolize(left); } }
六、测试运行
七、
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
60 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
60 |
Development |
开发 |
3600 |
3600 |
· Analysis |
· 需求分析 (包括学习新技术) |
300 |
300 |
· Design Spec |
· 生成设计文档 |
100 |
100 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
100 |
100 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
100 |
100 |
· Design |
· 具体设计 |
1200 |
1200 |
· Coding |
· 具体编码 |
1200 |
1200 |
· Code Review |
· 代码复审 |
300 |
300 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
300 |
300 |
Reporting |
报告 |
300 |
300 |
· Test Report |
· 测试报告 |
100 |
100 |
· Size Measurement |
· 计算工作量 |
100 |
100 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
100 |
100 |
合计 |
|
4500 |
4500 |
八、项目小结
通过这次与同学的合作,我了解到了沟通的重要性。在多人合作中,我们要明确工作开展形式,分配具体的分工,及时和队友沟通。
学习了一些新的知识,如如何用c语言输出到txt文件等。
由于对知识的掌握不到位,并没有全完成这次的作业,深表愧疚。