作业要求 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分)

原文地址:https://www.cnblogs.com/zhouha0/p/9756304.html