Upload
dejan-milic
View
91
Download
2
Embed Size (px)
Citation preview
PROCEDURALNO PROGRAMIRANJEPROGRAMIRANJE
Aleksandar Karač Mirsad Subašić
MFZE, kancelarija 1111
tel: 449 129
PFZE
tel: -
[email protected] [email protected]
www.pf.unze.ba/pp 2010/2011/
O kursu Proceduralno programiranje ............
Izvođenje nastave• predavanja: 2 časa sedmično
• vježbe: 2 časa sedmično• vježbe: 2 časa sedmično
Obaveze studenata• redovno prisustvo na predavanjima i vježbama
Provjera znanja
• urađene i kolokvirane domaće zadaće (ukupno 2 zadaće)
• dva testa u toku semestra (uglavnom teorija, kviz pitanja) – obavezno
• pismeni ispit (zadaci)
Konačna ocjena
• prisustvo nastavi: 0 %
• zadaća: 30 %
• testovi: 20 %
• pismeni ispit: 50 %
Svaka od stavki mora biti >50%
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 2
• pismeni ispit: 50 %
O kursu Proceduralno programiranje ............
OSNOVNA LITERATURA
•Predavanja, skripta (web, biblioteka), vježbe
DODATNA LITERATURA (za entuzijaste!!!)
B M tik J Š ib D i tifi i i C++ L t Z b 2001• B. Motik, J. Šribar: Demistificirani C++, Lemenet, Zagreb, 2001.• Lippman S., Lajoie J., C++ Primer, 4th edition, Addison Wesley, 2005.• Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition), Addison-Wesley, 2000• C++ standard – ISO/IEC 14882• Sharam Hekmat C++ Programming Pragmatix Software Pty Ltd (www pragsoft com )Sharam Hekmat, C Programming, Pragmatix Software Pty. Ltd. (www.pragsoft.com )• http://www.cplusplus.com/doc/tutorial/• Randy Davis, C++ for Dummies, 5th edition
St l Li C E ti l Addi W l 2002• Stanley Lippman, C++ Essentials, Addison Wesley, 2002• Jeff Kent, C++ demystified: A self-teaching guide, McGraw-Hill/Osborne, 2004• Jesse Liberty, Sams Teach Yourself C++ in 21 Days, second edition
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 3
O kursu Proceduralno programiranje ............
SADRŽAJ KURSA
• Uvod. Kratki istorijat programskih jezika.O proceduralnom programiranju.Programski paket Dev-C ++.
• Osnove programiranja. Struktura programa. Proces kompajliranja. Varijable. Memorija. Ulazno/izlazniusmjerivači toka. Komentari. Imena (identifikatori). Tipovi podataka.
• Operatori. Aritmetički operatori. Relacijski operatori. Logički operatori. Bitovni operatori. Inkrementalni i dekrementalni operatori. Operatori pridruživanja. Uslovni (ternarni) operator. Operator razdvajanja (zarez-operator). sizeof operator. Hijerarhija operatora.
• Naredbe. Jednostavne i složene naredbe. Naredba if. Naredba switch. Naredba while. Naredba do. Naredba for.
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 4
O kursu Proceduralno programiranje ............
SADRŽAJ KURSA
• Funkcije. Definicija funkcija. Parametri i argumenti. Globalne i lokalne varijable. Rekurzivne funkcije. Opterećene (overloaded) funkcije.
• Polja (arrays). Definisanje i inicijalizacija polja. Multidimenzionalna polja.
• Pointeri. Osnovno o pointerima. Dinamička memorija. Pointeri i polja. Aritmetika sa pointerima. Funkcijski pointeri. Reference.
• Datoteke. Standardna biblioteka fstream. "Životni" ciklus pristupa datotekama.
• U susret objektno-orijentisanom programiranju. Proceduralno i objektno-orijentisano programiranje. Prednosti objektno-orijentisanog programiranja. karakteristike objektno-orijentisanih jezika. j j
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 5
O kursu Proceduralno programiranje ............
PLAN IZVOĐENJA KURSA
Sedmica I: Uvod. Programski paket Dev-C++ …
Sedmica II i III: Osnove programiranja. Operatori
Sedmica IV i V: Naredbe
Sedmica VI i VII: Funkcije
12. april: TEST 1 (pređeno gradivo)
Sedmica IX i X: Polja
Sedmica XI i XII: Pointeri
Sedmica XIII i XIV: Datoteke
31. maj: TEST 2 (Polja, Pointeri, Datoteke ili integralno)
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 6
O kursu Proceduralno programiranje ............
ZADAĆA 1: Osnove programiranja, Operatori, Naredbe, Funkcije
Zadata: 08. mart 2011.Rok za predaju: 22. april 2011.
ZADAĆA 2: Polja, Pointeri, Datoteke
Zadata: 19. april 2011.Rok za predaju: 3. juni 2011.p j j
IF (DATUM_PREDAJE > ROK_ZA_PREDAJU)COUT<< “OCJENA ZADACE SE UMANJUJE 20% PO SEDMICI ZAKASNJENJA\N”;
IF (OCJENA < 50)COUT<< “STUDENT NE MOZE IZACI NA ISPIT\N”
“ I OBAVEZE MOZE ISPUNITI U AKADEMSKOJ 2011/2012\N”<< “ I OBAVEZE MOZE ISPUNITI U AKADEMSKOJ 2011/2012\N”;ELSE
COUT << “STUDENT MOZE IZACI NA PISMENI ISPIT!\N”
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 7
Uvod
1822 – zupčanici, diferentna mašina
Istorijat programskih jezika
1822 zupčanici, diferentna mašina1942 – električni signali, ENIAC1945 – Von Neumannovi koncepti: tehnika podjele programa i transfer pomoću uslovne
kontrole1949 Sh t C d (j ik l kt k kl )1949 – Short Code (jezik za elektronske sklopove)1957 – FORTRAN1959 – COBOL1968 – Pascal1968 Pascal1972 – C jezik
’70-80 – OOP jezici
1967 – SIMULA 1978 – SmallTalk1983 – C++1983 – C++1988 – Eifell’90te – Java...
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 8
Uvod
Proceduralno ili OOP
Pristupi u analiziranju problema u programiranju
Objekat MarsMars
•Procedura za izračunavanje brzine
•Procedura za izračunavanje trenja
Objekat svemirski brod
•Procedura za izračunavanje trenja
•Potrebna količina goriva
•Težina raketa za polijetanje Objekat Zemlja
•.....
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 9
Uvod
Algoritamski (proceduralni) pristup
Ispisni meniji
Izbor: podizanje novca
Izbor: depozit Izbor: dodatna informacija
Upitati korisnika za svotu koju diže
Upitati korisnika za depozit
Upitati korisnika koju informaciju želisvotu koju diže za depozit informaciju želi
Potvrditi svotu
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 10
Uvod
Algoritamski (proceduralni) pristup
• Funkcionalna dekompozicija
• Algoritamska dekompozicija
• Strukturno programiranje
• “Top-down” programiranje
• Proceduralno programiranje• Proceduralno programiranje
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 11
Uvod
Download
Programski paket Dev-C++
www.pf.unze.ba/PPbl d h d t/d /d ht l
Download
www.bloodshed.net/dev/devcpp.html
devcpp-4.9.9.2_setup.exe
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 12
Uvod
Osnovni prozor
Programski paket Dev-C++
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 13
Uvod
Otvaranje nove datoteke
Programski paket Dev-C++
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 14
Uvod
Kreiranje prvog programa
Programski paket Dev-C++
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 15
Uvod
Kompajliranje prvog programa
Programski paket Dev-C++
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 16
Uvod
Pokretanje prvog programa
Programski paket Dev-C++
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/pp 17
Osnove programiranja u C++
Struktura programa
1 #include <iostream>2 using namespace std;3 int main()
{4 {5 cout << “Vozdra, raja!” << endl;6 system("PAUSE");7 return 0;7 return 0;8 }
P i j i d
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 18
Primjeri: vozdra.cpp
Osnove programiranja u C++
Proces kompajliranja
C++program
C++prevodilac
Ckod
Ckompajler
C++Objektni
kodC++program
prirodnikompajler
linker Izvršnadatoteka
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 19
Osnove programiranja u C++
• Tip
Varijable
Definisanje, deklarisanje i inicijalizacija varijabli
p
• Vrijednost
#include <iostream> using namespace std;main()a (){
int a,b,c;float x = 4.32;int e f g;int e,f,g;char ime;e = 4;f = g = 12;ime = 'C'ime = C
}
extern int broj; // deklarise ali ne i definise brojint broj; // deklarise i definise broj
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 20
int broj; // deklarise i definise broj
Osnove programiranja u C++
adresa
Memorija
1211 1212 1213 1214 1215 1216 1217 ... bajt bajt bajt bajt bajt bajt bajt ... Memorija
adresa
1 1 0 1 0 0 0 11 1 0 1 0 0 0 1
int zarada = 500;
1211 1212 1213 1214 1215 1216 1217b j b j b j 10110011 10110011 b j b j M ij
int zarada = 500;
... bajt bajt bajt 10110011 10110011 bajt bajt ... Memorija
zarada
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 21
Osnove programiranja u C++
Ulazno-izlazne naredbe (>> , <<)
#include <iostream>using namespace std;
int main (void)int main (void){
int radniDani = 22;float radniSati = 7.5;fl t t i l tfloat satnica, plata;
cout << "Kolika je satnica? ";cin >> satnica;
plata = radniDani * radniSati * satnica;cout << "Plata = ";cout << plata;cout << '\n';
}
P i j i UI db
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 22
Primjeri: UInaredbe.cpp
Osnove programiranja u C++
#i l d i t
Komentari (//, /* ........*/)
#include <iostream>using namespace std;
/* Ovaj program racuna ukupnu platu radnika, koja se zasniva na ukupnom broju radnih sati i satnici. */
int main (void){
int radniDani = 22; // Broj radnih dana u mjesecufloat radniSati = 7.5; // Broj radnih sati u danufloat satnica = 33.50; // Satnicafloat plata; // Ukupna mjesecna platap ; p j p
// Racunanje i ispis plate
plata = radniDani * radniSati * satnica;plata radniDani radniSati satnica;cout << "Plata = " << plata << '\n';
}
P i j i k t i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 23
Primjeri: komentari.cpp
Osnove programiranja u C++
• ime treba da se sastoji od jednog ili više karaktera, od kojih bilo koji može biti
Imena identifikatori
ime treba da se sastoji od jednog ili više karaktera, od kojih bilo koji može biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak “_", pri čemu na prvom mjestu ne može da bude broj.
• velika i mala slova se razlikuju (zarada nije isto što i Zarada)
• ime ne može biti ključna riječ u C++
Ključne riječi u C++ (nepotpuna lista)j j ( p p )
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 24
Osnove programiranja u C++
Brojevi
Tipovi podataka
j
• cijeli brojevi (short, int, long)
short a;
int b = - 5;
long c;
unsigned short a;
unsigned int b = 5;
unsigned long c;long c; unsigned long c;
int – 4 bajta = 32 bita
Minimalan broj: 312 2147483648− = −
Maksimalan broj: 312 1 2147483647− =
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 25
Osnove programiranja u C++
-oktalni zapis
int a = 010;int a 010;
-heksadecimalni zapis
int a = 0x0C;
l i b j i (fl d bl )• realni brojevi (float, double)
float pi = 3.1415926; unsigned double a = 3.1415926;
float brzinaSvjetlosti = 2.997925e8;
float naboj = -1.6E-19;
unsigned float = 2.997;
P i j i ij li d i l i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 26
Primjeri: cijeli.cpp decimalni.cpp
Osnove programiranja u C++
• ograničenja brojevnih tipova (climits, cfloat)
cout << "Najmanji int: " << INT MIN << endl;cout << Najmanji int: << INT_MIN << endl;
cout << "Najveci int: " << INT_MAX << endl;
cout << "Najmanji long: " << LONG_MIN << endl;
cout << "Najveci int: " << LONG_MAX << endl;
cout << "Najveci float: " << FLT_MAX << endl;
cout << "Najmanji double:" << DBL MIN << endl;cout Najmanji double: DBL_MIN endl;
• simboličke konstante
const float pi = 3.1415926;
#define pi 3.1415926
P i j i i j i b li k
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 27
Primjeri: ogranicenja.cpp simbolicke.cpp
Osnove programiranja u C++
bool jaSamStudent = true;
Logički tipovi (bool)
j
bool autoLeti = false;
Karakteri (char)Karakteri (char)
char slovoAbecede = ‘a’;
‘\n’ – novi red‘\t’ – novi tabulator‘\v’ – novi vertikalni tabulator\v – novi vertikalni tabulator‘\b’ – backspace‘\’’ – znak navoda (apostrof)‘\”’ – dvostruki znak navoda‘\\’ – backslash (/)‘\a’ – zvučni signal
P i j i l i ki k kt i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 28
Primjeri: logicki.cpp karakteri.cpp
Operatori
Operator Ime Primjer
Aritmetički operatori
Operator Ime Primjer+ Sabiranje 12 + 4.9 // daje 16.9 - Oduzimanje 3.98 - 4 // daje -0.02 * Množenje 2 * 3.4 // daje 6.8 / Dijeljenje 9 / 2.0 // daje 4.5% Ostatak pri dijeljenju 13 % 3 // daje 1
Pojam preljeva0 1 2-1
-2
oduzimanje sabiranje
j p j
int
32767-32768
-32767 32766
P i j i it ti ki lj
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 29
Primjeri: aritmeticki.cpp preljev.cpp
Operatori
Operator Ime Primjer
Relacijski operatori
== Jednakost 5 == 5 // daje 1!= Nejednakost 5 != 5 // daje 0 < Manje od 5 < 5.5 // daje 1 <= Manje ili jednako 5 <= 5 // daje 1 > Veće od 5 > 5 5 // daje 0> Veće od 5 > 5.5 // daje 0>= Veće ili jednako 6.3 >= 5 // daje 1
Logički operatori
Operator Ime Primjer ! Logička negacija !(5 == 5) // daje 0 && Logičko i 5 < 6 && 6 < 6 // daje 1 || Logičko ili 5 < 6 || 6 < 5 // daje 1
P i j i l ij ki l i ki
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 30
Primjeri: relacijski.cpp logicki.cpp
Operatori
Bitovni operatori
P i j i bit i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 31
Primjeri: bitovni.cpp
Operatori
Inkrementi i dekrementi
Operator Ime Primjer ++ Inkrement (prefiks) ++k + 10 // daje 16 ++ Inkrement (postfiks) k++ + 10 // daje 15 -- Dekrement (prefiks) --k + 10 // daje 14 Dekrement (prefiks) k + 10 // daje 14-- Dekrement (postfiks) k-- + 10 // daje 15
P i j i i k t
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 32
Primjeri: inkrement.cpp
Operatori
Operatori pridruživanja
int m, n, p; m = n = p = 5; // znači: m = (n = (p = 100));
m = (n= p = 100) + 2; // znači: m = (n = (p = 5)) + 2;
m = 100; m += n = p = 5; // znači: m = m + (n = p = 5);
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 33
Operatori
d1 ? d2 d3
Uslovni (ternarni) operator
operand1 ? operand2 : operand3
int m = 1 n = 2;int m = 1, n = 2;int min = (m < n ? m : n); // min dobija vrijednost 1
Operator razdvajanja (zarez-operator)
int m, n, min;
int mBroji =0, nBroji=0;
......
min = (m < n ? mBroji++, m : nBroji++, n);
P i j i l i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 34
Primjeri: uslovni.cpp
Operatori
Ključna riječ typedef
Ključna riječ typedef omogućava uvođenje novog imena za već postojeći ugrađeni ili korisnički definisani tip podataka
typedef int broj;
Identifikator broj postaje sinonim za tip int, pa se može pisati:
broj prim = 11;
typedef double MATRICA[3][3];typedef double VEKTOR[3];
MATRICA {{1 2 0} {2 1 1} {0 1 1}}MATRICA m = {{1,2,0},{2,1,1},{0,1,1}};;VEKTOR v = {2,2,1};
P i j i t d f
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 35
Primjeri: typedef.cpp
Operatori
sizeof operator
#include <iostream>using namespace std;
int main (void){
cout << "char size = " << sizeof(char) << " bytes\n";cout << "short size = " << sizeof(short) << " bytes\n";cout << "int size = " << sizeof(int) << " bytes\n";( ) y ;cout << "long size = " << sizeof(long) << " bytes\n";cout << "float size = " << sizeof(float) << " bytes\n";cout << "double size =" << sizeof(double) << " bytes\n";cout << "HELLO size = " << sizeof("HELLO") << " bytes\n";cout HELLO size sizeof( HELLO ) bytes\n ;system("pause");
}
P i j i i f
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 36
Primjeri: sizeof.cpp
Operatori
HIJERARH
O P H
IJ
E RAA ATORRA
P i j i hij hij
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 37
Primjeri: hijerarhija.cpp
Naredbe
Jednostavne i složene naredbe
int i; // deklaraciona naredba
• jednostavne naredbe
++i; // naredba sa popratnim efektomdouble d = 10.5; // deklaraciona naredbad + 5; // beskorisna naredba
{ int min i 10 j 20
• složene naredbe
int min, i = 10, j = 20;min = (i < j ? i : j);cout << min << '\n';
}}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 38
Naredbe
IF naredba
• tip I
if (izraz)naredba;
if (djelilac != 0)kolicnik=djelitelj/djelilac;
• tip I
naredba; kolicnik=djelitelj/djelilac;
i II
if (izraz)if ((broj%2) != 0)
cout << “Broj je neparan”;
• tip II
( )naredba1;
elsenaredba2;
j j p ;else
cout << “Broj je paran”;
P i j i t
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 39
Primjeri: parnost.cpp
Naredbe
IF naredba
• tip III
if (izraz1)
• tip III
naredba1;else if (izraz2)
naredba2;else if (izraz3)else if (izraz3)
naredba3;…..
elsenaredba_n;
P i j i k d t
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 40
Primjeri: kvadratna.cpp
Naredbe
SWITCH naredba
switch (izraz) {case konstanta_1:
dbnaredbe;break;case konstanta_2:naredbe;naredbe;break;...case konstanta_n:
dbnaredbe;break;default:
naredbe;naredbe;}
P i j i it h
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 41
Primjeri: switch.cpp
Naredbe
WHILE naredba
while (izraz)naredba;
i = 1;sum = 0;while (i <= n)naredba; while (i n)
sum += i++;
Primjer 1. Faktorijel
Primjer 2. Neparni faktor
Primjer 3. Vrijednost funkcije sinus2 1
sin( ) ( 1)(2 1)!
ii xx
i
+∞
= −∑j j j0 (2 1)!i i= +∑
P i j i hil f kt ij l hil f kt hil i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 42
Primjeri: while_faktorijel.cpp while_faktor.cpp while_sinus.cpp
Naredbe
DO naredba
do do {
cin >> n;naredba;
while (izraz);
cin >> n;cout << n * n << '\n';
} while (n != 0);
Primjer 1. Faktorijel
Primjer 2. Kvadrat
P i j i f kt ij l
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 43
Primjeri: faktorijel.cpp
Naredbe
FOR naredba
izraz1; for (izraz1; izraz2; izraz3)
naredba;
;while (izraz2) {
naredba;izraz3;
}
≡}
Primjer 1. Faktorijel
P i j 2 T bli ž jPrimjer 2. Tablica množenja
Primjer 3. ASCII tabela
Primjer 4. Vrijednost funkcije sinus2 1
0sin( ) ( 1)
(2 1)!
ii
i
xxi
+∞
=
= −+∑
Primjeri: for_faktorijel.cpp for_tabMnoz.cpp for_ascii.cpp
f i tlj i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 44
for_sinus.cpp petlja_sinus.cpp
Funkcije
Definicija funkcije
tip ime parametri (potpis)
int Stepen (int baza, int eksponent){
int rezultat = 1;
Zaglavlje, interfejs, prototip
for (int i = 0; i < eksponent; ++i)rezultat *= baza;
return rezultat;Tijelo funkcije
return rezultat;}
Pozivanje funkcije
Stepen (a, b)
argumenti
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 45
Primjeri:
Funkcije
#include <iostream>using namespace std;
int Stepen (int baza, unsigned int eksponent)
Primjeri:
• stepenOsnovni.cpp
{int rezultat = 1;
for (int i = 0; i < eksponent; ++i)
• stepen2.cpp• stepenFile.cpp ( p )
rezultat *= baza;return rezultat;
}
main (){
int a,b; cout << "Unesi bazu:";cout << Unesi bazu: ;cin >> a;cout << "\nUnesi eksponent:";cin >> b;cout << a<<"^" <<b<<"= " << Stepen(a b) << '\n';
• sinusRed.cppcout << a<< <<b<< = << Stepen(a,b) << \n ;system("PAUSE");
}2 1
0sin( ) ( 1)
(2 1)!
ii
i
xxi
+∞
=
= −+∑
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 46
Funkcije
Parametri i argumenti
#include <iostream>i tdusing namespace std;
void Funkcija (int broj){
Prosljeđivanje po vrijednostibroj = 0;cout << “broj = " << broj << '\n';
}
Prosljeđivanje po referenciint main (){
int x = 10;
Prosljeđivanje po referenci
Funkcija(x);cout << "x = " << x << '\n';system("PAUSE");return 0;0;
}
P i j i lij di G li i ij
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 47
Primjeri: proslijedi.cpp Gauss_eliminacija.cpp
Funkcije
Globalno i lokalno područje (scope)
int godina = 1994; // globalna varijablaint Maksimum (int int); // globalna funkcijaint Maksimum (int, int); // globalna funkcijaint main (void) // globalna funkcija{//...}
int xyz; // globalna varijablavoid Funkcija (int xyz) // lokalna prema tijelu funkcije Funkcijavoid Funkcija (int xyz) // lokalna prema tijelu funkcije Funkcija{
if (xyz > 0) {double xyz; // lokalna u bloku if naredbe
//...}
}
Scope operator ::
P i j i d j
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 48
Primjeri: podrucje.cpp
Funkcije
Rekurzivne funkcije
#include <iostream>#include <iostream>using namespace std;
int Faktorijel (unsigned int n){
return n == 0 ? 1 : n * Faktorijel(n-1);}
main (){
int n;;cout<<"Unesite prirodan broj:";cin>>n;cout<<"\nFaktorijel broja n je "<<Faktorijel(n)<<endl;
t ("PAUSE")system("PAUSE");}
P i j i F kt ij l
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 49
Primjeri: Faktorijel.cpp
Funkcije
Opterećene (overloaded) funkcije
int Stepen (int baza, int eksponent){
int rezultat = 1;
for (int i = 0; i < eksponent; ++i)rezultat *= baza;
return rezultat;}}
double Stepen (double baza, double eksponent){
return exp(eksponent*log(baza));p( p g( ));}
double Stepen (double eksponent){{
return Stepen(2.0,eksponent);}
P i j i t O t
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 50
Primjeri: stepenOpterecen.cpp
Polja (arrays)
Definisanje i inicijalizacija polja
int visina[10];
visina[3]=654;visina[3]=654;
•Eksplicitna inicijalizacijap j j
double broj[3]={3.14,5.25,7.0};
double broj[3] {3 14 5 25}; // znači broj[2] 0;double broj[3]={3.14,5.25}; // znači broj[2]=0;
•Implicitna inicijalizacijap j j
double broj[]={3.14,5.25,7.0};
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 51
Polja (arrays)
#include <iostream>using namespace std;
main (){
int velicina;;cout <<"Broj elemenata ....";cin >> velicina;int n[velicina];
// Unos podatakafor(int i=0 ; i < velicina; i++){
cout<< "n[" << i << "]= ";
//Racunanje zbira svih elemenata nizafor (int i = 0; i < velicina; ++i)
srednja += n[i];cout<< n[ << i << ]= ;cin>>n[i];}
double srednja = 0;
srednja/=velicina;
cout << "Srednja vrijednost je .... "<<srednja << "\n";
system("PAUSE");}
P i j i d j
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 52
Primjeri: srednja.cpp
Polja (arrays)
#include <iostream>using namespace std;int main ()int main (){
// DEKLARACIJAint x[10];int y[10];int y[10];int i, j, n;// UNOSENJE cout << "Unesite broj članova polja: ";cin >> n
// SORTIRANJEfor (i = 0; i < n-1; i++)
{cin >> n;for (i = 0; i < n; i++)
{cout << "Unesite clan br. " << i << ": ";i [i]
for (j = i+1; j < n; j++){
if (y[i] < y[j]) swap(y[i],y[j]);}
cin >> x[i];y[i] = x[i];
}
}// STAMPANJEcout << "x:" << '\t' << "y:" << endl;for (i = 0; i < n; i++)( )
{cout << x[i] << '\t' << y[i] << endl;
}}P i j i ti j
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 53
}Primjeri: sortiranje.cpp
Polja (arrays)
Znakovni nizovi
char fakultet[] = “Pedagoski fakultet”;
P i j i k i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 54
Primjeri: znakovni.cpp
Polja (arrays) - višedimenzionalna polja
Definisanje i inicijalizacija
Proljeće Ljeto Jesen Zima
Sarajevo 10 20 10 1j
Tuzla 13 21 12 3
Zenica 14 23 11 4
int godDobTemp[3][4];
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 55
Organizacija varijable godDobTemp u memoriji
Polja (arrays) - višedimenzionalna polja
int godDobTemp[3][4] = {{10, 20, 10, 1},{ , , , },{13, 21, 12, 3},{14, 23, 11, 4}
};
int godDobTemp[3][4] = {10,20,10,1,13,21,12,3,14,23,11,4
};
int godDobTemp[3][4] = {{10}, {13}, {14}};
int godDobTemp[][4] = {{10, 20, 10, 1},{13, 21, 12, 3},{14 23 11 4}{14, 23, 11, 4}
};
P i j i T
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 56
Primjeri: maxTemp.cpp
Polja (arrays) - višedimenzionalna polja
Primjer primjene – Gaussova metoda eliminacije (rješavanje sistema linearnih jednačina)
a x a x a x a+ + + = x nepoznate promjenljive00 0 10 1 1,0 1 ,0
12 0 11 1 1,1 1 ,1
......
............................................
n n n
n n n
a x a x a x aa x a x a x a
− −
− −
+ + + =
+ + + =
xi – nepoznate promjenljive
Aij – koeficijenti nepoznatih promjenljivih
An,i – nehomogeni članovi1, 1 0 1, 1 1 1, 1 1 , 1...n n n n n n na x a x a x a− − − − − −+ + + =
n,i g
i,j = 0,1,...,n-1
Proces eliminacije
0, 2, 1, 1, , k=ikij ij kj
kk
aa a a i n j i n i na
⎛ ⎞= − = − = + −⎜ ⎟
⎝ ⎠
Zamjena unazad1n
a a x−
∑,1, 1
11, 1
i n ij j
j in nn i
n n ii
a a xa
x xa a
= +−−
− −
−= =
∑
P i j i G li i ij G J d H
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 57
Primjeri: Gauss_eliminacija.cpp Gauss_Jordan.cpp Horner.cpp
Polja (arrays) - višedimenzionalna polja
#include <iostream>
using namespace std;
int main ()()
{
int n;
t "U it b j j d i \ "cout << "Unesite broj jednacina ...\n";
cout << "n="; cin >> n;
double x[n];
double Ab[n][n+1];
double m[n][n];// Unos elemenata sistema
t "U it k fi ij t t i A i kt b \ "cout << "Unesite koeficijente matrice A i vektora b ....\n";
for (int i=0;i<n;i++){
for (int j=0;j<=n;j++){
cout<<"A[" <<i<<"]["<<j<<"]="; cin >>Ab[i][j];
}
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 58
}
Polja (arrays) - višedimenzionalna polja
//Gaussov algoritam
for (int i=0;i<n-1;i++){
for (int j=i+1;j<n;j++){( j j j ){
m[j][i]=Ab[j][i]/Ab[i][i];
for (int k=i;k<n+1;k++)
Ab[j][k] [j][i]*Ab[i][k]Ab[j][k]-=m[j][i]*Ab[i][k];
}
}
//Zamjena unazad
x[n-1]=Ab[n-1][n]/Ab[n-1][n-1];
for (int i=n 2;i>=0;i ){
// Ispis rješenja
cout << " \nRjesenje sistema je:\n";for (int i=n-2;i>=0;i--){
double sum=0.0;
for (int j=i+1;j<n;j++)
cout << \nRjesenje sistema je:\n ;
for (int i=0;i<n;i++){
cout <<"x"<<i<<"="<<x[i]<<endl;
sum=sum+Ab[i][j]*x[j];
x[i]=(Ab[i][n]-sum)/Ab[i][i];
}
}
system ("PAUSE");
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 59
} }
Pointeri
Definisanje
Pointeri (pokazivači) predstavljaju adresu neke memorijske lokacije i omogućuju indirektni način pristupa podacima u memoriji.
int *ptr1; // pointer cijelog brojachar *ptr2; // pointer karaktera
Definisanje
p ; p
int broj;int broj;ptr1 &broj; prt1 broj
adresa varijable broj je pridružena ptr1
& - adresni operator: uzima varijablu kao argument i vraća memorijsku adresu te varijable
*ptr1; dereferencira ptr1 kako bi se dobilo ono što pokazuje ekvivalentno sa broj!pokazuje – ekvivalentno sa broj!
* - operator dereferenciranja: uzima pointer kao argument i vraća sadržaj memorijske lokacije na koju pokazuje.
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 60
Pointeri
Konvertovanje
• tip pointera mora odgovarati tipu podatka na koji pokazuje
• pointer tipa void odgovara bilo kojem tipu
ptr2 = (char*) ptr1; konvertuje ptr1 u pointer karaktera prije nego se pridruži ptr2
P i j i i t iO i
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 61
Primjeri: pointeriOsnovni.cpp
Pointeri
Dinamička memorija i objekti
• programski stog (stack) – pohranjivanje globalnih varijabli, blokova stogova za pozivanje funkcija, ...: p g g ( ) p j j g j g p j jSTATIČKA MEMORIJA
• Hrpa (heap) – dinamičko alociranje memorijskih blokova u toku izvršenja programa: DINAMIČKA (JAVNA) MEMORIJA
Alociranje memorijskih blokova u hrpiAlociranje memorijskih blokova u hrpi
• operator new: uzima tip podatka kao argument i alocira memorijski prostor za objekat tog tipa
int *ptr = new int; //alocira prostor za jedan cijeli brojchar *str = new char[10]; //alocira prostor za niz od 10 karaktera
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 62
Pointeri
Područje definisanosti u hrpi
• memorija alocirana iz hrpe ne ispunjava ista pravila područja definisanosti kao normalne varijable
void Funkcija (void){
varijable
Pri vraćanju vrijednosti pozivom funkcijechar *str = new char[10];// .....
}
Pri vraćanju vrijednosti pozivom funkcije Funkcija, lokalna str varijabla je uništena, ali memorijeski prostor koji pokazuje na str nije.
Dealociranje (oslobađanje) memorijskih blokova u hrpi
d l t i i k i l b đ ij ki k ji j i k j
delete ptr; // briše neki objekat ili prvi član niza (ukoliko ptr pokazuje na niz)delete [] str; // briše niz objekata
• operator delete: uzima pointer kao argument i oslobađa memorijski prostor na koji taj pointer pokazuje
delete [] str; // briše niz objekata
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 63
Pointeri
Pointeri i polja
• Pointeri i polja su povezani, jer se elementima polja pristupa preko pointera
int cijeliBroj[10];
Ime arijable cijeliBroj ima smisao pointera na pr i elemenat polja cijeliBroj[0]Ime varijable cijeliBroj ima smisao pointera na prvi elemenat polja, cijeliBroj[0]
i t b j ij liB j[3]uzmi adresu prvog elementa polja, povećaj je za 3 pogledaj šta se nalaziint broj = cijeliBroj[3]; int broj = *(cijeliBroj+3) povećaj je za 3, pogledaj šta se nalazi na toj adresi, te pridruži tu vrijednost varijabli broj
P i j i i t iP lj
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 64
Primjeri: pointeriPolja.cpp
Pointeri
Aritmetika sa pointerima
char *str = "VOZDRA";
int broj[] = {10, 20, 30, 40};
int *ptr =&broj[0];
V O Z D R A \0 10 20 30 40
str
str++
ptr
ptr++
int *ptr1 = &broj[1];
int *ptr2 = &broj[3];int ptr2 &broj[3];
int n = ptr2 - ptr1; // n postaje 2
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 65
Primjeri: pointeriAritmetika.cpp
Pointeri
void CopyString (char *dest, char *src)
{
while (*dest++ = *src++)while (*dest++ = *src++)
;
}
int najTemp (const int *temp, const int redovi, const int kolone)
{
int najveca = 0;
for (int i = 0; i < redovi; ++i)
for (int j = 0; j < kolone; ++j)for (int j = 0; j < kolone; ++j)
if (*(temp + i * kolone + j) > najveca)
najveca = *(temp + i * kolone + j);
return najveca;
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 66
Primjeri: pointeriAritmetikaCopy.cpp pointeriAritmetikaNaj.cpp
Pointeri
Funkcijski pointeri
• uzima se adresa funkcije i pohranjuje kao pointer funkcije – za indirektno pozivanje funkcije
Definiše pointer na funkciju Uporedi koja može zadržati adresu bilo koje funkcije koja za argumente uzima dva konstantna pointera tipa int (*Uporedi)(const char*, const char*);char i vraća cjelobrojnu vrijednost.
U di & t // f k ij U di k j t f k ijUporedi = &strcmp; // funkcija Uporedi pokazuje na strcmp funkciju
ili
Uporedi = strcmp; // funkcija Uporedi pokazuje na strcmp funkciju
ili
int (*Uporedi)(const char*, const char*) = strcmp; // jer int strcmp(const char*, const char*);
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 67
Pointeri
strcmp("Suljo","Mujo"); // direktni poziv
(*Uporedi)("Suljo","Mujo"); // indirektni poziv
Uporedi("Suljo","Mujo"); // indirektni poziv (skraćeno)
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 68
Primjeri: funkcijskiPointeri.cpp funkcijskiPointeriIntegral.cpp
Pointeri
Reference
• (simbolički) nadimak za neki objekat
double broj1 = 3.14;
double &broj2 = broj1;
• pri definisanju reference se MORAJU inicijalizirati
double &broj3; // nepravilno: referenca je bez inicijalizatora!!!
broj3 = broj1;
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 69
Primjeri: referenceOsnovno.cpp
Pointeri
void Zamijeni1 (int x, int y) // po vrijednosti (objekti){
int temp = x;int temp x;x = y;y = temp;
}
void Zamijeni2 (int *x, int *y) // po vrijednosti (pointeri){
int temp = *x;*x = *y;x = y;*y = temp;
}
id Z ij i3 (i t & i t & ) // f ivoid Zamijeni3 (int &x, int &y) // po referenci{
int temp = x;x = y;y = temp;
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 70
Primjeri: reference.cpp
Datoteke
#include <fstream>
ofstream – za kreiranje datoteka i zapisivanje u datoteku (output)ifstream – za čitanje podataka iz datoteka (input)fstream – za čitanje podataka iz datoteka, kreiranje datoteka i zapisivanje u datotekuj p j p j
‘Životni’ ciklus pristupa datotekamaŽivotni ciklus pristupa datotekama
• Otvaranje datoteke
• Rad sa datotekom
• Zatvaranje datoteke
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 71
Datoteke
ofstream objekat
Otvaranje datoteke za pisanje
ofstream uDat;uDat.open("studenti.dat");
ofstream uDat; uDat.open("c:\\fakultet\\godina\\studenti.dat");
ofstream uDat;ofstream uDat; char imeDatoteke[80]; cout << “Unesite ime datoteke: "; cin >> imeDatoteke;
D t (i D t t k )uDat.open(imeDatoteke);
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 72
Primjeri: upisOsnovni.cpp
Datoteke
ios::appios::binary
Korištenje drugog argumenta (file mode flags) – kao fstream objekat
ios::binaryios::inios::out
fstream uDat;fstream uDat; uDat.open("studenti.dat", ios::out);
ofstream uDat(“studenti.dat");
Otvaranje pomoću konstruktora
fstream uDat(“studenti.dat", ios:out);
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 73
Datoteke
Otvaranje datoteke za čitanje
ifstream saDat; saDat.open("studenti.dat");
fstream saDat;fstream saDat; saDat.open("studenti.dat", ios::in);
k k
ifstream saDat ("studenti.dat");fstream saDat ("studenti.dat", ios::in);
Otvaranje pomoću konstruktora
( )
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 74
Primjeri: ispisOsnovni.cpp
Datoteke
Otvaranje datoteke za pisanje i čitanje
fstream datoteka; datoteka.open("studenti.dat", ios::in | ios::out);
Ot j ć k t kt
fstream datoteka("studenti.dat", ios::in | ios::out);
Otvaranje pomoću konstruktora
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 75
Primjeri: upisIspisOsnovni.cpp
Datoteke
#include <fstream>#include <iostream>using namespace std;
Provjera da li je datoteka otvorena
using namespace std;
int main (){ ifstream saDat; saDat.open("studenti.dat");
Za čitanje
cout << "(saDat) = " << saDat << endl; cout << "(saDat.fail()) = " << saDat.fail() << endl; return 0;
}
#include <fstream>#include <iostream>using namespace std;
Za pisanjeint main (){
ofstream uDat; uDat.open("studenti.dat"); cout << "( uDat) = " << uDat << endl; co t << "( Dat fail()) " << Dat fail() << endlcout << "( uDat.fail()) = " << uDat.fail() << endl; return 0;
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 76
Primjeri: provjeraUpis.cpp provjeraUpis2.cpp provjeraIspis.cpp
Datoteke
Zapisivanje u datoteku
f t D tofstream uDat; uDat.open("studenti.dat");
uDat << podaci << endl;
Čitanje iz datoteke
ifstream saDat; saDat.open("studenti.dat");
saDat >> podaci;
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 77
Primjeri: ispisOsnovno.cpp
Datoteke
Zatvaranje datoteke
f t D t
Za pisanje
ofstream uDat; uDat.open("studenti.dat"); // skup naredbi uDat.close();
if D
Za čitanje
ifstream saDat; saDat.open("studenti.dat"); // skup naredbisaDat.close();
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 78
Zapisivanje u datoteku
Datoteke
#include <fstream>#include <iostream>
i td
Zapisivanje u datoteku
using namespace std;
int main (){ char podaci[80];
f t D tofstream uDat; uDat.open("studenti.dat"); cout << “Upisivanje u datoteku" << endl; cout << "===================" << endl; cout << “Unesite ime razreda: "; cin.getline(podaci, 80); uDat << podaci << endl; cout << “Unesite broj studenata: "; jcin >> podaci; cin.ignore(); uDat << podaci << endl; uDat.close(); ();return 0;
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 79
Primjeri: upis.cpp
Zapisi anje datotek
Datoteke
#include <iostream>#include <string>
Zapisivanje u datoteku
#include <string>#include <fstream>using namespace std;int main (){{
string x;ofstream uDat;uDat.open("podaci.txt", ios::app);while (x != "***") {
cout << "Unesite neki tekst (za kraj unesite ***):" << endl;cin >> x;uDat << x << endl;
}uDat.close();
}}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 80
Primjeri: upisDodaj.cpp
Zapisivanje u i ispisivanje sa datoteke
Datoteke
#include <fstream>#include <iostream>using namespace std;
Zapisivanje u i ispisivanje sa datoteke
using namespace std;int main (){
char podaci[80]; ofstream uDat; uDat open("studenti dat");uDat.open( studenti.dat ); cout << “Upisivanje u datoteku" << endl; cout << "===================" << endl; cout << “Unesite ime razreda: "; cin getline(podaci 80);
ifstream saDat; cin.getline(podaci, 80); uDat << podaci << endl; cout << “Unesite broj studenata: "; cin >> podaci; cin ignore();
cout << “Citanje sa datoteke" << endl; cout << "=====================" << endl; saDat.open("studenti.dat"); saDat >> podaci;
cin.ignore(); uDat << podaci << endl; uDat.close();
cout << podaci << endl; saDat >> podaci; cout << podaci << endl; saDat.close(); ();return 0;
}
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 81
Primjeri: upisIspis.cpp upisIspis2.cpp
Sukcesivno citanje sa datoteke
Datoteke
ifstream saDat;saDat.open(“podaci.dat");
Sukcesivno citanje sa datoteke
p ( p );saDat >> podaci;
while(!saDat.eof()) { saDat >> podaci; cout << podaci;cout podaci;
} saDat.close();
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 82
Primjeri: sukcCitanje.cpp datotekaOpsti.cpp
U susret OOP I
Obj kt ij ti i jObjektno – orijentisano programiranje
• Klase (razredi)
• Overloading• Overloading
• Nasljeđivanje
• Templejtip j
• Windows projekti
PROCEDURALNO PROGRAMIRANJE www.pf.unze.ba/PP 83