计算器,加减乘除括号运算。谁有源程序,最好是用PB做的,谢谢了。求PB高手,364128543@qq.com
设计一个简单的计算器,要求能够对输入的数1.进行+,-,*,/,运算;2.可以带括号();3.不限定运算式的输入长度.(参考编译技术中语法分析原理)...
设计一个简单的计算器,要求能够对输入的数
1.进行+,-,*,/,运算;
2.可以带括号( );
3.不限定运算式的输入长度.
(参考编译技术中语法分析原理) 展开
1.进行+,-,*,/,运算;
2.可以带括号( );
3.不限定运算式的输入长度.
(参考编译技术中语法分析原理) 展开
1个回答
展开全部
我有一个,可以直接用,自己写的,已经编译通过,没有问题
如果有什么问题可以联系我,xidianli@qq.com
#include<stdlib.h>
#include<stdio.h>
struct str{
char s[60];
};
str u[50];
int str(char *s);
int main()
{
int n,i=1;
printf("请输入要计算几个表达式,n=");
scanf("%d",&n);
printf("每输入一个表达式,回车输入下一个\n");
for(i=0;i<=n;)
{
gets(u[i].s);
i++;
}
for(i=1;i<=n;i++)
{
if(str(u[i].s)!=-123456) printf("%d\n",str(u[i].s));
else printf("false");
}
system("pause");
return 0;
}
int str(char *s)
{
double a[50];char b[50];
double shishu(char *s,int *k);
int pp(char c);
char readsnode2(int *p,char *b);
int ins2(char *p,char c,int *t2);
double ins1(double e1,int *k1,double a[]);
char del2(int *t2,char *p);
double del1(double *p,int *t1);
char c;
int flag=1,k=0;
double x,y;
b[0]='\0';
//printf("input s:");
int i=0,v1=0,v2=0;
while(s[i]!='\0')
{
if(s[i]=='(') v1++;
else if(s[i]==')') v2++;
i++;
}
//printf("%s=\n",s);
c=s[k];
int top1=0,top2=1;
while(flag)
{
if(c>='0'&&c<='9'||c=='.')
ins1(shishu(s,&k),&top1,a);
else if(c=='('||pp(c)>pp(readsnode2(&top2,b)))
{ //printf("%c",bottom2->date2);
ins2(b,c,&top2);
k=k+1;
//printf("%d\n",k);
}
else if((c=='\0')&&(readsnode2(&top2,b)=='\0'))
{
y=del1(a,&top1);
x=del1(a,&top1);
c=del2(&top2,b);
switch(c)
{
case'*':x=x*y;break;
case'/':x=x/y;break;
case'-':x=x-y;break;
case'+':x=x+y;break;
//case'#':x=x+y;break;
}
ins1(x,&top1,a);
flag=0;
}
else if((c==')')&&((readsnode2(&top2,b)=='(')))
{
del2(&top2,b);
k=k+1;
}
else if((pp(c))<=pp(readsnode2(&top2,b)))
{
y=del1(a,&top1);
x=del1(a,&top1);
c=del2(&top2,b);
switch(c)
{
case'*':x=x*y;break;
case'/':x=x/y;break;
case'-':x=x-y;break;
case'+':x=x+y;break;
//case'#':x=x+y;break;
}
ins1(x,&top1,a);
}
c=s[k];
}
//double f;
//f=a[0];
if(v1==v2){
//printf("%s=",s);
//printf("%d\n",f);
return (int)a[0];
//printf("%d\n",a[1]);
}
else return -123456;
//system("pause");
//return 0;
}
double shishu(char *s,int *k)
{
double x,y=1.0;
int flag=1;
char c;
x=0.0;
c=s[*k];
while(c>='0'&&c<='9'||c=='.')
{
*k=*k+1;
if(c>='0'&&c<='9')
if(flag==0)
{y=y*0.1;x=x+(c-48)*y;}
else
x=10*x+(c-48);
else flag=0;
c=s[*k];
}
return(x);
}
int pp(char c)
{
int k;
switch(c)
{
case'*': k=2;break;
case'/': k=2;break;
case'+': k=1;break;
case'-': k=1;break;
case'(': k=0;break;
case')': k=0;break;
case'\0': k=-1;break;
}
return(k);
}
double ins1(double e1,int *k1,double a[])
{
int *k;
k=k1;
a[*k]=e1;
*k=*k+1;
return 0.0;
}
char readsnode2(int *p,char *b)
{
char x;
char *d;
d=b;
x=d[*p-1];
return(x);
}
int ins2(char *p,char c,int *t2)
{
char *s;
s=p;
s[*t2]=c;
*t2=*t2+1;
return 0;
}
char del2(int *t2,char *p)
{
char *s;
s=p;
//m=s[*t2-1];
*t2=*t2-1;
return s[*t2];
}
double del1(double *p,int *t1)
{
double *s,n;
s=p;
n=s[*t1-1];
*t1=*t1-1;
return n;
}
如果有什么问题可以联系我,xidianli@qq.com
#include<stdlib.h>
#include<stdio.h>
struct str{
char s[60];
};
str u[50];
int str(char *s);
int main()
{
int n,i=1;
printf("请输入要计算几个表达式,n=");
scanf("%d",&n);
printf("每输入一个表达式,回车输入下一个\n");
for(i=0;i<=n;)
{
gets(u[i].s);
i++;
}
for(i=1;i<=n;i++)
{
if(str(u[i].s)!=-123456) printf("%d\n",str(u[i].s));
else printf("false");
}
system("pause");
return 0;
}
int str(char *s)
{
double a[50];char b[50];
double shishu(char *s,int *k);
int pp(char c);
char readsnode2(int *p,char *b);
int ins2(char *p,char c,int *t2);
double ins1(double e1,int *k1,double a[]);
char del2(int *t2,char *p);
double del1(double *p,int *t1);
char c;
int flag=1,k=0;
double x,y;
b[0]='\0';
//printf("input s:");
int i=0,v1=0,v2=0;
while(s[i]!='\0')
{
if(s[i]=='(') v1++;
else if(s[i]==')') v2++;
i++;
}
//printf("%s=\n",s);
c=s[k];
int top1=0,top2=1;
while(flag)
{
if(c>='0'&&c<='9'||c=='.')
ins1(shishu(s,&k),&top1,a);
else if(c=='('||pp(c)>pp(readsnode2(&top2,b)))
{ //printf("%c",bottom2->date2);
ins2(b,c,&top2);
k=k+1;
//printf("%d\n",k);
}
else if((c=='\0')&&(readsnode2(&top2,b)=='\0'))
{
y=del1(a,&top1);
x=del1(a,&top1);
c=del2(&top2,b);
switch(c)
{
case'*':x=x*y;break;
case'/':x=x/y;break;
case'-':x=x-y;break;
case'+':x=x+y;break;
//case'#':x=x+y;break;
}
ins1(x,&top1,a);
flag=0;
}
else if((c==')')&&((readsnode2(&top2,b)=='(')))
{
del2(&top2,b);
k=k+1;
}
else if((pp(c))<=pp(readsnode2(&top2,b)))
{
y=del1(a,&top1);
x=del1(a,&top1);
c=del2(&top2,b);
switch(c)
{
case'*':x=x*y;break;
case'/':x=x/y;break;
case'-':x=x-y;break;
case'+':x=x+y;break;
//case'#':x=x+y;break;
}
ins1(x,&top1,a);
}
c=s[k];
}
//double f;
//f=a[0];
if(v1==v2){
//printf("%s=",s);
//printf("%d\n",f);
return (int)a[0];
//printf("%d\n",a[1]);
}
else return -123456;
//system("pause");
//return 0;
}
double shishu(char *s,int *k)
{
double x,y=1.0;
int flag=1;
char c;
x=0.0;
c=s[*k];
while(c>='0'&&c<='9'||c=='.')
{
*k=*k+1;
if(c>='0'&&c<='9')
if(flag==0)
{y=y*0.1;x=x+(c-48)*y;}
else
x=10*x+(c-48);
else flag=0;
c=s[*k];
}
return(x);
}
int pp(char c)
{
int k;
switch(c)
{
case'*': k=2;break;
case'/': k=2;break;
case'+': k=1;break;
case'-': k=1;break;
case'(': k=0;break;
case')': k=0;break;
case'\0': k=-1;break;
}
return(k);
}
double ins1(double e1,int *k1,double a[])
{
int *k;
k=k1;
a[*k]=e1;
*k=*k+1;
return 0.0;
}
char readsnode2(int *p,char *b)
{
char x;
char *d;
d=b;
x=d[*p-1];
return(x);
}
int ins2(char *p,char c,int *t2)
{
char *s;
s=p;
s[*t2]=c;
*t2=*t2+1;
return 0;
}
char del2(int *t2,char *p)
{
char *s;
s=p;
//m=s[*t2-1];
*t2=*t2-1;
return s[*t2];
}
double del1(double *p,int *t1)
{
double *s,n;
s=p;
n=s[*t1-1];
*t1=*t1-1;
return n;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询