Je tu nový kurz C++ pro začátečníky, který Vás provede prvními krůčky s C++.

1. lekce
Základní pojmy

Úvodem

Vítejte v kurzu C++ pro začátečníky. Toto je první lekce kurzu. Na úvod bych rád odpověděl na několik otázek.

Pro koho je kurz určen?
Pro každého kdo o to bude mít zájem. Většinou to budou asi začátečníci nebo mírně pokročilí. To jsou ti co možná již trochu o programování slyšeli, ale nikdy s ním nepřišli do přímého konkatku nebo ti, kteří již programují v nějakém jiném jazyce a chtějí přejít na jazyk C++.

Pro koho není kurz určen?
Zkušený harcovník a profesionál zde asi nic nového nenajde a ani nepředpokládám, že by se někdo z nich dal počítat za čtenáře. Ale možná, že i profesionál zde najde něco zajímavého. Nicméně se budu snažit látku trochu odlehčit, tak aby vyhovovala začátečníkovi. Pamatujte si však, že všechny věci probereme důkladně a hlavně kompletně. Náročnější pasáže označím po straně textu sovou, která určuje, že označená pasáž je náročnější a určena pro ty co chtějí vědět víc. Pro základní osvojení tyto pasáže můžete klidně vynechat.


PŘEDMLUVA


Jedním z nejrozšířenějších programovacích jazyků se stal jazyk C. Má mnohé výhodné, ale i nevýhodné vlastnosti. Dá se však říci, že výhod je podstatně víc a tyto výdnoné rysy ho předurčují pro využití ve spoustech programátorských oblastech. Vzhledem k jeho vlastnostem se jazyk C stal velmi populárním a postupně se vyvinulo několik jeho verzí - až po současný standard ANSI C++. Touto verzí se také budeme v našem kurzu zabývat.

Tyto lekce si kladou za cíl seznámit čtenáře s vytvářením programů v ANSI C++ (dále jen C++). Při výběru doprovodných příkladů a učební látky byl kladem důraz zejména na srozumitelnost a interaktivní (oboustranný, vzájemný) způsob práce s počítačem.

Text jednotlivých kapitol je orientován převážně na popis jazyka v rámci probírané látky. Uvedené příklady a další doprovodné materiály nejsou jediným správným řešením (nekladu si nárok na dokonalost mých programů). Proto je třeba je považovat za pouze jedno z možných řešení problému a cílem je ukázat především popisované rysy jazyka.

V kurzu je užito dvou typů sazby. V sazbě běžného textu výkladu je použito normální písmo, stejné jakým je psán i tento text. Jiný způsob sazby je použit u zdrojových kódů. Celý text je usazen do světle hnědého podkladu a vlastní program je psán "písmem psacího stroje" s barevným odlišením jednotlivých tzv. lexikálních prvků (podobné se slovními druhy v českém jazyce - podstatné jméno, sloveso apod.) programovacího jazyka. Ostatně, vše uvidíte v následujících odstavcích.

Kurz je určena zejmnéna čtenářům bez programátorských zkušeností. Měl by posloužit jako první seznámení s jazykem a ne pro jeho naprosné osvojení. Proto nejsou rysy v textu vypušteny nebo zjednodušeny - avšak pokaždé vás na to upozorním a uvedu vhodné zdroje pro rozšířené studium.

Kurz je sestaven tak, aby k procvičování posloužil i některé starší vývojové nástroje (programy ve kterých tvoříme svoje vlastní programy) (např. Borland C++ 3.1 pro DOS). Příklady jsou vytvořeny tak, aby se jste s nimi byli donuceni pracovat konverzačním způsobem. Všechny programy jsou uvedeny v kompletní formě s plným zněním zdrojových textů (text programu - jako knihy se slovy pro počítač) a mohou být ihned použity (spuštěny).

Pokud to nebylo nutné, nebyly použity speciální vlastnosti C++ dostupné např. jen v jednom vývojovém nástroji. Na místech, kde jsou speciální vlastnosti C++ využity, je to výslovně uvedeno.


1  OBECNÝ ÚVOD


1.1  Základní pojmy

Algoritmus je postup řešení problému z některého oboru činnosti. Skládá se obvykle z určitého počtu kroků, přičemž každý krok popisuje dílčí úsek popisované činnosti. Algoritmus dále určuje, jak za sebou jednotlivé kroky následují.

