From 53462b2416f78c61036ac420b44b2e1a345f63a3 Mon Sep 17 00:00:00 2001 From: Viktor Daniv Date: Mon, 7 Oct 2024 12:08:33 +0000 Subject: [PATCH] Update cv3/program.c --- cv3/program.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/cv3/program.c b/cv3/program.c index e69de29..8bd522e 100644 --- a/cv3/program.c +++ b/cv3/program.c @@ -0,0 +1,109 @@ +#include +#include +#include + +#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; +} \ No newline at end of file