diff --git a/cv3/program.c b/cv3/program.c new file mode 100644 index 0000000..1c85e15 --- /dev/null +++ b/cv3/program.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include + +#define STACK_SIZE 10 + +struct stack { + float values[STACK_SIZE]; + int size; +}; + + +void push_stack(struct stack* stack, float value); +float pop_stack(struct stack* stack); +void print_stack(struct stack* stack); +int is_number(const char* str); + + +int main() { + struct stack mystack; + memset(&mystack, 0, sizeof(struct stack)); + + char input[50]; + while (1) { + printf("Enter a number or an operator (+, -, *, /): "); + if (!fgets(input, sizeof(input), stdin)) { + break; + } + + input[strcspn(input, "\n")] = 0; + + if (is_number(input)) { + + float value = atof(input); + push_stack(&mystack, value); + } else if (strlen(input) == 1 && strchr("+-*/", input[0])) { + + float b = pop_stack(&mystack); + float a = pop_stack(&mystack); + float result; + + switch (input[0]) { + case '+': + result = a + b; + break; + case '-': + result = a - b; + break; + case '*': + result = a * b; + break; + case '/': + if (b == 0) { + fprintf(stderr, "Error: Division by zero.\n"); + exit(EXIT_FAILURE); + } + result = a / b; + break; + default: + fprintf(stderr, "Error: Invalid operator.\n"); + exit(EXIT_FAILURE); + } + push_stack(&mystack, result); + } else { + fprintf(stderr, "Error: Invalid input.\n"); + exit(EXIT_FAILURE); + } + + + print_stack(&mystack); + } + + return 0; +} + + +void push_stack(struct stack* stack, float value) { + assert(stack->size < STACK_SIZE); + stack->values[stack->size] = value; + stack->size += 1; +} + + +float pop_stack(struct stack* stack) { + assert(stack->size > 0); + stack->size -= 1; + return stack->values[stack->size]; +} + + +void print_stack(struct stack* stack) { + for (int i = 0; i < stack->size; i++) { + printf("%.2f ", stack->values[i]); + } + printf("\n"); +} + + +int is_number(const char* str) { + char* endptr; + strtod(str, &endptr); + return *endptr == '\0' && endptr != str; +}