109 lines
2.7 KiB
C
109 lines
2.7 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
#define STACK_SIZE 10
|
||
|
||
// Структура для калькулятора зі стеком
|
||
typedef struct {
|
||
double stack[STACK_SIZE];
|
||
int top;
|
||
} Calculator;
|
||
|
||
// Ініціалізація калькулятора
|
||
void init(Calculator *calc) {
|
||
calc->top = -1;
|
||
}
|
||
|
||
// Додавання числа до стека
|
||
int push(Calculator *calc, double value) {
|
||
if (calc->top >= STACK_SIZE - 1) {
|
||
printf("Chyba: zasobnik je plny\n");
|
||
return 0;
|
||
}
|
||
calc->stack[++(calc->top)] = value;
|
||
return 1;
|
||
}
|
||
|
||
// Вилучення числа зі стека
|
||
int pop(Calculator *calc, double *value) {
|
||
if (calc->top < 0) {
|
||
printf("Chyba: zasobnik je prazdny\n");
|
||
return 0;
|
||
}
|
||
*value = calc->stack[(calc->top)--];
|
||
return 1;
|
||
}
|
||
|
||
// Виведення значень в стеку
|
||
void print_stack(Calculator *calc) {
|
||
for (int i = 0; i <= calc->top; i++) {
|
||
printf("%.6f ", calc->stack[i]);
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
// Основна функція для роботи з операціями
|
||
int perform_operation(Calculator *calc, char op) {
|
||
double a, b;
|
||
if (!pop(calc, &b) || !pop(calc, &a)) {
|
||
return 0; // Не вдалося вилучити два числа
|
||
}
|
||
|
||
switch (op) {
|
||
case '+':
|
||
push(calc, a + b);
|
||
break;
|
||
case '-':
|
||
push(calc, a - b);
|
||
break;
|
||
case '*':
|
||
push(calc, a * b);
|
||
break;
|
||
case '/':
|
||
if (b == 0) {
|
||
printf("Chyba: deleni nulou\n");
|
||
return 0;
|
||
}
|
||
push(calc, a / b);
|
||
break;
|
||
default:
|
||
printf("Chyba: neplatna operacia\n");
|
||
return 0;
|
||
}
|
||
|
||
print_stack(calc);
|
||
return 1;
|
||
}
|
||
|
||
// Головна функція програми
|
||
int main() {
|
||
Calculator calc;
|
||
init(&calc);
|
||
|
||
char input[50];
|
||
|
||
while (fgets(input, sizeof(input), stdin)) {
|
||
// Спроба обробити як число
|
||
char *end;
|
||
double value = strtod(input, &end);
|
||
|
||
if (end != input && *end == '\n') {
|
||
// Це дійсне число
|
||
if (!push(&calc, value)) {
|
||
return 1; // Стек переповнений
|
||
}
|
||
print_stack(&calc);
|
||
} else if (strlen(input) == 2 && strchr("+-*/", input[0])) {
|
||
// Це операція
|
||
if (!perform_operation(&calc, input[0])) {
|
||
return 1; // Помилка операції
|
||
}
|
||
} else {
|
||
printf("Chyba: neplatny vstup\n");
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
} |