• 作业要求 20180925-6 四则运算试题生成


    作业要求:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148

    作业地址:https://git.coding.net/KamiForever/FourOperations.git

    具体代码为其中的f4.cpp文件

    此次作业完成是以“结对编程”的形式完成,我的伙伴是潘世维。

    要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,博客是分别完成的)。 (1) 给出每个功能的重点、难点、编程收获。

     功能1. 四则运算。重点难点:先乘除后加减的实现

    void getans() {
        for(int i = 1; i < 4; i++) {
            if(op[i] == '*') {
                fra[i] = mul(fra[i - 1], fra[i]);
                fra[i - 1].d = 1;
                fra[i - 1].m = 0;
                op[i] = op[i - 1];
            }
            if(op[i] == '/') {
                fra[i] = div(fra[i - 1], fra[i]);
                fra[i - 1].d = 1;
                fra[i - 1].m = 0;
                op[i] = op[i - 1];
            }
        }
        for(int i = 1; i < 4; i++) {
            if(op[i] == '+') fra[i] = add(fra[i - 1], fra[i]);
            else fra[i] = sub(fra[i - 1], fra[i]);
        }
        getgcd(&fra[3].m, &fra[3].d);
        return;
    }
    View Code

    功能2. 支持括号 重点难点:碰到括号,递归运算括号里面的

    Fraction getans(int s, int e, int k) {
        Fraction res, temp;
        memsetfra(&res);
        if(k > maxk) maxk = k;
        for(int i = s; i <= e; i++) {
            if(op[i + 1] == '*' || op[i + 1] == '/') {
                temp = fra[i];
                int t = i;
                for(int j = i + 1; j <= e; j++) {
                    if(fra[j].l != 0) {
                        fra[j].l--;
                        k = maxk;
                        temp = operation(temp, getans(j, bra[k].r, k + 1), op[j]);
                        j = bra[k].r;
                        fra[j].r--;
                    }
                    else temp = operation(temp, fra[j], op[j]);
                    if(op[j + 1] == '+' || op[j + 1] == '-' || j == e) {
                        i = j;
                        break;
                    }
                }
                if(t == s) res = temp;
                else res = operation(res, temp, op[t]);
            }
            else {
                if(fra[i].l != 0) {
                    fra[i].l--;
                    k = maxk;
                    temp = getans(i, bra[k].r, k + 1);
                    int t = i;
                    i = bra[k].r;
                    if(op[i + 1] == '*' || op[i + 1] == '/') {
                        for(int j = i + 1; j <= e; j++) {
                            if(fra[j].l != 0) {
                                fra[j].l--;
                                k = maxk;
                                temp = operation(temp, getans(j, bra[k].r, k + 1), op[j]);
                                j = bra[k].r;
                                fra[j].r--;
                            }
                            else temp = operation(temp, fra[j], op[j]);
                            if(op[j + 1] == '+' || op[j + 1] == '-' || j == e) {
                                i = j;
                                break;
                            }
                        }
                    }
                    if(t != s) res = operation(res, temp, op[t]);
                    else res = temp;
                }
                else {
                    if(i != s) res = operation(res, fra[i], op[i]);
                    else res = fra[i];
                }
            }
        }
        return res;
    }
    View Code

    功能3. 限定题目数量,"精美"打印输出,避免重复  重点难点:排除相同运算式

    struct Formula {  //用于记录运算式
        Fraction f[maxn];
        int op[maxn];
        Fraction ans;
    }For[1000], pre;
     
    bool checkFor(int t) {  //t为当前一共有t组计算式
        for(int i = 0; i < t; i++) {
            if(pre.ans == For[i].ans) {  //在结果相同的情况下
                int tcnt = 0;
                for(int j = 0; j < maxn; j++) {  //判定所用运算符是否一样
                    if(pre.op[j] == For[i].op[j]) tcnt++;
                }
                if(tcnt != maxn) continue;
                tcnt = 0;
                for(int j = 0; j < maxn; j++) {  //对每个数进行判定
                    for(int p = 0; p < maxn; p++) {
                        if(pre.f[j] == For[i].f[p]) {
                            tcnt++;
                            break;
                        }
                    }
                }
                if(tcnt == maxn) return false;
            }
        }
        for(int i = 0; i < maxn; i++) {
            For[t].op[i] = pre.op[i];
            For[t].f[i] = pre.f[i];
        }
        For[t].ans = pre.ans;
        return true;
    }
    View Code

    功能4. 支持分数出题和运算 重点难点:由于一开始就用分数形式(数组)存储数据,这里的难点是控制输入

    int input() {
        gets(myans);
        m = 0;
        d = 0;
        int t = 0;
        int flag = 0;
        for(int i = 0; i < strlen(myans); i++) {
            if(myans[i] >= 48 && myans[i] <= 57) {
                if(flag == 3) {
                    t = m;
                    m = 0;
                    flag = 0;
                }
                if(flag == 0) {
                    m *= 10;
                    m += myans[i] - 48;
                }
                else if(flag != 3) {
                    d *= 10;
                    d += myans[i] - 48;
                    if(flag == 2) t++;
                }
            }
            else if(myans[i] == '/') flag = 1;
            else if(myans[i] == '.') flag = 2;
            else if(myans[i] == '-') continue;
            else flag = 3;
        }
        if(flag == 0) d = 1;
        if(flag == 1) m = t * d + m;
        if(flag == 2) {
            md = (double)d;
            while(t--) md /= 10;
            md += m;
        }
        if(myans[0] == '-') {
            m = -m;
            md = -md;
        }
        if(flag != 2) getgcd(&m, &d);
        if(d < 0) {
            d = -d;
            m = -m;
        }
        return flag;
    }
    View Code

    编程收获:逐步的发现问题、解决问题。两个人解决问题更快。

    (2)给出结对编程的体会,以及

     体会:我的水平太差了,在各个方面都需要向我的队友学习,但我还是努力跟上队友的思路,并给出自己的看法。

    (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。

    1、虽然我应该负责审查代码,但是由于水平太差并没有很好的发挥作用。我试图提出自己的看法,但很多证明是错误的。

    2、在整个编码过程中,好的代码习惯令人赏心悦目。

    3、对于括号的处理,我们本来希望用栈的,他想了想说用递归就行。后来我们经过讨论使用了递归的方式。

    4、在复审过程中,我发挥了作用,尝试了各种输入。

    5、我们的结对编程整体来看十分融洽,我喜欢这样的方式,但我迫切的需要提高自己。

    要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。 (5分)

    要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)

  • 相关阅读:
    求大神回答这个管理系统不知道为啥不成功急!
    这个函数到底什么意思如何调用
    判断浮点数是否为零的问题
    字符串与列表的 常用方法
    变量名命名规范 运算符 流程控制
    ACM C++
    struts s:iterator循环遍历数据 自动生成序号
    JAVA将一个EXCEL多行订单产品字符串分解成一个个子订单 +连接符连接
    JS在HTML中获取到所有选中的checkbox的值
    自己做的java-WEB项目。希望360浏览器能够默认使用极速模式打开
  • 原文地址:https://www.cnblogs.com/zhouha0/p/9756304.html
Copyright © 2020-2023  润新知