此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631
代码地址:https://e.coding.net/yangtianyu/szysuan.git
结对伙伴:魏新
要求一:(1)功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答
重点难点:需要随机产生一组表达式,包括字符
随机产生
void Cequation(vector<char>&infix) { infix.clear(); char r_num[5]; int temp; int e_form; push_num=0; e_form=rand()%11;
char RdOp() { int rd_op=rand()%4; if(rd_op==0) { return '+'; } if(rd_op==1) { return '-'; } if(rd_op==2) { return '*'; } if(rd_op==3) { return '/'; } }
运算优先级
int Priority(char c,string str) { int priority_level=str.find(c); if(priority_level==2||priority_level==3) { return 2; } else if(priority_level==4||priority_level==5) { return 4; } else { return priority_level; }
计算正确题目数量
if(fabs(input_ans-ans)<=precision) { right_num++; printf("答对啦,你真是个天才! "); } else { printf("再想想吧,答案似乎是%.1f喔! ",ans); } } printf("你一共答对%d道题,共20道题。",right_num);
功能一程序运行成功截图
收获,心得:功能一加减乘除功能实现不算困难,只要小心算数运算符的优先级问题。通过和伙伴的合作,让我知道两个人合作应该在那些方面值得注意,大学阶段我们已经习惯了一个人完成作业,所以肯定会有不适应和生疏感,对合作没有经验。相信慢慢会变好。基本语法虽然枯燥,但是就好比高楼大厦的一砖一瓦,一定要下硬功夫熟练掌握。
功能2:支持括号
重点难点:括号的匹配及运算的优先级
for(int i=0;i<13;i++) { //printf("%d",form[e_form][i]); temp=form[e_form][i]; if(temp<0)//左括号 { while(temp<0) { infix.push_back('('); temp++; push_num++; } } else if(temp>0) { if(temp==3)//数字 { itoa(rand()%9+1,r_num,10); infix.push_back(r_num[0]); push_num++; } else if(temp==4)//运算符 { infix.push_back(RdOp()); push_num++; } else//右括号 { while(temp>0) { infix.push_back(')'); push_num++; temp--; } }
功能二成功运行程序截图
收获,心得:如果你对数据结构不是很了解,不能合理的运用,那么功能二就是比较明显的利用数据结构解决问题,这个功能类似于数据结构中前(中,后)缀表达式出栈问题。要想设计出好的程序,数据结构必须要熟练掌握,所以以后要更加强对各种数据结构的了解,争取用语言去实现各种数据结构和算法。
功能3: 限定题目数量,"精美"打印输出,避免重复
重点,难点:限定题目数量,区分命令行参数是否为正整数字符串或者小数均是错的,然后打印输出,避免重复。
string IntoSuf(vector<char>&infix,int &push_num) { string temp=""; stack<char>s; s.push('#'); for(int i=0;i<push_num;i++) { switch(infix[i]) { case '(': s.push('('); break; case ')': while(!s.empty()&&s.top()!='(') { temp=temp+s.top(); s.pop(); } s.pop(); break; default: if(isdigit(infix[i])) { temp=temp+infix[i]; } else { if((s.top()=='(')||(s.top()!='('&&Priority(infix[i],s_priority)>Priority(s.top(),s_priority))) { s.push(infix[i]); } else { while(Priority(infix[i],s_priority)<=Priority(s.top(),s_priority)) { temp=temp+s.top(); s.pop(); } s.push(infix[i]); } } break; } } while(!s.empty()) { temp=temp+s.top(); s.pop(); } //cout<<temp<<endl; return temp; } double SufCount(string &suffix) { stack<char>s; double x,y,z; for(int i=0;suffix[i]!='#';i++) { if(suffix[i]>='0'&&suffix[i]<='9') { s.push(suffix[i]-'0'); } else { x=s.top(); s.pop(); y=s.top(); s.pop(); z=Calculate(y,x,suffix[i]); s.push(z); } } return z;
程运行截图
收获,心得: 再一次对命令行进行操作,之前很少做这方面的题,所以当被问到命令行时候,一点都不了解具体的使用方法以及它的表达形式。在编程语言中有一些不常用容易忽略掉的知识点,需要让我引起重视,用的少不应该是忘记的理由。
(2)花费时间较长,收获最大的事件:
既然是两个人的事情,说明两个人结对编程不能太过于依赖对方,要更加仔细认真的去做,可能我们习惯了一个人对两个人感觉有点别扭,慢慢适应这也是今后工作要走的路;
开始在语言的选择方向出现了较大的分歧,我最终决定还是使用C++去实现此次程序;
结对编程中双方要做到同步,不断地提高默契,这样可以省下在因为不默契上犯错的时间;
在编程时,我和魏新同学发现在实现运算式时,是一个难点,上网查资料,最后将程序实现了,在这点最大的收获是,结对编程能起到督促作用;
在分析程序时,互相理解错了对方的意思,导致大量的时间被浪费,敲了很多无用的代码,通过这次结对编程,掌握了基本的技巧,还有要提高自己的表达能力
要求二:给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。
工作地点:光华公寓A411房间
计算机:笔记本一台
照片:
要求三: