You are on page 1of 26

ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Аудиториски вежби 5

Динамичка алокација на
меморија, преоптоварување на
оператори
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Задача 1
 Да се дефинира класа за работа со комплексни броеви. За секој
комплексен број се чуваат податоци за реалниот и
имагинарниот дел.
 Да се преоптоварат операторите +, -, *, /, +=, -=, *=, /= за
извршуваање на содветните операции со комплексни броеви.
 Да се имплементира операторот << за печатење на комплексен
број.

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

#include <iostream>
#include <cmath>
using namespace std;
class kompleksen {
private:
float re,im;
public:
kompleksen ( float x = 0.0 , float y = 0.0 ) {
re = x;
im = y;
}
~kompleksen () {
}
friend ostream& operator<< (ostream& o, const kompleksen& k ) {
o << k.re;
if ( k.im < 0 )
o << "-j";
else
o << "+j";
o << fabs ( k.im ) << endl;
return o;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

kompleksen& operator+= (const kompleksen &a) {


re += a.re;
im += a.im;
return *this ;
}
kompleksen& operator-= (const kompleksen &a) {
re -= a.re;
im -= a.im;
return *this ;
}

kompleksen& operator*= (const kompleksen &a) {


re = re * a.re - im * a.im;
im = im * a.re + re * a.im;
return *this ;
}

kompleksen& operator/= (const kompleksen &a ) {


float m = a.re * a.re + a.im * a.im;
float r = (re * a.re - im * a.im) / m;
im = (im * a.re + re * a.im) / m;
re = r;
return *this;
}
}; Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

kompleksen operator+(kompleksen a, kompleksen b) {


kompleksen c = a;
return c += b;
}
kompleksen operator-(kompleksen a, kompleksen b) {
kompleksen c = a;
return c -= b;
}
kompleksen operator*(kompleksen a, kompleksen b) {
kompleksen c = a;
return c /= b;
}
kompleksen operator/(kompleksen a, kompleksen b) {
kompleksen c = a;
return c /= b;
}
int main () {
kompleksen k1(2.0 , -3.5) , k2(1.0 , 7.5) ; //2-j3.5, 1+j7.5
kompleksen k = k1 + k2;
cout << k;
k = k1 - k2; cout << k;
k += k1; cout << k;
k -= k2; cout << k;
return 0;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Задача 2
 Да се напише класа Array за работа со еднодимензионални
полиња од целоброjни елементи. За полето се чуваат
информации за неговиот вкупен капцитет, тековниот броj на
елементи. Резервациjата на мемориjата да се врши динамички.
 Да се преоптоварат следните оператори:
Оператор += за додавање нови броеви во полето и притоа ако е
исполнет капацитетот на полето да се зголеми за 100%.
 Да се имплементира main функција во која ќе се инстанцира
обjект од класата Array и во него ќе се внесат N броеви (се
читаат од тастатура). Потоа да се испечати капацитетот и
вкупниот броj на елементи во полето.

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

#include <iostream>
#include <cstdlib>
using namespace std;
class Array {
private :
int* elem; // pokazuvac kon poleto
int count; // kolku elementi ima poleto
int size; // kolku elementi moze da ima poleto
public :
Array (int size = 10) {
this -> size = size ;
count = 0;
elem = new int[size];
}
Array (const Array &ob) {
size = ob.size ;
count = ob.count ;
elem = new int[size];
for (int i = 0; i < count; i ++)
elem[i] = ob.elem[i];
}
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Array& operator= (Array &ob ) {


if (this != &ob ) { // se sprechuva samododeluvanje
size = ob.size ;
count = ob.count ;
delete [] elem ;
elem = new int [ size ];
for ( int i = 0; i < count ; i ++)
elem [i] = ob.elem [i];
} return *this ;
}
Array& operator+= ( int el ) {
if ( count < size ) { // ako seuste ima kapacitet, dodadi go clenot
elem[count ++] = el;
} else { // ako kapacitetot e popolnet
int *tmp = new int [size * 2]; //alociraj dvojno poveke memorija (100%)
for (int i = 0; i < count; i ++)
tmp[i] = elem[i];
tmp[count++] = el;
size *= 2;
delete [] elem ;
elem = tmp ;
}
return *this ;
}
~Array () {delete [] elem;} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

int getCapacity () {
return size;
}
int getCount () {
return count;
}
};

int main () {
Array pole ;
int n, tmp ;
cout << "Kolku elementi ke vnesete?" << endl ;
cin >> n;

for (int i = 0; i < n; i ++) {


cin >> tmp ;
pole += tmp ;
}

cout << endl << pole.getCount();


cout << endl << pole.getCapacity();
return 0;
}

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Задача 3
Да се напише класа за работа со веб сервери (WebServer). За
секоj веб сервер се чува:
 неговото име (max 30 знаци)
 листа од веб страници (динамички алоцирана низа од обjекти
од класата WebPage).
За секоjа веб страница се чува:
 url (max 100 знаци)
 содржина (динмички алоцирана низа од знаци).

За класата WebPage да се преотовари операторот:


 == за споредба на веб страници според url
За класата WebServer да се преотоварат операторите:
 += за додавање нова веб страница во серверот
 -= за бришење на веб страница од веб серверот.
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

#include <iostream>
#include <cstring>
using namespace std;
class WebPage {
private :
char url [100];
char* sodrzina;
public :
WebPage ( char* url = "", char* sodrzina = "" ) {
strcpy(this -> url, url);
this -> sodrzina = new char [strlen(sodrzina) + 1];
strcpy(this -> sodrzina, sodrzina);
}

WebPage (const WebPage& wp) {


strcpy(this->url , wp.url );
this-> sodrzina = new char [strlen (wp.sodrzina) + 1];
strcpy(this->sodrzina, wp.sodrzina );
}

~WebPage () {
delete [] sodrzina ;
}
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

bool operator==(WebPage& wp) {


return strcmp(url, wp.url) == 0;
}

WebPage& operator= (WebPage& wp) {


if (this != &wp) {
strcpy (this -> url , wp.url);
delete [] sodrzina ;
this -> sodrzina = new char [strlen[wp.sodrzina] + 1];
strcpy(this -> sodrzina, wp.sodrzina);
}
return *this ;
}
char* getUrl () {
return url ;
}
};

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

class WebServer {

private:
char ime [30];
int count ;
WebPage* wp;

public:
WebServer (const char * ime = "", int count = 0, WebPage *wp = 0) {
strcpy(this ->ime, ime);
this -> count = count ;
this ->wp = new WebPage [count];
for (int i = 0; i < count ; i++)
this ->wp[i] = wp[i];
}

WebServer(const WebServer &ws) {


strcpy (this->ime, ws.ime );
this -> count = ws.count ;
this -> wp = new WebPage[count];
for (int i = 0; i < count ; i++)
this -> wp[i] = ws.wp[i];
}

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

WebServer& operator= (const WebServer &ws) {


if (this != &ws) {
strcpy (this ->ime, ws.ime );
this -> count = ws.count ;
delete [] this -> wp;
this -> wp = new WebPage[count];
for (int i = 0; i < count; i++)
this >wp[i] = ws.wp[i];
}
return *this ;
}
~ WebServer () {
delete [] wp;
}

WebServer& operator+= (WebPage webPage) {


WebPage * tmp = new WebPage [count + 1]; //alociraj nova memorija
//so kapacitet za eden povekje od prethodno
for (int i = 0; i < count; i++)
tmp [i] = wp[i];
tmp [count++] = webPage ; //vmetni ja novata veb strana (webPage)
delete [] wp;
wp = tmp;
return *this ;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

WebServer& operator-= (WebPage webPage) {


int newCount = 0;
WebPage* tmp = new WebPage[count];
for (int i = 0; i < count; i++) {
if (!(wp[i] == webPage )) {
tmp[newCount++] = wp[i];
}
}
delete [] wp;
wp = tmp;
count = newCount ;
return *this ;
}

void listPages () {
for (int i = 0; i < count; i++)
cout << wp[i].getUrl () << endl ;
}

};

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

int main () {

WebPage wp1 ("http://www.google.com", "The search engine");


WebPage wp2 ("http://www.finki.ukim.mk", "FINKI");
WebPage wp3 ("http://www.time.mk", "Site vesti");

WebServer ws(" Server ");

ws += wp1 ;
ws += wp2 ;
ws += wp3 ;

ws.listPages ();

ws-= wp3;

ws.listPages ();

return 0;
}

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Задача 4
Да се дополни задача 2 така што ќе се преоптовари операторот []
за пристап до елемент и промена на вредноста на елемент од
полето.
Потоа функцијата main треба да се дополни така што ќе се
испечатат елементите од полето.

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

#include <iostream>
#include <cstdlib>
using namespace std;
class Array {
private : //...
public : //...
int& operator[](int i) {
if (i >= 0 && i < count )
return elem [i];
else {
cout << " Nadvor od opseg " << endl ;
exit(-1);
}
}
//...
};
int main () {
//...
for (int i = 0; i < pole.getCount(); i++)
cout << pole[i] << "\t";

return 0;
}
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Задача 5
Да се напише класа за опис ученици. За секој ученик се чува името
(динамички алоцирана низа од знаци), просекот (децимален број) и
школска година (цел број). За оваа класа да се имплементираат:
 Конструктори
 Оператор ++ за зголемување на запишаната школска година за еден
 Оператор << за печатење на ученик со сите негови податоци
 Оператор > за споредување на два ученика според просекот
Потоа треба да се креира класа за опишување на паралелка што содржи
динамички алоцирана низа од ученици, како и број на елементи во низата.
За оваа класа да се имплементираат:
 Конструктори
 Оператор += за додавање на нов студент во паралелката
 Оператор ++ за зголемување на запишаната школска година за еден
за сите студенти во низата
 Оператор << за печатење на сите ученици во паралелката
 Метод nagrada што ги печати само оние ученици кои имаат просек
10.0.
 Метод najvisokProsek што го печати највисокиот просек во паралелката
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

#include <iostream>
#include <string.h>
#define MAX 100
using namespace std;
class Ucenik
{
private:
char *ime;
float prosek;
int godina;
public:
Ucenik (const char* ii="", float pp=0, int gg=0)
{
ime = new char[strlen(ii)+1];
strcpy (ime,ii);
prosek = pp;
godina = gg;
}
Ucenik (const Ucenik& u)
{
ime = new char[strlen(u.ime) ];
strcpy (ime , u.ime);
prosek = u.prosek;
godina = u.godina;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

~Ucenik(){
delete [] ime;
}

Ucenik& operator= (const Ucenik& u)


{
if (this != &u)
{
delete [] ime;
ime = new char[strlen(u.ime)] ;
strcpy (ime,u.ime) ;
prosek = u.prosek ;
godina = u.godina ;
}
return *this ;
}
Ucenik& operator++() { //prefiksen operator
godina++ ;
return *this ;
}
Ucenik operator++(int) { //postfiksen operator
Ucenik u(*this) ;
godina++ ;
return u;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

float getProsek() {
return prosek;
}
// globalna funkcija za preoptovaruvanje na operatorot <<
// ovaa funkcija e prijatelska na klasata Ucenik
friend ostream& operator<< (ostream& o, const Ucenik& u)
{
return o << "Ime:" << u.ime << ", godina:" << u.godina << ",prosek:"
<< u.prosek << endl;
}
friend bool operator> (const Ucenik& u1, const Ucenik& u2);
};

//globalna funkcija za preoptovaruvanje na operatorot >


bool operator> (const Ucenik& u1, const Ucenik& u2)
{
return (u1.prosek > u2.prosek);
}

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

class Paralelka
{
private:
Ucenik* spisok;
int vkupno;
public:
Paralelka (Ucenik* s = 0, int v = 0)
{
vkupno = v;
spisok = new Ucenik [vkupno];
for (int i = 0; i< vkupno ; i ++)
spisok[i] = s[i];
}

Paralelka (const Paralelka &p)


{
this -> vkupno = p.vkupno;
this -> spisok = new Ucenik[vkupno];
for (int i = 0; i< vkupno; i ++)
spisok[i] = p.spisok[i];
}

~Paralelka(){
delete [] spisok;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

Paralelka& operator+= (Ucenik u) {


Ucenik* tmp = new Ucenik[vkupno + 1];
for (int i = 0; i < vkupno; i++)
tmp[i] = spisok[i];
tmp [vkupno ++] = u;
delete [] spisok;
spisok = tmp;
return * this ;
}

Paralelka& operator++() {
for (int i = 0; i < vkupno; i++)
spisok[i]++;
return *this;
}
Paralelka operator++(int) {
Paralelka p(*this);
for (int i = 0; i < vkupno; i++)
spisok[i]++;
return p;
}

Објектно – ориентирано програмирање


ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

friend ostream& operator<< (ostream& o, const Paralelka& p)


{
for (int i = 0; i < p.vkupno; i ++)
o << p.spisok[i];
return o;
}

void nagradi()
{
for (int i = 0; i<vkupno; i++)
if (spisok[i].getProsek()==10.0)
cout << spisok[i];
}

void najvisokProsek()
{
Ucenik tmpU = spisok[0];
for(int i = 0; i < vkupno; i++)
if( spisok[i] > tmpU)
tmpU = spisok[i];
cout << "Najvisok prosek vo paralelkata:" << tmpU.getProsek() << endl;
}
};
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО

int main ()
{
Ucenik u1("Martina Martinovska", 9.5, 3);
Ucenik u2("Darko Darkoski", 7.3, 2);
Ucenik u3("Angela Angelovska", 10, 3);

Paralelka p;
p+=u1;
p+=u2;
p+=u3;

cout << p;
cout << "Nagradeni:" << endl;
p.nagradi();
p.najvisokProsek();
u2++;
cout << p;
p++;
cout << p;
return 0;
}

Објектно – ориентирано програмирање

You might also like