NIZOVI U C++ JEZIKU

​Uvod: Šta su nizovi u C++ i zašto su važni?

Nizovi su osnovni tip podatkovne strukture u C++ jeziku koji omogućava skladištenje i upravljanje većim skupovima podataka istog tipa. Možete ih zamisliti kao niz numerisanih pregrada koje čuvaju vrednosti na organizovan način, omogućavajući brz i efikasan pristup svakom elementu.
Na primer, ako želite da sačuvate rezultate ispita za grupu od 50 učenika, umesto da kreirate 50 pojedinačnih promenljivih, možete koristiti niz sa 50 elemenata, čime pojednostavljujete kod i olakšavate manipulaciju podacima.

​Zašto su nizovi važni?

✅ Organizacija podataka – Omogućavaju jednostavno grupisanje povezanih podataka pod jednim imenom.
✅ Brzi pristup – Zahvaljujući indeksiranju, pristup bilo kojem elementu traje isto vreme, bez obzira na veličinu niza.
✅ Efikasnost koda – Omogućavaju kompaktniji kod i lakšu manipulaciju podacima u poređenju sa pojedinačnim promenljivima.
✅ Osnova za napredne strukture – Mnoge složenije strukture podataka, poput vektora, matrica, steka i redova, baziraju se na konceptu nizova.
U ovom članku ćemo istražiti osnovne koncepte nizova u C++ jeziku, uključujući njihovu deklaraciju, inicijalizaciju, pristup elementima, rad sa višedimenzionalnim nizovima i primere iz prakse. Takođe ćemo uporediti tradicionalne C++ nizove sa modernijim pristupima poput std::array i std::vector iz Standardne biblioteke (STL).

​Primer upotrebe niza u C++

Nizovne promenljive se koriste kad je potrebno upamtiti u memoriji više podataka istog tipa npr. int. Posmatrajmo sledeći zadatak: Potrebno je uneti ocene iz n predmeta i izračunati najveću ocenu.
Rezervišemo memoriju za podatak ocena, a zatim koristeći for ciklus pokušamo da unesemo n ocena(npr. n=5):

intocena, n = 5;
    // Učitavanje nizafor (inti = 0; i < n; i++) {
      
cout << "Ucitaj " << (i + 1) << ". ocenu"; cin >> ocena;
}
​Međutim, pošto ocena pamti samo jedan broj, po izlasku iz for ciklusa biće upamćena samo poslednja ocena. Zadatak na ovaj način neće moći da se reši. Ne može se dalje, odredjivati najveća ocena(maximum), pošto nisu upamćene sve ocene. Ocene bi se mogle upamtiti kada bi smo umesto obične promenljive koristili nizovnu promenljivu, koja može sačuvati više podataka istog tipa. Uvedimo niz:
int ocene[n];
…
Naziv niza je: ocene.Prethodni izraz rezerviše memoriju za n celih brojeva, jer vrednost u uglastoj zagradi zapravo je dimenzija niza.Picture
Slika 1: Definisanje niza
​Na slici je prikazana memorija koja je rezervisana za niz od 5 elemenata. Brojevi ispod polja predstavljaju indeks polja niza. Prvi član niza ima index 0, a poslednji n-1, tj. u ovom slučaju to je 4. Ako želimo da u polje sa indeksom 2(treće polje) unesemo ocenu 5 napisali bi smo:

ocene[2]=5;
​

Evo kako bi izgledalo stanje u memoriji u tom slučaju:Slika 2: Pristupanje elementima  niza
Slika 2: Pristupanje elementima niza
Unošenje ocena korišćenjem cin naredbe za unos, kroz for petlju bi sada izgledalo:
intocene[5], n = 5;
    // Učitavanje nizafor (inti = 0; i < n; i++) {
      
cout << "Ucitaj " << (i + 1) << ". ocenu"; cin >> ocene[i];
}
​Niz ocena bi se popunjavao redom kroz cikluse. U 1. ciklusu kada je i=0, vrednost uneta na standardnom ulazu bi otišla u polje sa indeksom 0, u 2. ciklusu kada je  i=1 u polje ocene[1], a to je drugo polje po redu i tako do kraja niza. Na kraju for ciklusa stanje u memoriji bi izgledalo npr.Picture
Slika 3: Primer niza, sa stanjem u memoriji

