作业要求:
写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求,这些需求都可以用命令行参数的形式来指定:
a) 支持整数、真分数的四则运算。例如: 1/6 + 1/8 = 7/24
b) 逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目(最多 10 个运算符,括号的数量不限制)
25 - 3 * 4 - 2 / 2 + 89 = ?
1/2 + 1/3 - 1/4 = ?
( 5 - 4 ) * ( 3 +28 ) =?
设计思路:
采用使用栈将表达式中缀转后缀的做法,求解表达式的值
对于小数型,采取double型的栈存取,其余做法与一般方法一致
对于分数型,采取字符串的形式进行存取
对于分数型,重载了+,-,*的运算规则,使其满足分数加减乘法的要求。其函数中包含了大量的字符串分割,字符串转整型等操作,最后返回一个结果的字符串
已经实现功能:
- 随机生成整数数或者分数算式,整数算式结果为小数,分数算式结果为真分数
- 真分数的四则运算,结果为真分数
- 支持括号
1 #include <iostream> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <stack> 5 #include <math.h> 6 #include <string.h> 7 #include <iomanip> 8 9 using namespace std; 10 11 char basic_op_de[4]={'+','-','*','/'}; 12 13 unsigned char Prior_de[8][8] ={ // 运算符优先级表 14 // '+' '-' '*' '/' '(' ')' '#' '^' 15 /*+*/'>','>','<','<','<','>','>','<', 16 /*-*/'>','>','<','<','<','>','>','<', 17 /***/'>','>','>','>','<','>','>','<', 18 /*/*/'>','>','>','>','<','>','>','<', 19 /*(*/'<','<','<','<','<','=',' ','<', 20 /*)*/'>','>','>','>',' ','>','>','>', 21 /*#*/'<','<','<','<','<',' ','=','<', 22 /*^*/'>','>','>','>','<','>','>',' ', 23 }; 24 25 char graph_de[8]={'+','-','*','/','(',')','#','^'}; 26 27 28 bool In_de(char a,char b[7]) { //判断是否为运算符 29 int i; 30 bool c=false; 31 for(i=0;i<=7;i++) 32 { 33 if(a==b[i]) 34 c=true; 35 } 36 return c; 37 } 38 39 char Precede_de(char a,char b) {//判断优先级 40 int i,j; 41 if(a=='+') i=0; 42 if(a=='-') i=1; 43 if(a=='*') i=2; 44 if(a=='/') i=3; 45 if(a=='(') i=4; 46 if(a==')') i=5; 47 if(a=='#') i=6; 48 if(a=='^') i=7; 49 if(b=='+') j=0; 50 if(b=='-') j=1; 51 if(b=='*') j=2; 52 if(b=='/') j=3; 53 if(b=='(') j=4; 54 if(b==')') j=5; 55 if(b=='#') j=6; 56 if(b=='^') j=7; 57 return Prior_de[i][j]; 58 } 59 60 double Operate_de(double Num1,char b,double Num2) {//进行运算 61 double result=1; 62 switch(b){ 63 case'+':return Num1+Num2;break; 64 case'-':return Num1-Num2;break; 65 case'*':return Num1*Num2;break; 66 case'/':return Num1/Num2;break; 67 } 68 } 69 70 double EvaluateExpression_de(char* string) //求表达式的值 71 { 72 int count=0; 73 stack<double> p1; //运算数 74 stack<char> p2; 75 stack<double> *S1; 76 stack<char> *S2; //运算符 77 S1=&p1; 78 S2=&p2; 79 char temp,y,x,c,cpre='('; //prec用与记录前一个字符 80 double Num1,Num2,num; 81 char str[50]; 82 str[0]='