Обратная польская запись - 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 выполняет вычисления в обратной польской записи.
- Первая строка
$ ./rpn18 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, потому что попытка деления на ноль. - Вторая строка
$ ./rpn2 3 + 5/`` представляет собой выражение в обратной польской записи. - Выражение в обратной польской записи
2 3 + 5/эквивалентно обычному выражению2 + 3 + 5/. - При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
- Выполнение выражения
2 3 + 5/дает результат 10.000. - Третья строка
$ ./rpn2 5 ^ 10 *`` представляет собой выражение в обратной польской записи. - Выражение в обратной польской записи
2 5 ^ 10 *эквивалентно обычному выражению2 ^ 5 * 10. - При выполнении выражения слева направо, операции и их аргументы обрабатываются поочередно.
- Выполнение выражения
2 5 ^ 10 *дает результат 320.000.