Nizovi
Nizovi su najjednostavniji i najčešće korišteni tipovi struktuiranih podataka koji sadrže grupu podataka istog tipa. Naravno, tim podacima pristupamo preko indeksa. Eh što se tiče njihove primjene to ćeš vjerovatno sam vidjeti kako budeš radio različitije programe sa raznim namjenama :) Ako recimo imaš neki program koji vrši evidenciju bodova neke grupe takmičara, onda ne možeš znati koliko će takmičara biti, prema tome ne možeš deklarisati jednu, dvije, tri varijable ili više, zavisno od broja takmičara za koje ćeš držati bodove, nego moraš koristiti niz da bi mogao držati bodove a i po potrebi vratiti broj bodova za određenog takmičara.
Evo recimo kako bi mogao koristiti dvodimenzionalni niz za iks-oks (kod sam napisao tek' tako u editoru, nemoj uzeti sve zdravo za gotovo, to je samo da otprilike vidis kako bi to islo):
Code:
#include <iostream>
using namespace std;
int g_polja[3][3]; // iks oks matrica
(ostale funkcije)
...
int provjeriPobjednika()
{
if (g_polja[0][0] == g_polja[0][1] && g_polja[0][1] == g_polja[0][2])
return g_polja[0][0]; // tri uzastopne iste vrijednosti, vrati vrijednost
if (g_polja[1][0] == g_polja[1][1] && g_polja[1][1] == g_polja[1][2])
return g_polja[1][0]; // tri uzastopne iste vrijednosti, vrati vrijednost
(ostale provjere)
...
return 0; // nemamo tri uzastopne vrijednosti
}
int main(int argc, char** agrv)
{
int pobjednik = 0;
int brojPoteza = 0;
while(pobjednik == 0 && brojPoteza < 9)
{
nacrtajTabelu();
napraviPotez();
brojPoteza++;
pobjednik = provjeriPobjednika();
}
if (pobjednik == 1)
{
cout << "Pobjednik je iks!\n";
}
else if(pobjednik == 2)
{
cout << "Pobjednik je oks!\n";
}
else
{
cout << "Partija je nerijesena.\n";
}
(ostatak programa)
...
}
Znači, imaš jednostavnu matricu koja ti predstavlja iks oks polja, imaš tri reda i tri kolone. Tako ti je naprimjer
g_polja[1][1] centralno polje, odnosno drugi red, druga kolona. Prvi indeks je broj reda, a drugi broj kolone. Naravno indeksiranje počinje od nule
Funkcije
Funkcije se koriste iz više razloga. Gospodin Steven C. McConnell ima dosta kompletnu listu tih razloga:
- Smanjivanje kompleksnosti
- Kada hoćemo da dio koda napravimo čitljivim
- Izbjegavanje pisanja duplog koda
- Sakrivanje toka izvođenja programa (opet u cilju smanjenja kompleksnosti)
- Sakrivanje operacija sa pokazivačima
- Povećanje portabilnosti koda
- Pojednostavljenje komplikovanih boolean testova
- Unaprijeđenje perfomansi
- Izoliranje kompleksnosti
- Sakrivanje detalja implementacije
- Ograničavanje efekta izmjena
- Sakrivanje globalnih podataka
- Pravljenje centralnih tački kontrole
- Pisanje ponovo iskoristivog koda
- Da bi se poboljšao kvalitet samog koda
Možda su ti neki od ovih razloga sada mutni, ali vremenom ćeš ih sve razumiti. Uglavnom, funkcije se pišu iz razloga da bi se povečao kvalitet koda, njegova čitljivost, izbjeglo duplo pisanje koda i omogučilo lakše izmjenjivanje koda. Ako čitav program možeš zamisliti "u glavi" ako ne moraš o njemu misliti u komadima, dijelovima, onda i ne moraš koristiti funkcije jer se vjerovatno radi o nekom trivijalnom programu. Također, imaj na umu da se kod čita mnogo više puta nego što se piše.
Recimo da imaš po čitavom programu rasut kod koji izračunava neku udaljenost koja se dalje koristi da bi tvoja neka mašina izrezala komad daske:
Code:
udaljenost = brojNekihJedinica / NEKA_KONSTANTA
Onda se izmijeni dizajn mašine i sada imaš neke graničnike čiju širinu moraš uzeti u obzir. Šta radiš u tom slučaju? Promijeniš kod na 1001 mjestu na kojem si ga pisao? U tom slučaju trebao si tu jednu liniju postaviti u posebnu funkciju i onda samo na tom mjestu napraviti izmjenu npr:
Code:
double izracunajUdaljenost(int brojNekihJedinica)
{
return (brojNekihJedinica / NEKA_KONSTANTA) + uzmiSirinuGranicnika();
}
Nije bitno što je čitava funkcija samo jedna linija koda. Na ovaj način si sebi olakšao muke pri debuggiranju, izmjenama dokumentacije i sl.
Eh sada, jel' treba objasniti i parametre funkcija, kakvi mogu biti, kako se trebaju koristit i sl?