K&R, глава 4.3. калькулятор с обратной польской нотацией. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер. Я застопорился с примером из книги "C Programming Language", 2е издание. В главе 4.3 "внешние переменные" приводится код примитивного калькулятора. Переписал все, как написано в книге в один файл .с , скомпилировал в gcc, а программа при подстановке любых выражений, включая то, что приводится авторами (1 2 - 4 5 + *) выдает нули. Долго перепроверял код, но так и не могу понять, в чем причина? Поток ввода для программы перенаправляю из текстового файла.
#include <stdio.h>
#include <stdlib.h> /* для объявления atof() */
#include <ctype.h>
#define MAXOP   100 /* максимальный размер операнда или знака */
#define NUMBER  '0' /* сигнал, что обнаружено число */
#define MAXVAL  100 /* максимальная глубина стека val */
#define BUFSIZE 100
 
int getop(char s[]);
void push(double);
double pop(void);
 
/* калькулятор с обратной польской записью */
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();
            push(pop() - op2);
            break;
        case '/':
            op2 = pop();
            if (op2 != 0.0)
                push(pop() / op2);
            else
                printf("error: zero devisor\n");
            break;
        case '\n':
            printf("\t%.8g\n", pop());
            break;
        default:
            printf("error: unknown command %s\n", s);
            break;
        }
    }
    return 0;
}

int sp = 0;         /* следующая свободная позиция в стеке */
double val[MAXVAL]; /* стек операндов */
 
/* push: помещает число f в стек операндов */
void push(double f)
{
    if (sp < MAXVAL)
        val[sp++] = f;
    else
        printf("error: stack full, can't push %g\n", f);
}
 
/* pop: извлекает и возвращает верхнее число из стека */
double pop(void)
{
    if (sp > 0)
        return val[--sp];
    else {
        printf("error: stack empty\n");
        return 0.0;
    }
}

int getch(void);
void ungetch(int);
 
char buf[BUFSIZE];  /* буфер для ungetch */
int bufp = 0;       /* следующая свободная позиция в buf */
 
/* getop: извлекает следующий операнд или знак операции */
int getop(char s[])
{
    int i, c;
    
    while ((s[0] = c = getch()) == ' ' || c == '\t')
        ;
    s[1] = '\0';
    if (!isdigit(c) && c != '.')
        return c;   /* не число */
    i = 0;
    if (isdigit(c)) /* накопление целой части */
        while (isdigit(s[i++] = c = getch()))
            ;
    if (c == '.')   /* накопление дробной части */
        while (isdigit(s[i++] = c = getch()))
            ;
    s[i] = '\0';
    if (c != EOF)
        ungetch(c);
    return NUMBER;
}
 
int getch(void) /* ввод символа (возможно, возвращенного в поток) */
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}
 
void ungetch(int c) /* возвращение символа в поток ввода */
{
    if (bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}
полдня сижу, никак к упражнениям не приступлю :-(
Ещё хотелось бы спросить, в какой среде программирования на С есть возможность отладки (но не дизассемблер)? Для ОС linuх.

Решение задачи: «K&R, глава 4.3. калькулятор с обратной польской нотацией.»

textual
Листинг программы
int main() { return 0 }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы