| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1513 人关注过本帖
标题:[求助]表达式求结果
只看楼主 加入收藏
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

改过来了,哎……

应该是输入“回车结束”,还有些漏洞——害我查了半小时……

我才高二呢。


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-08-25 08:47
天地一沙鸥
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2004-8-14
收藏
得分:0 

其实可以不用栈,这种问题最好都把他们转成字符串来操作。判断字符串中的字符,并且按照 “先*/ 后 +- 如果有()先算里面的” 的法则进行即可


鸟凄声以孤归, 兽索偶而不还。 悼当年之晚暮, 恨兹岁之欲殚。 思宵梦以从之, XXX而不安; 若凭舟之失棹, 譬缘崖而无攀。 /img/assets/200401/200401061015134010607.jpg" border="0" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://joke./img/assets/200401/200401061015134010607.jpg');}" onmousewheel="return imgzoom(this);" alt="" />
2004-08-25 09:38
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分: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 ; } /*判断栈是否为空*/

/*oprate()为计算函数,用于分数计算 */ num*oprate(num*a,num*b,num*e) { 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(); }

}


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-08-25 10:17
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
谢谢大哥们有顶力支持,不过代码确实太长……

2004-08-28 15:13
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
收藏
得分:0 
以下是引用天地一沙鸥在2004-08-25 09:38:13的发言:

其实可以不用栈,这种问题最好都把他们转成字符串来操作。判断字符串中的字符,并且按照 “先*/ 后 +- 如果有()先算里面的” 的法则进行即可

不知道你是如何实现的?我想既然要判断优先级那就必须要用到栈吧

我的主页 http://www.
2004-08-29 08:51
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
代码太长,在电脑上看不下去,如果在书上倒还能耐心的看一下,有没有简单点的啊?

2004-08-29 09:25
忆楠
Rank: 1
等 级:新手上路
帖 子:721
专家分:0
注 册:2004-7-5
收藏
得分:0 
以下是引用乌鸦丘比特在2004-08-23 19:41:03的发言:

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

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

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

同意 建议楼主以后不要发这种求代码的帖子 下次希望注意一下 可以把自己写的代码发上来

正确与错误不重要 重要的是你能学到东西 其实错了也没关系 大家给你纠正过来 你以后就不

会再犯这种错误了


点 鼠 标 , 救 饥 民 http://www./
2004-08-29 21:05
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

哦,下次一定努力了!


2004-08-30 09:11
xiyiwei
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2004-8-25
收藏
得分:0 

好郁闷 根本看不懂

丘比特 能给我解释一下 什么是栈吗? 而且字符串里的数字比如c=“789.123” 怎么赋给这个栈的? 我最多是把7赋给a[0] 把2赋给a[1] 根本没办法计算呀?

2004-09-01 13:25
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

我还是没弄明白算法,

不过我自己写了一个,直接在字符串中进行运算,代码已经完成,还没调试,过些时候调

试好了,发上来大家睢睢!


2004-09-19 19:27
快速回复:[求助]表达式求结果
数据加载中...
 
   



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

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