Nizovi u jeziku C++
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):
int ocena, n = 5;
// Učitavanje niza
for (int i = 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.

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:

Unošenje ocena korišćenjem cin naredbe za unos, kroz for petlju bi sada izgledalo:
int ocene[5], n = 5;
// Učitavanje niza
for (int i = 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.

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
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:
double niz[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:

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_podatka ime_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:
- Inicijalizacija prilikom deklaracije:
int brojevi[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:
int brojevi[] = {10, 20, 30}; // Veličina niza je automatski određena na 3
- Delimična inicijalizacija:
Ako navedete manji broj vrednosti, ostali elementi će biti postavljeni na 0 (za osnovne tipove podataka).
int brojevi[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).
int brojevi[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:
int ocene[5]; // Deklaracija niza
for (int i = 0; i < 5; i++) {
cout << "Unesite ocenu: ";
cin >> ocene[i];
}
cout << "Unete ocene su: ";
for (int i = 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.
int brojevi[3] = {1, 2, 3}; // Deklaracija i inicijalizacija niza
cout << brojevi[5]; // Greška - indeks 5 ne postoji
Neispravna veličina niza:
Veličina niza mora biti konstantna vrednost pri deklaraciji.
int n;
cin >> n;
int brojevi[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:
int n;
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 niza
for (int i = 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 niza
for (int i = 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 elemenata
int brPozitivnih = 0;
for (int i = 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.
int n;
cin >> n;
int a[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
double max;
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 (int i = 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.
double min;
min = a[0];
for (int i = 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 niza
std::cout << "Niz u obrnutom redosledu:\n"; // Ispisuje naslov
for (int i = 4; i >= 0; i--) { // Petlja za obrtanje niza
std::cout << brojevi[i] << " "; // Ispisuje elemente niza u obrnutom redosledu
}
return 0; // 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 brojeva
int broj = 2; // Element koji brojimo
int count = 0; // Brojač koji čuva broj ponavljanja elementa
for (int i = 0; i < 7; i++) { // Petlja koja prolazi kroz niz
if (brojevi[i] == broj) { // Proverava da li je trenutni element jednak broju
count++; // Ako jeste, uvećava broj ponavljanja
}
}
std::cout << "Element " << broj << " se pojavljuje " << count << " puta u nizu.\n"; // Ispisuje rezultat
return 0; // 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 redosledu
using namespace std;
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] << " ";
}
return 0;
}
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 redosled
bool opadajuce(int a, int b) {
return a > b;
}
using namespace std;
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] << " ";
}
return 0;
}
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 redosled
bool opadajuce(int a, int b) {
return a > b;
}
using namespace std;
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] << " ";
}
return 0;
}
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.
#include <iostream>
using namespace std;
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++.
Proveri znanje
Otvori kviz
Kviz: Nizovi u C++-u
1. Koji je indeks poslednjeg elementa niza int a[10];?
2. Šta je a[0]?
3. Šta se desi ako pristupimo a[10] u nizu od 10 elemenata?
4. Kako se najčešće prolazi kroz sve elemente niza?
| Prethodno |<Ugnježdene petlje u C++ |
Sledeće Dinamički niz-vector>| |
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++.
Srodni članci
Petlje u c/c++ programskom jeziku-primeriPetlje u programskom jeziku JAVA
Nizovi-primeri
Fibonačijev niz
Podaci u C/C++ jeziku
