You are on page 1of 25

Programiranje

- Nizovi -

Kolegij: Programski jezik C++


Ak. god. 2013/2014
Doc. Dr. sc. Marko Malikovi

Nizovi podataka
Nizovi su skupovi podataka istog tipa
Omoguavaju pristupanje veem broju podataka preko zajednikog simbolikog
imena i indeksa koji daje redni broj elementa u nizu

ime[0], ime[1], ..., ime[i], ...

Na primjer, niz: ocjena[0], ocjena[1], ..., ocjena[29]


moe sadravati niz ocjena iz nekog kolskog predmeta za 30 uenika nekog

razreda

Prvi lan niza ima indeks 0 , zadnji ima indeks za jedan manji od duljine niza
lanovi niza se dohvaaju preko njihovog indeksa
Na primjer, naredbom:

cout << ocjena[7];

se ispisuje ocjena osmog uenika u razredu

Nizovi podataka
Podaci u nizu mogu biti bilo kojeg tipa:
Ugraenog (npr. int, float, ...)
Korisniki definiranog

Pojedini lanovi niza se mogu mijenjati neovisno o ostalim lanovima

niza
Na primjer, naredbom:
ocjena[7] = 5;
e se osmom lanu niza ocjena dodijeliti vrijednost 5
a ostale ocjene u nizu e ostati nepromijenjene
Nizovi mogu biti jednodimenzionalni (u linearnom slijedu) ili

viedimenzionalni

Deklaracija jednodimenzionalnih
nizova
Openito se deklaracija niza vri navoenjem

tipa, naziva i duljine niza:


float tezina[5];
Gornja naredba deklarira jednodimenzionalni niz

tezina koji e sadravati pet decimalnih brojeva


tipa float

Inicijalizacija lanova niza

Jedan od naina inicijalizacije:


float x[] = {1342.5, 4.7, 23.4, 12., -7.2};

Kao to vidimo u gornjem primjeru, ne moramo uvijek navesti duljinu niza


Ako kod inicijalizacije navedemo duljinu niza, onda ona mora biti vea ili jednaka
broju inicijaliziranih lanova

u suprotnom e prevoditelj ispisati greku "too many initializers"

Ako je broj inicijalizatora u listi manji od duljine niza, onda se lanovima kojima
nedostaju inicijalizatori dodjeljuje vrijednost nula
Dakle, naredbom:

int broj[5] = {5, 7, 2};

e prva tri lana poprimiti vrijednosti 5, 7 i 2, a broj[3] i broj[4] e poprimiti


vrijednost 0

Primjer
Treba unijeti N lanova jednodimenzionalnog niza, pa

ih ispisati i zbrojiti. N mora biti manji ili jednak 10


(N<=10). Ispis treba biti oblika:
Upisi broj clanova niza:
Upisi X[...] clan niza:

....
....

Zbroj ... clanova niza iznosi ....

Rjeenje
#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Deklaracija varijabli
#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Inicijalizacija varijabli
#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Unos podatka o duljini niza


#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Unos vrijednosti elemenata niza


#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Izraunavanje zbroja elemenata niza


#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Ispis
#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Konaan program
#include <iostream>
using namespace std;
int main ()
{
int N, i, zbroj;
int X[10];
zbroj=0;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>10));
for (i=0; i<N; i++)
{
cout << endl << "Upisi X[" << i << "]: ";
cin >> X[i];
}
cout << endl;
for (i=0; i<N; i++)
{
cout << X[i] << endl;
zbroj=zbroj+X[i];
}
cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl;
cout << endl;
return 0;
}

Oprez!
C++ ne provjerava granice niza prilikom pristupa

lanovima niza
Ako se navede prevelik ili negativan indeks:
prevoditelj nee javiti pogreku
meutim, to e prouzroiti neispravan rad

programa:
Ako se dohvaa lan s nedozvoljenim indeksom, rezultat je

neki sluajni broj


Ako se vrijednost pridruuje lanu s nedozvoljenim
indeksom, to e izazvati run-time error odnosno program e
se sruiti prilikom izvoenja

Program za sortiranje podataka


- verzija s unosom podataka preko tipkovnice Korisnik preko tipkovnice unosi niz brojeva
Te brojeve treba sortirati po veliini, od najmanjeg

