NIZOVI U C++ JEZIKU
Uvod: Šta su nizovi u C++ i zašto su važni?
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++
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;}
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.
ocene[2]=5;
Evo kako bi izgledalo stanje u memoriji u tom slučaju:
intocene[5], n = 5; // Učitavanje nizafor (inti = 0; i < n; i++) {cout << "Ucitaj " << (i + 1) << ". ocenu"; cin >> ocene[i];}
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 |
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;
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];
2. Inicijalizacija niza
Postoji više načina da se niz inicijalizuje vrednostima:- Inicijalizacija prilikom deklaracije:
intbrojevi[5] = {1, 2, 3, 4, 5}; // Svi elementi su eksplicitno definisani
- Automatsko određivanje veličine niza:
Ako eksplicitno navedete sve vrednosti, veličinu možete izostaviti:
intbrojevi[] = {10, 20, 30}; // Veličina niza je automatski određena na 3
- Delimična inicijalizacija:
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
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!
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;
//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];}
//Ispisivanje nizafor (inti = 0; i < n; i++) {cout << niz[i] << " ";}
//Odredjivanje broja pozitivnih elemenataintbrPozitivnih = 0; for (inti = 0; i < n; i++) {if (niz[i] > 0) {} cout << "Broj pozitivnih je =" << brPozitivnih << endl;brPozitivnih++;}
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];
- Pretpostavimo da je učitan niz od 5 elemenata i da su učitane vrednosti kao na slici ispod
Određivanje maksimuma se može uraditi na sledeći način:
- Pretpostavi se da je maksimum prvi element niza
doublemax; max = a[0];
- Zatim se kroz for ciklus menja tekući element niza i proverava da li je on veći od pretpostavljenog maksimuma. Ako jeste taj element postaje maksimum.
for (inti = 0; i < n; i++) {if (a[i] > max) {} cout << "max=" << max << endl;max = a[i];}
doublemin; min = a[0]; for (inti = 0; i < n; i++) {if (a[i] < min) {} cout << "min=" << min << endl;min = a[i];}
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 }
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 }
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:
- Pokazivači u programskom jeziku C++ - Detaljno objašnjenje koncepta pokazivača i njihova primena u programiranju.
- Primeri rada sa nizovima u C++ - Konkretni primeri koji demonstriraju manipulaciju nizovima u jeziku C++.
- Dvodimenzioni nizovi u programskom jeziku C++ - Objašnjenje i primeri rada sa dvodimenzionim nizovima u C++.
- TutorialsPoint - C++ Programming - Detaljni vodiči za osnovne i napredne koncepte programiranja u jeziku C++.
- LearnCpp.com - Interaktivni online vodič za učenje jezika C++, sa primerima i vežbama.
- GeeksforGeeks - C++ Programming - Detaljno objašnjenje C++ jezika sa praktičnim primerima i kodom.
- Udemy - C++ Programming for Beginners - Online kurs za početnike koji žele da nauče programiranje u jeziku C++.
- Stack Overflow - C++ Questions - Platforma za rešavanje problema i razmenu znanja u vezi sa programiranjem u C++.
| Prethodno |<Ugnježdene petlje u C++ |
Sledeće Dinamički niz-vector>| |
Srodni članci
Petlje u c/c++ programskom jeziku-primeriPetlje u programskom jeziku JAVA
Nizovi-primeri
Fibonačijev niz
Podaci u C/C++ jeziku

