$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Nizovi

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Koshi
  • 7/24/2015

Petlje su nam omogućile da na kratak način opišemo repetitivne postupke koji mogu biti veoma dugački. Još jedan element nam nedostaje da bismo mogli većinu takvih postupaka da jednostavno opišemo.

 

Recimo da imamo problem gde nam je potrebno da unesemo 100 brojeva u program. Da ne bismo imali cin komandu 100 puta u programu za ovako nešto želimo da upotrebimo petlju. Ipak kada pokušamo da je upotrebimo javlja se nekoliko problema.

 

Prvo moramo da definišemo 100 promenljivih u koje ćemo smestiti te brojeve. Za ovo ne možemo da upotrebimo petlju. Ako bismo probali da uradimo nešto tipa:

 

#include <iostream>

 

using namespace std;

 

int main()

{

for (int i = 0; i < 100; i++)

{

int broj;

}

}

 

Prvo, promenljiva broj ne bi bila definisana van petlje. Drugo, čak i kada bi bila, u svakom prolazu kroz petlju ponovo definišemo istu promenljivu, nemamo način da kažemo u petlji da hoćemo novu promenljivu u svakom prolazu.

 

Postoji način da jednom komandom definišemo koliko god želimo promenljivih. Ovaku grupu promenljivih nazivamo niz. Niz se definiše vrlo slično običnoj promenljivoj. Tako ako recimo hoćemo da definišemo niz od 100 celobrojnih promenljivih kao što nam treba u našem primeru to bismo uradili sledećom komandom:

 

int brojevi[100];

 

Ova komanda definiše u memoriji niz od 100 promenljivih pod nazivom "brojevi". Promenljive koje čine ovaj niz su numerisane od 0 do 99. Obratite pažnju, numerisanje uvek počinje od 0 i ide do dužine niza minus 1. Evo kako to izgleda u memoriji:

 

 

Kako pristupamo ovim promenljivim? Tako što posle imena niza u uglastim zagradama prosledimo kom elementu želimo da pristupimo. Tako na primer, ako želimo da pristupimo prvom elementu u nizu, koji ima indeks 0, to radimo tako što napišemo brojevi[0].

 

Kada pristupimo elementu niza možemo sa njim raditi sve što možemo i sa običnom promenljivom: koristiti ga u računici, postavljati mu vrednost, itd.

 

Pogledajmo jedan primer, gde ćemo naznačiti u komentarima koje je stanje u memoriji nakon svake komande:

 

#include <iostream>

 

using namespace std;

 

int main()

{

int brojevi[3];

// brojevi[0]: nije definisano

// brojevi[1]: nije definisano

// brojevi[2]: nije definisano

 

brojevi[0] = 2;

// brojevi[0]: 2

// brojevi[1]: nije definisano

// brojevi[2]: nije definisano

 

brojevi[2] = 4;

// brojevi[0]: 2

// brojevi[1]: nije definisano

// brojevi[2]: 4

 

brojevi[1] = brojevi[0] + brojevi[2];

// brojevi[0]: 2

// brojevi[1]: 6

// brojevi[2]: 4

}

 

Kada hoćemo da pristupimo elementu niza ne moramo obavezno napisati samo broj u uglastim zagradama. Možemo u njih staviti bilo koji izraz koji kada se izračuna ima celobrojnu vrednost. Pogledajmo sledeći primer:

 

#include <iostream>

 

using namespace std;

 

int main()

{

int indeks = 0;

int brojevi[3];

// brojevi[0]: nije definisano

// brojevi[1]: nije definisano

// brojevi[2]: nije definisano

 

brojevi[indeks] = 1;

// brojevi[0]: 1

// brojevi[1]: nije definisano

// brojevi[2]: nije definisano

 

brojevi[indeks + 1] = 2;

// brojevi[0]: 1

// brojevi[1]: 2

// brojevi[2]: nije definisano

 

brojevi[indeks + 2] = 5;

// brojevi[0]: 1

// brojevi[1]: 2

// brojevi[2]: 5

}

 

Niz se ne mora sastojati od celobrojnih promenljivih, već može biti bilo kog tipa koji smo do sada videli. Tako na primer možemo imati:

 

#include <iostream>

 

using namespace std;

 

int main()

{

string reci[3];

// reci[0]: nije definisano

// reci[1]: nije definisano

// reci[2]: nije definisano

 

reci[2] = "zoveš?";

// reci[0]: nije definisano

// reci[1]: nije definisano

// reci[2]: "zoveš?"

 

reci[0] = "Kako";

// reci[0]: "Kako"

// reci[1]: nije definisano

// reci[2]: "zoveš?"

 

reci[1] = "se";

// reci[0]: "Kako"

// reci[1]: "se"

// reci[2]: "zoveš?"

 

cout << reci[0] + " " + reci[1] + " " + reci[2] << endl;

// Ispisuje se: "Kako se zoveš?"

}

 

Uradimo još jedan primer da bi se uhodali u radu sa nizovima. Recimo da se unosi broj n, a zatim n brojeva između 1 i 10. Ono što hoćemo da uradimo je da ispišemo koliko puta se svaki od brojeva pojavio. Pogledajmo kako bismo to uradili:

 

#include <iostream>

 

using namespace std;

 

int main()

{

int n;

cin >> n;

 

/*

Definišemo niz u kome ćemo za svaki broj

od 1 do 10 pamtiti koliko puta se pojavio.

Definišemo ovaj niz dužine 11, jer želimo da

koristimo elemente od 1 do 10 uključujući i

10. Da smo definisali niz dužine 10 imali bi

samo elemente od 0 do 9.

*/

 

koliko_puta[11];

 

// Pošto su vrednosti promenljivih u nizu nedefinisane, moramo da ih postavimo na 0.

for (int broj = 1; broj <= 10; broj++)

{

koliko_puta[broj] = 0;

}

 

for (int i = 0; i < n; i++)
{

/*

Unutar petlje definišemo promenljivu u kojoj

ćemo učitati sledeći broj. Uoči da nemamo niz u

kome pamtimo sve ove brojeve, to nam nije potrebno,

samo pamtimo koliko puta se svaki pojavio.

*/

 

int novi_broj;

cin >> novi_broj;

 

// Uvećamo broj pojavljivanja broja koji smo učitali za 1.

koliko_puta[novi_broj]++;

}

 

// Na kraju za svaki broj ispišemo koliko puta se pojavio.

for (int broj = 1; broj <= 10; broj++)

{

cout << "Broj " << broj << " se pojavljuje " << koliko_puta[broj] << endl;

}

 

}