你好,C语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你好,C语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?相关的知识,希望对你有一定的参考价值。
题目18:用C语言设计一个简单的计算器,要求能够对输入的数
1.进行+,-,*,/,运算;
2.可以带括号( );
3.不限定运算式的输入长度.
(参考编译技术中语法分析原理)
#include<stdlib.h>
#define SIZE 100
typedef int SS;
typedef struct //定义栈
int *base;
int *top;
int stack;
Sqstack;
int InitStack(Sqstack &S) //建立栈
S.base=(SS *)malloc(SIZE*sizeof(SS));
S.top = S.base;
S.stack = SIZE;
return 0;
int Push(Sqstack &S,SS e) //输入的数据分别入栈
if(S.top - S.base>= S.stack)
S.base = (SS*)realloc(S.base,(S.stack+10)*sizeof(SS));
S.top = S.base+S.stack;
S.stack+=10;
*S.top++=e;
return 0;
int Pop(Sqstack &S,SS &e) //出栈
e=*--S.top;
return 0;
int GetTop(Sqstack S,SS &e) //访问栈顶元素
e = *(S.top - 1);
return 0;
int Pre(char a,char b) //定义运算符的优先级顺序表
int m[7][7]=1,1,-1,-1,-1,1,
1,1,-1,-1,-1,-1,
1,1,1,1,-1,-1,1,
1,1,1,1,-1,-1,1,
1,1,1,1,1,-1,1,
-1,-1,-1,-1,-1,0,
1,1,1,1,1,2,1;
int i,j;
switch(a) //利用switch语句进行运算符优先级的定义
case \'+\':i=0;break;
case \'-\':i=1;break;
case \'*\':i=2;break;
case \'/\':i=3;break;
case \'(\':i=4;break;
case \')\':i=5;break;
case \'^\':i=6;break;
switch(b)
case \'+\':j=0;break;
case \'-\':j=1;break;
case \'*\':j=2;break;
case \'/\':j=3;break;
case \'(\':j=4;break;
case \')\':j=5;break;
case \'^\':j=6;break;
case \'=\':j=7;break;
return 0;
int operate(int a,char b,int c) //编写进行四则运算的函数
int s,i;
switch (b)
case \'+\' : s=a+c;break;
case \'-\' : s=a-c;break;
case \'*\' : s=a*c;break;
case \'/\' : s=a/c;break;
case \'^\' : for(i=0,s=1;i<c;i++)s*=a;;break;
return s;
int main()
int i,j,n=0,m1,m2,k,c,o,abc=0;
Sqstack Num,S;
char a[100];
gets(a);
InitStack(S);
InitStack(Num);
for(i=0,j=0;a[i]!=0;)
if(a[i]>47&&a[i]<58)n=n*10+a[i]-48;i++,abc++;
else
if(abc!=0)Push(Num,n);n=0;abc=i;abc=0;
if(j==0) Push(S,a[i]);i++;j++;
else
GetTop(S,c);
k=Pre(c,a[i]);
switch(k)
case 1:
Push(S,a[i]);i++;j++;break;
case 0:
Pop(S,o);i++;j--;break;
case 2:
Pop(S,o);
Pop(Num,m2);
Pop(Num,m1);
Push(Num,operate(m1,o,m2));
j--;
break;
if(j==0&&a[i]==\'=\') break; //当S中没有运算符后结束循环
GetTop(Num,m1);
printf("%d\\n",m1);
return 0;
这个是用栈来解决问题的,可以识别+ - * /的优先级,对括号之类的输入都是没有问题的,程序有点长,但是有基本的注释,不知道你能不能看的懂。 参考技术A 我也来回答一下
/*程序中使用了operator作为变量,这是VC++的关键字,但不是TC的,要避免这种情况的发生,可以将关键字的颜色作标记,编程时就可避免。一般VC++缺省环境下关键字颜色会与一般的变量显示不同。*/
#include <stdio.h>
int main(void)
char c;
int operand1, operand2, res;
int repeat, ri;
scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++)
scanf("%d", &operand1);
c=getchar();
res=operand1;
while(c != '=')
scanf("%d", &operand2);
switch(c)
case'+':res=res+operand2;break;
case'-':res=res-operand2;break;
case'*':res=res*operand2;break;
case'/':res=res/operand2;break;
c= getchar();
printf("%d\n", res);
以上是关于你好,C语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?的主要内容,如果未能解决你的问题,请参考以下文章