Cvičení k 8.-9. lekci Céčka

C a C++ Céčko Základní konstrukce C Cvičení k 8.-9. lekci Céčka

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti programování v Céčku z minulých lekcí. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulých tutoriálů a pokuste se na to přijít.

Jednoduchý příklad

Naprogramujte aplikaci, která vypíše všechny znaky, které vypsat lze. Již víme, že znaky jsou reprezentovány typem char, který nabývá číselné hodnoty v rozmezí 0 až 255 a obsahuje tedy kód daného znaku. Vypište znaky pro všechny kódy v ASCII tabulce a k nim jejich kód.

Pozn.: Nelekejte se prázdných řádků, neviditelných znaků nebo pípnutí. I tyto znaky mají svou specifickou hodnotu a počítač je reprezentuje podle jejich významu (například odřádkování, tabulátor). Ne všechny znaky umí také konzole zobrazit, proto se některé znaky mohou zobrazit pouze jako prázdné čtverečky.

Konzolová aplikace
77: M 78: N 79: O 80: P 81: Q 82: R 83: S 84: T 85: U 86: V 87: W 88: X 89: Y 90: Z 91: [ 92: \ 93: ] 94: ^ 95: _ 96: ` 97: a 98: b 99: c

Středně pokročilý příklad

Naprogramujte detektor palindromů. Palindrom je takové slovo, které se čte stejně zleva i zprava. Taková slova jsou například "oko", "level", "radar". Program bude detekovat, zda slovo palindromem je nebo ne a podle toho vypíše hlášku.

Pozn.: V obrázku jsou dva výstupy, protože je několik možností, jak úlohu naprogramovat. V přiloženém archivu je úloha vyřešena dvěma způsoby.

Konzolová aplikace
Zadejte palindrom: radar Jedna se o palindrom Jedna se o palindrom

Pokročilý příklad

Naprogramujte šifraci textu pomocí Vigenerovy šifry. Program si na vstupu vyžádá šifrované slovo a heslo. Předpokládejme zadání slova "moribundus" a hesla "ahoj". Program posune jednotlivá písmena v šifrovaném slovu o určitý počet znaků v abecedě dopředu. Tento počet závisí na písmenech v heslu. V našem případě program posune první znak ve slovu o 1 (a), druhý o 8(h), třetí o 15(o), čtvrtý o 10 (j), pátý zas o 1 (a) a tak dále.

Nesmíme zapomenout na konec abecedy, tedy jestliže máme písmeno S posunout o 8 znaků dopředu, musí nám vyjít A. Samotný algoritmus je blíže popsaný v článku Algoritmus Vigenerovy šifry, kde je i nápověda jak ho napsat.

Pozn.: Pro jednoduchost bude v přiloženém archivu pouze verze, která bude počítat s malými písmeny. Pro malá i velká písmena by byl algoritmus o něco složitější.

Konzolová aplikace
Zadejte text k zasifrovani: moribundus Zadejte heslo: ahoj nwgscccnva

Rozšíření

Samozřejmě je užitečné slovo zašifrovat, ale my bychom ho chtěli poté i dešifrovat. Proto můžete napsat ještě podobný program, který si vyžádá zašifrované slovo a heslo. Program poté slovo dešifruje a zobrazí originální zprávu.

Konzolová aplikace
Zadejte text k desifrovani: nwgscccnva Zadejte heslo: ahoj moribundus

 

Stáhnout

Staženo 101x (129.02 kB)
Aplikace je včetně zdrojových kódů v jazyce c

 

 

Článek pro vás napsal patrik.valkovic
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.
Aktivity (6)

 

 

Komentáře

Avatar
Mate
Člen
Avatar
Mate:24.7.2016 22:55

Ahoj rád bych se zeptal, na středně těžkém příkladu. V příkazu for:

for(i=0; i<delka; i++){
slovoPozadu[delka-1-i]=slovo[i];
}

má slovo pozadu délku o 1 větší než původní slovo a tedy musím do kódu přidat řádek:
slovoPozadu[del­ka]='\0';

Když jsem si vypsal jednotlivá písmena ve for pomocí:
printf("%c", slovoPozadu[i])
tak jsme dostal správná písmena, ale pokud jsme vypsal za for celé slovo, tak je tam písmeno navíc.

Můžete mi někdo prosím vysvětlit proč to tak je?

Editováno 24.7.2016 22:56
 
Odpovědět 24.7.2016 22:55
Avatar
Mate
Člen
Avatar
Mate:24.7.2016 23:02

Také mám jednu otázku k těžkému příkladu. Ten se mi nepodařil naprogramovat samostatně. A když jsme se koukal na řešení, které máte zde na webu, tak jsme neporozuměl následující části kódu:

hodnoty_hesla[i%del­ka_hesla]

byli by jste prosím tak laskaví a řekli mi co znamená vnitřek hranaté závorky(i%del­ka_hesla)? Nikde v kurzu jsem se s tím zatím nesetkal.

Děkuji

Editováno 24.7.2016 23:03
 
Odpovědět 24.7.2016 23:02
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Mate
patrik.valkovic:25.7.2016 8:39

Ke středně těžkému příkladu: Pravděpodobně jsi zapomněl za řetězec uložit znak konce slova. Ten příklad není určen k výpisu (proto tam ten poslední znak chybí), ale pouze k porovnání slov.
K těžkému příkladu: procento znamená v programování tzv. modulo (nebo zbytek po celočíselném dělení). Například 5%3 je 2, 10%7 je 3.

Odpovědět 25.7.2016 8:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Johny
Člen
Avatar
Johny:4.11.2016 22:03

Takto jsem řešil pokročily příklad já:

while(vzkaz[i] != '\0'){

                  sifra[i] = vzkaz[i] + (heslo[(i%delka_hesla)] - ('a'-1));
                  if(sifra[i] > 122)
                              sifra[i] -= ('z'-'a');
                  i++;
    }

při řetezci moribundus a hesla ahoj (jako v článku z odkazu u příkladu)
ale místo:
N W G S C C C N V A

mi vyjde:

N W H S C D D N V B

Můžete mi prosím aspoň nastínit, kde mohl vzniknout problém?
Případně přidejte i prohřešky proti dobrému programátorskému stylu.

Děkuji

 
Odpovědět 4.11.2016 22:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.