Články

Tisk článku Tisk článku

Pole

[Zpět na kategorii]

Datum: 13. 7. 2010 10:18       Autor: Petr Sklenička       Zobrazeno: 4407x

Kategorie: Začínáme

Témata: C++

Seriál: C++ krok za krokem - Díl 5.

V dnešním díle si ukážeme, co je to jednorozměrné pole, jak jej deklarovat, inicializovat a samozřejmě nebude chybět ani krátký program. Tento díl slouží spíše jako základní úvod do polí, neboť zde nejsou vysvětleny vícerozměrná pole, pole ukazatelů, aritmetika ukazatelů apod. Jde o pokročilejší záležitost, proto si to probereme v některém z pozdějších dílů.


V předchozím díle jsme se naučili používat podmínky, probrali jsme si některé operátory a také jsme si ukázali, jak se používá příkaz switch. V dnešním díle nás čekají pole. Povíme si tedy co to vlastně pole je, jak jej definovat atd. Musím podotknout, že ve spoustě případů se práce s polem pojí s použitím cyklů, které zatím neumíme a budou obsahem příštího dílu. Proto se pole vyskytnou i v následujícím díle, čímž se vlastně naučíme jak cykly, tak si též zopakujeme do jisté míry dnešní díl.

Co je to pole

Řekneme-li to jednoduše, je to proměnná, do které můžeme uložit více hodnot stejného typu. Například tedy 20 hodnot typu int, 40 hodnot typu bool apod. Odborněji můžeme o poli mluvit jako o určité kolekci míst v úložišti dat, kde každé místo v úložišti označujeme jako prvek nebo element pole. Pole deklarujeme zadáním jeho typu (bool, char, double apod.), za nímž následuje název pole a index neboli subskript. Index uzavíráme do hranatých závorek a říkáme jím, kolik prvků bude pole obsahovat. Viz ukázka:

 int mojePole[20];

V ukázce je deklarováno pole o dvaceti prvcích, z nichž každý bude typu int. Kompilátor si tedy v paměti vyhradí dostatek paměti pro uchování všech dvaceti prvků. Vzhledem k tomu, že v našem případě je prvků dvacet a jsou typu int, bude v paměti vyhrazeno 20 x 4B (velikost int jsou 4 bajty), čili celkem 80 bajtů.

Prvky pole

Prvky pole se číslují od nuly, proto k prvnímu prvku přistoupíme takto:

 // Do prvního prvku v poli přiřazujeme hodnotu 5
mojePole[0] = 5;

Stejným způsobem můžeme i ostatním prvkům přiřadit hodnoty. Naše pole má velikost dvacet prvků, nezapomínejte však, že první prvek je vlastně nultý, proto poslední prvek nemá index 20, ale 19. Jde o poměrně častou začátečnickou chybu, proto si na ní dávejte pozor.

Co se stane, když zapíšeme hodnotu za konec pole?

V případě, že zapisujeme hodnotu do nějakého prvku v poli, kompilátor si spočítá, kam se má hodnota uložit a to podle velikosti jednotlivých prvků a indexu. Chceme-li tedy například zapsat hodnotu na mojePole[20], což je jednadvacátý prvek, kompilátor znásobí odsazení (20) velikostí jednoho prvku (v našem případě 4) a pak se posune o zjištěný počet bajtů (80) od začátku pole a hodnotu zapíše na danou pozici.

Zjednodušeně řečeno, kompilátoru je jedno, jestli Vámi zadaný prvek existuje či nikoliv. Spočítá pouze jak daleko za první prvek se má posunout a pak přepíše cokoliv, co se vyskytuje na daném místě. Může se jednat téměř o jakákoliv data, proto zápis za konec pole může mít nepředvídatelné následky. Proto ještě jednou zdůrazňuji, dávejte si na to opravdu velký pozor.

Inicializování polí

Stejně jako obyčejné proměnné, tak i pole lze inicializovat již při deklaraci. Za název pole napíšete rovnítko a do složených závorek uvedete seznam hodnot, oddělených čárkami. Například takto:

 int malePole[5] = {3, 5, 2, 1, 0};

V ukázce jsme vytvořili pole o pěti prvcích, kde první prvek má hodnotu 3, druhý 5, třetí 2 atd. Je to tedy stejné, jako tento zápis:

 int malePole[5];

malePole[0] = 3;
malePole[1] = 5;
malePole[2] = 2;
malePole[3] = 1;
malePole[4] = 0;

Program - průměr známek ve škole

Nyní si napíšeme jednoduchý program na výpočet průměru několika čísel. Předem podotýkám, že program nebude napsán tak, jak by ho napsal asi každý programátor, protože nám půjde pouze o porozumění práci s polem. V dalším díle, kde se naučíme cykly, si tento program napíšeme znovu, ale mnohem jednodušeji. Rozdíl bude určitě patrný.

Chceme tedy napsat program, do kterého uživatel zadá pět čísel, řekněme, že to budou například známky, které dostal ve škole a program mu vypočítá jeho průměr. Všechny známky si uložíme do pole s názvem znamky a pak vypočítáme průměr. Asi nemusím připomínat, že průměr vypočteme jako součet jednotlivých známek vydělený celkovým počtem známek.

 #include <iostream>
using namespace std;


int main()
{
    
int znamky[5];

     cout <<
"Zadej prvni znamku: ";
     cin >> znamky[0];
    
     cout <<
"Zadej druhou znamku: ";
     cin >> znamky[1];

     cout <<
"Zadej treti znamku: ";
     cin >> znamky[2];

     cout <<
"Zadej ctvrtou znamku: ";
     cin >> znamky[3];

     cout <<
"Zadej patou znamku: ";
     cin >> znamky[4];

    
int soucet = znamky[0] + znamky[1] + znamky[2] + znamky[3] + znamky[4];
    
double prumer = soucet / 5;

     cout <<
"Tvuj prumer je " << prumer << ".\n";

    
return 0;
}

