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-matematika.c
3 * Datum: 25.03.2011 08:24
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 #include <string.h>
16
17 /* *************** Makra ******************** */
18 #define ARREYC 1024
19 #define PRIKLC 128
20
21 /* *************** Funkce ******************** */
22
23 int plus(char priklad[])
24 {
25 int a = rand() % 100;
26 int b = rand() % (100 - a);
27 sprintf(priklad, "%2d + %2d", a, b);
28 return a + b;
29 }
30
31 int minus(char priklad[])
32 {
33 int a = (rand() % 99) + 1;
34 int b = (rand() % 99) + 1;
35 if (a < b) {
36 int bagr = a;
37 a = b;
38 b = bagr;
39 }
40 sprintf(priklad, "%2d - %2d", a, b);
41 return a - b;
42 }
43
44 int krat(char priklad[])
45 {
46 int a = (rand() % 10) + 1;
47 int b = (rand() % 10) + 1;
48 sprintf(priklad, "%2d * %2d", a, b);
49 return a * b;
50 }
51
52 int deleno(char priklad[])
53 {
54 int a = (rand() % 10) + 1;
55 int b = (rand() % 10) + 1;
56 sprintf(priklad, "%2d : %2d", a * b, a);
57 return b;
58 }
59
60
61 /****************************************************
62 * Hlavní program.
63 ****************************************************/
64 int main(int argc, char *argv[])
65 {
66 srand(time(NULL));
67 // ukazatel na funkci, která přebírá řetězec a vrací integer
68
69 typedef int (*OPERACE) (char *);
70 OPERACE operace;
71
72 // pole ukazatelů na funkkce
73 OPERACE zadani[128];
74 int zadanic = 0; // proměnná uchovává počet prvků v poli zadani
75
76
77 if (argc == 2) {
78 char znak;
79 int i = 0;
80 while ((znak = argv[1][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 vysl = 0;
106 int j = 0;
107 char priklad[PRIKLC];
108 while (j++ < 30) {
109 operace = zadani[rand() % zadanic];
110 vysl = operace(priklad);
111 printf("%s = %d\n", priklad, vysl);
112 }
113
114
115
116 return 0;
117 }