| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1198 人关注过本帖
标题:[求助]程序分析,得不到结果,结果为0?(我作了修改)
只看楼主 加入收藏
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
 问题点数:0 回复次数:11 
[求助]程序分析,得不到结果,结果为0?(我作了修改)

/*扫描一个算式如#2+5*(5+3)/2-8/9#后算出结果*/
基本思想是从左至右扫描表达式,并
按如下过程进行处理:
⑴ 置shu和fu为空栈;
⑵ 读入表达式的开始操作符c=‘#’,并进fu栈;
⑶ 读入表达式的下一个符号c;
⑷ c<>‘#’或者fu栈顶操作符也不是‘#’时,进行如下操作:
①若c是操纵数,则c进shu栈;
②若c是操作符,则比较它与fu栈顶操作符x的优先关系:
若x<c,则c进fu栈,并读入表达式的下一个符号c;
若x=c,则fu退栈,并读入表达式的下一个符号c;
若x>c,则从shu栈退出x所要求的操作数,x从fu栈退出,
并完 成x的计算,其结果进shu栈;
③重复⑷直到条件不成立;
⑸ 当c=‘#’,同时ops栈顶元素也是‘#’时,shu栈中仅有一个元素,
此即为表达式的值。


#define maxsize 20
typedef struct /*实数栈初始化*/
{
float fbase[maxsize];
int ftop;
}fstack;

typedef struct /*符号栈初始化*/
{
char cbase[maxsize];
int ctop;
}cstack;

void emptyfstack(fstack c) /*实数栈置空*/
{
c.ftop=-1;
}

int emptyf(fstack c) /*判断实数栈是否为空*/
{
if(c.ftop==-1)
return 1;
else
return 0;
}

void emptycstack(cstack c) /*符号栈置空*/
{
c.ctop=-1;
}

int emptyc(cstack c) /*判断符号栈是否为空*/
{
if(c.ctop==-1)
return 1;
else
return 0;
}

void pushfstack(fstack c,float e) /*数字入栈*/
{
if(c.ftop==maxsize-1)
printf("the stack is overflow\n");
else
c.fbase[++c.ftop]=e;
}

void pushcstack(cstack c,char e) /*符号入栈*/
{
if(c.ctop==maxsize-1)
printf("the stack is overflow\n");
else
c.cbase[++c.ctop]=e;
}

void popfstack(fstack c,float e) /*数字退栈*/
{
if(c.ftop==-1)
printf("the stack is underflow\n");
else
e=c.fbase[c.ftop--];
}

void popcstack(cstack c,char e) /*符号退栈*/
{
if(c.ctop==-1)
printf("the stack is underflow\n");
else
e=c.cbase[c.ctop--];
}

float getfstack(fstack c) /*取数字栈栈顶元素*/
{
float e;
if(emptyf(c))
printf("the stack is empty");
else
{
e=c.fbase[c.ftop];
return e;
}
}

char getcstack(cstack c) /*取符号栈栈顶无素*/
{
char e;
if(emptyc(c))
printf("the stack is empty");
else
{
e=c.cbase[c.ctop];
return e;
}
}

int priority(char c) /*符号优先级*/
{
switch(c)
{
case '#':return -1;
case ')':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
case '(':return 3;
default:return -1;
}
}

void oper(fstack a,cstack b,char c) /*操作数的操作*/
{
float v,v1,v2;char s;
if(priority(getcstack(b))<priority(c))
pushcstack(b,c);
else if(priority(getcstack(b))>=priority(c))
{
if(getcstack(b)=='+')
{popfstack(a,v1);popfstack(a,v2);v=v1+v2;pushfstack(a,v);}
else if(getcstack(b)=='-')
{popfstack(a,v1);popfstack(a,v2);v=v2-v1;pushfstack(a,v);}
else if(getcstack(b)=='*')
{popfstack(a,v1);popfstack(a,v2);v=v1*v2;pushfstack(a,v);}
else if(getcstack(b)=='/')
{popfstack(a,v1);popfstack(a,v2);v=v2/v1;pushfstack(a,v);}
else if(getcstack(b)=='(')
{
if(c==')')
popcstack(b,s);
else
pushcstack(b,c);
}
}
}

