你好,C语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你好,C语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?相关的知识,希望对你有一定的参考价值。

题目18:用C语言设计一个简单的计算器,要求能够对输入的数
1.进行+,-,*,/,运算;
2.可以带括号( );
3.不限定运算式的输入长度.
(参考编译技术中语法分析原理)

#include<stdio.h>
#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语言设计一个简单的计算器 你以前在别人那回答的那个是对的么?的主要内容,如果未能解决你的问题,请参考以下文章

c语言设计一个简单的计算器程序

声明那回事儿

C语言中的回调函数(Callback Function)

C语言中的回调函数(Callback Function)

求2011年九月以及以前的计算机二级考试C语言试题及答案、以及考试内容分析和解题技巧。记住只要C的。

C语言程序设计题目:学生信息管理系统设计