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-kalkul.c
3 * Datum: 01.04.2011 10:04
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 ZASPOC 32
18 #define DELKA 32
19
20 /* *************** Funkce ******************** */
21
22 void push(double number);
23 double pop(void);
24 void tiskni(void);
25
26 /****************************************************
27 * Hlavní program.
28 ****************************************************/
29 int main(void)
30 {
31 char vstup[DELKA];
32 double cislo, x, y;
33 while (scanf("%s", vstup) != EOF) {
34 if (sscanf(vstup, "%lg", &cislo) == 1) {
35 push(cislo);
36 /* } else if ( vstup[0]='+' ) {*/
37 } else if (strcmp(vstup, "+") == 0) {
38 y = pop();
39 x = pop();
40 if (isnan(x)) {
41 push(y);
42 fprintf(stderr, "potřebuji dva operandy\n");
43 } else {
44 push(x + y);
45 tiskni();
46 }
47 } else if (strcmp(vstup, "-") == 0) {
48 proved2(minus);
49 } else if (strcmp(vstup, "*") == 0) {
50 y = pop();
51 x = pop();
52 push(x * y);
53 printf("%g\n", x * y);
54 } else if (strcmp(vstup, "/") == 0) {
55 y = pop();
56 x = pop();
57 push(x / y);
58 printf("%g\n", x / y);
59 } else if (strcmp(vstup, "ln") == 0) {
60 x = pop();
61 if (isnan(x)) {
62 push(y);
63 fprintf(stderr, "potřebuji dva operandy\n");
64 } else {
65 push(log(x));
66 tiskni();
67 }
68 } else if (strcmp(vstup, "log") == 0) {
69 x = pop();
70 if (isnan(x)) {
71 push(y);
72 fprintf(stderr, "potřebuji dva operandy\n");
73 } else {
74 push(log10(x));
75 tiskni();
76 }
77 } else if (strcmp(vstup, "**") == 0) {
78 y = pop();
79 x = pop();
80 if (isnan(x)) {
81 push(y);
82 fprintf(stderr, "potřebuji dva operandy\n");
83 } else {
84 push(pow(x,y));
85 tiskni();
86 }
87 } else if (strcmp(vstup, "print") == 0) {
88 tiskni();
89 } else {
90 fprintf(stderr, "Neplatný vstup\n");
91 }
92 }
93
94 return 0;
95 }
96
97 double zasobnik[ZASPOC];
98 int pocet = 0;
99
100 void push(double number)
101 {
102 if (pocet < ZASPOC) {
103 zasobnik[pocet] = number;
104 pocet++;
105 }
106 }
107
108 double pop(void)
109 {
110 if (pocet > 0) {
111 pocet--;
112 return zasobnik[pocet];
113 } else {
114 return NAN;
115 }
116 }
117
118 void tiskni(void)
119 {
120 printf("[ ");
121 for (int i = 0; i < pocet; i++) {
122 printf("%g ", zasobnik[i]);
123 }
124 printf("]\n");
125 }