首页 新闻 会员 周边

急求 课程设计代码 C++ 写的啊

0
悬赏园豆:100 [待解决问题]

利用栈求表达式的值,可供小学生作业,并能给出分数。 

要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。 

朱婷婷的主页 朱婷婷 | 初学一级 | 园豆:84
提问于:2011-12-05 16:36
< >
分享
所有回答(2)
0

这个工程有点大  如果有人专门做这个要花费几个小时

菜中菜 | 园豆:123 (初学一级) | 2011-12-05 21:39
0

#include<stdio.h>

#include<stlib.h>

#include<string.h>

#define NUULLO

#define Ok 1

#define ERROR -1

#define STACK_INIT_SIZE  100

#define STACKINCREMENT 20//定义字符类型栈

typedef struct{

int stracksize;

char *base;

char *top;

}

Stack;//定义整形栈

typedef struct{

int stacksize;

int *base,*top;

}

Stack;

Stack OPTR;//定义运算符栈

Stack OPND;//定义操作数栈

char expr[200]=" ";//存放表达式串

char *ptr=expr;

Int InitStack(Stack *s//构造运算符栈

{s->base=(char*)malloc(STACK_INIT_SIZE*sizeof((char));

if(!s->base)return ERROR;

s->top=s->base;

s->stacksize=STACK_INIT_SIZE;

return OK;

}

int InitStack 2(stack2 *s)//构造操作数栈

{{s->base=(int*)malloc(STACK_INIT_SIZE*sizeof((int));

if(!s->base)return ERROR;

s->stacksize=STACK_INIT_SIZE;

s->top=s->base;

return OK;

}

int Push(Stack *s,char ch)//运算符栈插入以ch为新的栈顶元素

{

*s->top=ch;

s->top++;

return 0;

}

int Push2(Stack2*s,int ch)//操作数栈插入以ch为新的栈顶元素

{*s->top=ch;

s->top++;

return 0;

}

char Pop(Stack*s)//删除运算符栈S的栈顶元素,用p返回其值

{

char p;

s->top--;

p=*s->top;

return p;

}

int Pop2(Stack2*s)//删除操作数栈S的栈顶元素,用p返回其值

{

int p;

s->top--;

p=*s->top;

return p;

}

char GetTop(Stack s)//p返回运算符栈的栈顶元素

{char p=*(S.top-1);

return p;

}

int GetTop(Stack s)//p返回操作数栈的栈顶元素

{int p=*(S.top-1);

return p;

}

//判断运算符优先级返回优先级高的

char Precede(char c1,char c2)

{int i=0,j=0;

static char array[49]={

'>','>','<','<','<','>','>',

'>','>','<','<','<','>','>',

'>','>','>','>','<','>','>',

'>','>','>','>','<','>','>',

'<','<','<','<','<','=','!',

'>','>','>','>','!','>','>',

'<','<','<','<','<','!','=',

};

switch(c)//iarray的横标

{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(2)//jarray的纵标

{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;

}

return(array[7*i+j];//返回运算符

}

int Operate(int a,char op,int b)

{switch(op)

{case'+': return(a+b);

case'-':return(a-b) ;

case'*':return(a*b);

case'/':return(a/b);

 }

return 0;

}

int num(int n)//返回操作数的长度

{char p[10];

itoa(n,p,10);//把整形转换成字符型

n=strlen(p);

return n;

}

int Eval Expr()//主要操作函数

{char c,theta,x;

int n,m;

int a,b;

c-*ptr++;

while(c!='#'//GetTop(OPTR)!='#')

{if(!In(c))

{if(!In(*(ptr-1))) ptr=ptr-1 ;

m=atoi(ptr);

n=num(m);

Push2(&OPND,m);

ptr=ptr+n;

c=*ptr++;

}else

switch(Precede(GetTop(OPTR),c))

{

case'<':Push(&OPTR,c);

c=*ptr++;

Break;

case'=':x=Pop(&OPTR);

c=*ptr++;

break;

case'>':theta=Pop(&OPTR);

b=Pop2(&OPND);

a=Pop2(&OPND);

Push2(&OPND,Opearate(a,theta,b));

break;

}

}

return GetTop2(OPND);

}

int main()

{

printf("请输入以#结尾的算术表达式");

Do{

gets(expr);

}

while(!*expr);

InitStack(&OPTR);//初始化运算符栈

Push(&OPTR,'#';//#压入栈底

InitStack2(&OPND);//初始化操作数栈

printf("表达式结果为:%d\n",EvalExpr());

return 0;

}

 

 

 

 

 

 

 

 

朱婷婷 | 园豆:84 (初学一级) | 2012-06-02 15:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册