#include #include #include #include #include #define MAX_VELKOST 10 typedef struct { float zasobnik[MAX_VELKOST]; int vrchol; } KalkulackaZasobnik; void inicializuj(KalkulackaZasobnik *kalkulacka) { kalkulacka->vrchol = -1; } bool vloz(KalkulackaZasobnik *kalkulacka, float hodnota) { if (kalkulacka->vrchol >= MAX_VELKOST - 1) { return false; } kalkulacka->zasobnik[++kalkulacka->vrchol] = hodnota; return true; } bool vyber(KalkulackaZasobnik *kalkulacka, float *a, float *b) { if (kalkulacka->vrchol < 1) { return false; } *a = kalkulacka->zasobnik[kalkulacka->vrchol--]; *b = kalkulacka->zasobnik[kalkulacka->vrchol--]; return true; } bool scitat(KalkulackaZasobnik *kalkulacka) { float a, b; if (vyber(kalkulacka, &a, &b)) { return vloz(kalkulacka, b + a); } return false; } bool odcitat(KalkulackaZasobnik *kalkulacka) { float a, b; if (vyber(kalkulacka, &a, &b)) { return vloz(kalkulacka, b - a); } return false; } bool nasobit(KalkulackaZasobnik *kalkulacka) { float a, b; if (vyber(kalkulacka, &a, &b)) { return vloz(kalkulacka, a * b); } return false; } bool delit(KalkulackaZasobnik *kalkulacka) { float a, b; if (vyber(kalkulacka, &a, &b)) { if (a == 0) { return false; } return vloz(kalkulacka, b / a); } return false; } void zobraz_zasobnik(KalkulackaZasobnik *kalkulacka) { for (int i = 0; i <= kalkulacka->vrchol; i++) { printf("%.2f ", kalkulacka->zasobnik[i]); } printf("\n"); } bool je_platna_operacia(char operacia) { return operacia == '+' || operacia == '-' || operacia == '*' || operacia == '/'; } bool je_platne_cislo(const char *vstup) { char *koniec; strtof(vstup, &koniec); return *koniec == '\n' || *koniec == '\0'; } bool dost_operantov(KalkulackaZasobnik *kalkulacka) { return kalkulacka->vrchol <= 1; } int main() { KalkulackaZasobnik kalkulacka; inicializuj(&kalkulacka); char vstup[100]; while (true) { fgets(vstup, sizeof(vstup), stdin); if (vstup[0] == '\n') { break; } if (je_platne_cislo(vstup)) { float hodnota = strtof(vstup, NULL); vloz(&kalkulacka, hodnota); zobraz_zasobnik(&kalkulacka); } else if (strlen(vstup) == 2 && je_platna_operacia(vstup[0])) { char operacia = vstup[0]; if (!dost_operantov(&kalkulacka)) { printf("not enough operands\n"); return 0; } switch (operacia) { case '+': if (scitat(&kalkulacka)) { zobraz_zasobnik(&kalkulacka); } else { printf("no input\n"); return 0; } break; case '-': if (odcitat(&kalkulacka)) { zobraz_zasobnik(&kalkulacka); } else { printf("no input\n"); return 0; } break; case '*': if (nasobit(&kalkulacka)) { zobraz_zasobnik(&kalkulacka); } else { printf("no input\n"); return 0; } break; case '/': { float a, b; if (vyber(&kalkulacka, &a, &b)) { if (a == 0) { printf("division by zero\n"); return 0; } else { vloz(&kalkulacka, b / a); zobraz_zasobnik(&kalkulacka); } } else { printf("no input\n"); return 0; } break; } } } else { printf("bad input\n"); return 0; } } return 0; }