diff --git a/cv3/program.c b/cv3/program.c index 40e58c0..88a101b 100644 --- a/cv3/program.c +++ b/cv3/program.c @@ -1,56 +1,58 @@ #include #include #include -#include +#include #define STACK_SIZE 10 -// Stack structure struct stack { float values[STACK_SIZE]; int size; }; -// Function to print the stack void print_stack(struct stack* s) { for (int i = 0; i < s->size; i++) { printf("%.2f", s->values[i]); if (i < s->size - 1) { - printf(" "); // Print space between values + printf(" "); + } else { + printf(" "); } } printf("\n"); } -// Function to push a value onto the stack void push_stack(struct stack* s, float value) { if (s->size >= STACK_SIZE) { - printf("Chyba: zasobnik je plny\n"); - exit(1); + printf("full stack\n"); + exit(0); } s->values[s->size++] = value; } -// Function to pop a value from the stack float pop_stack(struct stack* s) { if (s->size == 0) { - printf("Chyba: zasobnik je prazdny\n"); - exit(1); + printf("empty stack\n"); + exit(0); } return s->values[--s->size]; } -// Check if input is an operator int is_operator(char* input) { return (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 || strcmp(input, "*") == 0 || strcmp(input, "/") == 0); } -// Perform the operation on the top of the stack +int is_valid_float(char* input) { + char* endptr; + strtod(input, &endptr); + return *endptr == '\0'; +} + void perform_operation(struct stack* s, char* operator) { if (s->size < 2) { - printf("Chyba: nedostatok operandov\n"); - exit(1); + printf("not enough operands\n"); + exit(0); } float b = pop_stack(s); @@ -65,13 +67,13 @@ void perform_operation(struct stack* s, char* operator) { result = a * b; } else if (strcmp(operator, "/") == 0) { if (b == 0) { - printf("Chyba: delenie nulou\n"); - exit(1); + printf("division by zero\n"); + exit(0); } result = a / b; } else { printf("Chyba: neplatna operacia\n"); - exit(1); + exit(0); } push_stack(s, result); @@ -82,26 +84,19 @@ int main() { struct stack mystack; mystack.size = 0; - // Reading input from stdin until EOF or an error occurs while (fgets(input, sizeof(input), stdin) != NULL) { - input[strlen(input) - 1] = '\0'; // Remove newline character + input[strlen(input) - 1] = '\0'; - // Try to parse input as a number - float value; - if (sscanf(input, "%f", &value) == 1) { + if (is_valid_float(input)) { + float value = atof(input); push_stack(&mystack, value); - } - // If it's not a number, check if it's a valid operator - else if (is_operator(input)) { + } else if (is_operator(input)) { perform_operation(&mystack, input); - } - // Invalid input - else { - printf("Chyba: neplatny vstup\n"); - return 1; + } else { + printf("bad input\n"); + return 0; } - // Print stack after each valid input print_stack(&mystack); }