Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


Skripta objektno programiranje, Rezime od Objektno orijentisano programiranje

C++ materijal koriscen na vezbama veoma koristan i kvalitetan. Rad sa klasama i osnovnim principima objektno programiranja

Tipologija: Rezime

2019/2020
U ponudi
30 Poeni
Discount

Vremenski ograničena ponuda


Učitan datuma 17.03.2020.

lord1999
lord1999 🇸🇷

3

(1)

1 dokument

1 / 95

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
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
2010
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
Discount

U ponudi

Delimični pregled teksta

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
    • KLASA DinString
  • Vežbe
    • NASLEðIVANJE
  • 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
    • GENERIČKE KLASE
  • 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;

  • Na primer:

#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; }