Algoritmus pracuje s jistým počtem údajů, na jejichž základě je schopen jednoznačně rozhodnout, který další krok se bude provádět. Mimo to je důležité, aby algoritmus vždy skončil a aby dával výsledek své činnosti.

Má-li algoritmus provádět automatický stroj - počítač (resp. procesor) - předkládáme mu algoritmus zakódovaný (přepsaný, upravený do jiné podoby, ale stejného výsledku) do jazyka srozumitelném počítači.

Algoritmus je nutné zakódovat tak, aby procesor algoritmu rozuměl a byl schopen jej vykonávat. Zakodovaný algoritmus se potom nazývá program a zápis do formy programu programování.

Procesor, jehož ovládá náš program, se nazývá počítač. Je to stroj na zpracování údajů. Údaje získává od okolí na svém vstupu (vstupní "brána" pro sběr informací). S těmito údaji provádí předepsané akce a zpracované údaje předává dál do svého okolí na výstup. Zpracovává tedy údaje podle zadaného algoritmu obsaženém v programu.

Údaje vstupují do počítače a vystupují z něj v různých formátech (např. znakově jako text nebo graficky). Vnitří tvar údajů, se kterým umí procesor pracovat, je však pouze jeden a je dán vlastnostmi elektronických součástek, z nichž je procesor postaven. Údaje mohou nabývat pouze dvou hodnot (stavů) - 0 a 1; proto jim říkáme dvojkové neboli binární. Všechny ostatní typy údajů (včetně např. programů) se musí před zpracováním převést do dvojkového tvaru.

Jednotce dvojkové informace říkáme bit (z angl. binary digit - dvojková číslice). Důležitým pojmem je také název skupiny bitů, jež je schopna uchovat údaj o jednom znaku (např. písmeno, číslice). Takové skupině bitů říkáme bajt a obvykle (resp. téměř vždy) 8 bitů (bajt - z angl. byte (čteno bajt), někdy také počeštěným názvem slabika.) Dvojkový tvar je pro počítač výhodný (jednoduchost manipulace), ale pro člověka navyklého počítat v desítkové soustavě (soustavě čísel o základu deset) a psát písmena je naopak nepřirozený.

Do dvojkové soustavy jsou převedena nejen čísla, ale i znaky. Každému znaku odpovídá jistá kombinace jedniček a nul pevné délky (nejčastěji o délce jednoho bajtu, tj. 8 bitů). Taková kombinace vyjadřuje ovšem také jistou celočíselnou hodnotu. Této hodnotě říkáme ordinální číslo (pořadové číslo) znaku. Na různých počítačích se ordinální čísla přisouzeným znaků liší. Říkáme, že existují různé znakové tabulky (též znakové kódy nebo znaková sada). Nejčastěji užívaná je tabulka ASCII (American Standard Code for Information Interchange - Americký normovaný kód pro výměnu informací). Zkratka ASCII se vyslovuje jako aski. V kódu ASCII odpovídá např. ordinálnímu číslu 119 desítkově znak "w".

Příklady dvojkových čísel a odpovídajících znaků v tabulce ASCII:

dvojkově

desítkově

znakově

1010001

81

Q

1100110

102

f

101011

43

+

1111010

122

z

1000000

64

@

100101

37

%

1001011

75

K



Pro zápis algoritmů ve formě blízké člověku i řešeným problémům byla vytvořena celá řada nástrojů. Říkáme jim programovací jazyky. Pokud využívá programovací jazyk zápisu instrukcí procesoru, jde o programovací jazyk nízkoúrovňový (angl. LLL - Low Level Language), nejčastěji využíván odborníky (systémový programátor) k programování speciálních programů, protože dává programátorovy větší kontrolu nad počítačem. Příkladem nízkoúrovňového jazyka je Asembler.

