65 lines
1.6 KiB
C
65 lines
1.6 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
#define MAXOP 100 // Максимальный размер операдна (цифры) или оператора
|
||
#define NUMBER '0' // Признак числа
|
||
|
||
int getop(char[]);
|
||
void push(double);
|
||
double pop(void);
|
||
|
||
int main() {
|
||
int type;
|
||
double pop2;
|
||
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 '-':
|
||
/*
|
||
* Тут сначала извлекаем верхний операнд, из которого надо
|
||
* вычитать. В отличии от `+`, `*` для `-` и `/` порядок операндов
|
||
* важен.
|
||
*
|
||
* ----------
|
||
* -
|
||
* 10
|
||
* 20
|
||
* ...
|
||
* ----------
|
||
*
|
||
* Чтобы сделать вычитание - надо из 20 вычесть 10 - получается
|
||
* излекам со стека 10, затем 20 и делаем вычитание
|
||
*/
|
||
pop2 = pop();
|
||
push(pop() - pop2);
|
||
break;
|
||
case '/':
|
||
/*
|
||
* Тут примерно то-же самое, только еще надо сделать проверку
|
||
* на ноль
|
||
*/
|
||
pop2 = pop();
|
||
if (pop2 != 0.0)
|
||
push(pop() / pop2);
|
||
else
|
||
printf("Error: Division by zero\n");
|
||
break;
|
||
case '\n':
|
||
printf("\t%.g\n", pop());
|
||
break;
|
||
default:
|
||
printf("Error: Unknown operation %s\n", s);
|
||
break;
|
||
}
|
||
}
|
||
}
|