Preuzmite Skripta objektno programiranje i više Rezime u PDF od Objektno orijentisano programiranje samo na Docsity!
Mr Aleksandar Kupusinac
Dr Dušan Malbaški
Univerzitet u Novom Sadu
Fakultet tehničkih nauka
Departman za računarstvo i automatiku
Katedra za primenjene računarske nauke
21000 Novi Sad, Trg Dositeja Obradovića 6
PRAKTIKUM ZA VEŽBE IZ
OBJEKTNO ORIJENTISANOG
PROGRAMIRANJA
Novi Sad
Sadržaj
- A. Kupusinac i D. Malbaški
- Vežbe
- PROGRAMSKO OKRUŽENJE Code::Blocks
- PROMENLJIVE..............................................................................................................
- POKAZIVAČI
- NIZOVI
- FUNKCIJE
- Vežbe
- REFERENCE
- ULAZ I IZLAZ PODATAKA
- Vežbe
- OSNOVE OBJEKTNOG PROGRAMIRANJA
- DEFINICIJA KLASE U C++
- KLASA Semaphore
- Vežbe
- KLASA FMRadio........................................................................................................
- KOMPOZICIJA KLASE
- Vežbe
- UGRAðENI KONSTRUKTOR
- KONSTRUKTOR KOPIJE...........................................................................................
- PREKLAPANJE METODA
- PREKLAPANJE OPERATORA
- Vežbe
- Vežbe
- Vežbe
- NASLEðIVANJE - ZADACI.......................................................................................
- METODE IZVEDENE KLASE....................................................................................
- KLASE Person, Student i PhDStudent.............................................................
- Vežbe
- VIRTUELNE METODE...............................................................................................
- KLASE Person, Student i PhDStudent.............................................................
- APSTRAKTNE KLASE
- ZAJEDNIČKI ČLANOVI KLASE...............................................................................
- Vežbe
- Vežbe
- GENERIČKE KLASE - ZADACI...............................................................................
A. Kupusinac i D. Malbaški 4
Slika 1.2.
Ukoliko je sve pravilno urañeno dobijamo izgled ekrana kao što je prikazano na slici 1.3.
Slika 1.3.
Praktikum za vežbe iz objektno orijentisanog programiranja 5
U glavnom meniju biramo opciju File, a zatim New File, posle čega se pojavljuje prozor u
kojem treba da navedemo ime fajla (na primer hello.cpp) i zatim kliknemo na dugme Save. Na ekranu
će se pojaviti pitanje da li želimo da se naš fajl ubaci u trenutno aktivan projekat (Do you want to
add this file in the active project?). Kliknemo na dugme Yes i dobijamo izgled ekrana
kao što je prikazano na slici 1.4. U desnom delu prozora se nalazi prostor gde ćemo ukucati tekst našeg
programa.
Slika 1.4.
Kada je tekst programa napisan potrebno ga je snimiti (biramo opciju File, a zatim opciju
Save). Program se pokreće tako što se u glavnom meniju izabere opcija Build i dobija padajući meni u
okviru koje se prvo bira opcija Build (ili Ctrl+F9), a zatim opcija Run (ili Ctrl+F10). Takoñe, kada
se u glavnom meniju izabere opcija Build u padajućem meniju postoji opcija Build&run (ili F9) koja
objedinjuje opciju Build i Run. Dakle, kada je naš program napisan i snimljen, pritiskom na F9 dobijamo
korisnički ekran na kojem vidimo da je ispisana poruka Hello world!, što je i bio cilj ove vežbe.
Već postojeći projekat se može pokrenuti tako što se u glavnom meniju izabere opcija File, a
zatim opciju Open. Projekat ima ekstenziju .cbp.
Praktikum za vežbe iz objektno orijentisanog programiranja 7
POKAZIVAČI
- Pokazivač je promenljiva koja sadrži neku adresu.
- Pokazivač se deklariše na ovaj način:
int *iPok; // pokazivac na tip int
double *dPok; // pokazivac na tip double
void *vPok; // genericki pokazivac
- Pošto pokazivač sadrži adresu možemo zaključiti da bez obzira na koji tip pokazuju, svi
pokazivači su istog formata, tj. veličina memorija svih pokazivača je ista (ako su adrese 32 bita,
onda će svaki pokazivač zauzimati 32 bita).
Zadatak 1.
Napisati program koji primenom operatora sizeof odrediti veličinu memorije u bitima koja
potrebna za smeštanje podataka tipa: char, int, double, char, int, double* i void*.
Rešenje.
#include <stdio.h> int main() { printf("Velicina memorije (izrazena u bitima) iznosi:"); printf("\n-za char \t %d",8sizeof(char)); printf("\n-za int \t %d",8sizeof(int)); printf("\n-za double \t %d",8sizeof(double)); printf("\n-za char \t %d",8sizeof(char)); printf("\n-za int* \t %d",8sizeof(int)); printf("\n-za double* \t %d",8sizeof(double)); printf("\n-za void* \t %d",8sizeof(void)); return 0; }
Operator sizeof vraća veličinu memorije za dati tip izraženu u bajtima, pa zbog toga taj broj
množimo sa 8. Pokretanjem programa dobija sledeći ispis na ekranu:
Velicina memorije (izrazena u bitima) iznosi: -za char 8 -za int 32 -za double 64 -za char* 32 -za int* 32 -za double* 32 -za void* 32
- Kada kažemo da neki pokazivač «pokazuje» na neku promenljivu, to zapravo znači da adresa te
promenljive je sadržaj pokazivača.
- Unarni operator & vraća memorijsku adresu nekog podatka (na primer, &x).
- Primenom unarnog operatora * može se posredno pristupiti nekom podatku pomoću memorijske
adrese (na primer, *p).
A. Kupusinac i D. Malbaški 8
Zadatak 1.
Analizirati ispis sledećeg programa:
#include <stdio.h> int main(){ int *pi1; int *pi2; double pd1; double pd2; printf("\nAdresa pokazivaca pi1: %d",&pi1); printf("\nAdresa pokazivaca pi2: %d",&pi2); printf("\nAdresa pokazivaca pd1: %d",&pd1); printf("\nAdresa pokazivaca pd2: %d",&pd2); printf("\n-----------------------------------------------------------\n"); int x1; int x2=1; double y1; double y2=0.5; pi1=&x1; pi2=&x2; pd1=&y1; pd2=&y2; printf("\nSadrzaj pokazivaca pi1 je adresa promenljive x1: %d",pi1); printf("\nSadrzaj pokazivaca pi2 je adresa promenljive x2: %d",pi2); printf("\nSadrzaj pokazivaca pd1 je adresa promenljive y1: %d",pd1); printf("\nSadrzaj pokazivaca pd2 je adresa promenljive y2: %d",pd2); printf("\n-----------------------------------------------------------\n"); pi1=2; pd1=1.3; printf("\nVrednost promenljive x1: %d",pi1); printf("\nVrednost promenljive x2: %d",pi2); printf("\nVrednost promenljive y1: %f",pd1); printf("\nVrednost promenljive y2: %f",pd2); printf("\n-----------------------------------------------------------\n"); return 0; }
Izvršavanjem programa na dobijamo sledeći ispis na ekranu:
Adresa pokazivaca pi1: 22ff Adresa pokazivaca pi2: 22ff Adresa pokazivaca pd1: 22ff6c Adresa pokazivaca pd2: 22ff
Sadrzaj pokazivaca pi1 je adresa promenljive x1: 22ff Sadrzaj pokazivaca pi2 je adresa promenljive x2: 22ff Sadrzaj pokazivaca pd1 je adresa promenljive y1: 22ff Sadrzaj pokazivaca pd2 je adresa promenljive y2: 22ff
Vrednost promenljive x1: 2 Vrednost promenljive x2: 1 Vrednost promenljive y1: 1. Vrednost promenljive y2: 0.
A. Kupusinac i D. Malbaški 10
- Na slici 1.7 je prikazana organizacija u memoriji celobrojnog niza niza a koji ima 5 elemenata.
Ime niza je pokazivač koji sadrži adresu početka niza.
ADRESE SADRŽAJI
0000 0008 0000 001C
0000 000C
0000 001C
a
0000 002C
a[0]
a[1]
a[2]
a[3]
a[4]
Slika 1.7.
- i-tom elementu se može pristupiti sa a[i] ili *(a+i).
- Indeksiranje niza počinje sa brojem 0.
Zadatak 1.
Napisati program za pronalaženje maksimalnog elementa statičkog niza celih brojeva (niz može
imati najviše 30 elemenata).
Rešenje.
#include <stdio.h> int main() { int a[30], n=0, i, max; while(n<=0 || n>30) { printf("Unesite broj elemenata niza: "); scanf("%d",&n); } for(i=0; i<n; i++) { printf("Unesite broj a[%d",i); printf("]= "); scanf("%d",&a[i]); } max=a[0]; for(i=1; i<n; i++)
Praktikum za vežbe iz objektno orijentisanog programiranja 11
if(a[i]>max) max=a[i]; printf("Maksimalni element niza je: %d",max); return 0; }
Zadatak 1.
Napisati program za sortiranje dinamičkog niza celih brojeva po neopadajućem redosledu.
Rešenje.
#include <stdio.h> #include <stdlib.h> int main() { int a; int n=0, i, j, t; while(n<=0) { printf("Unesite broj elemenata niza: "); scanf("%d", &n); } if((a=(int)malloc(n*sizeof(int)))==NULL) exit(0); for(i=0; i<n; i++) { printf("Unesite broj a[%d",i); printf("]= "); scanf("%d",a+i); } for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if( *(a+i) > (a+j) ) { t=(a+i); (a+i)=(a+j); (a+j)=t; } printf("Sortiran niz po neopadajucem redosledu: \n"); for(i=0; i<n; i++) { printf("a[%d",i); printf("]= %d \n",(a+i)); } return 0; } FUNKCIJE
- Potprogrami predstavljaju mehanizam pomoću kojeg se složeni problemi razbijaju na
jednostavnije potprobleme. Programski jezik C formalno poznaje samo jednu vrstu potprograma, a
to su funkcije.
Praktikum za vežbe iz objektno orijentisanog programiranja 13
Vežbe 2
REFERENCE
- Referenca ili upućivač u programskom jeziku C++ je alternativno ime za neki podatak (drugo ime
za neki podatak).
- Reference nisu podaci. Reference ne zauzimaju prostor u memoriji, pa se ne može tražiti njihova
adresa. Reference pridružuju nekom podatku (promenljivoj ili konstanti) koji se već nalazi u
memoriji (na nekoj adresi).
- Ne postoje pokazivači na reference. Ne postoje nizovi referenci.
- Prilikom definisanja reference moraju da se inicijalizuju nekim podatkom koji se već nalazi na
nekoj adresi u memoriji.
- Reference ne mogu da promene vrednost. Sve izvršene operacije nad referencama deluju na
originalne podatke.
- Referenca se definiše na ovaj način:
int x=5;
int &rx=x; //rx je referenca inicijalizovana promenljivom x
double y1;
double y2;
double &ry; //greska, ovo ne moze
double &ry=y1; //sad je u redu
ry=y2; //greska, jer referenca ne moze da menja vrednost
- Reference služe da bi se izbeglo korišćenje pokazivača. Reference su slične pokazivačima, ali
postoje odreñene razlike.
- SLIČNOST REFERENCI SA POKAZIVAČIMA:
o Referenca je adresa (drugo ime za originalni podatak), a vrednost pokazivača je takoñe
adresa. Dakle, njihova ostvarenja su ppreko adresa podataka kojima su pridruženi.
- RAZLIKE IZMEðU REFERENCI I POKAZIVAČA:
o Referenca je čvrsto vezana za podatak, dok vrednost pokazivača nije čvrsto vezana za
podatak, tj. pokazivač može da sadrži adresu jednog podatka i nakon toga može da se
promeni njegova vrednost i da pokazuje na drugi podatak.
o Dok kod svakog pominjanja reference podrazumeva se posredan pristup podatku na
kojeg upućuje, kod pokazivača je potrebno koristiti operator za indirektno adresiranje *.
o Dok pokazivači jesu pravi podaci koji imaju adresu, zauzimaju odreñen prostor u
memoriji i može im se po potrebi promeni vrednost, reference nisu podaci i treba ih
shvatiti samo kao alternativno ime koje se čvrsto vezuje za neki podatak koji već postoji
na nekoj adresi u memoriji.
A. Kupusinac i D. Malbaški 14
Zadatak 2.
Analizirati ispis sledećeg programa:
#include using namespace std; int main() { int x=5; int &rx=x; int *y; y=&x; cout<<"Adresa od x je: "<<&x<<endl; cout<<"Adresa od rx je: "<<&rx<<endl; cout<<"Adresa pokazivaca y je: "<<&y<<endl; cout<<"Sadrzaj pokazivaca y je adresa: "<<y<<endl; cout<<"x="<<x<<endl; rx++; // promena originala x preko reference rx cout<<"x="<<x<<endl; *y=10; // promena originala x preko pokazivaca y cout<<"x="<<x<<endl; rx=3; // ponovo, promena originala x preko reference rx cout<<"x="<<x<<endl; return 0; }
Uz napomenu da treba očekivati da dobijene vrednosti adresa će se razlikovati, na ekranu
dobijamo sledeći ispis:
Adresa od x je: 0x22ff Adresa od rx je: 0x22ff Adresa pokazivaca y je: 0x22ff6c Sadrzaj pokazivaca y je: 0x22ff x= x= x= x= ULAZ I IZLAZ PODATAKA
- U programskom jeziku C++ dodeljena su nova značenja operatorima << i >>. Značenje tih
operatora je ostalo isto ukoliko su oba operanda celobrojne vrednosti (služe za pomeranje levog
operanda za onoliko binarnih mesta koliko je vrednost desnog operanda), meñutim ukoliko je prvi
operand referenca na tekstualnu datoteku onda te operatore koristimo za ulaz/izlaz podataka.
- Ukoliko je prvi operand operatora >> referenca na tekstualnu datoteku tada se operator koristi za
čitanje jednog podatka iz te datoteke i smeštanje u drugi operand, uz primenu ulazne konverzije
koja odgovara tipu drugog operanda. Na primer, ako je in referenca na datoteku, a x promenljiva
tipa int, tada se izrazom in>>x čita iz datoteke jedan podatak tipa int i smešta u promenljivu
x.
A. Kupusinac i D. Malbaški 16
cout<<"Unesite prirodan broj n koji nije veci od 100... "<<endl; cin>>n; f[0]=1; if(n>1) f[1]=1; if(n>2) for(i=2; i<n; i++) f[i]=f[i-1]+f[i-2]; cout<<"Ispis Fibonacijevih brojeva... "<<endl; for(i=0; i<n; i++) cout<<"f["<<i<<"] = "<<f[i]<<endl; return 0; } PODRAZUMEVANE VREDNOSTI FUNKCIJA
- U programskom jeziku C++ postoji mogućnost da se u definiciji funkcije navedu podrazumevane
vrednosti formalnih argumenata. Kada u pozivu tako napisane funkcije nedostaju stvarni
argumenti, onda se koriste navedene podrazumevane vrednosti. Na primer:
void f(int x=2, int y=3) {... }
- Ako se u listi argumenata za neki argument želi navesti podrazumevana vrednost, onda je
potrebno navesti podrazumevane vrednosti za sve argumente posle njega.
void f(int x, int y=3, int z=4) {... } // ovo moze
void f(int x, int y=3, int z) {... } // ovo ne moze
Zadatak 2.
Potrebno je postaviti pločice u kuhinji. Napisati program koji za zadate dimenzije površine
izračunava broj potrebnih pločica da bi se data površina pokrila. Prodavac isporučuje samo pločice oblika
kvadrata i uslužuje kupca tako što ukoliko kupac ne navede željene dimenzije pločica prodavac isporučuje
pločice koje uvek ima u magacinu i koje su oblika kvadrata sa stranicom 15cm.
#include using namespace std; int brojPlocica(double x, double y, int a=15) { double P=xy; cout<<"Povrsina u [cm2] iznosi: "<<P<<endl; double p=aa; cout<<"Povrsina jedne plocice u [cm2] iznosi: "<<p<<endl; int broj=(int)P/p; // broj potrebnih plocica return broj; } int main() { double x, y, a; cout<<"Duzina povrsine koja se poplocava u [cm] --> "; cin>>x; cout<<"Sirina povrsine koja se poplocava u [cm] --> "; cin>>y;
Praktikum za vežbe iz objektno orijentisanog programiranja 17
char odg; cout<<"Da li zelite da Vi izaberete dimenzije plocica? [Y/N]... "; cin>>odg; if(odg=='Y' || odg=='y') { cout<<"Plocice su oblika kvadrata. "; cout<<"Navedite duzinu stranice plocice u [cm] --> "; cin>>a; cout<<"Potreban broj plocica iznosi: "<<brojPlocica(x,y,a); } if(odg=='N' || odg=='n') cout<<"Potreban broj plocica iznosi: "<<brojPlocica(x,y); return 0; } PREKLAPANJE IMENA FUNKCIJA
- U programskom jeziku C++ postoji mehanizam preklapanja imena funkcija koji omogućava da se
više funkcija nazove istim imenom, ali se one moraju razlikovati po broju i/ili tipovima
argumenata i to tako da se obezbedi njihova jednoznačna identifikacija. Tipovi funkcija sa istim
imenom mogu biti isti.
Zadatak 2.
Analizirati ispis sledećeg programa:
#include using namespace std; bool f(int a, int b) { cout<<"Poziv funkcije f() - prva verzija"<<endl; if(a>b) return true; else return false; } bool f(double a, double b) { cout<<"Poziv funkcije f() - druga verzija"<<endl; if(a>b) return true; else return false; } bool f(char a, char b) { cout<<"Poziv funkcije f() - treca verzija"<<endl; if(a>b) return true; else return false; } int main(){ cout<<f(5, 3)<<endl; cout<<f(7.4, 5.6)<<endl; cout<<f('a', 'b')<<endl; return 0; }
Praktikum za vežbe iz objektno orijentisanog programiranja 19
using B::x; cout<<x<<endl; return 0; }
Pokretanjem programa na ekranu se dobija ispis:
- Po Standardu programskog jezika C++ je predviñeno da sva standardna zaglavlja sve globalne
identifikatore stavljaju u imenski prostor std. Standardom je predviñeno da standardna zaglavlja
ne budu u vidu tekstualnih datoteka, pa zbog toga standardna zaglavlja ne sadrže proširenje imena
sa .h (kao što je to slučaj u C-u). Jedno od takvih zaglavlja jeste i . Zbog toga ćemo
uvek pisati na početku programa:
#include
using namespace std;
- Ukoliko ne uključimo imenski prosotor std za ispis promenljive x moramo pisati:
std::cout<<x;
- Ukoliko uključimo imenski prosotor std za ispis promenljive x dovoljno je pisati:
cout<<x;
#include
int main() {
int x=5;
std::cout<<x;
using namespace std;
cout<<x;
return 0;
DOBIJANJE IZVRŠNE DATOTEKE
- Obrada programa u programskom jeziku C++ obihvata sledeće faze:
o Unošenje izvornog teksta programa i dobijanje .cpp datoteka,
o Prevoñenje (kompajliranje) i dobijanje .obj datoteka,
o Povezivanje prevedenih datoteka u jednu izvršnu datoteku .exe.
A. Kupusinac i D. Malbaški 20
- Pretprocesiranje podrazumeva odreñene obrade izvornog teksta programa pre početka prevoñenja.
- Pretprocesorski direktivama se može postići sledeće:
o Zamena identifikatora sa nizom simbola u programu sa direktivom #define
#define identifikator niz_simbola
o Umetanje sadržaja datoteke sa direktivom #include
#include “korisnicka_datoteka”
#include <sistemska_datoteka>
o Uslovno prevoñenje delova programa:
#ifndef identifikator /Ako identifikator nije definisan/
#endif /Kraj uslovnog prevoñenja/
- Zaglavlje (header) je .hpp datoteka u kojoj se nalaze razne deklarativne naredbe. Zaglavlje se
pretprocesorskom direktivom #include uključuje u izvorni program (u datoteku .cpp). Da bi
se sprečilo višestruko prevoñenje sadržaja datoteke u toku jednog prevoñenje preporučuje se da
struktura zaglavlja bude sledeća:
// datoteka proba.hpp
#ifndef PROBA_DEF
#define PROBA_DEF
/* Definicije koje smeju da se prevedu samo jedanput. */
#endif
- Glavni program je funkcija main() i po Standardu bi trebalo da bude tipa int.
Zadatak 2.
Analizirati sledeće datoteke:
// Datoteka: zaglavlje.hpp
#ifndef ZAGLAVLJE_HPP
#define ZAGLAVLJE_HPP
#include using namespace std; #define MAX 100 void f(int, int); void f(double, double); #endif // Datoteka: dat1.cpp #include "zaglavlje.hpp" void f(int a, int b) { if(a<=MAX && b<=MAX) cout<<"Danas je lep dan."<<endl; else cout<<"Danas nije lep dan."<<endl; }