#include<stdio.h>
main()
{
fstack shu;
cstack fu;
char c[maxsize];
int i;
float x;
emptyfstack(shu);
emptycstack(fu);
printf("输入算式,开始结束以#号为标识:");
scanf("%s",c);
for(i=0;c[i]!='\0';i++)
{
if(c[i]>='0'&&c[i]<='9')
{
for(x=0.0;c[i]>='0'&&c[i]<='9';i++)
x=x*10+(c[i]-'0');
pushfstack(shu,x);
}
else if(emptyc(fu))
pushcstack(fu,c[i]);
else
oper(shu,fu,c[i]);
}
printf("%f",getfstack(shu));
getch();
}

[此贴子已经被作者于2006-4-2 12:31:52编辑过]

搜索更多相关主题的帖子: 程序分析 结果 得不到 
2006-03-26 11:16
梦想中国
Rank: 2
等 级:新手上路
威 望:5
帖 子:539
专家分:0
注 册:2006-2-26
收藏
得分:0 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INIT_STACK_SIZE 10
#define STACKINCREMENT 10
#define MAX 20
typedef struct{
char *cbase;
char *ctop;
int stacksize;
}Operator; //操作符栈
typedef struct{
int *nbase;
int *ntop;
int stacksize;
}Operand; //操作数栈


Operator InitOper(Operator Oper); //初始化操作符栈函数
Operand InitOpen(Operand Open); //初始化操作数栈函数
Operand Process(Operator Oper,Operand Open,char expression[],int len);
int GetNum(char c); //取操作数函数
Operand PushOpen(Operand Open,int dec); //把操作数压入操作数栈
int EmptyOper(Operator Oper); //判断操作符栈是否为空
Operator PushOper(Operator Oper,char c); //把操作符压入操作符栈
char Compare(Operator Oper,char c); //比较操作符的优先级
Operator PopOper(Operator Oper,char *e); //操作符出栈
Operand Arithmetic(Operand Open,char e); //计算操作数
Operand PopOpen(Operand Open,int *e); //操作数出栈
int EmptyOpen(Operand Open); //判断操作数栈是否为空
int LoopCompare(Operator Oper,char c,int *flag);

int main(void)
{
Operator Oper; //Oper代表操作符站栈
Operand Open; //Open代表操作数栈
char expression[MAX]; //表达式
int len;

Oper=InitOper(Oper); //初始化操作符栈
Open=InitOpen(Open); //初始化操作数栈
printf("Please input expression:\n"); //输入表达式字符串
scanf("%s",expression); //读取表达式字符串
len=strlen(expression); //求表达式字符串长度
Open=Process(Oper,Open,expression,len);
if(!EmptyOpen(Open)) //当操作数栈不空情况时,输出最后结果
printf("result=%d\n",*(--Open.ntop));
free(Oper.cbase);
free(Open.nbase);

return 0;
}

Operator InitOper(Operator Oper) //初始化操作符栈
{
if((Oper.cbase=(char *)malloc(INIT_STACK_SIZE * sizeof(char)))==NULL)
{
exit(1);
}
Oper.ctop=Oper.cbase;
Oper.stacksize=INIT_STACK_SIZE;

return Oper;
}

Operand InitOpen(Operand Open)
{
if((Open.nbase=(int *)malloc(INIT_STACK_SIZE * sizeof(int)))==NULL)
{
exit(1);
}
Open.ntop=Open.nbase;
Open.stacksize=INIT_STACK_SIZE;

return Open;
}

