Společný dělitel (2016)
Vytvořte program mainsd.exe, který najde společné dělitele dvou zadaných celých čísel.
0) Načtěte z klávesnice
pomocí funkce scanf dvě celá čísla oddělená čárkou.
V případě
chybného vstupu (nenačtení dvou parametrů – viz. návratová
hodnota funkce scanf) vytiskne program text „chybne zadani“
a vrátí hodnotu 2. Toto hlášení tiskněte na standardní chybový
výstup.
Výstupní text je možné tisknout na standardní výstup
(proměnná stdout – nastaveno na konzolu) nebo na chybový výstup
(proměnná stderr – nastaveno na konzolu). Na standardní výstup
tiskne funkce printf, která používá stdout implicitně, takže ho není
nutné uvádět. Pro tisk na chybový výstup se používá tisk pomocí
fprintf(stderr, “ “, proměnné). Obdobně je možné tisknout
na standardní výstup fprintf(stdout, “ “, proměnné).
Význam tohoto dělení je v tom, že prostředí mimo program dokáže
tyto výstupy oddělit a zpracovávat odděleně. Je tedy možné
zpracovávat zvláště chybová hlášení a data.
1) Napište funkci, která
najde největšího společného dělitele ze dvou celých čísel (vhodné pro
krácení zlomků) (8;4) -> 4, (8;6) -> 2.
Pro první realizaci
použijte funkci uplatňující „hrubou sílu“ (procházející
postupně hodnoty a hledající společného dělitele (např. pomocí modulo
– zbytek po celočíselném dělení)). Funkce fsdM – má dva
parametry a společný dělitel vrací jako návratovou hodnotu.
Pro druhou verzi využijte Eukleidův algoritmus/Euclidean algorithm (wiki). Funkce fsdE – má dva parametry a společný dělitel vrací jako návratovou hodnotu.
Oba výsledky vytiskněte od začátku řádku. Jednu hodnotu na řádek.
2) Napište funkci, která
vytiskne všechny společné dělitele dvou celých čísel (od největšího,
jedničku tisknout bude) (8;4) -> 4; 2; 1 , (48;24) -> 24; 12;
8; 6; 4; 3; 2; 1. Funkce fsd – má dva parametry. Nalezené
hodnoty vytiskne na konzolu (z funkce je nevrací). Funkce vrací počet
společných dělitelů (včetně jedničky, vrácená nula opět značí chybu).
Formát tisku budou celá čísla oddělená středníkem a mezerou (viz
příklad výše), bez odřádkování. Po tisku odřádkuje.
Počet
společných dělitelů vytiskne volající funkce na samostatný
řádek.
Pozn.: u funkcí (u kterých se předpokládá, že se budou
obecně používat) není vhodné používat operace vstupu a výstupu, pokud
nejsou na vstup či výstup přímo určeny. Přítomnost operací vstupu či
výstupu znemožní použití funkce v režimu „bez obsluhy“ a
proto je vhodné operace vstupu a výstupu umístit mimo vlastní činnost
funkce. (V našem případě by bylo vhodnější vrátit společné dělitele v
poli, které by se ovšem díky proměnnému počtu prvků muselo dynamicky
vytvářet).
3) V případě chybného parametru (z jakéhokoli důvodu nelze vypočítat společný dělitel), vrátí funkce hodnotu nula (hodnota nula většinou (standardně) znamená „v pořádku“. Zde ovšem spojujeme vrácení hodnoty chyby a hodnoty do jednoho parametru, a proto musíme volit hodnotu, která nemůže být výsledkem) a program vytiskne text „chybne zadani“ a odřádkuje. Program postupně zavolá všechny funkce. Program vrací kód 1 v případě, že některá z funkcí vrátila chybový kód (tj nulu).
Hlavní program dejte do souboru mainsd.c, funkce naprogramujte do souboru sd.c (+ k něma sd.h). Pro testování použijte minimálně volání z příkladů uvedených v bodu 1 a 2.
Každý soubor začne
komentářem, ve kterém bude jméno autora, datum a odkaz na zadání:
/*
Autor: Autor Autor
datum: 1.1.2015
www.... */
Hlavičkové soubory budou
ošetřeny proti vícenásobnému načtení.
Zkuste nejprve nakreslit vývojový diagram, zvolit vhodné datové typy a posléze teprve naprogramovat.
Soubory pro testování správnosti naprogramování – rozbalte v adresáři Debug, ve kterém se nachází přeložený exe soubor. Spusťte pomocí konzolového příkazu testsuite_nsd.cmd. Následně si všímejte (chybových) výpisů.
Poslední změna 2015-02-12