| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1491 人关注过本帖
标题:帮小妹做道编程题啊
只看楼主 加入收藏
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用nuciewth在2006-10-11 16:53:10的发言:

2.这个是简易的计算器,楼主自己加个判断是否输入表达式合法(括号不匹配,操作符相连).
括号匹配:将输入表达式的括号放入一数组中,调用下面的函数.
int match_kuohao(char c[])
{
int i ;
sequence_stack s ;
i=0 ;
init_sequence_stack(&s);
while(c[i]!='#')
{
switch(c[i])
{
case '{' :
case '[' :
case '(' :
push(&s,c[i]);
break ;
case '}' :
if(is_empty_stack(s)&&get_top(s)=='{')
{
pop(&s);
break ;
}
else return 1 ;
/*还回1则栈不为空,即括号不匹配*/
case ')' :
if(is_empty_stack(s)&&get_top(s)=='(')
{
pop(&s);
break ;
}
else return 1 ;

case ']' :
if(is_empty_stack(s)&&get_top(s)=='[')
{
pop(&s);
break ;
}
else return 1 ;
}
i++;
}
return(is_empty_stack(s));
}


#include<stdio.h>
#define MAXSIZE 100
#include<string.h>


int is_operation(char op)/*判断是否为运算符*/
{
switch(op)
{
case'+':
case'-':
case'*':
case'/':return(1);
default:return(0);
}
}

int priority(char op)/*判断进栈各运算符的优先级*/
{
switch(op)
{
case'#':return(-1);
case'(':return(0);
case'+':
case'-':return(1);
case'*':
case'/':return(2);
default:return(-1);
}
}

void postfix(char e[],char f[])/*中缀转换成后缀表达式*/
{
int i=0,j=0;
char opst[100];/*栈*/
int top,t;

top=0;/*当前顶指针*/
opst[top]='#';top++;/*将#放在栈底作为运算结束标志*/
while(e[i]!='#')/*核心语句段*/
{
if((e[i]>='0'&&e[i]<='9')||e[i]=='.')
{
f[j++]=e[i];/*遇到数字和小数点直接写入后缀表达式*/
}
else
if(e[i]=='(')/*遇到左括号直接写入操作符栈*/
{
opst[top]=e[i];
top++;
}
else
if(e[i]==')')/*遇到右括号和其对应的左括号后的操作符全部写入后缀表达式*/
{
t=top-1;
while(opst[t]!='(')
{
f[j++]=opst[--top];
t=top-1;
}
top--;/*出栈*/
}
else
if(is_operation(e[i]))
{
f[j++]=' ';
while(priority(opst[top-1])>=priority(e[i]))
{
f[j++]=opst[--top];
}
opst[top]=e[i];
top++;/*当前元素进栈*/
}
i++;/*处理下一个元素*/
}
while(top)
{
f[j++]=opst[--top];
}
}

float readnumber(char f[],int *i)/*将字符转换为数值*/
{
float x=0.0;
int k=0;/*用K标记小数部分的位数*/

while(f[*i]>='0'&&f[*i]<='9')/*处理整数部分*/
{
x=x*10+(f[*i]-'0');
(*i)++;
}
if(f[*i]=='.')/*处理小数部分*/
{
(*i)++;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;
k++;
}
}
while(k!=0)
{
x=x/10.0;
k=k-1;
}
/*printf("%f\n",x);*/
return(x);
}

