Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Cvičení k 11.-12. lekci C++

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

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++ 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ého tutoriálu a pokuste se na to přijít.

Jednoduchý příklad

Vytvořte program, který do konzole vykreslí šachovnici. Pro tmavá pole můžete využít mřížku "#" nebo kterýkoli jiný znak, pro světlá pole využijte mezeru.

Konzolová aplikace
 # # # #
# # # #
 # # # #
# # # #
 # # # #
# # # #
 # # # #
# # # #

Pro vykreslení samozřejmě využijte znalosti cyklů. Pro zjištění zda je pole světlé nebo tmavé vám pomůže modulo.

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

Naprogramujte aplikaci, která simuluje hru piškvorky pro 2 hráče. Aplikace vykresluje hrací plochu do konzole a nechává si střídavě od hráčů zadávat souřadnice, na které pokládají své kameny. Kontrolu výhry můžete zanedbat, uživatelské vstupy ošetřete.

K reprezentaci hrací plochy využijte vícerozměrného pole.

Ukázka programu:

Konzolová aplikace
  ABCDEFGHI
1
2
3
4  O
5
6
7
8
9

Na rade je hrac s krizky
Zadejte horizontalni souradnici (A-H): D
Zadejte vertikalni souradnici (1-8): 5
  ABCDEFGHI
1
2
3
4  O
5    X
6
7
8
9

Na rade je hrac s kolecky
Zadejte horizontalni souradnici (A-H): K
Zadejte vertikalni souradnici (1-8): 3
Hodnoty nejsou validni, prosim opakujte akci

Cvičení si vyzkoušejte ve vašem IDE.

Pokročilý příklad

Pomocí goniometrické funkce sinus vykreslete do konzole jednu periodu sinusoidy (grafu této funkce).

Protože je vypisování pouze jednosměrné (co napíšeme již nelze vzít zpět) a lineární (musíme zapisovat znaky, jak jdou po sobě), používá se u úloh podobného typu tzv. buffer. Buffer je pole znaků v paměti, kde si připravíme jak chceme obrazovku vykreslit a teprve až je vše jak potřebujeme, vykreslíme vše naráz. V tomto případě si vytvoříme buffer podle rozměrů, které si nastavíme (bude se jednat o 2D pole). Do tohoto bufferu zaneseme jednotlivé body sinu. Až budeme mít celý výpočet hotový, teprve poté celý buffer vykreslíme do konzole.

Ukázka programu:

Konzolová aplikace

           #########
         ##         ##
       ##             #
      #                #
     #                  ##
    #                     #
   #                       #
  #                         #
##                           #
                              #                           #
                               #                         #
                                #                       #
                                 #                     #
                                  ##                  #
                                    #                #
                                     #             ##
                                      ##         ##
                                        #########

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main(void) {

    return 0;
}

Perioda funkce sinus je 2 PI. Začněte vykreslením této křivky v poměru 1:1, sice bude malá, ale bude v konzoli vidět. Abyste dosáhli výsledku jako na obrázku, musíte ji pronásobit poměrem rozměrů konzole a hodnoty funkce sinus. Sinusoida se poté roztáhne. Jednotlivé souřadnice bodů vypočítávejte v desetinných číslech, výsledné souřadnice teprve zaokrouhlíte na celé znaky.


 

Stáhnout

Staženo 44x (9.37 MB)
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 (NodeJS).
Miniatura
Předchozí článek
Matematické funkce v C++
Miniatura
Všechny články v sekci
Základní konstrukce jazyka C++
Miniatura
Následující článek
Funkce v jazyce C++
Aktivity (12)

 

 

Komentáře

Avatar
Jaroslav Dubánek:17.8.2017 19:22

Na co se v rámci cvičení můžu a nemůžu podívat kromě tohoto řešení a jinýho řešení stejný úlohy? Ta pokročilá mě dává zabrat. Doporučujete třeba přeskočit?

Odpovědět 17.8.2017 19:22
Život je ve skutečnosti strašně jednoduchej.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jaroslav Dubánek
patrik.valkovic:17.8.2017 21:24

V rámci cvičení se můžeš podívat na cokoliv. Pokročilý příklad je těžký záměrně, ne vše v programování je vyřešeno během chvíle. Doporučuji si to zkusit vyřešit nejdříve na papíře a teprve poté psát program.

Odpovědět  +1 17.8.2017 21:24
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Josef Kvasničák:10. února 2:55

Zdravím
Těžký příklad jsem vyřešil poněkud jinak než je v řešení... Proto se chci zeptat zda to moje brát jako splněné cvičení.
Výstup konzole

A kód:

#include <iostream>
#include <cmath>
#define PI 3.1415926535897932384626433832795

using namespace std;

void main()
{
        // Vytvoření pole
        char buffer[21][180];


        // Vyčištění pole
        for (int i = 0; i < 21; i++)
        {
                for (int j = 0; j < 180; j++)
                        buffer[i][j] = ' ';
        }

        // Počet desetinných míst
        double presnost = 0.01;


        // Hlavní cyklus deg = stupně, i = řádek v bufferu
        for (int deg = 1, i = 0; deg <= 360; deg += 4, i++)
        {
                // Vypočet sinusu úhlu
                double rad = deg * (PI / 180);
                double sinus = sin(rad);

                // Posunuti sinusu úhlu. (sin(90)=1 -> 10.0)
                sinus /= presnost;
                sinus = round(sinus) * 0.1;

                // Získání samostatného desetinneho čísla pro "hladší" křivku (8.7 - 8 = 0.7)
                double tmp = sinus - trunc(sinus);

                // Určení sloupce v poli bufferu (10 + (-5) = 5)
                int k = 10 + (trunc(sinus));

                // Uložení bodu křivky do bufferu
                buffer[k][i] = '#';

                // Když je desetinné místo větší než 0.5 tak zkopírovat bod o řádek níž ve stejném sloupci pro "hladší" křivku
                if (tmp > 0.5)
                {
                        buffer[k + 1][i] = '#';
                }
                else
                {
                        if (tmp < 0)
                        {
                                tmp *= -1;
                                if (tmp > 0.5)
                                {
                                        buffer[k - 1][i] = '#';
                                }
                        }
                }

        }

        // Vypis bufferu
        for (int i = 0; i < 21; i++)
        {
                for (int j = 0; j < 180; j++)
                        cout << buffer[i][j];
                cout << endl;
        }


}
 
Odpovědět 10. února 2:55
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Josef Kvasničák
patrik.valkovic:10. února 9:36

Samozřejmě. Vždy lze dojit ke stejným výsledkům různými postupy.

Odpovědět 10. února 9:36
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
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.