Home page

PC2A home page

Výuka home page




Společný dělitel (2018)

Napište funkci, která najde největšího společného dělitele dvou celých čísel. Vytvořte funkci fsdM s postupným hledáním (pomocí souvislé řady následujících čísel) a funkci fsdE s hledáním pomcí Euklidova algoritmu.
Napište funkci fsd , která najde všechny společné dělitele dvou čísel.
Vytvořte program mainsd.exe, který pro dvě čísla zadaná z klávesnice vypočte největšího společného dělitele pomocí funkce fsdM a fsdE. Následně najde pomocí funkce fsd všechny společné dělitele. Výsledky vytiskněte.

Obecné připomínky pro řešení úkolů:
0) Přečíst a promyslet zadání. Vývojový diagram.
1) založit projekt
2) vytvořit *.c soubor pro main. Vytvořit *.c a *.h soubor pro každý celek (funkci) pro který je to rozumné
3) Ošetřit hlavičkový soubor proti vícenásobnému načtení.
4) int main a return
5) Programovat po „malých“ částech. Číst a odstranit warningy (errory jsou samozřejmostí). Kontrolovat správnost činnosti



0) Zkuste nejprve přečíst a promyslet zadání a následně nakreslit vývojový diagram, zvolit vhodné datové typy a posléze teprve naprogramovat.

1) Načtěte ze standardního vstupu 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; špatně zadané hodnoty (např. nula) se budou testovat až ve funkcích) vytiskne program text „chybne zadani“ a vrátí hodnotu dva. Toto hlášení tiskněte na standardní chybový výstup.
Výstupní text je možné tisknout na standardní výstup (parametr stdout – nastaveno na konzolu) nebo na chybový výstup (parametr 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.

2) 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.
a) Pro první realizaci použijte funkci fsdM uplatňující „hrubou sílu“ (procházející postupně hodnoty a hledající společného dělitele (např. postupné zkoušení čísel 2,3,4... pomocí funkce modulo – zbytek po celočíselném dělení)). Funkce fsdM – má dva parametry a společný dělitel vrací jako návratovou hodnotu.
b) Pro druhou funkci (fsdE) verzi využijte Eukleidův algoritmus/Euclidean algorithm (použijte jako hesla do wikipedia). Funkce fsdE – má dva parametry a společný dělitel vrací jako návratovou hodnotu.

Ve funkci main zavolejte postupně obě funkce a oba výsledky vytiskněte od začátku řádku. Jednu hodnotu na řádek. V případě vrácení chybové hodnoty vytiskněte na standardní výstup návratovou hodnotu (nula) a standardní chybový výstup text “chybne zadani“

3) Napište funkci fsd, 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 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. V případě vrácení chybové hodnoty vytiskněte na standardní výstup návratovou hodnotu (nula) a standardní chybový výstup text “chybne zadani“

4) Program postupně zavolá všechny funkce (body 2 a 3). Program vrací kód jedna v případě, že některá z funkcí vrátila chybový kód (tj nulu) – program ale ukončí až po zavolání všech tří funkcí a tisku výsledků či chybových hlášení. Pokud proběhl program v pořádku, vraťte hodnotu nula.
Výsledný tisk pro vstup 16,8 je:
8
8
8; 4; 2; 1
4

Pro 28,0 bude výstup
0
0
0
a na standardním chybovém výstupu bude
chybne zadani
chybne zadani
chybne zadani

Pro zadani textu „ahoj“ se na standardní výstup nic nevytiskne. Vytiskne se na standardní chybový výstup
chybne zadani

5) Rozdělte program tak aby funkce fsdE, fsdM a fsd byly v samostatném zdrojovém souboru (mimo soubor s funkcí main). K tomuto souboru vytvořte hlavičkový soubor. Hlavní program s funkcí exe dejte do souboru mainsd.c, funkce naprogramujte do souboru sd.c (+ k němu sd.h). Hlavičkový soubor ošetřete proti vícenásobnému načtení.

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.... */



6) Pro zhodnocení kvality programu, zvláště pak posouzení, že změny kódu nevedly ke zhoršení funkčnosti se používá různých způsobů testování. Zde uvádíme jeden z jednoduchých způsobů testování, kdy se aktuální výstup porovnává s výstupy vzorovými. Testování použijte minimálně volání z příkladů uvedených v bodu 1 a 2.

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ů.

Popis testování pomocí dávkového souboru.









Poslední změna 2018-02-05