明人不说暗话,直接上百度网盘链接,输入提取码z3fy即可下载。
文件中包含程序,程序运行文件,设计报告和测试样例,应有尽有,欢迎小伙伴们在中下载使用。
本课程设计为四则运算表达式求值,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值。
注意事项:
1、请保证输入的四则表达式的合法性。输入的中缀表达式中只能含有英文符号“+”、“-”、“*”、“/”、“(”、“)”、“=”、数字“0”到“9”以及小数点“.”,输入“=”表示输入结束。例如9+(3-1)*3.567+10/2=,特别是请勿输入多余空格和中文左右括号。
2、输入的中缀表达式默认限定长度是1001,可根据具体情况调整字符串数组的长度。
3、请保证输入的操作数在double数据类型范围内,单个数字有效数字长度不可超过15位。本课程设计中操作数是C语言中的双精度浮点数类型。
4、本课程设计中的运算数可以是负数,另外如果是正数可直接省略“+”号(也可带“+”号)。
下面的程序正常运行需要在上面的百度网盘中下载相应文件,否则无法正常使用哦。
1 /*本程序为四则运算表达式求值系统,用于计算带小括号的四则运算表达式求值。 2 具体算法: 3 先将字符串处理成操作单元(操作数或操作符),再利用栈根据四则运算 4 的运算法则进行计算,最后得出结果。*/ 5 6 #include<stdio.h> 7 #include<ctype.h> 8 #include<stdlib.h> 9 #include<string.h> 10 #include<stdlib.h> 11 #include<ctype.h> 12 13 const int Expmax_length = 1001;//表达式最大长度,可根据适当情况调整 14 struct Ope_unit 15 {//定义操作单元 16 int flag;//=1表示是操作数 =0表示是操作符 -1表示符号单元 17 char oper;//操作符 18 double real;//操作数,为双精度浮点数 19 }; 20 21 void Display();//菜单 22 void Instru(); //使用说明 23 int Check(char Exp_arry[]); 24 void Evalua(); //先调用Conver操作单元化,再调用Calculate函数计算结果并输出 25 int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[]);//将字符串处理成操作单元 26 int Isoper(char ch);//判断合法字符(+ - * / ( ) =) 27 int Ope_Compar(char ope1,char ope2);//操作符运算优先级比较 28 double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag);//用栈计算表达式结果 29 double Four_arithm(double x,double y,char oper);//四则运算 30 31 int main() 32 { 33 int select; 34 while(1) 35 { 36 Display(); 37 printf("请输入欲执行功能对应的数字:"); 38 scanf("%d",&select); 39 printf(" "); 40 switch(select) 41 { 42 case 1: Evalua(); break; 43 case 2: Instru(); break; 44 case 0: return 0; 45 default : printf("无该数字对应的功能,请重新输入 "); 46 system("pause"); 47 } 48 } 49 return 0; 50 } 51 52 int Check(char Exp_arry[]) 53 {//检查是否有非法字符,返回1表示不合法,0表示合法 54 int Explength=strlen(Exp_arry),i; 55 for(i=0;i<Explength;i++) 56 { 57 if(!Isoper(Exp_arry[i]) && Exp_arry[i] != '.' && !isdigit(Exp_arry[i])) 58 return 1; 59 if(isdigit(Exp_arry[i])) 60 { 61 int Dig_number=0,Cur_positoin=i+1; 62 while(isdigit(Exp_arry[Cur_positoin]) || Exp_arry[Cur_positoin]=='.') 63 { 64 Dig_number++; 65 Cur_positoin++; 66 } 67 if(Dig_number >= 16)//最多能够计算15位有效数字 68 return 1; 69 } 70 } 71 return 0; 72 } 73 74 void Evalua() 75 {//先调用Conver函数将字符串操作单元化,再调用Calculate函数计算结果并输出 76 char Exp_arry[Expmax_length]; 77 int flag=0;//假设刚开始不合法,1表达式合法,0不合法 78 struct Ope_unit Opeunit_arry[Expmax_length]; 79 80 getchar();//吃掉一个换行符 81 printf("请输入四则运算表达式,以=结尾: "); 82 gets(Exp_arry); 83 flag=Check(Exp_arry); 84 if(flag) 85 printf("该表达式不合法! "); 86 else 87 { 88 int Opeunit_count = Conver(Opeunit_arry,Exp_arry); 89 double ans = Calculate(Opeunit_arry,Opeunit_count,flag); 90 if(flag) 91 { 92 printf("计算结果为: "); 93 printf("%s%lf ",Exp_arry,ans); 94 } 95 else 96 printf("该表达式不合法! "); 97 } 98 system("pause"); 99 } 100 101 int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[]) 102 {//将字符串操作单元化 103 int Explength=strlen(Exp_arry); 104 int i,Opeunit_count=0; 105 for(i=0;i<Explength;i++) 106 { 107 if(Isoper(Exp_arry[i]))//是操作符 108 { 109 Opeunit_arry[Opeunit_count].flag=0; 110 Opeunit_arry[Opeunit_count++].oper=Exp_arry[i]; 111 } 112 else//是操作数 113 { 114 Opeunit_arry[Opeunit_count].flag=1; 115 char temp[Expmax_length]; 116 int k=0; 117 for(; isdigit(Exp_arry[i]) || Exp_arry[i]=='.' ;i++) 118 { 119 temp[k++]=Exp_arry[i]; 120 } 121 i--; 122 temp[k]='