diff --git a/du3/program.c b/du3/program.c index e5e24a7..c6f253e 100644 --- a/du3/program.c +++ b/du3/program.c @@ -1,68 +1,77 @@ -#include #include #include +#include -#define LIST_SIZE 100 +#define STACK_SIZE 10 -struct listok { - char nazov[101]; - float cena; +struct stack { + float values[STACK_SIZE]; + int size; }; -int add_listok(struct listok *p, int *n){ - if (fgets(p[*n].nazov, 101, stdin) == NULL){ - return 0; +void print_stack(struct stack *s) { + for (int i = 0; i < s->size; i++) { + printf("%.2f ", s->values[i]); } - - p[*n].nazov[strcspn(p[*n].nazov, "\n")] = 0; - - if (scanf("%f", &p[*n].cena) != 1){ - return 0; - } - - getchar(); - *n = *n + 1; - return 1; + printf("\n"); } -int compare(struct listok *a, struct listok *b){ - if (a->cena > b->cena){ - return 1; +void push_stack(struct stack *s, float value) { + if (s->size >= STACK_SIZE) { + printf("no input\n"); + exit(0); } - if (a->cena < b->cena){ - return -1; - } - return strcmp(a->nazov, b->nazov); + s->values[s->size] = value; + s->size++; } -void sort_listok(struct listok *p, int n){ - for (int i = 0; i < n - 1; i++){ - for (int j = i + 1; j < n; j++){ - if (compare(&p[i], &p[j]) > 0){ - struct listok tmp = p[i]; - p[i] = p[j]; - p[j] = tmp; +float pop_stack(struct stack *s) { + if (s->size <= 0) { + printf("no input\n"); + exit(0); + } + s->size--; + return s->values[s->size]; +} + +int main() { + struct stack s; + s.size = 0; + + char input[100]; + + while (scanf("%s", input) == 1) { + if (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 || + strcmp(input, "*") == 0 || strcmp(input, "/") == 0) { + + if (s.size < 2) { + printf("no input\n"); + exit(0); } + + float b = pop_stack(&s); + float a = pop_stack(&s); + float result; + + if (strcmp(input, "+") == 0) result = a + b; + else if (strcmp(input, "-") == 0) result = a - b; + else if (strcmp(input, "*") == 0) result = a * b; + else result = a / b; + + push_stack(&s, result); + print_stack(&s); + } + else { + char *endptr; + float val = strtof(input, &endptr); + if (*endptr != '\0') { + printf("no input\n"); + exit(0); + } + push_stack(&s, val); + print_stack(&s); } } -} - -void print_listok(struct listok *p, int n){ - for (int i = 0; i < n; i++){ - printf("%s\n", p[i].nazov); - printf("%f\n", p[i].cena); - } -} - -int main(){ - struct listok p[LIST_SIZE]; - int n = 0; - - while (add_listok(p, &n)){ - } - - sort_listok(p, n); - print_listok(p, n); return 0; }