Přestože jazyky C i C++ jsou nízkoúrovňové, neplatí na ně uvedená definice bezezbytku - C a C++ obsahují prvky z nízkoúrovňových jazyků, ale také tzv. vykokoúrovňových jazyků (angl. HLL - High Level Language). Vysokoúrovňový jazyk je programovací jazyk, který užívá pojmů blízkých člověku i řešenému problému. Akcím formulovaným ve vyšším programovacím jazyku neříkáme potom instrukce, ale příkazy. Ve většině programovacích jazyků je každý příkaz zakončen středníkem (;) - včetně C/C++. Příkladem vysokoúrovňového jazyka je např. Pascal, Turbo Pascal, Fortran, Basic a C/C++.

Pro každý programovací jazyk musí existovat algoritmus určující, jak program napsaný v tomto jazyce převést do tvaru instrukcí procesoru. Protože jde také o transformaci údajů, kde vstupní údaje tvoří proveditelné instrukce, může tuto činnost provádět automaticky počítač podle speciálního programu zvaného překladač. Programátor pak může formulovat algoritmy ve vyšším programovacím jazyce a počítač jeho program přeloží a provede.

1.2  Historie C a C++

Jazyk C++ je pokračovatelem jazyka C a obsahuje až na výjimky celý jazyk C.

V létě r. 1989 společnost AT&T zveřejnila specifikaci pro AT&T C++ release 2.0. Tato nová verze obsahuje některé významné změny, které řeší některé problémy s dřívějšími verzemi C.

Původní jazyk C byl vyvinut pro operační systém Unix na počítačích DEC PDP-11. Pro svoje vlastnosti si získal značnou oblibu a dnes je C i C++ k dispozici v mnoha operačních systémech na různých počítačích. Jazyk C byl původně určen pro systémové programování a téměř celý Unix je v něm napsán. Proto je také C samozřejmou součástí každého Unixové OS.

Jazyky C/C++ jsou však dobře použitelné i v mnoha jiných oblastech programování, např. hromadné zpracování dat, práce s textovými informacemi, řešení numerických úloh a mnoho dalšíh oblastí. Svou oblibu hlavně získal kvůli velké rychlosti vytvořených programů, které jsou dobře přenositelné do jiných operačních systémů.

Dalším důvodem obliby obou jazyků je to, že v nich lze používat obdobné operace a tvary jako při programování v jazyku asembler (jazyk nejnižní úrovně). Velmi silným prostředkem jsou např. široké možnosti práce s adresami dat a funkcí. Při vhodném způsobu programování se pak programy napsané v C/C++ mohou svojí rychlostí téměř rovnat rychlosti stejného programu psaného v asembleru, ale s mnohem menším úsilím.

V současné době je C++ pravděpodobně nejrozšířenějším programovacím jazykem zvláště profesionálů a dalších odborníků. Existuje pro něj spousta vývojových prostředí, jmenujme ty nejznámější: C++ Builder, Visual C++ (Windows), Borland C++, DJGPP (DOS).

Obecně se má za to, že C/C++ jsou jazyky složité. Je to pravda a důvodem je, že C/C++ dovoluje téměř vše (proto je vhodný pro spoustu oblastí programování) a to je také často "kamenem úrazu". Charakter obou jazyků velmi dobře shrnují dva následující citáty, které jsem si vypůjčil z knihy Učebnice jazyka C, Pavel Herout, Kopp, České Budějovice, 1997.

"C je jazyk mocný, tajemný a nevyzpytatelný."

neznámý zvídaný začátečník



"C je jako Porche: silné, účinné a kompaktní. Programování v C, stejně jako řízení Porsche, může být zajímavé, vzrušující a zábavné - ovládáli-li jste ho a umíte-li využít jeho možností."

A. E. Quilici

1.4  Rady pro začátek

Tyto stránky jsem vytvořil, protože jsem chtěl usnadnit vstup začátečníkům do programování a obecně do hlubších znalostí počítačů. Velmi dobře si pamatuji jak jsem začínal já - všechny knížky, materiály nebo rady ostatních mi připadali hrozně složité a jejich obsah jakoby zašifrovaný. Jen časem jsem postupně začal chápat to, co jsem předtím nezvládal.

