大家看看哦,提提意见,第一次做课程设计,简单计算机软件
#include<stdio.h>#include<stdlib.h>
#define MAX 100
typedef struct
{
char s[20];
int top;
}fustack;//运算符栈
typedef struct
{ float s[20];
int top;
}shustack;//运算数栈
void push_fu(fustack *a,char x)//运算符栈进栈
{
a->top++;
a->s[a->top]=x;
}
void push_shu(shustack *a,float x)//运算数栈进栈
{
a->top++;
a->s[a->top]=x;
}
float pop_shu(shustack *a)//运算数栈出栈
{
float x;
x=a->s[a->top];
a->top--;
return x;
}
char top_fu(fustack *a)//运算符栈取栈顶元素
{
char x;
x=a->s[a->top];
a->top--;
return x;
}
void trans(char *exp,char postexp[],fustack *op)//转换函数,把中缀表达式转换为后缀表达式
{
op=(fustack *)malloc(sizeof(fustack));
int i=0;
op->top=-1;
while(*exp!='\0')
{
switch (*exp)
{
case '(':
push_fu(op,*exp);//运算符进栈
exp++;
break;
case ')':
while(op->s[op->top]!='(')
{
postexp[i++]=top_fu(op);
}
op->top--;
exp++;
break;
case '+':
case '-':
while(op->top!=-1&&op->s[op->top]!='(')
{
postexp[i++]=top_fu(op);
}
push_fu(op,*exp);//运算符进栈
exp++;
break;
case '*':
case '/':
while(op->s[op->top]=='*'||op->s[op->top]=='/')
{
postexp[i++]=top_fu(op);
}
push_fu(op,*exp);
exp++;
break;
case ' ':
exp++;
break;
case '=':
exp++;
break;
default:
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
}
while(op->top!=-1)
{
postexp[i++]=top_fu(op);
}
postexp[i]='@';
}
float compvalue(char *postexp,shustack *st)//计算函数,计算中缀表达式
{
st=(shustack *)malloc(sizeof(shustack));
float d,a,b,c;
st->top=-1;
while(*postexp!='@')
{
switch (*postexp)
{
case '+':
a=pop_shu(st);//运算数出栈
b=pop_shu(st);//运算数出栈
c=a+b;
push_shu(st,c);//运算栈进栈
break;
case '-':
a=pop_shu(st);//运算数出栈
b=pop_shu(st);//运算数出栈
c=b-a;
push_shu(st,c);//运算栈进栈
break;
case '*':
a=pop_shu(st);//运算数出栈
b=pop_shu(st);//运算数出栈
c=a*b;
push_shu(st,c);//运算栈进栈
break;
case '/':
a=pop_shu(st);//运算数出栈
b=pop_shu(st);//运算数出栈
if(a!=0)
{
c=b/a;
push_shu(st,c);//运算栈进栈
}
else
{
printf("除数为0,请检查输入的表达式\n");
}
break;
default:
d=0;
while(*postexp>='0' && *postexp<='9')
{
d=10*d+*postexp-'0';
postexp++;
}
push_shu(st,d);//运算栈进栈
break;
}
postexp++;
}
return (st->s[st->top]);
}
int main()
{
fustack *m;
shustack *n;
m=(fustack *)malloc(sizeof(fustack));
n=(shustack *)malloc(sizeof(shustack));
char exp[MAX];
char postexp[MAX];
int a;
int count=0;
int i=1;
int z;
printf("*********欢迎使用*********\n");
printf("进入请按1\n");
printf("退出请按2\n");
printf("使用说明请按3\n");
scanf("%d",&a);
while(a!=1&&a!=2&&a!=3)
{
printf("输入错误,请重新输入:");
scanf("%d",&a);
}
switch(a)
{
case 1:
do{
printf("请输入需要运算的字符串:\n");
getchar();
gets(exp);while(exp[count]!='\0') {count++;;}
for(i=0;i<count-1;i++)
{
if(exp[i]=='=')
{
printf("输入的字符错误,请检查输入的字符\n");
exit(0);
}
}
trans(exp,postexp,m);//调用转换函数
printf("%.2f\n",compvalue(postexp,n));//调用计算函数
printf("继续请按1\n退出请按2\n");
scanf("%d",&z);}while(z==1);
if(z==2)
exit(0);
return 0;
break;
case 2:
return 0;
exit(0);
break;
case 3:
printf("对简单的算术表达式进行求值(包括加减乘除功能);\n");
printf("要求单字符输入,即输入的数字或符号不需要回车键;\n");
printf("按回车键或等号键则显示计算结果。\n");
printf("输入3*(14+6)= \n输出:60\n");
return 0;
break;
default:
return 0;
}
}