Programování a počítače 1 Počítačová cvičení pro obor B-EST



Podobné dokumenty
Struktury a dynamické proměnné

Informační systémy VUT, studentské účty, Moodle, Gigadisk, elektronická pošta a její služby, operační systémy, UNIX

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

- jak udělat konstantu long int: L long velka = 78L;

Operační systémy. Cvičení 3: Programování v C pod Unixem

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

2 Datové typy v jazyce C

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Vstupní požadavky, doporučení a metodické pokyny

Algoritmizace a programování

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Algoritmizace a programování

Stručný návod k programu Octave

Operační systémy. Cvičení 4: Programování v C pod Unixem

Základy programování (IZP)

VISUAL BASIC. Práce se soubory

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Formátové specifikace formátovací řetězce

Úvod do programování. Lekce 1

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

IUJCE 07/08 Přednáška č. 1

3 KTE / ZPE Informační technologie

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Základy algoritmizace a programování

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Základy programování (IZP)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Základy jazyka C. Základy programování 1 Tomáš Kühr

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

ALGORITMIZACE A PROGRAMOVÁNÍ

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Algoritmizace a programování

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Základy programování (IZP)

Dotazy tvorba nových polí (vypočítané pole)

Programování v C++ 1, 1. cvičení

1. Téma 03 - Rozhodování

Zápis programu v jazyce C#

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

HTML Hypertext Markup Language

2. cvičení z ZI1 - Excel

Základy algoritmizace a programování

Programování v C++, 2. cvičení

Programovací jazyk Pascal

Základy programování (IZP)

Př. další použití pointerů

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

10 Práce s řetězci - pokračování

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

8 Třídy, objekty, metody, předávání argumentů metod

Základy programování (IZP)

Opakování programování

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Lekce 01 Úvod do algoritmizace

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

Funkce, intuitivní chápání složitosti

1 Webový server, instalace PHP a MySQL 13

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

Pro označení disku se používají písmena velké abecedy, za nimiž následuje dvojtečka.

Programování v C++ 3, 3. cvičení

C2110 Operační systém UNIX a základy programování

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

II. Úlohy na vložené cykly a podprogramy

Programovací jazyk C++ Hodina 1

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

10 Algoritmizace Příklad 2 Word 2007/ VBA

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Algoritmy a datové struktury

ČÁST 1. Základy 32bitového programování ve Windows

PODPROGRAMY PROCEDURY A FUNKCE

Struktury a dynamická paměť

Transkript:

FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Programování a počítače 1 Počítačová cvičení pro obor B-EST Autor textu: doc. Ing. Jiří Šebesta, Ph.D. 2015 Komplexní inovace studijních programů a zvyšování kvality výuky na FEKT VUT v Brně OP VK CZ.1.07/2.2.00/28.0193

2 FEKT VUT v Brně Obsah ÚVOD... 3 1 INFORMAČNÍ SYSTÉMY VUT, POČÍTAČOVÉ SÍTĚ A UNIX... 3 2 KONZOLOVÁ APLIKACE, TISKOVÁ FUNKCE PRINTF()... 8 3 MANIPULACE S POLEM, CYKLUS FOR... 11 4 ALGORITMUS TAYLOROVY ŘADY, PROGRAMOVÁNÍ CYKLŮ... 14 5 MANIPULACE S ŘETĚZCI V JAZYKU C... 17 6 STATISTICKÉ VÝPOČTY, APLIKACE CYKLŮ... 20 7 FUNKCE, SESTAVENÍ KNIHOVNY FUNKCÍ, VOLÁNÍ FUNKCÍ... 23 8 STRUKTURY A DYNAMICKÉ PROMĚNNÉ... 27 9 PROGRAMY PRO MANIPULACI SE SOUBORY... 33 10 DYNAMICKÁ DATABÁZE... 35 11 POKROČILÉ ALGORITMY, TŘÍDĚNÍ... 36 ODPOVĚDI KE KONTROLNÍM OTÁZKÁM... 38

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 3 Úvod Tato skripta jsou určena pro studenty předmětu Programování a počítače 1 pro obor Elektronika a sdělovací technika, zkr. BPC1E. Obsahují podrobné návody k počítačovým cvičením uvedeného předmětu. Základním cílem je seznámit posluchače kurzu se základy programovacího jazyka C dle standardu ANSI do úrovně manipulace s dynamickými proměnnými a využití pokročilých datových typů jako jsou struktury. Protože je předmět zařazen hned do prvního semestru bakalářského studia na FEKT, je první cvičení zaměřeno na seznámení s počítačovými sítěmi provozovanými na fakultě a univerzitě a stručný exkurz do operačního systému UNIX. Od druhého cvičení je již výuka orientována na klasický jazyk C. Pro pochopení základů jazyka C a jednoduchou implementaci algoritmů jsou všechny úlohy řešeny jako konzolové aplikace, kdy výsledky jsou prezentovány v dosovském okně se znakově orientovaným výstupem. Pro jednoduchost a snadnou dostupnost bylo zvoleno vývojové prostředí Code::Blocks, dostupné na www.codeblocks.org, včetně kompilátoru GNU GCC. Jednotlivá cvičení jsou koncipována jako praktické ověření teoretických poznatků probíraných na přednáškách. Začíná se klasickými učebnicovými základy jazyka C, tiskovou funkcí printf(), výrazy a operátory v C, dále jsou procvičovány příkazy pro větvení a cykly. Následuje problematika programování řetězců a v sedmém cvičení si studenti sestaví vlastní funkce včetně zapouzdření do knihovny a aplikaci v projektu. Závěrečná skupina počítačových cvičení je zaměřená na pokročilé datové typy. Na těchto cvičeních studenti sestavují vlastní struktury, definují dynamicky alokované proměnné a vyzkouší si vytvořit jednoduchou dynamickou databázi s ukládáním do souboru. V posledním cvičení jsou demonstrovány nejčastěji aplikované algoritmy pro vyhledávání a třídění včetně nasazení takových algoritmů na vyhledávání a setřídění struktur v dynamické databázi podle dané položky. Na předmět BPC1E navazuje bezprostředně předmět BPC2E ve druhém semestru, kde se postupně přejde až na úroveň objektově orientovaného programování v C++. Prerekvizitou pro předmět BPC1E jsou znalosti na úrovni středoškolského studia bez specializace na programování. Předpokládá se tedy, že student umí používat základní kancelářské programy a správce souborů na PC a jakýmkoli programováním je nepolíbený. Každá úloha obsahuje zadání a rozbor veřejně přístupné úlohy, kterou si studenti mohou nachystat v rámci domácí přípravy. Druhou částí je zadání B, které je přístupné vždy až na začátku vlastního cvičení. Třetí částí je bonusová úloha, která je nadstavbou pro samostatné zdokonalení studenta v dané problematice. Rozbory jednotlivých úloh obsahují rovněž části stěžejního zdrojového kódu s vysvětlením. Zdrojový kód je odlišen od ostatního textu písmem typu Courier New. Na závěr každé kapitoly je uvedena doporučená literatura a tři kontrolní otázky, jejichž odpovědi jsou uvedeny v závěrečné kapitole těchto skript. Součástí úloh je i předpřipravený kód. Může to být pouze kostra programu nebo to může být poměrně rozsáhlý zdrojový kód, který je nutné prostudovat a doplnit. Zdrojové kódy k jednotlivým úlohám jsou k dispozici na www stránkách: http://www.urel.feec.vutbr.cz/~sebestaj/bpc1e/cviceni.htm. 1 Informační systémy VUT, počítačové sítě a UNIX Cílem je seznámit se informačními systémy, které jsou provozovány jak na univerzitní úrovni, tak i na úrovni fakulty a na úrovni Ústavu radioelektroniky. Protože jsou počítačové sítě založeny na operačním systému UNIX, je dalším cílem seznámení se se základním ovládáním operačního systému UNIX/Linux a se základními operacemi v počítačových sítích.