double evalpost(char f[])
{
double x1,x2,obst[100];/*栈*/
int i=0,top=0;

while(f[i]!='#')/*还有元素要被处理*/
{
if(f[i]>='0'&&f[i]<='9')
{
obst[top]=readnumber(f,&i);
top++;/*将操作数进栈*/
}
else
if(f[i]==' ')/*用空格将两操作数隔开*/
{
i++;
}
else
if(f[i]=='+')/*做加法运算*/
{
x2=obst[--top];/*第一个操作数出栈*/
x1=obst[--top];/*第二个操作数出栈*/
obst[top]=x1+x2;/*两操作数进行运算,并将所得结果进栈*/
/*printf("%f",obst[top]); */
top++;
i++;
}
else
if(f[i]=='-')/*做减法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;
top++;
i++;
}
else
if(f[i]=='*')/*做乘法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1*x2;
top++;
i++;
}
else
if(f[i]=='/')/*做除法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;
top++;
i++;
}
}

return(obst[0]);/*环回最终运算结果*/
}

main()
{
char e[MAXSIZE],f[MAXSIZE];/*定义两个字符数组*/
double sum;/*结果*/

printf("please input the numbers,end by '#':");/*输入被操作的中缀表达式*/
scanf("%s",e);
postfix(e,f);/*将中缀表达式转换成后缀表达式*/
printf("the postfix sort:");
puts(f);
sum=evalpost(f);/*做运算*/
printf("Output the rezult:%f",sum);/*打印结果*/
getch();
}


让你抢先了

2006-10-11 17:27
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
收藏
得分:0 
哦..本来想写第二个...好在没写
你们两个好强哦 ^_^ 是时间效率

unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2006-10-11 17:31
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

不分先后的啦...
这个是以前学数据结构时写的,就顺便把它贴上来,我不会做什么界面,有空教教我啊.

倚天照海花无数,流水高山心自知。
2006-10-11 17:34
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
开来学数据结构是有用啊
写的比我的正规多了

2006-10-11 17:35
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

对了
还要界面
马上
2006-10-11 17:36
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 

#include <stdlib.h>
#include <time.h>

int PrintE(float *Enum,char *Esign,int en)
{
int i;

for(i=0;i<en-1;i++)
{
if(Esign[i])
printf("%c",(int)Enum[i]);
else
printf("%f",Enum[i]);
}
printf("\n");
}

int Count(float *Enum,char *Esign,int en)
{
int i,j,es,Emins=1,ek;

while(en>2)
{
Emins=1;
for(i=0;i<en;i++)
{
if(Esign[i]==1)Emins=1;
if(Esign[i]<3&&Esign[i]&&Esign[i-1]==0&&Emins)
{
if(Esign[i]>=Esign[i+1])
if(Esign[i]==2||Esign[i]!=(Esign[i+2]-1))
{
switch((int)Enum[i])
{
case '*':Enum[i-1]=Enum[i-1]*Enum[i+1];Enum[i+1]=Enum[i-1];break;
case '/':Enum[i-1]=Enum[i-1]/Enum[i+1];Enum[i+1]=Enum[i-1];break;
case '+':Enum[i-1]=Enum[i-1]+Enum[i+1];Enum[i+1]=Enum[i-1];break;
case '-':Enum[i-1]=Enum[i-1]-Enum[i+1];Enum[i+1]=Enum[i-1];break;
default:;
}
Esign[i]=4;
Esign[i-1]=4;
}
}
if(Enum[i]==')')
Emins=0;

}
en=Move(Enum,Esign,en);

for(i=0;i<en;i++)
{
if(Enum[i]=='('&&Esign[i+1]==0&&Enum[i+2]==')')
{
Esign[i]=4;
Esign[i+2]=4;
}
}
en=Move(Enum,Esign,en);
}

return en;
}

int Move(float *Enum,char *Esign,int en)
{
int i,es;
float Enumr[30];
char Esignr[30];

for(es=0,i=0;i<en;i++)
{
if(Esign[i]!=4)
{
Enumr[es]=Enum[i];
Esignr[es++]=Esign[i];
}
}
en=es;
for(i=0;i<en;i++)
{
Enum[i]=Enumr[i];
Esign[i]=Esignr[i];
}
return en;
}

main()
{
int i=0,j=0,en=0,es=0;
float num[10][10],Enum[30]={0};
char Expression[50]="(5+(8*(5-4)+2)*12)/5",Esign[30],E_f[50];
long t_start=0,t_end=0;
int gd=DETECT,gm;

initgraph(&gd,&gm,"");
setbkcolor(8);

srand((unsigned)time(NULL));
for(i=0;i<10;i++)
for(j=0;j<10;j++)
num[i][j]=random(1000);
/*puts("Input Expression:");
gets(Expression);*/

t_start=biostime(0,t_start);

i=0;
printf("%s=",Expression);
while(Expression[i])
{
es=0;
j=0;
while(Expression[i]<='9'&&Expression[i]>='0'||Expression[i]=='.')
{
E_f[j++]=Expression[i];
i++;
es=1;
}

if(es)
{
E_f[j]='\0';
Enum[en]=atof(E_f);
Esign[en]=0;
en++;
}

Enum[en]=Expression[i];
switch(Expression[i])
{
case '(':
case ')':Esign[en]=3;break;
case '*':
case '/':Esign[en]=2;break;
case '+':
case '-':Esign[en]=1;break;
case 0:break;
default:printf("error in '%c' !",Expression[i-1]);getch();exit(1);
}
en++;
i++;
}

en=Count(Enum,Esign,en);

PrintE(Enum,Esign,en);

t_end=biostime(0,t_end);

for(en=1,j=0;j<10;j++)
for(i=0;i<10;i++)
{
if(num[i][j]==Enum[0])
{
printf("<%d,%d> ",i,j);
en=0;
}
}
if(en)
printf("Not find!");
printf("\nspent time %ld->%ld=%ld",t_start,t_end,t_start-t_end);
getch();

}

2006-10-11 17:38
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

快点写出来,我也学习学习...
指不定楼主很着急了.

倚天照海花无数,流水高山心自知。
2006-10-11 17:38
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
同学叫我去吃饭
他们着急回来玩梦幻
没办法
nuciewth 用语言描述一下你的算法
主要想听一下你的程序效率问题
先88了 一会回来
2006-10-11 17:40
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
有时间再说吧,我也快要下了.
主要就是字符串接收表达式,然后将中缀表达式转换为后缀表达式.(运算符及括号的优先级)(里面还有将数字字符转换为数的操作).之后就利用栈做了,把操作数压栈,直到出现操作符,运算,将结果压栈直到栈空且后缀表达式为空.

倚天照海花无数,流水高山心自知。
2006-10-11 17:47
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
我数据结构学的不好
我的理解是不是就是先把表达式整理成无括号型然后再运算 对么?
2006-10-11 18:11
快速回复:帮小妹做道编程题啊
数据加载中...
 
   



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

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