upr vjezbe14

13
Uvod u programiranje::Vježbe http://dl.fit.ba/ 1 Fakultet informacijskih tehnologija [email protected] Datum06.01.2010. DVODIMENZIONALNI STATIČKI NIZOVI Dvodimenzionalni niz se može opisati kao niz čiji su elementi nizovi . k 0 k 1 k 2 r 0 1 1 1 r 1 1 1 1 r 2 1 1 1 Prethodni dvodimenzionalni niz se može promatrati i kao 3 jednaka jednodimenzionalna niza, od kojih je svaki dužine 3. Indeksi za svaku od dimenzija niza se navode u zasebnim uglatim zagradama. Dvodimenzionalni niz se naziva još i tablicom, matricom ili dvostruko indeksirani (double- subscripted) niz. Članovima (elementima) dvodimenzionalnog niza pristupamo preko dva indeksa: prvi je odreĎen retkom, a drugi stupcem (kolonom) u kojem se podatak nalazi. Početni indeks i za redak i za stupac je, naravno, nula (0). Naredni program deklarira i inicijalizira tri niza od kojih svaki ima dva reda i tri kolone. // Inicijaliziranje dvodimenzionalnog niza #include <iostream> #include <iomanip> using namespace std; const int red=2, kolona=3; void ispisi_niz( int [][kolona] ); //prototip funkcije koja ispisuje elemente niza, obavezno navodjenje velicine druge dimenzije int main() { int niz1[red][kolona]={{1,2,3},{4,5,6}},//inicijalizacija niza pri deklaraciji niz2[red][kolona]={1,2,3,4,5}, niz3[red][kolona]={{1,2},{4}}; cout << "Vrijednosti elemenata u niz1 po redcima su:" << endl; ispisi_niz(niz1); //poziv funkcije, argument je ime niza (ime niza je adresa prvog elementa niza) cout << "Vrijednosti elemenata u niz2 po redcima su:" << endl; ispisi_niz( niz2); cout << "Vrijednosti elemenata u niz3 po redcima su:" << endl; ispisi_niz(niz3); return 0; } void ispisi_niz( int a[][kolona]) //definicija funkcije { for ( int i=0; i<red;i++) { for ( int j=0;j<kolona;j++ )

Upload: kristijan-ak

Post on 15-Dec-2015

244 views

Category:

Documents


4 download

DESCRIPTION

programiranje vj

TRANSCRIPT

Page 1: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

Datum06.01.2010.

DVODIMENZIONALNI STATIČKI NIZOVI

Dvodimenzionalni niz se može opisati kao niz čiji su elementi nizovi.

k0 k1 k2

r0 1 1 1

r1 1 1 1

r2 1 1 1

Prethodni dvodimenzionalni niz se može promatrati i kao 3 jednaka jednodimenzionalna

niza, od kojih je svaki dužine 3.

Indeksi za svaku od dimenzija niza se navode u zasebnim uglatim zagradama.

Dvodimenzionalni niz se naziva još i tablicom, matricom ili dvostruko indeksirani (double-

subscripted) niz.

Članovima (elementima) dvodimenzionalnog niza pristupamo preko dva indeksa: prvi je

odreĎen retkom, a drugi stupcem (kolonom) u kojem se podatak nalazi. Početni indeks i

za redak i za stupac je, naravno, nula (0).

Naredni program deklarira i inicijalizira tri niza od kojih svaki ima dva reda i tri kolone.

// Inicijaliziranje dvodimenzionalnog niza

#include <iostream>

#include <iomanip>

using namespace std;

const int red=2, kolona=3;

void ispisi_niz( int [][kolona] ); //prototip funkcije koja ispisuje

elemente niza, obavezno navodjenje velicine druge dimenzije

int main()

{

int niz1[red][kolona]={{1,2,3},{4,5,6}},//inicijalizacija niza pri

deklaraciji

niz2[red][kolona]={1,2,3,4,5},

niz3[red][kolona]={{1,2},{4}};

cout << "Vrijednosti elemenata u niz1 po redcima su:" << endl;

ispisi_niz(niz1); //poziv funkcije, argument je ime niza (ime niza je

adresa prvog elementa niza)

