Home page

PC2A home page

Výuka home page




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