结对作业

              结对作业

                     3118005109温海源 3118005115杨梓琦

一、Github项目地址

https://github.com/gduthai/Text


二、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


三、效能分析

       最开始是用int还有float表示一个运算数,但是后来发现这样的方案很难实现分数操作,就用结构体Number{zi,mu}表示一个数,并将分子分母分开算,这样要实现分数操作就很简单了。

  在优化算法上面大概花了1200分钟。

  一开始想通过创建数组对已经计算过的函数进行标记从而避免重复计算,但是由于这样消化过大,转为了把两个数的计算结果赋值给第一个数,并将之后的数字和符号都向前移动一位。

  消耗最大的是主函数中的这一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 ", 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) {     //如果是加法或者减法而且还未运算的乘法或除法的个数为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;  //z为分子  运算后的结果保存到left.zi
        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);
    }
}
复制代码

六、测试运行

生成题目和题目文件

 由于在实现(三)中的代码时,运算最后一步时符号和数迁移的操作总是无法完成,历经三天的修改也找不出问题所在,所以这些题的答案没有运算出来。


七、PSP

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 


 八、项目小结

       杨梓琦闪光点:低调,其实想法很多对解决问题很有效,刚开始两人都不知道做什么,他一个人想到了大致的思路。

       温海源闪光点:有耐心善于学习,默默改bug改了很久,最终陷入停滞项目有了进展。

  1.通过这次与同学的合作,我了解到了沟通的重要性。在多人合作中,我们要明确工作开展形式,分配具体的分工,及时和队友沟通。

       2.要早些确立方向,及时开始项目,不然就会犹豫掉一半 的时间,导致时间不够。

       3.在团队合作中,每个人都可能有独到而又完美的想法,比如说用Number结构体表示一个数还有运算法则的那个循环是我们两个人分别想出来的

  4.学习了一些新的知识,如如何用c语言输出到txt文件等。

  5.由于对知识的掌握不到位,并没有全完成这次的作业,深表愧疚。

        6.要有足够的耐心,该bug的过程烦闷而又枯燥,但是不放弃慢慢探索,问题终究会得到解决

原文地址:https://www.cnblogs.com/whycft/p/12614933.html