Update cv3/program.c
This commit is contained in:
parent
40baab05f7
commit
53462b2416
109
cv3/program.c
109
cv3/program.c
@ -0,0 +1,109 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user