4 FEKT VUT v Brně Úloha A. Tento úkol je zaměřen na základní ovládání OS UNIX, který je spuštěn na studentském serveru FEST. Přihlaste se přes SSH svým loginem na fest.stud.feec.vutbr.cz. pomocí programu PuTTY. Heslo je stejné jako pro email. Specifikace cíle je uvedena na obrázku 1.1. Obr. 1.1. Nastavení jména hostitelského serveru v programu PuTTY. Po připojení k serveru budete dotázání na login a heslo. Při zadávání hesla se nezobrazují žádné znaky (ani hvězdičky). Po přihlášení bude prompt nastaven na váš home adresář (viz obr. 1.2). Obr. 1.2. Stav okna po přihlášení na server FEST. Vypište obsah domácího adresáře. Vytvořte editorem pico například soubor test.txt a složku pokus. Soubor zkopírujte do uvedené složky, originál přejmenujte na test2.txt. Zobrazte soubor test2.txt na konzoli. Smažte oba soubory i vytvořený

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 5 adresář. Toto vyzkoušejte zadáváním příkazů za prompt i ve správci souborů mc. Zastavení vykonávání aktuálního příkazu se provádí klávesovou zkratkou Ctrl+C. Základní utility a příkazy Shellu jsou: cd: změna adresáře, change directory ls: výpis adresáře, list mkdir, rmdir: vytvoření/zrušení adresáře, make/remove directory rm: smazání souboru, remove cp, mv: kopie/přesun souboru, copy/move pico: jednoduchý textový editor cat, more: zřetězení/výpis, stránkový výpis souboru chmod: změna přístupových práv Úloha B. V tomto úkolu si ukážeme možnosti jednoduchého vytváření webových HTML stránek s možností vystavení na studentském webu. Vytvořte na serveru jednoduchou HTML stránku a publikujte ji. Výsledek ověřte zobrazením přes prohlížeč. HTML (HyperText Markup Language) je velmi jednoduchý značkovací jazyk pro popis tzv. hyperdokumentu. Dokument je organizován hierarchicky pomocí systému předdefinovaných značek, které se zapisují mezi znaky < a >. Ty jsou buď párové definující začátek a konec platnosti (koncová je shodná s počáteční jen jí předchází znak lomítko /) nebo nepárové definující začátek platnosti a platí, dokud není předefinována stejnou značkou s jiným parametrem. Každý HTML dokument je ohraničen párovou značkou <html>. Součástí dokumentu může být hlavička <head>. Za hlavičkou následuje obsah dokumentu <body>. Značky <head> i <body> jsou párové. Součástí hlavičky je specifikace vlastního dokumentu. K zápisu doplňujících informací se používá nepárová značka <meta>. Nadpis dokumentu je ohraničen značkou <title>. Parametry jednotlivých značek jsou zapisovány spolu se značkou a jejich hodnoty jsou uzavřeny v uvozovkách "" (například <a href="index.html">). Zkuste v libovolném editoru sestavit příklad jednoduché HTML stránky: <html> <head> <title>první HTML stránka</title> </head> <body> Moje první HTML stránka xjmeno00. </body> </html> Uložte ji jako index.html do podadresáře WWW. Vaše vytvořená stránka bude zobrazitelná na: http://www.stud.feec.vutbr.cz/~vaslogin

6 FEKT VUT v Brně Prostý text se zapisuje bez značek, které by specifikovaly jeho formátování, resp. použije se aktuálně definované formátování. Text zapsaný na více řádcích se ve www dokumentu spojí do jednoho odstavce. Pro definování odstavce lze použít nepárovou značku <p>, pro rozdělení textu koncem řádku nepárovou značka <br>. Pro zvýraznění textu se používá značka <em>, pro silnější zvýraznění (tučně) značka <strong>, pro zápis citace slouží značka <cite>, pro výpis kódu programu bývá uvozen značkou <code>. Všechny tyto značky jsou párové (specifikují začátek a konec platnosti). Pro definici nadpisů se používají párové značky <h1> až <h5> mezi které se zapíší texty nadpisů. Značka <h1> označuje nadpis nejvyšší úrovně, značka <h5> nadpis nejnižší úrovně, např. takto: <body> <h1>titulek kapitoly 1</h1> <em>zvyrazneny text první kapitoly</em> <p> <strong>tucny text dalsiho odstavce</strong> <h2>titulek podkapitoly 1.1</h2> text podkapitoly<br> text na novem radku <h3>titulek podkapitola 1.1.1</h3>... </body> Text lze doplnit o obrázky pomocí značky <img>, přičemž parametr src definuje soubor obrázku a parametr alt text, který bude zobrazen v případě, že obrázek nebude k dispozici: <img src="muj_obrazek.jpg" alt="moje fotografie"> Další značky pro tvorbu HTML stránek lze nalézt například na: http://www.jakpsatweb.cz/html/ Doplňte váš HTML dokument o obrázky a rozšířené formátování textu a vystavte jej na studentském serveru. Úloha C. Tento úkol je zaměřen na základní práci a testování v počítačových sítích. Určete IP adresy přidělené serveru FEST. Pomocí utilit ping a traceroute otestujte síťové připojení k vybraným serverům přes protokoly IPv4 (UNIX i Windows) a IPv6 (UNIX). Pro UNIX/Linux lze využít příkaz ifconfig (výstup a příslušné adresy jsou patrné z výpisu na obr. 1.3). Dále vyzkoušejte utility pro zjištění odezvy a cesty k vybranému serveru v síti (obr. 1.4): ping ping6 název_cíle a traceroute traceroute6 [-n] název_cíle

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 7 Obr. 1.3. Ifcofig pro server FEST. Obr. 1.4. Výpis traceroute pro server s doménovým jménem www.google.com. Seznamte se s utilitou nslookup. Získejte IPv4 a IPv6 záznamy vybraných doménových jmen. Vyzkoušejte si nerekurivní dotaz na kořenový jmenný server. Spusťte nslookup a nastavte: set type=any poté zadejte doménové jméno serveru (viz obr. 1.5). Pomocí utility Telnet se připojte na vybrané HTTP servery a získejte metodou GET indexovou stránku. Použijte UNIXový telnet např.: telnet www.urel.feec.vutbr.cz 80 a volejte metodu GET: GET/HTTP/1.0

