| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1511 人关注过本帖
标题:[求助]表达式求结果
只看楼主 加入收藏
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
 问题点数:0 回复次数:19 
[求助]表达式求结果

用键盘输入一个表达式,求出结果.(里面可以有括号,运算符为三个)

例:(1+2)*3-5

算出它的结果.望大哥们给出源码,谢谢!

[此贴子已经被作者于2004-08-23 00:13:55编辑过]

搜索更多相关主题的帖子: 结果 表达 运算符 键盘 
2004-08-23 00:13
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
呵呵,这个要用到栈

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-23 19:24
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

代码很难看的(如果是作业,求代码可不是个好习惯),还是给算法吧。

建立两个栈——数据栈和符号栈,把算式以字符串形式输入,

顺序入栈,注意以下优先级就可以了


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-23 19:41
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
大哥,懂了一点点,不过还是写不出代码,能写出来我看一下吗?

2004-08-24 15:45
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

#include <math.h> #include <stdio.h> #define MAX 100 /*四则运算程序,本程序用分数计算思想,给出分数和小数两种解*/ typedef struct num{long n1;long n2;}num; /*本程序定义的分数数据类型,n1为分子,n2为分母*/

typedef struct stack{int top;num data[MAX];}stack;stack *table2,*table1;/*栈的结构*/

void max(num *s) /*约分函数*/ {long a=s->n1,b=s->n2; long ma; long mi;long t; a=abs(a);b=abs(b); if(a>b){ma=a;mi=b;} else {ma=b;mi=a;} if(a){ for(t=mi;t>1;t--) {if((mi%t==0)&&(ma%t==0))break; } s->n1=(s->n1/t)*(s->n2/t)/abs(s->n2/t);s->n2=abs(s->n2/t);}}

stack *creat() /*创建一个空栈*/ { stack *head; head=(stack*)malloc(sizeof(stack));head->top=0;if(!head)printf("wrong"); return head;}

int push(stack *head,num *n) /*进栈函数*/ {if(head->top==MAX)return 0; else {head->data[head->top].n1=n->n1;head->data[head->top].n2=n->n2;head->top++;} return 1;}

num *pop(stack *head) /*出栈函数*/ {if(head->top==0)printf("error11"); else {head->top--;return &head->data[head->top];}}

void destory(stack *head) /*销毁一个栈*/ {free(head);}

num *get(stack *head){return &head->data[head->top-1];} /*返回栈顶元素*/

int empty(stack *head){if(head->top==0)return 1;else return 0;} /*判断栈是否为空*/

num *oprate(num *a,num *b,num *e) /*oprate()为计算函数,用于分数计算 */ {num *s=(num*)malloc(sizeof(num));long e2=e->n1,d=b->n1; if(e2=='+'){s->n1=(a->n1)*(b->n2)+(a->n2)*(b->n1);s->n2=(a->n2)*(b->n2);max(s);} if(e2=='-'){s->n1=(a->n1)*(b->n2)-(a->n2)*(b->n1);s->n2=(a->n2)*(b->n2);max(s);} if(e2=='*'){s->n1=(a->n1)*(b->n1);s->n2=(a->n2)*(b->n2);max(s);} if(e2=='/'){s->n1=(a->n1)*(b->n2);s->n2=(a->n2)*(b->n1);max(s); } return s;}

void put() {num *a,*b,*e; if(get(table1)->n1=='*'||get(table1)->n1=='/') {a=pop(table2);b=pop(table2);e=pop(table1);a=oprate(b,a,e); push(table2,a);put();} }

main(){char data[100];int i,j=0;num a[100],*answer,*x1,*x2,*e,*ss;float an,a1,a2; printf("请输入算式,按回车结束:\n"); gets(data); for(i=0;data[i-1]!='\0';i++)printf("%c",data[i]);printf("="); table1=creat(); table2=creat(); for(i=0;data[i-1]!='\0';i++){if(data[i]>='0'&&data[i]<='9'){a[j].n1=10*a[j].n1+data[i]-'0';a[j].n2=1; } else {if(i)j++;a[j].n1=data[i];a[j].n2=0; if(data[i+1]>='0'&&data[i+1]<='9')j++;}} /*从新组合*/

for(i=0;i<j;i++) {if(!a[i].n2){ push(table1,&a[i]); if(get(table1)->n1==')'){pop(table1); while(get(table1)->n1!='('){x1=pop(table2);x2=pop(table2);e=pop(table1);x1=oprate(x2,x1,e); push(table2,x1);}/*while*/pop(table1);put();}}/*if*/ else{ push(table2,&a[i]);put(); }/*else*/}/*for*/ while(!empty(table1)&&!empty(table2)) {x1=pop(table2);x2=pop(table2);e=pop(table1);x1=oprate(x2,x1,e); push(table2,x1);} answer=pop(table2);a1=answer->n1;a2=answer->n2;an=a1/a2; if(answer->n2==1){printf("%ld",answer->n1);getch();}

else { printf("%ld/%ld=%f",answer->n1,answer->n2,an);getch();} }

[此贴子已经被作者于2004-08-25 08:48:05编辑过]


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-24 17:42
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

纯支持……

2004-08-24 20:05
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
支持什么啊?支持看不懂还是支持乌鸦程序写错了?

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-24 21:20
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
以下是引用knocker在2004-08-24 21:20:19的发言: 支持什么啊?支持看不懂还是支持乌鸦程序写错了?

写错了?好像没啊。(我测试过的啊)

只是功能比要求的多了点而以啊。


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-24 21:52
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

请输入算式,按=号回车结束: (1+3)-1*5= =-1073732968/582090983=-1.844614

请输入算式,按=号回车结束: 12/12= =-1073732968/582090983=-1.844614

请输入算式,按=号回车结束: 1+1+1+1+1= =-1073732968/582090983=-1.844614


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-24 22:10
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

我年纪大了,没心机看so long的代码,除了非常使用的以外。

呵呵,忘了问呢,knocker多大了?乌鸦呢?

2004-08-24 23:11
快速回复:[求助]表达式求结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019925 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved