Upload
kristijan-ak
View
236
Download
4
Embed Size (px)
DESCRIPTION
programiranje vj
Citation preview
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
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++ )
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
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,
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
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;
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
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");
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
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;
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
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.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
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;
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
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;
}
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
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);
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
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;
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
// 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;
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
//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];
}
}
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
13
Fakultet informacijskih tehnologija
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.