usaa24/cv3/program.c

108 lines
2.4 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("%.2f ", calc->stack[i]);
}
printf("\no input\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;
}