结对编程:四则运算。组员:闫浩楠 杨钰宁 开发语言:C语言
需求分析:1.能够自动出题并给出答案
2.包含“+,—,*,/,()” 的四则运算。
3.显示题目的答案
结构设计:1.自动出题用随机数生成语句实现:包括随机生成数字、运算符号和题目长度
2.用变量约束左右括号顺序和同时存在的特点。
3.将题目输出并用字符串存储。
4.对字符串入栈进行运算。
部分核心代码:
随机生成题目长度:
a=rand()%3+3;
for(i=0;i<a;i++)
{
……
}
随机生成数字及符号:
c=rand()%19+1; //数字 printf("%d",c);
b=rand()%4; //符号
switch(b)
{
case 0: printf("+"); math[m]='+';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 1: printf("-"); math[m]='-';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 2: printf("*"); math[m]='*';m++;
if(i<a-3&&j==10) b=10;
else b=rand()%4; break;
case 3: printf("/"); math[m]='/';m++;
b=20; break;
}
if(b==10)
{
printf("(");
math[m]='(';m++;
j=3;
b=rand()%4;
}
if(j!=10)
j--;
if(j==0){
printf(")");
math[m]=')';
m++;
b=rand()%3;
j=10;
}
利用栈对表达式进行计算:
采用符号优先值对五种运算符号进行控制。
while(c!='='||x!='=') //循环处理表达式中的每一个字符 { if(isOperator(c)) //如果是运算符 { if(flag){ seqStackPush(StackData,q); //表达式入栈 q=0; //操作数清零 flag=0; //标志清零,表示操作数已经入栈 } switch(PRI(x,c)) //判断运算符优先级 { case -1: seqStackPush(StackOper,c); //运算符进栈 c=exp[i++]; break; case 0: c=seqStackPop(StackOper); //运算符括号,等号出栈,被抛弃 c=exp[i++]; //取下一个 字符 break; case 1: oper=seqStackPop(StackOper); //运算符出栈 b=seqStackPop(StackData); a=seqStackPop(StackData); //两个操作数出栈 t=Calc(a,oper,b); //计算结果 seqStackPush(StackData,t); //将运算结果入栈 break; } }else if(c>='0'&&c<='9') //如果输出的字符在0到9之间 { c-='0'; //把字符转换成数字 q=q*10+c; //多位数的进位处理 c=exp[i++]; //取出下一位字符 flag=1; //设置标志,表示操作数未入栈 } else { printf("输入错误\n"); getch(); exit(0); } x=seqStackPeek(StackOper); //获取栈顶操作符 } q=seqStackPop(StackData); seqStackfree(StackOper); seqStackfree(StackData); //释放内存占用空间 return q; //出栈,返回结果 }
优先值的判定:
int PRI(char oper1,char oper2) { int pri; switch(oper2) //判断优先级 { case '+': case '-': if(oper1=='('||oper1=='=') //为左括号 pri=-1; //oper1<oper2 else pri=1; //oper1>oper2 break; case '*': case '/': if(oper1=='*'||oper1=='/'||oper1==')') pri=1; //oper1>oper2 else pri=-1; //oper1<oper2 break; case '(': if(oper1==')') //右括号右侧不能马上出现左括号 { printf("语法错误\n"); exit(0); } else pri=-1; //oper1<oper2 break; case ')': if(oper1=='(') pri=0; else if(oper1=='=') { printf("括号不匹配\n"); exit(0); }else pri=1; break; case '=': if(oper1=='(') { printf("括号不匹配\n"); exit(0); }else if(oper1=='=') pri=0; //等号匹配,返回0 else pri=1; //oper1>oper2 break; } return pri; }
主函数控制题目数量:
char ans[]="\0"; int b,i; srand(time(0)); while(1) { printf("当前功能:生成题库\n"); printf("请输入所需题目数量:"); scanf("%d",&b); for(i=0;i<b;i++){ exp(); printf("%d\n",CalcExp(math)); } }
运行结果: