⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 表达式求值.c

📁 学习顺序存储结构的链式实现。本程序能实现四则运算和简单的混合运算。
💻 C
字号:
#include<stdio.h> 
#include<conio.h> 
#include<math.h> 
#include<stdlib.h> 

typedef struct 
{ 
char fun; 
int grade; 
}Functor; 
/*定义算符栈结构体 */
Functor FUNCTOR[20]; 
float NUM[20]; 
/*定义算符栈和对象栈 */
char ch[100]; 
int sub=0; 
/*存放输入的字符串 */

float Char_To_Num(){ 
/*将表示数据的字符串转化成数据 */
int flag=0, i=-1; 
float value=0.0; 
while((ch[sub]>=48 && ch[sub]<=57) || ch[sub]=='.'){ 
if(ch[sub]=='.') 
flag=1; 
else{ 
if(flag==0) value=value*10+ch[sub]-48; 
else{ 
value=value+( ch[sub]-48 )*pow(10,i); 
i--; 
}} 
sub++; 
} 
return value; 
} 

int In_Grade(char c) 
{ /*算符在栈内时的级别 */
int g; 
switch(c) 
{ 
case '^': g=3;break; 
case '*': 
case '/': 
case '%': g=2;break; 
case '+': 
case '-': g=1;break; 
case '(': g=0;break; 
case ')': g=-1;break; 
} 
return g; 
} 

int Out_Grade() 
{ /*算符在栈外时的级别 */
int g; 
switch(ch[sub]) 
{ 
case '^': g=4;break; 
case '*': 
case '/': 
case '%': g=2;break; 
case '+': 
case '-': g=1;break; 
case '(': g=4;break; 
case ')': g=-1;break; 
} 
return g; 
} 

void Error() 
{ 
printf("Expression error!\n"); 
printf("\nPress any key to quit."); 
getch(); 
exit(1); 
} 

void Calculate(int i, int j) 
{ 
if(i>=2) 
{ /*判断对象栈中元素个数 */
switch(FUNCTOR[j-1].fun) 
{ 
case '^': NUM[i-2]=pow(NUM[i-2],NUM[i-1]); break; 
case '*': NUM[i-2]=NUM[i-2]*NUM[i-1]; break; 
case '/': NUM[i-2]=NUM[i-2]/NUM[i-1]; break; 
case '%': NUM[i-2]=(int)(NUM[i-2])%(int)(NUM[i-1]); break; 
case '+': NUM[i-2]=NUM[i-2]+NUM[i-1]; break; 
case '-': NUM[i-2]=NUM[i-2]-NUM[i-1]; break; 
} 
NUM[i-1]=0; 
FUNCTOR[j-1].fun=0; 
} 
else Error(); 
/*若对象栈若只剩一个数据,则输入的表达式有误 */
} 

float Char_Transform(){ 
int i=0, j=0, grade, flag=0; 
while( ch[sub]!='=' || j!=0 ){ 
if(ch[sub]=='='){ 
/*输入的字符是否取完 */
Calculate(i, j); 
i--; 
j--;} 
else{ 
if(ch[sub]>=48 && ch[sub]<=57){ 
/*判断是否为运算对象 */
NUM[i++]=Char_To_Num(); 
} 
else{ 
if(ch[sub]=='%' || 
(ch[sub]>=40 && ch[sub]<=43) || 
ch[sub]=='-' ||ch[sub]=='^' || 
ch[sub]=='/'){ 
/*判断是否为算符*/ 


if( FUNCTOR[j-1].fun== '(' && ch[sub]== ')' ){ 
/*括号内表达式计算完后则将左括号从栈中去除 */
FUNCTOR[j-1].fun=0; 
j--; 
sub++;} 
else{ 
grade=Out_Grade(); /*栈外算符的级别 */
if(j==0 || grade>FUNCTOR[j-1].grade){ 
/*第一个或级别比栈内算符高的进栈 */
FUNCTOR[j].fun=ch[sub]; 
FUNCTOR[j].grade=In_Grade(ch[sub]); 
j++; 
sub++;} 
else{ 
Calculate(i, j); 
i--; 
j--; 
}}}
else Error(); 
/*表达式中有非算术字符,则表达式有误 */
}}} 
return NUM[i-1]; 
} 

void main() 
{ 
float result; 
printf("****************************************\n"); 
printf("Please enter the requested solution expressions,ends with =:\n"); 
printf("****************************************\n"); 
gets(ch); 
result=Char_Transform(); 
printf("%s%.2f\n", ch, result); 
printf("\nPress any key to quit"); 
getch(); 
}
/*说明:本实验不支持负数运算,如-3+2=、(-2-3)*3= 不能正确运算。*/
/*但支持大于多位运算,如可运算 18+233= 
/*支持指数运算,如2^3+3=*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -