#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)
	{
		printf("%s", "> ");
		printf("%.16g\n", calc());
	}
	
	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
	{
		ch = getchar();
		
		// Парсим ввод на числа и операторы.
		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';
				num[j] = atof(str);
				i = 0;
				j++;
				break;
				
			case '\n':
				if (k > 0)
					f = k;
				str[i] = '\0';
				num[j] = atof(str);
				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;
}