usaa24/cv3/program.c

112 lines
3.5 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>
#include <assert.h>
#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); // Проверка переполнения стека
s->values[s->size] = value;
s->size += 1;
}
// Функция для извлечения значения из стека
float pop_stack(struct stack* s) {
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("\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; // Переменная для отслеживания ввода
printf("Poľská kalkulačka\n");
while (1) {
// Считывание ввода
printf("Zadajte číslo alebo operáciu (+, -, *, /): ");
if (!fgets(input, sizeof(input), stdin)) {
break; // Выход при ошибке ввода
}
// Удаляем символ новой строки, если он есть
input[strcspn(input, "\n")] = 0;
// Проверка, является ли ввод числом
char* endptr;
float value = strtof(input, &endptr);
if (endptr != input) { // Если это число
push_stack(&mystack, value);
has_input = 1; // Указываем, что был ввод
print_stack(&mystack);
continue;
}
// Если это не число, проверяем на операции
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;
}
process_operation(&mystack, input);
print_stack(&mystack);
} else {
printf("Chyba: Neplatný vstup.\n");
break;
}
}
// Если не было введено ни одного значения, выводим сообщение
if (has_input) {
printf("no input\n");
} else {
printf("no input\n");
}
return 0;
}