usaa24/cv3/program.c

109 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}