名字好长12 2016-11-27 07:23 采纳率: 83.3%
浏览 917
已采纳

c语言输入回车出错语句无错误

#include
#include
#include
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
char a[7] = {'+','-','*','/','(',')','#'};
char b[7][7] = {
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','\0'},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<','\0','='},
};

typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;

typedef struct
{
char *base;
char *top;
char stacksize;
}sqstack;

Status InitStack(SqStack &S)
{ //创建一个空栈S
S.base =(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) exit (OVERFLOW);
S.top =S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}//InitStack

int GetTop(SqStack S,int & e)
{
if(S.top==S.base) return ERROR;
e = *(S.top-1);
return e;
}

Status Push(SqStack &S,int e)
{
if(S.top-S.base >=S.stacksize )
{

S.base=(int *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(int));
if(!S.base ) exit(OVERFLOW);
S.top =S.base +S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top++=e;
return OK;
}

int Pop(SqStack &s,int &e)
{
if(s.top ==s.base ) return ERROR;
e=*--s.top;
return e;
}
//################
Status InitStackc(sqstack &S)
{ //创建一个空栈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;
}//InitStack

char GetTopc(sqstack S,char & e)
{
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return e;
}

Status Pushc(sqstack &S,char e)
{
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++=e;
return OK;
}

char Popc(sqstack &s,char &e)
{
if(s.top ==s.base ) return ERROR;
e=*--s.top;
return e;
}
//###############
int sw(char a){
int m;
switch(a){
case '+':
m = 0;
break;
case '-':
m = 1;
break;
case '*':
m = 2;
break;
case '/':
m = 3;
break;
case '(':
m = 4;
break;
case ')':
m = 5;
break;
case '#':
m = 6;
break;
}
return m;
}

//*****************
char precede(char op1,char op2){
int k,l;
char j;
k = sw(op1);//6
l = sw(op2);//0
j = b[k][l];
return j;
}
//***********
int In(char a){
if(a =='+'||'-'||'*'||'/'||'('||')','#')
return OK;
else
return ERROR;
}

int Operate(int a, char b, int c){
int s , d;
int mn;
char f;
s = a;f = b;d = c;
switch (f){
case '+':
mn = s + d;
break;
case '-':
mn = s - d;
break;
case '*':
mn = s * d;
break;
case '/':
mn = s / d;
break;
}
return mn;
}

int operand(){
char c;int b, a;
char e; char OP;char x ;
char theta;
SqStack OPND;
sqstack OPTR;
InitStackc(OPTR);Pushc(OPTR,'#');
InitStack(OPND);c=getchar();
while(c!='#'|| GetTopc(OPTR,e)!='#'){
if(In(c) == 0){
Push(OPND,c);
c=getchar();
}
else{
char cb ;
cb =precede(GetTopc(OPTR,OP),c);
switch(cb){
case'<':
Pushc(OPTR,c); c=getchar();
break;
case'=':
Popc(OPTR,x); c=getchar();
break;
case'>':
Popc(OPTR,theta);
Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}//switch
}//else
}//while
return GetTop(OPND,b);
}

void main(){
printf("请输入表达式:\n");
printf("%f\n",operand());
}

  • 写回答

2条回答 默认 最新

  • shen_wei 2016-11-28 07:40
    关注

    int In(char a){
    if(a =='+'||'-'||'*'||'/'||'('||')','#')
    return OK;
    else
    return ERROR;
    }

    字符的判断是这样来判断的。。**你的那样写法,很是奇葩,而却永远返回TRUE。。**

     int In(char a)
    {
        if(a == '+'||a == '-'||a == '*'||a == '/'||a == '('||a == ')'||a == '#')
            return OK;
        else 
            return ERROR;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码