作业要求: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; }
功能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; }
功能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; }
功能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; }
编程收获:逐步的发现问题、解决问题。两个人解决问题更快。
(2)给出结对编程的体会,以及
体会:我的水平太差了,在各个方面都需要向我的队友学习,但我还是努力跟上队友的思路,并给出自己的看法。
(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。
1、虽然我应该负责审查代码,但是由于水平太差并没有很好的发挥作用。我试图提出自己的看法,但很多证明是错误的。
2、在整个编码过程中,好的代码习惯令人赏心悦目。
3、对于括号的处理,我们本来希望用栈的,他想了想说用递归就行。后来我们经过讨论使用了递归的方式。
4、在复审过程中,我发挥了作用,尝试了各种输入。
5、我们的结对编程整体来看十分融洽,我喜欢这样的方式,但我迫切的需要提高自己。
要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。 (5分)
要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)