Operand Process(Operator Oper,Operand Open,char expression[],int len)
{
int i,dec,flag=1;
char e;

for(i=0;i<=len-1;i++)
{
if(expression[i] >= '0' && expression[i] <= '9')
{
dec=GetNum(expression[i]); //求得字符的十进制数
Open=PushOpen(Open,dec); //将十进制数压入操作数栈
}
else //当字符是操作符的情况下
{
if(EmptyOper(Oper)) //如果操作符栈为空情况
Oper=PushOper(Oper,expression[i]); //将当前操作符入栈
else
{ //操作符栈不空的情况下和操作符栈的栈顶元素相比较
switch(Compare(Oper,expression[i]))
{
case '>': //当前操作符的优先级高于栈顶操作符的优先级
Oper=PushOper(Oper,expression[i]); //将当前操作符入栈
break;
case '<':
Oper=PopOper(Oper,&e); //栈顶操作符出栈,此处需要个判断
Open=Arithmetic(Open,e); //计算操作数
while( LoopCompare(Oper,expression[i],&flag) && flag) //注意这里循环判断
{
Oper=PopOper(Oper,&e);
Open=Arithmetic(Open,e);
}
Oper=PushOper(Oper,expression[i]);
break;
}
}
}//else
}//for
while(!EmptyOper(Oper)) //处理操作符栈的剩余部分
{
Oper=PopOper(Oper,&e);
Open=Arithmetic(Open,e);
}

return Open;
}

int GetNum(char c)
{
char text[11]="0123456789";
int i;

for(i=0;i<=9;i++)
if(text[i]==c)
break;

return i;
}

Operand PushOpen(Operand Open,int dec)
{
*(Open.ntop++)=dec;
if(Open.ntop-Open.nbase >= Open.stacksize)
{
if((Open.nbase=(int *)realloc(Open.nbase,(Open.stacksize + STACKINCREMENT) * sizeof(int)))==NULL)
{
exit(1);
}
Open.ntop=Open.nbase+Open.stacksize;
Open.stacksize+=STACKINCREMENT;
}

return Open;
}

int EmptyOper(Operator Oper) //判断操作符栈是否为空
{
int flag=0;

if(Oper.ctop==Oper.cbase)
flag=1;

return flag;
}

Operator PushOper(Operator Oper,char c)
{
*(Oper.ctop++)=c;
if(Oper.ctop-Oper.cbase >= Oper.stacksize)
{
if((Oper.cbase=(char *)realloc(Oper.cbase,(Oper.stacksize + STACKINCREMENT) * sizeof(char)))==NULL)
{
exit(1);
}
Oper.ctop=Oper.cbase+Oper.stacksize;
Oper.stacksize+=STACKINCREMENT;
}

return Oper;
}

char Compare(Operator Oper,char c) //比较运算符优先级函数
{
if(c=='+' || c=='-')
return '<';
if(c=='*' || c=='/' || c=='%')
{
if(*(Oper.ctop-1)=='+' || *(Oper.ctop-1)=='-')
return '>';
else
return '<';
}
}

Operator PopOper(Operator Oper,char *e)
{
if(!EmptyOper(Oper))
*e=*(--Oper.ctop);

return Oper;
}

Operand Arithmetic(Operand Open,char e)
{
int v1,v2,result;

switch(e)
{
case '+':
Open=PopOpen(Open,&v1);
Open=PopOpen(Open,&v2);
result=v2+v1;
Open=PushOpen(Open,result);
break;
case '-':
Open=PopOpen(Open,&v1);
Open=PopOpen(Open,&v2);
result=v2-v1;
Open=PushOpen(Open,result);
break;
case '*':
Open=PopOpen(Open,&v1);
Open=PopOpen(Open,&v2);
result=v2*v1;
Open=PushOpen(Open,result);
break;
case '/':
Open=PopOpen(Open,&v1);
Open=PopOpen(Open,&v2);
result=v2/v1;
Open=PushOpen(Open,result);
break;
case '%':
Open=PopOpen(Open,&v1);
Open=PopOpen(Open,&v2);
result=v2%v1;
Open=PushOpen(Open,result);
break;
}

return Open;
}

Operand PopOpen(Operand Open,int *e)
{
if(!EmptyOpen(Open))
*e=*(--Open.ntop);

return Open;
}

int EmptyOpen(Operand Open)
{
int flag=0;
if(Open.ntop==Open.nbase)
flag=1;

return flag;
}

