| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖
标题:请高手看一下,这个程序怎么不能实现整数和小数混合计算?
只看楼主 加入收藏
心心若水
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-6-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
请高手看一下,这个程序怎么不能实现整数和小数混合计算?
#include<stdio.h>
 #include<conio.h>
 #include<stdlib.h>
 #define  FALSE     0
 #define  TRUE     1
 #define  MAXSIZE 100              /*存储空间初始分配量*/
 #define  N  10                    /*存储空间增加量*/
 #define  NULL 0

 typedef struct StStack
{
    float *base;            /*在栈构造之前和销毁之后,base的值为0*/
    float *top;             /*栈顶指针*/
    int size;               /*当前已分配的存储空间,以元素为单位*/
}   StStack;

 typedef struct StStack_c
{
    char *base;
    char *top;
    int size;
}   StStack_c;

void InitStack(StStack *S)
{
/*构造一个空栈S存储数据*/
  S->base=(float *)malloc(MAXSIZE*sizeof(float));
  if(!S->base)
  exit(TRUE);                  /*存储分配失败*/
  S->top=S->base;
  S->size=MAXSIZE;
 }

 void InitStack_c(StStack_c *S)
{
/*构造一个空栈S存储符号;*/
  S->base=(char *)malloc(MAXSIZE*sizeof(char));
  if(!S->base) exit(TRUE);      /*存储分配失败*/
  S->top=S->base;
  S->size=MAXSIZE;
 }

 void Push(StStack *S,float e)
{
/*插入元素e为新的栈顶元素*/
  if(S->top==S->base+S->size)
    { S->base=(float *)realloc(S->base,(S->size+N)*sizeof(float));       /*若栈满则增存储空间*/
      if(!S->base) exit(TRUE);           /*存储分配失败*/
      S->top=S->base+S->size;           /*增加存储空间*/
      S->size+=N;
    }
  S->base[(S->top++)-S->base]=e;
 }

 void Push_c(StStack_c *S,char ch){
/*插入元素ch为新的栈顶元素*/
   if(S->top==S->base+S->size)
    { S->base=(char *)realloc(S->base,(S->size+N)*sizeof(char));       /*若栈满则增存储空间*/
      if(!S->base) exit(TRUE);           /*存储分配失败*/
      S->top=S->base+S->size;
      S->size+=N;
    }
  S->base[(S->top++)-S->base]=ch;
 }

 void Pop(StStack *S,float *e){
 /*若栈不空,则删除S的栈顶元素,用e返回其值*/
  if(S->top!=S->base)
    *e=S->base[(S->top--)-S->base-1];
 }

 void Pop_c(StStack_c *S,char *ch){
 /*若栈不空,则删除S的栈顶元素,用ch返回其值*/
  if(S->top!=S->base)
    *ch=S->base[(S->top--)-S->base-1];
 }

 float GetTop(StStack *S){
  /*若栈不空,则用e返回S的栈顶元素*/
  int n;                        /*存放栈顶元素的位置*/
  float e;
  if(S->top!=S->base)
  {n=S->top-S->base-1;
   e=S->base[n];
   return e;                    /*返回S的栈顶元素*/
  }
 }

 char GetTop_c(StStack_c *S){
  /*若栈不空,则用ch返回S的栈顶元素*/
  int n;
  char ch;
  if(S->top!=S->base)
  {n=S->top-S->base-1;
   ch=S->base[n];
   return ch;
  }
 }

 int In_c(char ch){
/*判断是否为运算符,是则返回TRUE,否则返回FALSE*/
  if(ch=='+'||ch=='-') return TRUE;
  else if(ch=='*'||ch=='/') return TRUE;
       else if(ch=='('||ch==')') return TRUE;
        else if(ch=='#') return TRUE;
         else return FALSE;
 }

int check_ch(char *ch){
/*判断输入是否符合表达式的要求*/
  while(*ch!='#')
  {if(*ch=='.'||*ch>='0'&&*ch<='9'||In_c(*ch))       /*表达式的限制条件*/
   {if(*ch>='0'&&*ch<='9') {ch++;continue;}
    if(*ch=='.')                       /*小数点前后不是数字的处理*/
    {if(In_c(*(++ch)))  return FALSE;
     else ch--;
     if(In_c(*(--ch)))  return FALSE;
     else ch++;
    }/*if-2*/
    else
    {if(In_c(*(++ch))&&In_c(*(--ch)))                    /*相邻的两运算符的处理*/
     {if(*(++ch)=='(') continue;                         /*在'('前的运算符情况处理*/
      else ch--;
      if(*(++ch)=='-'&&*(--ch)=='(') {ch++; continue;}   /*()内第一位数为负的运算符处理*/
      else ch--;
      if(*(++ch)!='#'&&*(--ch)==')') {ch++; continue;}   /*在')'后的运算符情况处理*/
      else if(*ch--!='#') return FALSE;
     }/*if-3*/
     else ch--;
    }/*if-else2*/
    ch++;
   }/*if-1*/
   else return FALSE;
  }/*while*/
  if(*ch=='#') return TRUE;
 }

float operate(float x,char c,float y){
/*基本运算的实现*/
  switch(c){
   case '+': return x+y;
   case '-': return x-y;
   case '*': return x*y;
   case '/': if(y!=0) return x/y;         /*被除数不为0*/
         else
         {printf("\nThe divisor is 0,can't permit !\n");
          exit(1);
         }
  }
 }

char Precede(char x,char y){
/*运算符的优先权*/
  switch(x){
   case '+': if(y=='*'||y=='/'||y=='(') return '<';
         else return '>';
   case '-': if(y=='*'||y=='/'||y=='(') return '<';
             else return '>';
   case '*': if(y=='(') return '<';
             else return '>';
   case '/': if(y=='(') return '<';
             else return '>';
   case '(': if(y==')') return '=';
             else return '<';
   case ')': if(y!='(') return '>';
   case '#': if(y=='#') return '=';
             else if(y!=')') return '<';
  }
 }