prema najveem
Tako sortirane brojeve treba ispisati
"Bubble sort" algoritam za sortiranje
pogodan za sortiranje manjeg broja podataka (s

obzirom na brzinu)

Primjer
Imamo niz: 13, 7, 6, 3, 1
Prvi prolaz:
13, 7, 6, 3, 1 7, 13, 6, 3, 1
7, 13, 6, 3, 1 7, 6, 13, 3, 1
7, 6, 13, 3, 1 7, 6, 3, 13, 1
7, 6, 3, 13, 1 7, 6, 3, 1, 13
Drugi prolaz:
7, 6, 3, 1, 13 6, 7, 3, 1, 13
6, 7, 3, 1, 13 6, 3, 7, 1, 13
6, 3, 7, 1, 13 6, 3, 1, 7, 13
Trei prolaz:
6, 3, 1, 7, 13 3, 6, 1, 7, 13
3, 6, 1, 7, 13 3, 1, 6, 7, 13
etvrti prolaz:
3, 1, 6, 7, 13 1, 3, 6, 7, 13

"Bubble sort" algoritam za sortiranje


Verzija za sortiranje od manjih prema veim elementima

Prolazi se kroz niz zadanih brojeva


Pritom se usporeuju susjedni elementi
Ako je neki element vei od sljedeeg treba ih zamijeniti

(vei elementi se pomiu prema kraju niza)


Nakon prvog prolaza kroz cijeli niz najvei element e se
nai na kraju niza
Ponovno se prolazi kroz niz ali samo do pretposljednjeg
elementa (jer je najvei element ve na kraju niza)
I tako dalje ...
Najvei lanovi se svakim prolazom postepeno gomilaju na
vrhu niza (poput mjehuria u pivu odatle i naziv Bubble
sort)

Sortiranje podataka - prvi dio kda


(unos podataka)
#include <iostream>
using namespace std;
int main ()
{
int Niz[100];
int N;
do
{
cout << "Upisi broj clanova niza: ";
cin >> N;
}
while((N<=0) || (N>100));
int i;
for (i=0; i<N; ++i)
{
cout << endl << "Upisi Niz[" << i << "]: ";
cin >> Niz[i];
}
cout << endl;
// drugi dio programa na slijedeem slajdu...

Sortiranje podataka - drugi dio kda


(sortiranje podataka)
// ... nastavak s prethodnog slajda
for (i = N-1; i > 0; --i) {

bool zamjena = false;


for (int j = 0; j < i; ++j) {
if (Niz[j+1] < Niz[j]) {
double privremeni = Niz[j];
Niz[j] = Niz[j+1];
Niz[j+1] = privremeni;

zamjena = true;
}
}
if (zamjena == false) {
break;
}

}
cout << "Brojevi slozeni po velicini: " << endl;
for (i = 0; i < N; ++i) {
cout << Niz[i] << endl;
}
return 0;
}

Mogunosti za indekse niza

Indeks niza openito moe biti:


Cjelobrojna konstanta
Cjelobrojna varijabla
Cjelobrojni izraz

To znai da je ovo doputeno:


int i = 2;
int j = 5;
float b = a[i + j]

Meutim, ovo bi izazvalo probleme:


float b = [2 * i j];

jer bi indeks bio negativan

Dvodimenzionalni nizovi
lanovi dvodimenzionalnog niza imaju dva indeksa

Deklaracija:

int Tablica[3][5];
Niz smo nazvali Tablica jer je dvodimenzionalne

nizove lake razumjeti ako na njih gledamo kao na


tablice:
Prvi indeks predstavlja redke
Drugi indeks predstavlja stupce

Ali na njih samo moemo gledati kao na tablice ali u

stvari oni to nisu

Primjer
Napiimo program za unos lanova

dvodimenzionalnog niza i njihov ispis u obliku tablice


Elementi se mogu inicijalizirati ovako:
int X[2][3]= { {1,2,3}, {4,5,6}};
Ispis treba biti oblika:
1 2 3

4 5 6

Program za prethodni primjer


#include <iostream>
using namespace std;
int main ()
{
int i, j;
int X[2][3]= {{1,2,3}, {4,5,6}};
for(i=0; i<2; i++)
{
for(j=0; j<3; j++)
{
cout << X[i][j] <<" ";
}
cout << endl;
}
return 0;
}

Ispis prethodnog programa

You might also like