8 FEKT VUT v Brně Obr. 1.5. Prohledání sítě utilitou nslookup pro doménové jméno www.google.cz. Hodnocení: Úloha není hodnocena. Kontrolní otázky 1.1) Jaký je vztah mezi HostName a IP adresou? 1.2) Kolik zařízení (serverů) je možno adresovat IP adresou s protokoly IPv4 a IPv6 (UNIX)? 1.3) Jaký je rozdíl mezi párovou a nepárovou značkou v HTML skriptu? Literatura [1.1] HERBORTH, Ch. Unix a Linux. Názorný průvodce. Brno: Computer Press, 2006. [1.2] KUROSE, J. F., ROSS, K. W. Počítačové sítě. Brno: Computer Press, 2014. 2 Konzolová aplikace, tisková funkce printf() Cílem je seznámit se vývojovým prostředím Code::Blocks a společně sestavit první konzolovou aplikaci s výpisem výsledků na obrazovku při aplikaci tiskové funkce printf(). Úloha A. Spolu se cvičícím sestavte a odlaďte konzolovou aplikaci pro převod dekadického čísla na hexadecimální a naopak. Proveďte rovněž ladění aplikace v režimu debugging. Výsledné okno aplikace je jako příklad uvedeno na obrázku 2.1. Program bude pracovat v textovém režimu s jednoduchým menu, kdy uživatel nejprve zadá znakem h (H) nebo d (D) jaký typ převodu se bude provádět. Následně zadá vstupní převáděnou hodnotu a program vytiskne výsledek v kýžené číselné soustavě. Pro případ ukončení programu je součástí menu znak q (Q) pro ukončení aplikace.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 9 Obr. 2.1. Zobrazení výsledků příkladu v konzolovém okně. V první části programu je vždy nejprve nutné definovat hlavičkové soubory knihoven, které budeme v programu využívat pomocí direktivy #include. Tato direktiva zajistí vložení hlaviček funkcí z příslušné standardní knihovny, které je uvedena v <>. Například pro naši aplikaci budeme potřebovat funkce pro vstup hodnot a znaků z klávesnice, proto vkládáme hlavičkový soubor knihovny stdio (standardní funkce pro vstupy a výstupy), tedy soubor studio.h. Protože budeme používat i funkce pro matematické operace, které nejsou definovány v jazyce C žádnými operátory, např. pro výpočet mocnin při základu 16, vložíme také hlavičkový soubor pro standardní knihovnu matematických funkcí math.h. Pro snadnou práci s řetězci pak použijeme funkce z knihovny string: #include <stdio.h> #include <math.h> #include <string.h> Dále je třeba definovat hlavičky vlastních funkcí, možné to je i vložením vlastního vytvořeného hlavičkového souboru. My budeme používat dvě vlastní funkce, jednu pro převod desítkového na hexadecimální číslo: void dec2hex(unsigned int dec, char hex[]); a druhou pro převod zpětný:

10 FEKT VUT v Brně unsigned int hex2dec(char hex[]); Funkce má v závorce definovány vstupní parametry a může obsahovat jednu návratovou hodnotu, jejíž typ je uveden před názvem příslušné funkce. To je případ druhé funkce. V případě té první je nutné vrátit výsledek, tedy hexadecimální číslo, jako pole znaků, proto je požadované pole uvedeno jako vstupní parametr char hex[]. Pokud je vstupním parametrem jedno číslo nebo znak, jedná se o tzv. volání hodnotou, kdy se tato hodnota překopíruje do lokální proměnné funkce a po skončení funkce se tato lokální proměnná uvolní z paměti a její nesená hodnota se ztratí. V případě pole nebo ukazatele (ukazatele budeme probírat později) jako vstupního parametru funkce, jde o volání odkazem (referencí). Funkci se předává adresa pole (prvního prvku, ostatní prvky pole v paměti bezprostředně navazují), proto v těle funkce můžeme přímo ovlivňovat obsah tohoto pole a tím i vložit do tohoto pole výsledek funkce, který nemá jen jednu hodnotu, ale např. pole znaků u hexadecimálního čísla. Těla uvedených funkcí je pak třeba následně definovat. To už může být kdekoli v kódu, protože hlavičky funkcí jsou již známy a lze tyto funkce kdykoli volat. Dále je do kódu programu nutné vždy vložit funkci main(), která je volána se spuštěním programu. Právě v těle funkce main() bude umístěna sekvence příkazů, které se budou postupně vykonávat, včetně volání funkcí (standardních i vlastních). Z hlediska algoritmu bude ve funkci main() naprogramováno výše uvedené menu a na základě volby pak bude volána příslušná funkce pro převod čísla. V části kódu pro menu bude integrován cyklus typu do-while, kdy bude program vykonávat tělo tohoto cyklu (výpis informací pro menu a vstup znaku pro volbu) dokud uživatel nezvolí ukončení programu znakem q, resp. Q. Dále již budete postupovat při sestavování programu s vyučujícím, přesto si uveďme stručný popis standardních funkcí, které bude program používat: Fukce printf(char[]) z knihovny stdio slouží k výstupu na obrazovku (konzolu). Parametrem je řetězec (pole znaků), který má být zobrazen. Řetězec může obsahovat speciální zástupné znaky pro vytištění hodnot proměnných, příslušná proměnná je pak v pořadí dalším parametrem. Například tato konstrukce: int a=12345; printf("v kase je %d Kc\n", a); vypíše na obrazovku: V kase je 12345 Kč _ Zástupným znakem pro desítkové celé číslo v řetězci je %d, což v našem případě znamená, že se vytiskne hodnota uložená v proměnné a, která je uvedená jako druhý parametr. Speciální znak %f je určen pro desetinné desítkové číslo atd. Pochopitelně, že v řetězci může být několik zástupných znaků, pak musí být příslušné proměnné uvedeny jako další parametry v daném pořadí. Znak \n je opět speciální znak pro nový řádek, proto je kurzor posunut v našem příkladě na nový řádek. Funkce scanf(char[], adr) taktéž z knihovny studio slouží k načtení řetězce z klávesnice a uložení do proměnné na adrese adr. Opět je možno v řetězci definovat speciální zástupné znaky jako u funkce printf(). Navážeme-li na předchozí příklad konstrukcí: scanf("%d", &a);

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 11 pak to znamená, že do proměnné a se uloží desítkové celé číslo načtené z klávesnice. Znak & definuje, že se jedná o adresu následné proměnné. Z knihovny string budeme využívat funkci strrev(char[]). Tato funkce jednoduše otočí pořadí znaků v řetězci (poli znaků), tedy řetězec bude otočen (reverzován). Poslední funkcí, kterou budeme využívat je int pow(int, int) z knihovny math, která vrací celočíselný výsledek mocniny prvního celočíselného parametru na druhý celočíselný parametr. Vyzkoušejte si s vyučujícím i problematiku ladění chyb programu záměrným vnesením nějaké syntaktické chyby a rovněž proces ladění po krocích se sledováním stavu proměnných v integrovaném vývojovém prostředí Code::Blocks. Hodnocení: Úloha není hodnocena. Kontrolní otázky 2.1) Jaký je rozdíl mezi parametrem funkce volaným hodnotou a volaným odkazem? 2.2) Co znamená #include? 2.3) Kdy má funkce printf() více parametrů a co definují? Literatura [2.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [2.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. 3 Manipulace s polem, cyklus for Cílem je seznámit se s vytvářením jednoduchých konzolových aplikací a se základními typy proměnných. Jádrem je pak problematika práce s dvourozměrným polem, indexování a využití cyklu for. Úloha A. V úvodní části zdrojového kódu programu k příkladu bpc1e_c03.c je definována ve dvourozměrném poli temp tabulka průměrných měsíčních teplot odměřovaných denně ve 13.00 (a pak zprůměrňovaných za daný měsíc) z nejmenované meteorologické stanice v ČR: float temp[16][12] = {-1.1, -0.3, 7.6, 12.7, 19.2, 27.6, 29.3, 29.1, 23.2,20.1,12.0,5.1,0.8}; // temp. table Záznam teplot v tabulce definovaných byl prováděn od roku 1995, řádky v poli odpovídají jednotlivým rokům od roku 1995 a sloupce jednotlivým měsícům, hodnota počátečního roku je k dispozici v proměnné styear.

