C语言高手,我要用c编写个小程序。可以实现的功能是:四则运算还有无数的括号,只要输入数字就可以算出结

比如:20+((4*5)-3)/5*7-30.....,只要输入数字,就可以出结果。呜呜,帮帮忙,小妹一测试人员,对于这个比较痛苦,多谢!悬赏分100

#include<iostream>
using namespace std;
class calculator
{
public:
char token;
int exp( void );
int term( void );
int factor( void );
void match( char expectedToken );
void error( void );
};
int calculator::exp(void)
{
int temp = term(); /*计算比加减运算优先级别高的部分*/
while (( token == '+' ) || ( token == '-' ))
switch ( token )
{
case '+':
match('+'); /*加法*/
temp += term();
break;
case '-':
match('-');
temp -= term(); /*减法*/
break;
}
return temp;
}
int calculator::term( void )
{
int div; /*除数*/
int temp = factor(); /*计算比乘除运算优先级别高的部分*/
while (( token == '*' ) || ( token == '/' ))
switch ( token )
{
case '*':
match('*'); /*乘法*/
temp *= factor();
break;
case '/':
match('/'); /*除法*/
div = factor();
if ( div == 0 ) /*需要判断除数是否为0*/
{
fprintf(stderr, "除数为0.\n" );
exit(1);
}
temp /= div;
break;
}
return temp;
}

int calculator::factor( void )
{
int temp;
if ( token == '(' ) /*带有括号的运算*/
{
match( '(' );
temp = exp();
match(')');
}

else if ( isalnum(token)) //实际的数字
{
ungetc( token, stdin ); //将读入的字符退还给输入流
scanf( "%d", &temp ); //读出数字
token = getchar(); //读出当前的标志
}
else error(); //不是括号也不是数字
return temp;
}

void calculator::match( char expectedToken ) //对当前的标志进行匹配
{
if ( token == expectedToken ) token = getchar(); //匹配成功,获取下一个标志
else error(); //匹配不成功,报告错误
}

void calculator::error( void ) //报告出错信息的函数
{
cout<< "输入有错误"<<endl;
exit( 1 );
}

int main ()
{
cout<<"================================================================\n";
cout<<"* 递归实现的四则运算表达式求值程序 *\n";
cout<<"****************************************************************\n";
cout<<"使用方法:请从键盘上直接输入表达式,以回车键结束.如45*(12-2)[回车]\n";
cout<<"*****************************************************************\n\n";
int result; //运算的结果
cout<<"请输入表达式: ";
calculator c1;
c1.token = getchar(); //载入第一个符号
result = c1.exp(); //进行计算
if ( c1.token == '\n' ) // 是否一行结束
cout<< " >> 表达式的计算结果为 : "<<result<<endl;
else c1.error(); //出现了例外的字符
return 0;
}

不过是C++的,差不多了。
直接输入算式就可以给出结果,在gcc3.4.5下编译通过,vc我没有试过
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-25
你说的那不就是计算器吗?
第2个回答  2008-12-25
你说的是固定格式还是要输入数字和括号?
固定数字容易,输入带括号繁一些,但也能做
第3个回答  2008-12-25
这个要用栈 挺难写的……

C语言高手来一下帮我编个小程序
首先,我可以用字符串来做。我现在先把代码贴上:include <stdio.h> int main(){ char *str , *ch , *c[] = {"个位为:" , "十位为:" , "百位为:" , "千位为:" , "万位为:"};scanf("%s",str);int i = 0 ;\/\/要求1.求出它是几位数 printf("此数为%d位数\\n",(sizeo...

C语言高手帮编个小程序?
flushall();scanf("%c",&flag);} } if(flag=="n")break;} }

谁能用C语言帮我写几个小程序 急求
int main(){ int max(int x,int y,int z);int a,b,c,d;scanf("%d%d%d",&a,&b,&c); \/\/scanf%d间不能有逗号,后面是输入的地址因此得加& d=max(a,b,c); \/\/输入的是abc,不是x,y,z\/\/x,y,z是形参a,b,c是实参 printf("max=%d",d);\/\/不是print是printf return 0;} in...

用C语言写一个小程序!
int c;char ch[4]="",ch1[16]="",chtime[12]="",chshop[16],chmoney[8];pp:clrscr();sum=0.0;gotoxy(1,1);printf("|---|");gotoxy(1,2);printf("| money management system(C1.0) 2000.03 |");gotoxy(1,3);printf("|---...

用C语言编一个简单的计算器小程序
其他的运算:include <stdio.h> int add(int x,int y) {return x+y;} int sub(int x,int y) {return x-y;} int mul(int x,int y) {return x*y;} int div(int x,int y) {return x\/y;} int (*func[])()={add,sub,mul,div};int num,curch;char chtbl[]="+-...

怎样用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器?
用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器的方法:1、打开visual C++ 6.0-文件-新建-文件-C++ Source File;2、输入预处理命令和主函数:include<stdio.h> \/*函数头:输入输出头文件*\/ void main()\/*空类型:主函数*\/ 3、定义变量:int a,b,d; \/*定义变量的数据类型为...

求c语言大佬帮助!帮我写个小程序,谢谢
int n);\/\/在屏幕上输出数组各元素的值(逗号分隔)#define N (10)int main(){ int a[N],b[N],c[N*2],i; srand(time(NULL)); Init(a,N); Print(a,N); Short(a,N); Print(a,N); Init(b,N); Print(b,N); Short(...

怎么用c语言编写一个小程序?
1、首先打开DEV C++软件,点击“新建源代码”,在编辑页面输入以下代码。2、因为题目要求我们先输入一个整数,所以在定义变量时,就应该将其定义为整数型,注意,在输入,输出函数中,整数型对应的是“%d”。3、接下来就要对输入的整数进行判断,在C语言中,if是判断语句,所以用它来对整数进行判断。if...

c语言小程序例题, 大师看看。怎么办?
1.5 大写转小写:输入一个大写英文字母,输出相应的小写字母。实验二 分支结构 2.1 显示成绩:输入学生的数学成绩,若低于60输出“Fail”,否则输出“Pass”。2.2 找最小值:输入四个整数,输出其中的最小值。2.3 求三角形:输入三角形的三条边,计算面积和周长(保留两位小数);若不构成三角形...

用c语言编写一个小程序
include <stdio.h>void main() {int n,m = 0;scanf("%d",&n);while(n){printf("%d ",n%10);m = m*10 + n%10;n = n\/10;}printf("\\n%d\\n",m);}

相似回答