ITnetwork summer 2020
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 3 - Proměnné a typový systém v C++

Z minulé lekce, Visual Studio a první konzolová aplikace v C++, již umíme pracovat s Visual Studiem a vytvořit konzolovou aplikaci. Dnes se v C++ tutoriálu podíváme na tzv. typový systém, ukážeme si základní datové typy a práci s proměnnými. Výsledkem budou 4 jednoduché programy včetně kalkulačky.

Proměnné

Než začneme řešit datové typy, pojďme se shodnout na tom, co je to proměnná (programátoři mi teď jistě odpustí okamžik vysvětlování). Určitě znáte z matematiky proměnnou (např. x), do které jsme si mohli uložit nějakou hodnotu, nejčastěji číslo. Proměnná je v informatice naprosto to samé, je to místo v paměti počítače, kam si můžeme uložit nějaká data (např. jméno uživatele). Toto místo má podle typu proměnné také vyhrazenou určitou velikost, kterou proměnná nesmí přesáhnout (např. číslo nesmí být větší než 2 147 483 647).

Proměnná má vždy nějaký datový typ, může to být číslo, znak, text a podobně, záleží na tom, k čemu ji chceme používat. Většinou musíme před prací s proměnnou tuto proměnnou nejdříve tzv. deklarovat, čili říci jazyku jak se bude jmenovat a jakého datového typu bude (jaký v ní bude obsah). Jazyk ji v paměti založí a teprve potom s ní můžeme pracovat. Podle datového typu proměnné si ji jazyk dokáže z paměti načíst, modifikovat, případně ji v paměti založit. O každém datovém typu jazyk ví, kolik v paměti zabírá místa a jak s tímto kusem paměti pracovat.

Typový systém

Existují dva základní typové systémy: statický a dynamický.

  • Dynamický typový systém nás plně odstiňuje od toho, že proměnná má vůbec nějaký datový typ. Ona ho samozřejmě vnitřně má, ale jazyk to nedává najevo. Dynamické typování jde mnohdy tak daleko, že proměnné nemusíme ani deklarovat, jakmile do nějaké proměnné něco uložíme a jazyk zjistí, že nebyla nikdy deklarována, sám ji založí. Do té samé proměnné můžeme ukládat text, potom objekt uživatele a potom desetinné číslo. Jazyk se s tím sám popere a vnitřně automaticky mění datový typ. V těchto jazycích jde vývoj rychleji díky menšímu množství kódu, zástupci jsou např. PHP nebo Ruby.
  • Statický typový systém naopak striktně vyžaduje definovat typ proměnné a tento typ je dále neměnný. Jakmile proměnnou jednou deklarujeme, není možné její datový typ změnit. Jakmile se do textového řetězce pokusíme uložit objekt uživatel, dostaneme vynadáno.

C++ je staticky typovaný jazyk, všechny proměnné musíme nejprve deklarovat s jejich datovým typem. Nevýhodou je, že díky deklaracím je zdrojový kód poněkud objemnější a vývoj pomalejší. Obrovskou výhodou však je, že nám kompiler před spuštěním zkontroluje, zda všechny datové typy sedí. Dynamické typování sice vypadá jako výhodné, ale zdrojový kód není možné automaticky kontrolovat a když někde očekáváme objekt uživatel a přijde nám tam místo toho desetinné číslo, odhalí se chyba až za běhu a interpret program shodí. Naopak C++ nám nedovolí program ani zkompilovat a na chybu nás upozorní (to je další výhoda kompilace).

Pojďme si nyní něco naprogramovat, ať si nabyté znalosti trochu osvojíme, s teorií budeme pokračovat až příště. Řekněme si nyní tři základní datové typy:

  • Celá čísla: int
  • Desetinná čísla: float
  • Textový řetězec: string

Program vypisující proměnnou

