usaa24/cv3/program.c

125 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 <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("Stack is full! Exiting program.\n");
exit(1); // Вихід з програми при переповненні
}
}
float pop_stack(struct stack *s) {
if (s->size > 0) {
s->size--;
return s->values[s->size];
} else {
printf("Stack is empty! Exiting program.\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");
return 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");
return 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("Cannot divide by zero! Exiting program.\n");
exit(1); // Вихід з програми при діленні на нуль
}
result = a / b;
break;
}
push_stack(s, result); // Додаємо результат назад у стек
printf("%.2f\n", result); // Виводимо результат
break;
}
default:
printf("Invalid input. Please enter a number or an operator. Exiting program.\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;
}