usaa20/cv3/program.c

88 lines
2.4 KiB
C
Raw Permalink Normal View History

2020-10-14 16:57:47 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_SIZE 10
typedef struct {
float values[STACK_SIZE];
int size;
} stack;
void stack_print (stack* stack);
void stack_push (stack* stack,float value);
float stack_pop (stack* stack);
void my_exit(int flag, const char* input);
int main(void) {
stack* p_stack = (stack*) malloc(sizeof(stack));
memset(p_stack, 0, sizeof(stack));
while(1) {
char str[128] = { 0 };
char* tres = fgets(str, 128, stdin);
if(tres == NULL || str[0] == 0 || (str[1] == 0 && str[0] == '\n'))
2020-10-14 16:58:55 +00:00
my_exit(1, "no input");
2020-10-14 16:57:47 +00:00
str[strlen(str) - 1] = 0;
// if number
if(strlen(str) > 1 || (str[0] >= '0' && str[0] <= '9')) {
2020-10-14 17:00:12 +00:00
my_exit(p_stack->size >= STACK_SIZE, "full stack");
2020-10-14 16:57:47 +00:00
my_exit(str[0] == '.', "bad input");
float res = 0.f;
int dots = 0;
for(int i = 0; i < strlen(str); i++)
if(str[i]=='.') dots++;
else my_exit(str[i] < '0' || str[i] > '9', "bad input");
res = atof(str);
stack_push(p_stack, res);
}
else {
my_exit(p_stack->size < 2, "not enough operands");
float b = stack_pop(p_stack);
float a = stack_pop(p_stack);
char op = str[0];
float res;
switch (op) {
case '+':
res = a + b;
break;
case '-':
res = a - b;
break;
case '*':
res = a * b;
break;
case '/':
my_exit(b == 0.f, "division by zero");
res = a / b;
break;
default:
my_exit(1, "bad input");
}
stack_push(p_stack, res);
}
stack_print(p_stack);
}
free(p_stack);
}
void stack_print(stack* st) {
for(int i = 0; i < st->size; i++)
printf("%.2f ",st->values[i]);
printf("\n");
}
void stack_push(stack* st, float push_value) {
if(st->size < STACK_SIZE)
st->values[st->size++] = push_value;
}
float stack_pop(stack* st) {
if(st->size > 0)
return st->values[--st->size];
}
void my_exit(int flag, const char* input) {
if (flag) {
printf("%s\n", input);
exit(0);
}
2020-10-14 16:46:27 +00:00
}