Zkusíme si nadeklarovat celočíselnou proměnnou a, dosadit do ní číslo 56 a její obsah vypsat do konzole. Založte si nový projekt, pojmenujte ho Vypis (i ke všem dalším příkladům si vždy založte nový projekt). Kód samozřejmě píšeme do těla funkce main() jako minule, čili ji zde již nebudu opisovat.

int a;
a = 56;
cout << a << endl;
cin.get();

Jména proměnných mohou obsahovat malá a velká písmena, znak _ a číslice, ale těmi nesmí název začínat. Neměla by obsahovat diakritiku (i když Visual Studio si s ní poradí), ta v identifikátorech (názvech proměnných a funkcí) dělá jen problémy.

První příkaz nám nadeklaruje novou proměnnou a datového typu int, proměnná tedy bude sloužit pro ukládání celých čísel. Druhý příkaz provádí přiřazení hodnoty do proměnné, slouží k tomu operátor "rovná se". Poslední příkaz je nám známý, vypíše do konzole obsah proměnné a. Konzole je chytrá a umí vypsat i číselné proměnné.

Konzolová aplikace
56
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Pro desetinnou proměnnou by kód vypadal takto:

float a;
a = 56.6f;
cout << a << endl;
cin.get();

Je to téměř stejné jako s celočíselnou. Všimněte si, že za desetinná čísla typu float píšeme ještě tzv. suffix f, dále v kurzu se dozvíme proč.

Pozn: Pokud se pokusíme do celočíselné proměnné uložit desetinné číslo, překladači to vadit nebude. U jiných jazyků (např. C#, Java) by nám vynadal, že to nejde, ale v C++ jednoduše smaže vše za desetinnou tečkou.

Program Papoušek

Minulý program byl poněkud nudný, zkusme nějak reagovat na vstup od uživatele. Napíšeme program papoušek, který bude dvakrát opakovat to, co uživatel napsal. Ještě jsme nezkoušeli z konzole nic načítat, ale je to velmi jednoduché. Slouží k tomu objekt cin. O objektech si něco povíme mnohem později, je zde pro to samostatný kurz. Prozatím nám stačí vědět, že cin prostě umí číst data z klávesnice. My jsme ho již dokonce použili, cin.get() nám čekal na stisk klávesy Enter.

Zkusme si napsat následující kód:

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

int main(void)
{
    cout << "Ahoj, jsem virtualni papousek Lora, rad opakuji!" << endl;
    cout << "Napis neco: " << endl;
    string vstup;
    cin >> vstup;
    string vystup;
    vystup = vstup + ", " + vstup + "!";
    cout << vystup << endl;
    cin.get(); cin.get();
    return 0;
}

Pro používání typu string musíme na začátek kódu přidat #include <string>.

To už je trochu zábavnější :) První dva řádky jsou jasné, dále deklarujeme textový řetězec vstup, do něj se přiřadí hodnota z objektu cin, tedy to, co uživatel zadal. Pro výstup si pro názornost zakládáme další proměnnou typu textový řetězec. Zajímavé je, jak do vystup přiřadíme, využíváme tzv. konkatenace (spojování) řetězců. Pomocí operátoru "plus" totiž můžeme připojit textový řetězec k jinému a je jedno, jestli je řetězec v proměnné nebo je explicitně zadán v uvozovkách ve zdrojovém kódu. Do proměnné tedy přiřadíme vstup, dále čárku, znovu vstup a poté vykřičník. Proměnnou vypíšeme, vyčkáme na stisk klávesy a skončíme.

A proč je na konci použit 2x cin.get()? Řekli jsme si, že cin.get() čeká na stisknutí Enter. Problémem je, že cin čte pouze tisknutelné znaky, takže enter na vstupu zůstane. Pomocí prvního cin.get() enter smažeme a díky dalšímu cin.get() čekáme na další enter, který již musí přijít od uživatele.

Ještě bych rád upozornil, že cin načte jen jedno slovo. Pokud mu zadáme např. text "Ahoj C++", dostaneme jen "Ahoj".