12 FEKT VUT v Brně V jednoduché tabulce vypište záznam teplot do konzolového okna. Doplňte program tak, aby v konzolovém okně vypsal průměrnou teplotu ve zvoleném měsíci a roce (zadáno při deklaraci proměnných mon a year). Pro tuto část je již připravena základní kostra programu s tiskem hlavičky zkratek měsíců a naznačeným cyklem for, pochopitelně pro tisk dvourozměrné tabulky teplot budete muset použít dva vnořené cykly for: printf("temperature table:\n\n"); // printing "Temperature table:" printf(" JAN FEB MAR APR MAY JUN NOV DEC\n"); // printing abrev. for months for(...) Hodnocení: 1 bod. Úloha B. Program doplňte o výpočet průměrné teploty v jednotlivých celých letech (leden až prosinec) do šestnáctiprvkového pole s vhodným názvem a průměrné teploty v daných měsících za všech šestnáct let měření do dvanáctiprvkového pole s vhodným názvem, průměrné hodnoty teplot vytiskněte v jednoduché tabulce v konzolovém okně se zobrazením jednoho desetinného místa. Zobrazení na jedno desetinné místo s využitím funkce printf() se provede následovně: printf("%4.1f", x); kde x je racionální číslo a %A.Bf je zástupný znak (symbol) pro tisk desetinného čísla se zarovnáním na A znaků doprava a B desetinných míst. Hodnocení: 1 bod. Úloha C. Pomocí podmínkové konstrukce s příkazem if (použití demonstruje cvičící) vytiskněte v konzolovém okně všechny tropické měsíce, tj. měsíce, kdy průměrná teplota ve 13.00 dosáhla nebo přesáhla 32 C. Stejně tak vytiskněte všechny arktické měsíce, kdy průměrná teplota dosáhla -6 C a méně. Příklad výstupů tohoto úkolu v konzolovém okně je uveden na obrázku 3.1. Hodnocení: 1 bod. Bonusová úloha Doplňte předcházející úlohu o algoritmus, který na obrazovku vypíše pouze roky s průměrnou teplotou větší nebo rovnu 14 C a dále pak roky s průměrnou teplotou nižší nebo rovnou hodnotě 12 C.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 13 Kontrolní otázky Obr. 3.1. Zobrazení výsledků příkladu v konzolovém okně. 3.1) Proč jsou v cyklu for pro oddělení inicializace, podmínky a aktualizace použity středníky? 3.2) Co bude vytisknuto na obrazovce v případě následujícího kódu: float x; x = 3.8975; printf("\nx je %5.2f km", x); 3.3) Jak by vypadala podmínka v úloze C, pokud se mají tisknout měsíce, kdy teplota přesáhla 20 C a současně byla menší než 25 C?

