-
Deklarace
typ deklarátor[konstantní_výraz]
deklaruje pole složené z prvků typu typ. Pole zaujímá spojitou
oblast paměti a má přesně takovou velikost, aby obsáhlo všechny své prvky.
Výsledkem konstantního výrazu musí být celé kladné číslo (určuje počet
prvků pole). Prvky pole mají indexy od 0 do "počet prvků pole - 1".
Např. můžeme deklarovat pole s prvky typu int, které bude obsahovat
pět celočíselných hodnot. Deklarace tohoto pole může vypadat takto:
int mojePole[5];
V tomto případě překladač alokuje pole podle následujícího obrázku
(každý prvek typu int vyžaduje pro uložení 4 slabiky; celé pole
zabírá 20 slabik):
mojePole[0] |
mojePole[1] |
mojePole[2] |
mojePole[3] |
mojePole[4] |
adresaPočátku |
adresaPočatku+4 |
adresaPočátku+8 |
adresaPočátku+12 |
adresaPočátku+16 |
Nyní, když již máme pole deklarované, můžeme jej zaplnit hodnotami:
mojePole[0] = -200;
mojePole[1] = -100;
mojePole[2] = 0;
mojePole[3] = 100;
mojePole[4] = 200;
Jak vidíme v předchozí ukázce, jednotlivé prvky pole jsou zpřístupňováné
operátorem indexace. Můžeme tedy použít i tento příkaz:
int vysledek = mojePole[3]
+ mojePole[4]; // výsledek bude
300
Inicializaci pole lze provádět současně s deklarací. Provedeme to např.
příkazem:
int mojePole[5] =
{ -200, -100, 0, 100, 200};
Toto použijeme, pokud známe počet prvků pole. Velikost ale lze také
vynechat. Když použijeme příkaz:
int mojePole[] =
{ -200, -100, 0, 100, 200};
pak překladač spočítá uvedené prvky pole a informaci o velikosti si
doplní sám.
Vícerozměrná pole se deklarují jako pole polí, tedy např. dvourozměrné
pole s pěti řádky a sedmi sloupci se jménem alfa a typem int
deklarujeme takto:
int alfa[5][7]
Za jistých podmínek nemusí být uvnitř prvních hranatých závorek žádný
výraz. Takovéto pole má potom neurčenou velikost a nazýváme je otevřené.
Jeho deklarace je možná tam, kde není potřeba znát velikost pole pro rezervování
paměťového prostoru (např. při deklaraci parametru funkce).
Výraz typu pole je převeden na konstantní ukazatel, který ukazuje na
nultý prvek tohoto pole.
Je zapotřebí dávat pozor, abychom nepřekročili konec pole (jazyk C++
nekontroluje překročení hranic pole). Pokud použijeme následující kód:
int pole[5];
pole[5] = 10;
pak to pravděpodobně způsobí zhroucení našeho programu. Přepíšeme totiž
nějakou informaci, která je v paměti uložena za koncem pole.
-
S používáním polí se seznámíme v následující konzolové aplikaci. Máme vytvořit
program, který přečte z klávesnice hodnotu přirozeného čísla N a
posloupnost reálných hodnot a1, a2, ..., an
a
určí, který prvek se nejvíce přibližuje průměrné hodnotě vstupní posloupnosti.
Je-li takových prvků více, zajímá nás ten, který má nejnižší index. Bude
zřejmě nutné projít celou posloupnost vstupních hodnot dvakrát. Při prvním
průchodu budeme prvky sčítat, abychom mohli určit jejich průměrnou hodnotu,
ve druhém průchodu hledáme prvek nejbližší zjištěnému průměru. Tento dvojí
průchod nelze zajistit přímo při čtení údajů a je tedy třeba údaje uložit
do paměti (použijeme k tomu typ pole). Neznáme ale předem požadovaný počet
prvků pole, a tak volíme jako horní mez indexu nějakou hodnotu o které
budeme předpokládat, že ji při výpočtu nepřekročíme. Hrubý popis řešení
má tvar:
čtení a ukládání
prvků pole
sečtení prvků pole
a výpočet průměrné hodnoty
zjištění prvku s
minimální odchylkou od průměru
výpis výsledků
Výpočet průměrné hodnoty a zjištění prvku s minimální odchylkou budeme
provádět pomocí funkcí. Výsledný program má tvar:
float prumer(int
n, float x[]);
int minodch(int n,
float x[], float prum);
int i, n, im;
float pole[100],
prum;
int main(int argc,
char **argv)
{
cout <<
"Zadej počet prvků pole: ";
cin >> n;
cout <<
"Zadávej jednotlivé prvky pole: ";
for (i = 0;
i < n; i++) cin >> pole[i];
prum = prumer(n,
pole);
im = minodch(n,
pole, prum);
cout <<
"Index prvku " << im << " hodnota prvku " << pole[im];
return 0;
}
float prumer(int
n, float x[])
{
float s =
0;
int i;
for (i = 0;
i < n; i++) s += x[i];
return s/n;
}
int minodch(int n,
float x[], float prum)
{
float rozd,
min;
int i, index
= 0;
min = fabs(prum
- x[0]);
for (i = 0;
i < n; i++) {
rozd = fabs(prum - x[i]);
if (rozd < min) {
min = rozd;
index = i;
}
}
return index;
}
Pokuste se pochopit, jak uvedená aplikace používá pole. Vyzkoušejte.
Funkce fabs počítá absolutní hodnotu z typu
float
(je v hlavičkovém souboru math.h).
-
Vytvořte konzolovou aplikaci, která z klávesnice přečte N (kde N<=
100) reálných čísel a uloží je do pole. Z těchto čísel dále určete minimální
a maximální hodnotu, jejich součet a průměrnou hodnotu.
-
Je dána posloupnost N celých čísel z intervalu <1, 5> (např.
známek). Vytvořte konzolovou aplikaci zjišťující četnosti výskytu jednotlivých
číslic v této posloupnosti. Využijte toho, že hodnoty prvků jsou ze zmíněného
intervalu (hodnota čísla může tvořit index v poli četností jednotlivých
čísel).
-
Následující konzolová aplikace počítá na základě počtů jednotlivých druhů
mincí a bankovek celkovou částku.
int main(int argc,
char **argv)
{
int i, p;
int s = 0,
h[15] = {10, 20, 50, 100, 200, 500, 1000,
2000, 5000,
10000, 20000, 50000, 100000, 200000, 500000};
for (i = 0;
i < 15; i++) {
if (h[i] < 100) cout << "Zadej počet " << h[i] <<
" haléřů: ";
else cout << "Zadej počet " << h[i]/100 << " korun: ";
cin >> p;
s += (p * h[i]);
}
cout <<
"Celková částka je " << s/100 << " a " << s%100 <<
" haléřů." << endl;
}
V této aplikaci je provedena inicializace prvků pole (červená část
programu). Program vyzkoušejte a pokuste se pochopit jak pracuje.
-
Vytvořte konzolovou aplikaci řešící opačnou úlohu: pro zadanou částku (zadanou
v haléřích, dělitelnou 10) sestavte program, který určí její vyjádření
s použitím co nejmenšího počtu platidel.