这一周,老师提出了新的要求:
1.学生写的程序必须能判定,用户输入的答案是否正确;
- 例如程序输出:20-5=?用户输入15,那么程序就会反馈正确,然后继续出题。直到三十道题目结束,程序最后告诉用户做对了几道题。
2.程序必须能够处理四种运算的混合算式;
- 20-5*2=? 正确答案是10.
- 20-5*2+9/3=? 正确答案是13.
注意:
连续的减法和除法,应该遵循左结合的规定。
连续除法要打括号,否则会引起歧义。
针对这一次的练习,只需只需在上一次的基础上加上表达的式的求值即可,只是就需要用到数据结构中的栈来解决。说是简单,但是实现起来却不容易,数据结构一直是我头疼的东西。和我的同学比起来真的是自愧不如,这次他和我一直,询问了他许久。
最后在上一次的基础上,增加了一个表达式求解的模块,具体代码如下:
1 // 按要求随机生成四则运算 王世强 2015/3/15 2 #include<iostream> 3 #include<stdlib.h> 4 #include<iomanip> 5 #include<time.h> 6 #include<stdio.h> 7 #include"math.h" 8 #define true 1 9 #define false 0 10 #define OPSETSIZE 7 11 #define random() (rand()%100000) 12 #include"string.h" 13 typedef int Status; 14 using namespace std; 15 16 unsigned char Prior[7][7] = 17 { // 运算符优先级表 18 // '+' '-' '*' '/' '(' ')' '#' 19 /*'+'*/'>','>','<','<','<','>','>', 20 /*'-'*/'>','>','<','<','<','>','>', 21 /*'*'*/'>','>','>','>','<','>','>', 22 /*'/'*/'>','>','>','>','<','>','>', 23 /*'('*/'<','<','<','<','<','=',' ', 24 /*')'*/'>','>','>','>',' ','>','>', 25 /*'#'*/'<','<','<','<','<',' ','=', 26 }; 27 28 typedef struct StackChar 29 { 30 char c; 31 struct StackChar *next; 32 }SC; //StackChar类型的结点SC 33 34 typedef struct StackFloat 35 { 36 float f; 37 struct StackFloat *next; 38 }SF; //StackFloat类型的结点SF 39 40 SC *Push(SC *s,char c) //SC类型的指针Push,返回p 41 { 42 SC *p=(SC*)malloc(sizeof(SC)); 43 p->c=c; 44 p->next=s; 45 return p; 46 } 47 48 SF *Push(SF *s,float f) //SF类型的指针Push,返回p 49 { 50 SF *p=(SF*)malloc(sizeof(SF)); 51 p->f=f; 52 p->next=s; 53 return p; 54 } 55 56 SC *Pop(SC *s) //SC类型的指针Pop 57 { 58 SC *q=s; 59 s=s->next; 60 free(q); 61 return s; 62 } 63 64 SF *Pop(SF *s) //SF类型的指针Pop 65 { 66 SF *q=s; 67 s=s->next; 68 free(q); 69 return s; 70 } 71 72 float Operate(float a,unsigned char theta, float b) //计算函数Operate 73 { 74 switch(theta) 75 { 76 case '+': return a+b; 77 case '-': return a-b; 78 case '*': return a*b; 79 case '/': return a/b; 80 default : return 0; 81 } 82 } 83 84 char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'}; 85 86 Status In(char Test,char *TestOp) 87 { 88 int Find=false; 89 for (int i=0; i< OPSETSIZE; i++) 90 { 91 if(Test == TestOp[i]) 92 Find= true; 93 } 94 return Find; 95 } 96 97 Status ReturnOpOrd(char op,char *TestOp) 98 { 99 for(int i=0; i< OPSETSIZE; i++) 100 { 101 if (op == TestOp[i]) 102 return i; 103 } 104 } 105 106 char precede(char Aop, char Bop) 107 { 108 return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]; 109 } 110 111 float EvaluateExpression(char* MyExpression) 112 { 113 // 算术表达式求值的算符优先算法 114 // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合 115 SC *OPTR=NULL; // 运算符栈,字符元素 116 SF *OPND=NULL; // 运算数栈,实数元素 117 char TempData[20]; 118 float Data,a,b; 119 char theta,*c,Dr[]={'#','