You are on page 1of 26

10.

Vektori
Proceduralno programiranje u C++
Podsjećanje
● Kada nam je potreban veliki broj promjenljivih istog tipa, napravit ćemo niz.
int niz[100];
double a[50];
● Članovima niza pristupamo tako što u uglastim zagradama navedemo indeks. Indeksi u nizu počinju od nule:
niz[0]=1;
std::cout << niz[99];
● Najbolji način za rad s nizom je koristeći for petlju:
for (int i(0); i<100; i++)
suma += niz[i];
Vektori
● Nizovi imaju nekoliko nedostataka, a vama je danas najočigledniji da je njihova veličina fiksna. Ne možemo
deklarisati niz proizvoljne veličine!
● Da bi se otklonili nedostaci nizova, u programskom jeziku C++ uvedeni su vektori. Vektori ne postoje u
programskom jeziku C.
● Da biste u svom programu koristili vektore, najprije morate uključiti biblioteku vector:

#include <vector>
Deklaracija vektora
● Vektor se deklariše tako što navodimo std::vector zatim tip članova vektora unutar znakova < i >, ime
vektora te u malim zagradama veličinu vektora:

std::vector<tip> ime(velicina)

npr.

std::vector<double> v(10);

● Čak je moguće deklarisati i vektor veličine 0!

std::vector<double> v;
Inicijalizacija vektora
● Svi članovi vektora automatski su inicijalizirani na nulu ili prazan string. Ako želite da inicijalizirate na neku
drugu vrijednost, možete je navesti nakon veličine:

std::vector<int> brojevi(100,1); // svi clanovi su 1

● Kao i kod nizova, možemo odmah nakon imena vektora u vitičastim zagradama nabrojati članove:

std::vector<int> v{1,2,3,4,5}

Ovaj vektor će biti veličine 5.


Rad s vektorom
● S ovako deklarisanim vektorom možete raditi na isti način kao s nizom:

#include <iostream>
#include <vector>

int main() {
std::vector<int> vek(10);
std::cout << "Unesite deset clanova vektora: ";
for (int i(0); i<10; i++) {
std::cin >> vek[i];
}
...
return 0;
}
Veličina vektora
● Za razliku od niza, veličina vektora može biti promjenljiva!

#include <iostream>
#include <vector>

int main() {
int n;
std::cout << "Unesite broj clanova vektora: ";
std::cin >> n;
std::vector<int> vek(n);
std::cout << "Unesite " << n << " clanova vektora: ";
for (int i(0); i<n; i++) {
std::cin >> vek[i];
}
...
return 0;
}
Promjena veličine vektora
● Za razliku od niza, veličina vektora se može promijeniti za vrijeme rada:

std::cout << "Unesite novu veličinu vektora: ";


std::cin >> n;
vek.resize(n);

● Ako je n manje od trenutne veličine vektora, bit će zadržano prvih n elemenata, a ostali će biti obrisani. Ako
je veće, novi elementi će imati default vrijednost (0).
● Metoda push_back povećava vektor za 1 i dodaje novi element na njega:

vek.push_back(x);
Primjer: Niz proizvoljne veličine
Napisati program koji omogućava unos niza prirodnih brojeva proizvoljne dužine, pri čemu se unos završava
sa -1. Zatim se na ekranu ispisuju svi članovi niza koji su veći od srednje vrijednosti (prosjeka) čitavog niza.

● Ovaj zadatak je u opštem slučaju nemoguće riješiti nizovima. Potrebno je ograničiti maksimalan broj
unesenih brojeva (npr. u zadatku može pisati "proizvoljne dužine (najviše 1000)" i u tom slučaju deklarišemo
niz veličine 1000).
● S vektorom možemo zaista unijeti proizvoljno mnogo brojeva.
Dodavanje u vektor
#include <iostream>
#include <vector>

int main() {
std::vector<int> v; // prazan vektor
std::cout << "Unesite prirodne brojeve (-1 za kraj): ";
int broj;
do {
std::cin >> broj;
if (broj != -1) v.push_back(broj);
} while (broj != -1);
...

... nastavak na sljedećem slajdu!


Veličina vektora
● Veličinu vektora možemo saznati sa size(). Nastavak s prethodnog slajda:

int suma(0);
for (int i(0); i<v.size(); i++) {
suma += v[i];
}
double prosjek(double(suma) / v.size());

std::cout << "Veci od prosjeka su: ";


for (int i(0); i<v.size(); i++) {
if (v[i] > prosjek) Izbjegavamo odsijecanje
std::cout << v[i] <<prilikom
",";dijeljenja.
}
return 0;
}
String kao vektor znakova
● Posebno interesantna osobina stringova je da se oni mogu posmatrati kao nizovi (vektori) znakova. Čak se
većinom string interno predstavlja kao vector<char>.
● Ovo znači da možemo pristupiti pojedinačnim slovima preko uglastih zagrada:

#include <iostream>
#include <string>