Pomohl jsem už několika začátečníkům v mém okolí a chci své znalosti předávat dál. Mám zkušenosti (jak sám se sebou tak i s ostatními) s výukou programování a vím co je pro začátečníky obtížné a co jim dělá nejvíce potíže. Proto vám doporučuji abyste si tyto lekce vytiskli a postupně ukládaly např. do nějakých desek nebo šanonu. Budete pak mít všechno pohromadě a kompletní. Další věc, která vám ze začátku pomůže pomoci je psát si svůj vlastní slovníček "cizích slov" a když narazíte na některé neznámé slovo, tak si ho zapíšete. Později (nebo pokud najdete termín i s vysvětlením) si význam ke slovu připsat a pište si i několik verzí vysvětlení. Avšak na svůj slovníček nezapoměňte ani jako zkušení a slovníček se také potom stane svědkem vašich pokroků. V textu se snažím všechny pojmy použít nenásilně a napsat krátké vysvětlení do závorky, při prvním výskytu slova je vysázeno kurzívou.

Bohužel nevím jaké problémy budete mít právě vy. Díky tomu, že kurzy vycházení postupně, můžu proto korigovat učební látku podle vašich požadavků nebo se vracet k některým tématům. Prosím za sebe a hlavně za vás - využijte této možnosti a napište mi o svojich pokrocích, problémech, které vás trápí nebo jen námětech a připomínkách, které máte ke kurzu (můj email: bircow@centrum.cz). Protože vaše vědění je pro vás to nejdůležitější.

1.4  Programování v C++

Nyní si konečně ukážeme, jak vlastně program v C++ vypadá (naše programy budeme od této chvíle číslovat podle schématu kapitola.pořadí programu, např. 1.13, 4.3 apod.). Cítím, jak už jste nedočkaví, ale ještě chvilku počkejte. Nejdříve bychom si měli rozmyslet co náš program bude dělat.

Pro začátek si zvolíme velmi jednoduchý příklad: budeme chtít znát cenu balíčku disket včetně daně z přidané hodnoty, když známe jeho cenu bez DPH čili kolik zaplatíme, když přijeme do obchodu.

Cenu za jeden balíček s 10 kusy stanovíme, aby se nám to lépe počítalo, na 100 Kč bez daně. DPH činí 22%, připočteme tedy 22% k ceně 100 Kč. Výpočet bude opravu velmi rychlý - 122 Kč - na to přece nepotřebujeme počítač! Jistě, ale řekněte pohotově kolik je 22% třeba z 4 567,80 Kč? No vidíte... Lepší by jistě bylo pokud bychom si cenu vypočetli pomocí našeho jednoduchého programu.

Ještě než se budeme bavit dál, možná že znáte ten tahák pro výpočet procentové části, který používají obchodníci. Rád vám ho vysvětlím. Jak tedy zjistit kolik je 22% ze 100, 555 nebo 123,456? Velmi jednoduše: vynásobne dané číslo 1,22, např. 22% z 115 zjistíte výpočtem 115 * 1,22. A když změníte číslo 1,22 na třeba 1,56 nebo 1,5 (neboli 1,50) dostanete sumu zvýšenou o 56% (pro 1,56) nebo 50% (pro 1,5). Pozor, ale při zvýšení o méně než 10%, např. 8%, potom musíte číslo násobit 1,08! Nezapoměňte však, že tímto trikem lze zvětšovat maximálně pod 100% procent, tj. třeba 99,2%, 99,9999999% apod. S tímto usnadněním budeme počítač i v našem příkladu.

Shrňme si to: chceme aby náš program ze zadané ceny vypočítal DPH 22% a novou cenu vypsal. Nejprve si rozvrhneme jednotlivé kroky v našem programu - náš "scénář" (ale vy už víte, že se správně říká algoritmus).

  1. Uživatel zadá cenu výrobku.
  2. Program napíše cenu výrobku

Jak vidíte jsou vlastně jen dva. Ale to nestačí. Ve vysvětlení pojmu algoritmus jsme si řekli, že algoritmus je vyčerpávající přesný postup a to náš první návrch není. Zkusíme si podrobnější rozpis.

  1. Programátor nechá vypsat výzvu pro uživatele "Kolik je cena zboží v Kč bez DPH?" nebo nějak podobně.
  2. Uživatel na klávesnici napíše nějakou cenu, např. 100.
  3. Programátor nechá počítač pracovat podle algoritmu a výsledek nechá vypsat na obrazovku počítače.