cout << "Vrijednosti elemenata u niz2 po redcima su:" << endl;

ispisi_niz( niz2);

cout << "Vrijednosti elemenata u niz3 po redcima su:" << endl;

ispisi_niz(niz3);

return 0;

}

void ispisi_niz( int a[][kolona]) //definicija funkcije

{

for ( int i=0; i<red;i++)

{

for ( int j=0;j<kolona;j++ )

Page 2: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

cout<<setw(3)<<a[i][j]<<setw(3);

cout << endl;

}

}

Analizirajmo prethodni program.

Pri deklaracija niza niz1 članovima niza su dodijeljene i vrijednosti (elementima u prvom

redu dodijeljene su vrijednosti 1,2 i 3; a elementima u drugom redu vrijednosti 4,5 i 6).

Pri deklaraciji niza niz2 inicijalizirano je 5 elemenata. Najprije su dodijeljene vrijednosti u

prvom redu, a zatim u drugom. Svi elementi kojima nije eksplicitno dodijeljena vrijednost

automatski se inicijaliziraju vrijednošću 0. U skladu s tim element niz2[2][3] ima

vrijednost 0.

Pri deklaraciji niza niz3 inicijalizirana je vrijednost 3 elementa, od kojih su prva dva

elementa u prvom redu, a treći element je u drugom redu. Ostalim elementima niza

automatski se dodjeljuje vrijednost 0.

Program poziva funkciju ispisi_niz kako bi se ispisale vrijednosti elemenata svakog od

nizova. Funkcija ima jedan parametar: ime niza (a[][3]). Dimenzije niza su u ovom

primjeru deklarirane kao globalne varijable, stoga nije bilo potrebe za njihovim

prosljeĎivanjem u funkciju preko parametara.

Kad smo prosljeĎivali jednodimenzionalni niz u funkciju uglate zagrade nakon imena niza

su bile prazne. Kod prosljeđivanja višedimenzionalnih nizova u funkciju, također

nije potrebno navoditi veličinu prvog indeksa, ali drugi indeks (indeks koji

određuje drugu dimenziju) je neophodno navesti.

void ispisi_niz( int [][kolona] );

(Ukoliko niz ima više od dvije dimenzije, potrebno je navesti u uglatim zagradama i

ostale dimenzije). Svi elementi niza se u memoriju pohranjuju jedan iza drugog ovisno o

broju indeksa. U dvodimenzionalnim nizovima najprije se pohranjuju elementi u prvom

redu, a nakon njih elementi u drugom redu i td. Kod dvostruko indeksiranih nizova, svaki

red je zapravo jednodimenzionalni niz. Funkcija, da bi locirala element u odreĎenom redu

mora znati koliko elemenata sadrži svaki red kako bi "preskočila" odgovarajući broj

memorijskih lokacija. Ako je, na primjer, u pitanju element [1][2] funkcija "zna" da je

potrebno preskočiti tri elementa kako bi dosegla drugi red (red koji ima vrijednost

indeksa 1), a zatim još dva elementa kako bi pristupila trećem elementu u drugom redu

(elementu koji ima indeks 2).

Naravno prosljeĎivanje dimenzija višedimenzionalnih nizova u funkcije je moguće i preko

parametara. U slučaju kvadratnih matrica (kad su obje dimenzije iste), osim imena niza

dovoljno je proslijediti samo jedan parametar, a ako nije riječ o kvadratnim matricama,

Page 3: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

onda se osim imena niza prosljeĎuju još dva parametra (za svaku dimenziju po

jedan).(Vidi Zadatak 1)

Za manipulaciju elementima nizova često se koriste for petlje. U sljedećem primjeru for

petlja se koristi kako bi se elementi trećeg reda inicijalizirati na 0.

for ( kolona=0; kolona<4; kolona++ )

a[2][kolona]=0;

U navedenom primjeru specificirali smo treći red tako da je vrijednost prvog indeksa

uvijek 2 (prvi red ima vrijednost indeksa 0, drugi 1, a treći 2). Unutar for petlje mijenja

se samo vrijednost drugog indeksa.

