| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 451 人关注过本帖
标题:大牛大牛帮一下小兄弟哈~
只看楼主 加入收藏
shensishensi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-8-31
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:6 
大牛大牛帮一下小兄弟哈~
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10  
#define OK 1
#define error -1
typedef struct{
 char *base;
 char *top;
 int stacksize;
}Stack;
Stack oper;
Stack opnd;
int InitStack(Stack &s)
{//初始化空栈
 s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
 if(!s.base) exit(OVERFLOW);
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
void Push(Stack & s, char x)
{//元素x进栈操作,成功返回1,否则返回0
 if(s.top-s.base>=s.stacksize){
  s.base=(char *)realloc(s.base,
  (s.stacksize+STACKINCREMENT)*sizeof(char));
  if(!s.base) exit(OVERFLOW);
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=x;
}
char get_top(Stack & s, char & e)
{//函数的目的是得到堆栈的栈顶元素
 if(s.top==s.base) return error;
 e=*(s.top-1);
 return e;
}
double cal(double num1 , char op , double num2 )
{//函数的目的是对不同的运算符进行计算,num1和num2是栈中的两个元素,op是运算符
 double result;
 switch(op)//对于不同运算符的不同的算法
 {
 case '+':
  result = num1+num2;
  break;
 case '-':
  result = num1-num2;
  break;
 case '*':
  result = num1*num2;
  break;
 case '/':
  {
  result = num1/num2;
  break;
  }
 case '^':
  {
  result = pow(num1,num2);
  break;
  }
 case 'A'://这个是绝对值的
  {
  num1 = 0;  
  result = abs(num2);
  break;
  }
 case 'S'://这个是开方的
  result = sqrt(num2);
  break;
 case 'sin':
  result = sin (num2);
  break;
 case 'cos':
  result = cos (num2);
  break;
 default:
  return 0;
 }
 return result;//想返回计算的值
}
int cal_level(char op1, char op2)
{//函数的目的是通过比较优先级,当进行下一个函数压栈运算时,能够将较低优先级的运算符压倒堆栈中
 if(op1=='+'||op1=='-')//比较+,-运算符和其他运算符
 {
  if(op2=='*'||op2=='/'||op2=='A'||op2=='S'||op2=='^'||op2=='sin'||op2=='cos')
  return -1;
  else if(op2=='#'||op2=='(')
  return 1;
  else
  return 0;
 }
 else if(op1=='*'||op1=='/')//比较*,/运算符和其他的关系
 {
  if(op2=='+'||op2=='-'||op2=='#'||op2=='(')
  return 1;
  else if(op2=='^'||op2=='A'||op2=='S'||op1=='sin'||op1=='cos')
  return -1;
  else
  return 0;
 }
 else if(op1=='^'||op1=='A'||op1=='S'||op1=='sin'||op1=='cos')//比较这一级运算符和其他运算符的关系
 {
  if(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2=='#'||op2=='(')
  return 1;
  else
  return 0;
 }
 else if(op1=='#')//#的运算符优先级最低
  return -1;
}
//判断一个字符是否为数字
int is_digit(char ch)
{
 if((ch>='0'&&ch<='9')||ch=='.')
  return true;
 else
  return false;
}
//计算的主过程
int i;
double calcul(char unsolved[])//想传进一个字符数组,通过扫描字符数组,达到最后运算得到结果的效果
{
 char e;
 while (unsolved[i]!='\0')
 {
  //如果为数字直接压入数据栈
  if(is_digit(unsolved[i]))
  {   
  Push(opnd,unsolved[i]);
  }
  else //如果为运算符
  {
  if(unsolved[i]='(')//如果遇到左括号则直接压入运算符栈
  {
  Push(oper,'(');
  }
  if(unsolved[i]=')')//如果遇到的是右括号则不断的在两个栈之间运算,直到遇到左括号
  {
  while(get_top(oper,e)!='(')
  {
  double num1,num2;
  double temp;
  char op;
  op=get_top(oper,e);//得到运算符
  num1=get_top(opnd,e);//得到数字1
  num2=get_top(opnd,e);//得到数字2
  temp=cal(num1,op,num2);
  Push(opnd,temp);
  }
  }//对于括号的解决
  //比较字符的优先级,解决其他字符串的问题
  if(cal_level(unsolved[i],get_top(oper,e))>0)//如果栈顶的元素优先级低则直接压入栈中
  {
  Push(oper,unsolved[i]);
  }
  while(cal_level(unsolved[i],get_top(oper,e))<0)//如果栈顶的元素优先级高则先进行计算直到栈顶的元素优先级低
  {
  char op;
  double num1,num2;
  double temp;
  op=get_top(oper,e);
  num1=get_top(opnd,e);
  num2=get_top(opnd,e);
  temp=cal(num1,op,num2);
  Push(opnd,temp);
  }//进行计算的过程
  Push(oper,unsolved[i]);//将这个优先级高的元素压入运算符栈
  }
  i++;
 }//已经完成了一次扫描,将所有的元素压入堆栈中了,
 while(get_top(oper,e)!='#')//进行剩余计算,完成对于堆栈中剩余元素的计算
 {
  double temp1,temp2;
  char op;
  double result;
  op=get_top(oper,e);
  temp1=get_top(opnd,e);
  temp2=get_top(opnd,e);
  result=cal(temp1,op,temp2);
  Push(opnd,result);//这是个问题,就是如何将计算结果从double型转化成char型
 }
 return get_top(opnd,e);//返回最后opnd栈中最后的结果,即计算结果
}
void main()
{
 if(InitStack(oper)>0)
  Push(oper,'#');
 if(InitStack(opnd)>0)
  Push(opnd,'0');//建立两个堆栈,一个存放运算数,一个存放运算符
 char unsolved[100];
 double result;
 printf("请输入表达式\n");
 gets(unsolved);//目的是从屏幕中得到字符串,自己的想法是利用字符数组
 result=calcul(unsolved);
 printf("%d",result);
}
出现的问题是程序没有错误了,但是运行不出结果,这是为什么,还有如何调试程序啊,我觉着调试也是一门功夫~
我知道这个调试很费功夫,所以加了详细的注释,还有不错的奖励,希望牛人解答一下疑惑~
搜索更多相关主题的帖子: 牛大牛 小兄弟 
2010-09-12 21:09
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:5 
好多

清风拂暮(木)
2010-09-12 21:19
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
VC6.0的一步一步调试看得到的值对不对

清风拂暮(木)
2010-09-12 21:20
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
晕程序有很多问题啊 大多的错误都是那些参数无法正确传递

清风拂暮(木)
2010-09-12 21:26
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
数据可能会丢失

清风拂暮(木)
2010-09-12 21:29
shensishensi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-8-31
收藏
得分:0 
回复 4楼 清风拂晓
谢谢回复,我用的是vc6.0,我努力调调,设断点,哎,我是个菜鸟啊,都怪原来的c没有好好学,这是小学期作业,我不想就在网上下个程序交上去,所以赶紧编,提高一下自己的能力,谢谢大家的帮忙~
2010-09-13 09:43
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:5 
什么奖励 说来听听 才10分不想干活
2010-09-13 10:17
快速回复:大牛大牛帮一下小兄弟哈~
数据加载中...
 
   



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

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