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?
✅ 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):
int ocena, n = 5; // Učitavanje niza for (int i = 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:
int ocene[5], n = 5; // Učitavanje niza for (int i = 0; i < n; i++) {cout << "Ucitaj " << (i + 1) << ". ocenu"; cin >> ocene[i];}
Određivanje najveće vrednosti niza(maksimum)
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:
{
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
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
float niz[10]; ili
double niz[10];
Davanje vrednosti članovima niza
double niz[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
double niz[]={1.1, 2.0, 2.5, -1.6, 3.3 };
Detaljnije objašnjenje sintakse nizova u C++
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];
2. Inicijalizacija niza
- 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:
int brojevi[5] = {1, 2}; // Preostali elementi će biti 0
3. Pristup elementima niza
int brojevi[3] = {5, 10, 15}; cout << brojevi[0]; // Ispisuje 5
4. Unos i ispis niza pomoću petlje
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
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
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
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;
//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];}
//Ispisivanje niza for (int i = 0; i < n; i++) {cout << niz[i] << " ";}
//Odredjivanje broja pozitivnih elemenata int brPozitivnih = 0; for (int i = 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
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
- 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) {} cout << "max=" << max << endl;max = a[i];}
double min; min = a[0]; for (int i = 0; i < n; i++) {if (a[i] < min) {} cout << "min=" << min << endl;min = a[i];}
Primer 3: Obrtanje niza
#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 }
Niz u obrnutom redosledu: 5 4 3 2 1
Primer 4: Brojanje pojavljivanja elementa
#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 }
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.
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 >| |