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

作者&投稿:学垂 (若有异议请与网页底部的电邮联系)
用C实现一个四则运算程序~

可以根据式子生成一棵树,优先级越高的运算符越接近leaf节点,然后计算就可以了

such as:1+2*3
+
/ \
1 *
/ \
2 3

#include
#include "windows.h"
main()
{
char Exp[1024]={0},Oper[100]={0};
int Num[200]={0},Expi=0,Operi=0,Numi=0;
boolean isnum=FALSE;
printf("input a Expression:");
scanf("%s",Exp);
while(Exp[Expi]!='\0')
{
switch(Exp[Expi]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
Num[Numi]=Num[Numi]*10+Exp[Expi]-'0';
isnum=TRUE;
break;
}

case '+':
case '-':
{
if(isnum) //又录入一个新数据
{
Numi++;
isnum=FALSE;
}
while(Operi!=0&&Oper[Operi-1]!='(')
{
if(Operi<1||Numi<2)
{
printf("Expression is error!
");
exit(0);
}
switch(Oper[Operi-1]) {
case '+':
Num[Numi-2]=Num[Numi-2]+Num[Numi-1];
Num[Numi-1]=0;
Numi--;
Oper[Operi-1]='\0';
Operi--;
break;
case '-':
Num[Numi-2]=Num[Numi-2]-Num[Numi-1];
Num[Numi-1]=0;
Numi--;
Oper[Operi-1]='\0';
Operi--;
break;
case '*':
Num[Numi-2]=Num[Numi-2]*Num[Numi-1];
Num[Numi-1]=0;
Numi--;
Oper[Operi-1]='\0';
Operi--;
break;
case '/':
Num[Numi-2]=Num[Numi-2]/Num[Numi-1];
Num[Numi-1]=0;
Numi--;
Oper[Operi-1]='\0';
Operi--;
break;
}
}
Oper[Operi]=Exp[Expi];
Operi++;
break;
}

#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我没有试过

你说的那不就是计算器吗?

你说的是固定格式还是要输入数字和括号?
固定数字容易,输入带括号繁一些,但也能做

这个要用栈 挺难写的……


哪位C语言高手帮我做一个小程序
include <stdio.h> include <stdlib.h> include <string.h> include <memory.h> include <conio.h> include #define N 1000struct Hotel { \/\/房号 int RoomNo;\/\/客房类型 char RoomType[20];\/\/客房价格 float RoomRate;\/\/空闲情况 bool IsEmpty;\/\/客人姓名 char TName[20];\/\/客人身份...

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

C语言高手帮忙编个程序吧 急用!!!我们要做个单片机控制液位的系统...
看到你的流程图,我在公司里面按照你的流程图写了一个实现的程序,按照流程走已经实现,不过单片机的数据通道你应该可以自己打开吧,以及把单片机传感器上获得的值给我写的那些参数就可以了,自己去实现以下就可以了,我用的C++写的,你可以把预处理文件改称C,更具自己的编译器来吧 include <iostream> ...

高手们,帮我编几个c语言的小程序!!谢谢.明天就要交!!
3.编一C程序,它能读入两个整数m与n,计算并输出m与n的绝对值的最大公约数及最小公倍数 解:源程序如下:int gys (int x,int y){ int j;j=(x<y)?x:y;for(;j>0;j--)if(x%j==0&&y%j==0)break;else continue;return (j);} int gbs (int z,int w){ int i;i=(z>w)?

哪个高手告诉我用C语言怎么编“从键盘上输入一个正整数,计算该数的各...
include<stdio.h> void main(){ int a,s;s=1;printf("请输入一个整数");scanf("%d",&a);while (a>0){ s=s*(a % 10);a=a\/10;} printf("a=%d",s);}

C语言高手 请告诉我几道简单的题! 我想搞明白 谢谢
3.C 第一次调用fun函数的时候,fun(a+fun(d)) 应该是在进入参数(a+fun(d)) 的时候遇到fun(d)这时,由于还没有执行static int d=5 所以 ,传递进去的参数p(也就是d)依然为1 ,然后再执行 d+=p;这时输出的d就等于6 之后再执行fun(a+fun(d)) 要再进入外层的fun函数 这时参数p就等于a+...

麻烦C语言高手帮我写个程序~~谢谢啊!
int Locate(Graph G,char c){ for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c) return i;return -1;} void CreateUDN(Graph &G){ int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和边数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar();G.vexs=(char *)...

急需单片机高手帮忙用C语言写一个单片机4个灯轮流闪亮的源程序。 详...
L3=1; \/\/第三盏灯亮 delay(100); \/\/调用延时子程序 L4=1; \/\/第四盏灯亮 delay(100); \/\/调用延时子程序 while(1); \/\/这里我用了个死循环,目的程序只运行一次,如果需要自动重新运行,可以把这句删掉 } 纯手工书写,并仿真调试过,记得加分哟~...

C语言程序:高手们,帮我看个题
include<stdio.h> int main()\/\/这里不需要分号 正确的程序如下:{ int power(int x,int n); \/\/声明要调用的函数。int x,n,s; \/\/如果是相同类型的变量,使用逗号分隔,最后才是分号 scanf("%d%d",&x,&n); \/\/需要输入啊,或者赋值啊 s=power(x,n); \/\/每个语句后面用分号结...

用c语言如何编写一个比较两个数大小的程序
代码如下:include <stdio.h> int main(){ int a=0,b=0;scanf("%d %d",&a,&b);if(a>b)printf("%d > %d\\n",a,b);else if (a<b)printf("%d < %d\\n",a,b);else printf("相等\\n");return 0;} 分析:定义两个变量,然后输入它们,用if判断它们的大小然后用输出语句输出结果...

阜阳市13051635065: 想用c语言设计一个简单小程序,求代码. -
方鲁盐酸: #include<stdio.h> int main() { float hour; printf("How many hours did you excise?\nPlease input it ^_^ :"); scanf("%f",&hour); //输入函数中“”内不能加\n; bool a,b; a=hour>=0.5; b=hour<=1; if(a&&b)//判断时候,因为a和b本身就是Bool型,直...

阜阳市13051635065: 用c语言写一个小程序,超级小 -
方鲁盐酸: #include<stdio.h>#include<string.h>#include<stdlib.h>char c[81];int main(){ printf("wve==>"); while(gets(c)) { if(strcmp(c,"exit")) { printf("do it\nwve==>"); } else { exit(0); } } return 0;}

阜阳市13051635065: 用C 语言 程序怎样编写一个小程序 工具 -
方鲁盐酸: 例子程序如下: void main() {int a,b,c;a=5;b=6;c=a+b; }

阜阳市13051635065: 帮忙用C语言编写一个小程序 -
方鲁盐酸: int yearmore(int y) { if((y%4==0 && y%100!=0) || y%400==0) return 1; else return 0; } 全程序如下: #include <stdio.h> int days(int y,int m,int d) { int i,mm; int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if((y%4==0 && y%100!=0) || y%400==0) ...

阜阳市13051635065: C语言小程序! -
方鲁盐酸: char c,password[8]; int i=0; while(i<8) { c=char(getch()); if(int(c)==13) //敲入回车 break; if(int(c)<58&&int(c)>47||int(c)>64&&int(c)<91||int(c)>96&&int(c)<123) { cout<<'*'; password[i]=c; i++; } } password[i]='\0'; 该段函数在试验时发现:当输入...

阜阳市13051635065: 求高手帮忙编个C语言小程序! -
方鲁盐酸: 既然都在看考研题了,说明你对编程挺感兴趣,我就交流一下我的思路,希望对你有所帮助. 思路一:首先,我会建一个结点(带指针的结构体).不想输入该班人数那就定义一个结束标志end(end可以用一个数字来代替,这样写输入函数是也方便), do{提示信息;输入数据的函数;判断是否结束标志,是的话跳出;分配内存;写入数据;统计并记录频次}while(true);输出平均和频次. 思路二:当然,如果成绩数据不用保存的话,就不用建结点了,用一个temp来接收数据就就行.

阜阳市13051635065: 现在我想用C语言编写一段小程序,实现如下功能,请大神们帮忙啊~~~ -
方鲁盐酸: 为防抽,加行汉字:程序如下,比较简单.把你上面给的内容拷到一个文件里就行了.程序里的文件名你自己改下就OK了.#include<stdio.h> int main() { FILE* pFile = fopen("input.txt", "r"); FILE* pOut = fopen("out.txt", "w"); char ch; ...

阜阳市13051635065: 帮帮忙 用c语言编个小程序
方鲁盐酸: #include "stdio.h" int main(){ int a[100],n=0,i,d; while(scanf("%d",&d)!=EOF) a[n++]=d; for(i=0;i<n;i++) printf("%d\n",a[i]); return 0; }

阜阳市13051635065: 哪位编程高手帮我编写一个小程序,要求C语言,谢谢了
方鲁盐酸: #include <stdio.h> void main() { printf("Hello World!"); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网