14 FEKT VUT v Brně Literatura [3.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [3.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. 4 Algoritmus Taylorovy řady, programování cyklů Cílem cvičení je procvičit si práci s výrazy a operátory a seznámit se s konverzemi v jazyce C a efektivním řešením složitějšího algoritmu. Úloha A. x Vytvořte program, který vypočte hodnotu exponenciální funkce y = e bez použití knihovních matematických funkcí s využitím rozvoje v Taylorovu řadu (viz Matematika I): 2 3 n n x x x x x x e = 1+ + + +... +... (4.1) 1! 2! 3! n! n! = n= 0 Vstupní parametr x vygenerujte jako číslo sestávající se z náhodně vygenerované celé části v rozsahu <0; 9> a desetinné části (dvě místa) získané náhodným vygenerováním celého čísla v rozsahu <0; 99>. V konzolovém okně vytiskněte pro kontrolu a srovnání i hodnotu exponenciální funkce vstupního parametru vypočítanou funkcí exp()z knihovny math.h. Dále sestavte algoritmus, který bude postupně přidávat do výpočtu exponentu členy Taylorovy řady a výsledek vždy s uvedením počtu započítaných členů zobrazí (viz obr. 4.1). Připočítání a tisk výsledku provádějte v cyklu for. Pro dosažení velmi přesného výsledku je potřeba pro daný rozsah vstupního parametru asi padesát členů Taylorovy řady. Výsledky exponenciální funkce zobrazujte s 22 platnými a 16 desetinnými čísly. Proměnné výpočtu exponenciální funkce deklarujte jako float, double, long double a pozorujte dosažitelnou přesnost výpočtu (u tisku long double funkcí printf() vložte těsně před specifikátor f velké písmeno L, tedy %22.16Lf. Úvodní část zdrojového kódu programu k příkladu je v bpc1e_c04a.c: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main( void) { double x; // input value double fval=1; // ouput value double xpow=1; // power of input value in numerator double fact=1; // factorial in denominator int integ, decim; // int. and dec. fractions of input value int n=0; // index for comp. of Taylor series in loop char c;

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 15 srand(time(null)); // seed init. for random generator // write a code here } scanf("%c", &c); // waiting for pressing key return 0; // program returns 0 Vstupní parametr x je definován proměnnou x, která se sestává z celé části integ, rozsah <0; 9>, a desetinné části decim, rozsah <0; 99>, vyjadřující setiny vstupního parametru. Mezivýsledek po započtení příslušného počtu členů je ukládán do proměnné fval. Dvě pomocné proměnné xpow a fact reprezentují čitatel a jmenovatel aktuálního členu. Tyto proměnné jsou zde záměrně zavedeny proto, aby mohl být snadno vypočítán další člen řady. Při pohledu na rovnici (4.1) je zřejmé, že čitatel xpow následujícího členu je roven čitateli předchozího členu násobeného proměnnou x, proto také zvolené jméno proměnné xpow. A u jmenovatele je to podobné, protože je zde aplikován faktoriál a ten je vždy pro následující člen dán pouhým vynásobením předchozího členu pořadím členu n (proměnná n). Využijte této nápovědy, kód algoritmu bude velmi jednoduchý a současně výkonný, např. jen proto, že už nemusíte pro člen s velkým n počítat celý faktoriál čísla n, který je časově velmi náročný. Podobně to platí i pro mocninu x v čitateli. Obr. 4.1. Příklad výstupů v konzolovém okně pro výpočet exponenciální funkce z příkladu A.

16 FEKT VUT v Brně Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu. Bonusová úloha Tímto příkladem si ukážeme, že C-čko nemusí být nuda ani v konzolové aplikaci, budete totiž tvořit vaši zřejmě první hru. Ve zdrojovém kódu programu k příkladu bpc1e_c4bon.c je prakticky vše připraveno, na vás je dopsat jediný řádek označený přemi tečkami. Cílem je naprogramovat klasickou hru, kdy se snažíte vrhem nebo střelou zasáhnout cíl. Jádrem je klasická úloha pohybové rovnice pro šikmý vrh a tu musíte naprogramovat. V programu jsou pro vás stěžejní proměnné ele (definuje elevační úhel hodu ve stupních) a vel (definuje počáteční rychlost v m/s). Vaším úkolem je ve smyčce for pro vstupní polohovou proměnnou x (vodorovná osa, resp. vzdálenost od počátku odkud je hod prováděn) sestavit rovnici, která vypočte hodnotu polohové souřadnice y (výšku střely či kamene) pro daný elevační úhel a počáteční rychlost. Polohové souřadnice jsou definovány v metrech. Bez hlubšího odvození (je velmi primitivní a určitě jste se s ním setkali ve fyzice) platí: 1 2 v 2 y = x tgα g x (4.2) 0 1 cos α V rovnici se kromě elevačního úhlu α a počáteční rychlosti v 0 ještě vyskytuje tíhové zrychlení g. Pro tíhové zrychlení a ještě také konstantu π je do programu zavedena direktiva #define, která umožní pro určitou číselnou konstantu definovat její zástupné jméno. Kdykoli překladač narazí na takto definované zástupné jméno, nahradí je příslušnou číselnou hodnotou. Sestavením rovnice (4.2) v programu máte hru připravenou (pozor na typy proměnných). Po spuštění programu se vygeneruje náhodná poloha cíle a parametry elevace a počáteční rychlosti. Měnit hodnotu elevace můžete stiskem klávesy q o jeden stupeň nahoru, stiskem klávesy a o jeden stupeň dolu, pro počáteční rychlost mají obdobnou funkci klávesy w a s. Změnu o více než jeden stupeň nebo m/s zajistíte násobným stiskem příslušné klávesy. Potvrzení je nutné klávesou ENTER. Hod nebo střelba je zahájena stiskem c + ENTER. Program nabízí i jistou grafickou podívanou a končí zásahem cíle (viz obr. 4.2). 2 Kontrolní otázky 4.1) Proč se výsledek v příkladu A po přidání 34. členu již nemění a je rozdílný od výpočtu standardní funkcí exp()? 4.2) K čemu složí direktiva #define? 4.3) Jaké další matematické funkce lze počítat pomocí Taylorovy řady? Literatura [4.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 17 [4.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. Obr. 4.2. Výstup z konzolové střílečky z bonusového příkladu. 5 Manipulace s řetězci v jazyku C Cílem je se seznámit se zpracováním řetězců v jazyce C a funkcemi standardní knihovny ANSI C pro manipulaci s řetězci string.h. Úloha A. V řetězcové proměnné text ve zdrojovém souboru bpc1e_c05a.c jsou uložena slova zvířat malými písmeny oddělená mezerou: int main(void) { char text[] = "cat dog hen duck swallow"; // to do return 0; // program returns 0 } Vytvořte program, který v konzolovém okně vypíše jednotlivě slova označující zvířata, každé na samostatném řádku s počátečním velkým písmenem. Program doplňte algoritmem, který spočte počet jednotlivých slov v proměnné text (pomocí počtu mezer, pozor za posledním slovem již mezera není). Dále program doplňte o algoritmus, který určí četnost jednopísmenných až desetipísmenných slov. Počty slov s daným počtem písmen vypište do

18 FEKT VUT v Brně konzolového okna a to jen v případě, že počet slov s daným počtem písmen bude nenulový (viz obr. 5.1.). Pro řešení programu nevyužívejte knihovních funkcí string.h. Pro výpis názvů zvířat na nový řádek a s velkým písmenem na začátku si stačí uvědomit, že jednotlivá slova odděluje mezera. Ve vhodném cyklu je tedy třeba kontrolovat každý znak vstupního řetězce a v případě mezery vložit na výstup nový řádek. S využitím pomocné celočíselné proměnné je výhodné počítat znaky jednotlivých názvů a v případě prvního znaku převést před tiskem na obrazovku první písmeno z malého na velké (stačí vědět, že ASCII kód stejného písmena anglické abecedy malého je o hodnotu 32 větší než stejného písmena velkého). Poslední úkol je trochu obtížnější, leč opět lze využít proměnné pro počítání znaků slova. Na konci slova, další znak je mezera, případně konec řetězce, tato proměnná obsahuje počet znaků daného slova. Pokud si deklarujeme pole celočíselných elementů, které v pořadí bude definovat počet slov s daným počtem znaků (odpovídá indexu pole), pak proměnná čítače znaků bude vlastně indexem pro element tohoto pole, který je nutné zvětšit o jedna, protože právě dočtené slovo má příslušný počet znaků. Nezapomeňte toto pole na začátku inicializovat (vynulovat všechny elementy pole vhodným cyklem). Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu. Obr. 5.1. Tisk výstupů v konzolovém okně pro příklad 1.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 19 Bonusová úloha V řetězcových proměnných stext1 a stext2 ve zdrojovém souboru bpc1e_c05bon.c je zašifrována textová zpráva. Tuto zprávu dešifrujte jednotlivými níže uvedenými kroky (algoritmy) a zobrazte v konzolovém okně. Postup dešifrování je následující (je vhodné výsledky jednotlivých kroků zobrazovat v konzolovém okně): a. Spojte oba řetězce v jeden, stext1 je první. b. Všechna písmena Q nahraďte písmenem C a písmena T písmenem B. c. Posuňte hodnotu všech znaků zprávy o jedna výše, dle ASCII tabulky např. A bude po operaci B, M bude N atd. d. Všechny řetězce CC ve zprávě nahraďte řetězcem RM. Pro tuto operaci využijte knihovní funkce strstr() a strncpy() (viz přednáška 3). e. Rotujte všechny znaky zprávy (v tuto chvíli jen velká písmena) opačně ve smyslu abecedy, např. A bude po operaci Z, B bude Y atd. f. Nahraďte všechna velká písmena malými vyjma prvního znaku. g. Všechna písmena w nahraďte znakem (mezera) a písmena h znakem. (tečka). Výsledky procesu dešifrování jsou uvedeny na obr. 5.2. Obr. 5.2. Výsledky procesu dešifrování z bonusového příkladu. Kontrolní otázky 5.1) Popište, jak pracuje funkce strncpy() a jaké má parametry? 5.2) Co se stane, pokud ani jeden znak v deklarovaném prostoru pro řetězec není NULL? 5.3) Kolik bytů je vyhrazeno v paměti pro řetězec s následující deklarací char a[] = "Brno je super mesto";?

20 FEKT VUT v Brně Literatura [5.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [5.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. 6 Statistické výpočty, aplikace cyklů Cílem cvičení je procvičit si práci s příkazy v jazyku C, především pak využití cyklů, a aplikovat je na běžné statistické výpočty. Úloha A. V této úloze si zkusíte naprogramovat některé typické algoritmy používané v programování a algoritmy pro základní statistické výpočty. Příklad vychází z dřívější úlohy (třetí cvičení), kde se zpracovávala tabulka teplot. V úvodní části zdrojového kódu k příkladu bpc1e_c06a.c je opět definována ve dvourozměrném poli temp tabulka průměrných měsíčních teplot naměřených ve 13:00 z nejmenované meteorologické stanice v ČR. Záznam teplot v tabulce definovaných byl prováděn od roku 1995, přičemž řádky v poli odpovídají jednotlivým rokům počínaje rokem 1995 a sloupce jednotlivým měsícům. V jednoduché tabulce vypište záznam teplot do konzolového okna (využijte řešení původní úlohy 3A): int main( void) { double temp[16][12]={-1.1, -0.3, 7.6 0.8}; int m, n, l; char mon[]="jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"; int styear=1995; double avmon[12], stdmon[12]; float avtemp[3][12]; int mintmon[12], maxtmon[12]; float mint, maxt; printf("temperature table:\n\n\t "); n=0; while (mon[n]!='\0') { if (mon[n]==',') printf(" "); else printf("%c", mon[n]); n++; } printf("\n"); // to do

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 21 } return 0; V předpřipraveném kódu je také k dispozici řetězec obsahující třípísmenné zkratky měsíců oddělené čárkami pro snadný výpis zkratek jednotlivých měsíců textově na obrazovku. Příklad je uveden v cyklu while. Doplňte program tak, aby v konzolovém okně byla vypsána také průměrná měsíční teplota (pro každý měsíc) v pětiletých obdobích počínaje rokem 1996 (tedy první průměr bude za roky 1996-2000) a to ve vhodně řešených cyklech s vnořením (ne tři samostatné smyčky pro každé období). Dále program doplňte o algoritmus nalezení nejchladnějšího a nejteplejšího měsíce v celém měřeném období a výsledky vytiskněte v konzolovém okně. V programech aplikujte alespoň jednou všechny typy smyček for, while i do-while. Příklad výstupů tohoto úkolu v konzolovém okně je uveden na obrázku 6.1. Obr. 6.1. Zobrazení výsledků příkladu A v konzolovém okně. Pro výpočet směrodatné odchylky souboru hodnot X je výhodné využít výpočtově jednodušší vztah:

22 FEKT VUT v Brně ( X ) E( X ) N σ ( X ) = E i x N i= 1 2 1 2 2 2 [ ] = x, (6.1) kde operátor E reprezentuje střední hodnotu nad příslušnou množinou. Při použití tohoto vztahu je potřeba v cyklu vypočítat střední hodnotu z druhých mocnin všech teplot (pro 16 roků příslušného měsíce) a od této hodnoty odečíst druhou mocninu vypočítané střední hodnoty pro příslušný měsíc. Výsledkem je statistický rozptyl. Směrodatná odchylka je pak druhou odmocninou rozptylu. Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu. Bonusová úloha Vytvořte program, který pomocí algoritmu známém jako Eratosthenovo síto, vypíše všechna prvočísla do určité hodnoty (např. 1000). Algoritmus pracuje tak, že se postupně odebírají z pole čísel (rozsah čísel, kde prvočísla hledáme) všechny násobky čísel 2, 3, 4 až polovina maxima rozsahu. Pro řešení v jazyce C je výhodné si vytvořit pole znaků dané s počtem prvků odpovídajícím rozsahu množiny čísel, mezi nimiž hledáme prvočísla. Pak naplníme všechny prvky tohoto pole nějakým znakem např. P, který definuje, že dané číslo odpovídající indexu v poli znaků je prvočíslo. Následně ve vhodném cyklu aplikujeme Eratosthenovo síto, tedy počítáme násobky, a znaky na příslušných indexech (násobcích) nahradíme znakem N (není to prvočíslo). Po provedení algoritmu zůstanou prvočísla na pozicích (indexech) s původním znakem P. Na závěr pak stačí jen vypsat příslušné indexy pole znaků se znakem P. Příklad pro rozsah do 1000 je uveden na obrázku 6.2. Pro přehlednost doporučuji tisk se zarovnáním na jistý počet znaků. Obr. 6.2. Zobrazení prvočísel z bonusové úlohy v konzolovém okně. Kontrolní otázky 6.1) Jak by vypadala deklarace 3D matice celých čísel? 6.2) Přepište následující cyklus tak, aby využíval konstrukci cyklu while:

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 23 int n; for(n = 1; n < 100; n+=2) printf("%d ", n); 6.3) Jaký je vztah mezi rozptylem a směrodatnou odchylkou? Literatura [6.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [6.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. 7 Funkce, sestavení knihovny funkcí, volání funkcí Cílem cvičení je vyzkoušet si vytváření vlastních funkcí včetně zapouzdření do vlastní knihovny. Knihovna vlastních funkcí je pak aplikována v projektu C. Úloha A. Příklad opět vychází z úloh s tabulkou teplot. V úvodní části zdrojového kódu programu k příkladu bpc1e_c07a.c je definována ve dvourozměrném poli temp tabulka průměrných měsíčních teplot naměřených ve 13.00 z nejmenované meteorologické stanice v ČR. Záznam teplot v tabulce definovaných byl prováděn od roku 1995, řádky v poli odpovídají jednotlivým rokům od roku 1995 a sloupce jednotlivým měsícům. V projektu je jako vzor sestavena tisková funkce, která umožňuje na nový řádek do konzolového okna vytisknout řádek se zkratkami měsíců (JAN,FEB atd.): void prn_mons(int tabs, int spaces) { char mon[]="jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"; int m, n; printf("\n"); for(n=0; n<tabs; n++) printf("\t"); for(n=0; mon[n]!='\0'; n++) { if (mon[n]==',') for(m=0; m<spaces; m++) printf(" "); else printf("%c", mon[n]); } printf("\n");

24 FEKT VUT v Brně } Tato funkce bude užitečná pro různá zobrazení statistických výsledků v konzolovém okně. Její užitečnost je zvýšena přidáním dvou parametrů volaných hodnotou: počtem tabelátoru pro odsazení vlastního textu od počátku řádku a počtem mezer mezi zkratkami měsíců. Funkce je již připravena, v těle je řetězec mon[] obsahující zkratky pro tisk měsíců, které jsou oddělené čárkou. Sestavte rovněž jednoduchou tiskovou funkci, která se bude určitě dále hodit a vytiskne jen jednu zkratku jednoho měsíce podle vstupního parametru (např. prn_mon(1) vytiskne JAN atd.). V jednoduché tabulce vypište záznam teplot do konzolového okna (opět využijte řešení dřívějších úloh) s aplikací vámi vytvořené funkce pro tisk řádku měsíců. Definujte vlastní typ t_temp jako matici 16x12 hodnot typu double tak, aby mohl být použit jako vstupní typ vstupního parametru funkce. K tomuto typu rovněž upravte deklaraci matice teplot temp. Sestavte dvě funkce mean_col a k ní duální mean_row, které vrací střední hodnotu vektoru vybraného sloupce (duálně řádku) z proměnné typu t_temp a od požadovaného řádku (duálně sloupce) do požadovaného řádku (duálně sloupce). Obr. 7.1. Příklad zobrazení výsledků příkladu A v konzolovém okně.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 25 Tzn., že tyto funkce budou mít čtyři vstupní parametry a mohou být použity pro výpočty středních hodnot např. v pětiletých obdobích (pro každý měsíc), tak jak bylo řešeno na předchozím cvičení, nebo např. pro výpočet průměrných teplot v kvartálech roku pro funkci mean_row. Hlavička funkce pro průměr ve sloupci může například vypadat následovně: double mean_col(t_temp t, int col, int i_row, int e_row) Pak volání funkce mean_col(temp, l, 5, 8) bude znamenat výpočet průměru teplot z tabulky temp a to pro první sloupec a pro teploty od 5. do 8. řádku v tomto prvním sloupci. Sestavené funkce využijte v hlavním programu (např. pětiletky i kvartály v jednotlivých letech). Sestavené funkce ověřte v hlavním programu. Posledním bodem tohoto úkolu je zapouzdření všech funkcí do vlastní knihovny. Příklad výstupů z aplikací je uveden na obrázku 7.1. Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu. Bonusová úloha Cílem tohoto příkladu je sestavení knihovny funkcí pro základní operace nad komplexními čísly. Sestavte čtyři funkce: pro součet, pro rozdíl, pro násobení a pro dělení dvou komplexních čísel typu double. Vzhledem k tomu, že výsledkem bude opět komplexní číslo o dvou složkách (reálná část a imaginární část) a u funkcí může být pouze jedna návratová hodnota, je nutno použít volání parametrů odkazem pro výstup výsledku z funkce. Příklad hlavičky funkce pro součet dvou komplexních čísel může vypadat následovně: void cadd(double *r_re, double *r_im, double x_re, double x_im, double y_re, double y_im) Vstupními parametry jsou x_re, x_im pro složky prvního komplexního čísla a y_re, y_im pro složky druhého komplexního čísla. Tyto parametry jsou volány hodnotou. Výstupem jsou pak ukazatele r_re a r_im na paměťová místa typu double, do kterých se ukládá výsledek operace (opět reálná a imaginární část). Sestavte všechny čtyři funkce pro operace nad komplexními čísly a zapouzdřete je do vlastní knihovny s vhodným názvem, např. complexmath.h. V další fázi sestavte jednoduchou konzolovou aplikaci, ve které se načtou jednotlivé hodnoty složek komplexních čísel. Následně se načte operand jako znak + pro součet, - pro rozdíl, * pro násobení a / pro dělení a pomocí přepínače switch-case se zavolá příslušná funkce z vaší knihovny pro komplexní operace, kterou přilinkujte k aplikaci. Výsledek vhodně vytiskněte do konzolového okna. Po výpočtu a tisku výsledku načtěte znak z klávesnice, který umožní ukončení aplikace, např. je-li tento znak y jako yes, nebo

FEKT VUT v Brně 26 pokračování v dalším načtení vstupních komplexních čísel a provedení vybrané operace nad nimi. Příklad výstupů výsledků na konzolu je uveden na obrázku 7.2. Obr. 7.2. Zobrazení výsledků bolusového příkladu v konzolovém okně. Kontrolní otázky 7.1) Jaký je rozdíl při přidávání knihoven do projektu direktivou #include v případě jména souboru ve špičatých závorkách <filename> a v případě jména souboru v uvozovkách "filename"? 7.2) Proč je nutné u funkcí pro výpočty s komplexními čísly nutné použít předávání výsledku odkazem? 7.3) Co nastane, pokud je jako vstupní parametr funkce typ int a přesto se bude této funkci předávat parametr typu float?

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 27 Literatura [7.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [7.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. 8 Struktury a dynamické proměnné Cílem cvičení je sestavit aplikaci, která bude používat vhodnou strukturu popisující daný objekt požadovanými parametry. Navazujícím cílem je deklarovat tuto strukturu jako dynamickou proměnnou a procvičit si práci s dynamickými proměnnými v jazyku C. Úloha A. Cílem tohoto příkladu je sestavit projekt pro jednoduchou správu autobazaru. Projekt k příkladu A se skládá ze zdrojového souboru bpc1e_c08a.c, kde se nachází funkce main(): #include <stdio.h> #include <bazar.h> int main(void) { T_car *bazar[200]; // ptrs. to cars int cnt=0; // number of recorded cars int lprice, hprice; char cmd; cnt = ini_bazar(bazar, cnt); printf("\n\ninsert command: 'q' = quit "); scanf("%c", &cmd); fflush(stdin); while (cmd!= 'q') // if not quit { switch (cmd) { case 'p': print_bazar(bazar, cnt); break; //case 'a': call function for adding a new car case 's': { printf("\nselect low limit of price:"); scanf("%d", &lprice); fflush(stdin); printf("\nselect high limit of price:"); scanf("%d", &hprice); fflush(stdin); } } printf("\n\ninsert command: 'q' = quit, "); scanf("%c", &cmd); fflush(stdin); }; // call function for deleting of all recods

28 FEKT VUT v Brně } return 0; a knihovny pro funkce spojené se správou autobazaru s hlavičkovým souborem bazar.h: typedef struct car // car record { char type[20]; // type of car char color[10]; // color of car char mot; // kind of the motor B = benzin, D = diesel int vol; // motor volume in cubic cm int year; // year of production int price; // price } T_car; int ini_bazar(t_car **rec, int num); // bazar initialization void print_record(t_car *prcar); // printing car paramaters void print_bazar(t_car **rec, int num); // printing all cars // insert function header for deleting of all records (cars) // insert function header for printing of bazar content with - // defined range of price // insert function header for adding of new car a zdrojovým souborem bazar.c: #include <bazar.h> int ini_bazar(t_car **rec, int num) { T_car *new_car; } new_car = (T_car*)malloc(sizeof(T_car)); strcpy(new_car->type, "Skoda_Felicia"); strcpy(new_car->color, "Blue"); new_car->mot = 'D'; new_car->vol = 1400; new_car->year = 2003; new_car->price = 75000; rec[num++] = new_car; // and other cars return num; void print_record(t_car *prcar) { printf("\n%s\t %s", prcar->type, prcar->color); if(prcar->mot=='d') printf("\t diesel"); else if(prcar->mot=='b') printf("\t beznin");

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 29 } printf("\t %4d ccm\t year %d\t price %6d CZK", prcar->vol, prcar->year, prcar->price); void print_bazar(t_car **rec, int num) { int n; } for(n=0; n<num; n++) print_record(rec[n]); // insert function for deleting of all cars // insert function for printing of all cars from given price // range // insert function for adding a new car Vložte předpřipravené kódy do vašeho projektu. V hlavičkovém souboru je uvedena kompletní definice vlastního typu struktury T_car, položky jsou popsány v poznámkách. Ve vlastní knihovně bazar máte rovněž připraveny kompletní a plně funkční funkce pro inicializaci databáze autobazaru ini_bazar( ), která naplní pole záznamů několika vozy tak, abyste nemuseli při každém spuštění plnit databázi ručně. Dále pak obsahuje funkci pro tisk položek jednoho záznamu do jednoho řádku print_record( ), vstupním parametrem je ukazatel na záznam, který má být tisknut. Poslední připravenou funkcí je print_bazar( ) pro tisk všech záznamů (aut) v autobazaru. Ve funkci main() je inicializováno pole ukazatelů na záznam *bazar[200], tedy na 200 záznamů. Do tohoto pole se vkládají ukazatele (adresy) na jednotlivé záznamy, způsob je zřejmý z funkce ini_bazar( ). Důležitá je rovněž proměnná cnt, ve které je uložen počet naplněných záznamů. Všimněte si, že například ve funkci print_bazar( ) je parametrem ukazatel na ukazatel, protože potřebuji znát ukazatel na pole, musím to provést tímto způsobem. Vašim úkolem je doplnit program o funkce pro přidání nového záznamu auta, výpis aut v bazaru pro zadaný rozsah cen a funkci, která před ukončením programu vymaže všechny dynamický vytvořené záznamy. Ve funkci main() je již vytvořeno jednoduché ovládací prostředí pomocí zadávání příkazů z klávesnice. Ukázka činnosti programu je na obrázku 8.1. Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu.

30 FEKT VUT v Brně Obr. 8.1. Příklad zobrazení výsledků příkladu A) v konzolovém okně. Bonusová úloha Vytvořte program, který v konzolovém okně umožní hodnocení dvoukolového mezinárodního závodu ve skocích na lyžích. Vytvořte vlastní datový typ struktury (nebo využijte přiložený zdrojový kód), který bude obsahovat jméno závodníka, třímístný kód země, celkové dosažené body a aktuální pořadí a dvě vnitřní struktury s hodnocením jednotlivých skoků v prvním a druhém kole (délka skoku + bodové hodnocení 5 rozhodčích). Bodování je zřejmé z následujících pravidel: Hodnocení se vytváří na základě součtu dvou údajů: bodů za délku skoku a za stylové provedení: a) body za délku skoku: každý závodník obdrží automaticky 60 bodů (výjimkou jsou mamutí můstky - K170 a více, u nichž se uděluje 120 bodů). V závislosti na dosažení tzv.

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 31 konstrukčního bodu můstku (např. 120 metrů u můstků K120) získává (nebo ztrácí) další body. Za každý metr navíc/méně získá/ztrácí určité množství bodů závislé na typu můstku: K60 - K69: K70 - K79: K80 - K99: K100 - K169: K170 a více: 2,4 bodu za metr 2,2 bodu za metr 2,0 bodu za metr 1,8 bodu za metr 1,2 bodu za metr (velikost můstku je proměnná zadaná na začátku po spuštění programu) b) body za stylové hodnocení: Každý z pěti porotců udělí skokanovi známku do 20 bodů s rozlišením po 0,5 bodech. Nejvyšší a nejnižší hodnota ze všech pěti známek se škrtá. Platné jsou tedy pouze tři známky a maximální zisk je 60 bodů. Stylové chyby skokana musí porotce promítnout do svého hodnocení. Jednotlivé záznamy budou generovány jako dynamické proměnné, na které bude nastaven ukazatel v poli ukazatelů na jednotlivé záznamy s počtem maximálně 30. Počet záznamů udržujte ve vhodné globální proměnné. Sestavte funkce pro vložení závodníka a dále funkce pro hodnocení skoku a výpis výsledků. Pro jednoduchost v prvním i druhém kole startují závodníci podle pořadí, ve kterém byly jejich záznamy dynamicky přidány. Po každém skoku bude vypsáno aktuální pořadí a na žádost i tabulka výsledků (pořadí od nejlepšího k nejhoršímu). Na závěr každého kola bude tabulka výsledků vypsána automaticky. V maximální míře využívejte funkce. Příklad výpisů konzolového okna je uveden na obrázku 8.2. Kritickou částí je generování aktuálního pořadí. Doporučuji vytvořit funkci, kterou zavoláte po každém skoku a v níž se vyhodnotí pořadí podle bodů. Tak stačí porovnat jen aktuální záznam s předešlými výsledky a vhodným způsobem jej zařadit. Příklad řešení struktury je v přiloženém zdrojovém kódu bpc1e_c08bon.c: typedef struct jump // structure for jump and evaluation { float length; // length of jump in meters float points[5]; // evaluation by refs } t_jump; typedef struct competitor // structure for competitor { char name[20]; // name char country[4]; // three-letter code of country floa points; // sum of points int order; // order t_jump round_1; // jump and eval. in the 1st round t_jump round_2; // jump and eval. in the 2nd round } t_competitor; t_competitor *comp[30]; // global array of pointers // to competitor records int cnt=0; // global number of records