int LoopCompare(Operator Oper,char c,int *flag)
{
if(EmptyOper(Oper))
return 0;
else if(c=='+' || c=='-')
*flag=1;
else if(c=='*' || c=='/' || c=='%')
{
if(*(Oper.ctop-1)=='*' || *(Oper.ctop-1)=='/' || *(Oper.ctop-1)=='%')
*flag=1;
else
*flag=0;
}

return 1;
}


2006-03-26 11:23
梦想中国
Rank: 2
等 级:新手上路
威 望:5
帖 子:539
专家分:0
注 册:2006-2-26
收藏
得分:0 
以上不能输入括号

2006-03-26 11:24
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 
thank you 我回去慢慢看!但我想知道我的程序哪里错了

[此贴子已经被作者于2006-3-26 12:22:51编辑过]



潜水员!
2006-03-26 11:48
withoutme_hw
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-19
收藏
得分:0 

我也先贴个吧 输入的是不带#的
输入格式例如:14.2+3.4*((1+2)/2)=
你的程序我试着慢慢看


/*
copyright by withoutme_hw
2006 3 25
description: 多项式的算数运算
*/

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct com
{
union
{
float num;
char sign;
}data;
struct com * next;
}; /*定义一个结构体,即链表中的一个节点,
用于存储多项式中的一个运算符或是数据*/
typedef struct com com;

/*函数功能:进行一级运算
函数参数:1 要进行运算的链表的头指针
2 要进行的那级运算的代表符号
如:要进行乘除运算的话 参数为'*'
要进行加减运算的话 参数为'+'
函数返回值:无
*/
void compute(com *pr,char s)
{
com *p;
pr=pr->next;
p=pr->next;
while(1)
{
if(s=='*') /*若参数是*,将多项式中的所有二级运算全都算完*/
{
if(p->data.sign=='*')
{
pr->data.num*=p->next->data.num;
/*printf("counting* %f \n",pr->data.num);*/
} /*运算符为‘* ’,运算乘法*/
else if(p->data.sign=='/')
{
pr->data.num/=p->next->data.num;
/*printf("counting %f /\n",pr->data.num); */
} /*运算符为‘/’ ,运算除法*/
else
{
p=p->next->next;
pr=pr->next->next;
/*printf("junmping "); */
if(p->data.sign=='='||p->next==NULL||p==NULL)
{
break;
}
continue;
} /*不是二级运算,先跳过不算*/
}
if(s=='+') /*运算一级运算*/
{
if(p->data.sign=='+')
{
pr->data.num+=p->next->data.num;
/*printf("counting + '%f' ",pr->data.num); */
} /*运算加法*/
else if(p->data.sign=='-')
{
pr->data.num-=p->next->data.num;
/*printf("counting - '%f' ",pr->data.num); */
} /*运算减法*/
}
pr->next=p->next->next; /*指向运算符的指针移到下个两节点,以便继续下次运算*/
free(p->next);
free(p); /*将算完的不用的节点释放*/
p=pr->next;
if(p->data.sign=='='||p->next==NULL||p==NULL)
{
break;
} /*如果p的下一个节点为空或是等于号则停止此级运算*/
}
}

/*函数功能:对多项式进行整体运算
函数参数:所要进行运算的多项式所在链表的头指针
函数返回值:无
*/
void Special(com *head)
{
unsigned int flag=0;
com *h,*p=head,*pf1=NULL,*pf2=NULL,*pr;
do
{
if(p->next->data.sign=='('&&flag==0)
{
pf1=p;
flag=1;
}
if(p->next->data.sign==')')
{
pf2=p;
break;
}
p=p->next;
}while(p->next!=NULL); /*指针p作用为寻找'('和')',找到括号之后,分别将‘(’和‘)’
所在节点的前两个节点的地址赋给pf1,pf2;*/
if(pf1!=NULL) /*如果多项式中含有括号*/
{
h=(com *)malloc(sizeof(com));
h->next=pf1->next->next;
free(pf1->next);
pf1->next=pf2->next->next;
free(pf2->next);
pf2->next=NULL; /*将括号部分的所有节点转换成一个含有空头节点的完整链表*/
Special(h); /*递归运算括号中的多项式的新链表*/
pr=pf1->next;
pf1->next=h->next;
free(h);
pf1->next->next=pr; /*将运算完的结果所在的节点重新转至原始链表,并将空头节点释放*/
}
compute(head,'*');
compute(head,'+'); /*处理完括号之后先运算二级运算,再运算一级运算*/
}

