usaa24/cv3/program.c

120 lines
3.2 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("Not enough values in the stack for operation! Exiting program.\n");
exit(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); // Вихід з програми при невірному введенні
break;
}
}
return 1;
}
int main() {
struct stack my_stack;
init(&my_stack);
printf("\n");
while (1) {
if (read(&my_stack) == 0) {
break;
}
}
return 0;
}