Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 9.-10. lekci C++

C a C++ C++ Základní konstrukce C++ Cvičení k 9.-10. lekci C++ American English version English version

Unicorn College ONEbit hosting 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++ z minulé lekce. 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í -128127 a obsahuje tedy kód daného znaku. Vypište znaky pro všechny kódy od 0 do 127 v ASCII tabulce a k nim jejich kód.

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.

Řešení je více, ale určitě nic nezkazíte tím, že začnete s vypsáním slova pozpátku. V přiloženém archivu je úloha vyřešena dvěma způsoby.

Konzolová aplikace
Zadejte palindrom: radar
Jedna se o palindrom

Na případ, že se o palindrom nejedná, reagujte vypsáním následující hlášky:

Konzolová aplikace
Zadejte palindrom: madar
Nejedna se o palindrom

Pokročilý příklad

Naprogramujte šifraci textu pomocí Vigenèrovy š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.

Pro úplnost si graficky znázorněme, jak celá šifrace probíhá:

n o r i b u n d u s
n w r i b u n d u s
n w g i b u n d u s
n w g s b u n d u s
n w g s c u n d u s
n w g s c c n d u s
n w g s c c c d u s
n w g s c c c n u s
n w g s c c c n v s
n w g s c c c n v a

Ve zjednodušené verzi nemusíte řešit, že heslo může být kratší než šifrované slovo a zadat ho jako ahojahojah. Nezapomeňte, že pokud je v heslu např. písmeno s a posun je 8, výsledný znak je opět a. Toto přetečení abecedy musíte ošetřit, ale i lehce pokažený výsledek s přetečenými znaky signalizuje, že jste na správné cestě.

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

Jakmile zvládnete první část, ve které musí heslo zopakovat sám uživatel a půjdete na opakování hesla programem, máte v zásadě dvě možnosti. Buď si heslo cyklem zopakujete do nějakého pomocného řetězce nebo se zamyslíte nad tím, zda by k tomu nešel použít zbytek po celočíselném dělení, který se v céčku zapisuje operátorem %. Následující kód vrátí hodnotu 1:

cout << 5 % 2;

Samotný algoritmus je blíže popsaný v článku Algoritmus Vigenèrovy š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


 

Stáhnout

Staženo 45x (15.78 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?
1 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity (12)

 

 

Komentáře

Avatar
Jaroslav Dubánek:15.8.2017 11:34

Hele, je normální, že mi vyřešení pokročilýho příkladu zabere několik hodin pokusů a omylů?

Odpovědět 15.8.2017 11:34
Život je ve skutečnosti strašně jednoduchej.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jaroslav Dubánek
David Čápka:15.8.2017 11:45

Naprosto normální :) Časem budeš programovat rychleji a rychleji, ze začátku je toho hodně najednou.

Odpovědět  +1 15.8.2017 11:45
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jaroslav Dubánek:15.8.2017 13:14

... ale ten konec je nejpříjemnější, jak když tě něco svědí a ty se po hodinách hledání místa konečně můžeš podrbat. Tak mě to přijde.

Odpovědět 15.8.2017 13:14
Život je ve skutečnosti strašně jednoduchej.
Avatar
Jaroslav Dubánek:15.8.2017 16:52

a / b = a % b???

Odpovědět 15.8.2017 16:52
Život je ve skutečnosti strašně jednoduchej.
Avatar
Jaroslav Dubánek:15.8.2017 16:59

Řešení těžkýho absolutně nepobírám. Mohl by mi ho prosím někdo vysvětlit? :O

Odpovědět 15.8.2017 16:59
Život je ve skutečnosti strašně jednoduchej.
Avatar
Josef Kvasničák:8. února 23:38

Ahoj.
U Vigenèrovy šifry řeším problém s přetečením jednoho pole a to přesně se znakem r + o.
Ty při sečtení dají dohromady 129 ale když si ten znak pošlu na obrazovku tak přeteče na -127.
Zkoušel jsem dat

unsigned int i

v cyklu, ale beze změny.
Přikládám svůj pokus:

#include <iostream>
#include <string>

using namespace std;

void main()
{
        string zprava = "moribundus";
        string heslo = "ahoj";
        string abc = "abcdefghijklmnopqrstuvwxyz";

        cout << "Zprava k zasifrovani: " << zprava << endl;
        cout << "Pouzite heslo: " << heslo << endl;

        string s_zprava = zprava;
        int k = 0;

        for (int i = 0; i < s_zprava.length(); i++)
        {
                if (k == heslo.length())
                        k = 0;
                s_zprava[i] = zprava[i] + (abc.find(heslo[k]+1));
                if (s_zprava[i] > 'z')
                {
                        s_zprava[i] = s_zprava[i] - 26;
                }
                k++;

        }

        cout << "Zasifrovana zprava: " << s_zprava << endl;



}
 
Odpovědět 8. února 23:38
Avatar
Matyas K.
Člen
Avatar
Matyas K.:28. února 22:17

Je tu někdo, kdo by mi byl schopen vysvětlit řešení těžkého příkladu ? Vůbec nechápu co se tam děje.

 
Odpovědět 28. února 22:17
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 8 zpráv z 8.