usaa24/cv3/program.c

125 lines
3.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 <string.h>
#include <math.h>
#include <stdlib.h>
#define STACK_SIZE 10
struct stack {
float values[STACK_SIZE];
int size;
};
void init(struct stack *s) {
s->size = 0;
}
void push_stack(struct stack *s, float value) {
if (s->size < STACK_SIZE) {
s->values[s->size] = value;
s->size++;
} else {
printf("no input.\n");
exit(1); // Вихід з програми при переповненні
}
}
float pop_stack(struct stack *s) {
if (s->size > 0) {
s->size--;
return s->values[s->size];
} else {
printf("no input\n");
exit(1); // Вихід з програми при порожньому стеку
}
}
void print_stack(struct stack *s) {
for (int i = 0; i < s->size; i++) {
printf("%.2f ", s->values[i]);
}
printf("\n");
}
int read(struct stack *s) {
char temp[100];
// Читаємо рядок з вводу
if (fgets(temp, sizeof(temp), stdin) == NULL) {
return 0; // Помилка при читанні
}
// Перевірка на пустий рядок
if (strcmp(temp, "\n") == 0) {
printf("no input\n");
exit(1); // Повертаємо 1, щоб продовжити цикл
}
// Завершення програми
if (strcmp(temp, "end\n") == 0) {
return 0;
}
float value;
int scan = sscanf(temp, "%f", &value);
// Якщо це число
if (scan == 1) {
push_stack(s, value);
print_stack(s); // Виводимо стек після додавання
} else {
// Якщо це оператор
switch (temp[0]) {
case '+':
case '-':
case '*':
case '/': {
// Перевірка на недостатню кількість значень у стеку
if (s->size < 2) {
printf("no input\n");
exit(1); // Повертаємо 1, щоб продовжити цикл, без виходу з програми
}
float b = pop_stack(s); // Витягуємо значення
float a = pop_stack(s);
float result;
switch (temp[0]) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/':
if (b == 0) {
printf("no input\n");
exit(1); // Вихід з програми при діленні на нуль
}
result = a / b;
break;
}
push_stack(s, result); // Додаємо результат назад у стек
printf("%.2f\n", result); // Виводимо результат
break;
}
default:
printf("no input\n");
exit(1); // Вихід з програми при невірному введенні
}
}
return 1; // Продовжуємо цикл
}
int main() {
struct stack my_stack;
init(&my_stack);
printf("\n");
while (1) {
if (read(&my_stack) == 0) {
break;
}
}
return 0;
}