Прва вежба¶
Једна класа са пуно метода
Белешке¶
Објектно-оријентисана програмска парадигма је конципирана као систем објеката који међусобно интерагују једни са другима, прослеђујући поруке и реагујући на њих.
У сваком објекту су енкапсулирана његова стања и понашања. Често правимо паралелу са објектима из реалног света – студент, аутомобил и сл. Аутомобил поседује нека стања, тј. атрибуте као што су број седишта, максимална брзина, тренутна брзина, али и понашања, тј. методе као што су додај гас, кочи, ... Студент може од атрибута поседовати број индекса, просечна оцена, година студија, а као методе нпр. полагање испита, упис наредне године, испис, ...
Управо објекти шаљу међусобно поруке и реагују на њих путем међусобног позива метода које поседују.
Класа је шаблон из којег се праве, односно инстанцирају објекти. Чест је случај да желимо да заштитимо атрибуте и методе објекта што је могуће употребом спецификаторима приступа (private
, protected
, public
).
- Приватним (
private
) чланицама је могуће приступити само уоквиру исте те класе (коришћење приватних атрибута и позивање приватних метода могуће само унутар метода исте те класе). - Заштићеним (
protected
) чланицама је могуће приступити само уоквиру исте те класе и класа изведених из ње. - Јавним (
public
) чланицама је могуће приступати из било ког дела програма.
У програмском језику C++, дефиниција сваке класе се углавном пише у засебној ….h датотеци, а потом се такође у засебној ….cpp датотеци укључи та дефиниција класе и затим имплементују конструктори, деконструктор и методе те класе. Чест је случај да назив обе ове датотеке буде исти као и сам назив класе које оне дефинишу, тј. чије методе имплементују.
Битно је навести include guard-ове унутар ….h датотеке где се дефинише класа, јер је могуће да више фатотека укључује тражену класу, а потом се те датотеке укључују у датотеци где се налази main функција и самим тим може доћи до дупликације дефиниције класе, што води до компајлаторске грешке.
Два честа начина употребе include guard-ова приказана су испод, еквивалентна су и подједнако се примењују.
#pragma once
је очигледно краћа варијанта и потребно је написати само то на почетку ….h датотеке у којој дефинишемо класу. Није дефинисано C++ стандардном, али сваки компајлер који се данас користи подржава ову нестандардну препроцесорску директиву.
Други начин употребљава стандардне препроцесорске директиве и као прва линија ….h датотеке би се писало #ifndef KLASA_H
, потом друга линија #define KLASA_H
. У наредним линијама би писали све остало потребно за дефиницију класе, а након тога, као последњу линију писали #endif
. KLASA_H
овде је само пример и може бити неки произвољан назив, али је по конвенцији често формата <име класе>_H
или INC_<назив пројекта>_<назив класе>_H
.
У ….cpp датотеци се најпре уључује ….h датотека у којој је дефинисана класа, потом је могуће комбиновати име класе и назив метода употребом бинарног резолуционог оператора ::
и имплементовати конструкторе, деструкторе и методе класе.
Уколико се назив атрибута поклапа са називом параметара методе, како би направили дистинкцију између њих потребно је употребити this-><назив атрибута>
за приступ атрибуту, заменом <назив атрибута>
са стварним називом атрибута, док је параметру методе могуће приступати као по обичају. Употреба this-><назив атрибута>
синтаксе је наравно увек могућа, чак и уколико се не поклапају називи параметара са називом атрибута.
Задатак 0.¶
На програмском језику C++ направити класу Skup која ће као приватне чланове имати број елемената скупа и динамички низ елемената типа int
, а као јавне чланице следеће методе:
- подразумевани конструктор који поставља број елемената скупа на 0;
- конструктор за постављање броја елемената скупа и заузимање неопходног простора у меморији;
- деструктор
inline
методу која враћа број елемената скупа;- методу која избацује дупликате из скупа;
- методу која испитује да ли задати елемент припада скупу;
- методу за уређење елемената скупа у нерастући редослед;
- методу за учитавање елемената скупа са стандардног улаза и
- методу за приказ елемената скупа на стандардни излаз.
У функцији main инстанцирати објекат класе Skup у динамичкој зони меморије која садржи 10 елемената, учитати његове елементе са стандардног улаза, испитати да ли неколико произвољно унетих бројева припада том скупу. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати све остале имплементиране методе класе.
Програмски ко̑д¶
Задатак 1.¶
На програмском језику C++ направити класу Student која ће као приватне чланове имати име и презиме студента дефинисане као char*
, број индекса, максимални број испита, број положених испита, низ оцена запамћен у динамичкој зони меморије (цели бројеви у опсегу од 5 до 10), а као јавне следеће методе чланице:
- конструктор који иницијализује максималан број испита на факултету,
- деструктор,
inline
методе које враћају број индекса и број положених испита,- методу која у низ оцена додаје оцену са последњег положеног испита,
- методу за учитавање података о студенту са стандардног улаза,
- методу која на стандардном излазу приказује све оцене почевши од највеће до најмање,
- методу за приказ података о студенту на стандардни излаз,
- методу која ажурира име и презиме студента.
У функцији main инстанцирати објекат класе Student са произвољно унетим бројем испита, учитати податке о студенту са стандардног улаза и у вектор оцена са положених испита додати неколико оцена. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати све остале инмплементиране методе класе.
Програмски ко̑д¶
Задатак 2.¶
На програмском језику C++ креирати класу Poligon која ће као приватне чланове имати број темена полигона и динамичке низове x и y координата темена, а као јавне следеће методе чланица:
- конструктор без аругмената који поставља број темена на 0,
- конструктор који иницијализује број темена у полигону,
- деструктор,
inline
методу која враћа број темена полигона,- методу која израчунава обим полигона,
- методу која ичитава координате темена полигона са стандардног улаза,
- методу која враћа две међусобне најудаљеније тачке у равни,
- методу која приказује координате темена на стандардни излаз,
- методу која избацује једно теме из полигона и смањује број темена за 1.
У функцији main иницијализовати објекат класе Poligon са произвољно унетим бројем темена, учитати координате његови темена са стандарног улаза и приказати његов обим на стандардни излаз. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати све остале имплементиране методе класе.
Програмски ко̑д¶
Задатак 3.¶
На програмском језику C++ направити класу Image која ће као приватне чланове имати квадратну матрицу целобројних података (који могу имати вредности 0 и 1), назив локације где је слика снимљена (char*
), а као јавне следеће методе чланице:
- подразумевани конструктор који поставља димензију матрице на 0,
- конструктор за постављање величине матрице,
- деструктор,
inline
методу која враћа димензију матрице,- методу која инвертује слику (где је била 0, поставља се 1 и обрнуто),
- методу која учитава садржај слике са стандардног улаза,
- методу која приказује садржај слике на стандардни излаз,
- методу која редукује димензије слике простим одсецањем (crop).
У функцији main инстанцирати објекат класе Image произвољне величине, учитати његов садржај са стандардног улаза и инвертовати је. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати и све остале имплементиране методе класе.
Програмски ко̑д¶
Задатак 4.¶
На програмском језику C++ направити класу Buffer која ће као приватне чланове имати динамички низ целобројних података, његову величину и тренутни број уписаних елемената, а као јавне следеће методе чланице:
- подразумевани конструктор који поставља величину бафера на 0,
- конструктор за постављање величине бафера,
- деструктор,
inline
методу која враћа тренутни број елемената у баферу,- методу push која уписује податак на крај бафера,
- методу pop која чита последњи додати податак и избацује га из бафера,
- методу која приказује садржај бафера на стандардни излаз,
- методу која дуплира величину бафера,
- метода која избацује незаузета места из бафера.
У функцији main инстанцирати објекат класе Buffer, у њега уписати првих n природних бројва. Направити још један бафер, али у динамичкој зони меморије, и у њега ископирати садржај првог. Затим из првог бафера избацити m елемената и на стандардни излаз приказати тренутни број елемената у оба бафера и њихове садржаје.
Програмски ко̑д¶
Задатак 5.¶
На програмском језику C++ направити класу Vektor која ће као приватне чланове имати динамички низ целобројних података и димензију вектора, а као јазне следеће методе чланице:
- подразумевани конструктор који поставља димензију вектора на 0,
- конструктор за постављање величине низа,
- деструктор,
inline
методу која поставља k-ти елемент вектора,- константну
inline
методу која враћа вредност k-тог елемента у вектору, - методу која уређује елементе низа у неопадајући редослед,
- методу која рачуна скаларни производ два вектора (ако су услови испуњени),
- методу која враћа индекс елемената који има вредност најближи средњој вредности свих елемената у вектору.
У функцији main инстанцирати објекат класе Vektor, учитати његове елементе са стандардног улаза, уредити га и на стандардни излаз приказати вредности елемената. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати и све остале имплементиране методе класе.
Програмски ко̑д¶
Задатак 6.¶
На програмском језику C++ направити класу Minesweeper која ће као приватне чланове имати матрицу која представља модел минског поља и димензије те матрице, као и назив поља (char*
). Сваки елемент матрице је типа bool
и има вредност true
уколико је на том пољу мина. Класа садржи следеће јавне методе чланице:
- подразумевани конструктор који поставља димензију матрице на 10×10,
- конструктор за постављање димензија матрице,
- деструктор,
inline
методе које враћају димензије поља,- методу која враћа број мина које окружују задато поље, односно -1 уколико то поље садржи мину,
- методу која са стандардног улаза учитава распоред мина (са стандардног улаза се учитавају вредности 0 и 1; ако је учитана вредност 0 на одговарајућој позицији у матрици треба уписати
false
, у супротном, елемент матрице јеtrue
), - методу за приказ минског поља на стандардни излаз,
- методу која избацује све редове и колоне у којима се не налази ни једна мина.
У функцији main инстанцирати објекат класе Minesweeper, учитати распоред мина са стандардног улаза. Са стандардног улаза учитати и позицију једног поља. Уколико се на том пољу налази мина, на стандардни излаз приказати садржај целог минског поља, у супротном приказати број мина које то поље окружују. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати све остале имплементиране методе класе.
Програмски ко̑д¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
|
Задатак 7.¶
На програмском језику C++ направити класу Matrica која као приватне чланове има матрицу, димензије матрице и назив матрице (char*
). Сваки елемент матрице је типа double
. Класа садржи следеће јавне методе чланице:
- конструктор без параметара који поставља димензије матрице на 20×20,
- констуктор који поставља димензије матрице,
- деструктор,
inline
методе које враћају димензије матрице,- методу која враћа суму вредности елемента траженог реда,
- методу која враћа суму вредности елемента тражне колоне,
- методу за унос елемента матрице са стандардног улаза,
- методу за приказ елемената на стандардни излаз,
- методу за рачунање Кронекеровог производа две матрице,
- методу за рачунање производа две матрице.
У финкцији main инстанцирати објекат класе Matrica, учитати вредности елемената матрице са стандардног улаза. Затим сумирати вредност 1. и 3. колоне, као и 2. и 3. реда, а потом приказати матрицу.
Програмски ко̑д¶
Задатак 8.¶
На програмском језику C++ направити класу String која ће као приватне чланове имати дужину ниске и знаковни низ (низ типа char
) запамћен у динамичкој зони мемотије, а као јавне следеће методе чланице:
- конструктор без параметара који поставља дижину ниске на 0,
- конструктор који иницијализује дужину знаковног низа и резервише простор у динамичкој зони меморије за његово представљање,
- деструктор,
inline
методу која враћа дужину ниске,- методу која проналази почетну позицију задате подниске у ниски,
- методу за учитавање ниске са стандардног улаза,
- методу за приказ ниске на стандардни излаз.
У функцији main инстанцирати објекат класе String чија је максимална дужина 10 карактера, учитати његову вредност са стандног улаза и на стандардни излаз приказати поруку о томе да ли унета ниска садржи подниску "ana"
. Сем тога, инстанцирати још један објекат ове класе у динамичкој зони меморије и испробати све остале имплементиране методе класе.
Програмски ко̑д¶
Задатак 9.¶
На програмском језику C++ направити класу Picture која ће као приватне чланове имати квадратну матрицу целобројних података који узимају вредности из опсега од 0 до 512 запамћени у динамичкој зони меморије, а као јавне следеће методе чланице:
- подразумевани конструктор који поставља димензију матрице на 0,
- конструктор за постављање димензије матрице и за резервисање простора у динамичкој зони меморије за елементе матрице,
- деструктор,
inline
методу која враћа димензију матрице (потребно је одједном вратити обе димензије слике),- методу
void Brightness(int s)
која у сваком елементу матрице додаје прослеђену вредност. Водити рачуна о томе да, након трансформације вредности целобројне матрице остану у опсегу од 0 до 512, - методу која учитава садржај слике са стандардног улаза,
- методу која приказује садржај слике на стандардни излаз,
- имплементирати
resize
методу по следећем упутству:- Нове димензије слике:
int nWidth
,int nHeight
; - Почетна слика има димензије
width
иheight
; - Израчунају се
resize
фактори:nXFactor = (double)width/(double)nWidth
;nYFactor = (double)height/(double)nHeight
;
- Сваки пиксел одредишне слике на позицији x, y се копира из почетне слике са позиције
((int)(Math.Floor(x * nXFactor)), (int)(Math.Floor(y * nYFactor)))
.
- Нове димензије слике:
У функцији main инстанцирати објекат класе Picture величине 10×10, учитати његов садржај са стандардног улаза, а затим просветлити слику за неку прозивољну вредност. Сем тога, инстанцирати још један објекат ове класе и испробати и све остале имплементиране методе класе.