Određivanje najveće vrednosti niza(maksimum)

Sada kada su sve ocene upamćene u memoriji možemo ih po potrebi izvući i recimo odrediti najveću ocenu max.
Maksimalna ocena se određuje na sledeći način:
int max = ocene[0];
Prvo se definiše celobrojna promenljiva koja će predstavljati maksimalnu ocenu i pretpostavi se da je jednaka prvoj oceni u nizu, tj. početna vrednost joj je ocene[0]. Dalje se otvara for ciklus i kroz ciklus se redom pristupa sledećoj oceni po redu ocene[i]. Proverava se u svakom ciklusu da li je nova ocena možda veća od trenutnog maksimuma i ako jeste ta vrednost postaje maksimum. To izgleda ovako:for(int i = 0; i<n; i++)
{
            if(ocene[i]>max){
                        max=ocene[i];
            }
}
​Kada se ciklus završi promenljiva max predstavlja najveću ocenu. 

​Određivanja maksimalne sume uzastopnog podniza

Unutar jednodimenzionalnog niza brojeva potrebno je pronaći podniz uzastopnih brojeva koji imaja najveću sumu(zbir). Npr za niz:
3,5,-10,-34,16 2
najveću sumu ima podniz 16, 2 koja iznosi 18.
Kompletno objašnjenje i animaciju koja objašnjava algoritam pogledajte na stranici:
​Maksimalna suma podniza
Određivanje maksimalne sume uzastopnog podniza
Slika 4: Određivanje maksimalne sume uzastopnog podniza

Deklarisanje i definisanje nizova

Definicija niza od 10 celih brojeva(tada se i rezerviše memorija za taj niz:

​int niz[10];
​
Ovo će obezbediti mesto u memoriji za 10 celih brojeva. Ako bi smo pokušali da pristupimo 11-tom elementu niza program bi prekinuo izvršavanje na tom mestu zbog greške.
Nedostatak nizova je u tome što, kad unapred neznamo koliko će niz sadržati elemenata moramo da rezervišemo više mesta nego što očekujemo, za svaki slučaj. Deo tih mesta verovatno će ostati neiskorišćen ali neće doći do prekida programa zbog toga.
Mogućnost da se rezerviše broj mesta tačno onoliko koliko će biti potrebno rešava se upotrebom kolekcija, ali to je predmet izlaganja na višem kursu.

Definisanje realnog niza

Realni niz se definiše slično kao i celobrojni, s tim da umesto int stoji double ili float.
​
float  niz[10]; ili
double niz[10];

Davanje vrednosti članovima  niza

​Elementima niza se pristupa pomoću indeksa koji počinju od 0. Na primer za niz realnih brojeva od 5 elemenata definisanje i zadavanje vrednosti elementima bi bilo:

doubleniz[5];
    niz[0] = 1.1;
    niz[1] = 2.0;
    niz[2] = 2.5;
    niz[3] = -1.6;
    niz[4] = 3.3;
  
Niz bi tada izgledao:Picture

Davanje vrednosti članovima  niza kada su one unapred poznate

Ako unapred znamo vrednosti elemenata niza onda se inicijalizacija niza vrši zajedno sa definisanjem niza. Prethodni niz se inicijalizuje na sledeći način:

double niz[]={1.1, 2.0, 2.5, -1.6, 3.3 };

​Detaljnije objašnjenje sintakse nizova u C++

U C++ jeziku, nizovi se koriste za skladištenje više podataka istog tipa pod jednim imenom. Evo osnovnih elemenata sintakse koje treba razumeti:

1. Deklaracija niza


​Niz se deklariše tako što se prvo navede tip podataka, zatim ime niza, a potom u uglastim zagradama [] broj elemenata koje niz može da sadrži.
Sintaksa:
tip_podatkaime_niza[veličina]; 
  
Ovo rezerviše prostor u memoriji za 5 celobrojnih vrednosti, ali njihova početna vrednost nije definisana.

2. Inicijalizacija niza

Postoji više načina da se niz inicijalizuje vrednostima:
intbrojevi[5] = {1, 2, 3, 4, 5}; // Svi elementi su eksplicitno definisani

intbrojevi[] = {10, 20, 30}; // Veličina niza je automatski određena na 3
          Ako navedete manji broj vrednosti, ostali elementi će biti postavljeni na 0 (za osnovne tipove podataka).
intbrojevi[5] = {1, 2}; // Preostali elementi će biti 0

3. Pristup elementima niza

​Elementima niza se pristupa pomoću njihovog indeksa (počevši od 0).
intbrojevi[3] = {5, 10, 15}; 
    cout << brojevi[0]; // Ispisuje 5

4. Unos i ispis niza pomoću petlje

​Pošto su nizovi sekvencijalne strukture, lako se mogu koristiti sa petljama:
intocene[5]; // Deklaracija nizafor (inti = 0; i < 5; i++) { 
        cout << "Unesite ocenu: "; 
        cin >> ocene[i]; 
    }

    cout << "Unete ocene su: "; 
    for (inti = 0; i < 5; i++) { 
        cout << ocene[i] << " "; 
    }
  

