Dneska si preberieme jednoduché polia v C++ pekne pomaly, aby ste ich pochopili.
Úvod do polí
Pole je forma dát, ktoré môžu obsahovať niekoľko hodnôt rovnakého typu. Poľu je možné uložiť napr.: 365 hodnôt typu int, keď spracuvávate údaje o dňoch v roku. Každá hodnota prezentuje samostatný prvok a počítač ich ukľadá za sebou.
Pole je vytvarané pomocou deklaračného príkazu. Deklarácia poľa by mala obsahovať tri informácie:
- Typ hodnoty, ktorá má byť uložená do každého prvku.
- Meno poľa.
- Počet prvkov poľa.
int days[365]; // vytváram pole int s 365 prvkami
Každý prvok je samostatnou premennou, ktorú môžeme považovať za jednoduchú premennú.
Takto vyzerá obecný typ deklarácie poľa:
menoTypu menoPola[pocetPrvkov];
Výraz pocetPrvkov musí byť typu const alebo konštantný vyraz, pre ktorý sú všetky hodnoty v dobre prekladu známe. Čiže nemôže to byť premenná, ktorú meníme za behu programu. Ale neskôr si ukážeme, ako obísť pomocou operátoru new.
Veľa užitočných vlastností vyplýva zo skutočnosti, že k prvkom poľa sa pristupuje pomocou indexov, čiže jednotlivo. Indexi číslujú jednotlivé prvky (premenné). Pole v C++ začína od nuly a končí pri indexe (pocetPrvkov-1). Napr.: začína na days[0] a končí na days[364]. Deklarácia poľa dovoľuje vytvoriť veľa premenných jednou deklaráciou. Identifikáciu a prístup k jednotlivým prvkom obstarávajú indexy. Môžeme si ukázať príklad na cukríkoch:
//pole1.cc -- jednoduche pole
#include
using namespace std;
int main() {
int cukrik[3]; //vytvoril som pole s troma prvkami
cukrik[0]=7;
cukrik[1]=8;
cukrik[2]=10;
int cenaCukrik[3] = { 20, 25, 40}; //vytvaram a inicializujem pole
cout << "Celkovy pocet fajnych cukrikov je ";
cout << (cukrik[0]+cukrik[1]+cukrik[2]) << "\n";
cout << "Balicek kde je "<< cukrik[0]<< " cukrikov stoji "<< cenaCukrik[0];
cout << " korun za jeden cukrik. \n";
int vsetko=cukrik[0]*cenaCukrik[0]+cukrik[1]*cenaCukrik[1]+cukrik[2]*cenaCukrik[2];
cout << "Vsetky cukriky v balickoch by stali : "<< vsetko << "\n";
cout << "Velkost pola s cukrikmi je "<< sizeof(cukrik) << " bajtov. \n";
cout << "Velkost jedneho prvku je "<< sizeof(cukrik[0]) << " bajtov. \n";
return 0;
}
Očakávaný výstup:
Celkovy počet fajných cukríkov je 25
Balicek kde je 7 cukrikov stojí 20 korun za jeden cukrik.
Všetky cukríky v balíckoch by stáli: 740
Veľkosť poľa s cukríkmi je 12 bajtov.
Veľkost jedného prvku je 4 bajty.
Program najprv vytvára trojprvkové pole cukrik. Jeho prvky sú očíslované od 0 do 2, prvky sú typu int. Môžeme si povedať, že tento postup je zdĺhavý. Preto v C++ dokáže inicializáciu prvkov aj deklaračnom príklade. Ako sme si ukázali:
int cenaCukrik[3] = { 20, 25, 40}; //vytvaram a inicializujem pole
jednoducho poskytuje zoznam hodnôt oddelených čiarkou a uzatvorený zloženými zátvorkami. Ďalej program používa hodnoty poľa v niekoľkých výpočtoch. Táto časť programu možno vyzerá neprehľadná, ale to vyriešime v ďalších kurzoch, ked sa naučíme cykly. Spomenme si ešte na operátor sizeof, ktorý vracia veľkosť typu alebo dátového objektu v bajtoch. Požil som ho, aby som Vám dokázal, že pole ma vážne prvky nášho poľa typu int.
Pravidlá inicializácie poľa
V C++ je niekoľko pravidiel, ktoré určujú kedy ich môže používať a čo sa stane, ak počet prvok neodpovedá počtu hodnôt v inicializácii. Pole je možné inicializovať iba v definícii. Príklad:
int karty[4]={3, 6, 8, 10}; //spravne
int karty2[4]; //spravne
karty2[4]={3, 6, 8, 10}; //nespravne
karty2=karty; //nespravne
Stále môžeme pre priradenie používať indexy. Pri inicializácii sa dá dodať aj menej hodnôt ako má pole. Napr.: inicializácia iba dvoch prvých hodnôt: float jotelTips[5]={5.0, 13.9};
Pri čiastočnej inicializácii nastaví prekladač ostatné prvky na nulu. Je jednoduché inicializovať všetky prvky na nulu napr.: float jotejTips[5]={0};
Ak pri inicializácii poľa necháme hranaté zátvorky prázdne prekladač si sám spočíta prvky poľa. Napr.: short things[]={1, 5, 3, 8};
Nie je najlepšie nechať počítanie prvok na prekladači nie je to dobrý zvykom programátora.
Záverom a úloha.
Prebrali sme si základy polí ešte to nie je všetko čo polia dokážu ale všetko príde postupne, dneska nebudem zadávať domácu úlohu. Stačí to pochopiť a môžeme sa vrhnúť ďalej.