求一个C语言算术表达式求值程序

要能运行的,算术表达式比如3*(6-2)/4是任意输入表达式,那个只是个比方,谢谢快啊我急,能运行的程序在追加200分4楼的17行有错啊,快调试哈340就是你的了5楼的也... 要能运行的,算术表达式比如3*(6-2)/4
是任意输入表达式,那个只是个比方,谢谢 快啊 我急,能运行的程序在追加200分
4楼的17行有错啊,快调试哈340就是你的了
5楼的也运行不出来,郁闷
快啊,在线等答案,能运行的我410分全给他了
6楼的除法有问题啊,+ - *还可以 6楼的我也能运行,但除法有问题,3*10/5就不行
展开
 我来答
qcxangel
推荐于2016-02-26 · TA获得超过214个赞
知道答主
回答量:142
采纳率:0%
帮助的人:104万
展开全部
我的能运行!!但表达式末尾加要加#
例如2+3要打2+3#
#include<cstdio>
#include<malloc.h>
#define NULL 0
typedef struct node{
char date;
struct node *next;
}SNode;

SNode *InitStack(){
SNode *top;
top=(SNode *)malloc(sizeof(SNode));
top->next=NULL;
return top;
}
void PushOptr(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;

}
char PopOptr(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
void PushOpnd(SNode *top,char x){
SNode *p;
p=(SNode *)malloc(sizeof(SNode));
p->date=x;
p->next=top->next;
top->next=p;
}
char PopOpnd(SNode *top){
SNode *p;
char x;
if(top==NULL)
return NULL;
p=top->next;
x=p->date;
top->next=p->next;
free(p);
return x;
}
char GetTop(SNode *top){

return (top->next)->date;
}
int In(char c){
int n;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':n=1;break;
default:n=0;break;
}
return n;
}
char Precede(char x,char y){
int i,j;
int form[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,0,2},{1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(x){
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(y){
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;
}
if(form[i][j]==1)
return '>';
else
if(form[i][j]==-1)
return '<';
else
return '=';

}
int Operate(char x,char z,char y){
int a=x-'0',b=y-'0';
switch(z){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
char Eval_Exp(){
char a,b,c,r,f,z;
int result;
SNode *top[2];
top[0]=InitStack();
PushOptr(top[0],'#');
top[1]=InitStack();
c=getchar();
while(c!='#'||(GetTop(top[0]))!='#'){
if(!In(c)){
PushOpnd(top[1],c);
c=getchar();
}
else{
r=Precede(GetTop(top[0]),c);
switch(r){
case '<':PushOptr(top[0],c);
c=getchar();
break;
case '=':PopOptr(top[0]);
c=getchar();
break;
case '>':b=PopOptr(top[0]);
a=PopOpnd(top[1]);
z=PopOpnd(top[1]);
result=Operate(z,b,a);
f=result+'0';
PushOpnd(top[1],f);
break;
}

}
}
return f;
}
void main(){
char result;
result=Eval_Exp();
printf("%d\n",result-'0');

}
80后码字猴
2008-05-07 · 超过19用户采纳过TA的回答
知道答主
回答量:124
采纳率:0%
帮助的人:71.8万
展开全部
/* 此 程序的功能是求出用户输入的整形表达式(可以是多位数的)的值20-10-07 17:43*/

#include <stdio.h>
#define MAXSIZE 16

typedef struct{
int data[MAXSIZE];
int top;
int base;
}seqstack; /* 顺序栈的定义*/
/*以下为函数声明*/
void InitStack(seqstack *);
int Empty(seqstack *);
void Push(seqstack *, int );
int Pop(seqstack *);
int GetTop(seqstack *);
int Operate(int ,char ,int );
char Proceed(char ,char );
int In(char );
int EvalExpres(void);
/* 定义两个栈分别存放运算符和操作数*/
seqstack StackR,StackD;
/*主函数*/
int main()
{
int v;
char ch;
while(1)
{
printf("\t@@@@@@@@本程序的功能为:用顺序栈实现整型算术表达式的求值@@@@@@@@\n");
printf("\t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-20-10-07 17:47-@@@@@@\n");
v = EvalExpres();
printf("The result is:%d",v);
/*以下为程序控制*/
printf("\nInput 'q' to quit and ENTER run again:");
do{
scanf("%c",&ch);
if(ch == 'q' || ch == 'Q')
exit(0);
}while(ch!='\n');
system("cls");
}
return 0;
}

void InitStack(seqstack *s)
{ s->top = 0;
s->base = 0;
} /* 初始化栈*/

int Empty(seqstack *s)
{ if(s->top == s->base)
return 1;
else
return 0;
} /* 判断栈是否为空*/

void Push(seqstack *s, int x)
{
if(s->top == MAXSIZE)
{ printf("OVER FLOW!\n");
exit(0);
}
else
{ s->data[s->top] = x;
s->top++;
}
} /* 进栈 */

int Pop(seqstack *s)
{ int e;
if(Empty(s))
{ printf("Under flow!\n");
return 0;
} /* 下溢*/
else
{ s->top--;
e = s->data[s->top];
return e;
}
} /* 出栈*/

int GetTop(seqstack *s) /*取栈顶元素*/
{
if(Empty(s))
{ printf("Under flow!\n");
return 0;
}
else
return s->data[s->top-1];
}

int EvalExpres(void) /* 表达式求解函数*/
{
int a,b,i=0,s=0;
char c[80],r;
InitStack(&StackR);
Push(&StackR,'#');
InitStack(&StackD);
printf(" 请输入表达式并以‘#’结束:");
gets(c);
while(c[i]!='#' || GetTop(&StackR)!='#')
{
if(!In(c[i])) /* 判断读入的字符不是运算符 是则进栈*/
{ if(c[i] >= '0' && c[i] <= '9')
{
s += c[i]-'0';
while(!In(c[++i])) /*此处实现的功能为当输入的数字为多位数时*/
{ s*=10;
s += c[i]-'0';
}
Push(&StackD,s+'0');
s = 0;
}
else
{
printf("你输入的表达式有误!\n");
return 0;
}
}
else
switch(Proceed(GetTop(&StackR),c[i])) /* 此函数用来比较读取的运算符和栈顶运算符的优先级*/
{
case '<': /* 栈顶的元素优先级高*/
Push(&StackR,c[i]);
i++;
break;
case '=': /* 遇到匹配的小括号时则去掉他*/
Pop(&StackR);
i++;
break;
case '>': /* 栈顶的优先级低则出栈并将结果写入栈内*/
r = Pop(&StackR);
a = Pop(&StackD)-'0';
b = Pop(&StackD)-'0';
Push(&StackD,Operate(a,r,b)) ;
break;
}
}
return (GetTop(&StackD)-'0'); /* 返回运算结果*/
}

int In(char c) /*问题2:解决In函数问题:判断C是否为运算符是返回1否则返回0*/
{
char ch[7]={'+','-','*','/','#','(',')'};
int i;
for(i = 0; i < 7; i++)
if(c == ch[i])
return 1;

return 0;
}

char Proceed(char op,char c) /*op为栈顶元素,c为当前读入的运算符,比较二者的优先级*/
{ /*问题1:解决Proceed函数*/
char ch;
if(op=='(' && c==')' || op=='#' && c=='#' )
ch = '=';
else
if(op=='+' || op=='-') /*栈顶元素为‘+’或‘-’的时候*/
switch(c)
{
case '+':
case '-':
case ')':
case '#': ch = '>'; break;
case '*':
case '/':
case '(': ch = '<';
}
else
if(op=='*' || op=='/') /*栈顶元素为‘*’或‘/’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case ')':
case '#': ch = '>'; break;
case '(': ch = '<';
}
else
if(op=='(') /*栈顶元素为‘(’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case '#': printf("Error!\n"); exit(0);
}
else
if(op==')') /*栈顶元素为‘)’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '#': ch = '>'; break;
case '(': printf("Error!\n"); exit(0);
}
else
if(op=='#') /*栈顶元素为‘#’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case ')': printf("Error!\n"); exit(0);
}
return ch;
}
/* 问题3:解决Operate函数*/
int Operate(int a,char r,int b) /*返回由aRb的值 */
{
int s;
int d1 = a;
int d2 = b; /*把字符ab变为对应数字*/
switch(r)
{
case '+': s = d1+d2; break;
case '-': s = d2-d1; break;
case '*': s = d1*d2; break;
case '/': s = d2/d1;
}
return (s+'0');
}

/*自己注意看解释啊*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-05-07
展开全部
//---------------------------------------------------------------------------
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *read(int count)
{
char a;
static char * p;
if ((a=getchar())!='\n')
{
count++;
read(count);
}
else {
p=malloc(sizeof(char)*(count+1));
*(p+count)=0;
return p;
}
*(p+count-1)=a;
return p;

}
int isop(char a,char *b)
{
if (a>41&&a<44||a==45||a==47) {
*b=a;
return 1;
}
return 0;

}
void comp(float * a,float *b ,char c)
{
switch (c) {
case '+':*a+=*b;break;
case '-':*a-=*b;break;
case '*':*a*=*b;break;
case '/':*a/=*b;break;
default:
;
}
}
int main(int argc, char* argv[])
{
char *in,op;
unsigned int fr=0,len,i,ma=1,sk=1;
float a=0,b=0;
in=read(0);//读入表达式
len=strlen(in);
while (!isop(in[fr],&op)) //读入第一个操作数
{
if (in[fr]!='.'&&sk==1) a=a*10+in[fr++]-48;
else if (in[fr]=='.') {//处理小数点
sk=0;
ma=10;
fr++;
}
else if (sk==0) {
a=a+(float)(in[fr++]-48)/ma;
ma*=10 ;
}
}
ma=1;
sk=1;
for (i=fr+1; i<=len; i++) //读入其余操作数,并进行计算与输出
if (isdigit(in[i])&&sk==1){
b=b*10+(in[i]-48);
}
else if (in[i]=='.') {
sk=0;
//a=a+(in[fr++]-48)/ma;
ma=10;
}
else if (sk==0&&isdigit(in[i])) {
b=b+(float)(in[i]-48)/ma;
ma*=10 ;
}
else if (isop(in[i],&op)) {
sk=1;
ma=1;
if (op!='/'||op=='/'&& b!=0) {
comp(&a,&b,op);
b=0;
}
else {printf("ERROR!");break;}
}
else if (in[i]=='='||in[i]=='\0') {
if (op!='/'||op=='/'&& b!=0) {
comp(&a,&b,op);
printf("%s %g\n",in,a);
}
else printf("ERROR!");
break;
}
putchar('\n');
free(in);
system("pause");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xhs010202
2008-05-07 · TA获得超过5522个赞
知道大有可为答主
回答量:3632
采纳率:12%
帮助的人:1216万
展开全部
#include<stdio.h>
void main()
{
int x;
x=3*(6-2)/4;
printf("x=%d\n",x);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
59531391
2008-05-07
知道答主
回答量:11
采纳率:0%
帮助的人:0
展开全部
#include<stdio.h>
void main()
{
int x;
x=3*(6-2)/4;
printf("x=%d\n",x);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式