/*函数功能:读入多项式的数据,并存入含一个空头节点的链表
函数参数:无
函数返回值:指向包含多项式的链表的空头节点的指针
*/
com *SaveData(void)
{
int n;
com *head,*p,*pr;
char num[15],c;
num[15]='\0';
head=(com *)malloc(sizeof(com));
head->next=NULL;
pr=head;
do
{
n=0;
while(1)
{
c=getche(); /*一个字符一个字符的读入*/
if(c>='0'&&c<='9'||c=='.')
{
num[n]=c; /*如果是数字的话,赋给num数组*/
n++;
}
else
{
num[n] = '\0';
break;
} /*若是运算符或括号,跳出循环,符号仍在c中*/
}
if(num[0]!='\0')
{
p=(com *)malloc(sizeof(com));
pr->next=p;
pr=p;
p->data.num=atof(num); /*若num数组中有数字,则将其转化为整型,存入一个新的节点*/
}
p=(com *)malloc(sizeof(com));
pr->next=p;
pr=p;
p->data.sign=c; /*把c中的符号存入一个新的节点*/
}while(p->data.sign!='=');
return (head);
}
/*函数功能:打印链表 (测试时使用)
函数参数:指向链表的头节点的指针
函数返回值:无
*/
void PrintLink(com *head)
{
com *p;
p=head->next;
do
{
if(p->data.sign=='+'||p->data.sign=='-'||p->data.sign=='*'||p->data.sign=='/'||p->data.sign=='('||p->data.sign==')')
{
printf("%c",p->data.sign); /*遇到符号,打印符号*/
}
else
{
printf("%f",p->data.num);
} /*打印数据*/
p=p->next;
}while(p->data.sign!='='); /*遇‘=’终止*/
}

main()
{
com *head;
head=SaveData(); /*读入多项式数据*/
/*PrintLink(head); */ /*打印所读入的多项式*/
Special(head); /*递归运算多项式*/
printf("%.3f",head->next->data.num); /*打印出最后运算的结果*/
free(head->next);
free(head); /*释放最后的两个节点*/
getch();
}


好好学C 天天向上
2006-03-26 14:05
withoutme_hw
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-19
收藏
得分:0 

int priority(char c) //判断运算符的优先级
{
switch(c)
{
case'#':return -2;break;
case')':return -1;break;
case'+':return 0;break;
case'-':return 0;break;
case'*':return 1;break;
case'/':return 1;break;
case'(':return 2;break;
}
}
的break语句没有意义
因为先执行了return


好好学C 天天向上
2006-03-26 14:22
withoutme_hw
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-19
收藏
得分:0 
s.data[s.top-1]=-s.data[s.top--];


搂主是否想写:
s.data[s.top-1]-=s.data[s.top--];
?

好好学C 天天向上
2006-03-26 16:11
withoutme_hw
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-19
收藏
得分:0 

搂主,你的思路我实在是看不太懂
关键的地方缺少注释,还有些基本的错误
我是无能为力了


好好学C 天天向上
2006-03-26 16:13
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 

呵呵,对C荒废了半年,惭愧惭愧.....


潜水员!
2006-03-26 17:37
haishanglang
Rank: 1
等 级:新手上路
帖 子:378
专家分:0
注 册:2006-3-2
收藏
得分:0 
5楼的程序好象不能运行哦

2006-03-26 20:22
快速回复:[求助]程序分析,得不到结果,结果为0?(我作了修改)
数据加载中...
 
   



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

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