5. Greške pri radu sa nizovima

​Pristup van opsega:
Ako pokušate da pristupite elementu koji ne postoji, dobićete nepredvidive rezultate.
intbrojevi[3] = {1, 2, 3}; // Deklaracija i inicijalizacija nizacout << brojevi[5]; // Greška - indeks 5 ne postoji
​Neispravna veličina niza:
Veličina niza mora biti konstantna vrednost pri deklaraciji.
intn;
    cin >> n;
    intbrojevi[n]; // Greška u starijim verzijama C++ (umesto toga koristiti `std::vector`)

Testirajte svoj kod ovde!

// Ovde pišite C++ kod...

Primeri upotrebe nizova:

​Primer 1: Učitavanje niza i određivanje pozitivnih

​Tekst zadatka: Učitati n, a zatim učitati n članova celobrojnog niza i odrediti koliko ima pozitivnih.​Rešenje:
Prvo treba učitati n, da bi se mogao definisati niz jer je n dimenzija tog niza:
intn;
    cout << "Unesi broj elemenata niza" << endl;
    cin >> n;
  
Zatim se rezerviše memorija za niz celih brojeva koji će imati n elemenata:
//Definisanje niza od n elemenata

             int niz[n];
​

Sada se mogu učitavati elementi:
​
//Učitavanje nizafor (inti = 0; i < n; i++) {
      
cout << "Ucitaj " << (i + 1) << ". element niza"; cin >> niz[i];
}
Niz se zatim, ispisuje na sledeći način koristeći for ciklus:​
//Ispisivanje nizafor (inti = 0; i < n; i++) {
      
cout << niz[i] << " ";
}
U drugom delu, koristeći for ciklus sa istim parametrima kao i prilikom učitavanja i ispisivanja elemenata niza, brojimo elemente koji su pozitivni:​
//Odredjivanje broja pozitivnih elemenataintbrPozitivnih = 0;
    for (inti = 0; i < n; i++) {
      
if (niz[i] > 0) {
brPozitivnih++;
}
} cout << "Broj pozitivnih je =" << brPozitivnih << endl;

Primer 2: Učitavanje niza i određivanje najvećeg elementa​

Tekst zadatka: Učitati n, a zatim učitati n članova realnog niza i odrediti najveći element.Rešenje:

Prvo moramo da definišemo niz.

intn;
    cin >> n;
    inta[n];
  
Picture​Određivanje maksimuma se može uraditi na sledeći način:
doublemax;
    max = a[0];
  
for (inti = 0; i < n; i++) {
      
if (a[i] > max) {
max = a[i];
}
} cout << "max=" << max << endl;
​​ Određivanje minimuma se vrši na sličan način , samo što se kao uslov proverava da li je tekući član niza manji od pretpostavljenog minimuma.


doublemin;
    min = a[0];
    for (inti = 0; i < n; i++) {
      
if (a[i] < min) {
min = a[i];
}
} cout << "min=" << min << endl;

​Primer 3: Obrtanje niza