int changeN(StStack *S,char *ch){
  /*将字符转换为数值*/
  int j,h,k=0;
  float m,n=0;
  char c;
  while(*ch>='0'&&*ch<='9'||*ch=='.')
  {n=n*10+(*ch-48);             /*将字符转换为数值存入n中*/
   k++;                                   /*k记录数值的位数*/
   ch++;
   if(*ch=='.')      /*若有小数,将n,k存入m,h,并初始化方便小数的转换*/
   {m=n;n=0;
    h=k;k=0;
    c=*ch;ch++;     /*将'.'存入c,对下一个字符进行操作*/
   }
   if(c=='.'&&In_c(*ch)==TRUE)           /*对小数部分的处理*/
   {for(j=0;j<k;j++)
    n=n/10;
    n+=m;
    k=++k+h;
   }
  }/*while*/
  Push(S,n);                   /*将转换好的数值入栈*/
  return k;                       /*返回数值的位数*/
 }

 int DealNeg(StStack *S,char *ch){
  /*对括号内负数的处理*/
  int k=0,i=0;
  float e,n=0;
  if(*(--ch)=='('&&*(++ch)=='-')
  {k=changeN(S,++ch);
   Pop(S,&e);
   n=-1*e;
   Push(S,n);
   return k;
  }
  else return FALSE;
 }

 void Operating(char *c,StStack *OPND,StStack_c *OPTR)
  /*表达式运算过程*/
 {char ch;
  int k=0,i=0;
  float a,b,e;
  if(c[0]=='-'&&(!In_c(c[1])))      /*判断首数是负数则进栈*/
  {k=changeN(OPND,&c[1]);
   i+=k+1;                         /*首数是负数保存其位数*/
   Pop(OPND,&e);
   e=-1*e;                         /*保存负数*/
   Push(OPND,e);
  }
  do{
   if(!In_c(c[i]))                  /*不是运算符则转换为数值并进栈*/
   {k=changeN(OPND,&c[i]);
    i+=k-1;                       /*下一个字符在串中的下标*/
   }
   else
   {if(k=DealNeg(OPND,&c[i])) i+=k;       /*判断是负数则进栈*/
    else
    {switch(Precede(GetTop_c(OPTR),c[i])){
     case '<': Push_c(OPTR,c[i]);              /*栈顶元素优先权低*/
           break;
     case '=': Pop_c(OPTR,&ch);                /*脱括号并接收下一字符*/
           break;
     case '>': Pop_c(OPTR,&ch);                /*退栈并将输出结果入栈*/
           Pop(OPND,&b);
           Pop(OPND,&a);
           e=operate(a,ch,b);              /*将运算结果存入e中*/
           if(GetTop_c(OPTR)=='-')         /*若结果前为'-'则取其相反数*/
           {Pop_c(OPTR,&ch);
        Push_c(OPTR,'+');
        e=-1*e;
           }
           Push(OPND,e);
           if(c[i]!='#'&&c[i]!=')')           /*当前符号不是'#'则入栈*/
        Push_c(OPTR,c[i]);
           else i--;
     }/*switch()*/
    }/*if-else-1*/
   }/*if-else-2*/
   i++;
  }while(GetTop_c(OPTR)!='#'||c[i]!='#');       /*判断表达式是否结束*/
 }

int main()
 {char str[40 ],*c,ch;
  float i=0,n,f;
  FILE *fp;
  StStack s1,*OPND;                 /*定义关于数值的栈*/
  StStack_c s2,*OPTR;               /*定义关于字符的栈*/
  OPND=&s1;
  OPTR=&s2;
  c=str;
  if((fp=fopen("date.txt","w"))==NULL)           /*打开文档并将正确的表达式和结果写入文档*/
  {printf("can't open the file.\n");i=1;}        /*出错提示*/
  do{
   InitStack_c(OPTR);
   Push_c(OPTR,'#');
   InitStack(OPND);
   do{
    printf("\n请输入表达式:\n ");
    scanf("%s",c);getchar();
    if(check_ch(c)) f=1;
    else
    {printf("\n警告: 表达式不符合要求!!\n");
     f=0;
    }
   }while(f!=1);            /*表达式若不符合要求则重新输入*/
   Operating(c,OPND,OPTR);
   n=GetTop(OPND);
   printf("\n表达式的结果为: %.2f.\n",n);
   if(i!=1)                                                               /*将表达式和结果写入文档*/
   {fputs("\nThe expression is:   \0",fp);
    fputs(c,fp);
    fputs("\nThe result is:   \0",fp);
    fprintf(fp,"%.2f",n);
   }
   printf("\n是否计算下一个表达式(y/n):  ");
   ch=getchar(); getchar();
  }while(ch=='y'||ch=='Y');
  fclose(fp);                                 /*关闭文件*/
 }
搜索更多相关主题的帖子: include 空间 元素 
2013-06-26 16:10
mo_0820
Rank: 2
等 级:论坛游民
帖 子:3
专家分:27
注 册:2013-6-27
收藏
得分:14 
感觉好复杂!能简化吗?
2013-06-27 14:18
心心若水
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-6-25
收藏
得分:0 
回复 2楼 mo_0820
这个已经写得很详细了!!!
2013-07-02 09:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
以下是引用心心若水在2013-7-2 09:33:35的发言:

这个已经写得很详细了!!!

不是要“详细”,2楼的意思是让你把不相干的代码去掉
2013-07-02 09:57
快速回复:请高手看一下,这个程序怎么不能实现整数和小数混合计算?
数据加载中...
 
   



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

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