请高手看一下,这个程序怎么不能实现整数和小数混合计算?
#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); /*关闭文件*/
}