编写了一个简单计算器但不知道为何不能打印
#include <stdio.h>#include <string.h>
#include <stdlib.h>
//计算符优先级比较表
char First[7][7]=
{
//'+','-','*','/','(',')','#'
//'+'
'>','>','<','<','<','>','>',
//'-'
'>','>','<','<','<','>','>',
//'*'
'>','>','>','>','<','>','>',
//'/'
'>','>','>','>','<','>','>',
//'('
'<','<','<','<','<','=',' ',
//')'
'>','>','>','>',' ','>','>',
//'#'
'<','<','<','<','<',' ','=',
};
//运算符数组
char op[7]={'+','-','*','/','(',')','#'};
//数据结构体
typedef struct
{
double data[50];
int top;
}opnd_Stack;
//运算符结构体
typedef struct
{
char data[50];
int top;
}optr_Stack;
//初始化运算符栈函数
void IntStack_r(optr_Stack*a)
{
a->top=-1;
}
//初始化数据站函数
void IntStack_d(opnd_Stack*a)
{
a->top=-1;
}
//运算符进栈函数
void Push_r(optr_Stack*a, char b)
{
a->top++;
a->data[a->top]=b;
}
//数据进栈函数
void Push_d(opnd_Stack*a, double b)
{
a->top++;
a->data[a->top]=b;
}
//取运算符栈顶符函数
void Gettop_r(optr_Stack*a, char*b)
{
*b=a->data[a->top];
}
//取数据栈顶数函数
void Gettop_d(opnd_Stack*a, double*b)
{
*b=a->data[a->top];
}
//判断数据是否为运算符函数
int In(char a, char*s)
{
for(int i=0;i<7;i++)
{
if(a==s[i])
return 1;
return 0;
}
}
//算符优先级判断函数
char Precede(char a, char b)
{
int m, n;
for (int i=0;i<7;i++)
{
if(a==op[i])
m=i;
if(b==op[i])
n=i;
}
return First[m][n];
}
//删除运算符栈顶元素,并取新栈的栈顶元素
void Pop_r(optr_Stack*a, char*b)
{
a->top--;
*b=a->data[a->top];
}
//取数据栈的栈顶元素,并从栈中删除此元素
void Pop_d(opnd_Stack*a, double*b)
{
*b=a->data[a->top];
a->top--;
}
//二元运算函数
double Operate(double a,char t, double b)
{
switch(t)
{
case'+':return a+b;
case'-':return a-b;
case'*':return a*b;
case'/':return a/b;
default:return 0;
}
}
//将字符串转换成浮点型数据
double Getdouble(char*a, int*b)
{
double x;
char s[50];
int m=0;
int n;
n=strlen(a);
for(int i=*b;i<n;i++)
{
if(In(a[i],op)==1)
{
m=i;
break;
}
}
for(i=*b;i<m;i++)
{
s[i-*b]=a[i];
strcat(s, "\0");
x=atof(s);
*b=m;
return x;
}
}
//算符优先算法求职核心函数
double Value(char*s)
{
opnd_Stack opnd;
optr_Stack optr;
char ch,t;
double x, a, b;
int k=0;
strcat(s, "#");
IntStack_r(&optr);
Push_r(&optr, '#');
IntStack_d(&opnd);
Gettop_r(&optr,&ch);
while(s[k]!='#' || ch!='#')
{
if(In(s[k],op)==0)
{
x=Getdouble(s,&k);
Push_d(&opnd,x);
}
else
{
switch(Precede(ch,s[k]))
{
case'<':
Push_r(&optr,s[k]);
k++;
break;
case'=':
Pop_r(&optr, &ch);
k++;
break;
case'>':
Gettop_r(&optr,&t);
Pop_r(&optr,&ch);
Pop_d(&opnd,&b);
Pop_d(&opnd,&a);
Push_d(&opnd, Operate(a, t, b));
break;
}
}
Gettop_r(&optr, &ch);
}
Gettop_d(&opnd, &x);
return x;
IntStack_r(&optr);
Push_r(&optr, '#');
IntStack_d(&opnd);
}
//判断输入表达式是否正确
int Can(char a[], int n)
{
int p=0, s=0, t=0;
for(int i=0;i<n;i++)
{
if(a[i]=='('||a[i]==')')
p++;
if((a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')&&((a[i+1]<'0' && a[i+1]!='(')||a[i+1]>'9'))
s++;
if(a[i]=='/' && a[i+1]=='0')
s++;
if((a[i]=='('&&(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')) || (a[i]==')' && a[i+1]=='('))
s++;
if(a[i]==')' && a[i+1]!='\0' && (a[i+1]!='+' && a[i+1]!='-' && a[i+1]!='*' && a[i+1]!='/'))
s++;
if(a[i]=='.' && a[i+1]=='.')
s++;
}
if(p%2==0 && s==0)
return 0;
return 1;
}
//负数转换函数
void Translate(char*s)
{
char b[80];
int k, t;
if(s[0]=='-')
{
b[0]='0';
b[1]='\0';
strcat(b, s);
strcpy(s, b);
}
t=strlen(s);
k=t;
for(int i=0;i<t;i++)
{
if(s[i]=='(' && s[i+1]=='-')
{
k=i+1;
for(int j=t;j>=k;j--)
{
s[j]=s[j-1];
s[k]='0';
s[t+1]='\0';
}
}
t=strlen(s);
k=t;
}
}
//主函数
void main()
{
system("color B0");//设置背景颜色
char a[80];
int m;
char b[80];
printf("-------简易计算器------\n");
printf("请输入一个表达式\n");
while(1)
{
gets(a);
strcpy(b, a);
Translate(a);
while(1)
{
int p;
m=strlen(a);
p=Can(a, m);
if(p==0)
break;
system("color F4");
printf("输入错误,请重新输入表达式");
gets(a);
strcpy(b, a);
Translate(a);
}
system("color B0");
printf("该表达式结果为:\n %s=%lf\n", b, Value(a));
printf("继续使用请再输入一个表达式\n");
}
}