Обратная польская запись - 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
Объяснение кода листинга программы
- Обратная польская запись (Reverse Polish Notation) — это формат записи математических выражений, в котором операции и их аргументы представлены в порядке, обратном к порядку в обычной записи.
- Код на языке C выполняет вычисления в обратной польской записи.
- Первая строка
$ ./rpn
18 3 * 6 2 + 2 3 ^ - /`` представляет собой выражение в обратной польской записи. - Выражение в обратной польской записи
18 3 * 6 2 + 2 3 ^ - /
эквивалентно обычному выражению18 + (3 * 6) — 2 / 2 ^ 3
. - При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
- Выполнение выражения
18 3 * 6 2 + 2 3 ^ - /
приводит к ошибкеDivision by zero
, потому что попытка деления на ноль. - Вторая строка
$ ./rpn
2 3 + 5/`` представляет собой выражение в обратной польской записи. - Выражение в обратной польской записи
2 3 + 5/
эквивалентно обычному выражению2 + 3 + 5/
. - При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
- Выполнение выражения
2 3 + 5/
дает результат 10.000. - Третья строка
$ ./rpn
2 5 ^ 10 *`` представляет собой выражение в обратной польской записи. - Выражение в обратной польской записи
2 5 ^ 10 *
эквивалентно обычному выражению2 ^ 5 * 10
. - При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
- Выполнение выражения
2 5 ^ 10 *
дает результат 320.000.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д