Tekst: Prikazati niz u obrnutom redosledu.
#include <iostream>#include <array>int main() {
        int brojevi[] = {1, 2, 3, 4, 5};  // Deklaracija i inicijalizacija nizastd::cout << "Niz u obrnutom redosledu:\\n";  // Ispisuje naslovfor (int i = 4; i >= 0; i--) {  // Petlja za obrtanje nizastd::cout << brojevi[i] << " ";  // Ispisuje elemente niza u obrnutom redosledu
        }

        return0;// Kraj funkcije
    }
  
Izlaz:
Niz u obrnutom redosledu:5 4 3 2 1

​Primer 4: Brojanje pojavljivanja elementa

Tekst: Koliko puta se određeni broj pojavljuje u nizu.​
#include <iostream>int main() {
        int brojevi[] = {1, 2, 3, 2, 4, 2, 5};// Niz brojevaint broj = 2;// Element koji brojimoint count = 0;// Brojač koji čuva broj ponavljanja elementafor (int i = 0; i < 7; i++) {  // Petlja koja prolazi kroz nizif (brojevi[i] == broj) {  // Proverava da li je trenutni element jednak brojucount++;// Ako jeste, uvećava broj ponavljanja
            }
        }

        std::cout << "Element " << broj << " se pojavljuje " << count << " puta u nizu.\\n";  // Ispisuje rezultatreturn0;// Kraj funkcije
    }
  
Izlaz
Element 2 se pojavljuje 3 puta u nizu.

Sortiranje nizova u C++


Neka je dat niz A = {6, 7, 2, 11, 6, 8, -2}. Da bi se ovaj niz sortirao po rastućem ili opadajućem redosledu, mogu se koristiti različiti načini. Jedan od najjednostavnijih načina je korišćenje bibliotečke funkcije std::sort iz zaglavlja <algorithm>.

Napomena: Iako std::sort primarno radi sa iteratorima (kao kod std::vector), može se koristiti i za obične nizove jer pokazivači na početak i kraj niza funkcionišu kao iteratori.

Sortiranje običnog niza u rastućem redosledu


Kada se std::sort pozove bez trećeg parametra, koristi se podrazumevani operator < za poređenje, čime se niz sortira u rastućem redosledu.


#include<iostream>#include<algorithm>// Sortiranje u rastućem redosleduusing namespacestd;

int main() {
    int niz[] = {6, 7, 2, 11, 6, 8, -2};
    int n = sizeof(niz) / sizeof(niz[0]);
    
    sort(niz, niz + n);
    
    for (int i = 0; i < n; i++) {
        cout << niz[i] << " ";
    }
    
    return0;
}
        

Sortiranje običnog niza u opadajućem redosledu


Ako se želi postići opadajući redosled, std::sort se poziva sa trećim parametrom – funkcijom poređenja. Ukoliko funkcija poređenja, na primer opadajuce, vrati true kada je prvi argument veći od drugog, onda će sortiranje biti opadajuće.

Napomena: Ako treći parametar nije prosleđen, std::sort sortira u rastućem redosledu.

Alternativa: Umesto korišćenja gotove funkcije poređenja, može se definisati sopstvena funkcija, na primer:

bool opadajuce(int a, int b) {
    return a > b;
}
            

#include<iostream>#include<algorithm>#include<functional>// Funkcija poređenja za opadajući redosledbool opadajuce(int a, int b) {
    return a > b;
}

using namespacestd;

int main() {
    int niz[] = {6, 7, 2, 11, 6, 8, -2};
    int n = sizeof(niz) / sizeof(niz[0]);
    
    sort(niz, niz + n, opadajuce);
    
    for (int i = 0; i < n; i++) {
        cout << niz[i] << " ";
    }
    
    return0;
}
        

Kako std::sort koristi funkciju opadajuce?

Funkcija opadajuce se prosleđuje kao treći parametar std::sort i koristi se za poređenje dva elementa. Sort algoritam poziva ovu funkciju da bi utvrdio da li element a treba da se nalazi pre elementa b. Ako opadajuce(a, b) vrati true, smatra se da je a veći od b i redosled se postavlja tako da veći elementi dolaze pre manjih.

Upotreba sopstvene funkcije poređenja u std::sort


