Getop函数负数

时间:2015-08-11 11:11:56

标签: c calculator

我需要在我的反向波兰语计算器程序中添加负数的条款,但在测试代码时得到这个:

输入:

-5 7 +

输出:

error: stack empty
error: stack empty
12

以下是代码中最相关的部分:

/* Getop: get next operator or numeric operand. */

  int getop (char s[]) {
      int i, c;
      while ((s[0] = c = getch()) == ' ' || c == '\t')
        ;
      s[1] = '\0';
      if  (!isdigit(c) && c!= '.' && c!= '-')  
          return c;                    /* Not a number */
      i = 0;

      if (c == '-') {

          if(isdigit(s[i]) || s[i] == '.') {

          c = s[i];          /* Copy c to s[i], first character of the                                
                         number */
           ++i;
         }

         else { 

             return c; 

         }

      }


      if (isdigit(c))        /*  collect integer part */
          while (isdigit(s[++i] = c = getch()))
              ;
      if (c == '.')
          while (isdigit(s[++i] = c = getch()))
              ;


      s[i] = '\0';
      if (c != EOF)
          ungetch(c);
      return NUMBER;
  }

我不知道我做错了什么,所以请帮助。

由人们建议编辑:

#include <stdio.h>
#include <stdlib.h>  /* for atof() */
#include <ctype.h>
#include <math.h>

#define MAXOP 100  /* max size of operand or operator */
#define NUMBER '0'  /* signal that a number was found */
#define MAXVAL 100  /* maximum depth of val stack */
#define BUFSIZE 100


int sp = 0;           /* next free stack position */
double val[MAXVAL];   /* value stack */  

int getop(char s[]);
void push(double);
double pop(void);
int pop_int(void);
int getch (void);
void ungetch(int);

/* reverse Polish calculator */

 int main()
 {

     int type;
     double op2;
     char s[MAXOP];

 while ((type = getop(s)) != EOF) {
     switch (type)  {

     case NUMBER:
          push (atof(s));
          break;

     case '+':

         push( pop() + pop() );
         break;


     case '*':

        push(pop() * pop());
        break;

     case '-':

     op2 = pop();                        /*   Addition on the real numbers is commutative because for any real numbers s,t, it is true that s+t=t+s.
                                           Addition and multiplication are commutative operations but subtraction and division are not. */
     push(pop() - op2);
     break;

     case '/':

     op2 = pop();
     if (op2 != 0.0)
         push(pop() / op2);

     else 
          printf("error: zero divisor\n");
     break;

     case '%':

     op2 = pop();

     push(fmod(pop(), op2));
     break;


      case '\n':

     printf("\t%.8g\n" , pop());
     break;

     default:
     printf("error: unknown command %s\n", s);
     break;

     }

   }
   return 0;

 }



 /* push : push f onto value stack */

 void push(double f)
 {
    if (sp < MAXVAL)    
        val[sp++] = f;

    else
        printf("error: stack full, can`t push %g\n", f);

 }



 /* pop: pop and return top value from stack */

  double pop(void)
  {

      if (sp > 0)
          return val[--sp];
      else {
          printf("error: stack empty\n");
          return 0.0;
      }

  }

1 个答案:

答案 0 :(得分:0)

尝试使用getop:

int getop(char s[]) {
    int i, c;
    while ((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    s[1] = '\0';
    if (!isdigit(c) && c != '.' && c != '-')
        return c;                    /* Not a number */
    i = 0;

    if (c == '-')
    {
        while (isdigit(s[++i] = c = getch()))
    }

    if (isdigit(c))        /*  collect integer part */
        while (isdigit(s[++i] = c = getch()))
        ;
    if (c == '.')
        while (isdigit(s[++i] = c = getch()))
        ;


    s[i] = '\0';
    if (c != EOF)
        ungetch(c);
    return NUMBER;
}
相关问题