Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
1/1
Na této stránce jsou k dispozici zdrojové soubory, které jsem vytvářel při výkladu během výuky. Nejsou to ukázkové a bezchybné zdrojové soubory. Ba naopak, jsou to pracovní neučesané verze, které vznikaly interaktivně ve výuce, často s cílem ukázat, že "takto se to nemá".
1 /*
2 * Soubor: 20110401-Fri-kalkulacka.c
3 * Datum: 01.04.2011 08:28
4 * Autor: Marek Nožka, nozka <@t> spseol <d.t> cz
5 * Licence: GNU/GPL
6 * Úloha:
7 * Popis:
8 ****************************************************/
9 #define _ISOC99_SOURCE
10 #define _GNU_SOURCE
11 #include <stdio.h>
12 #include <stdbool.h>
13 #include <math.h>
14 #include <string.h>
15
16 /* *************** Makra ******************** */
17 #define STACKLEN 128
18
19 /* *************** Funkce ******************** */
20
21 void push(double number);
22 double pop(void);
23 void stackPrint(void);
24
25 /****************************************************
26 * Hlavní program.
27 ****************************************************/
28 int main(void)
29 {
30 char enter[32];
31 double number, x, y;
32
33 while (scanf("%s", enter) != EOF) {
34 if (sscanf(enter, "%lg", &number) == 1) {
35 push(number);
36 /* } else if ( enter[0]== '+' ) {*/
37 } else if (strcmp(enter, "+") == 0) {
38 y = pop();
39 x = pop();
40 if (!isnan(x)) {
41 push(x + y);
42 stackPrint();
43 } else {
44 push(y);
45 fprintf(stderr, "pro + jsou potřeba dva operandy\n");
46 }
47 } else if (strcmp(enter, "-") == 0) {
48 y = pop();
49 x = pop();
50 printf(" >> %g\n", x - y);
51 push(x - y);
52 } else if (strcmp(enter, "*") == 0) {
53 y = pop();
54 x = pop();
55 printf(" >> %g\n", x * y);
56 push(x * y);
57 } else if (strcmp(enter, "/") == 0) {
58 y = pop();
59 x = pop();
60 printf(" >> %g\n", x / y);
61 push(x / y);
62 } else if (strcmp(enter, "ln") == 0) {
63 x = pop();
64 if (!isnan(x)) {
65 printf(" >> %g\n", log(x));
66 push(log(x));
67 }
68 } else if (strcmp(enter, "log") == 0) {
69 x = pop();
70 if (!isnan(x)) {
71 printf(" >> %g\n", log10(x));
72 push(log10(x));
73 }
74 } else if (strcmp(enter, "print") == 0) {
75 stackPrint();
76 } else {
77 printf(" >> Neplatný vstup");
78 }
79 }
80
81
82 return 0;
83 }
84
85
86
87 double stack[STACKLEN];
88 int stackcount = 0;
89
90 void push(double number)
91 {
92 if (stackcount < STACKLEN) {
93 stack[stackcount] = number;
94 stackcount++;
95 }
96 }
97
98 double pop(void)
99 {
100 if (stackcount > 0) {
101 stackcount--;
102 return stack[stackcount];
103 } else {
104 return NAN;
105 }
106 }
107
108 void stackPrint(void)
109 {
110 printf("[ ");
111 for (int i=0; i<stackcount; i++) {
112 printf("%g ",stack[i]);
113 }
114 printf("]\n");
115 }