V tomto rozpisu jsme si rozdělili úlohy pro programátora a pro uživatele. Uživatel to má vždycky lehčí... Úkoly uživatele už není potřeba dále rozvádět, programátor však stále neví jak má k výsledku dospět - neboli nezná algoritmus a my mu ho řekneme a už se vyjádříme odborněji.

  1. Do proměnné CenaZbozi ulož to, co napsal uživatel na klávesnici.
  2. Vypočítej: CenaZbozi * 1,22 a výsledek ulož do proměnné VyslednaCena a vypiš na obrazovku.

Objevil se nám tu nový pojem - proměnná. Představte si ji jako šuplík, do kterého vkládáte něco resp. cokoliv - číslo, písmeno, větu apod. Šuplíky můžete také otevírat a přečíst si jejich obsah. Proměnná je snad nejpoužívanější termín (mimo jiné - už to máte napsáno ve svých slovníčcích?). A ještě malá poznámka místo 1,22 použijeme také proměnnou resp. konstantu, tj. proměnnou, u které nejde změnit obsah.

Stejně jako na kalkulačce, tak i na počítačích se místo desetinné čárky používá tečka.

 

Pro čísla menší než jedna je povolen zkrácený zápis (opět stejně jako na kalkulačkách). Místo 0.15 mužeme tedy psát jen .15, místo 0.85 zase jen .85 apod.



A přichází ona slavná chvíle - teď konečne uvidíte výsledký program, který si postupně vysvětlíme. Je to jistě lepší než kdybychom hovořili o jednotlivých částech, aniž byste je viděli napsané pohromadě.

/*
  prg_1-1.cpp

  Výpočet ceny výrobku s DPH.

  30.3.2000, Libor Jelínek.
*/

#include <iostream.h>  // 1 - bez středníku

const double DPH = 1.22;  // 2

void main (void)  // 3
{  // 4
  double CenaZbozi;  // 5
  double VyslednaCena;  // 6

  cout << "Kolik je cena zboží v Kč bez DPH?\n";  // 7
  cin >> CenaZbozi;  // 8
  VyslednaCena = CenaZbozi * DPH;  // 9
  cout << "Cena s DPH je " << VyslednaCena;  // 10
}  // 11


A teď si postupně rozebereme význam jednotlivých řádků.

Prvních několik řádku psaných šedou kurzívou označuje komentář. Do komentáře si můžete zapsat libovolný text. Například název a verzi programu, autora, datum a také účel programu. V komentářích lze používat i české znaky. Každý větší program by měl takovéto údaje na začátku souboru obsahovat. Všimněte si také, prosím, dvou způsobů ohraničení komentářů použitý u číslování řádků. S první způsobem přišel jazyk C, pohodlnější komentáře druhým způsobem přineslo až C++. (Vše budeme v dalších dílech vysvětlovat mnohem podrobněji.)

Na prvním řádku vidíte tzv. direktivitu preprocesoru (v tuto chvíly je zbytečné vysvětlovat oč jde, protože neznáte další věci - až později), která říká překladači, aby vložil (angl. include) hlavičkový soubor (header file - odtud přípona .h pro C/C++ nebo .hpp pro C++, ale i v C++ je používá jen .h) obsahující funkce pro zobrazení textu na obrazovce. Náš hlavičkový soubor se jmenuje iostream.h, další hlavičkové soubory se jmenují např. stdio.h, string.h a další.

Vlastně jsem to ještě neřekl - soubory psané v jazyku C mají příponu .c a soubory v C++ mají příponu .cpp (jako C plus plus).



Na tomto prvním řádku si také prosím všimněte, že tento příkaz není ukončen středníkem. Je to zvláštnost, jinak každý příkaz musí být ukončen středníkem. Tímto řádkem bude začínat téměř každý program a v budoucnu se jím budeme zabývat podrobněji.

Na druhém řádku jsme zavedli konstantu se jménem DPH a přiřadili jí hodnotu 1.22. Bez uvedení tzv. klíčového slova (angl. keyword - vyhrazené slovo jazyka, které má speciální význam) const, by se jednalo o obyčejnou proměnnou, ale když před ní přidáme toto slovo, říkáme tak překladači, že jeho hodnotu už nemůžeme dále měnit - hodnota je konstantní.