Navedena for petlja je ekvivalentna sljedećom iskazima dodjele:

a[2][0]= 0;

a[2][1]= 0;

a[2][2]= 0;

a[2][3]= 0;

Page 4: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

Zadatak 1: Napišite program u kojem ćete zbrojiti elemente koji se nalaze na dijagonali kvadratne matrice. Koristite funkcije.

(Napomene: kvadratna matrica je matrica koja ima jednak broj redaka i kolona; samo kvadratne matrice imaju dijagonalu; elementi na

dijagonali imaju jednaku vrijednosti oba indeksa-vidi sliku.)

#include<iomanip>

#include <iostream>

using namespace std;

void upis (int [][3], int);//funkcija za unos elemenata matrice

void ispis(int [][3], int);//funkcija za ispis elemenata matrice

int sumadijagonale (int [][3], int);

void main()

{

const int broj=3;//riječ je o kvadratnoj matrici – obje dimenzije su iste

int niz[broj][broj];

cout<<"Unesite elemente niza"<<endl<<endl;

upis (niz, broj);

cout<<endl<<"Unijeli ste sljedecu matricu: "<<endl<<endl;

ispis(niz, broj);

cout<<endl<<"Suma dijagonale je: "<<sumadijagonale(niz, broj)<<endl;

system("pause");

}

Page 5: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

void upis (int n[][3], int b)//rijec je o kvadratnoj matrici - obje dimenzije su iste(3) - dovoljan je jedan parametar da bi se predstavile obje dimenzije

{

for(int i=0;i<b;i++) //inicijalizacija clanova niza

{

for(int j=0;j<b;j++)

{

cout<<"Unesite ["<<i<<"]["<<j<<"] element: ";

cin>>n[i][j];

}

}

}

void ispis (int n[][3], int b)//rijec je o kvadratnoj matrici - obje dimenzije su iste(3) - dovoljan je jedan parametar da bi se predstavile obje dimenzije

{

for(int i=0;i<b;i++)

{

for(int j=0;j<b;j++)

cout<<setw(3)<<n[i][j]<<setw(3);

cout<<endl;

}

}

int sumadijagonale (int n [][3], int b)//funkcija racuna sumu elemenata koji se nalaze na dijagonali

{

int suma=0;

for (int i=0; i<b; i++)

suma+=n[i][i];

return suma;

}

Page 6: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

U funkciji upis upotrijebljene su dvije ugniježĎene for petlje kako bi se omogućila

inicijalizacija članova niza preko tastature. Vanjska for petlja omogućava kontroliranje

redaka, a unutarnja kontrolira kolone.

Isto vrijedi i za funkciju ispis. Kako bi se članovi niza ispisali u obliku matrice korišteni su

format manipulatore iz biblioteke <iomanip>.

Elementi matrice koji se nalaze na dijagonali imaju iste vrijednosti indeksa (i prva i druga

dimenzija), stoga je u funkciji sumadijagonale korištena samo jedna for petlja.

Postoje i druga i drugačija rješenja ovog problema.

Npr. funkcija je mogla izgledati i ovako:

