´ Sb´ırka uloh z jazyka C
¨ Petr Krajˇca, Tom´asˇ Kuhr, Vil´em Vychodil
´ UNIVERZITA PALACKEHO V OLOMOUCI
Obsah 1
2
3
4
Z´aklady jazyka C
5
1.1
Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.2
Pr´ace s promˇennymi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´
5
1.3
Osmiˇckovy´ a sˇ estn´actkovy´ vystup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´
5
Oper´atory
6
2.1
Obsah obd´eln´ıku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2
´ Sestrojitelnost trojuheln´ ıku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3
Cel´a cˇ a´ st . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.4
Zaokrouhlen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
Vˇetven´ı programu
8
3.1
Rozpozn´an´ı znaku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2
Maximum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.3
Vypoˇ ´ cet progresivn´ı danˇe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
Cykly
9
4.1
N´asobilka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.2
Prvoˇc´ısla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ Ctverec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.3 5
6
7
8
9
9
Jednorozmˇern´a pole
11
5.1
Obr´acen´ı pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
5.2
Eratosthenovo s´ıto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
5.3
˚ er pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aritmeticky´ prumˇ
11
Funkce
13
6.1
Suma pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
6.2
Pˇrevody cˇ ´ısel do desitkov´e soustavy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
Strukturovan´e datov´e typy
14
7.1
Studenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
7.2
Souˇcet zlomku˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Ukazatele
15
8.1
Porovn´an´ı textovych ´ rˇ etˇezcu˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
8.2
Hled´an´ı podˇretˇezce zprava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
Dynamick´a pr´ace s pamˇet´ı
16
9.1
Dynamicky´ z´asobn´ık . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
9.2
Spojen´ı textovych ´ rˇ etˇezcu˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
10 Pˇred´an´ı parametru odkazem
17
10.1 Transformace textu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
10.2 Celoˇc´ıseln´e dˇelen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
11 Procviˇcen´ı uˇciva I ˇ 11.1 Cetnost znaku˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
11.2 Mincovka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
11.3 Pˇrevody mezi cˇ ´ıselnymi soustavami . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´
19
11.4 Poˇcet vyskyt u˚ rˇ etˇezce v rˇ etˇezci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´
19
12 Rekurzivn´ı funkce
18
20
12.1 Fibonacciho cˇ ´ısla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
˚ ım intervalu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2 Hled´an´ı pulen´
20
13 Statick´a v´ıcerozmˇern´a pole
22
13.1 Maximum dvojrozmˇern´eho pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
13.2 Suma rˇ a´ dku˚ dvojrozmˇern´eho pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
14 Dynamick´a v´ıcerozmˇern´a pole 14.1 Souˇcin matic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ 14.2 Cetnost znaku v poli rˇ etˇezcu˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Ukazatele na funkce
23 23 23 24
15.1 Mapov´an´ı funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
15.2 Mapov´an´ı pole funkc´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
15.3 Akumul´ator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
16 Funkce s promˇennym ´ poˇctem parametru˚
27
˚ er cˇ ´ısel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16.1 Prumˇ
27
16.2 Suma komplexn´ıch cˇ ´ısel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
17 Pr´ace s preprocesorem ˇ ıslice dan´e soustavy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17.1 C´
28
17.2 Naˇcten´ı cˇ ´ısla typu int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
18 Celkov´a koncepce programu
28
29
18.1 Objemy a povrchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
18.2 ASCII Art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
19 Pr´ace s textovymi soubory ´
31
19.1 Souˇcty rˇ a´ dku˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
19.2 Souˇcty zlomku˚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
20 Pr´ace s bin´arn´ımi soubory 20.1 Jednotkov´e vektory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32 32
20.2 Datab´aze osob . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Bitov´e oper´atory a bitov´a pole
32 33
21.1 Datumy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
21.2 Mnoˇzinov´e operace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
22 Procviˇcen´ı uˇciva II
34
22.1 Maticov´a kalkulaˇcka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
22.2 Hled´an´ı nejdelˇs´ıch slov . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
22.3 Medi´an cˇ ´ısel v souboru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
A Zdrojovy´ kod ´ k uloze ´ ,,Jednotkov´e vektory”
37
B Zdrojovy´ kod ´ k uloze ´ ,,Datab´aze osob”
40
C Zdrojovy´ kod ´ k uloze ´ ,,Datumy”
44
D Zdrojovy´ kod ´ k uloze ´ ,,Mnoˇzinov´e operace”
47
1 1.1
Z´aklady jazyka C Hello World
Procviˇcovan´e uˇcivo: sezn´amen´ı se s vyvojov ym na obrazovku ´ ´ prostˇred´ım, z´akladn´ı vystup ´ Napiˇste v jazyku C program, ktery´ vyp´ısˇ e na obrazovku text ”Hello, world!”. Pˇr´ıklad pouˇzit´ı: ./hello (OS Linux) hello.exe (OS Windows) Pˇr´ıklad vystupu: ´ Hello, world! Povolen´e knihovny: stdio.h, stdlib.h
1.2
Pr´ace s promˇennymi ´
Procviˇcovan´e uˇcivo: promˇenn´e, konstanty, vypis na obrazovku ´ ˚ ych Vytvoˇrte v jazyku C program, v nˇemˇz budou definov´any a inicializov´any promˇenn´e ruzn ´ datovych ´ ˚ Hodnoty promˇennych typu. ´ pak vypiˇste na obrazovku. Pˇr´ıklad vystupu: ´ Hodnota Hodnota Hodnota Hodnota
promenne promenne promenne promenne
cislo je: 3 des_cislo je: 3.45 muj_znak je: + male_cislo je: 1.2e-10
Povolen´e knihovny: stdio.h, stdlib.h
1.3
Osmiˇckovy´ a sˇ estn´actkovy´ vystup ´
Procviˇcovan´e uˇcivo: z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ naˇcte cˇ ´ıslo v des´ıtkov´e soustavˇe a vyp´ısˇ e ho na obrazovku v osmiˇckov´e a sˇ estn´actkov´e soustavˇe. Pˇr´ıklad vystupu: ´ Zadejte cislo: 12 Cislo 12 odpovida cislu 14 v osmickove soustave a cislu C v sestnactkove soustave. Povolen´e knihovny: stdio.h, stdlib.h
5
2 2.1
Oper´atory Obsah obd´eln´ıku
Procviˇcovan´e uˇcivo: oper´ator pˇriˇrazen´ı, aritmetick´e oper´atory, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ vypoˇ ´ c´ıt´a obsah obd´eln´ıka a vyp´ısˇ e jej na obrazovku. Vstupem programu jsou velikosti stran obd´eln´ıku. Pˇr´ıklad vystupu: ´ Zadejte stranu a: 8 Zadejte stranu b: 5 Obsah obdelniku je: 40 Povolen´e knihovny: stdio.h, stdlib.h
2.2
Sestrojitelnost trojuheln´ ´ ıku
Procviˇcovan´e uˇcivo: podm´ınkovy´ oper´ator, logick´e oper´atory, oper´atory porovn´an´ı, z´akladn´ı vstup a vystup ´ ´ Napiˇste v jazyku C program, ktery´ ovˇerˇ´ı, jestli lze sestrojit trojuhlen´ ık se zadanymi velikostmi stran. ´ ´ Vstupem programu jsou velikosti stran trojuheln´ ıku. Pˇr´ıklad vystupu: ´ Zadejte stranu a: Zadejte stranu b: Zadejte stranu c: Trojuhelnik nelze
8 5 20 sestrojit.
Povolen´e knihovny: stdio.h, stdlib.h
2.3
Cel´a cˇ a´ st
Procviˇcovan´e uˇcivo: oper´ator pˇriˇrazen´ı, pˇretypov´an´ı, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ naˇcte desetinn´e cˇ ´ıslo, vypoˇc´ıt´a celou cˇ a´ st tohoto cˇ ´ısla a vyp´ısˇ e ji na obrazovku. Pˇr´ıklad vystupu: ´ Zadejte cislo: 8.024 Cela cast cisla 8.024 je 8. Povolen´e knihovny: stdio.h, stdlib.h
2.4
Zaokrouhlen´ı
Procviˇcovan´e uˇcivo: aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, pˇretypov´an´ı, podm´ınkovy´ oper´ator, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ naˇcte desetinn´e cˇ ´ıslo a poˇzadovanou ”pˇresnost” a vyp´ısˇ e na obrazovku toto cˇ ´ıslo zaokrouhlen´e s danou pˇresnost´ı. 6
Pˇr´ıklad vystupu: ´ Zadejte cislo: 8.027 Zadejte presnost: 0.01 Cislo po zaokrouhleni je: 8.03 Povolen´e knihovny: stdio.h, stdlib.h
7
3 3.1
Vˇetven´ı programu Rozpozn´an´ı znaku
Procviˇcovan´e uˇcivo: vˇetven´ı if, vˇetven´ı switch , z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ pro zadany´ znak slovy vyp´ısˇ e, o jaky´ znak se jedn´a... Pro mal´a p´ısmena vyp´ısˇ e program text ”male pismeno” a dany´ znak, pro velk´a p´ısmena vyp´ısˇ e text ”velke pismeno” a dany´ znak, pro cˇ ´ıslice vyp´ısˇ e ”cislice” a dany´ znak. D´ale pro znaky ”!”, ”?”, ”*”, ”@”, ”#”, ”ˆ ” vyp´ısˇ e odpov´ıdaj´ıc´ı text: ”vykricnik”, ”otaznik”, ”hvezdicka”, ”zavinac”, ”krizek”, ”striska”. Pokud se jedn´a o jiny´ neˇz vyˇ ´ se uvedeny´ znak, vyp´ısˇ e program text ”jiny znak”. Pˇr´ıklad vystupu: ´ Zadejte znak: c Zadany znak je: male pismeno c Povolen´e knihovny: stdio.h, stdlib.h
3.2
Maximum
Procviˇcovan´e uˇcivo: vˇetven´ı if, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ po zad´an´ı trojice cˇ ´ısel urˇc´ı nejvˇetˇs´ı z nich a vyp´ısˇ e jej na obrazovku. Pˇr´ıklad vystupu: ´ Zadejte prvni cislo: 4 Zadejte druhe cislo: 8 Zadejte treti cislo: 1 Nejvetsi cislo je: 8 Povolen´e knihovny: stdio.h, stdlib.h
3.3
Vypoˇ ´ cet progresivn´ı danˇe
Procviˇcovan´e uˇcivo: vˇetven´ı if, pˇriˇrazen´ı, aritmetick´e oper´atory, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ po zad´an´ı mzdy vypoˇc´ıt´a a na obrazovku vyp´ısˇ e vyˇ ´ si odpov´ıdaj´ıc´ı danˇe. ´ cel t´eto ulohy ´ Pro uˇ uvaˇzujme progresivn´ı zdanˇen´ı ve vyˇ ´ si 10 % pro pˇr´ıjem do 10000, 20 % pro pˇr´ıjem od 10000 do 20000 a 30 % pro pˇr´ıjem nad 20000. Napˇr´ıklad, pokud m´ame hrubou mzdu 24000, bude se prvn´ıch 10000 danit 10 % (tj. danˇ z t´eto cˇ a´ sti mzdy je 1000), dalˇs´ıch 10000 se dan´ı 20 % (danˇ z t´eto cˇ a´ sti je 2000) a zbyvaj´ ´ ıc´ı 4000 se dan´ı 30 % (danˇ je 1200). Celkovou vyˇ ´ si danˇe pak vypoˇc´ıt´ame jako souˇcet jednotlivych dan´ı (tj. celkov´a danˇ 4200). ´ ”ˇca´ steˇcnych” ´ Pˇr´ıklad vystupu: ´ Zadejte mzdu: 12000 Odpovidajici dan je: 1400 Zadejte mzdu: 33353 Odpovidajici dan je: 7005.9 Povolen´e knihovny: stdio.h, stdlib.h 8
4 4.1
Cykly N´asobilka
Procviˇcovan´e uˇcivo: cykly, aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, oper´atory porovn´an´ı, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ pro zadan´e cˇ ´ıslo vyp´ısˇ e na obrazovku vˇsechny jeho n´asobky menˇs´ı nebo rovny cˇ ´ıslu 100. Pˇr´ıklad vystupu: ´ Zadejte Nasobky 7, 14, 77, 84,
cislo: 7 zadaneho cisla: 21, 28, 35, 42, 49, 56, 63, 70, 91, 98
Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ vypis prvn´ıch 100 n´asobku˚ zadan´eho cˇ ´ısla, moˇznost specifikovat mezn´ı hodnotu ´ uˇzivatelem
4.2
Prvoˇc´ısla
Procviˇcovan´e uˇcivo: cykly, aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, oper´atory porovn´an´ı, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ vyp´ısˇ e na obrazovku vˇsechna prvoˇc´ısla menˇs´ı neˇz 100. Pˇr´ıklad vystupu: ´ Prvocisla: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ moˇznost specifikovat mezn´ı hodnotu uˇzivatelem
ˇ 4.3 Ctverec Procviˇcovan´e uˇcivo: cykly, aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, oper´atory porovn´an´ı, z´akladn´ı vstup a vystup ´ Napiˇste v jazyku C program, ktery´ vykresl´ı pomoc´ı znaku ”*” na obrazovku cˇ tverec zadan´e velikosti. Pˇr´ıklad vystupu: ´ Zadejte velikost ctverce: 5 ***** * * * * * * *****
9
Povolen´e knihovny: stdio.h, stdlib.h ´ eho trojuheln´ ´ Alternativy ulohy: ´ vykreslov´an´ı obd´eln´ıku, pravouhl´ ıku, ...
10
5 5.1
Jednorozmˇern´a pole Obr´acen´ı pole
Procviˇcovan´e uˇcivo: jednorozmˇern´a pole, cykly, oper´atory porovn´an´ı, pˇriˇrazen´ı, z´akladn´ı vystup ´ V programu deklarujte jednorozmˇern´e pole, naplnˇete ho cˇ ´ısly a vypiˇste hodnoty cˇ ´ısel v tomto poli na ˚ ˚ obrazovku. Pot´e obraˇtte poˇrad´ı cˇ ´ısel v tomto poli (tj. prvn´ı bude puvodnˇ e posledn´ı cˇ ´ıslo, druh´e puvodnˇ e pˇredposledn´ı atd.) a hodnoty ve zmˇenˇen´em poli vypiˇste na obrazovku. ˇ ast zdroNen´ı dovoleno pouˇzit´ı druh´eho pole, ani znovunaplnˇen´ı pole hodnotami v opaˇcn´em poˇrad´ı. C´ ´ ˇ jov´eho kodu, kter´a zamˇenuje poˇrad´ı prvku˚ v poli, mus´ı byt hodnotami ´ zcela nez´avisl´a na tom, jakymi ´ ˚ bylo pole puvodnˇ e naplnˇeno. Pˇr´ıklad vystupu: ´ Puvodni hodnoty: 1, 2, 3, 4, 5, 6, 7 Nove hodnoty: 7, 6, 5, 4, 3, 2, 1 Povolen´e knihovny: stdio.h, stdlib.h
5.2
Eratosthenovo s´ıto
Procviˇcovan´e uˇcivo: jednorozmˇern´a pole, cykly, aritmetick´e oper´atory, oper´atory porovn´av´an´ı, pˇriˇrazen´ı, z´akladn´ı vystup ´ V jazyku C vytvoˇrte program, ktery´ pomoc´ı algoritmu Eratosthenova s´ıta urˇc´ı a vyp´ısˇ e vˇsechna prvoˇc´ısla menˇs´ı neˇz cˇ ´ıslo 100. Algoritmus Eratosthenova s´ıta: 1. Vytvoˇr´ıme pole vˇsech cˇ ´ısel od 2 do poˇzadovan´eho maxim´aln´ıho zkouman´eho cˇ ´ısla. ˚ zeme 2. Proch´az´ıme pole od zaˇca´ tku, dokud nenajdeme nevyˇskrtnut´e cˇ ´ıslo. Toto cˇ ´ıslo je prvoˇc´ıslem, muˇ jej proto vypsat na obrazovku. 3. Vyˇskrt´ame z pole vˇsechny n´asobky pr´avˇe nalezen´eho prvoˇc´ısla (napˇr. zmˇenou hodnoty na 0). 4. Pokraˇcujeme krokem 2, dokud zbyvaj´ ´ ı nˇejak´a nevyˇskrtnut´a cˇ ´ısla. Pˇr´ıklad vystupu: ´ Prvocisla: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 Povolen´e knihovny: stdio.h, stdlib.h
5.3
Aritmeticky´ prumˇ ˚ er pole
Procviˇcovan´e uˇcivo: jednorozmˇern´a pole, cykly, aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, z´akladn´ı vystup ´ ˚ er V programu deklarujte jednorozmˇern´e pole a naplnˇete ho cˇ ´ısly. Pot´e vypoˇc´ıtejte aritmeticky´ prumˇ cˇ ´ısel v tomto poli a vypiˇste jej na obrazovku.
11
Pˇr´ıklad vystupu: ´ Pole obsahuje cisla: 1, 2, 3, 4, 5, 6, 7 Prumer pole je: 4 Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ vypoˇ ´ cet sumy, maxima, minima
12
6 6.1
Funkce Suma pole
Procviˇcovan´e uˇcivo: funkce, cykly, aritmetick´e oper´atory, oper´ator pˇriˇrazen´ı, z´akladn´ı vystup ´ Definujte v jazyku C funkci odpov´ıdaj´ıc´ı deklaraci double suma pole(double pole[], int pocet), kter´a vypoˇc´ıt´a a vr´at´ı souˇcet cˇ ´ısel v dan´em poli. Parametr pole slouˇz´ı pro pˇred´an´ı pole cˇ ´ısel, parametr pocet pak odpov´ıd´a poˇctu cˇ ´ısel v pˇred´avan´em poli. Pˇr´ıklad vystupu: ´ Pole obsahuje cisla: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Suma pole je: 55 Povolen´e knihovny: stdio.h, stdlib.h ˚ eru, maxima, minima Alternativy ulohy: ´ vypoˇ ´ cet prumˇ
6.2
Pˇrevody cˇ ´ısel do desitkov´e soustavy
Procviˇcovan´e uˇcivo: funkce, pr´ace s textovymi rˇ etˇezci, cykly, vˇetven´ı, konstrukce sloˇzenych ´ ´ podm´ınek Napiˇste v jazyku C funkci odpov´ıdaj´ıc´ı deklaraci int do desitkove(char cislo[], int zaklad), kter´a dan´e cˇ ´ıslo pˇrevede do des´ıtkov´e soustavy. Pˇrev´adˇen´e cˇ ´ıslo je zad´ano jako textovy´ rˇ etˇezec tvoˇreny´ jednotlivymi cˇ ´ıslicemi (parametr cislo). Parametr zaklad pak ud´av´a hodnotu z´akladu soustavy, ze ´ kter´e pˇrev´ad´ıme. Pro cˇ ´ıslice soustav se z´akladem vˇetˇs´ım neˇz deset pouˇz´ıv´ame znaky velkych ´ p´ısmen (napˇr. ”A” pro cˇ ´ıslici s hodnotou 10). Pˇr´ıklad vystupu: ´ Cislo A1B v soustave o zakladu 12 odpovida cislu 1463 v desitkove soustave. Povolen´e knihovny: stdio.h, stdlib.h, string.h
13
7 7.1
Strukturovan´e datov´e typy Studenti
Procviˇcovan´e uˇcivo: strukturovan´e datov´e typy, funkce, vˇetven´ı Vytvoˇrte v jazyku C strukturovany´ datovy´ typ datum se cˇ leny den, mesic a rok. Pot´e vytvoˇrte strukturovany´ typ student se cˇ leny jmeno, prijmeni a narozen. Pro reprezentaci jednotlivych cˇ lenu˚ ´ struktur zvolte vhodn´e datov´e typy. D´ale napiˇste funkci int porovnej vek(student s1, student s2), kter´a porovn´a vˇek (resp. datum narozen´ı) danych ´ studentu˚ a vr´at´ı hodnotu -1 v pˇr´ıpadˇe, zˇ e prvn´ı student je starˇs´ı, 1 v pˇr´ıpadˇe, zˇ e ˚ Podle n´avratov´e hodnoty druhy´ student je starˇs´ı a 0 v pˇr´ıpadˇe shodn´eho data narozen´ı u obou studentu. funce porovnej vek pak ve funkci main vypiˇste vhodny´ text na obrazovku. Pˇr´ıklad vystupu: ´ Pepa Stary je starsi nez Adam Novak. Povolen´e knihovny: stdio.h, stdlib.h
7.2
Souˇcet zlomku˚
Procviˇcovan´e uˇcivo: strukturovan´e datov´e typy, funkce Vytvoˇrte v jazyku C strukturovany´ datovy´ typ zlomek se cˇ leny citatel a jmenovatel. D´ale napiˇste funkci zlomek soucet(zlomek a, zlomek b), kter´a vypoˇc´ıt´a a vr´at´ı souˇcet pˇredanych zlomku˚ ´ v z´akladn´ım tvaru. Vykr´acen´ı vysledn´ eho zlomku do z´akladn´ıho tvaru doc´ıl´ıte vydˇelen´ım cˇ itatele i ´ ˚ zete urˇcit napˇr´ıklad pouˇzit´ım Euklidova jmenovatele jejich nejvˇetˇs´ım spoleˇcnym ´ dˇelitelem, ktery´ muˇ algoritmu. Pˇr´ıklad vystupu: ´ Soucet zlomku 2/3 a -1/6 je: 1/2 Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ vypoˇ ´ cet rozd´ılu, souˇcinu nebo pod´ılu dvojice zlomku˚
14
8 8.1
Ukazatele Porovn´an´ı textovych ´ rˇetˇezcu˚
Procviˇcovan´e uˇcivo: ukazatele, pr´ace s textovymi rˇ etˇezci, funkce, cykly ´ Napiˇste v jazyku C funkci int porovnej(char *t1, char *t2), kter´a porovn´a pˇredan´e textov´e rˇ etˇezce a vr´at´ı -1, pokud je prvn´ı rˇ etˇezec menˇs´ı neˇz druhy, ´ 0, pokud jsou rˇ etˇezce shodn´e, nebo 1, pokud je druhy´ rˇ etˇezec menˇs´ı neˇz prvn´ı. Pˇri pr´aci s textovymi rˇ etˇezci pouˇz´ıvejte vyhradnˇ e ukazatele, oper´ator ´ ´ dereference a pointerovou aritmetiku. Porovn´av´an´ı rˇ etˇezcu˚ by mˇelo byt ´ lexikografick´e, tj. obdobn´e uspoˇra´ d´an´ı slov ve slovn´ıku. Budou tedy porovn´av´any jednotliv´e odpov´ıdaj´ıc´ı si dvojice znaku˚ (i-ty´ znak prvn´ıho rˇ etˇezce s i-tym ´ znakem ˚ prvn´ı rozd´ıln´a dvojice znaku˚ pak urˇc´ı vysledek druh´eho rˇ etˇezce) poˇc´ınaje prvn´ımi znaky obou rˇ etˇezcu, ´ ˚ Tento zpusob ˚ porovn´an´ı textovych porovn´an´ı obou rˇ etˇezcu. ´ rˇ etˇezcu˚ plnˇe odpov´ıd´a funkci strcmp. Pˇr´ıklad vystupu: ´ Slovo "ahoj" je vˇ etˇ s´ ı neˇ z slovo "abcde". Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ vytvoˇren´ı jinych ´ funkc´ı ze string.h: strchr, strrchr...
8.2
Hled´an´ı podˇretˇezce zprava
Procviˇcovan´e uˇcivo: ukazatel, pr´ace s textem, funkce, cykly Napiˇste v jazyku C funkci char *strrstr(const char *text, const char *hledany), kter´a v dan´em textov´em rˇ etˇezci text vyhled´a prvn´ı vyskyt zadan´eho podˇretˇezce hledany zprava. Funkce ´ vrac´ı ukazatel na prvn´ı znak nalezen´eho podˇretˇezce nebo konstantu NULL, pokud podˇretˇezec hledany nebyl nalezen. Vytvoˇrenou funkci otestujte ve funkci main. Pˇr´ıklad vystupu: ´ Text: "Ahoj svete!" Hledame: "svet" Vraceny ukazatel: "svete!" Povolen´e knihovny: stdio.h, stdlib.h
15
9 9.1
Dynamick´a pr´ace s pamˇet´ı Dynamicky´ z´asobn´ık
Procviˇcovan´e uˇcivo: dynamick´a alokace pamˇeti, ukazatele, funkce, strukturovan´e datov´e typy Napiˇste v jazyku C funkce pro pr´aci s dynamickym ´ z´asobn´ıkem. Pˇripom´ın´ame, zˇ e je o datovou struk´ turu, jej´ızˇ z´akladem ke prvek, ktery´ v sobˇe kromˇe dat (pˇri rˇ eˇsen´ı t´eto ulohy postaˇc´ı jedna poloˇzka typu int) obsahuje tak´e ukazatel na prvek, ktery´ byl do z´asobn´ıku vloˇzen bezprostˇrednˇe pˇred n´ım. Se z´asobn´ıkem je moˇzn´e prov´adˇet tyto operace: pˇrid´an´ı prvku - funkce prvek *pridej(prvek *zasobnik, int data), pˇreˇcten´ı dat z vrchoolu z´asobn´ıku - funkce int vrchol(prvek* zasobnik) a odebr´an´ı prvku z vrcholu z´asobn´ıku - funkce prvek *odeber(prvek* zasobnik). Pˇr´ıklad pouˇzit´ı: int main(){ prvek* z=NULL; int i; for (i=1; i<11; i++) z = pridej(z, i); while (z!=NULL){ printf("%i\n", vrchol(z)); z=odeber(z); } return 0; } Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ dynamick´a fronta, dynamicky´ seznam
9.2
Spojen´ı textovych ´ rˇetˇezcu˚
Procviˇcovan´e uˇcivo: dynamick´a alokace pamˇeti, ukazatele, funkce Napiˇste v jazyku C funkci char *spojeni(char *t1, char *t2), kter´a vytvoˇr´ı a vr´at´ı textovy´ ˚ Ve funkci main pak tuto funkci otestujte... rˇ etˇezec, ktery´ vznikne spojen´ım pˇredanych ´ textovych ´ rˇ etˇezcu. Pˇr´ıklad vystupu: ´ Spojeni slov "Ahoj" a "Svete" je "AhojSvete". Povolen´e knihovny: stdio.h, stdlib.h
16
10 10.1
Pˇred´an´ı parametru odkazem Transformace textu
Procviˇcovan´e uˇcivo: pˇred´an´ı parametru odkazem, dynamick´a alokace pamˇeti, pr´ace s textovymi ´ rˇ etˇezci, funkce Napiˇste v jazyku C funkci int set(char* in, char** out), kter´a podle textov´eho rˇ etˇezce in vytvoˇr´ı rˇ etˇezec, ktery´ nav´azˇ e na ukazatel out. Vytv´arˇ en´ı vystupn´ ıho textu prob´ıh´a tak, zˇ e mal´e p´ısmeno ´ je pˇri kop´ırov´an´ı nahrazeno odpov´ıdaj´ıc´ım velkym ´ p´ısmenem a naopak. Jin´e znaky se zkop´ıruj´ı bez ˚ zmˇeny. Funkce vrac´ı poˇcet pozmˇenˇenych ´ znaku. Pˇr´ıklad vystupu: ´ Puvodni text: "Ahoj svete 23." Zmeneny text: "aHOJ SVETE 23." Povolen´e knihovny: stdio.h, stdlib.h
10.2
Celoˇc´ıseln´e dˇelen´ı
Procviˇcovan´e uˇcivo: pˇred´an´ı parametru odkazem, ukazatele, funkce, cykly, aritmetick´e oper´atory Napiˇste v jazyku C funkci int deleni(int a, int b, int *r), kter´a podˇel´ı cˇ ´ıslo a cˇ ´ıslem b a vr´at´ı pod´ıl tˇechto cˇ ´ısel. Pomoc´ı parametru r se z funkce vrac´ı tak´e zbytek po proveden´em celoˇc´ıseln´em dˇelen´ı. Ve funkci deleni nen´ı dovoleno pouˇz´ıt oper´atory / a %. Funkci otestujte a vysledky vypoˇ ´ ´ ctu˚ vypiˇste ve funkci main na obrazovku. Pˇr´ıklad vystupu: ´ 13 : 4 = 3 (zbytek 1) Povolen´e knihovny: stdio.h, stdlib.h
17
11
Procviˇcen´ı uˇciva I
ˇ 11.1 Cetnost znaku˚ Procviˇcovan´e uˇcivo: dynamick´a alokace pamˇeti, pr´ace s textem, funkce, pole, cykly Napiˇste v jazyku C funkci int *cetnost(char *text), kter´a urˇc´ı poˇcet vyskyt u˚ jednotlivych ´ ´ znaku˚ ˚ kde i-ty´ prvek pole odpov´ıd´a ve vstupn´ım textov´em rˇ etˇezci text. Funkce pak vrac´ı pole cˇ etnost´ı znaku, poˇctu vyskyt u˚ i-t´eho znaku ASCII tabulky. Funkce mus´ı rozpozn´avat vˇsechny znaky ASCII tabulky, ´ ˚ Ve funkci main vytvoˇrenou funkci otestujte. tedy 256 znaku. Pˇr´ıklad vystupu: ´ Vypis cetnosti znaku vyskytujicich se v retezci "aaa bb ccc ddd fffeeeshdhdkkay23455" (znak:cetnost) : 2: 3: 4: 5: a: b: c: d: e: f: h: k: s: y:
4 1 1 1 2 4 2 3 5 3 3 2 2 1 1
Povolen´e knihovny: stdio.h, stdlib.h
11.2
Mincovka
Procviˇcovan´e uˇcivo: pˇred´an´ı parametru odkazem, dynamick´a alokace pamˇeti, funkce, pole, cykly ´ ˚ ejˇs´ıch obTato uloha je zaloˇzena na jednoduch´em probl´emu, ktery´ kaˇzdodennˇe rˇ eˇs´ı pokladn´ı v nejruznˇ chodech. Ne vˇzdy dok´azˇ e z´akazn´ık zaplatit zboˇz´ı pˇresnym ´ obnosem a je tud´ızˇ tˇreba mu jeho ”pˇreplatek” vr´atit a to nejl´epe nejmenˇs´ım poˇctem platidel, aby se minimalizovala moˇznost nˇejak´eho omylu. ´ Vaˇsim ukolem tedy bude napsat v jazyku C funkci int mincovka(unsigned int castka, unsigned int **platidla), kter´a tento probl´em rˇ eˇs´ı. Vstupn´ım parametrem funkce je nez´aporny´ celoˇc´ıselny´ finanˇcn´ı obnos castka, ktery´ je tˇreba z´akazn´ıkovi vr´atit nejmenˇs´ım moˇznym ´ poˇctem platidel. Vystupem funkce je poˇcet pouˇzitych ´ ´ platidel, ktery´ se vrac´ı n´avratovou hodnotou, a pole hodnot tˇechto platidel uspoˇra´ dan´e od nejvˇetˇs´ı hodnoty po nejniˇzsˇ´ı, kter´e je vr´aceno pomoc´ı parametru platidla. Pro ´ uplnost dod´ame, zˇ e pouˇz´ıv´ame platidla s hodnotami 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000 a 5000 Kˇc. Pˇr´ıklad vystupu: ´ castka: 12345 pouzita platidla: 5000, 5000, 2000, 200, 100, 20, 20, 5
18
Povolen´e knihovny: stdio.h, stdlib.h
11.3
Pˇrevody mezi cˇ ´ıselnymi soustavami ´
Procviˇcovan´e uˇcivo: dynamick´a alokace pamˇeti, pr´ace s textem, funkce, cykly Napiˇste v jazyku C funkci char *preved(unsigned int z1, unsigned int z2, char nez´apornych cˇ ´ısel mezi cˇ ´ıselnymi soustavami. Vstupn´ımi parame´ ´ ´ *cislo) pro pˇrev´adˇen´ı celych try poˇzadovan´e funkce jsou z´aklad cˇ ´ıseln´e soustavy z1, ze kter´e se pˇrev´ad´ı (”vstupn´ı” cˇ ´ıseln´a soustava), z´aklad soustavy z2, do kter´e se pˇrev´ad´ı (”vystupn´ ı” cˇ ´ıseln´a soustava), a textovy´ rˇ etˇezec cislo ´ odpov´ıdaj´ıc´ı cˇ ´ıslu ve ”vstupn´ı” cˇ ´ıseln´e soustavˇe. Vystupem funkce je textovy´ rˇ etˇezec odpov´ıdaj´ıc´ı ´ zadan´emu cˇ ´ıslu vyj´adˇren´emu ve ”vystupn´ ı” cˇ ´ıseln´e soustavˇe nebo konstanta NULL, pokud textovy´ ´ rˇ etˇezec cislo nebyl korektn´ım zad´an´ım cˇ ´ısla ve ”vstupn´ı” cˇ ´ıseln´e soustavˇe (v rˇ etˇezci se vyskytly jin´e znaky neˇz cifry dan´e soustavy). Pro vypis cˇ ´ıslic s hodnotami vˇetˇs´ımi neˇz 9 pouˇzijte velk´a p´ısmena anglick´e abecedy. Pˇredpokl´adejte ´ z´aklady cˇ ´ıselnych ´ soustav v rozmez´ı od 2 do 36 a hodnotu vstupn´ıho cˇ ´ısla (textov´eho rˇ etˇezce) v rozsahu datov´eho typu unsigned long. Pˇr´ıklad vystupu: ´ 10111 v soustave o zakladu 2 odpovida 23 v soustave o zakladu 10 1202101 v soustave o zakladu 3 odpovida 1671 v soustave o zakladu 9 26A1B800A v soustave o zakladu 12 odpovida 3F0J48I v soustave o zakladu 26 Povolen´e knihovny: stdio.h, stdlib.h
11.4
Poˇcet vyskyt u˚ rˇetˇezce v rˇetˇezci ´
Procviˇcovan´e uˇcivo: pr´ace s textem, funkce, cykly Napiˇste v jazyku C funkci int pocet vyskytu(char *kde, char *co), kter´a vypoˇc´ıt´a a vr´at´ı poˇcet vyskyt u˚ textov´eho rˇ etˇezce co v textov´em rˇ etˇezci kde. Vytvoˇrenou funkci otestujte ve funkci main. ´ Pˇr´ıklad pouˇzit´ı: pocet = pocet_vyskytu("aalaalaa", "aalaa"); printf("Pocet vyskytu \"aalaa\" v \"aalaalaa\" je %i.\n", pocet); Pˇr´ıklad vystupu: ´ Pocet vyskytu "aalaa" v "aalaalaa" je 2. Povolen´e knihovny: stdio.h, stdlib.h
19
12
Rekurzivn´ı funkce
12.1
Fibonacciho cˇ ´ısla
Procviˇcovan´e uˇcivo: rekurze, funkce, cykly Napiˇste v jazyku C rekurzivn´ı a nerekurzivn´ı funkci pro vypoˇ ´ cet n-t´eho fibonacciho cˇ ´ısla. Porovnejte rychlosti vypoˇ ´ ctu tˇechto dvou funkc´ı pro vˇetˇs´ı n. Pˇripom´ın´ame, zˇ e posloupnost fibonacciho cˇ ´ısel je definov´ana rekurzivnˇe: Fib(0) = 0 Fib(1) = 1 Fib(n) = Fib(n-1) + Fib(n-2) pro n > 1 Pˇr´ıklad vystupu: ´ Fib(8) = 21 Fib(24) = 46368 Fib(35) = 9.22747E+006 Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ vypoˇ ´ cet faktori´alu
12.2
Hled´an´ı pulen´ ˚ ım intervalu
Procviˇcovan´e uˇcivo: rekurze, funkce, pole, vˇetven´ı Napiˇste v jazyku C rekurzivn´ı funkci int puleni(int cisla[], int a, int b, int ˚ ı intervalu najde v zadan´em setˇr´ıdˇen´em poli cisla hodnotu hledane), kter´a pomoc´ı metody pulen´ ˚ ı intervalu je zaloˇzena na hledane a vr´at´ı jej´ı index v tomto poli. Pˇripom´ın´ame, zˇ e metoda pulen´ porovn´an´ı hodnoty hledan´eho cˇ ´ısla s cˇ ´ıslem ”uprostˇred” pr´avˇe prohled´avan´eho intervalu (v naˇsem pˇr´ıpadˇe intervalu mezi prvky s indexy a a b). Pokud se hodnoty rovnaj´ı, naˇsli jsme hledan´e cˇ ´ıslo a ˚ zeme tedy pˇr´ımo vr´atit jeho index. Pokud se nerovnaj´ı, staˇc´ı (rekurzivn´ım vol´an´ım) prohled´avat muˇ pouze jeden z intervalu˚ prvek s indexem a aˇz ”prostˇredn´ı prvek” nebo ”prostˇredn´ı prvek” aˇz prvek s indexem b. Pˇr´ıklad pouˇzit´ı: int main(){ int p[11]; int i; for (i=0; i<11; i++) p[i] = 2*i+3; for (i=0; i<11; i++) printf("Cislo %i je na indexu: %i\n", 2*i+3, puleni(p,0,10, 2*i+3)); return 0; }
20
Pˇr´ıklad vystupu: ´ Cislo Cislo Cislo Cislo Cislo Cislo Cislo Cislo Cislo Cislo Cislo
3 je na indexu: 0 5 je na indexu: 1 7 je na indexu: 2 9 je na indexu: 3 11 je na indexu: 4 13 je na indexu: 5 15 je na indexu: 6 17 je na indexu: 7 19 je na indexu: 8 21 je na indexu: 9 23 je na indexu: 10
Povolen´e knihovny: stdio.h, stdlib.h
21
13 13.1
Statick´a v´ıcerozmˇern´a pole Maximum dvojrozmˇern´eho pole
Procviˇcovan´e uˇcivo: statick´a v´ıcerozmˇern´a pole, funkce, cykly Napiˇste v jazyku C funkci int maximum(int prvky[][4], int radku), kter´a vr´at´ı hodnotu nejvˇetˇs´ıho cˇ ´ısla uloˇzen´eho ve dvourozmˇern´em poli prvky. Prvn´ı rozmˇer pole prvky lze urˇcit pomoc´ı parametru radku, druhy´ je pevnˇe d´an konstantou 4. Pˇr´ıklad vystupu: ´ Vypis pole: 10 2 15 -52 41 0 15 3 1
-2 12 -8
Maximum je: 41 Povolen´e knihovny: stdio.h, stdlib.h ˚ er, minimum hodnot dvourozmˇern´eho pole Alternativy ulohy: ´ suma, prumˇ
13.2
Suma rˇa´ dku˚ dvojrozmˇern´eho pole
Procviˇcovan´e uˇcivo: statick´a v´ıcerozmˇern´a pole, dynamick´a alokace pamˇeti, funkce, cykly Napiˇste v jazyku C funkci int *suma radku(int prvky[][4], int radku), kter´a vypoˇc´ıt´a souˇcty na jednotlivych ´ rˇ a´ dc´ıch pole prvky a vr´at´ı jednorozmˇern´e pole obsahuj´ıc´ı tyto souˇcty. Prvn´ı rozmˇer pole prvky lze urˇcit pomoc´ı parametru radku, druhy´ je pevnˇe d´an konstantou 4. Pˇr´ıklad vystupu: ´ Vypis pole: 10 2 15 -52 41 0 15 3 1
-2 12 -8
Soucty na radcich jsou: 25, 1, 11 Povolen´e knihovny: stdio.h, stdlib.h ˚ er jednotlivych Alternativy ulohy: ´ aritmeticky´ prumˇ ´ rˇ a´ dku˚
22
14 14.1
Dynamick´a v´ıcerozmˇern´a pole Souˇcin matic
Procviˇcovan´e uˇcivo: dynamick´a v´ıcerozmˇern´a pole, funkce, cykly Napiˇste v jazyku C funkci double **soucin(int m, int n, int o, double **A, double **B), kter´a vypoˇc´ıt´a souˇcin matice A o rozmˇerech mxn a matice B o rozmˇerech nxo. Funkce vrac´ı alokovan´e dvojrozmˇern´e pole s hodnotami vysledn´ e matice. ´ Pˇr´ıklad vystupu: ´ Matice A: 1 2 3 4 5 6 Matice B: 1 0 2 1 0 -1 Vysledna matice: 5 -1 14 -1 Povolen´e knihovny: stdio.h, stdlib.h Alternativy ulohy: ´ souˇcet matic
ˇ 14.2 Cetnost znaku v poli rˇetˇezcu˚ Procviˇcovan´e uˇcivo: dynamick´a v´ıcerozmˇern´a pole, funkce, cykly Napiˇste v jazyku C funkci int vyskyty(char* texty[], int pocet, char hledany), kter´a vrac´ı poˇcet vyskyt u˚ znaku hledany v poli textovych ´ ´ rˇ etˇezcu˚ texty. Rozmˇer pole textovych ´ rˇ etˇezcu˚ (poˇcet textovych ´ rˇ etˇezcu˚ v poli) lze specifikovat pomoc´ı parametru pocet. Pro testov´an´ı funkce si v ˚ main funkci vytvoˇrte libovoln´e pole textovych ´ rˇ etˇezcu. Pˇr´ıklad vystupu: ´ Textove retezce: Ahoj uzivateli, jak se mas? Tohle bude snadne, ne? Znak "e" se v poli vyskytuje 6kr´ at. Povolen´e knihovny: stdio.h, stdlib.h
23
15 15.1
Ukazatele na funkce Mapov´an´ı funkce
Procviˇcovan´e uˇcivo: ukazatele na funkce, dynamick´a alokace pamˇeti, funkce, pole Napiˇste v jazyku C funkci double *map(double (*fce)(double), double *vstup, int delka), kter´a na hodnoty pole vstup (definiˇcn´ı obor) aplikuje funkci fce a vr´at´ı pole vysledn ych ´ ´ hodnot. Velikost definiˇcn´ıho oboru je specifikov´ana parametrem delka. Pˇr´ıklad pouˇzit´ı: double na2(double x){ return x*x; } double na3(double x){ return x*x*x; } int main(){ ... pole_vysledku_na2 = map(na2, vstup,5) ... pole_vysledku_na3 = map(na3, vstup,5) ... } Pˇr´ıklad vystupu: ´ Vstupni pole: Druhe mocniny: Treti mocniny:
1, 1, 1,
2, 3, 4, 5 4, 9, 16, 25 8, 27, 64, 125
Povolen´e knihovny: stdio.h, stdlib.h, math.h
15.2
Mapov´an´ı pole funkc´ı
Procviˇcovan´e uˇcivo: ukazatele na funkce, dynamick´a alokace pamˇeti, funkce, pole Napiˇste v jazyku C funkci double **map(double(*fce[])(double), double *vstup, int pocet fce, int pocet vstup), kter´a na prvky pole vstup (definiˇcn´ı obor) mapuje postupnˇe jednotliv´e funkce z pole fce. Z vypoˇctenych ´ hodnot vytvoˇr´ı dvourozmˇern´e pole, kter´e bude n´avratovu hodnotou z t´eto funkce. Prvn´ı rˇ a´ dek vystupn´ ıho pole bude odpov´ıdat definiˇcn´ımu oboru, druhy´ rˇ a´ dek ´ hodnot´am prvn´ı funkce a tak d´ale, aˇz posledn´ı rˇ a´ dek bude odpov´ıdat hodnot´am posledn´ı pˇredan´e funkce. Poˇcet funkc´ı je specifikov´an parametrem pocet fce, velikost definiˇcn´ıho oboru pak parametrem pocet vstup.
24
Pˇr´ıklad pouˇzit´ı: double na2(double x){ return x*x; } double na3(double x){ return x*x*x; } int main(){ ... pole_fci[0] = na2; pole_fci[1] = na3; ... pole_vysledku = map(pole_fci, pole, 2, 5); ... } Pˇr´ıklad vystupu: ´ Hodnoty vystupniho pole: 1 2 3 4 5 1 4 9 16 25 1 8 27 64 125 Povolen´e knihovny: stdio.h, stdlib.h, math.h
15.3
Akumul´ator
Procviˇcovan´e uˇcivo: ukazatele na funkce, funkce, pole, cykly, vˇetven´ı Napiˇste v jazyku C funkci double akumulator(double (*fce)(double, double), double cisla[], int pocet), kter´a zpracuje pomoc´ı pˇredan´e funkce fce hodnoty z pole cisla, jehoˇz akuvelikost je d´ana parametrem pocet. Vytvoˇrenou funkci otestujte ve funkci main; pouˇzitymi ´ mulaˇcn´ımi funkcemi mohou byt ´ napˇr´ıklad funkce pro souˇcet nebo souˇcin dvou re´alnych ´ cˇ ´ısel, kter´e je ovˇsem pro testov´an´ı potˇreba dodefinovat. Pˇr´ıklad pouˇzit´ı: int main(){ double p[10]; int i; for (i=0; i<10; i++) p[i] = i+1; printf("Suma je: %g\n", akumulator(soucet,p,10)); printf("Produkt je: %g\n", akumulator(soucin,p,10)); return 0; }
25
Pˇr´ıklad vystupu: ´ Suma je: 55 Produkt je: 3.6288e+006 Povolen´e knihovny: stdio.h, stdlib.h
26
16 16.1
Funkce s promˇennym ´ poˇctem parametru˚ Prumˇ ˚ er cˇ ´ısel
˚ cykly, vˇetven´ı Procviˇcovan´e uˇcivo: funkce s promˇennym ´ poˇctem parametru, Napiˇste v jazyku C funkci long double prumer(char* format, ...), kter´a vypoˇ ´ c´ıt´a aritmet˚ er ze zadanych ˚ ych ˚ Typy pˇred´avanych icky´ prumˇ ´ hodnot ruzn ´ datovych ´ typu. ´ hodnot jsou urˇceny po˚ ze tvoˇrit libovoln´a posloupnost znaku˚ odpov´ıdaj´ıc´ı typum ˚ moc´ı parametru format, ktery´ muˇ n´asleduj´ıc´ıch parametru˚ - znak ”i” pro typ int, ”d” pro typ double a ”l” pro long double. Pˇr´ıklad pouˇzit´ı: pr = prumer("idld", 1, (double)3, (long double)2, 3.0); printf("Prumer je %Lf. \n", pr); Pˇr´ıklad vystupu: ´ Prumer je 2.25. Povolen´e knihovny: stdio.h, stdlib.h, stdarg.h Alternativy ulohy: ´ Suma cˇ ´ısel
16.2
Suma komplexn´ıch cˇ ´ısel
˚ strukturovan´e datov´e typy, cykly Procviˇcovan´e uˇcivo: funkce s promˇennym ´ poˇctem parametru, Napiˇste v jazyku C funkci komplexni suma(int pocet, ...), kter´a vypoˇ ´ c´ıt´a souˇcet pˇredanych ´ komplexn´ıxh cˇ ´ısel. Poˇcet sˇc´ıtanych ´ cˇ ´ısel je urˇcen pevnym ´ parametrem pocet, za n´ımˇz pak ve vol´an´ı funkce n´asleduj´ı hodnoty, kter´e m´a funkce sˇc´ıtat. Pro pr´aci s komplexn´ımi cˇ ´ısly vyuˇzijte v´ami definovany´ strukturovany´ datovy´ typ komplexni. Pˇr´ıklad pouˇzit´ı: komplexni komplexni komplexni komplexni
vysledek; a = {3.1,-2.3}; b = {0.5,-3}; c = {0,1.2};
vysledek = suma(3,a,b,c); printf("Suma je %g + %gi. \n", vysledek.realna, vysledek.imaginarni); Pˇr´ıklad vystupu: ´ Suma je 3.6 + -4.1i. Povolen´e knihovny: stdio.h, stdlib.h, stdarg.h Alternativy ulohy: ´ Produkt komplexn´ıch cˇ ´ısel
27
17
Pr´ace s preprocesorem
ˇ ıslice dan´e soustavy 17.1 C´ Procviˇcovan´e uˇcivo: makra s parametry, podm´ınkovy´ oper´ator, logick´e oper´atory, oper´atory porovn´an´ı Napiˇste makro je cislice(zaklad, znak) pro testov´an´ı, zda je dany´ znak (urˇcen argumentem znak) cˇ ´ıslic´ı soustavy s danym ´ zakladem (argument zaklad). Makro je cislice by mˇelo korektnˇe fungovat pro z´aklady soustav od 2 do 36 a libovoln´e znaky. Pro cˇ ´ıslice s hodnotou vˇetˇs´ı neˇz 9 pouˇz´ıvejte pro jednoduchost pouze velk´a p´ısmena anglick´e abecedy. Pˇr´ıklad pouˇzit´ı: if (je_cislice(8,’8’)!=0) printf("Ano\n"); else printf("Ne\n"); if (je_cislice(10+6,’0’+4)!=0) printf("Ano\n"); else printf("Ne\n"); if (je_cislice(30,’@’)!=0) printf("Ano\n"); else printf("Ne\n"); Pˇr´ıklad vystupu: ´ Ne Ano Ne Povolen´e knihovny: stdio.h, stdlib.h
17.2
Naˇcten´ı cˇ ´ısla typu int
Procviˇcovan´e uˇcivo: makra s parametry, oper´ator cˇ a´ rka, z´akladn´ı vstup a vystup ´ Napiˇste makro cti int(i) pro naˇcten´ı hodnoty typu int do promˇenn´e i. Vysledn´ a hodnota vyrazu ´ ´ v tˇele makra by tak´e mˇela odpov´ıdat naˇcten´emu cˇ ´ıslu. ´ Tato uloha je pˇrevzata z publikace Pavel Herout: Uˇcebnice jazyka C. Pˇr´ıklad pouˇzit´ı: int j, k; printf("Zadejte cele cislo: "); if ((j = cti_int(k)) == 0) printf("nula\n"); else printf("%i %i\n", j,k); Pˇr´ıklad vystupu: ´ Zadejte cele cislo: 1 1 1 Povolen´e knihovny: stdio.h, stdlib.h
28
18 18.1
Celkov´a koncepce programu Objemy a povrchy
Procviˇcovan´e uˇcivo: celkov´a koncepce programu, parametry funkce main, funkce, vˇetven´ı Napiˇste v jazyku C program pro vypoˇ ´ cet objemu a povrchu v´alce, pravideln´eho trojbok´eho, cˇ tyˇrbok´eho a sˇ estibok´eho hranolu. Parametry vypoˇ ´ ctu by mˇelo byt ´ moˇzn´e pˇred´avat programu pˇri spuˇstˇen´ı z ´ programu by mˇel byt ˚ Modul hlavn´ı funkce pˇr´ıkazov´e rˇ a´ dky. Zdrojovy´ kod ´ rozdˇelen do 2 modulu. (soubor main.c) bude zajiˇsˇtovat zpracov´an´ı a pˇr´ıpadnˇe naˇcten´ı chybˇej´ıc´ı parametru˚ vypoˇ ´ ctu, budou z nˇej vol´any funkce zajiˇsˇtuj´ıc´ı vlastn´ı vypoˇ ´ cet a vypisov´any vypoˇc´ıtan´e hodnoty na obrazovku. Druhy´ modul (soubory vypocet.h a vypocet.c) pak bude zajiˇsˇtovat veˇsker´e poˇzadovan´e vypoˇ ´ cty. Pˇri rˇ eˇsen´ı ´ ulohy dbejte vˇsech z´asad zm´ınˇenych ´ na pˇredn´asˇ ce. Pˇr´ıklad pouˇzit´ı: objemy a povrchy.exe 0 1.2 2.4 (OS Windows) ./objemy a povrchy 0 1.2 2.4 (OS Linux) Pˇr´ıklad vystupu: ´ Valec s vyskou 1.2 a polomerem podstavy 2.4 ma povrch 54.2592 a objem 21.7037. Pˇr´ıklad pouˇzit´ı: objemy a povrchy.exe 3 2.3 4.5 (OS Windows) ./objemy a povrchy 3 2.3 4.5 (OS Linux) Pravidelny 3-boky hranol s vyskou 2.3 a delkou podstavne hrany 4.5 ma povrch 48.587 a objem 20.1676. Povolen´e knihovny: stdio.h, stdlib.h, math.h
18.2
ASCII Art
Procviˇcovan´e uˇcivo: celkov´a koncepce programu, dynamick´a pr´ace s pamˇet´ı, funkce Napiˇste v jazyku C jednoduchou knihovnu funkc´ı pro vykreslov´an´ı obr´azku˚ pomoc´ı znaku˚ (tzv. ASCII art). Knihovna by mˇela m´ıt tyto vlastnosti: - Obr´azky se budou vykreslovat pomoc´ı pl´atna - dvojrozmˇern´e matice, kter´a bude obsahovat jednotliv´e znaky. - Vykreslov´an´ı se tedy neprov´ad´ı pˇr´ımo na vystupu, ale pouze doch´az´ı ke zmˇenˇe dan´eho pl´atna (struk´ tura canvas). - Je moˇzn´e pracovat souˇcasnˇe s nˇekolika pl´atny. - Je moˇzn´e ”vykreslovat” i za hranic´ı kresl´ıc´ı plochy, tyto body se ale nebudou pˇri zobrazen´ı pl´atna vykreslovat. Jinymi slovy, pˇri pokusu o kreslen´ı mimo pl´atno nedojde k vyj´ımce pˇri bˇehu programu. ´ - Knihovna by mˇela byt ´ samostatnym ´ modulem, bude tedy tvoˇrena jedn´ım zdrojovym ´ a jedn´ım hlaviˇckovym ´ souborem.
29
V knihovnˇe vytvoˇrte strukturovany´ datovy´ typ canvas a d´ale definujte tyto funkce: /* vytvori platno */ canvas *canvas_create(int x, int y); /* nastavi dany bod na zadanou hodnotu */ void canvas_set_point(canvas *c, int x, int y, char character); /* vrati znak daneho bodu */ int canvas_get_point(canvas *c, int x, int y); /* nakresli obdelnik */ void canvas_draw_rect(canvas *c, int x, int y, int width, int height, char ch); /* vycisti platno */ void canvas_clear(canvas *c); /* vykresli obsah platna na standardni vystup */ void canvas_print(canvas *c); /* vykresli obsah platna do souboru */ void canvas_output(canvas *c, FILE *f); Jednotliv´e funkce ve vytvoˇren´e knihovnˇe pot´e otestujte z modulu hlavn´ı funkce. Pˇr´ıklad vystupu: ´
xxxxxxx x x x *********** x * x * x * x * x * x * x *********** x x x x xxxxxxx
Pˇr´ıklad vystupu: ´
*********** * * o * * o | * * * * * \___/ * * * ***********
Povolen´e knihovny: stdio.h, stdlib.h 30
19 19.1
Pr´ace s textovymi soubory ´ Souˇcty rˇa´ dku˚
Procviˇcovan´e uˇcivo: pr´ace s textovymi soubory, funkce, cykly ´ Napiˇste v jazyku C funkci int soucty(const char *vstup, const char *vystup), kter´a cˇ te ze vstupn´ıho souboru vstup desetinn´a cˇ ´ısla, poˇc´ıt´a souˇcty na jednotlivych rˇ a´ dc´ıch a zapisuje je do ´ vystupn´ ıho souboru vystup. Na konec vystupn´ ıho souboru pak nav´ıc vloˇz´ı sumu vˇsech cˇ ´ısel ve vs´ ´ tupn´ım souboru. Pˇr´ıklad vstupn´ıho souboru: 7.134 1.27 1.503 0.454 4.287
0.5198 1.324 4.95 2.367 8.675
2.436 0.9639 0.3466 0.6877 1.511
0.9626 1.538
0.4995
9.057 0.4296
0.1807 0.2331
1.112
Pˇr´ıklad vystupn´ ıho souboru: ´ 11.0524 5.5954 6.7996 13.8584 15.1357 Suma: 52.4415 Povolen´e knihovny: stdio.h, stdlib.h
19.2
Souˇcty zlomku˚
Procviˇcovan´e uˇcivo: pr´ace s textovymi soubory, strukturovan´e datov´e typy, funkce, cykly ´ Napiˇste v jazyku C funkci zlomek soucet(const char *vstup), kter´a cˇ te ze vstupn´ıho textov´eho souboru vstup zlomky (resp. dvojice celych ´ cˇ ´ısel), vypoˇc´ıt´av´a a vrac´ı souˇcet vˇsech zlomku˚ zapsanych ´ ve vstupn´ım souboru. Pro snadnˇejˇs´ı pr´aci se zlomky si definujte strukturovany´ typ zlomek. Vysledn y´ ´ zlomek by mˇel byt ´ upraven do z´akladn´ıho tvaru. Vykr´acen´ı zlomku do z´akladn´ıho tvaru doc´ıl´ıte ˚ zete urˇcit napˇr´ıklad vydˇelen´ım cˇ itatele i jmenovatele jejich nejvˇetˇs´ım spoleˇcnym ´ dˇelitelem, ktery´ muˇ pouˇzit´ım Euklidova algoritmu. Pˇr´ıklad vstupn´ıho souboru: 1 /-8 -14/ 9 1/2 1
/
2
Pˇr´ıklad vystupu: ´ Soucet je: -49 / 72 Povolen´e knihovny: stdio.h, stdlib.h ˚ suma nebo produkt komplexn´ıch cˇ ´ısel Alternativy ulohy: ´ produkt zlomku, 31
20 20.1
Pr´ace s bin´arn´ımi soubory Jednotkov´e vektory
Procviˇcovan´e uˇcivo: pr´ace s bin´arn´ımi soubory, porozumˇen´ı ciz´ımu programu, funkce, cykly, vˇetven´ı ´ v pˇripraven´em souboru (pˇr´ıloha A) a dopiˇste funkci int uprav data Prostudujte si zdrojovy´ kod (char *nazev). Tato funkce by mˇela cˇ ´ıst vektory - trojice cˇ ´ısel (pouˇz´ıvejte definovanou konstantu DIMENZE) typu double z bin´arn´ıho souboru nazev. Pro kaˇzdy´ pˇreˇcteny´ vektor funkce vypoˇc´ıt´a jemu ˚ odpov´ıdaj´ıc´ı vektor o jednotkov´e velikosti (smˇer a orientace vektoru zustanou zachov´any) a upravenym ´ vektorem pˇrep´ısˇ e star´a data v souboru. Funkce pot´e pokraˇcuje cˇ ten´ım dalˇs´ıho vektoru, dokud nen´ı cely´ obsah datov´eho souboru zpracov´an. Povolen´e knihovny: stdio.h, stdlib.h, time.h, math.h
20.2
Datab´aze osob
Procviˇcovan´e uˇcivo: pr´ace s bin´arn´ımi soubory, porozumˇen´ı ciz´ımu programu, funkce s promˇennym ´ ˚ cykly, vˇetven´ı poˇctem parametru, ´ v pˇripraven´em souboru (pˇr´ıloha B) a dopiˇste funkci int vyhledej Prostudujte si zdrojovy´ kod (char* soubor, char *kriteria, ...). Tato funkce by mˇela vyhledat v bin´arn´ı datab´azi soubor vˇsechny osoby odpov´ıdaj´ıc´ı danym ´ vlastnostem a vypsat je pomoc´ı funkce void vypis (osoba o) na obrazovku. Vlastnosti osob, kter´e budou pˇri vyhled´av´an´ı zkoum´any, urˇcuj´ı jednotliv´e znaky rˇ etˇezce kriteria (znak ”j” pro jm´eno osoby, ”p” pro pˇr´ıjmen´ı, ”n” pro datum narozen´ı, ”d” pro den narozen´ı, ”m” pro mˇes´ıc narozen´ı, ”r” pro rok narozen´ı, ”P” pro pohlav´ı a ”s” pro stav), za kterym ´ pak n´asleduj´ı vyhled´avan´e hodnoty tˇechto vlastnost´ı. Pˇr´ıklad pouˇzit´ı: vyhledej("databaze.dat", "jps", "Anna", "Novotna", VDOVEC); Vyp´ısˇ e vˇsechny vdovy se jm´enem Anna, pˇrijmen´ım Novotna ze souboru ”databaze.dat”. Povolen´e knihovny: stdio.h, stdlib.h, string.h, time.h, stdarg.h
32
21 21.1
Bitov´e oper´atory a bitov´a pole Datumy
Procviˇcovan´e uˇcivo: bitov´e oper´atory, pr´ace s bin´arn´ımi soubory, union, funkce ´ v pˇripraven´em souboru (pˇr´ıloha C) a dopiˇste funkci DATUM maximum Prostudujte si zdrojovy´ kod (char *nazev). Tato funkce by mˇela cˇ ´ıst datumy (vyuˇzijte bitov´e pole DATUM) z bin´arn´ıho souboru nazev a vr´atit nejvˇetˇs´ı (nejpozdˇejˇs´ı) datum jako svou n´avratovou hodnotu. ˚ zete tak´e pˇredefinovat jako union vyˇ Typ DATUM muˇ ´ se zm´ınˇen´eho bitov´eho pole a nezn´am´enkov´eho ˚ zete zjednoduˇsit porovn´av´an´ı 3 hodnot (rok, mˇes´ıc a den) na porovn´av´an´ı jedin´e cel´eho cˇ ´ısla, cˇ ´ımˇz si muˇ hodnoty. Pozor ovˇsem na poˇrad´ı bitu˚ ve struktuˇre bitov´eho pole a velikosti typu˚ na konkr´etn´ım poˇc´ıtaˇci. Toto rˇ eˇsen´ı je implementaˇcnˇe z´avisl´e! Pˇr´ıklad vystupu: ´ Nejpozdejsi datum je: 23. 4. 1995 Povolen´e knihovny: stdio.h, stdlib.h, time.h
21.2
Mnoˇzinov´e operace
Procviˇcovan´e uˇcivo: bitov´e oper´atory, dynamick´a alokace panˇeti, strukturovan´e datov´e typy, funkce, pole ´ v pˇripraven´em souboru (pˇr´ıloha D) a dopiˇste funkce mnozina prunik Prostudujte si zdrojovy´ kod (mnozina A, mnozina B), mnozina sjednoceni(mnozina A, mnozina B) a mnozina rozdil(mnozina A, mnozina B) pro operace s danymi mnoˇzinami A a B. Pro reprezentaci mnoˇzin ´ pouˇzijte pˇripraveny´ strukturovany´ typ mnozina, jehoˇz cˇ len pocet odpov´ıd´a poˇctu moˇznych ´ indexu˚ (tj. poˇctu prvku˚ univerza) a cˇ len prvky obsahuje posloupnost bitu˚ (rozˇclenˇenou do nˇekolika poloˇzek typu int tvoˇr´ıc´ıch pole), kter´a ud´av´a, ktery´ prvek patˇr´ı (bit s hodnotou 1) a ktery´ nepatˇr´ı (hodnota 0) do dan´e mnoˇziny. Pˇr´ıklad vystupu: ´ Mnozina A: 3, 5, 32, 33, 34, 36, 37, 69, Mnozina B: 2, 32, 34, 35, 36, 37, 38, 40, 42, 44, 65, Prunik mnozin A a B: 32, 34, 36, 37, Sjednoceni mnozin A a B: 2, 3, 5, 32, 33, 34, 35, 36, 37, 38, 40, 42, 44, 65, 69, Rozdil mnozin A a B: 3, 5, 33, 69, Povolen´e knihovny: stdio.h, stdlib.h
33
22
Procviˇcen´ı uˇciva II
22.1
Maticov´a kalkulaˇcka
Procviˇcovan´e uˇcivo: pr´ace s textovym ´ souborem, celkov´a koncepce programu, dynamick´a v´ıcerozmˇern´a pole, strukturovan´e datov´e typy Napiˇste v jazyku C program pro vypoˇ ´ cty libovolnych ´ formul´ı sloˇzenych ´ z matic (velk´a p´ısmena anglick´e abecedy), znam´enek plus a kr´at (pro operace sˇc´ıt´an´ı a n´asoben´ı matic) a z´avorek. Program bude zad´an´ı vypoˇ matici ukl´adat ´ ctu (formuli i matice) naˇc´ıtat ze vstupn´ıho textov´eho souboru a vyslednou ´ ˚ do vystupn´ ıho textov´eho souboru. Jm´ena vstupn´ıho a vystupn´ ıho souboru (pˇr´ıpadnˇe cestu k souborum) ´ ´ bude moˇzn´e specifikovat pˇr´ımo pˇri spuˇstˇen´ı programu z pˇr´ıkazov´e rˇ a´ dky. V programu by tak´e mˇela byt ´ zabudov´ana kontrola spr´avnosti naˇcten´eho zad´an´ı a oˇsetˇren´ı moˇznych ´ chyb (pˇri otev´ır´an´ı souboru, alokaci pamˇeti a podobnˇe). Program by mˇel byt ´ napsany´ pˇrehlednˇe a ˚ efektivnˇe - s durazem na smyslupln´e rozdˇelen´ı do nˇekolika funkc´ı a minimum glob´alnˇe deklarovanych ´ promˇennych. ´ Pˇr´ıklad pouˇzit´ı: ./kalkulacka zadani.txt vysledek.txt (OS Linux) kalkulacka.exe zadani.txt vysledek.txt (OS Windows) Pˇr´ıklad vstupn´ıho souboru: (A * B)+(C*(A*B)) 2 3 1.1 1 2 4 5 6 3 1 5 9
4 2 3 4 6 7 8 0 1 2
2 2 1 2 3 4 Pˇr´ıklad vystupn´ ıho souboru: ´ 2 4 214.2 92.4 130.6 168.8 487.3 214.6 301.9 389.2 Povolen´e knihovny: stdio.h, stdlib.h, string.h
22.2
Hled´an´ı nejdelˇs´ıch slov
Procviˇcovan´e uˇcivo: pr´ace s textovym ´ souborem, celkov´a koncepce programu, v´ıcerozmˇern´a pole, dynamick´a pr´ace s pamˇet´ı, strukturovan´e datov´e typy Napiˇste v jazyku C program, ktery´ v dan´em textov´em souboru vyhled´a zadany´ poˇcet nejdelˇs´ıch slov. N´azev vstupn´ıho souboru a poˇzadovany´ poˇcet hledanych ´ nejdelˇs´ıch slov by mˇelo byt ´ moˇzn´e specifikovat z pˇr´ıkazov´e rˇ a´ dky pˇri spuˇstˇen´ı programu. Nalezen´a nejdelˇs´ı slova vypiˇste pro jednoduchost na 34
obrazovku, pˇriˇcemˇz slova se mohou opakovat (pokud se ve zpracov´avan´em textov´em souboru vyskyˇ podle poˇrad´ı jejich vyskytu tuj´ı v´ıcekr´at), slova stejn´e d´elky d´ale tˇridte v textu. ´ Pˇr´ıklad pouˇzit´ı: ./nejdelsi slova vstup.txt 10 (OS Linux) nejdelsi slova.exe vstup.txt 10 (OS Windows) Pˇr´ıklad vstupn´ıho souboru: Prijde informatik na prijimacky na ekonomku a tam se ho ptaji: - "Tak teda kolik je 5 + 3?" - "8, pohotove odpovi." - "Spravne. Dame tezsi priklad. Kolik je 7 + 4?" - "11." - "Vyborne. A ted nejtezsi ´ uloha. Kolik je 2 - 3?" - "255." Proc si informatici pletou Halloween a Vanoce? Protoze OCT 31 je to same co DEC 25. Lide se deli do 10 skupin. Jedni dvojkovou soustavu znaji a druzi ne. Lide se deli do 10 skupin. Jedni znaji dvojkovou a trojkovou soustavu, druzi neznaji ani jednu a treti si mysleli, ze tohle je vtip o dvojkove soustave. Pˇr´ıklad vystupu: ´ informatici informatik prijimacky Halloween dvojkovou dvojkovou trojkovou ekonomku pohotove nejtezsi Povolen´e knihovny: stdio.h, stdlib.h, string.h, ctype.h
22.3
Medi´an cˇ ´ısel v souboru
Procviˇcovan´e uˇcivo: pr´ace s textovym ´ souborem, celkov´a koncepce programu, dynamick´a pr´ace s pamˇet´ı, pole, strukturovan´e datov´e typy Napiˇste v jazyku C program, ktery´ naˇcte cel´a cˇ ´ısla z dan´eho textov´em souboru a vyp´ısˇ e na obrazovku medi´an tˇechto hodnot. N´azev zpracov´avan´eho souboru by mˇelo byt ´ moˇzn´e urˇcit z pˇr´ıkazov´e rˇ a´ dky pˇri spouˇstˇen´ı programu. Pˇripom´ın´ame, zˇ e pro nalezen´ı medi´anu dan´eho souboru staˇc´ı hodnoty seˇradit ˚ obvykle podle velikosti a vz´ıt hodnotu, kter´a se nal´ez´a uprostˇred. Pokud m´a soubor sudy´ poˇcet prvku, ˚ er dvou ”prostˇredn´ıch” hodnot. se za medi´an oznaˇcuje aritmeticky´ prumˇ Pˇr´ıklad pouˇzit´ı: ./median vstup.txt (OS Linux) median.exe vstup.txt (OS Windows) 35
Pˇr´ıklad vstupn´ıho souboru: -8 5 4
8 2 0
7 2 7
-6 3
5 1
Pˇr´ıklad vystupu: ´ Median souboru je: 3 Povolen´e knihovny: stdio.h, stdlib.h
36
A 1 2 3 4
Zdrojovy´ kod ´ k uloze ´ ,,Jednotkov´e vektory”
#include #include #include #include
<stdio.h> <stdlib.h>
<math.h>
5 6 7 8
#define VELIKOST_BLOKU 50 #define PRESNOST 100 #define DIMENZE 3
9 10 11 12 13 14
/* hlavicky lokalnich funkci */ int generuj_data(char *nazev, int max, long pocet); int precti_data(char *nazev); double vel_vektor(double *v); int uprav_data(char *nazev);
15 16 17 18 19 20 21 22 23 24 25 26
/* definice funkci */ int main() { generuj_data("data.dat", 100, 123); precti_data("data.dat"); uprav_data("data.dat"); printf("\nNova data: \n"); precti_data("data.dat"); system("pause"); return 0; }
27 28 29 30 31 32 33 34 35 36
/* funkce vytvori binarni soubor s cisly typu double od 0 do max - 1, * parametr pocet udava pocet cisel v souboru */ int generuj_data(char *nazev, int max, long pocet) { FILE *f; double data[VELIKOST_BLOKU]; long i, j; unsigned int zapsano;
37 38 39 40 41
/* otevreni souboru */ f = fopen(nazev, "wb"); if (f == NULL) return 1;
42 43 44
/* inicializace generetoru nahodnych cisel */ srand((unsigned) time(NULL));
45 46 47
/* generovani a zapis uplnych datovych bloku */ for (i = 0; i < pocet / VELIKOST_BLOKU; i++) {
48 49 50 51 52
/* generovani jednoho datoveho bloku */ for (j = 0; j < VELIKOST_BLOKU; j++) { data[j] = (rand() % (max * PRESNOST)) / (double) PRESNOST; } 37
53
/* zapis jednoho datoveho bloku */ zapsano = (unsigned) fwrite(data, sizeof(double), VELIKOST_BLOKU, f);
54 55 56
/* test uspesnosti zapisu */ if (zapsano != VELIKOST_BLOKU) { fclose(f); return 2; }
57 58 59 60 61
}
62 63
/* generovani posledniho neuplneho datoveho bloku */ for (j = 0; j < pocet % VELIKOST_BLOKU; j++) { data[j] = (rand() % (max * PRESNOST)) / (double) PRESNOST; }
64 65 66 67 68
/* zapis posledniho datoveho bloku */ zapsano = (unsigned) fwrite(data, sizeof(double), pocet % VELIKOST_BLOKU, f);
69 70 71
/* test uspesnosti zapisu */ if (zapsano != pocet % VELIKOST_BLOKU) { fclose(f); return 2; }
72 73 74 75 76 77
/* uzavreni proudu a test uspesnosti */ if (EOF == fclose(f)) return 3; return 0;
78 79 80 81 82
}
83 84 85 86 87 88 89 90
/* funkce cte binarni soubor s cisly typu double a vypisuje je na std. vystup */ int precti_data(char *nazev) { FILE *f; double data[VELIKOST_BLOKU]; unsigned int i; unsigned int precteno;
91 92 93 94 95
/* otevreni souboru */ f = fopen(nazev, "rb"); if (f == NULL) return 1;
96 97 98 99 100
/* cte se dokud to jde */ do { /* cteni celeho bloku */ precteno = (unsigned) fread(data, sizeof(double), VELIKOST_BLOKU, f);
101 102 103 104 105 106
/* vypis bloku dat na obrazovku */ for (i = 0; i < precteno; i++) { printf("%g ", data[i]); } printf("\n");
38
} while (precteno == VELIKOST_BLOKU);
107 108
/* uzavreni proudu a test uspesnosti */ if (EOF == fclose(f)) return 3; return 0;
109 110 111 112 113
}
114 115 116 117 118 119 120 121 122 123
/* funkce pro vypocet delky vektoru urcite DIMENZE */ double vel_vektor(double *v) { double out = 0.0; int i; for (i = 0; i < DIMENZE; i++) out += v[i] * v[i]; return sqrt(out); }
124 125 126 127 128
int uprav_data(char *nazev) { /* DOPLNTE */ }
39
B 1 2 3 4 5
Zdrojovy´ kod ´ k uloze ´ ,,Datab´aze osob”
#include #include #include #include #include
<stdlib.h> <stdio.h> <string.h> <stdarg.h>
6 7 8 9 10
#define #define #define #define
MAX_ROK 2010 MIN_ROK 1950 POCET_STAVU 4 DELKA 20
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
const int jmena_m_pocet = 10; const int jmena_z_pocet = 10; const int prijmeni_m_pocet = 10; const int prijmeni_z_pocet = 10; const char *jmena_m[] = { "Jakub", "Jan", "Tomas", "Lukas", "Ondrej", "Vojtech", "Matej", "Adam", "Daniel", "Filip" }; const char *jmena_z[] = { "Tereza", "Natalie", "Anna", "Adela", "Eliska", "Karolina", "Katerina", "Barbora", "Lucie", "Kristyna" }; const char *prijmeni_m[] = { "Novak", "Svoboda", "Novotny", "Dvorak", "Cerny", "Prochazka", "Kucera", "Vesely", "Horak", "Nemec" }; const char *prijmeni_z[] = { "Novakova", "Svobodova", "Novotna", "Dvorakova", "Cerna", "Prochazkova", "Kucerova", "Vesela", "Horakova", "Nemcova" };
28 29 30 31
typedef enum { MUZ = ’M’, ZENA = ’Z’ } POHLAVI;
32 33 34 35
typedef enum { SVOBODNY = ’S’, ZENATY = ’Z’, ROZVEDENY = ’R’, VDOVEC = ’V’ } STAV;
36 37 38 39 40 41
typedef struct { char den; char mesic; int rok; } datum;
42 43 44 45 46 47 48 49
typedef struct { char jmeno[DELKA]; char prijmeni[DELKA]; datum narozen; POHLAVI pohlavi; STAV stav; } osoba;
50 51 52
int je_prestupny(unsigned int rok); unsigned int pocet_dnu(unsigned int mesic); 40
53 54 55 56
datum generuj_datum(int rok_od, int rok_do); int generator(char *soubor, int pocet); int vyhledej(char *soubor, char *kriteria, ...); void vypis(osoba o);
57 58 59 60 61
int main() { /* vygenerovani binarni databaze */ generator("databaze.dat", 1000);
62
/* vyhledavani v databazi */ vyhledej("databaze.dat", "P", ZENA); printf("\n"); vyhledej("databaze.dat", "jps", "Anna", "Novotna", VDOVEC);
63 64 65 66 67
return 0;
68 69
}
70 71 72 73 74 75 76 77
int je_prestupny(unsigned int rok) { if (rok % 100 == 0) return (rok % 400 == 0); else return (rok % 4 == 0); }
78 79 80 81 82 83 84 85 86 87
unsigned int pocet_dnu(unsigned int mesic) { const static int pocet[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (mesic <= 12) return pocet[mesic - 1]; else return 0; }
88 89 90 91 92 93 94 95
datum generuj_datum(int rok_od, int rok_do) { char den; char mesic; int rok; char max_den; datum d;
96 97 98 99 100 101 102
rok = (rand() % (rok_do - rok_od + 1)) + rok_od; mesic = (rand() % 12) + 1; max_den = pocet_dnu(mesic); if ((mesic == 2) && (je_prestupny(rok))) max_den++; den = (rand() % max_den) + 1;
103 104 105 106
d.den = den; d.mesic = mesic; d.rok = rok;
41
return d;
107 108
}
109 110 111 112 113 114
int generator(char *soubor, int pocet) { int i; size_t zapsano; FILE *fw;
115 116 117 118 119 120 121
/* otevreni souboru */ fw = fopen(soubor, "wb"); if (fw == NULL) { printf("Chyba: Vystupni soubor nebyl vytvoren. \n"); return 1; }
122 123 124 125 126 127
/* generovani udaju a zapis do souboru */ srand((unsigned) time(NULL)); for (i = 0; i < pocet; i++) { osoba o; char stav_cislo;
128
o.pohlavi = (rand() % 2) ? MUZ : ZENA; if (o.pohlavi == MUZ) { strcpy(o.jmeno, jmena_m[rand() % jmena_m_pocet]); strcpy(o.prijmeni, prijmeni_m[rand() % prijmeni_m_pocet]); } else { strcpy(o.jmeno, jmena_z[rand() % jmena_z_pocet]); strcpy(o.prijmeni, prijmeni_z[rand() % prijmeni_z_pocet]); } o.narozen = generuj_datum(MIN_ROK, MAX_ROK); stav_cislo = rand() % POCET_STAVU; switch (stav_cislo) { case 0: o.stav = SVOBODNY; break; case 1: o.stav = ZENATY; break; case 2: o.stav = ROZVEDENY; break; case 3: o.stav = VDOVEC; break; }
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/* zapis a test */ zapsano = fwrite(&o, sizeof(osoba), 1, fw); if (zapsano != 1) { fclose(fw); return 2; }
154 155 156 157 158 159 160
}
42
/* uzavreni souboru a test */ if (fclose(fw) == EOF) { printf("Chyba: Vystupni soubor nebyl uzavren. \n"); return 3; }
161 162 163 164 165 166
return 0;
167 168
}
169 170 171 172 173
int vyhledej(char *soubor, char *kriteria, ...) { /* DOPLNTE */ }
174 175 176 177 178 179 180
void vypis(osoba o) { static char *stavy[] = { "svobodny", "svobodna", "zenaty", "vdana", "rozvedeny", "rozvedena", "vdovec", "vdova" }; int stavy_index;
181
printf("%s %s ", o.jmeno, o.prijmeni);
182 183
if (o.pohlavi == MUZ) printf("narozen "); else printf("narozena ");
184 185 186 187 188
printf("%i. %i. %i", o.narozen.den, o.narozen.mesic, o.narozen.rok);
189 190
switch (o.stav) { case SVOBODNY: stavy_index = 0; break; case ZENATY: stavy_index = 2; break; case ROZVEDENY: stavy_index = 4; break; case VDOVEC: stavy_index = 6; break; } stavy_index += (o.pohlavi == MUZ) ? 0 : 1; printf(", %s\n", stavy[stavy_index]);
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
}
43
C
Zdrojovy´ kod ´ k uloze ´ ,,Datumy”
1 2 3 4
#include <stdio.h> #include <stdlib.h> #include
5 6 7
#define MIN_ROK 1980 #define MAX_ROK 2000
8 9 10 11 12 13
typedef struct { unsigned den:5; unsigned mesic:4; unsigned rok:7; } DATUM;
14 15 16 17 18 19
int je_prestupny(unsigned int rok); unsigned int pocet_dnu(unsigned int mesic); int generuj_datumy(const char *nazev, unsigned int pocet); int precti_datumy(char *nazev); DATUM maximum(char *nazev);
20 21 22 23 24 25 26 27 28 29 30 31
int main() { DATUM m; generuj_datumy("datumy.dat", 100); precti_datumy("datumy.dat"); m = maximum("datumy.dat"); printf("\nNejpozdejsi datum je: %u. %u. %u\n", m.den, m.mesic, m.rok + MIN_ROK); system("pause"); return 0; }
32 33 34 35 36 37 38 39
int je_prestupny(unsigned int rok) { if (rok % 100 == 0) return (rok % 400 == 0); else return (rok % 4 == 0); }
40 41 42 43 44 45 46 47 48 49 50
unsigned int pocet_dnu(unsigned int mesic) { const static int pocet[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (mesic <= 12) return pocet[mesic - 1]; else return 0; }
51 52
int generuj_datumy(const char *nazev, unsigned int pocet) 44
53
{ unsigned int i; size_t zapsano; FILE *fw;
54 55 56 57
fw = fopen(nazev, "wb"); if (fw == NULL) return 1;
58 59 60 61
srand((unsigned) time(NULL)); for (i = 0; i < pocet; i++) { unsigned int den; unsigned int mesic; unsigned int rok; unsigned int max_den; DATUM d; rok = (rand() % (MAX_ROK - MIN_ROK + 1)) + MIN_ROK; mesic = (rand() % 12) + 1; max_den = pocet_dnu(mesic); if ((mesic == 2) && (je_prestupny(rok))) max_den++; den = (rand() % max_den) + 1;
62 63 64 65 66 67 68 69 70 71 72 73 74 75
d.den = den; d.mesic = mesic; d.rok = rok - MIN_ROK; zapsano = fwrite(&d, sizeof(DATUM), 1, fw); if (zapsano != 1) { fclose(fw); return 2; }
76 77 78 79 80 81 82 83
} if (EOF == fclose(fw)) return 3; return 0;
84 85 86 87 88
}
89 90 91 92 93 94
int precti_datumy(char *nazev) { FILE *fr; DATUM d; size_t precteno;
95 96 97 98
fr = fopen(nazev, "rb"); if (fr == NULL) return 1;
99 100 101 102 103 104 105 106
/* cte dokud to jde - neni testovano, * jestli skonci na konci souboru nebo nastane chyba */ do { precteno = fread(&d, sizeof(DATUM), 1, fr); printf("%u. %u. %u\n", d.den, d.mesic, d.rok + MIN_ROK); } while (precteno == 1);
45
107
if (EOF == fclose(fr)) return 3; return 0;
108 109 110 111
}
112 113 114 115 116
DATUM maximum(char *nazev) { /* DODELAT */ }
46
D
Zdrojovy´ kod ´ k uloze ´ ,,Mnoˇzinov´e operace”
1 2 3
#include <stdio.h> #include <stdlib.h>
4 5 6 7 8 9
/* struktura reprezentujici mnozinu */ typedef struct { int *prvky; /* pole pro bitove ulozeni prvku */ int pocet; /* pocet prvku v mnozine */ } mnozina;
10 11 12 13 14
void vypis(mnozina A); /* vypis indexu prvku dane mnoziny na obrazovku */ mnozina prunik(mnozina A, mnozina B); /* prunik dvou mnozin */ mnozina sjednoceni(mnozina A, mnozina B); /* sjednoceni dvou mnozin */ mnozina rozdil(mnozina A, mnozina B); /* rozdil prvni a druhe mnoziny */
15 16 17 18
int main() { mnozina A, B, C;
19 20 21 22 23 24 25
/* vytvoreni mnoziny A */ A.prvky = (int *) malloc(3 * sizeof(int)); A.prvky[0] = 43; A.prvky[1] = 55; A.prvky[2] = 42351; A.pocet = 3 * sizeof(int) * 8;
26 27 28 29 30 31 32
/* vytvoreni mnoziny B */ B.prvky = (int *) malloc(3 * sizeof(int)); B.prvky[0] = 43; B.prvky[1] = 5501; B.prvky[2] = 42000; B.pocet = 3 * sizeof(int) * 8;
33 34 35 36 37
/* vypis mnoziny A na obrazovku */ printf("Mnozina A: \n"); vypis(A); printf("\n");
38 39 40 41 42
/* vypis mnoziny B na obrazovku */ printf("Mnozina B: \n"); vypis(B); printf("\n");
43 44 45 46 47 48
/* vypocet pruniku a jeho vypis na obrazovku */ C = prunik(A, B); printf("Prunik mnozin A a B: \n"); vypis(C); printf("\n");
49 50 51 52
/* vypocet sjednoceni a jeho vypis na obrazovku */ free(C.prvky); C = sjednoceni(A, B); 47
printf("Sjednoceni mnozin A a B: \n"); vypis(C); printf("\n");
53 54 55 56
/* vypocet rozdilu a jeho vypis na obrazovku */ free(C.prvky); C = rozdil(A, B); printf("Rozdil mnozin A a B: \n"); vypis(C); printf("\n");
57 58 59 60 61 62 63
system("pause"); return 0;
64 65 66
}
67 68 69 70 71 72 73
void vypis(mnozina A) { long maska; int index; int i, j; int mez_i;
74
index = 0;
75 76
/* vypocet meze cyklu */ mez_i = A.pocet / (sizeof(int) * 8) + 1;
77 78 79
/* cyklus pres cisla typu int */ for (i = 0; i < mez_i; i++) {
80 81 82
/* vypocet meze cyklu */ int mez_j = (i < mez_i - 1) ? sizeof(int) * 8 : (A.pocet % (sizeof(int) * 8));
83 84 85 86
/* posun masky na zacatek */ maska = 1;
87 88 89
/* cyklus pres jednotlive bity */ for (j = 0; j < mez_j; j++) {
90 91 92
/* pokud je prvek v mnozine - bit 1 pod maskou, * tak vypiseme odpovidajici index */ if (A.prvky[i] & maska) printf("%i, ", index); maska *= 2; /* posun masky */ index++; /* posun indexu */
93 94 95 96 97 98 99
}
100
}
101 102
}
103 104 105 106
mnozina prunik(mnozina A, mnozina B) { /* DOPLNTE */
48
107
}
108 109 110 111 112
mnozina sjednoceni(mnozina A, mnozina B) { /* DOPLNTE */ }
113 114 115 116 117
mnozina rozdil(mnozina A, mnozina B) { /* DOPLNTE */ }
49
Literatura [1] Pavel Herout: Uˇcebnice jazyka C. Kopp, 2007, ISBN 80-7232-220-6. [2] Pavel Herout: Uˇcebnice jazyka C, 2. d´ıl. Kopp, 2006, ISBN 80-7232-221-4. [3] Reek Kenneth: Pointers on C. Addison Wesley, 1997, ISBN: 978-0673999863. [4] Brian W. Kernighan, Dennis M. Ritchie: Programovac´ı jazyk C. Computer Press, 2008, ISBN 80-2510897-X. [5] Robert Sedgewick: Algorithms in C. Addison-Wesley Professional, 2001, ISBN: 978-0201756081. [6] Jeri R. Hanly, Elliot B. Koffman: Problem Solving and Program Design in C. Addison Wesley, 2006, ISBN: 978-0321409911. [7] Eric S. Roberts: Programming Abstractions in C. Addison Wesley, 1997, ISBN: 978-0201545418. [8] Eric S. Roberts: The Art and Science of C. Addison Wesley, 1994, ISBN:978-0201543223.
50