#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
// Максимальное количество цифр в числе.
#define N 20
double calc(void);
int pri(char);
int main(void)
{
puts("Math 0.0.2 by Mr. Anonson, 2019");
while (true)
{
}
return 0;
}
// Расчет введенного выражения.
double calc(void)
{
int i = 0; // Положение в строке.
int j = 0; // Положение в стеках.
int k = 0; // Положение рабочей области в стеках.
int f = 0; // Флаг конца выражения и понижения приоритета.
char ch; // Считываемый с ввода символ.
char str[N]; // Строка под число.
char op[3]; // Стек операторов.
double num[3]; // Стек чисел.
do
{
// Парсим ввод на числа и операторы.
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
if (i < N-1)
{
str[i] = ch; // Кладем цифоры в строку.
i++;
}
break;
case '*':
case '/':
if (j > 0 && pri(ch) > pri(op[k]))
k++;
op[j] = ch; // Загоняем символы операторов в стек.
str[i] = '\0';
num
[j
] = atof(str
); // Переводим строку в число и загоняем в стек. i = 0;
j++;
break;
case '+':
case '-':
if (k > 0)
f++;
op[j] = ch;
str[i] = '\0';
i = 0;
j++;
break;
case '\n':
if (k > 0)
f = k;
str[i] = '\0';
i = 0;
j++;
break;
}
while (j > k+1)
{
/* // Для отладки.
printf("%c %g\n", op[0], num[0]);
printf("%c %g\n", op[1], num[1]);
printf("%c %g\n\n", op[2], num[2]); */
// Считаем выражения.
switch (op[k])
{
case '+':
num[k] += num[k+1];
break;
case '-':
num[k] -= num[k+1];
break;
case '*':
num[k] *= num[k+1];
break;
case '/':
num[k] /= num[k+1];
break;
}
op[k] = op[k+1]; // Сдвиг стека операторов.
j--;
if (f > 0)
{
k--;
f--;
}
}
}
while (ch != '\n');
return num[0];
}
// Приоритет оператора.
int pri(char ch)
{
int pr;
switch (ch)
{
case '+':
case '-':
pr = 1;
break;
case '*':
case '/':
pr = 2;
break;
}
return pr;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCi8vINCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRhtC40YTRgCDQsiDRh9C40YHQu9C1LgojZGVmaW5lIE4gMjAKCmRvdWJsZSBjYWxjKHZvaWQpOwppbnQgcHJpKGNoYXIpOwoKaW50IG1haW4odm9pZCkKewoJcHV0cygiTWF0aCAwLjAuMiAgYnkgTXIuIEFub25zb24sIDIwMTkiKTsKCgl3aGlsZSAodHJ1ZSkKCXsKCQlwcmludGYoIiVzIiwgIj4gIik7CgkJcHJpbnRmKCIlLjE2Z1xuIiwgY2FsYygpKTsKCX0KCQoJcmV0dXJuIDA7Cn0KCgovLyDQoNCw0YHRh9C10YIg0LLQstC10LTQtdC90L3QvtCz0L4g0LLRi9GA0LDQttC10L3QuNGPLgpkb3VibGUgY2FsYyh2b2lkKQp7CglpbnQgaSA9IDA7IC8vINCf0L7Qu9C+0LbQtdC90LjQtSDQsiDRgdGC0YDQvtC60LUuCglpbnQgaiA9IDA7IC8vINCf0L7Qu9C+0LbQtdC90LjQtSDQsiDRgdGC0LXQutCw0YUuCglpbnQgayA9IDA7IC8vINCf0L7Qu9C+0LbQtdC90LjQtSDRgNCw0LHQvtGH0LXQuSDQvtCx0LvQsNGB0YLQuCDQsiDRgdGC0LXQutCw0YUuCglpbnQgZiA9IDA7IC8vINCk0LvQsNCzINC60L7QvdGG0LAg0LLRi9GA0LDQttC10L3QuNGPINC4INC/0L7QvdC40LbQtdC90LjRjyDQv9GA0LjQvtGA0LjRgtC10YLQsC4KCWNoYXIgY2g7IC8vINCh0YfQuNGC0YvQstCw0LXQvNGL0Lkg0YEg0LLQstC+0LTQsCDRgdC40LzQstC+0LsuCgljaGFyIHN0cltOXTsgLy8g0KHRgtGA0L7QutCwINC/0L7QtCDRh9C40YHQu9C+LgoJY2hhciBvcFszXTsgLy8g0KHRgtC10Log0L7Qv9C10YDQsNGC0L7RgNC+0LIuCglkb3VibGUgbnVtWzNdOyAvLyDQodGC0LXQuiDRh9C40YHQtdC7LgoJCglkbwoJewoJCWNoID0gZ2V0Y2hhcigpOwoJCQoJCS8vINCf0LDRgNGB0LjQvCDQstCy0L7QtCDQvdCwINGH0LjRgdC70LAg0Lgg0L7Qv9C10YDQsNGC0L7RgNGLLgoJCXN3aXRjaCAoY2gpCgkJewoJCQljYXNlICcwJzoKCQkJY2FzZSAnMSc6CgkJCWNhc2UgJzInOgoJCQljYXNlICczJzoKCQkJY2FzZSAnNCc6CgkJCWNhc2UgJzUnOgoJCQljYXNlICc2JzoKCQkJY2FzZSAnNyc6CgkJCWNhc2UgJzgnOgoJCQljYXNlICc5JzoKCQkJY2FzZSAnLic6CgkJCQlpZiAoaSA8IE4tMSkKCQkJCXsKCQkJCQlzdHJbaV0gPSBjaDsgLy8g0JrQu9Cw0LTQtdC8INGG0LjRhNC+0YDRiyDQsiDRgdGC0YDQvtC60YMuCgkJCQkJaSsrOwoJCQkJfQoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAnKic6CgkJCWNhc2UgJy8nOgoJCQkJaWYgKGogPiAwICYmIHByaShjaCkgPiBwcmkob3Bba10pKQoJCQkJCWsrKzsKCQkJCW9wW2pdID0gY2g7IC8vINCX0LDQs9C+0L3Rj9C10Lwg0YHQuNC80LLQvtC70Ysg0L7Qv9C10YDQsNGC0L7RgNC+0LIg0LIg0YHRgtC10LouCgkJCQlzdHJbaV0gPSAnXDAnOwoJCQkJbnVtW2pdID0gYXRvZihzdHIpOyAvLyDQn9C10YDQtdCy0L7QtNC40Lwg0YHRgtGA0L7QutGDINCyINGH0LjRgdC70L4g0Lgg0LfQsNCz0L7QvdGP0LXQvCDQsiDRgdGC0LXQui4KCQkJCWkgPSAwOwoJCQkJaisrOwoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAnKyc6CgkJCWNhc2UgJy0nOgoJCQkJaWYgKGsgPiAwKQoJCQkJCWYrKzsKCQkJCW9wW2pdID0gY2g7CgkJCQlzdHJbaV0gPSAnXDAnOwoJCQkJbnVtW2pdID0gYXRvZihzdHIpOwoJCQkJaSA9IDA7CgkJCQlqKys7CgkJCQlicmVhazsKCQkJCQoJCQljYXNlICdcbic6CgkJCQlpZiAoayA+IDApCgkJCQkJZiA9IGs7CgkJCQlzdHJbaV0gPSAnXDAnOwoJCQkJbnVtW2pdID0gYXRvZihzdHIpOwoJCQkJaSA9IDA7CgkJCQlqKys7CgkJCQlicmVhazsKCQl9CgkJCgkJd2hpbGUgKGogPiBrKzEpCgkJewoJCQkvKiAvLyDQlNC70Y8g0L7RgtC70LDQtNC60LguCgkJCXByaW50ZigiJWMgJWdcbiIsIG9wWzBdLCBudW1bMF0pOwoJCQlwcmludGYoIiVjICVnXG4iLCBvcFsxXSwgbnVtWzFdKTsKCQkJcHJpbnRmKCIlYyAlZ1xuXG4iLCBvcFsyXSwgbnVtWzJdKTsgKi8KCQkJCgkJCS8vINCh0YfQuNGC0LDQtdC8INCy0YvRgNCw0LbQtdC90LjRjy4KCQkJc3dpdGNoIChvcFtrXSkKCQkJewoJCQkJY2FzZSAnKyc6CgkJCQkJbnVtW2tdICs9IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnLSc6CgkJCQkJbnVtW2tdIC09IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnKic6CgkJCQkJbnVtW2tdICo9IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnLyc6CgkJCQkJbnVtW2tdIC89IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQl9CgkJCQoJCQlvcFtrXSA9IG9wW2srMV07IC8vINCh0LTQstC40LMg0YHRgtC10LrQsCDQvtC/0LXRgNCw0YLQvtGA0L7Qsi4KCQkJai0tOwoJCQlpZiAoZiA+IDApCgkJCXsKCQkJCWstLTsKCQkJCWYtLTsKCQkJfQoJCX0KCX0KCXdoaWxlIChjaCAhPSAnXG4nKTsKCQoJcmV0dXJuIG51bVswXTsKfQoKCi8vINCf0YDQuNC+0YDQuNGC0LXRgiDQvtC/0LXRgNCw0YLQvtGA0LAuCmludCBwcmkoY2hhciBjaCkKewoJaW50IHByOwoJCglzd2l0Y2ggKGNoKQoJewoJCWNhc2UgJysnOgoJCWNhc2UgJy0nOgoJCQlwciA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJyonOgoJCWNhc2UgJy8nOgoJCQlwciA9IDI7CgkJCWJyZWFrOwoJfQoJCglyZXR1cm4gcHI7Cn0=