此作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245
功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
重点/难点:
首先需要考虑算式的规则与随机性。在题目要求算式需要包含四个操作数和三个运算符,所以会加减与乘除会同时出现,需要考虑运算符的优先级。同时还考虑到用户是小学生,所以要避免被除数不能够被除尽的情况。
重要代码示例:
//中缀表达式转后缀表达式 void in_to_post(char* inorder,char* &post) { stack <char> S; int k=0; while(*inorder) { //操作数 if(*inorder>='0'&&*inorder<='9') { post[k++]=*inorder; } //运算符 else { if(S.empty()) { S.push(*inorder); } else if(*inorder=='(') { S.push(*inorder); } else if(*inorder==')') { while(S.top()!='(') { post[k++]=S.top(); S.pop(); } S.pop(); } else { while(prio(*inorder)<=prio(S.top())) { post[k++]=S.top(); S.pop(); if(S.empty()){ break; } } S.push(*inorder); } } inorder++; } if(!S.empty()) { char c=S.top(); post[k++]=c; S.pop(); } } //后缀表达式求值 double postcal(char* post) { stack <double> s; double temp; while(*post) { if(*post>='0'&&*post<='9') { temp=*post -'0'; s.push(temp); } else { double a=s.top(); s.pop(); double b=s.top(); s.pop(); double c=cal(b,a,*post); s.push(c); } post++; } return s.top(); }
运行效果图:
编程收获:
在实现功能一的过程中,使用了本科数据结构中所学习的栈的知识点。在编写四则运算法则时,我们将其封装成函数,方便调用。
功能2. 支持括号。
重难点:
功能2的重难点在于要保证括号的随机性和正确性。由于是四则运算,所以括号出现次数不会大于2次。
重要代码示例:
//在字符前后添加空格 for(int i=pos-1; i>=0; i--) { dataStr[i*2+1]=dataStr[i]; dataStr[i*2+2]=' '; } dataStr[0]=' '; //随机生成括号个数 temp = random(2); //添加第一对括号 if(dataStr[temp*4+3]=='-') { temp=0; } dataStr[4*temp]='('; dataStr[4*temp+6]=')'; char c=' '; dataStr = remove_char(dataStr,strlen(dataStr),c); int temp1 = random(3); //判断是否添加第二对括号 if(temp1==2&&temp<2) { dataStr[10]=dataStr[8]; dataStr[9]=dataStr[7]; dataStr[8]=')'; for(int i=6; i>=0; i--) { dataStr[i+1]=dataStr[i]; } dataStr[0]='('; dataStr[pos+4]='