Hajde da detaljno objasnimo kako std::sort funkcioniše u C++ i kako koristi dodatnu funkciju poređenja kao treći parametar. Kada se pozove std::sort sa tri argumenta, prvi dva argumenta predstavljaju raspon koji treba sortirati, dok treći argument predstavlja funkciju poređenja. Ova funkcija poređenja određuje redosled elemenata tako što za dva elementa a i b vraća true ako je a "pre" b po željenom kriterijumu, odnosno false ako nije.

Na primer, za opadajuće sortiranje, funkcija poređenja treba da vrati true kada je prvi element veći od drugog. U suštini, std::sort će tokom sortiranja pozivati ovu funkciju da bi odlučio kako da postavi elemente u željenom redosledu.

Ako funkcija poređenja nije prosleđena (treći parametar se izostavi), std::sort koristi podrazumevani operator < i sortira u rastućem redosledu.

Primer sopstvene funkcije poređenja za opadajuće sortiranje:

bool opadajuce(int a, int b) {
    return a > b; // Vraća true ako je a veće od b
}
        

Kada se ova funkcija prosledi kao treći parametar, std::sort sortira elemente tako da veći elementi budu pre manjih.

Primer korišćenja funkcije poređenja sa std::sort:

#include<iostream>#include<algorithm>#include<functional>// Funkcija poređenja za opadajući redosledbool opadajuce(int a, int b) {
    return a > b;
}

using namespacestd;

int main() {
    int niz[] = {6, 7, 2, 11, 6, 8, -2};
    int n = sizeof(niz) / sizeof(niz[0]);
    
    sort(niz, niz + n, opadajuce);
    
    for (int i = 0; i < n; i++) {
        cout << niz[i] << " ";
    }
    
    return0;
}
        

Kako std::sort koristi funkciju poređenja?
Tokom sortiranja, std::sort internalno poredi elemente pozivajući funkciju opadajuce (ili bilo koju drugu prosleđenu funkciju poređenja). Na primer, poziv opadajuce(a, b) vraća true ako je a veće od b, čime se određuje da a treba da bude pre b u opadajućem redosledu. Ukoliko funkcija vrati false, elementi se zamene ili se nastavlja poređenje, u zavisnosti od interne implementacije algoritma sortiranja (kao što su quicksort ili introsort).

Moderni C++ koncepti 

Korišćenje std::vector umesto statičkih nizova

Dok su klasični C++ nizovi korisni, oni imaju ograničenja, poput fiksne veličine. Moderni C++ programeri često koriste std::vector, koji omogućava dinamičku alokaciju i upravljanje memorijom.


#include<vector>#include<iostream>using namespace std;

int main() {
    vector<int> brojevi = {1, 2, 3, 4, 5};
    brojevi.push_back(6); // Dodaje novi element
    cout << "Prvi element: " << brojevi[0] << endl;
}

Više o std::vector možete pročitati ovde.

Dvodimenzionalni nizovi i matrice


Nizovi mogu imati više dimenzija, što je korisno za predstavljanje matrica i tabele podataka.


int matrica[2][3] = {{1, 2, 3}, {4, 5, 6}};
cout << "Element matrica[1][2]: " << matrica[1][2] << endl; // Ispisuje 6

Za detaljno objašnjenje dvodimenzionalnih nizova, posetite ovu stranicu.


Slanje nizova kao argumenta funkciji


Ako želimo da prosledimo niz funkciji, koristimo pokazivač ili referencu.

void ispisiNiz(int niz[], int velicina) {
    for (int i = 0; i < velicina; i++)
        cout << niz[i] << " ";
    cout << endl;
}

int main() {
    int brojevi[] = {10, 20, 30, 40};
    ispisiNiz(brojevi, 4);
}

Za više detalja o dinamičkim nizovima i prolasku nizova kroz funkcije, pogledajte ovde.

Dodatni resursi:


​Prethodno
​|<Ugnježdene petlje u C++
Sledeće
​​​Dinamički niz-vector>|

Srodni članci

Petlje u c/c++ programskom jeziku-primeri
Petlje u programskom jeziku JAVA
Nizovi-primeri
Fibonačijev niz
Podaci u C/C++ jeziku