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

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

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.

Výpis ASCII tabulky v jazyce 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.

Detektor palindromů v jazyce C

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ší.

Vygenerova šifra v jazyce C

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.

Dešifrování Vigenerovy šifry

 

Stáhnout

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

 

  Aktivity (5)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Avatar
Mate
Člen
Avatar
Mate:

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. července 22:56
 
Odpovědět 24. července 22:55
Avatar
Mate
Člen
Avatar
Mate:

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. července 23:03
 
Odpovědět 24. července 23:02
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Mate
patrik.valkovic:

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. července 8:39
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Johny
Člen
Avatar
Johny:

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