Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКД_ОБП_Урдабаева.doc
Скачиваний:
113
Добавлен:
01.03.2016
Размер:
1.29 Mб
Скачать

Іі. Жұмыстың орындалу реті

1. Теориялық бөліммен танысу.

2. 1 – 2 программалардың жұмысымен танысу.

3. Өзіндік жұмыс тапсырмаларын орындаңыз.

ІІІ. Өзіндік жұмыс тапсырмалар

  1. Нақты сандар үшін +, - , * амалдарын қайта жүктеу.

  2. Жолдар үшін =, <> амалдарын қайта жүктеу.

  3. Символдар үшін +, =, <> амалдарын қайта жүктеу.

  4. Символдар үшін жоғарғы және төмен регистрлерге ауыстыру операторларын қайта анықтау.

  5. Жолдар үшін жолды жолға жалғау, жол ұзындығын есептеу амалдарын қайта жүктеу.

  6. Бүтін сандар үшін дәрежені есептеу, түбірді есептеу амалдарын қайта жүктеу.

  1. Жұмыс есебі

- Жұмыс тақырыбы мен мақсаты;

- Жұмыстың орындалуы кезінде қойылған сұрақтарға жауап беру;

- Өзіндік жұмыс программасының листингі.

  1. Лабораторялық жұмыс бойынша сұрақтар

  1. Операторларды қайта жүктеу дегеніміз не?

  2. Қандай операторларды қайта жүктеуге болады?

  3. Индекстеу операторы қалай қайта жүктеледі?

ЛАБОРАТОРИЯЛЫҚ ЖҰМЫС № 12-13

ОҚИҒАЛАРДЫ ӨҢДЕУ

Мақсаты. Оқиғалармен басқарылатын объектілі-бағытталған программа құруға практикалық дағдыландыру.

Жұмыстың негізгі мазмұны.

Қолданушының пернетақтадан енгізген командаларын орындайтын интерактивті программа жазу.

Қысқаша теориялық мәліметтер.

Объектілі-бағытталған программа оқиғалармен басқарылатын программа ретінде.

ОБП қолданғанда барлық объектілер бір-бірінен ерекшеленген болып келеді және объектіден объектіге ақпарат бергенде айтарлықтай қиындықтай туындайды. ОБП-да объектілер арасында ақпаратты беру үшін оқиғаларды өңдеу механизмі қолданылады.

Оқиғаларды объектілер арасында алмасатын ақпараттар пакеті ретінде елестетуге болады және олар объектілі бағытталған ортада қолданушының қандай да бір әрекетіне жауап ретінде құрылады. Пернеге басу немесе тышқан манипуляторын шерту бұл оқиғаны қалай өңдеуге болатынын білетін объект табылғанша объектілер тізбегімен жалғасып, оқиға туғызады. Объектіден объектіге оқиға берілу үшін программаның барлық объектілері бір топқа біріктірілуі қажет. Осыдан қолданбалы программа программада қолданылатын барлық объектілер біріктірілген объект-тобы болуы керек.

Осылайша, ОБП - бұл оқиғалармен басқарылатын программа. Оқиға программада өздігінен ешқандай әрекет етпейді, бірақ оқиғаға жауап ретінде программаның күйін өзгеріске келтіретін бар объектілер өзгеруі немесе жойылуы, жаңа объектілер құрылуы мүмкін. Басқаша айтқанда мәліметтерді өңдегенде барлық әрекеттер объектілермен жүзеге асырылады, ал оқиғалар тек олардың жұмысын басқарады.

Объектілерді құру процесінен өңдеудің тәуелсіз принципі бір программа көлемінде параллель екі процестің пайда болуына әкеледі: объектіні құру процесі және мәліметтерді өңдеу процесі. Бұл дегеніміз мысалы, программаның интерактивті элементтерін құру кезінде қолданушының онымен байланысты әрекеттерін ескермей-ақ, объектіні құру әрекетін жүзеге асыруға болады.

Және керісінше, программаның қолданушы әрекетін өңдеуге жауапты бөлігін дайындап, бұл бөлікті қажет интерактивті элемент құрумен байланыстырмауымызға болады.

Оқиға

С++ тұрғысынан оқиға – бұл объект, оның жеке өрістері берілетін ақпараттың қандай да бір қасиеттерін сипаттайды, мысалы:

struct TEvent