int main() {
std::string ime;
std::cout << "Unesite ime: ";
std::cin >> ime;
std::cout << "Prvo slovo vaseg imena je " << ime[0] <<
std::endl;
return 0;
}
Primjer: Broj samoglasnika
Napraviti program koji omogućava da se unese jedna riječ, a zatim prebrojava koliko ima samoglasnika u toj
riječi.
Primjer: Broj samoglasnika
#include <iostream> Primjećujemo da
#include <string> program ne broji
ispravno velika
int main() { slova.
std::string ime;
std::cout << "Unesite ime: ";
std::cin >> ime;
int brSamoglasnika(0);
for (int i(0); i<ime.length(); i++) {
if (ime[i] == 'a' || ime[i] == 'e' || ime[i] == 'i'
|| ime[i] == 'o' || ime[i] == 'u')
brSamoglasnika++;
}
std::cout << "U vasem imenu ima " << brSamoglasnika
<< " samoglasnika." << std::endl;
return 0;
}
Primjer: Broj samoglasnika
#include <iostream>
#include <string>

int main() {
std::string ime;
std::cout << "Unesite ime: ";
std::cin >> ime;
int brSamoglasnika(0);
for (int i(0); i<ime.length(); i++) {
if (ime[i] == 'a' || ime[i] == 'A' || ime[i] == 'e'
|| ime[i] == 'E' || ime[i] == 'i'...

Ovo bi bilo tačno, ali


ima previše kucanja ;)
Podsjećanje: ASCII tabela
Primjer: Broj samoglasnika
#include <iostream>
#include <string>

int main() {
std::string ime;
std::cout << "Unesite ime: ";
std::cin >> ime;
int brSamoglasnika(0);
for (int i(0); i<ime.length(); i++) {
char c = ime[i];
if (c >= 'A' && c <= 'Z') c += 32;
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
brSamoglasnika++;
}
std::cout << "U vasem imenu ima " << brSamoglasnika
<< " samoglasnika." << std::endl;
return 0;
}
Gotove funkcije
● U biblioteci cctype imamo gotovu funkciju tolower koja prima jedan char i, ako je taj char veliko slovo,
pretvara ga u malo, u suprotnom ga ne mijenja.
● Uvijek se raspitajte da li postoji gotova funkcija za nešto što vam treba i iskoristite je ako je moguće!
Primjer: Broj samoglasnika
#include <iostream>
#include <string>
#include <cctype>

int main() {
std::string ime;
std::cout << "Unesite ime: ";
std::cin >> ime;
int brSamoglasnika(0);
for (int i(0); i<ime.length(); i++) {
char c = tolower(ime[i]);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
brSamoglasnika++;
}
std::cout << "U vasem imenu ima " << brSamoglasnika
<< " samoglasnika." << std::endl;
return 0;
}
Vektor stringova
● Članovi vektora mogu biti bilo kojeg tipa, pa i string:

std::vector<std::string> imena;

● Primjer:

Napisati program koji omogućava unos imena učenika, a zatim ih ispisuje poredane po abecedi (kao u
dnevniku) i s rednim brojevima ispred.

● Za ove potrebe možemo iskoristiti funkciju sort koja se nalazi u biblioteci algorithm. Funkcija se nad
vektorom poziva ovako:

std::sort(imena.begin(), imena.end());
Primjer: Dnevnik
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main() {
std::vector<std::string> imena;
std::string ime, prezime;
do {
std::cout << "Unesite ime ucenika (KRAJ za kraj): ";
std::cin >> ime;
if (ime != "KRAJ") {
std::cout << "Unesite prezime: ";
std::cin >> prezime;
imena.push_back(prezime + " " + ime);
}
} while (ime != "KRAJ");
// Nastavak na sljedecem slajdu
Primjer: Dnevnik (2)

// Slijedi sortiranje
std::sort(imena.begin(), imena.end());
std::cout << "Imena u dnevniku:" << std::endl;
for (int i(0); i<imena.size(); i++) {
std::cout << i+1 << ". " << imena[i] << std::endl;
}
return 0;
}
Zadatak 10.1
Napisati program koji omogućava unos proizvoljno mnogo realnih brojeva (0 predstavlja kraj unosa). Zatim
korisnik unosi jedan broj. Ako je isti taj broj unesen ranije, treba ispisati poruku oblika "Broj x je unesen kao
n. broj po redu", a ako nije ranije unesen, napisati "Broj se ne nalazi medju unesenim brojevima!"
Zadatak 10.2
Napisati program koji omogućava unos jedne rečenice (kao jedan string), a zatim prebrojava koliko riječi
ima u rečenici. Obratite pažnju da ako korisnik unese nekoliko razmaka, oni se ne smiju brojati kao nekoliko
zasebnih riječi! Također razmaci na početku ili kraju stringa se ne smiju brojati kao riječi!
SRETNO! 😄
Hvala na pažnji!

26

You might also like