用c程编写一个程序 可以从键盘输入一个公式,回车后得到结果
答案:3 悬赏:40
解决时间 2021-02-22 22:08
- 提问者网友:霸气大叔
- 2021-02-22 13:55
比如:2+44*0-7/7回车得1
最佳答案
- 二级知识专家网友:啵啵桃汀
- 2021-02-22 14:56
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include <conio.h>
char token[61];
int n=0;
void error(void)
{
printf("ERROR!\n");
exit(1);
}
void match(char expected)
{
if(token[n]==expected)
token[++n]=getchar();
else error();
}
double term(void);
double factor(void);
double exp(void)
{
double temp=term();
while((token[n]=='+')||(token[n]=='-'))
switch(token[n])
{
case'+':match('+');
temp+=term();
break;
case'-':match('-');
temp-=term();
break;
}
return temp;
}
double term(void)
{
double div;
double temp=factor();
while((token[n]=='*')||(token[n]=='/'))
switch(token[n])
{
case'*':match('*');
temp*=factor();
break;
case'/':match('/');
div=factor();
if(div==0)
{
printf("The divisor is zero!\n");
exit(1);
}
temp/=div;
break;
}
return temp;
}
double factor(void)
{
double temp;
char number[61];
int i=0;
if(token[n]=='(')
{
match('(');
temp=exp();
match(')');
}
else if(isdigit(token[n])||token[n]=='.')
{
while(isdigit(token[n])||token[n]=='.')
{
number[i++]=token[n++];
token[n]=getchar();
}
number[i]='\0';
temp=atof(number);
}
else error();
return temp;
}
main()
{
double result;
FILE *data=fopen("61590_4.dat","at");
if(data==NULL)
data=fopen("61590_4.dat","wt");
if(data==NULL)
return 0;
token[n]=getchar();
result=exp();
if(token[n]=='\n')
{
token[n]='\0';
printf("%s=%g\n",token,result);
fprintf(data,"%s=%g\n",token,result);
}
else error();
fclose(data);
getch();
}
#include<ctype.h>
#include<stdlib.h>
#include <conio.h>
char token[61];
int n=0;
void error(void)
{
printf("ERROR!\n");
exit(1);
}
void match(char expected)
{
if(token[n]==expected)
token[++n]=getchar();
else error();
}
double term(void);
double factor(void);
double exp(void)
{
double temp=term();
while((token[n]=='+')||(token[n]=='-'))
switch(token[n])
{
case'+':match('+');
temp+=term();
break;
case'-':match('-');
temp-=term();
break;
}
return temp;
}
double term(void)
{
double div;
double temp=factor();
while((token[n]=='*')||(token[n]=='/'))
switch(token[n])
{
case'*':match('*');
temp*=factor();
break;
case'/':match('/');
div=factor();
if(div==0)
{
printf("The divisor is zero!\n");
exit(1);
}
temp/=div;
break;
}
return temp;
}
double factor(void)
{
double temp;
char number[61];
int i=0;
if(token[n]=='(')
{
match('(');
temp=exp();
match(')');
}
else if(isdigit(token[n])||token[n]=='.')
{
while(isdigit(token[n])||token[n]=='.')
{
number[i++]=token[n++];
token[n]=getchar();
}
number[i]='\0';
temp=atof(number);
}
else error();
return temp;
}
main()
{
double result;
FILE *data=fopen("61590_4.dat","at");
if(data==NULL)
data=fopen("61590_4.dat","wt");
if(data==NULL)
return 0;
token[n]=getchar();
result=exp();
if(token[n]=='\n')
{
token[n]='\0';
printf("%s=%g\n",token,result);
fprintf(data,"%s=%g\n",token,result);
}
else error();
fclose(data);
getch();
}
全部回答
- 1楼网友:duile
- 2021-02-22 17:42
把一般的表达式捋成逆波兰式然后计算 ...
之前写过一个类似的程序 ... 吃饭先 ...
回来如果还没人答我给你写出来 ...
- 2楼网友:专属的偏见
- 2021-02-22 16:07
不介意的话你的代码应写成
#include "stdio.h"
#define n 6
void main ( )
{char c [n];
int i=0;
for (; icdef时有
c[0]=a、c[1]=b、c[2]=、c[3]=c、c[4]=、c[5]=d 所以e、f没有存储到数组中去,最后一个为输入的结束标志
因此结果为
ab
c
d
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