{int what

union{

MouseEventType mouse;

KeyDownEvent keyDown;

MessageEvent message;

};

TEvent объектісі екі бөліктен тұрады. Біріншісі (what) берілген оқиғаның көзін анықтайтын оқиғаның типін береді. Екіншісі оқиғамен берілетін ақпаратты береді. Оқиғаның әртүрлі типтері үшін ақпараттың мазмұны әртүрлі. What өрісі келесі мәндерді қабылдауы мүмкін:

evNothing – ешнәрсе жасау қажет еместігін білдіретін бос оқиға. what өрісіне evNothing мәні беріледі, егер оқиға қандай да бір объектімен өңделсе.

evMouse – тышқаннан болатын оқиға.

Тышқаннан болатын оқиға мысалы, мынадай құрылымда болуы мүмкін:

struct MouseEventType

{int buttons;

int doubleClick;

TPoint where;

};

Мұнда buttons басулы пернеге көрсетеді.

doubleClick екі рет шерту болғандығын тексереді;

where тышқан координатасын көрсетеді.

evKeyDown – Пернетақтадан болатын оқиға.

Пернетақтадан болатын оқиға мысалы, мынадай құрылымда болуы мүмкін:

struct KeyDownEvent

{union{int keyCode;

union{char charCode;

char scanCode;

};

};

};

evMessage  объектіден оқиға-хабарлама.

объектіден (evMessage) оқиға-хабарлама үшін екі параметр беріледі:

command – осы оқиға пайда болғанда орындау қажет команда коды;

infoPtr – оқиғамен брілетін (хабарлама) ақпарат.

struct MessageEvent

{int command;

void infoPtr;

};

Оқиғаларды өңдеу әдістері.

Келесі әдістер оқиғаларды өңдеуді ұйымдастыру үшін қажет (атаулары еркін).

GetEvent – оқиғаны құру;

Execute оқиғаны өңдеудің негізгі циклын жүзеге асырады. Ол үнемі GetEvent шақыру арқылы оқиғаны алады және HandleEvent көмегімен оларды өңдейді. Бұл цикл «соңы» оқиғасы болғанда аяқталады.

HandleEvent – оқиғаларды өңдеуіш. Әрбір оқиғаны оған қажет түрде өңдейді. Егер объект анықталған оқиғаны(хабарламаны) өңдеуге тиіс болса, онда оның HandleEvent әдісі бұл оқиғаны танып, онымен тиісті түрде әрекет етуі қажет. Оқиға мысалы, команда коды (command өрісі) арқылы танылуы мүмкін.

ClearEvent өңделген оқиғаны әрі қарай өңделмес үшін тазартады.

Оқиғаны өңдегіш (HandleEvent әдісі).

TDerivedClass класы үшін оқиғаны алып, оқиғаны өңдегіш оны келесі схема бойынша өңдейді:

void TDerivedClass::HandleEvent(TEvent& event)

{ //Базалық кластың оқиға өңдегішін шақыру

TBaseClass::handleEvent( event );

if( event.what == evCommand ) // Егер базалық кластың оқиға өңдегіші оқиғаны // өңдемесе

{

switch( event.message.command )

{

case cmCommand1:

// cmCommand1 командасын өңдеу

// Оқиғаны тазарту

СlearEvent( event );

break;

case cmCommand2:

// cmCommand2 командасын өңдеу

СlearEvent( event ); командасын өңдеу

break;

case cmCommandN:

// cmCommandN командасын өңдеу

СlearEvent( event );

break;

default: // оқиға өңделген жоқ

break;

}

};

}

Топтың оқиға өңдегіші алдымен топтың командаларын өңдейді, сонан соң егер оқиға өңделмесе өзінің элементтеріне олардың оқиға өңдегіштерін шақыра отырып оны береді.

void TGroup::HandleEvent(TEvent& event)

{ if( event.what == evCommand )

{switch( event.message.command )

// объект-топтың оқиғасын өңдеу

default: // оқиға топпен өңделмеген

//топтың бірінші элементіне рұқсат алу

while((event.what != evNothing)!!( /* барлық эелементтер қаралып болған жоқ */)

{

//ағымдағы элементтің HandleEvent оқиғасын шақыру

//топтың келесі элементіне көшу

}

break;

}

}

ClearEvent әдісі-оқиғаны тазарту.

ClearEvent event.What өрісіне evNothing мәнін меншіктей отырып оқиғаны тазартады.

Оқиғаны өңдеудің негізгі циклы (Execute әдісі)

Оқиғаны өңдеудің негізгі циклы «қолданбалы программа» негізгі объект-тобының Execute әдісінде келесі схема бойынша жүзеге асырылады:

int TMyApp::Execute()

{do{endState=0;

GetEvent(event); //оқиғаны алу

HandleEvent(event); //оқиғаны өңдеу

if(event.what!=evNothing) //оқиға өңделмей қалды

EventError(event);

}

while(!Valid());

return endState;

}

HandleEvent әдісі EndExec әдісін шақыра отырып «жұмыстың соңы» оқиғасын өңдейді. EndExec EndState айнымалысының private мәнін өзгертеді. Бұл айнымалының мәнін Valid әдіс-функциясы тексереді, егер «жұмыстың соңы» болса, онда true мәнін қайтарады. Мұндай бірнеше күрделі жұмысты аяқтау әдісі белсенді күйде топтың бірнеше элементтері бола алатындығымен байланысты. Онда топтың Valid әдісі өзінің ішкі элементтерінің Valid әдістерін шақыра отырып, олардың барлығы true қайтарса, true қайтарады. Бұл программа оның барлық элементтері жұмысын аяқтағанда, ол да жұмысын аяқтайтынына кепілдік береді.

Егер оқиға өңделмей қалса, онда қарапайым жағдайда жай хабарлама беретін EventError әдісі шақырылады.

Оқиғаны өңдеу мысалы.

Командалық жолда команданы қабылдайтын қарапайым калькуляторды қарастырайық. Мұнда қарапайым нұсқасы келтірілген. Лабораториялық жұмысты схема бойынша орындауға арналған нұсқасы қосымшада келтірілген.

Команда форматы:

белгі параметр

Белгілер +, –, *, /, =, ?, q

Параметр – бүтін сан

Константалар-командалар:

сonst int evNothing = 0;

сonst int evMessage = 100;

сonst int cmSet = 1; //сан жазу

сonst int cmGet = 2; //мәнін қарау

сonst int cmAdd = 3; //қосу

и т.д.

сonst int cmQuit = 101; //шығу

Класс-оқиға

struct TEvent

{int what

union{

int evNothing;

union{int command;

int a;}

}

}