Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

public:pb071:cviceni03 [2017/03/06 16:24]
Jirka Slaby [Úkol 4. Nekonečné cykly]
public:pb071:cviceni03 [2018/02/24 19:10]
Řádek 1: Řádek 1:
-====== Cvičení 3. Kreslení obrazců (pokračování) ====== 
- 
- 
-V minulém cvičení jsme si napsali funkce, které nám dokáží vykreslit různé geometrické obrazce na standardní výstup do terminálu. 
- 
-Nyní našemu programu přidáme běhové rozhraní, které umožní zpřístupnit jednotlivé funkce pro kreslení uživateli a přidáme vykreslení nového tvaru, elipsy. 
- 
-V tomto cvičení již nebudeme používat funkce definované v knihovně ''​%%pb071_io%%'',​ ale použijeme funkce standardní knihovny ''​%%scanf%%''​ a ''​%%printf%%''​. 
- 
-<note tip> 
-Stáhněte si připravenou kostru projektu pro toto cvičení {{ :​public:​pb071:​cviceni:​cviceni03.zip |}} 
- 
-Pokud si chcete své kódy ze cvičení verzovat pomocí nástroje git, můžete využít postup popsaný v tomto [[https://​gitlab.fi.muni.cz/​pb071/​pb071-seminars|repozitáři]] 
-</​note>​ 
-<note important>​ Pokud jste nestihli některou z částí minulého úkolu implementovat,​ přeneste si nezbytné funkce z referenční implementace minulého cvičení. ​ 
-https://​gitlab.fi.muni.cz/​pb071/​pb071-seminars/​blob/​impl/​cviceni02/​drawer.c 
-</​note>​ 
- 
- 
-===== Úkol 1. čtverec je obdélník ===== 
- 
-Rozšiřte funkce ''​%%drawSquare%%''​ a ''​%%drawLine%%''​ o argument ''​%%char fill%%'',​ který bude definovat jakým znakem mají být čtverec nebo čára vykresleny. Pro samotné vykreslení čtverce použijte již napsanou funkci ''​%%drawRectangle%%''​ 
- 
-Upravte jednotlivé funkce ''​%%drawSquare%%'',​ ''​%%drawRectangle%%'',​ ''​%%drawLine%%''​ a ''​%%drawCircle%%'',​ tak aby po přijetí neplatného vstupu, vypsaly uživateli zprávu ve formátu 
- 
-<​code>​ 
-Neplatny vstup: ${HODNOTA} 
-</​code>​ 
-kde ''​%%${HODNOTA}%%''​ bude nahrazena právě zadaným nevalidním vstupem. 
- 
-Jako poslední část tohoto úkolu přidejte kontrolu validity vstupu ''​%%char fill%%'',​ v případě kruhu i ''​%%char space%%'',​ tak, aby kreslení probíhalo tisknutelnými znaky. Tisknutelné znaky počítáme od hodnoty ''​%%0x21%%''​ do ''​%%0x7e%%''​ včetně. V případě, že byl předán netisknutelný znak, program stejně jako v předchozím případě upozorní uživatele na neplatnost vstupu. 
- 
-<note tip>Mezi tisknutelné znaky se obvykle řadí i znak mezery ''​%%0x20%%'',​ my jej ovšem v rámci této úlohy jako tisknutelný počítat nebudeme.</​note>​ 
- 
-===== Úkol 2. Výběr obrazce ===== 
- 
-Nyní vyrobíme běhové prostředí,​ které bude interagovat s uživatelem. Program nejdříve vypíše 
- 
-<​code>​ 
-Vyberte obrazec, ktery bude vykreslen: ​ 
-</​code>​ 
-Kde za znakem dvojtečka ''​%%:​%%''​ se bude nacházet pouze mezera, nikoliv zalomení řádku. 
- 
-Poté váš program načte jeden znak, přičemž bude ignorovat případné bílé znaky na vstupu, s pomocí funkce ''​%%scanf%%'',​ na jeho základě se rozhodne který obrazec bude kreslen. Vstupy nechť jsou 
- 
-  * ''​%%l%%''​ - bude vykreslena čára 
-  * ''​%%s%%''​ - bude vykreslen čtverec 
-  * ''​%%r%%''​ - bude vykreslen obdélník 
-  * ''​%%c%%''​ - bude vykreslen kruh 
-  * ''​%%h%%''​ - vypíše na standardní výstup nápovědu ve formátu 
- 
-<​code>​ 
-Existujici obrazce: 
-l - cara 
-s - ctverec 
-r - obdelnik 
-c - kruh 
-h - vypise tuto napovedu 
-</​code>​ 
-Pokud nebude vstup odpovídat těmto možnostem, vypíše program uživateli chybovou hlášku. Na závěr vypište na standardní výstup, který z obrazců bude vykreslen, ve formátu 
- 
-<​code>​ 
-Kreslenym obrazcem bude $OBRAZEC 
-</​code>​ 
-<note important>​ 
- V tomto případě použití funkce ''​%%scanf%%''​ je důležité správně použít mezeru před zvolenou formátovací značkou. 
-</​note>​ 
- 
-===== Úkol 3. Šířka, výška a switch ===== 
- 
-Nyní načteme nezbytná data pro vykreslení obrazce. Vytvořte si proměnné ''​%%length%%'',​ ''​%%width%%'',​ ''​%%fill%%''​ a ''​%%space%%'',​ které naplníte jednotlivými hodnotami pouze v případě, že jsou nezbytné pro vykreslení obrazce. Tedy: 
- 
-  * na šířku se ptáte vždy 
-  * na znak pro vyplnění taktéž 
-  * na výšku pouze v případě obdelníku 
-  * na mezeru pouze v případě kruhu 
-  * Před každým načítáním se uživatele zeptáte ''​%%Zadejte $VLASTNOST%%''​ kde ''​%%$VLASTNOST%%''​ nahradíte za načítanou hodnotu. 
-  * V případě, kdy se číslo nepodaří načíst, upozorněte uživatele na neplatný vstup a program ukončete 
- 
-Stejně jako v minulém příkladě,​ při načítání ignorujte případné bílé znaky na vstupu. 
- 
-Jako poslední část tohoto úkolu zavolejte pomocí ''​%%switch%%''​ funkci, která provede vykreslení. 
- 
-Program by se v této fázi měl chovat takto: 
- 
-<​code>​ 
-$ ./drawer 
-Zadejte obrazec: c 
-Kreslenym obrazcem bude kruh 
-Zadejte sirku: 25 
-Zadejte vypln: # 
-Zadejte mezeru: - 
------------------------------------------------------------------------------------------------------- 
---------------------------------------##########################​-------------------------------------- 
---------------------------------######################################​-------------------------------- 
-----------------------------##############################################​---------------------------- 
-------------------------######################################################​------------------------ 
-----------------------##########################################################​---------------------- 
-------------------##################################################################​------------------ 
-----------------######################################################################​---------------- 
---------------##########################################################################​-------------- 
-------------##############################################################################​------------ 
-------------##############################################################################​------------ 
-----------##################################################################################​---------- 
---------######################################################################################​-------- 
---------######################################################################################​-------- 
-------##########################################################################################​------ 
-------##########################################################################################​------ 
-----##############################################################################################​---- 
-----##############################################################################################​---- 
-----##############################################################################################​---- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
---##################################################################################################​-- 
-----##############################################################################################​---- 
-----##############################################################################################​---- 
-----##############################################################################################​---- 
-------##########################################################################################​------ 
-------##########################################################################################​------ 
---------######################################################################################​-------- 
---------######################################################################################​-------- 
-----------##################################################################################​---------- 
-------------##############################################################################​------------ 
-------------##############################################################################​------------ 
---------------##########################################################################​-------------- 
-----------------######################################################################​---------------- 
-------------------##################################################################​------------------ 
-----------------------##########################################################​---------------------- 
-------------------------######################################################​------------------------ 
-----------------------------##############################################​---------------------------- 
---------------------------------######################################​-------------------------------- 
---------------------------------------##########################​-------------------------------------- 
------------------------------------------------------------------------------------------------------- 
-</​code>​ 
-===== Úkol 4. Nekonečné cykly ===== 
- 
-Nyní naše běhové rozhraní necháme běžet donekonečna:​ 
- 
-  * přidejte mezi validní vstupy při výběru obrazce znak ''​%%q%%'',​ který způsobí ukončení programu 
-  * přidejte znak ''​%%q%%''​ do nápovědy s následujícím řetězcem ''​%%q - ukonci tento program%%''​ 
-  * upravte funkci main tak, aby veškeré kroky nezbytné pro vykreslení obrazce prováděla,​ dokud není načten znak ''​%%q%%''​ 
-  * zároveň program ukončete v případě, kdy selže funkce ''​%%scanf%%'',​ kvůli uzavření vstupu 
-  * pokud funkce ''​%%scanf%%''​ selže, kvůli nevalidnímu vstupu, vypište chybovou hlášku, zahoďte řádek v bufferu a pokračujte dál, dotazem na další obrazec. 
-  * Pro zahození řádku, můžete využít funkci ''​%%readEndOfLine%%''​ z ''​%%pb071_io.h%%''​ 
- 
-<note info> Funkce ''​%%scanf%%''​ vrací jako svoji návratovou hodnotu, počet úspěšných konverzí a pokud je vstup uzavřen vrátí hodnotu definovanou makrem ''​%%EOF%%'',​ které značí uzavření vstupu. 
-</​note>​ 
- 
-Po této části by váš program měl vypisovat 
- 
-<code bash> 
-$ ./drawer 
-Zadejte obrazec: l 
-Kreslenym obrazcem bude cara 
-Zadejte sirku: 10 
-Zadejte vypln: # 
-########## 
-Zadejte obrazec: s 
-Kreslenym obrazcem bude ctverec 
-Zadejte sirku: 5 
-Zadejte vypln: - 
----------- 
----------- 
----------- 
----------- 
----------- 
-Zadejte obrazec: q 
-Program se nyni ukonci 
-</​code>​ 
-===== Úkol 5. Elipsa ===== 
- 
-Jako poslední úkol vytvořte funkci 
- 
-<code c> 
-void drawEllipse(int aAxis, int bAxis, char fill, char space); 
-</​code>​ 
-Která vykreslí na standardní výstup elipsu, kde 
- 
-  * ''​%%aAxis%%''​ určuje šířku poloosy na ose x 
-  * ''​%%bAxis%%''​ určuje šířku poloosy na ose y 
-  * ''​%%fill%%''​ je znak, kterým bude elipsa vyplněna 
-  * ''​%%space%%''​ je znak použitý pro prázné místo 
-  * Stejně jako v případě kruhu, nelze vykreslit elipsu se zápornými poloosami a netisknutelnými znaky 
-  * Pokud je vstup nevalidní, funkce vypíše chybovou hlášku a ukončí se 
-  * Podobně jako u kruhu, připomeneme si obecnou rovnici elipsy ''​%%((x-x_0)/​a)^2 + ((y-y_0)/​b)^2 = 1%%'',​ kde 
-  * ''​%%x%%'',​ ''​%%y%%''​ jsou souřadnice bodu na elipse 
-  * ''​%%x_0%%'',​ ''​%%y_0%%''​ jsou souřadnice středu elipsy 
-  * ''​%%a%%''​ je délka poloosy na ose x 
-  * ''​%%b%%''​ je délka poloosy na ose y 
- 
-Po implementaci funkce ''​%%drawEllipse%%''​ rozšiřte běhové rozhraní o načtení znaku ''​%%e%%'',​ který značí kreslení elipsy a rozšiřte nápovědu. 
- 
-===== Vzorové řešení ===== 
- 
-Objeví se ke konci týdne. 
- 
-Úlohu připravil Miroslav Jaroš --  xjaros1 (at) fi.muni.cz 
- 
  
QR Code
QR Code public:pb071:cviceni03 (generated for current page)