Konzolová aplikace
Ahoj, jsem virtualni papousek Lora, rad opakuji!
Napis neco:
ahoj
ahoj, ahoj!

Do proměnné můžeme přiřazovat již v její deklaraci, můžeme tedy nahradit:

string vystup;
vystup = vstup + ", " + vstup + "!";

za

string vystup = vstup + ", " + vstup + "!";

Program by šel zkrátit ještě více v mnoha ohledech, ale obecně je lepší používat více proměnných a dodržovat přehlednost, než psát co nejkratší kód a po měsíci zapomenout, jak vůbec funguje.

Program zdvojnásobovač

Zdvojnásobovač si vyžádá na vstupu číslo a to poté zdvojnásobí a vypíše. Dosavadní znalosti by nám měly stačit k tomu, abychom napsali něco takového:

cout << "Zadejte cislo k zdvojnasobeni:" << endl;
int a;
cin >> a;
a = a * 2;
cout << a;
cin.get(); cin.get();

Všimněte si zdvojnásobení čísla a, které jsme provedli pomocí přiřazení.

Tento zápis se dá zkrátit i na pouhé:

a *= 2;

Konzolová aplikace
Zadejte cislo k zdvojnasobeni:
1024
2048

Jednoduchá kalkulačka

Ještě jsme nepracovali s desetinnými čísly, zkusíme si tedy napsat slibovanou kalkulačku. Bude velmi jednoduchá, na vstup přijdou dvě čísla, program poté vypíše výsledky pro sčítání, odčítání, násobení a dělení.

cout << "Vitejte v kalkulacce" << endl;
cout << "Zadejte prvni cislo: ";
float a;
cin >> a;
cout << "Zadejte druhe cislo: ";
float b;
cin >> b;
float soucet = a + b;
float rozdil = a - b;
float soucin = a * b;
float podil = a / b;
cout << "Soucet: " << soucet << endl;
cout << "Rozdil: " << rozdil << endl;
cout << "Soucin: " << soucin << endl;
cout << "Podil: " << podil << endl;
cout << "Dekuji za pouziti kalkulacky, aplikaci ukoncite libovolnou klavesou." << endl;
cin.get(); cin.get();

Pozn.: Výpočty bychom také mohli provést až při výpisu a ušetřit si proměnné s výsledky:

cout << "Soucet: " << (a + b) << endl;

Konzolová aplikace
Vitejte v kalkulacce
Zadejte prvni cislo: 15
Zadejte druhe cislo: 3
Soucet: 18
Rozdil: 12
Soucin: 45
Podil: 5
Dekuji za pouziti kalkulacky, aplikaci ukoncite libovolnou klavesou.

Pro dnešní lekci je to vše. V lekci příští, Řešené úlohy k 1.-3. lekci C++, si řekneme více o typovém systému a představíme si další datové typy.

Všechny programy máte samozřejmě opět v příloze, zkoušejte si vytvářet nějaké podobné, znalosti již k tomu máte :)

V následujícím cvičení, Řešené úlohy k 1.-3. lekci C++, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 381x (12.71 MB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

Předchozí článek
Visual Studio a první konzolová aplikace v C++
Všechny články v sekci
Základní konstrukce jazyka C++
Článek pro vás napsal Zdeněk Pavlátka
Avatar
Jak se ti líbí článek?
26 hlasů
Autor se věnuje spoustě zajímavých věcí ze světa informatiky a grafiky :)
Aktivity (21)

 

 

Komentáře
Zobrazit starší komentáře (14)

Avatar
dus30
Člen
Avatar
dus30:22.7.2017 14:45
cout << a << endl;
int a;
cin >> a;
 
Odpovědět
22.7.2017 14:45
Avatar
Jaroslav Dubánek:6.8.2017 18:43

Podle mě je chyba v zadání kalkulačky. Viz okno příkazového řádku na přiloženém obrázku.