int sumadijagonale (int n [][3], int b

{

int suma=0;

for(int i=0;i<b;i++)

{

for(int j=0;j<b;j++)

{

if(i==j) //provjeravate je li rijec o elementu na dijagonali

suma+=niz[i][j];

}

}

return suma;

}

No, ovakva funkcija nije osobito efikasna.

Page 7: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

Zadatak 2: Napišite program u kojem ćete deklarirati matricu 3x4. Omogućite korisniku da unese vrijednosti članova niza s

tastature, te da izabere red i kolonu čiju sumu želi izračunati. Za izračunavanje sume reda, sume kolone, unos i ispis elemenata

upotrijebite funkcije.

#include <iostream>

#include<iomanip>

using namespace std;

void unos(int [][4], int , int );

void ispis(int [][4], int , int );

int sumareda(int [][4], int , int, int );

int sumakolone(int [][4], int , int, int);

int main()

{

const int red=3, kolona=4;

int niz[red][kolona], zred, zkolona;

cout<<"Unesite clanove niza"<<endl;

unos(niz,red,kolona);

cout<<"Unijeli ste sljedecu matricu: "<<endl;

ispis(niz, red, kolona);

cout<<"Unesite red kojeg zelite sumirati"<<endl;

cin>>zred;

--zred;//smanjujemo broj reda za 1 jer indeksacija niza počinje od 0

cout<<"Suma reda s indeksom "<<zred<<" iznosi "<<sumareda(niz, red, kolona, zred)<<endl<<endl;

cout<<"Unesite redni broj kolone koju zelite sumirati"<<endl;

cin>>zkolona;

--zkolona;//smanjujemo broj kolone za 1 jer indeksacija niza počinje od 0

cout<<"Suma kolone s indeksom "<<zkolona<<" iznosi "<<sumakolone(niz, red, kolona, zkolona);

system ("pause>0");

return 0;

}

Page 8: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

void unos(int niz[][4], int red, int kolona)//definicija funkcije

{

for(int i=0;i<red;i++)

for(int j=0;j<kolona;j++)

cin>>niz[i][j];

}

int sumareda(int niz[][4], int red, int kolona, int zr)//definicija funkcije

{

int total=0;

for(int i=0;i<kolona;i++)

total+=niz[zr][i];

return total;

}

int sumakolone(int niz[][4], int red, int kolona, int zk)//definicija funkcije

{

int total=0;

for(int i=0;i<red;i++)

total+=niz[i][zk];

return total;

}

void ispis(int niz[][4], int red, int kolona)//definicija funkcije

{

for(int i=0;i<red;i++)

{

cout<<endl;

for(int j=0;j<kolona;j++)

cout<<setw(4)<<niz[i][j];

cout<<endl;

}

}

Page 9: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

9

Fakultet informacijskih tehnologija

[email protected]

Prototipovi i definicije funkcija u prethodnom zadatku su mogli izgledati i drugačije.

Naime, bilo je moguće veličinu prve i druge dimenzije deklarirati kao globalne konstante

nakon čega bi funkcije unos i ispis mogle imati samo jedan parametar – niz, a funkcije

sumareda i sumakolone dva – niz i podatak o željenom redu, odnosno koloni.

#include <iostream>

#include<iomanip>

using namespace std;

const int red=3, kolona=4;

void unos(int [][kolona]);

void ispis(int [][kolona]);

int sumareda(int [][kolona], int);

int sumakolone(int [][kolona], int);

Page 10: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

Zadatak 3: Dat je dvodimenzionalni niz (matrica 3x4) OcjeneStudenata. Svaki red predstavlja studenta, a svaka kolona

predstavlja ocjenu koju je student postigao na 4 ispita. Definirajte i upotrijebite:

o funkciju koja će omogući unos ocjena za svakog studenta;

o funkciju za ispis svih ocjena;

o funkciju koja će naći najmanju ocjenu;

o funkciju koja naći najveću ocjenu;

o funkciju koja će izračunati prosječnu ocjenu za svakog studenta.

#include <iostream>

#include<iomanip>

using namespace std;

int minimum( int [][4],int, int);

int maximum(int [][4],int, int);

float prosjek( int [],int);

void unos( int [][4], int, int);

void ispisi_niz( int [][4],int,int);

void main()

{

const int studenti=3; // broj studenata

const int ispiti=4; // broj ispita

int OcjeneStudenata[studenti][ispiti];

cout<<"Unesite ocjene studenata"<<endl;

unos(OcjeneStudenata,studenti,ispiti);

cout<<endl;

cout << "Niz sadrzi sljedece elemente:\n";

ispisi_niz(OcjeneStudenata,studenti,ispiti );

cout << "\n\nNajniza ocjena: "<< minimum( OcjeneStudenata,studenti,ispiti )

<< "\nNajveca ocjena: "<< maximum( OcjeneStudenata,studenti,ispiti ) << '\n';

for ( int osoba=0; osoba<studenti; osoba++ )

cout << "Prosjecna ocjena studenta " << osoba << " je "<< prosjek( OcjeneStudenata[osoba],ispiti )<< endl;

}

Page 11: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

// Pronadji minimalnu ocjenu

int minimum( int ocjene[][ 4 ], int p, int testovi )

{

int NO = 100;

for ( int i = 0; i < p; i++ )

{

for ( int j = 0; j < testovi; j++ )

if ( ocjene[ i ][ j ] < NO )

NO = ocjene[ i ][ j ];

}

return NO;

}

// Nadji maksimalnu ocjenu

int maximum( int ocjene[][ 4 ], int p, int testovi )

{

int VO = 0;

for ( int i = 0; i < p; i++ )

{

for ( int j = 0; j < testovi; j++ )

if ( ocjene[ i ][ j ] > VO )

VO = ocjene[ i ][ j ];

}

return VO;

}

// Odredi prosjecnu ocjenu za svakog studenta

float prosjek(int sveocjene[],int testovi)

{

int total = 0;

for ( int i = 0; i < testovi; i++ )

total += sveocjene[ i ];

return float(total)/testovi;

}

Page 12: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

//funkcija za ispis niza

void ispisi_niz( int ocjene[][4],int p,int testovi )

{

for ( int i = 0; i < p; i++ )

{

cout << "\nOcjeneStudenta["<<i<< "] "<<" ";

for ( int j=0; j<testovi; j++ )

cout<<setw(3)<<ocjene[ i ][ j ];

}

}

//funkcija za unos elemenata niza

void unos(int ocjene[][4],int p,int testovi)

{

for ( int i = 0; i < p; i++ )

{

cout<<"\nOcjene Studenta["<<i<< "] "<<endl;

for ( int j=0; j<testovi;j++ )

cin>>ocjene[i][j];

}

}

Page 13: UPR Vjezbe14

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

13

Fakultet informacijskih tehnologija

[email protected]

U ovom primjeru smo upotrijebili pet funkcije. Funkcija minimum traži najmanju ocjenu

od svih ocjena. Funkcija maximum traži najveću ocjenu od svih ocjena. Funkcija prosjek

računa prosječnu ocjenu svakog od studenata. Funkcija ispisi_niz ispisuje

dvodimenzionalni niz, a funkcija unos omogućava unos ocjena za svakog od studenata.

Svaka od funkcija (minimum, maximum i ispisi_niz) ima tri parametra – niz

OcjeneSudenata (koji se u svakoj od funkcija zove ocjene), broj studenata (redovi) i broj

ispita (kolone). U svakoj od funkcija smo upotrijebili for petlje.

U funkciji minimum prva for petlja započinje postavljanjem brojača i na 0 (riječ je o

prvom redu niza). U drugoj for petlji usporeĎujemo sve četiri ocjene iz odreĎenog reda s

NO (najniža ocjena). Ukoliko je ocjena niža od one pohranjene u varijabli NO, varijabli

NO se pridružuje ta nova vrijednost ocjene. Nakon toga se brojač u prvoj for petlji

inkrementira na 1 i usporeĎuju se ocjene iz drugog reda s varijablom NO. Brojač u prvoj

petlji se inkrementira na 2 i slijedi usporedba ocjena iz trećeg reda s varijablom NO.

Nakon što se izvrše obje for petlje varijabla NO će sadržavati vrijednost najmanje ocjene.

Funkcija maximum radi slično kao i funkcija minumum.

Funkcija prosjek ima dva parametra – jednodimenzionalni niz koji sadrži sve ocjene

odreĎenog studenta i broj ocjena. U pozivu funkcije prosjek prvi argument je

OcjeneStudenata[studenti] i on specificira odreĎeni red dvostruko indeksiranog niza

OcjeneStudenata. Na primjer, argument OcjeneStudenata[1] predstavlja četiri vrijednosti

pohranjene u drugom redu dvostruko indeksiranog niza OcjeneStudenata. Dvostruko

indeksirani niz se može smatrati nizom čiji su elementi jednodimenzionalni nizovi.

Funkcija prosjek računa sumu svih elemenata niza i dijeli dobivenu sumu s ukupnim

brojem ocjena. Povratna vrijednost funkcije prosjek je realna vrijednost dobivena

prethodnim dijeljenjem.