zoukankan      html  css  js  c++  java
  • 结对项目

    结对作业

     

                  结对作业

                         软件4班温海源 软件4班杨梓琦

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


     八、项目小结

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

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

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

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

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

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

  • 相关阅读:
    S4全球总决赛(2)南邮NOJ2059
    S4全球总决赛(2)南邮NOJ2059
    S4全球总决赛(1) 南邮NOJ
    S4全球总决赛(1) 南邮NOJ
    S4全球总决赛(1) 南邮NOJ
    【Linux】鸟哥的Linux私房菜基础学习篇整理(五)
    【Linux】鸟哥的Linux私房菜基础学习篇整理(四)
    【HDOJ】2428 Stars
    【Linux】鸟哥的Linux私房菜基础学习篇整理(三)
    【Linux】鸟哥的Linux私房菜基础学习篇整理(二)
  • 原文地址:https://www.cnblogs.com/xiaoyangdeboke/p/12616697.html
Copyright © 2011-2022 走看看