Professional Documents
Culture Documents
Oop Av5
Oop Av5
Аудиториски вежби 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;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Задача 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];
}
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
int getCapacity () {
return size;
}
int getCount () {
return count;
}
};
int main () {
Array pole ;
int n, tmp ;
cout << "Kolku elementi ke vnesete?" << endl ;
cin >> n;
Задача 3
Да се напише класа за работа со веб сервери (WebServer). За
секоj веб сервер се чува:
неговото име (max 30 знаци)
листа од веб страници (динамички алоцирана низа од обjекти
од класата WebPage).
За секоjа веб страница се чува:
url (max 100 знаци)
содржина (динмички алоцирана низа од знаци).
#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 () {
delete [] sodrzina ;
}
Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
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];
}
void listPages () {
for (int i = 0; i < count; i++)
cout << wp[i].getUrl () << endl ;
}
};
int main () {
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;
}
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);
};
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(){
delete [] spisok;
} Објектно – ориентирано програмирање
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
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;
}
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;
}