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: 20110325-Fri-matematic.c
3 * Datum: 25.03.2011 10:08
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 <stdlib.h>
14 #include <time.h>
15
16 /* *************** Makra ******************** */
17 #define ARREYC 1024
18
19 /* *************** Funkce ******************** */
20
21 int plus(char priklad[])
22 {
23 int a = rand() % 99;
24 int b = rand() % (100 - a);
25 sprintf(priklad, "%d + %d", a, b);
26 return a + b;
27 }
28
29 int minus(char priklad[])
30 {
31 int a = rand() % 99;
32 int b = rand() % 99;
33 if (a < b) {
34 int bagr = a;
35 a = b;
36 b = bagr;
37 }
38 sprintf(priklad, "%d - %d", a, b);
39 return a - b;
40 }
41
42 int krat(char priklad[])
43 {
44 int a = rand() % 11;
45 int b = rand() % 11;
46 sprintf(priklad, "%d * %d", a, b);
47 return a * b;
48 }
49
50 int deleno(char priklad[])
51 {
52 int a = (rand() % 10) + 1;
53 int b = rand() % 11;
54 sprintf(priklad, "%d : %d", a * b, a);
55 return b;
56 }
57
58 /****************************************************
59 * Hlavní program.
60 ****************************************************/
61 int main(int argc, char *argv[])
62 {
63 srand(time(NULL));
64
65 // typedef říká, že ODKAZ není identifikátor proměnné, ale
66 // identifikátor datového typu.
67
68 // odkaz na funkci, která vrací int a přebírá řetězec.
69 typedef int (*OPERACE) (char *);
70 OPERACE operace;
71
72 OPERACE zadani[128];
73 int zadanic = 0; // počet prvků v poli zadani
74
75 puts("zadej matematické operace");
76 char radek[128];
77 fgets(radek, 128, stdin);
78 char znak;
79 int i = 0;
80 while ((znak = radek[i]) != '\0') {
81 if (znak == '+') {
82 zadani[zadanic] = plus;
83 zadanic++;
84 } else if (znak == '-') {
85 zadani[zadanic] = minus;
86 zadanic++;
87 } else if (znak == '*') {
88 zadani[zadanic] = krat;
89 zadanic++;
90 } else if (znak == ':') {
91 zadani[zadanic] = deleno;
92 zadanic++;
93 }
94 i++;
95 }
96
97 if (zadanic == 0) {
98 zadani[0] = plus;
99 zadani[1] = minus;
100 zadani[2] = krat;
101 zadani[3] = deleno;
102 zadanic = 4;
103 }
104
105 int j=0;
106 while (++j<30) {
107 int vysledek;
108 char priklad[128];
109 operace = zadani[rand() % zadanic];
110 vysledek = operace(priklad);
111 printf("%s = %d\n", priklad, vysledek);
112 }
113
114 return 0;
115 }