diff --git a/cv3/program.c b/cv3/program.c index 0d613e3..8434c3d 100644 --- a/cv3/program.c +++ b/cv3/program.c @@ -5,106 +5,94 @@ #define STACK_SIZE 10 - +// Структура стека struct stack { float values[STACK_SIZE]; int size; }; - +// Функция для инициализации стека void init_stack(struct stack* s) { memset(s, 0, sizeof(struct stack)); } - +// Функция для добавления значения в стек void push_stack(struct stack* s, float value) { - assert(s->size < STACK_SIZE); + assert(s->size < STACK_SIZE); // Проверка переполнения стека s->values[s->size] = value; s->size += 1; } - +// Функция для извлечения значения из стека float pop_stack(struct stack* s) { - assert(s->size > 0); + assert(s->size > 0); // Проверка на наличие элементов в стеке s->size -= 1; return s->values[s->size]; } - +// Функция для вывода содержимого стека void print_stack(struct stack* s) { for (int i = 0; i < s->size; i++) { - printf("%.2f ", s->values[i]); + printf("%.2f ", s->values[i]); // Форматируем вывод с двумя знаками после запятой } printf("\n"); } +// Функция для обработки операции +void process_operation(struct stack* s, const char* operation) { + float b = pop_stack(s); + float a = pop_stack(s); + if (strcmp(operation, "+") == 0) { + push_stack(s, a + b); + } else if (strcmp(operation, "-") == 0) { + push_stack(s, a - b); + } else if (strcmp(operation, "*") == 0) { + push_stack(s, a * b); + } else if (strcmp(operation, "/") == 0) { + if (b == 0) { + printf("Chyba: Delenie nulou.\n"); + exit(1); // Завершаем программу при делении на ноль + } + push_stack(s, a / b); + } +} + int main() { struct stack mystack; init_stack(&mystack); char input[256]; - int has_input = 0; + int has_input = 0; // Переменная для отслеживания ввода + printf("Poľská kalkulačka\n"); while (1) { - + // Считывание ввода printf("Zadajte číslo alebo operáciu (+, -, *, /): "); if (!fgets(input, sizeof(input), stdin)) { - break; + break; // Выход при ошибке ввода } - + // Удаляем символ новой строки, если он есть input[strcspn(input, "\n")] = 0; - + // Проверка, является ли ввод числом char* endptr; float value = strtof(input, &endptr); - if (endptr != input) { + if (endptr != input) { // Если это число push_stack(&mystack, value); - has_input = 1; + has_input = 1; // Указываем, что был ввод print_stack(&mystack); continue; } - - if (strcmp(input, "+") == 0) { + // Если это не число, проверяем на операции + if (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 || + strcmp(input, "*") == 0 || strcmp(input, "/") == 0) { if (mystack.size < 2) { printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); break; } - float b = pop_stack(&mystack); - float a = pop_stack(&mystack); - push_stack(&mystack, a + b); - print_stack(&mystack); - } else if (strcmp(input, "-") == 0) { - if (mystack.size < 2) { - printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); - break; - } - float b = pop_stack(&mystack); - float a = pop_stack(&mystack); - push_stack(&mystack, a - b); - print_stack(&mystack); - } else if (strcmp(input, "*") == 0) { - if (mystack.size < 2) { - printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); - break; - } - float b = pop_stack(&mystack); - float a = pop_stack(&mystack); - push_stack(&mystack, a * b); - print_stack(&mystack); - } else if (strcmp(input, "/") == 0) { - if (mystack.size < 2) { - printf("Chyba: Nedostatok hodnôt v zásobníku.\n"); - break; - } - float b = pop_stack(&mystack); - float a = pop_stack(&mystack); - if (b == 0) { - printf("Chyba: Delenie nulou.\n"); - break; - } - push_stack(&mystack, a / b); + process_operation(&mystack, input); print_stack(&mystack); } else { printf("Chyba: Neplatný vstup.\n"); @@ -112,9 +100,9 @@ int main() { } } - + // Если не было введено ни одного значения, выводим сообщение if (has_input) { - printf("\n"); + printf("no input\n"); } else { printf("no input\n"); }