diff --git a/cv3/program.c b/cv3/program.c index d9d2e9b..ec49735 100644 --- a/cv3/program.c +++ b/cv3/program.c @@ -1,40 +1,104 @@ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #define LINE_SIZE 100 -#define STACK_SIZE 100 +#define STACK_SIZE 10 -struct stack{ - float values[LINE_SIZE]; - int size; +struct stack { + float values[STACK_SIZE]; + int size; }; -void print_stack(struct stack* stack){ - for (int i = 0; i < stack->size; i++){ - printf("%.0f", stack->values[i]); - } - printf("\n"); +void print_stack(struct stack* stack) { + for (int i = 0; i < stack->size; i++) { + printf("%.2f ", stack->values[i]); + } + printf("\n"); } -int main(){ - char input[LINE_SIZE]; float y; struct stack mystack; - memset(&mystack, 0, sizeof(struct stack)); - - while(fgets(input, LINE_SIZE, stdin) != NULL){ - input[strlen(input - 1)] = '\0'; - if(sscanf(input, "\f", &y) == 1){ - printf("Success!\n"); - assert(mystack.size < STACK_SIZE); - mystack.values[mystack.size] = y; - mystack.size ++; - } else{ - return 1; - } - print_stack(&mystack); - } - return 0; +void push_stack(struct stack* stack, float value) { + if (stack->size >= STACK_SIZE) { + printf("Chyba: zasobnik je plny\n"); + exit(1); + } + stack->values[stack->size] = value; + stack->size++; +} + +float pop_stack(struct stack* stack) { + if (stack->size == 0) { + printf("Chyba: zasobnik je prazdny\n"); + exit(1); + } + stack->size--; + return stack->values[stack->size]; +} + +int is_operator(char* input) { + return (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 || + strcmp(input, "*") == 0 || strcmp(input, "/") == 0); +} + +void perform_operation(struct stack* stack, char* operator) { + if (stack->size < 2) { + printf("Chyba: nedostatok operandov\n"); + exit(1); + } + + float b = pop_stack(stack); + float a = pop_stack(stack); + float result; + + if (strcmp(operator, "+") == 0) { + result = a + b; + } else if (strcmp(operator, "-") == 0) { + result = a - b; + } else if (strcmp(operator, "*") == 0) { + result = a * b; + } else if (strcmp(operator, "/") == 0) { + if (b == 0) { + printf("Chyba: delenie nulou\n"); + exit(1); + } + result = a / b; + } else { + printf("Chyba: neplatna operacia\n"); + exit(1); + } + + push_stack(stack, result); +} + +int main() { + char input[LINE_SIZE]; + float value; + struct stack mystack; + memset(&mystack, 0, sizeof(struct stack)); + + while (fgets(input, LINE_SIZE, stdin) != NULL) { + // Remove trailing newline character + input[strlen(input) - 1] = '\0'; + + // Try to parse input as a number + if (sscanf(input, "%f", &value) == 1) { + push_stack(&mystack, value); + } + // If it's not a number, check if it's a valid operator + else if (is_operator(input)) { + perform_operation(&mystack, input); + } + // Invalid input + else { + printf("Chyba: neplatny vstup\n"); + return 1; + } + + // Print stack after each input + print_stack(&mystack); + } + + return 0; } -