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