Обратная польская запись - C (СИ)

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

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

ДОбрый день, подскажите пожалуйста проверяю сложение и не пойму откуда такой результат Enter mathematical expression: 12+ Result = 11.000000
int main(){
        double s[STACK_SIZE];
        int s_top = STACK_EMPTY;
        int i;
        printf("Enter mathematical expression: ");
        while(!feof(stdin)){
                int c = getchar();
                double x;
                switch (c) {
                        case '+': push(s, (pop(s, &s_top) + pop(s, &s_top)), &s_top, STACK_SIZE);break;
                        case '\n': printf("Result = %lf\n", pop(s, &s_top)); break;
                        default:
                                ungetc(c, stdin);
                                if(scanf("%lf", &x) != 1){
                                        fprintf(stderr, "You enter incorrect expression\n ") ;
                                        return -1;
                                }
                                else{
                                        push(s, x, &s_top, STACK_SIZE);
                                }
                                break;
                }
        }
        return 0;
}
Спасибо!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define STACK_SIZE      10
#define STACK_FULL      -2
#define STACK_EMPTY     -1
#define NORMAL          0
 
int myerror = NORMAL;
 
void push(double [], double, int *, int);
double pop(double [], int *);
 
void push(double stack[], double item, int *top, int max_size){
        if(*top < max_size-1){
                ++(*top);
                stack[*top] = item;
                myerror = NORMAL;
        }
        else
                myerror = STACK_FULL;
}
 
double pop(double stack[], int*top){
        double item;
        if (*top >= 0){
                item = stack[*top];
                --(*top);
                myerror = NORMAL;
        }
        else{
                item = STACK_EMPTY;
                myerror = STACK_EMPTY;
        }
        return item;
}

Решение задачи: «Обратная польская запись»

textual
Листинг программы
$ ./rpn "18 3 * 6 2 + 2 3 ^ - /"
Division by zero
$ ./rpn "2 3 + 5/"
 => 1.000
$ ./rpn "2 5 ^ 10 *"
 => 320.000

Объяснение кода листинга программы

  1. Обратная польская запись (Reverse Polish Notation) — это формат записи математических выражений, в котором операции и их аргументы представлены в порядке, обратном к порядку в обычной записи.
  2. Код на языке C выполняет вычисления в обратной польской записи.
  3. Первая строка $ ./rpn18 3 * 6 2 + 2 3 ^ - /`` представляет собой выражение в обратной польской записи.
  4. Выражение в обратной польской записи 18 3 * 6 2 + 2 3 ^ - / эквивалентно обычному выражению 18 + (3 * 6) — 2 / 2 ^ 3.
  5. При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
  6. Выполнение выражения 18 3 * 6 2 + 2 3 ^ - / приводит к ошибке Division by zero, потому что попытка деления на ноль.
  7. Вторая строка $ ./rpn2 3 + 5/`` представляет собой выражение в обратной польской записи.
  8. Выражение в обратной польской записи 2 3 + 5/ эквивалентно обычному выражению 2 + 3 + 5/.
  9. При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
  10. Выполнение выражения 2 3 + 5/ дает результат 10.000.
  11. Третья строка $ ./rpn2 5 ^ 10 *`` представляет собой выражение в обратной польской записи.
  12. Выражение в обратной польской записи 2 5 ^ 10 * эквивалентно обычному выражению 2 ^ 5 * 10.
  13. При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
  14. Выполнение выражения 2 5 ^ 10 * дает результат 320.000.

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


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

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

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