
帮我看看这个程序吧!!我怎么找都找不出有什么错误
这个程序在编译时说一个子函数定义错误,但是我把这个子函数复制了应用到其他程序时就是正确的,而且我自己看来也没有啥错,到底怎么回事啊?整型数据的表达式求解(例如:5*26-...
这个程序在编译时说一个子函数定义错误,但是我把这个子函数复制了应用到其他程序时就是正确的,而且我自己看来也没有啥错,到底怎么回事啊?
整型数据的表达式求解(例如:5*26-(45/9+5)+1)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define INCREASEMENT 5
char s[7][7]=
{{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
typedef struct{ int*top,*base;
int stacksize;
}stackopnd;
typedef struct{ char*top,*base;
int stacksize;
}stackoptr;
void initstack(stackopnd &d,stackoptr &r)
{ d.stacksize=r.stacksize=MAXSIZE;
d.base=d.top=(int*)malloc(d.stacksize*sizeof(int));
if(!d.base) exit(-1);
r.base=r.top=(char*)malloc(r.stacksize*sizeof(char));
if(!r.base) exit(-1);
}
void pushd(stackopnd &d,int a)
{ if(d.top-d.top>=d.stacksize)
{ d.base=(int*)realloc(d.base,(d.stacksize+INCREASEMENT)*sizeof(int));
if(!d.base) exit(-1);
d.top=d.base+d.stacksize;
d.stacksize+=INCREASEMENT;
}
d.top++;
}
void pushr(stackoptr &r,char a)
{ if(r.top-r.top>=r.stacksize)
{ r.base=(char*)realloc(r.base,(r.stacksize+INCREASEMENT)*sizeof(char));
if(!r.base) exit(-1);
r.top=r.base+r.stacksize;
r.stacksize+=INCREASEMENT;
}
r.top++;
}
int popd(stackopnd &d)
{ if(d.top==d.base) exit(0);
return(*--d.top);
}
char popr(stackoptr &r)
{ if(r.top==r.base) exit(0);
return(*--r.top);
}
int operate(int m,int n,char c)
{ switch(c){
case '+':return(m+n);
case '-':return(m-n);
case '*':return(m*n);
case '/':return(m/n);
}
char compare(char a,char b)
{ int i,j;
char t[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{ if(a==t[i]) break; }
for(j=0;j<7;j++)
{ if(b==t[j]) break; }
return(s[i][j]);
}
void main()
{ char s[6],c,M,N;
int i,m,n,flag=0;
stackopnd d; stackoptr r;
initstack(&d,&r);
pushr(&r,'#');
printf("请输入一个以“#”结尾的算术表达式\n");
while((c=getchar())!='#')
{ if(c>='0'&&c<='9')
switch(flag)
{ case 0:i=0;//作为通道
case 1: s[i++]=c;s[i]='\0';flag=1;
}
else
switch(flag)
{ case 1: m=atoi(s); pushd(&d,m);flag=0;//若上次接收的字符为'0'-'9'则将上次接收的字符转换为整型数字
case 0: while(1)
{ N=compare(*(r.top-1),c);//求前后运算符的优先性
switch(N)
{ case '<': pushr(&r,c);break;
case '==': popr(&r);break;
case '>': m=popd(&d); n=popd(&d);M=popr(&r);
j=operate(n,m,M);
pushd(&d,j);//运算过后,当前c再次和栈里面的运算符作比较若为"<"继续运算
}
}
}
}
if(c=='#') popr(&r); m=popd(&d);
printf("结果为 %d",m);
} 展开
整型数据的表达式求解(例如:5*26-(45/9+5)+1)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define INCREASEMENT 5
char s[7][7]=
{{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
typedef struct{ int*top,*base;
int stacksize;
}stackopnd;
typedef struct{ char*top,*base;
int stacksize;
}stackoptr;
void initstack(stackopnd &d,stackoptr &r)
{ d.stacksize=r.stacksize=MAXSIZE;
d.base=d.top=(int*)malloc(d.stacksize*sizeof(int));
if(!d.base) exit(-1);
r.base=r.top=(char*)malloc(r.stacksize*sizeof(char));
if(!r.base) exit(-1);
}
void pushd(stackopnd &d,int a)
{ if(d.top-d.top>=d.stacksize)
{ d.base=(int*)realloc(d.base,(d.stacksize+INCREASEMENT)*sizeof(int));
if(!d.base) exit(-1);
d.top=d.base+d.stacksize;
d.stacksize+=INCREASEMENT;
}
d.top++;
}
void pushr(stackoptr &r,char a)
{ if(r.top-r.top>=r.stacksize)
{ r.base=(char*)realloc(r.base,(r.stacksize+INCREASEMENT)*sizeof(char));
if(!r.base) exit(-1);
r.top=r.base+r.stacksize;
r.stacksize+=INCREASEMENT;
}
r.top++;
}
int popd(stackopnd &d)
{ if(d.top==d.base) exit(0);
return(*--d.top);
}
char popr(stackoptr &r)
{ if(r.top==r.base) exit(0);
return(*--r.top);
}
int operate(int m,int n,char c)
{ switch(c){
case '+':return(m+n);
case '-':return(m-n);
case '*':return(m*n);
case '/':return(m/n);
}
char compare(char a,char b)
{ int i,j;
char t[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{ if(a==t[i]) break; }
for(j=0;j<7;j++)
{ if(b==t[j]) break; }
return(s[i][j]);
}
void main()
{ char s[6],c,M,N;
int i,m,n,flag=0;
stackopnd d; stackoptr r;
initstack(&d,&r);
pushr(&r,'#');
printf("请输入一个以“#”结尾的算术表达式\n");
while((c=getchar())!='#')
{ if(c>='0'&&c<='9')
switch(flag)
{ case 0:i=0;//作为通道
case 1: s[i++]=c;s[i]='\0';flag=1;
}
else
switch(flag)
{ case 1: m=atoi(s); pushd(&d,m);flag=0;//若上次接收的字符为'0'-'9'则将上次接收的字符转换为整型数字
case 0: while(1)
{ N=compare(*(r.top-1),c);//求前后运算符的优先性
switch(N)
{ case '<': pushr(&r,c);break;
case '==': popr(&r);break;
case '>': m=popd(&d); n=popd(&d);M=popr(&r);
j=operate(n,m,M);
pushd(&d,j);//运算过后,当前c再次和栈里面的运算符作比较若为"<"继续运算
}
}
}
}
if(c=='#') popr(&r); m=popd(&d);
printf("结果为 %d",m);
} 展开
1个回答
展开全部
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define INCREASEMENT 5
char s[7][7]=
{{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
typedef struct
{
int*top,
*base;
int stacksize;
}stackopnd;
typedef struct
{
char*top,*base;
int stacksize;
}stackoptr;
void initstack(stackopnd &d,stackoptr &r)
{
d.stacksize = r.stacksize = MAXSIZE;
d.base=d.top=(int*)malloc(d.stacksize*sizeof(int));
if(!d.base)
exit(-1);
r.base=r.top=(char*)malloc(r.stacksize*sizeof(char));
if(!r.base)
exit(-1);
}
void pushd(stackopnd &d,int a)
{
if(d.top-d.top >= d.stacksize)
{
d.base = (int*)realloc(d.base,(d.stacksize+INCREASEMENT)*sizeof(int));
if(!d.base)
exit(-1);
d.top=d.base+d.stacksize;
d.stacksize+=INCREASEMENT;
}
d.top++;
}
void pushr(stackoptr &r,char a)
{
if(r.top-r.top>=r.stacksize)
{
r.base=(char*)realloc(r.base,(r.stacksize+INCREASEMENT)*sizeof(char));
if(!r.base)
exit(-1);
r.top=r.base+r.stacksize;
r.stacksize+=INCREASEMENT;
}
r.top++;
}
int popd(stackopnd &d)
{
if(d.top==d.base)
exit(0);
return(*--d.top);
}
char popr(stackoptr &r)
{
if(r.top==r.base)
exit(0);
return(*--r.top);
}
int operate(int m,int n,char c)
{
switch(c)
{
case '+':
return(m+n);
case '-':
return(m-n);
case '*':
return(m*n);
case '/':
return(m/n);
default:
return 0;
}
}
char compare(char a, char b)
{
int i,j;
char t[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{
if(a==t[i]) break; }
for(j=0;j<7;j++)
{
if(b==t[j])
break;
}
return(s[i][j]);
}
void main()
{
char s[6],c,M,N;
int i,m,n,flag=0;
stackopnd d;
stackoptr r;
initstack(d,r);
pushr(r,'#');
printf("请输入一个以“#”结尾的算术表达式\n");
while((c=getchar())!='#')
{
if(c>='0'&&c<='9')
{
switch(flag)
{
case 0:
i=0;//作为通道
case 1:
s[i++]=c;s[i]='\0';
flag=1;
}
}
else
{
switch(flag)
{
case 1:
m=atoi(s);
pushd(d,m);
flag=0;//若上次接收的字符为'0'-'9'则将上次接收的字符转换为整型数字
case 0:
while(1)
{
N=compare(*(r.top-1),c);//求前后运算符的优先性
switch(N)
{
case '<':
pushr(r,c);
break;
case '==':
popr(r);
break;
case '>':
m=popd(d);
n=popd(d);
M=popr(r);
}
int j=operate(n,m,M);
pushd(d,j);//运算过后,当前c再次和栈里面的运算符作比较若为"<"继续运算
}
}
}
}
if(c=='#')
popr(r);
m=popd(d);
printf("结果为 %d",m);
}
给你编译通过了,你再调调功能吧,注意编程规范,这段代码太乱了.
#include<stdlib.h>
#define MAXSIZE 20
#define INCREASEMENT 5
char s[7][7]=
{{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
typedef struct
{
int*top,
*base;
int stacksize;
}stackopnd;
typedef struct
{
char*top,*base;
int stacksize;
}stackoptr;
void initstack(stackopnd &d,stackoptr &r)
{
d.stacksize = r.stacksize = MAXSIZE;
d.base=d.top=(int*)malloc(d.stacksize*sizeof(int));
if(!d.base)
exit(-1);
r.base=r.top=(char*)malloc(r.stacksize*sizeof(char));
if(!r.base)
exit(-1);
}
void pushd(stackopnd &d,int a)
{
if(d.top-d.top >= d.stacksize)
{
d.base = (int*)realloc(d.base,(d.stacksize+INCREASEMENT)*sizeof(int));
if(!d.base)
exit(-1);
d.top=d.base+d.stacksize;
d.stacksize+=INCREASEMENT;
}
d.top++;
}
void pushr(stackoptr &r,char a)
{
if(r.top-r.top>=r.stacksize)
{
r.base=(char*)realloc(r.base,(r.stacksize+INCREASEMENT)*sizeof(char));
if(!r.base)
exit(-1);
r.top=r.base+r.stacksize;
r.stacksize+=INCREASEMENT;
}
r.top++;
}
int popd(stackopnd &d)
{
if(d.top==d.base)
exit(0);
return(*--d.top);
}
char popr(stackoptr &r)
{
if(r.top==r.base)
exit(0);
return(*--r.top);
}
int operate(int m,int n,char c)
{
switch(c)
{
case '+':
return(m+n);
case '-':
return(m-n);
case '*':
return(m*n);
case '/':
return(m/n);
default:
return 0;
}
}
char compare(char a, char b)
{
int i,j;
char t[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++)
{
if(a==t[i]) break; }
for(j=0;j<7;j++)
{
if(b==t[j])
break;
}
return(s[i][j]);
}
void main()
{
char s[6],c,M,N;
int i,m,n,flag=0;
stackopnd d;
stackoptr r;
initstack(d,r);
pushr(r,'#');
printf("请输入一个以“#”结尾的算术表达式\n");
while((c=getchar())!='#')
{
if(c>='0'&&c<='9')
{
switch(flag)
{
case 0:
i=0;//作为通道
case 1:
s[i++]=c;s[i]='\0';
flag=1;
}
}
else
{
switch(flag)
{
case 1:
m=atoi(s);
pushd(d,m);
flag=0;//若上次接收的字符为'0'-'9'则将上次接收的字符转换为整型数字
case 0:
while(1)
{
N=compare(*(r.top-1),c);//求前后运算符的优先性
switch(N)
{
case '<':
pushr(r,c);
break;
case '==':
popr(r);
break;
case '>':
m=popd(d);
n=popd(d);
M=popr(r);
}
int j=operate(n,m,M);
pushd(d,j);//运算过后,当前c再次和栈里面的运算符作比较若为"<"继续运算
}
}
}
}
if(c=='#')
popr(r);
m=popd(d);
printf("结果为 %d",m);
}
给你编译通过了,你再调调功能吧,注意编程规范,这段代码太乱了.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询