usaa24/cv3/program.c

89 lines
3.1 KiB
C
Raw Permalink 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>
#define STACK_SIZE 10 // Максимальный размер стека
double stack[STACK_SIZE]; // Массив для стека
int top = 0; // Индекс верхнего элемента стека
// Функция для вывода элементов стека
void print_stack() {
for (int i = 0; i < top; i++) {
printf("%.2f ", stack[i]); // Выводим значение с двумя знаками после запятой
}
printf("\n");
}
// Функция для добавления элемента в стек
int push(double value) {
if (top >= STACK_SIZE) {
printf("full stack\n"); // Стек переполнен
return 0;
}
stack[top++] = value; // Добавляем элемент в стек
print_stack(); // Выводим текущий стек
return 1;
}
// Функция для извлечения элемента из стека
int pop(double *value) {
if (top <= 0) {
printf("not enough operands\n"); // Недостаточно операндов
return 0;
}
*value = stack[--top]; // Извлекаем верхний элемент
return 1;
}
// Функция для применения операции к двум верхним элементам стека
int apply_operation(char op) {
double a, b;
if (!pop(&b) || !pop(&a)) {
return 0; // Если не удалось извлечь операнды, возвращаем 0
}
double result; // Переменная для хранения результата
switch (op) {
case '+': result = a + b; break; // Сложение
case '-': result = a - b; break; // Вычитание
case '*': result = a * b; break; // Умножение
case '/':
if (b == 0) {
printf("division by zero\n"); // Деление на ноль
return 0;
}
result = a / b; // Деление
break;
default:
printf("bad input\n"); // Некорректный ввод операции
return 0;
}
return push(result); // Добавляем результат в стек
}
// Главная функция
int main() {
char input[100]; // Буфер для ввода
while (scanf("%s", input) == 1) { // Чтение ввода
char *end;
double value = strtod(input, &end); // Преобразование строки в число
// Если вся строка была преобразована в число
if (*end == '\0') {
if (!push(value)) return 0; // Добавляем значение в стек
} else if (input[1] == '\0' && strchr("+-*/", input[0])) {
// Если это одна из операций
if (!apply_operation(input[0])) return 0; // Применяем операцию
} else {
printf("bad input\n"); // Некорректный ввод
return 0;
}
}
printf("no input\n"); // Если нет ввода
return 0;
}