📄 表达式求值.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 + -