Odpovědět
6.8.2017 18:43
Život je ve skutečnosti strašně jednoduchej.
Avatar
dus30
Člen
Avatar
dus30:20.1.2018 19:13
// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

#define out cout
#define in cin

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        nevipne:

        out << "\n";

//kalkulacka
        //promnene
        int x;
        int k;
        int y_krat;
        int y_deleno;
        int y_plus;
        int y_minus;
        int zbytek;

        //psani cisel
        out << " 1 cislo: ";
        in >> x;
        out << "\n";
        out << " 2 cislo: ";
        in >> k;
        out << "\n";

        //zjisteni deleni 0
        if (k == 0) {
                out << " nelze delit 0!"
                goto nevipne;
        }

        //vypocitani pocetnich operaci
        y_krat = x * k;
        y_deleno = x / k;
    y_plus = x + k;
        y_minus = x - k;
        zbytek = x % k;

        //zobrazeni vysledku
        out << " " << x << " * " << k << " = " << y_krat << "\n";
        out << " "      << x << " / " << k << " = " << y_deleno << " (" << zbytek << ") " << "\n";
        out << " " << x << " + " << k << " = " << y_plus << "\n";
        out << " " << x << " - " << k << " = " << y_minus << "\n";

        goto nevipne;

        return 0;
}

moje kalkulačka

 
Odpovědět
20.1.2018 19:13
Avatar
Michal Ch.
Člen
Avatar
Michal Ch.:26.1.2018 19:16

Na začátek programu na změnu jazyka z angličtiny napiš c++ kód

locale loc("Czech_Czech Republic.1250");
locale::global(loc);
Editováno 26.1.2018 19:19
 
Odpovědět
26.1.2018 19:16
Avatar
Zbyňa
Člen
Avatar
Zbyňa:29.1.2018 17:11

to samé platí i pro vstup pomocí std::cin >> ??
nebo se vstup pro cz znaky řeší jinak nebo vůbec ?

Odpovědět
29.1.2018 17:11
čistý kód a čitelnej
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Tomáš Bajt
Člen
Avatar
Tomáš Bajt:28. dubna 10:49

Zdravím , teď čtu ,že cin nevyčte dvě slova , ale jen jedno , jak tedy z uživatelského vstupu vyčíst uplně vše?

Odpovědět
28. dubna 10:49
Život je jednoduchý, to jen lidé si ho dělají složitým.
Avatar
Odpovídá na Tomáš Bajt
Patrik Valkovič:28. dubna 10:53

Ahoj. Takové věci se řeší dál v kurzu, konkrétně v částí "práce se soubory": https://www.itnetwork.cz/…kurz/soubory
V C++ je k tomu potřeba znát objektově orientované programování.

Odpovědět
28. dubna 10:53
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Tomáš Bajt
Člen
Avatar
Tomáš Bajt:28. dubna 11:19

Aha , díky.

Odpovědět
28. dubna 11:19
Život je jednoduchý, to jen lidé si ho dělají složitým.
Avatar
Libor Šimo (libcosenior):17. května 14:09

Ahoj. Keď do vstupu vložím slovo s diakritikou, vypíše to špatne.
Napr. vstup "papagáj"
výstup "papag j, papag j!"

Napr. vstup "střecha"
výstup "stýecha, ...

Skúšal som češtinu jedným aj druhým spôsobom.

int main(void)
{
        //setlocale(LC_ALL, "");
        locale loc("Czech_Czech Republic.1250");
        locale::global(loc);

Kde je chyba prosím?

Odpovědět
17. května 14:09
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
DarkCoder:17. května 14:42
#include <stdio.h>
#include <locale.h>

int main(void) {

        char *text = "ěščřžýáíé";

        setlocale(LC_ALL, "cs_CZ");
        puts(text);

        return 0;
}
Odpovědět
17. května 14:42
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
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 10 zpráv z 24. Zobrazit vše