FEKT VUT v Brně 32 Obr. 8.2. Příklad výstupů v konzolovém okně pro bonusový úkol včetně finálního vyhodnocení. Kontrolní otázky 8.1) Jak velký prostor bude v paměti vyhrazený v případě deklarace proměnné typu T_car z příkladu A? 8.2) Co deklaruje následující konstrukce: int **x? 8.3) Jak se projeví při tisku znak \t v řetězci funkce printf()?

Programování a počítače 1. Počítačová cvicení pro obor B-EST. 33 Literatura [8.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [8.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. [8.3] HEROUT, P. Učebnice jazyka C. 2. díl. České Budějovice: KOOP nakladatelství, 2008. 9 Programy pro manipulaci se soubory Cílem cvičení je seznámit se s manipulací se soubory, programováním načítání a ukládání dat do souboru a navázáním na dynamickou databázi. Úloha A. Cílem tohoto příkladu je doplnit projekt pro jednoduchou správu autobazaru z projektu bpc1e_c08a. V předpřipraveném projektu bpc1e_c09a jsou hotové a plně funkční úkoly z projektu předchozího. V hlavním adresáři projektu je umístěn soubor bazar.txt, který obsahuje záznamy jednotlivých aut, každá položka na novém řádku: 14 Skoda Felicia Blue D 1400 2003 75000 Skoda Felicia Red D 1400 2001 55000 Alfa Romeo 156 Black Číselný údaj na prvním řádku odpovídá počtu záznamů v souboru. Sestavte funkci, kterou nahradíte inicializaci databáze z předchozího projektu a která načte záznamy aut ze souboru bazar.txt a uloží je do dynamicky vytvářených záznamů. Pro načítání řetězců ze souboru, které se mohou skládat z několika slov, použijte funkci fgets(). Pozor tato funkce uloží do cílového řetězce i poslední znak \n (nový řádek), ten je třeba nahradit znakem \0, například sestavením jednoduché korekční funkce. Druhým úkolem je sestavit funkci, která při ukončení programu uloží všechny záznamy automobilů (i nově přidaných) do souboru bazar.txt. Algoritmus ukládání můžete vložit do funkce pro uvolňování záznamů z paměti. Výstup je pochopitelně shodný s obrázkem 8.1. Pro specifikaci souboru je nutné použít ukazatel na speciální typ FILE, který je předdefinován v knihovně stdio.h. Soubor

34 FEKT VUT v Brně je nejprve otevřít pomocí funkce fopen() a získat právě tento ukazatel na soubor, parametrem je jméno, případně i celá cesta, souboru a atribut, pro čtení je to řetězec "r", pro zápis do nového souboru pak řetězec "w". Další možné atributy byly diskutovány na přednáškách. Pro čtení specifických dat ze souboru je možné použít funkci fscanf(), která je obdobou funkce scanf(), jen místo čtení ze vstupu (klávesnice) je třeba specifikovat soubor ukazatelem typu FILE. Na závěr práce se souborem je třeba soubor korektně uzavřít funkcí fclose(). Níže je uveden příklad otevření souboru file.txt a přečtení jednoho celého čísla z tohoto souboru a uložení do proměnné x: FILE *ptrf; int x; ptrf = fopen("file.txt","r"); if(ptrf!= NULL) fscanf(ptrf, "%d", &x); fclose(ptrf); Hodnocení: 1,5 bodu. Úloha B. Zadáno cvičícím na začátku cvičení. Hodnocení: 1,5 bodu. Bonusová úloha K bonusovému projektu z předchozího cvičení doplňte funkci, která výsledky dvoukolového závodu ve skoku na lyžích uloží do textového souboru, příklad je uveden v souboru Results.txt. Kontrolní otázky 9.1) Co se stane v případě, že již existuje soubor se stejným názvem a použijeme pro otevření souboru funkci fopen() s atributem "w"? 9.2) Proč je v ukázkovém příkladu použit ve funkci fscanf() u x použit symbol & a co znamená? 9.3) Proč je atribut ve funkci fopen() definován jako řetězec? Literatura [9.1] KERNIGHAN, B. W., RITCHIE, D. M. Programovací jazyk C. Brno: Computer Press, 2004. [9.2] HEROUT, P. Učebnice jazyka C. 1. díl. České Budějovice: KOOP nakladatelství, 2009. [9.3] HEROUT, P. Učebnice jazyka C. 2. díl. České Budějovice: KOOP nakladatelství, 2008.