• 结对项目——四则运算


    一、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
    ", 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文件等。

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

     

  • 相关阅读:
    洛谷 P1410 子序列(DP)
    LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
    LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)
    浴谷八连测R6题解(收获颇丰.jpg)
    数论的一些小结论
    Fence9
    二模 (2) day1
    二模 (1) day2
    二模 (1) day1
    一些编码时的老错误
  • 原文地址:https://www.cnblogs.com/xiaoyangdeboke/p/12611593.html
Copyright © 2020-2023  润新知