#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
// Максимальное количество цифр в числе.
#define N 20
bool err; // Проверка ошибок.
double calc(void);
int pri(char);
int main(void)
{
double num;
puts("Math 0.0.3 by Mr. Anonson, 2019");
while (true)
{
num = calc();
if (!err)
}
return 0;
}
// Расчет введенного выражения.
double calc(void)
{
bool br = false; // Флаг открытия скобок.
int i = 0; // Положение в строке.
int j = 0; // Положение в стеках.
int k = 0; // Положение рабочей области в стеках.
int f = 0; // Флаг конца выражения и понижения приоритета.
char ch; // Считываемый с ввода символ.
char str[N]; // Строка под число.
char op[3]; // Стек операторов.
double num[3]; // Стек чисел.
err = true;
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 (err)
err = false;
if (i < N-1)
{
str[i] = ch; // Кладем цифоры в строку.
i++;
}
break;
case '*':
case '/':
if (j > 0 && pri(ch) > pri(op[k]))
k++;
op[j] = ch; // Загоняем символы операторов в стек.
if (!br)
{
str[i] = '\0';
num
[j
] = atof(str
); // Переводим строку в число и загоняем в стек. }
else
br = false;
i = 0;
j++;
break;
case '+':
case '-':
if (k > 0)
f++;
op[j] = ch;
if (!br)
{
str[i] = '\0';
}
else
br = false;
i = 0;
j++;
break;
case '(':
br = true;
num[j] = calc(); // Скобочная рекурсия.
break;
case ')':
case '\n':
if (k > 0)
f = k;
if (!br)
{
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' && ch != ')');
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+0LvQuNGH0LXRgdGC0LLQviDRhtC40YTRgCDQsiDRh9C40YHQu9C1LgojZGVmaW5lIE4gMjAKCmJvb2wgZXJyOyAvLyDQn9GA0L7QstC10YDQutCwINC+0YjQuNCx0L7Qui4KCmRvdWJsZSBjYWxjKHZvaWQpOwppbnQgcHJpKGNoYXIpOwoKaW50IG1haW4odm9pZCkKewoJZG91YmxlIG51bTsKCQoJcHV0cygiTWF0aCAwLjAuMyAgYnkgTXIuIEFub25zb24sIDIwMTkiKTsKCgl3aGlsZSAodHJ1ZSkKCXsKCQlwcmludGYoIiVzIiwgIj4gIik7CgkJCgkJbnVtID0gY2FsYygpOwoJCWlmICghZXJyKQoJCQlwcmludGYoIiUuMTZnXG4iLCBudW0pOwoJfQoJCglyZXR1cm4gMDsKfQoKLy8g0KDQsNGB0YfQtdGCINCy0LLQtdC00LXQvdC90L7Qs9C+INCy0YvRgNCw0LbQtdC90LjRjy4KZG91YmxlIGNhbGModm9pZCkKewoJYm9vbCBiciA9IGZhbHNlOyAvLyDQpNC70LDQsyDQvtGC0LrRgNGL0YLQuNGPINGB0LrQvtCx0L7Qui4KCWludCBpID0gMDsgLy8g0J/QvtC70L7QttC10L3QuNC1INCyINGB0YLRgNC+0LrQtS4KCWludCBqID0gMDsgLy8g0J/QvtC70L7QttC10L3QuNC1INCyINGB0YLQtdC60LDRhS4KCWludCBrID0gMDsgLy8g0J/QvtC70L7QttC10L3QuNC1INGA0LDQsdC+0YfQtdC5INC+0LHQu9Cw0YHRgtC4INCyINGB0YLQtdC60LDRhS4KCWludCBmID0gMDsgLy8g0KTQu9Cw0LMg0LrQvtC90YbQsCDQstGL0YDQsNC20LXQvdC40Y8g0Lgg0L/QvtC90LjQttC10L3QuNGPINC/0YDQuNC+0YDQuNGC0LXRgtCwLgoJY2hhciBjaDsgLy8g0KHRh9C40YLRi9Cy0LDQtdC80YvQuSDRgSDQstCy0L7QtNCwINGB0LjQvNCy0L7Quy4KCWNoYXIgc3RyW05dOyAvLyDQodGC0YDQvtC60LAg0L/QvtC0INGH0LjRgdC70L4uCgljaGFyIG9wWzNdOyAvLyDQodGC0LXQuiDQvtC/0LXRgNCw0YLQvtGA0L7Qsi4KCWRvdWJsZSBudW1bM107IC8vINCh0YLQtdC6INGH0LjRgdC10LsuCgkKCWVyciA9IHRydWU7CglkbwoJewoJCWNoID0gZ2V0Y2hhcigpOwoJCQoJCS8vINCf0LDRgNGB0LjQvCDQstCy0L7QtCDQvdCwINGH0LjRgdC70LAg0Lgg0L7Qv9C10YDQsNGC0L7RgNGLLgoJCXN3aXRjaCAoY2gpCgkJewoJCQljYXNlICcwJzoKCQkJY2FzZSAnMSc6CgkJCWNhc2UgJzInOgoJCQljYXNlICczJzoKCQkJY2FzZSAnNCc6CgkJCWNhc2UgJzUnOgoJCQljYXNlICc2JzoKCQkJY2FzZSAnNyc6CgkJCWNhc2UgJzgnOgoJCQljYXNlICc5JzoKCQkJY2FzZSAnLic6CgkJCQlpZiAoZXJyKQoJCQkJCWVyciA9IGZhbHNlOwoJCQkJaWYgKGkgPCBOLTEpCgkJCQl7CgkJCQkJc3RyW2ldID0gY2g7IC8vINCa0LvQsNC00LXQvCDRhtC40YTQvtGA0Ysg0LIg0YHRgtGA0L7QutGDLgoJCQkJCWkrKzsKCQkJCX0KCQkJCWJyZWFrOwoJCQkJCgkJCWNhc2UgJyonOgoJCQljYXNlICcvJzoKCQkJCWlmIChqID4gMCAmJiBwcmkoY2gpID4gcHJpKG9wW2tdKSkKCQkJCQlrKys7CgkJCQlvcFtqXSA9IGNoOyAvLyDQl9Cw0LPQvtC90Y/QtdC8INGB0LjQvNCy0L7Qu9GLINC+0L/QtdGA0LDRgtC+0YDQvtCyINCyINGB0YLQtdC6LgoJCQkJaWYgKCFicikgCgkJCQl7CgkJCQkJc3RyW2ldID0gJ1wwJzsKCQkJCQludW1bal0gPSBhdG9mKHN0cik7IC8vINCf0LXRgNC10LLQvtC00LjQvCDRgdGC0YDQvtC60YMg0LIg0YfQuNGB0LvQviDQuCDQt9Cw0LPQvtC90Y/QtdC8INCyINGB0YLQtdC6LgoJCQkJfQoJCQkJZWxzZQoJCQkJCWJyID0gZmFsc2U7CgkJCQlpID0gMDsKCQkJCWorKzsKCQkJCWJyZWFrOwoJCQkJCgkJCWNhc2UgJysnOgoJCQljYXNlICctJzoKCQkJCWlmIChrID4gMCkKCQkJCQlmKys7CgkJCQlvcFtqXSA9IGNoOwoJCQkJaWYgKCFicikgCgkJCQl7CgkJCQkJc3RyW2ldID0gJ1wwJzsKCQkJCQludW1bal0gPSBhdG9mKHN0cik7CgkJCQl9CgkJCQllbHNlCgkJCQkJYnIgPSBmYWxzZTsKCQkJCWkgPSAwOwoJCQkJaisrOwoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAnKCc6CgkJCQliciA9IHRydWU7CgkJCQludW1bal0gPSBjYWxjKCk7IC8vINCh0LrQvtCx0L7Rh9C90LDRjyDRgNC10LrRg9GA0YHQuNGPLgoJCQkJYnJlYWs7CgkJCQkKCQkJY2FzZSAnKSc6CgkJCWNhc2UgJ1xuJzoKCQkJCWlmIChrID4gMCkKCQkJCQlmID0gazsKCQkJCWlmICghYnIpIAoJCQkJewoJCQkJCXN0cltpXSA9ICdcMCc7CgkJCQkJbnVtW2pdID0gYXRvZihzdHIpOwoJCQkJfQoJCQkJaSA9IDA7CgkJCQlqKys7CgkJCQlicmVhazsKCQl9CgkJCgkJd2hpbGUgKGogPiBrKzEpCgkJewoJCQkvKiAvLyDQlNC70Y8g0L7RgtC70LDQtNC60LguCgkJCXByaW50ZigiJWMgJWdcbiIsIG9wWzBdLCBudW1bMF0pOwoJCQlwcmludGYoIiVjICVnXG4iLCBvcFsxXSwgbnVtWzFdKTsKCQkJcHJpbnRmKCIlYyAlZ1xuXG4iLCBvcFsyXSwgbnVtWzJdKTsgKi8KCQkJCgkJCS8vINCh0YfQuNGC0LDQtdC8INCy0YvRgNCw0LbQtdC90LjRjy4KCQkJc3dpdGNoIChvcFtrXSkKCQkJewoJCQkJY2FzZSAnKyc6CgkJCQkJbnVtW2tdICs9IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnLSc6CgkJCQkJbnVtW2tdIC09IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnKic6CgkJCQkJbnVtW2tdICo9IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnLyc6CgkJCQkJbnVtW2tdIC89IG51bVtrKzFdOwoJCQkJCWJyZWFrOwoJCQl9CgkJCQoJCQlvcFtrXSA9IG9wW2srMV07IC8vINCh0LTQstC40LMg0YHRgtC10LrQsCDQvtC/0LXRgNCw0YLQvtGA0L7Qsi4KCQkJai0tOwoJCQlpZiAoZiA+IDApCgkJCXsKCQkJCWstLTsKCQkJCWYtLTsKCQkJfQoJCX0KCX0KCXdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9ICcpJyk7CgkKCXJldHVybiBudW1bMF07Cn0KCgovLyDQn9GA0LjQvtGA0LjRgtC10YIg0L7Qv9C10YDQsNGC0L7RgNCwLgppbnQgcHJpKGNoYXIgY2gpCnsKCWludCBwcjsKCQoJc3dpdGNoIChjaCkKCXsKCQljYXNlICcrJzoKCQljYXNlICctJzoKCQkJcHIgPSAxOwoJCQlicmVhazsKCQljYXNlICcqJzoKCQljYXNlICcvJzoKCQkJcHIgPSAyOwoJCQlicmVhazsKCX0KCQoJcmV0dXJuIHByOwp9