Na stejném řádku je také další klíčové slovo: double. Tímto klíčovým slovem definujeme datový typ dané proměnné (nebo - jako zde - konstanty). Datový typ určuje druh dat, které může proměnná obsahovat. double určuje reálný číselný typ, čili proměnná může pouze obsahovat desetinné číslo.

Řádek tři deklaruje záhlaví (hlavičku) funkce. Funkce je nezávislý ("svobodný") úsek v programu, který je volán v případě potřeby pro vykonání nějaké činnosti (funkce). Opět se skládá z několika klíčových slov.

První klíčové slovo určuje typ vrácené hodnoty (resp. datový typ, který funkce vrací po skončení). void určuje, že funkce nebude vracet nic (nevrátí žádnou hodnotu).

Naše funkce se jmenuje main. Musí být v programu obsažena vždy a vyvolá se automaticky při spuštění programu. S funkce main se zachází naprosto stejně jako s každou jinou funkcí. Každá funkce může mít své parametry, kterými předáváme údaje, aby je funkce zpracovala. Například náš program později přepracujeme do podoby funkce se vstupními parametry jako velikost DPH, cena zboží a funkce nám vrátí cenu zboží se započtenou DPH. Parametry však nejsou povinné a proto opět použijeme, nám už známé klíčové slovo void, kterým opět vyjádříme, že parametry nejsou (jsou prázdné - void = prázdný). Parametry jsou uzavřeny do dvojice kulatých závorek ( a ).

Dohodněme se nyní na něčem. Abychom vždy přesně věděli zda mluvíme o proměnné nebo funkci, budeme funkci napříště psát s prázdnými závorkami. A to i v případě, že funkce bude mít nějaké parametry. Například: VyslednaCena je proměnná, ale když budeme mluvit o VyslednaCena() bude se jednat o funkci.



Každá funkce musí být přesně ohraničeny své hranice mezi dvojici složených závorek { a ukončovací }. V našem příkadu je výkonná část (ta co něco dělá) funkce main() (nezapoměňte - teď už funkce se závorkami) v rozsahu od řádku č.4 po řádek č.10.

Další řádek č.5 by pro vás měl být už trochu srozumitelný, protože je nápadně podobný druhému řádku. Zde deklarujeme (pojmy deklarace, definice budou vysvětleny později, zatím si je nahrazujte slovy zavedeme, zřídíme apod.) proměnnou CenaZbozi typu double čili reálného typu. Naše proměnná nemá zatím hodnotu.

Totéž pro řádek č.6, kde deklarujeme proměnnou VyslednaCena a také zatím bez hodnoty.

Sedmý řádek také není příliž obtížné pochopit. Voláme zvláští funkci (ve skutečnosti to není funkce, ale pro nás to zatím není podstatné) cout z knihovny iostream.h, který vypisuje libovolný řetězec (pojmenování v programovacích jazycích pro text). Název funkce je odvozen ze slov C output (výstup jazyka C). Obdobně pojmenovaná funkce cin (C input - C vstup) zase čte (obvykle) z klávesnice. Je nutné uvést znaky <<, které naznačují výstup.

Všimněte si prosím rozdílu mezi tím, co cout dostane jako parametr ("Kolik je cena zboží v Kč bez DPH?\n" a tím co vypíše na obrazovku ("Kolik je cena zboží v Kč bez DPH?"). Rozdíl je v závěrečné sekvence dvou znaků \n. Několik znaků (maximálně tři) uvedených za \ nazývá escape sekvence (znak \ se jmenuje escape). Konkrétně escape sekvence \n provede přechod na nový řádek. Další možnosti jsou např. \007 - pípne, \t - tabelátor apod.

Osmý řádek je vám už také jistě jasný. Ano, funkce cin načte a uloží z klávesnice číslo do proměnné CenaZbozi. Všimněte si malé změny v otočení směru šipek doprava.

Devátý řádek provede jednoduchý výpočet ke zjištění ceny s DPH a výsledek uloží do proměnné VyslednaCena. Vidíte, že místo naší tečky pro symbol násobení se používá hvězdička (*).

Předposlení desátý řádek už jen vypíše výsledek. Ze zápisu vyplývá, že pokud chceme vypsat proměnnou za předem stanoveným řetezcem, musíme opět použít zdvojené šipky doleva.