Na začátku funkce main deklarujeme pole o pěti prvcích, přičemž každý prvek je typu int. Poté postupně ukládáme hodnoty, které uživatel zadá, do našeho pole. Ještě jednou připomínám, naše pole má indexy 0, 1, 2, 3 a 4. Dále jsme si vytvořili proměnnou soucet, do které uložíme součet všech známek. Nakonec vypočteme průměr, který uložíme do proměnné prumer. Tato proměnná je typu double, neboť průměr nemusí být vždy celé číslo.

Za domácí úkol si zkuste napsat tentýž program, jen s tím rozdílem, že známek nebude pět, ale tisíc. Předpokládám, že do toho se asi nikomu chtít nebude, proto vězte, že jsem si dělal legraci. Museli byste totiž napsat poměrně dlouhý kód, kde by se vyskytovalo samé cout a cin. Program by samozřejmě fungoval, kompilátor by si s tím poradil bez nejmenších problémů, ale psát by se to nechtělo nikomu. To, že by uživatel musel zadávat tisíc hodnot je věc druhá.

V dalším díle si tento program napíšeme znovu – jinak, lépe a pohodlněji. Funkčnost bude naprosto stejná, námaha však minimální a to i bez ohledu na to, z kolika známek budeme průměr počítat.

Co se týče polí, rozhodně jsme si v tomto díle neřekli vše. Nezmínili jsme se o vícerozměrných polích, polích ukazatelů, dynamické alokaci paměti apod. Je to totiž o něco málo složitější, proto tomu bude věnován jeden z pozdějších dílů. To, co jsme se ale dověděli dnes nám bude prozatím stačit.

V příštím díle se podíváme na cykly (někdy též smyčky), které poté využijeme při práci s poli. Poté už budeme schopni napsat i některé algoritmy pro třídění nebo vyhledávání prvků v poli. O tom by měla být řeč v devátém díle.


> Na začátek

 

Hodnocení:

Hlasů: 15
Zvolte své hodnocení

Petr Sklenička

Jsem studentem Vysoké školy Báňské v Ostravě. V poslední době dost programuji v jazyce Java, konkrétně aplikace pro platformu Android. Dále mě zajímá programování v C++, typografický systém latex a spousta dalších maličkostí.

Související články

DílNázev článku 
Díl 1. Úvod, příprava na psaní aplikací v C++ 8. 6. 2010
Díl 2. První program 15. 6. 2010
Díl 3. Proměnné a konstanty 22. 6. 2010
Díl 4. Relační operátory a podmínky, příkaz switch 29. 6. 2010
Díl 5. Pole 13. 7. 2010
Díl 6. Cykly, neboli smyčky 26. 10. 2010
Díl 7. Cykly, neboli smyčky - pokračování 19. 11. 2010
Díl 8. Funkce 18. 12. 2010
Díl 9. Ukazatele a odkazy, vyhledávání půlením intervalu 26. 1. 2011
Díl 10. Úvod do objektově orientovaného programování 10. 3. 2011
Díl 11. Konstruktory, destruktory a hrátky s objekty 28. 5. 2011
Díl 12. Dědičnost 24. 7. 2011
Díl 13. Virtuální metody 1. 2. 2012

RSS Feed RSS Feed

Diskuse

Další díly

Datum: 17.10.2010 14:16
Autor: neregistrovaný (88.103.170.137)
Hodnocení autora: není
Příspěvků: 0
Kdem můžu najít další díly tohoto seriálu?
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

WinForms

Datum: 24.10.2010 9:13
Autor: Milan Suk
Hodnocení autora: 33
Příspěvků: 91
Ahoj

Chtěl jsem se zeptat,jak se je to s tvorbou Windows Forms v C++?
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: WinForms

Datum: 2.11.2010 15:28
Autor: neregistrovaný (88.208.88.196)
Hodnocení autora: není
Příspěvků: 0
Co by s ní mělo být? Ptáte se přesně na co? Naučte se alespoň specifikovat dotaz.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: WinForms

Datum: 4.11.2010 19:09
Autor: Milan Suk
Hodnocení autora: 33
Příspěvků: 91
Chtěl jsem se prostě zeptat, jak se v C++ tvoří klasické okenní aplikace, jestli je to něco jako třeba třeba u Visual Basic, popř. C# atd...
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: WinForms

Datum: 27.12.2010 10:12
Autor: neregistrovaný (82.99.180.134)
Hodnocení autora: není
Příspěvků: 0
Ano existuji na to knihovny napr. Qt
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: WinForms

Datum: 26.1.2011 13:44
Autor: Tomáš Jecha
Hodnocení autora: 697
Příspěvků: 1285
Na tom dotazu nebylo nic k nepochopení.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: WinForms

Datum: 26.1.2011 14:37
Autor: Petr Sklenička
Hodnocení autora: 82
Příspěvků: 80
Poměrně jednoduché to je ve vývojovém prostředí C++ Builder XE. Tam se to dělá velice podobným způsobem na jaký jste (pravděpodobně) zvyklý.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Maximální velikost

Datum: 27.7.2011 17:21
Autor: neregistrovaný (77.48.99.148)
Hodnocení autora: není
Příspěvků: 0
Dobrý den, mám dotaz ohledně maximálního počtu prvků v pli a maximálním počtu rozměrů. Popřípadě návrhy jak by se daly vytvořit větší pole než jaká standardně jazyk c++ nabízí. Tím myslím pole s například 1M hodnot. Zatím jsem to řešil dvouma rozměrama po 100k ale jestli neexistuje něco elegatnějšího...
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.