«Программалау іі» ПӘнінің ОҚУ-Әдістемелік кешені


-сурет Енгізілген жолдағы символдар санын есептеу терезесі Ұсынылатын әдебиеттер: [1-9]



жүктеу 5,29 Mb.
бет15/29
Дата13.02.2020
өлшемі5,29 Mb.
#28949
1   ...   11   12   13   14   15   16   17   18   ...   29
5.3.-сурет Енгізілген жолдағы символдар санын есептеу терезесі
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:

  1. Object Pascal тілінде мәтіндерді өңдеу үшін қандай типтер пайдаланылады?

  2. Жолдың ағымдағы ұзындығы қандай функцияның көмегімен беріледі?

  3. Ең үлкен ұзындықтағы жолдың типі қалай хабарланады?

  4. Жолдық айнымалылар хабарланғаннан кейінгі жадының жұмыс механизмі қандай?

  5. Екі байттық символдар мен Unicode символдары қандай типпен хабарланады?

  6. Нөлдік терминалдық жолдың типі қалай аталады?

  7. Нөлдік терминалдық жолдар қай кезде пайдаланылады?

  8. StrCopy процедурасының қызметі қандай?

  9. Мәтіндегі ең ұзын сөзді басып шығаратын программа құрыңыз. Мәтіндегі сөздер бос орынмен бөлінген.

  10. Берілген сөздің мәтінде қанша рет кездесетінін анықтайтын программа құрыңыз. Сөздер үтір арқылы ажыртылған.

  11. Берілген мәтіндегі барлық бос орынды үтірге алмастырыңдар. Соңғы символы үтірге алмастырмай өшіріңдер. Егер мәтінде бірнеше бос орын кездесетін болса, онда олардың орнына бір үтір қойыңдар.

  12. S1,…,S30 символдар тізбегі берілген. Берілген тізбектің символдарын кері ретпен S30,…,S1 орналастыратын программа құрыңдар.

  13. Берілген мәтіндегі eto сөзін to сөзіне алмастыратын программа құрыңдар.

  14. Мәтін берілген. Осы мәтіннің бүтін сандардың ондық жазылуы болатынын анықтайтын программа құрыңыз.

  15. Мәтін сөздері бос орынмен бөлінген. Ішінде а және в әріптері ең көп кездесетін сөзді табыңыздар.

  16. Мәтіндегі ing әріптері тіркесімен аяқталатын сөз бөлігін ed жалғауына алмастырыңдар.

Зертханалық жұмыс №11
Тақырыбы: Көрстекіштер мен динамикалық жады
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Динамикалық жады

Динамикалық жады- бұл программаның жұмыс істеуіне бөлінген дербес компьютердің оперативті жадысы. Мәліметтердің динамикалық орналасуы программа жұмысы барысында тікелей динамикалық жадының пайдалануы болып табылады. Бұдан программаның компиляциялану процесінде Object Pascal компиляторымен жүзеге асырылады. Динамикалық орналасуда мәліметтердің типі де, мөлшері де алдын-ала анықталмайды.



Көрсеткіштер

Дербес компьютердің жадысы ақпаратты сақтауға арналған ұяшықтардың жиынтығын-әрқайсысының жеке нөмірі бар байтты береді. Бұл нөмірлер адрес деп аталады, олар жадының кез келген байтына баруға мүмкіндік береді. Object Pascal тілі программистің құзырына динамикалық жадыны басқарудың қолайлы құралын ұсынады, ол көрсеткіштер деп аталады. Көрсеткіш- бұл өзінің мәні ретінде жадының байтының адресін сақтайды. Көрсеткіштердің мәліметтердің кез келген типін орналастыруға болады. Олардың кейбіреулері (Byte, Char, ShortInt, Boolean) жадыдан бір байт орын алады, ал қалғандары аралас. Сондықтан көрсеткіштер мәліметтердің тек алғашқы байтының орнын анықтайды.

Әдеттегідей, көрсеткіш мәліметтердің қандай да бір типімен байланысады. Мұндай көрсеткіштерді типтелген деп атаймыз. Типтелген көрсеткішті хабарлау үшін ^ белгісін қоямыз, ол сәйкес типтің алдына орналасады, мысалы,

Var

p1:^integer;

p2:^real;

type

PersonPointer=^PersonRecord;

PersonRecord=Record

Name:String;

Job:String;

Next: personPointer

End;

Мысалдағы мына жазуға назар аударыңыз: personPointer типін хабарлағанда программада алдын-ала хабарланғаан PersonRecord типіне келістік. Осыған дейін атап көрсеткенімізде. Object Pascal тілінде идентификаторлар пайдаланбас бұрын алдын-ала хабарланатын. Бұл ереже тек көрсеткіштер үшін ғана орындалмайды, мұнда әлі хабарланған мәліметтер типіне сілтеме жасалынады. Object Pascal тілінде көрсеткішті қандай да бір нақты мәліметтер типімен байланыстырмай-ақ хабарлауға болады. Ол үшін Pointer стандартты типі пайдаланылады. Мұндай көрстекіштерді типтелмеген деп атаймыз. Типтелмеген көрстекіштер нақты типпен байланыспағандықтан олардың көмегімен құрлымы мен типі программаның жұмысы барысында өзгеріп отыратын мәліметтерді динамикалық орналастыру өте ыңғайлы.

Жоғарыда айтылғандай, көрсеткіштердің мәндері жадыдағы айнымалылардың адресі болғандықтан, бір көрстекіштің мәнін басқасыа беруге болатын сияқты көрінеді. Бірақ, шын мәнінде олай емес. Object Pascal тілінде мәліметтердің тек сол типімен байланысқан көрсеткіштердің арасында олардың мәндерін алмастыруға болады.

Мысалы, егер,



Var

p1, p2:^integer;

pR:^real;

P:Pointer;

болса, онда меншіктеу



PI1:=PI2;

жазуы орынды болады, сонымен бірге,



PI1:=PR

деп жазуға рұқсат етілмейді, өйткен РІ1 мен РR әртүрлі мәліметтер типін көрсетеді.



Процедуралар мен функциялар

Қосалқы программаның сипаттамасы

Процедуралар мен функциялар салыстырмалы түрде берілген атауы бойынша шақырылып орындалатын программаның бөлігі болып табылады. Программа мәтіндегі процедура (функция) атауының кездесуі оның шақырылуы деп аталады. Функцияның процедурадан айырмашылығы функция денесін құрайтын операторлардың орындау нәтижесінен алынған мән біреу ғана болады және ол функция атауына меншіктеледі.

Бұдан кейін функция мен процедураны жалпы атауымен «қосалқы программа» деп атайық.

Қосалқы программа орындалмас бұрын негізгі программаның бөлімінде сипатталуы тиіс.

Қосалқы программаны сипаттау дегеніміз оның тақырыбы мен денесін көрсету. Тақырыбында программаның аты мен формальды параметрлер тізімі хабарланады. Ал, функция үшін, мұнымен қатар, оның атауына меншіктелген мәннің типі көрсетіледі. Қосалқы программаның тақырыбынан кейін оның бейнелеу бөлімі мен орындалатын операторлар бөлімі жазылады. Қосалқы программаның бейнелеу бөлімінде төменгі деңгейдегі қосалқы программа кездесуі мүмкін. Оны жалпы түрде былай бейнелеуге болады:

Қосалқы программа

Қосалқы программа А

Қосалқы программа А1

Қосалқы программа А2

Қосалқы программа В

Қосалқы программа В1

Қосалқы программа В2

...

Кез келген деңгейдегі программа әдетте, тұрақтылар, айнымалылар, типтер және төменгі деңгейдегі программалар атауларының жиынтығынан тұруы мүмкін. Қосалқы программаның ішінде сипатталған барлық атаулар сол қосалқы программаға тән. Сөйтіп, қосалқы программамен шақырылатын операторлар тұрғысынан, қандай да бір алгоритм орындалатын, «қорап» тәрізді. Мұндай орындалу барысында қосалқы программаның әрбір бөліктері пайдаланушыдан жасырылған, жеке оларды шақыра алмайды. Мысалы, жоғарыда қарастырылған мысалдан А және В процедураларын шақыруға болады, олардың ішіндегі А1, А2, В1, В2 процедураларын шақыруға болмайды. Бұл айтылғандар тек қосалқы программаның атауына ғана тән емес, сонымен бірге, ондағы хабарланған кез келген типтер, айнымалылар мен белгілер атауларына да тән. Қосалқы программадағы хабарланған барлық атаулар бірегей болуы және ол қосалқы программаның атауына сәйкес келмеуі тиіс.



Төменгі деңгейдегі қосалқы программаға кіру барысында, ондағы хабарланған атаулар ғана емес, онда жоғарғы деңгейдегі атаулардың бәріне кіру мүмкіндігі сақталады.

Кез келген қосалқы программа өзін-өзі шақыра алады, шақырудың бұл тәсілі рекурсия деп аталады.

Бізге төмендегідей жазулар берілсін:

Var V1:…;

Procedure A;

Var V2:…;

End {A};

Procedure B;

Var V3:…;

Procedure B1;

Var V4:…;

Procedure B11;

Var V5:…;

?..


B11 процедурасының V1, ..., V5 айнымалылары, B1 процедурасынан V1, ..., V4 орталық программадан тек V1 процедурасы шақырылады. Кез келген қосалқы программа пайдаланудан бұрын сипатталу тиіс. Сондықтан В қосалқы программасынан А программасын шақыруға болады, ал А қосалқы программасынан В қосалқы программасы шақырылмайды. Негізгі программада да, қосалқы программа да пайдаланатын объектілерді глобальды деп атайды.

Object Pascal тілінде тұрақтыларды, айнымалыларды, типтерді, белгілерді, қосалқы программаларды сипаттау пайдаланушының қалауы бойынша жазыла береді. Мысалы,

Var V1:…;

Procedure S;

Var V2:…;

End {S};


Var V3:…;

S процедурасынан V1 және V2 айнымалыларына баруға болады, бірақ V3-ті пайдалануға болмайды, өйткені бұл айнымалының сипатталуы программада S процедурасынан кейін орналасқан.



Қосалқы программадағы жергілікті атаулар бұрын хабарланған глобальды атаулармен сәйкес келе береді.

Мұндай жағдайда жергілікті атау глобальды атауды жауып, оған кіру мүмкіндігін шектейді. Мысалы,

Var I: integer;

Procedure P;

Var I: integer;

Begin LbOutput.Caption:=IntToStr(i);

End {P};

Begin


I:=1;

P End;


Бұл программа экранға не шығарады? Бір атаулы глобальды айнымалының мәні 1-ге тең болса да Р процедураға кірер алдындағы ішкі І айнымалының мәні анықталмаған. Жергілікті айнымалыны глобальды айнымалымен «жауып», экранға ішкі айнымалының еркін мәні шығады. Егер Р процедурасынан

Var I: integer;

жоларын алып тастаса, онда экранға глобальды І айнымалысының мәні, яғни 1 шығады.

Сөйтіп, бір атаулы глобальды және жергілікті айнымалылар – бұлар әртүрлі айнымалылар. Қосалқы программа денесіндегі мұндай айнымалыны шақыру жергілікті айнымалыны шақырумен бірдей.



Қосалқы программаны бейнелеу

Қосалқы программаны бейнелеу қосалқы программа тақырыбынан және денесінен тұрады.



Қосалқы программа тақырыбы мен стандартты дерективтер. Процедураның тақырыбының жазылу түрі төмендегідей:

Procedure <аты> (<формальды параметрлер тізімі>);

Функцияның тақырыбы

Function <аты> (<формальды параметрлер тізімі>): <типі>

Мұндағы <аты> - қосалқы программаның аты; <формальды параметрлер тізімі> - формальды параметрлер тізімі; <тип> - функция нәтижесінің алатын типі. Қосалқы программаның тақырыбынан кейін ASSEMBLER, EXTERNAL, FAR, FORWORD, INLINE, INTERRUPT, NEAR тәрізді стандартты директиваларының бірі келуі тиіс.

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



ASSEMBLER – бұл директива орындалғанда процедураға кірер және шығар алдындағы орындалатын стандартты машиналық нұсқаулардың тізбегінің жұмысын (өзгертеді) тоқтатады. Бұл жағдайда қосалқы программаның денесі орнатылған Ассамблер командаларының көмегімен орындалады.

EXTERNAL – бұл директиваның көмегімен сыртқы қосалқы программа хабарланады.

FAR – компилятор шақырудың шеткері моделіне есептелген қосалқы программа кодын құруы тиіс. NEAR – директивасы бойынша компилятор жадының жақындағы моделіне есептелген кодын құруды міндеттейді.

FORWORD – директивасы компиляторға программа мәтінінен ары қарай қосалқы программа кездесетінін хабарлайды, бірақ ағымдағы программалық модуль шеңберінде.

INLINE – дерективасы қосалқы программаның денесі орнатылған машиналық нұсқаулар көмегімен орындалатынын көрсетеді.

INTERRUPT – үзу, тоқтатуды өңдеу процедураларын құруда пайдаланылады.



Параметрлер

Қосалқы программада формальды параметрлер тізімінің болуы міндетті емес және болмауы да мүмкін. Формальды параметрлердің атауы және типі көрсетіледі. Мысалы,

Procedure Geron (a: real; b: integer; s: char);

Қосалқы программа денесіндегі операторлар формальды параметрлер тізімін сипаттау бөлімінің кеңейтіліуі ретінде қарастырылады: осы тізімде пайдаланыдған барлық айнымалылар қосалқы программа ішіндегі кез келген өрнекте пайдаланылады. Осылайша қосалқы алгоритмдердің көмегімен нақты есептерді шығару жүзеге асырылады.

Формальды параметрлердің шынайы параметрлерге ауысуы қосалқы программадағы жазылған алгоритмді қажетіне қарай түзетуге мүмкіндік береді.

Object Pascal тілінде қосалқы программаны шақырған кезде формальды параметрлердің типі мен мөлшері шынайы параметрлердің типі мен мөлшеріне сәйкес келуі тиіс. Пайдаланылып отырған шанайы параметрлердің мәні қосалқы программаны шақырғанда оның қандай ретпен орналасуына тәуелді. Программист қосалқы программаны шақырғанда шынайы параметрлердің дұрыс орналасу ретін қадағалауы тиіс.

Қосалқы программаның кез келген формальды параметрлері мән параметр немесе айнымалы параметр немесе тұрақты параметр болуы тиіс. Алдыңғы мысалда А және В параметрлері мәндер параметрлері ретінде анықталған. Егер параметрлер айнымалы параметрлер ретінде анықталса, онда олардың алдында міндетті түрде қызметші var сөзі, ал тұрақтылар параметрлері болса const сөзі орналасады.

Мысалы,


Procedure esepmysal(var A: real; B: real; C: string);

Мұндағы А – айнымалы параметр, В – мән параметрі, С – тұрақты. Параметрлердің қай типін қандай жағдайда пайдалану қажеттілігін түсіну үшін қосалқы программа шақырылған кезде формальды параметрлер шынайы параметрлерге қалай ауысатынын қарастырайық.

Егер параметр мән ретінде анықталса, онда қосалқы программамен шақырар алдында бұл мән есептеліп алынған нәтиже уақытша жадыға (стек) көшіріліп, қосалқы программаға беріледі.

Егер шынайы параметр ретінде айнымалы немесе тұрақты түріндегі қарапайым өрнек көрсетілсе де, бәрібір қосалқы программаға айнымалының (тұрақтының) көшірмесі беріледі.

Қосалқы программадағы мәндер параметрінің кез келген өзгерісі шақырып отырған программада қабылданбайды (ескерілмейді), өйткені бұл жағдайда шынайы параметрдің көшірмесі өзгереді.

Егер параметр айнымалы параметр ретінде анықталса, онда қосалқы программаны шақырғанда айнымалының көөшірмесі емес, өзі беріледі (шындығында, бұл жағдайда қосалқы программаға айнымалының адресі беріледі). Айнымалы параметрлердің өзгерісі шақырып отырған программадағы шынайы параметрлердің өзгерісіне әкеледі.

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

Сөйтіп, қосалқы программадағы параметрлер сыртқы, негізгі программамен байланыс құралы ретінде пайдаланылады: осы параметрлердің көмегімен қосалқы программа өзінің жұмысының нәтижесін негізгі программаға бере алады. Әрине, программист мұны басқа тәсілмен де орындай алады: нәтижені ортақ параметрлер арқылы да беруге болады. Бірақ бұл тәсіл программаны түсініп, жүргізуде қиындық туғызады. Тиімді программалау стилінің талабына сәйкес, мүмкін болатын жерде нәтижені беруде шынайы айнымалы параметрлерді пайдаланған дұрыс. Формальды параметрлерді таңдауда ескеретін тағы бір жағдай бар. Мәндер параметрлерін хабарлауда шынайы параметрлер уақытша жадыға көшіріледі. Егер бұл параметр үлкен өлшемді массив болса, онда бұл параметрді тұрақты параметр ретінде хабарлап көшіруге жіберілетін уақыт пен жадыны үнемдеуге болады.

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

Object Pascal тілінің тағы бір қасиеті – типтік емес параметрлерді пайдалану мүмкіндігі. Егер формальды айнымалы параметрлердің типі қосалқы программа тақырыбында көрсетілмесе, онда ол типтік параметр болып есептеледі. Бұдан, оған сәйкес келетін шынайы параметр кез келген типті айнымалы болуы мүмкін. Бұдан, типтік емес параметр тек айнымалы параметр бола алады. Мысалы,

Procedure Myself (var Parametr);

Ескерілмейтін параметрлер

Delphi-дің 4, 5, 6 нұсқауларында ескерілмейтін параметрлер бар. Ескерілмейтін параметрлер формальды параметрлер тізімінен кейін орналасады. Оның жалпы түрі



<аты>:<тип>=<мән>

Мысалы, Procedure P(a: array of integer; s: string=’’);

Мұндай жағдайларда қосалқы программаны төмендегідей шақыруға болады:

P ([1, 2, 3],’’);

P ([1, 2, 3]);

Егер қосалқы программада екі немесе одан да көп ескерілмейтін параметр пайдаланылса, онда қосалқы программаны шақыруда олардың біреуін алдын-ала анықтау жағдайында оны соңғы анықталатын параметрге дейін толық көрсету қажет (яғни алдын-ала анықталмаған ескерілмейтін параметрлерді үтірмен алмастыруға болмайды). Мысалы,

Procedure P(a: array of integer; s: string=’’; b: integer=0);

Процедураның шақырылу жолдары:

P ([1, 2, 3]);

P ([1, 2, 3],’’);

P (1, 2, 3,’’,1).

Массив параметрлер және жолдық параметрлер

Қосалқы программаның формальды параметрлер тізіміндегі айнымалыны хабарлау оларды айнымалыларды сипаттау бөлімінде хабарлаудан ешқандай айырмашылығы жоқ деп ойлап қалауыңыз мүмкін. Шындығында да, аталған екі жағдайда да ортақ нәрселер өте көп, бірақ айтарлықтай бір ерекшелік бар: формальды параметрлер тізіміндегікез келген парамерт тек стандартты немесе алдын-ала хабарланған тип болуы мүмкін. Мысалы, процедураны төмендегідейхабарлауға болмайды:

Procedure S(a: array[1..10] of real);

Өйткені формальды параметрлер тізімінде массив индексінің шекараларын көрсететін аралық тип хабарланып отыр.

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

Мысалы,


Type

Mas=array[1..10] of real;

Procedure S(var a:real);

Қысқа жолдың өзі массив болып табылатындықтан, оны қосалқы программаға беру былай жүзеге асады:



Type

Input Type=String [15];

Output Type=String [30];

Function St(s: Input Type):Output Type;



Ашық массивтер

Object Pascal тілінде қосалқы программада ұзындығы айнымалы болып келген массивтерді сипаттау үшін «ашық массивтер» деп аталатын массивтер пайдаланылады.

Ашық массив дегеніміз – массив элементінің барлық типін сипаттайтын, бірақ оның өлшемі мен шекарасын анықтайтын қосалқы программаның формальды параметрі:

Procedure Myself(JpenArray:array of integer);

Қосалқы программаның ішінде мұндай параметр төменгі шекарасы нольден басталатын бір өлшемді массив ретінде қабылданады. Ашық массивтің жоғарғы шекарасы “High” деп аталатын стандартты функция арқылы анықталады. Нольді төменгі индекспен мән ретінде пайдалана отырып, ал жоғарғы мән High функциясымен анықталатын массивті қосалқы программа ұзындығы кез келген санмен алынған бір өлшемді массив ретінде анықтайды.

Procedure TfmExample,bbRunClick(Sender:TObject);

{Ашық массивті пайдалану мысалы: программа П компонентіне ұзындықтары әр түрлі бір өлшемді екі массивтің мазмұнын бір ғана П процедурасының көмегімен шығарады}.

Procedure ArrayPrint(aArray:array of integer);

Var k:integer;

S:string;

Begin

S:=’’;


For k:=0 to High(aArray) do

S:=s+IntToStr(aArray[k]);

mmOutput.Lines.Add(s);

end;


const

a:array[-1..2] of integer=(0,1,2,3);

b:array[5..7] of integer=(4,5,6);

begin


ArrayPrint(A);

ArrayPrint(B);

End;
Бұл мысалда байқап отырғандай, шақыру параметрі ретінде ArrayPrint процедурасына берілген А және В массивтерінің шекараларының мәндері болмайды. Дегенмен, ашық массивтердің өлшемділігі барлық уақытта 1-ге тең, мұны компилятор қадағалап отырады.

Егер біз программаға екі өлшемді с массивін қоссақ, var c:array[1..3,1..5] of integer; оның шақырылуы:

ArrayPrint(C);

қате жөнінде хабарламаны сөзсіз шығарады.



Массив конструкторы

Қосалқы программаны шақырғанда ашық массив түріндегі формальды параметрдің орнына массив конструкторын көрсетуге болады. Массив конструкторы дегеніміз үтір арқылы ажыратылып, квадрат жақшаға алынған масссив элементтерінің мәндері. Алдынғы мысалдағы:

const

a:array[-1..2] of integer=(0,1,2,3);



b:array[5..7] of integer=(4,5,6);

begin


ArrayPrint(A);

ArrayPrint(B);

End;
жазуының орнына

begin


ArrayPrint(A);

ArrayPrint(B);

End;

деп жазуға болады.



Вариантты массив параметрлері

Delphi 32 жүйесінде қосалқы программаға ұзындығы мен өлшемі айнымалы болып келген массивті бергенде вариантты массивтерді пайдаланған ыңғайлы. Төменгі мысалда GetArrayAverage функциясының көмегімен өлшемі 5-тен артпайтын ұзындығы айнымалы болып келген вариантты массивтің барлық элементтерінің арифметикалық ортасы анықталады:

Function GetArrayAverage(const V:Variant):Double;

{ұзындығы мен өлшемі айнымалы болып келген массивтің арифметикалық орта мәнін береді}

Var

I, j, k, l, m:integer;



Sum:Double;

NItem:integer;

Begin

Result:=-1E-309;



If((var type(v) and VarArray)<>VarArray) or

(VarArrayDimCount(v)>5) then

Exit;

Sum:=0;


NItem:=0;

//Массив элементтерінің саннын есептейміз

For K:=0 to VarArrayDimCount(v) do

NItem:=Nitem+VarArrayHighBound(v,k)-

VarArrayLowBound(v,k);

//Элементтердің қосындысын есептейміз

Case VarArrayDimCont(v) of

1:for i:= VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do

Sum:=Sum+v[i];

2:for i:= VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do

Sum:=Sum+v[i,j];

3:for i:= VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do

for j:= VarArrayLowBound(v,2) to VarArrayHighBound(v,2) do

for k:= VarArrayLowBound(v,3) to VarArrayHighBound(v,3) do

Sum:=Sum+v[I,j,k];

4:for i:= VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do

for j:= VarArrayLowBound(v,2) to VarArrayHighBound(v,2) do

for k:= VarArrayLowBound(v,3) to VarArrayHighBound(v,3) do

for l:= VarArrayLowBound(v,4) to VarArrayHighBound(v,4) do

Sum:=Sum+v[I,j,k,l];

5:for i:= VarArrayLowBound(v,1) to VarArrayHighBound(v,1) do

for j:= VarArrayLowBound(v,2) to VarArrayHighBound(v,2) do

for k:= VarArrayLowBound(v,3) to VarArrayHighBound(v,3) do

for l:= VarArrayLowBound(v,4) to VarArrayHighBound(v,4) do

for m:= VarArrayLowBound(v,5) to VarArrayHighBound(v,5) do
Sum:=Sum+v[I,j,k,l,m];

End;


Result:=sum/NItem

End;


Процедуралық типтер

Процедуралық типтердің негізгі қызметі – басқа процедуралар мен функцияларды шақыруда шынайы параметр ретінде пайдаланылатын процедуралар мен функцияларды беру құралы ретінде оны программист анықтайды. Процедуралық типті хабарлау үшін процедураның тақырыбы пайдаланылады, бірақ онда оның аты жазылмайды, мысалы:

type Proc1=Procedure(a, b, c:real; var d:real);

Proc2=Procedure(var a, b);

Proc3=Procedure;

Func1=Function:string;

Func2=Function(var s:string):real;

Келтірілген мысалдан байқалып отырғандай, екі процедуралық тип бар: процедура типі және функция типі. Келесі программа мысалында процедураны шақырудың шынайы параметрі ретінде процедураны беру механизмі бейнеленеді. Программа экранға екі функцияның кестесін шығарады.

sin(x)=(sin(x)+1)*Exp(-x) және

cos(x)=(cos(x)+1)*Exp(-x)

Бұл функциялардың мәндерін есептеп, басып шығару, PrintFuncП процедурасы арқылы жүзеге асады. Мұнда параметр ретінде х 0-ден 2-ге дейінгі аралықта функцияны есептеу мөлшері мен функцияның аты беріледі.

Function sin1 (x:real):real;

Begin

Result :=(sin(x)+1)*Exp(-x)



End; //sin1.

Function cos (x:real):real;

Begin

Result :=(cos(x)+1)*Exp(-x)



End; //cos1.

Procedure TfmExample,bbRunClick(Sender:TObject);

type

func =function (x:real):real; //h



Procedure PrintFunc(NP:integer; F:Func);

Var


K:integer;

X:real;


Begin

For k:=0 to NP do

Begin

X:=k*2*Pi/NP;



mmOutput.Lines.add(FloatToStrF(x, ffExponent, 10, 2)+#9#9+

FloatTostrF(F(x),ffExponent, 10, 2));

End;

End; //PrintFunc



Begin //BBRunClick

mmOutput.Lines.add(#9’sin1 функциясы:’);

PrintFunc(10, sin1);

mmOutput.Lines.add(#9’cos1 функциясы:’);

PrintFunc(10, cos1);

End;


Берілген қосалқы программаның жергілікті болмайтынына назар аударыңыз, яғни басқа қосалқы программаның ішіндегі хабарланған функциялар мен процедуралар. Сондықтан sin1 және cos1 қосалқы программаларының сипатталуы оқиға өңдеушісінің сыртында орналасқан. Ал # 9 символы – бұл табуляция символы, шығарылатын жолдағы цифрлардың бағанын бөлу үшін қойылады.

Рекурсия және оның сипатталуы

Рекурсия – бұл қосалқы программаның құрамындағы операторлардың орындалуы барысында өзін-өзі шақыратын , есептеу процесін ұйымдастыру тәсілі.

Енді факториалды есептеу мысалын қарастырайық. Программа edinput компонентінен N бүтін санын алып, LBOutput компонентіне Factorial рекурсивті функциясының көмегімен N!-дің мәнін шығарады.

Дұрыс ұйымдастырылған рекурсивті қосалқы программ орындалғанда алгоритмнің қандай да бір ағымдағы деңгейдегі ұйымдастырылуынан төменгі деңгейге көшу бірнеше рет жүзеге асады, ол қойылған есептің тривиалды, шешімін алғанша тізбекті түрде жалғаса береді. Біздің жағдайда тривиалды шешім N=0 болған жағдайда алынады да, рекурсия тоқтайды.

Procedure TfmExample,bbRunClick(Sender:TObject);

Function Factorial (N:Word):Extended;

Begin


If N=0 then

Result:=N*Factorial(N-1)

End;

Var


N:integer;

Begin


Try

N:=StrToInt(Trim(Edinput.Text));

Except

Exit


End;

LBOutput.Caption:=FloatToStr(Factorial(N))

End;

Алгоритмді рекурсивті түрде ұйымдастыруда программа мәтіні өте ыңғайлы, шағын, бірақ, орындалуы баяу және стектің толық орындалуы мүмкін (қосалқы программа әрбір шақырылған сайын оның локальды парамерлері ерекше ұйымдастырылған «программалық стек» деп аталатын жады бөлігіне орналасады).



Рекурсивті шақыру жанама болуы мүмкін. Мұндай жағдайда қосалқы программа өзіне бірінші қосалқы программаны шақыру жазылған басқа қосалқы программаны шақыру арқылы оралады.

Мысалы:


Procedure A (i:Byte);

Begin


B(i);


Procedure B (j:Byte);

Begin



A (i);




Егер «әрбір пайдаланылатын идентификатор алдын-ала сипатталуы тиіс» деген ережеге сүйенсек, онда мұндай программалық құрылымды пайдалануға болмайды. Ал, мұндай сипаттау болып жатса, онда алдын-ала бейнелеу енгізіледі.

Procedure B (j:Byte); Forward;

Procedure A (i:Byte);

Begin


B(i);


End;


Procedure B;

Begin


A(j);


End;


Келтірілген мысалдан көріп отырғанымыздай, алдын-ала бейнелеуде, процедураның тақырыбы хабарланып, ал оның денесі стандартты П директивасымен алмасады. Сондай-ақ, процедура денесі тақырыбымен жазылады, бірақ бұрын сипатталған формальды параметрлер көрсетілмейді.
ТАПСЫРМА:

Object Pascal тілінде нақты санды кез келген дәрежеге шығару операциясы қарастырылмаған. Дегенмен, бұл есепті Exp және ln математикалық стандартты функцияларын пайдалана отырып шығаруға болады:





ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:

А және В екі нақты параметрлері бар, А-ны В-ға дәрежелегендегі нәтижені беретін Power деген атпен функция құрайық.

Біздің құрған fmExample оқу формасында bbRunClick оқиғасын өңдеуші edInput компонентінің мәтінді оқып, ең болмағанда бір бос орынмен бөлінген екі санды бөліп (ерекшелеп) көрсетуге тырысады. Егер осыны орындау мүмкін болса, онда ол Power функциясына екі рет оралады: алдымен бірінші x саны, екінші y санына дәреже болады; одан кейін x санына y саны дәреже болады.

Procedure TfmExample. bbRunClick(Sender:TObject);

Function Power(A, B:real):real;

{Функция А санын В санына дәрежелейді. өйткені теріс саннан логарифм алынбайды, А-ның мәнін тексеру жүзеге асырылады: теріс мән оң мәнге алмастырылады. Сонымен қатар, кез келген санның ноль дәрежесі бірге тең}

Begin

If A>0 then



Result:=Exp(B*Ln(A))

Else if A<0 then

Result:=Exp(B*Ln(Abs(A)))

Else if B=0 then

Result:=0;

End; //Power

Var

S: string; x, y:real;



Begin

{edInput компонентінен жолды оқып, одан кем дегенде бір бос орынмен бөлінген екі нақты санды бөліп аламыз}



s:=edInput.Text

if (S=’’) or (pos(‘’,S)=0) then

Exit; //Мәтін немесе бос орын болмаса, онда ары қарай жұмыс орындалмай тоқтатылады

Try //Бірінші санды бөліп аламыз:

x:=StrToFloat(copy(s, 1, pos(‘’,s)-1)); //Егер бос орынға дейінгі символдарды өшірсек, онда екінші санды бөліп аламыз.

delete(s, 1, pos(‘’,s));

y:StrToFloat(trim(s));

except


Exit; //Қате пайда болған жағдайда жұмыс тоқтатылады.

End;


MmOutput.Lines.Add(FloatToStr(Power(x,-y)));

MmOutput.Lines.Add(FloatToStr(Power(x,-y)));



end;

Бұл жерде біз Power функциясын шақыруда нақты санды FloatToStr жолына түрлендіретін стандартты функцияны шақыруда пайдаланатын параметр ретінде көрсеттік: Power функциясын шақыру кезінде х және у параметрлері – бұл шынайы параметрлер. Олар функция тақырыбындағы а және В формальды параметрлерінің орнына қойылып, одан кейін тиісті әрекеттердің орындалуы жүзеге асады. Алынған нәтиже «Result» атты арнайы айнымалыға меншіктеледі. Программада Power функциясы екі рет шақырылады: алдымен х және у праметрлерімен, сондықтан екі нәтиже алынады.



Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:


  1. Object Pascal тіліндегі процедуралар мен функциялардың қызметі қандай және олар қалай сипатталады?

  2. Рекурсия дегеніміз не?

  3. Жергілікті және глобальды атаулар деп қандай атауларды айтамыз?

  4. Процедуралар мен функциялардың орналасуының қандай ерекшелігі бар?

  5. Қосалқы программаларға қолданылатын қандай стандартты директивалар бар?

  6. Формальды параметрлер дегеніміз не?

  7. Ескерілмейтін параметрлер деп қандай параметрлерді айтамыз және олар қалай сипатталады?

  8. Массив параметрлер деп қандай параметрлерді айтамыз және олар қалай сипатталады?

  9. Ашық массив дегеніміз не және ол қалай сипатталады?

  10. Ашық массивтің жоғарғы шекарасы қандай стандартты функциямен анықталады?

  11. Массив конструкторы дегеніміз не?

  12. Вариантты массивтер қандай жағдайларда пайдаланылады?

  13. GetArrayAverage функциясының қызметі қандай?

  14. Процедуралық типтердің негізгі қызметі қандай және олар қалай хабарланады?

  15. Object Pascal тілінде қанша процедуралық тип бар?

  16. Рекурсия дегеніміз не және ол қалай ұйымдастырылады?

  17. Нақты a, b және с сандары берілген. Төмендегі өрнектердің мәнін есептейтін программа жазыңдар:

  18. А) S=(max(a,a+b)+max(a,b+c))/(1+max(a+b*c,a*b+c));

  19. В) S=(max(a,b,c)+max(ab,bc,ac))/min(1/a,1/b,1/c)-max(a/b,a/c,b/c)).

  20. Есептеңіз:

  21. Z-(V1+V2+V3)/3, мұндағы V1,V2,V3 – радиустардың өлшемі сәйкес r1,r2,r3 – болып келген шар көлемдері.

  22. Нақты X1,Y1,X2,Y2…X10,Y10 сандар берілген. Төбелерінің сәйкес координаталары (X1,Y1),(X2,Y2)…(X10,Y10) болатын онбұрыштың периметрлерін табыңдар.

  23. М және n натурал сандары a1,…,an, b1,…,bm, c1…,c30 бүтін сандары берілген. Табыңыз:


  24. Динамикалық жады дегеніміз не?

  25. Көрсеткіш дегеніміз не және не үшін пайдаланылады?

  26. Типтелмеген көрсеткіштердің қызметі қандай?



Зертханалық жұмыс №12
Тақырыбы: Кластар мен интерфейстер. Модульдер
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Object Pascal тіліндегі кластар деп өрістен, әдістен және қасиеттерден тұратын арнайы типтерді айтады. Кез-келген басқа типтер тәрізді класс объект деп аталатын нақты экземплярды құру қызметін атқарады. Turbo Pascal жүйесіндегі жасалған программалармен үйлесімділікті сақтау үшін жүйені құрушылар Object Pascal тіліндегі бұрынғы объектілі модельді сүйемелдейтін Object – объект типін қалдырған. Кластың басқа типтерден басқа маңызды айырмашылығы кластың объектілері барлық уақытта топқа бөліне алады. Сондықтан объект айнымалылар жадының динамикалық бөлігінде көрсеткіштің рөлін атқарады. Дегенмен, басқа көрстекіштерден айырмашылығы объектінің мазмұнына сілтемеде объектінің атауынан кейін «^» символын пайдалануға болмайды:

Type

TmyClass=class(TObject)



Field: Integer;

end;



var

MyClass: TmyClass;

begin



MyClass^.Field:=0; // Қате! Ол былай жазылуы тиіс.



MyClass.Field:=0;

end.



Негізгі ұғымдар

Класстар – бұл күрделі программаларды жеңілдету және оның сапасын арттыру үшін ойластырылған программистердің ерекше өнер табысты. Кластардың негізінде үш іргелі принцип жатыр, олар инкапсуляция, мұрагерлік және полиморфизм.



Инкапсуляция

Класс- өрістер, әдістер мен қасиеттер деп аталатын үш маңызды ұғымның бірлігін береді. Осы үш маңызды ұғымды бір бүтінге біріктіру инкапсуляция деп аталады. Көпшілік жағдайда, инкапсуляция класты программаның қалаған бөліктерінен оқшаулауға мүмкіндік береді, нақты бір есепті шешудің «өзіндік жеткіліктігін» арттырады. Нәтижесінде класс қандай да бір басқарушылықты атқарады. Мысалы, TForm класы Windows –терезесін құруға қажеттілерден, TМemo класы – толық басқарылатын мәтіндік редактор жұмысын, Ttimer класы программа жұмысын таймермен қамтамасыз ететін құралдарды қамтиды (немесе инкапсуляциялайды)

Сонымен, инкапсульяция дайын программалық жабдықтаумен жұмыс істеуге арналған қуатты құрал болып табылады. Delphi жүйесінің кластар кітапханасы- бұл программа құруға арналған Borland фирмасының программистері құрған кірпіштер жиынтығы екен.

Мұрагерлік

Кез-келген класс басқа кластан туындайды. Ол үшін оны хабарлағанда ата –ана кластың аты көрсетіледі:

TchildClass=class(TParentClass)

Туындаған класстар автоматты түрде өзінің ата – анасының өрісі, әдісі және қасиеті шығады және олардың жаңамен толықтырылуы мүмкін. Сөйтіп, мұрагерлік принципі күрделі кластарды кезеңмен құруды және өзінің жеке кластар кітапханасын жасауға мүмкіндік береді.

Object Pascal –дың барлық кластары жалғыз ата-ана TObject класынан туындаған. Бұл кластың өрісі және қасиеттері жоқ, бірақ өзіне кез-келген объектілердің барлық өмірлік қасиеттерін қамтитын жалпы тағайындалудың әдістерін қамтиды. Программист TОbject класы ата – ана болмайтын класс құра алмайды. Оған төмендегідей бейнелеулер тән:

TaClass=Class(TObject)

TaClass=Class

Мұрагерлік принципі TObject класынан оның ұрпақтарына қарай дами отырып, біртіндеп кеңейетін тармақталған кластар құруға әкеледі. Әрбір ұрпақ өзінің ата-анасының мүмкіндіктерін толықтырып (жаңартып), оның өзінің ұрпақтарына беріп отырады.





7.1-сурет. Delphi-дегі кластар тармағы.
7.1-суретте Delphi-дегі кластар тармағы келтірілген. TPersistent класы өзінің TObject ата-анасының мүмкіндіктерін кеңейтеді: ол мәліметтерді файлға сақтап, оны одан қайтадан ала алады, нәтижесінде оның барлық ұрпақтары осы мүмкіндіктерді орындай алады. TComponent класы өз кезегінде, класты құрушының ортасымен әрекеттесіп, оны өзінің ұрпақтарына бере алады. TControl класы файлдармен және класты құрушының ортасымен ғана жұмыс істеп қоймай, сонымен бірге, экранда көрінетін бейнелерді құруға және оның қызметін орындауға қабілетті, ал оның ұрпағы TwinControl Windows терезелерін де құра алады және т.б.

Полиморфизм

Полиморфизм –бұл мағынасы ұқсас мәселелерді әр түрлі тәсілмен шешетін кластар қасиеті. Object Pascal-дың шеңберінде кластардың қасиеті оған кіретін әдістердің жиынтығымен анықталады. Класс ұрпақтарындағы қандай да бір әдістің алгоритімін өзгерте отырып, программист бұл ұрпаққа ата –анасында жоқ ерекше қасиетті бере алады. Әдісті өзгерту үшін оны сол ұрпақта жабу қажет, яғни ұрпақты бір атаулы әдісті хабарлап, оған қажетті әрекетті жүзеге асыру қажет. Нәтижесінде, объект-ата-ана мен объект-ұрпақта әртүрлі алгоритмдік негізі бар, объектілерге әртүрлі қасиет беретін екі бір атаулы әдіс жұмыс істейтін болады.

Object Pascal тілінде полиморфизм тек жоғарыда сипатталған мұрагерлік механизмі мен ата –ананың әдісін жабумен шектелмейді, сондай –ақ оларды виртуаландыруда жүзеге асады.

Кластың құраушылары

Өріс

Өріс деп кластағы инкапсуляцияланған мәліметтерді айтады. Өріс кез келген типті болуы мүмкін, оның ішінде класта болуы мүмкін;

Мысалы:

type


TMyClass=class

AIntField:integer;

AstrField:String;

AObjectField:Tobject;

……………

End;


Әрбір объект өрістер жиынтығын алады, бірақ осы кластың барлық объектілері үшін жалпы қасиеттер мен әдістер жиынтығы бар. Инкапсуляцияның іргелі принципі өріске кластың әдістері мен қасиеттерінің көмегі арқылы қатынас жасау керектігін талап етеді. Бірақ Object Pascal тілінде өріске тікелей шығуға рұқсат етіледі.

type


TMyClass=class

AIntField:integer;

AstrField:String;

AObjectField:Tobject;

……………

End;


Var aObject. TMyClass;

Begin


……………

AObject.FindField:=0;

AObject.FStrField:=’символдар жолы’;

………………….


end;

Класс- ұрпақ өзінің барлық аталарынан барлық өрістерді ала алады және оны өзінікімен толықтырады, бірақ алдын ала анықтай алмайды немесе өшіре алмайды. Сөйтіп, тармақ иерархиясында класс қаншалықты төмен орналасса, соншалықты оның объектілерінен мәліметтер ала алады.



Әдістер

Класта инкапсуляцияланған процедуралар мен функциялар әдістер деп аталады. Олар әдеттегі қосалық программалар тәрізді хабарланады:


Тype TMyClass=class

Function MyFunc(aPar:Integer):integer;

Procedure MyProc;

End;
Кластың әдістеріне кіру оның өрістеріне кіргендей құрама атаулардың көмегімен жүзеге асырылады.

Var

AObject:TmyClass;



Begin

………


AObject:MyProg;

………


end;

Жоғарыда айтылғандай кластың әдістері ұрпақтарында жабылып тұруы мүмкін. Мысалы,

Type

TparentClass=Class



Procedure DOWork;

End;


TChildClass=Class(TParentClass);

Procedure DOWork;

End;
Екі кластың ұрпақтары да DOWork процедурасының атауы бойынша ұқсас әрекеттерді орындау мүмкін. Бірақ, бұл жалпы жағдайда әртүрлі орындалады. Әдістерді мұндай ауыстыру статикалық деп аталады, яғни компилятормен программаны жүргізу кезеңінде жүзеге асырылады. Object Pascal тілінде программаны жүргізу кезеңінде әдістерді динамикалық ауыстыру жиі пайдаланылады. Мұны жүзеге асрыу үшін аталық класта оранласқан әдіс динамикалық (dynamic директивасымен) немесе виртуалды (virtual) түрде хабарлануы тиіс. Осындай хабарлауды кездестіргеннен кейін компилятор екі кесте құрады: DMT (Dynamic Method Table) және VMT (Virtual Method Table), оларды сәйкес динамикалық немес виртуалдық әдістердің кіру нүктесіндегі адреске орналастырады. Әрбір ауыстырылатын әдіске оралған компилятор сәйкес кестелердің бірінен қосалқы прогаммаға кіру нүктесінің адресін шығаруға мүмкіндік беретін кодты қояды.

Класс ұрпағына әдісті алмастыру override (жабу) директивасымен хабарланады. Осы нұсқауды алғаннан кейін, компилятор программаны жүргізу кезеңінде ата-аналық кестесіне класс-ұрпақ әдісінің кіру нүктесін орналастырады, ал аталыққа жаңа әдістің көмегімен қажетті әрекетті орындауға мүмкіндік береді.

Мысалы, аталық класс Show және Hide әдістерінің көмегімен экранда бейнені көрсетеді немесе жасырады. Бейнені құру үшін длогикалық параметрі бар DRAW әдісін пайдаланады:

Type


TVisual Object=class(TWinControl)

Procedure Hide;

Procedure SHOW;

Procedure DRAW(IsSHOW:Boolean):Virtual;

End;

TVisualChildObject=class(TVisual Object)



Procedure DRAW(IsSHOW:Boolean):override;

end;


Show және Hide әдістерінің жүзеге асырылуы өте қарапайым:

Procedure TVisual Object.SHOW;

Begin

DRAW(True);



End;

Procedure TVisual Object.Hide;

Begin

DRAW(false);



End;

Аталық және ұрпаққа DRAW әдісінің жүзеге асырылуы әртүрлі және әртүрлі бейнелер құрылады. Нәтижесінде, SHOW және Hide аталық әдістері - өзінің кез келген ұрпағындағы DRAW әдісінің нақты жүзеге асырылуына тәуелді болады. Динамикалық байланыстыру толығымен кластар полиморфизмін жүзеге асырады.

Динамикалық және виртуалдық әдістердің арасындағы айырмашылығы- динамикалық әдістер кестесінде осы класта тек dynamic ретінде хабарланған әдістер адрестері болады, ал виртуалдық кестесінде сол кластын вертуалдық әдістерімен қатар, оның барлық аталықтарының да адрестері сақталады. Көлемі айтарлықтай VMT келесі жылдам іздеуді жүзеге асырады, сондай-ақ, динамикалық әдіске оралғанда программа алдымен DMT объектінің кестесін қарап шығады, одан кейін аталық класын қажетті кіру нүктесі табылғанша іздейді.

Динамикалық жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай жабылатын әдістер ешнәрсе орындамауы мүмкін. Мұндай әдістер абстрактылы әдістер деп аталады, олар ұрпақтарында жабылуға міндетті. Прогаммист abstract директивасымен хабарлау арқылы абстракт әдісі шығаруға тосқауыл қоя алады. Мысалы:

Type

TvisualObject=class(TWinControl)



….

Procedure DRAW(IsSHOW:Boolean);

Virtual;abstract; end;

TVisualChildObject=class(TWinControl)

......

Procedure DRAW(IsSHOW:Boolean):override;



End;

Var


aVisualObject:TvisualObject;

aVisualChild:TvisualChildObject;

begin



aVisualObject.SHOW; {қате / Абстракт әдіс шақырылды}



aVisualChild.SHOW {Шақыру дұрыс. TVisualChildObject класындағы DRAW әдісі жабылған}

End;


Жабылмаған абстракт әдісті шақыру орындалу барысында қате болып есептеледі. Сауатты құрылған прогрммада абстракт әдіс шақырылмайды.

Кез-келген класстың құрамына екі арнайы әдіс кіреді: конструктор және деструктор. Tobject класында бұл әдістер Create және Destroy деп аталады. Конструктор динамикалық жадыда объектілерді үлестіреді және жадының осы адресіне SELF айнымалысын орналастырады, ал автоматты түрде класта хабарланады. Конструктор және деструктор процедура болып табылады, бірақ Constructor және destructor қызметші сөздерінің көмегімен хабарланады:


Type

TMyClass=class

IntField:integer;

ConstructorCreate(Value:integer);

Destructor Destroy;

End;
Көптеген конструкторлар объектінің дұрыс жұмыс істеуіне қажетті қандай да бір әрекетті орындайды. Сондықтан класс ұрпақ конструкторында алдымен өзінің аталық конструкторын шақыру қажет, одан кейін қосымша әрекеттер жүзеге асырылады. Аталық кластағы кез-келген әдісті шақыру Inherited (мұрагер) қызметші сөзінің көмегімен жүзеге асырылады:

Constructor TMyClass.Create (Value:integer);

Begin


InheritedCreate; // Мұрагер конструкторды шақыру

Inherited:=Value //Қосымша әрекетті орындау

End;
Кейбір әдістер объектіні құрмай және иницилизация жасамай-ақ шақырылуы мүмкін. Мұндай әдістер кластың әдістері деп аталады, олар Class қызметші сөзінің көмегімен шақырылады.

Type


TMyClass=class(TObject)

Class Function GetClassName:String;

End;

S:string;



Begin

S:=TmyClass.GetClassName;

…..

End;


Кластың әдістері өрістерін шақыра алмайды, жалпы жағдайда объект құрмай –ақ шақырылады. Әдетте класс туралы қызметші ақпаратпен шектеледі: класс аты, аталық класс аты, әдістің адресі және т.б.

Бір атаулы әдістер

Бір кластың шеңберінде бірнеше бір атаулы әдістерді пайдалануға болады. Жоғарыда сипатталған аталық әдісті жабу тәсілі ұрпақтың жабылған аталық әдісті «көрмеуіне» әкеледі. Оны тек Inherited қызметші сөзінің көмегімен шақыруға болады.

Бір атулы әдіс табылатын болса, Delphi компиляторы класта осыған ұқсас әдіс басқа параметрмен келтірілгендігі туралы ескертеді.

Бір атаулы әдісті хабарлау үшін reintroduce қызметші сөзі пайдаланылады.

Келесі мысалда TForm 1 класында 4 бір атаулы әдіс-Close пайдаланылады. Олардың тек біреуі-параметрсіз мұрагер әдіс-өзінің негізгі қызметін атқарып, терезені жабады. Ал, қалған үшеуі параметржинағымен ерекшеленіп, терезе тақырыбына хабарлама шығарады.

Бос формаға төрт TButton батырмаларын орналастырып, оған OnClickын өңдеушілерін жазыңдар:

Procedure TForm1.Button1Click(Sender:TObject).

Begin


Close(“символдар жолы”)

End;


Procedure TForm1.Button2Click(Sender:TObject);

Begin


Close(123)

end;


Procedure TForm1.Button3Click(Sender:TObject);

Begin


Close(20,300)

end;


Procedure TForm1.Button4Click(Sender:TObject);

Begin


Close

end;


Енді Private бөліміне TForm1 класының хабарлануы үшін төмендегідей үш Close әдісін орналастыруға болады:

Private{ Private declaration}

Procedure Close (S:String); reintroduse; overload;

Procedure Close (I:Integer); reintroduse; overload;

Procedure Close (I,J:Integer); reintroduse; overload;

Одан кейін Implementation е хабарланған әдістердің сипатталуын жазыңдар:

Procedure TForm1. Close (S:String);

Begin


Caption:=S

End;


Procedure TForm1. Close (i:integer);

Begin


Caption:=IntToStr(i)

End;


Procedure TForm1. Close (i,j:integer);

Begin


Caption:=IntToStr(i*j)

End;грамма орындалғанда алғашқы үш батырма TForm1 класының Close әдісін шақырады және терезенің тақырыбы ауысады, сонымен қатар Button4 батырмасы тәрізді аталық TForm класының Close әдісін шақырып, терезені жабады.



Қасиеттер

Қасиеттер – бұл өріске кіру мүмкіндігін реттейтін кластардың арнайы механизмі.

Қасиеттер property, read және write қызметші сөздерінің көмегімен хабарланады (read және write сөздері тек қасиетті хабарлау контексінде пайдаланатын қызметші сөздер). Әдетте қасиет қандайда бір өріспен байланысты болады және осы өріске жазуда немесе одан оқуда пайдаланатын кластың әдістерін көрсетеді. Мысалы:

Type

TaClass=class



IntField:integer;

Function.GetField:integer;

Procedure SetField (Value&integer);

Property IntegerValue:integer read

GetField write SetField;

End;


Программа контексінде қасиет өзін әдеттегі өріс ретінде көрсетеді.

Сондай-ақ, төмендегідей операторларды жазуға болады:

Var

aClass:TaClass;



Value:integer;

Begin


aClass:=TaClass.Create {емесе қасиетті шақырар алдындағы конструктордың міндетті шақырылуы}

aClass.InterValue:=0;

Value:=aClass.InterValue;



aClass.Destory; // керек емес объектіні өшіру

Мұнымен бірге, төмендегідей меншіктеу операторының жазылуы мүмкін:

aClass.IntField:=NewValue;

Бұл оператормен төмендегі оператордың арасындағы айырмашылық-қасиетті шақырғанда SetField әдісі автоматты түрде қосылады және арнайы әрекеттер орындалады.

Оқу программасында келтірілген

LbOUTPUT.CAPTION:=’жол’

Операторын еске түсірейік.

Label компонентінің Caption қасиеті SetText әдісін шақырады, ол ішкі айнымалыдағы символдар жолын сақтап қана қоймай, жаңа мәтінді де еске сақтайды.

Егер қасиетті арнайы оқу немесе жазу үшін қажеттілік болмаса сәйкес әдістің атауының орнына өріс атауын көрсетуге болады:

Type

TaClass=class



IntField:integer;

Procedure SetField (Value:integer);

Property IntegerValue:integer read IntField write SetField;

End;


Егер қасиет тек оқу немесе жазу үшін ғана қажет болса, онда оған сәйкес бөлігін жазбауға болады. Қасиет өріспен байланыспауы да мүмкін.

Шынында, ол қасиеттің өзінің типіндей мәліметтерден қандайда да бір әрекетті жүзеге асыратын бір немесе екі әдісті сипаттайды.



Кластарды хабарлау

Жаңадан құрылатын кез келген класс төмендегідей қызметші сөздермен анықталатын секциялардан тұрады: Private (жабылған), protected (қорғалған), public (мүмкін) және automated (автоматтандырылған). Әрбір секцияның ішінде басында өріс, одан кейін әдістер мен қасиеттер анықталады.

Секциялар класы сипаттау элементтерінің көрінетін бөлінгін анықтайды. Public секциясы ондағы көрсетілген өрістердің көріну бөлігіне шектеулер жасамайды, әдістер мен қасиеттерді кез келген басқа программа модулінде шақыруға болады. Published секциясы көріну бөлігін шектемейді, бірақ мұнда тек орындалу кезеңінде ғана мүмкін болатын қасиеттер ғана емес, программа құру кезеңіндегі қасиеттер жащылады (яғни объектілір инспекторы терезесінде).

Published секциясы тек стандартты мес компоненттерді жасауда пайдаланылады. Delphi ортасы формаға орнатылған компоненттерді сипаттауды арнайы аты жоқ секцияғаорналастырады, ол класс тақырыбынан кейін жазылады да, бірінші хабарланған секцияға дейін жалғасады. Бұл секция Published деп аталады.

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

Private секциясында хабарланған элмент, егер ол басқа модульде орналасқан болса, тіпті кластың жақын ұрпақтары үшін де пайдаланылмайды. Automated секциясы OLEін автоматтандыру интерфейсінде қосылатын қасиеттер мен әдістерді хабарлау үшін пайдаланылады; бұл секцияның мүшелерінің көріну бөлігі шектелмеген.

Object Pascal де кез келген секцияны бірнеше рет, яғни қажетіне қарай хабарлай беруге болады, секцияларды пайдаоанушы қалауынша орналастыруына болады. Кез келген секция бос болуы мүмкін. Келесі программа фрагменті секциялардың экрандағы көріну бөлігін сипаттайды.

Unit Unit1;

Interface

Uses Controls, Forms;

Type

TForm1=class(TForm)



Button1:TButton;

Private


FintField: integer;

Procedure SetValue(Value:Integer);

Function GetValue:Integer;

Published

Property IntField: read GetValue write SetValue

Protected

Procedure Proc1;

Public


Procedure Proc2;

End;


Var

Form1:TForm1;

Implementation

Procedure TForm1. Proc1;

Button1.Color:=clBtnFace;

FIntField:=0;

IntField:=0;

Proc1;


Proc2;

End;


Begin

Form1.Button1.Color:=clBtnFace;

Form1. FLintField:=0;

Form1. IntField:=0;

Form1.Proc1; //Бұл жазу қате!

Form1.Proc2;

End;

Unit Unit1;



Interface

Uses Controls, Unit1;

Type

TForm2=class(TForm1)



Button2:TButton;

Procedure Button2

Procedure Button2Click(Sender:TObject);

End;


Var

Form2:TForm2;

Procedure Tform2.Button2Click(Sender:TObject);

Begin


Button1,Color:=clBthFace;

FintField:=0; // Бұл жазу қате!

Proc1;

Proc2;


End;

Begin


Form1.Button1.Color:=clBthFace;

Form1.FintField:=0; // Бұл жазу қате!

Form1.IntField:=0;

Form1.Proc1;//Бұл жазу қате!

Form1.Proc2;

End;


Класс — ұрпақты хабарлауда класс элементтерін бір көріну бөлігінен басқа бөлігіне алмасиыруға болады. Алдыңғы мысал үшін төмендегідей хабарлауды жазуға болады:

Type


Tform2=class(TForm2)

...


Public

Procedure Proc1;

...

end;
Осындай хабарлаудан кейін Unit2 модулін былай шақыруға болады:



Form2.Proc1;

Private секциясына алмастыру жасағаннан кейін хабарлау элементі ұрпақтарына көрінбейді (егер ұрпақ басқа модульде хабарланған болса), онда кейін оны басқа секцияға орналастыруға болмайды.

Класс модульдің тек интерфейстік бөлігінде немесе жүзеге асырудың бастапқы кезеңінде хабарланады. Класты қосалқы программаның сипаттау бөлігінде анықтауға болмайды.

Интерфейстер

Интерфейстер -COM (Component Object Model — объектілердің компоненттік моделі), COBRA (Common Object Request Broker Architecure — жалпы объектілерді талап ететін брокерлі архитектура) технологияларында және осыған байланысты қашықтықтан кіру мүмкіндігі бар технологияларда басты роль атқарады. басқа сөзбен айтқанда, басқа машинада орналасқан объектілер объектілерге кіру технологиясы. Оның негізгі міндеті — алыстағы объектінің қасиетін, әдісін және оқиғасын сипаттау, яғни программалау тілінде клиентке арналған қосымшаны жасауда пайдаланылады. Егер ол өзінің жеке меншік объектісі болса, интерфейститің көмегімен клиент программасы алыстағы объектіге қатынас жасайды.

Интерфейстер тақырыбының ауқымы өте кең және қызықты да. Бірақ интерфейстер жөніндегі жалпы түсінікпен ғана шектелеміз. Интерфейс дегеніміз — бос класс.

Интерфейстің құрылуы және пайдаланылуы

Интерфейстер типтерді сипаттаудың дербес жағдайы. олар interface қызметші сөзінің көмегімен хабарланады. Мысалы,


Type

IEdit=interface

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo;stdcall;

End;

Мұндағы хабарлау абстракт класты сипаттаумен бірдей, яғни интерфейсті шақыру ондағы хабарланған қасиеттер мен әдістерді талдауды талап етпейді.



Кластардан айырмашылығы интерфейстің өрістері болмайды, сондықтан ондағы read және write бөлімінде хабарланған қасиеттер тек әдіске ғана сілтеме жасауы мүмкін. Интерфейсте хабарланған барлық мүшелер тек Public секциясында орналасады.

Әдістер абстракт (abstract), виртуалды (virtual), динамикалық (dinamic) немесе жабылатын (override) бола алмайды. Интерфейстерде конструкторлар немесе деструкторлар болмайды, яғни ондағы сипатталған әдістер тек оны сүйемелдейтін кластың шеңберінде ғана жүзеге асырылады, ол интерфейстің аты оның аталық тізіміндегі кластың хабарлануында көрсетіледі:


TEditor=class(TInterfacedObject,IEdit)

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo:Boolean;stdcall;

End;
Әдеттегі кластан интерфейстік кластың айырмашылығы оның бірнеше аталық интерфейсі болуы мүмкін:

Type

IMyInterface=interface



Procedure Delete; stdcall;

TmyEditor=class(TInterfacedObject,IEdit,IMyInterface)

Procedure Copy;stdcall;

Procedure Cut;stdcall;

Procedure Paste;stdcall;

Function Undo:Boolean;stdcall;

Procedure Delete; stdcall;

End;
Кез келген жағдайдағы интерфейстік класты жүзеге асыру бөлімінде сәйкес интерфейстік әдістерді сипаттау қажет. Мысалы, егер интерфейс хабарланған болса

IPaint=interface

Procedure CirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;


Кез келген жағдайдағы интерфейстік класты жүзеге асыру бөлімінде сәйкес интерфейстік әдістерді сипаттау қажет. Мысалы, егер интерфейс хабарланған болса
IPaint=interface

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;


және оның интерфейстік класын пайдаланатын болса,

TPainter=class(TInterfaceObject, Ipaint)

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;

онда implementation бөлімінде әдістің жүзеге асырылуын көрсету қажет:



Procedure Tpainter.CirclePaint(Canva:TCanvas; x,y,R:integer);

begin


With Canva do

Ellipse(x,y,x+2*R,y+2*R);

End;

Procedure Tpainter.CirclePaint(Canva:TCanvas; x1,y1,x2,y2,R:integer);



begin

With Canva do

Rectabgle(x1,y1,x2,y2);

End;


Енді шеңбер және квадрат сызу үшін кластың интерфейстік объектісін хабарлауға болады:

Procedure Tform1.PaintBoxPaint(Sender:TObject);

var

Painter:IPaint;



begin

Painter:=TPainter.Create;

Painter.CirclePaint(PaintBox1.Canvas,10,0,10);

Painter.RectPaint(PaintBox1.Canvas,40,0,60,20);

End;

Интерфейс оның пайдаланатын интерфейстік класын хабарлағанға дейін хабарланатындығын қарамастан, оның әдістерінің кластың хабарлауында келтірілетіні міндетті екені компиляторға белгілі. Біздің жағдайда оны былай көрсетуге болады:



Type

TPainter=class(TInterfaceObject,IPaint)

End;

Мұнда жазу қате болар еді: компилятор CirclePaint және RectPaint әдістерінің сипатталуын қоюды талап етер еді.



Сондай-ақ, Object Pascal тілінің барлық кластары жалғыз аталық класс Tobject класынан туындағаны тәрізді барлық интерфейстік кластар TinterObject жалпы аталығынан туындаған. Бұл аталық жадыны интерфейстік объектілер үшін үлестіре алады және Iunknow глобальды интерфейсін пайдаланады:

Type


TinterfacedObject=class(TObject,IUnknown)

Private


Frefcount:integer;

Protected

Function QueryInterface(constIID:TGUID; outObj):integer;stdcall;

Function_AddRef:integer;stdcall;

Function_Relefse:integer;stdcall;

Public


Property RefCount:integer read FrefCount;

End;


Егер алдыңғы мысалда Tpainter класы төмендегідей сипатталған болса:

TPainter=class(TPaint)

ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);

Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);

End;

Онда компилятор TinterfaceObject класының QueryInterface_Add_Release әдістерін қосуды талап етер еді. Бұл кластың FrefCount өрісі интерфейстік объектіні шақыру есептегішінің қызметін атқарады және Windows схемасында қабылданғанындай пайдаланылады: Iunknow интерфейсінің Add әдісіне әрбір оралған сайын есептегіш 1-ге артады, ал Release әдісіне оралған сайын есептегіш 1-ге кемиді. Бұл өрістің мәні нольге тең болғанда интерфейстік объект жойылып, жадыдан алған орнын босатады.



Интерфейстік объектіге as типтерді келтіру операторын қолдануға болады, бұл жағдайда керекті интерфейс таңдалады:

Procedure PaintObject(P:TInterfacedObject)

Var x:IPaint

begin


Try

X:PasIPaint;

X.CirclePaint(PaintBox1.Canvas,0,0,20)

Except


ShowMessage('объект IPaint интерфейсін сүйемелдемейді')

End; end;

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

қашықтықтағы объектіні пайдалануға есептелген интерфейстер глобальды бірегей идентификатормен жабдықталуы тиіс (Guid). Мысалы,

IPaint=interface

['{AYAFEB60-7705-11D2-8B-41-4444553540000}']

ProcedureCirclePaint(Canva:TCanvas; x,y,R:integer);

ProcedureRectPaint(Canva:TCanvas; x1,y1,x2,y2:integer);

End;

Implements қызметші сөзінің көмегімен программист кейбір класқа қандай да бір қасиетті қоса алады. Бұл қасиеттің типі интерфейс немесе класс болуы мүмкін. Егер қасиеттің типі интерфейс болса, бұл интерфейстің аты аталық кластар тізімінде көрсетілуі тиіс, яғни интерфейстік кластағыдай:

Type


IMyInterface=interface

Procedure P1; Procedure P2;

End;

TMyClass=class(TObject,IMyInterface)



IMyInterface=IMyInterface;

Property MyInterface:IMyInterface

Read FMyInterface implements ImyInterface;

End;


Мұнда мына мәселеге көңіл аудару қажет: мысалдағы TmyClass интерфейстік класс болып табылмайды, яғни Р1 және Р2 әдістері орындалатын класс.

Егер одан MyInterface өкілетті қасиетін анықтауды алып тастаса, онда ол интерфейстік болып табылады және MyInterface әдісін сипаттау қажет.

Өкілетті қасиетте міндетті түрде read болуы тиіс. Егер оның типі класс болса және ол сол хабарланған болса, оның басқа өкілетті қасеиттерінің болуы мүмкін емес.

Модульдер

Модульбұл интерфейстік бөлімнің әртүрлі компоненттерін (типтер, тұрақтылар, айнымалылар, процедуралар мен функциялар) қамтитын дербес компиляцияланатын программалық бірлік. Интерфейстік бөлікте объектілердің пайда болуы оларды негізгі программаның басқа модульдері үшін мүмкін жасайды. Процедуралар мен функциялардың денесі пайдаланушыдан жасырылған модульдің орындалатын бөлігінде орналасады.

Delphi модульдердің ролі тек жеке компиляциялау механизмімен ғана шектелмейді. Delphi әрбір программаға қосылатын тереземен жеке модульді байланыстырады да, осындай тәсілмен жеке программалық бірлік үшін терезенің барлық қасиетін сақтайды. Біз атап өткеніміздей, негізгі программа (DPR жоба файлы): программада пайдаланылатын барлық модульдердің тізімінен және қажетті терезені құруды қамтамасыз ететін бірнеше орындалатын операторлардан тұрады, сондай-ақ, Windows жүйесімен программаның байланысын қамтамасыз етеді. Программаның барлық негізгі жұмысы программада сақталған кодпен басқарылады.



Модульдер құрылымы

Модульдің құрылымы төмендегідей:

Unit <атау>;

Interface



<интерфейстік бөлік>

Implementation



<толтырылатын бөлік>

initialization



<орнатылатын бөлік>

finalisation



<аяқталатын бөлік>

end


Мұндағы Unit — қызметші сөз (бірлік); модуль тақырыбын бастайды; <атау>-модуль атауы (дұрыс идентификатор); Interface — қызметші сөз (интерфейс); модульдің интерфейстік бөлігін бастайды; Implementation — қызметші сөз (толтыру); орындалатын бөлікті бастайды; initialization — қызметші сөз (инициализация); модульдің инициализацияланатын бөлігін бастайды; finalisation қызметші сөз (аяқтау); модульдің аяқталатын бөлігін бастайды; end — қызметші сөз, модульдің соңы дегенді білдіреді.

Сөйтіп, кез келген модуль тақырыптан және құрамдас бөліктен тұрады, олардың кез келгені бос болуы мүмкін.



Модуль тақырыбы және модульдердің бір-бірімен байланысы

Модуль тақырыбы Unit қызметші сөзінен және одан кейінгі модуль атынан тұрады. Object Pascal тілінде дұрыс жұмыс істеу үшін үлкен программалар құруды жеңілдететін құралдарды қосу мүмкіндігі қарастырылған. Ол үшін бұл атау модульдің алғашқы мәтіні орналасқан дискілік файлдың атымен сәйкес келуі тиіс.

Мысалы, тақырып:

Unit Global

болса, сәйкес модульдің алғашқы мәтіні Global.pas дискілік файлында орналасуы тиіс. Сонымен, модуль атауы оның басқа модульдермен және негізгі байланысу қызметін қамтамасыз етеді. Ол байланыс арнайы сөйлеммен

Uses <модульдер тізімі>

қамтамасыз етіледі.

Мұндағы Uses — қызметші сөз (пайдаланылды); <модульдер тізімі>-байланыс орнатылатын модульдер тізімі, олар бір-бірінен үтір арқылы ажыратылады. Мысалы,

Uses Windows, SysUtils, MyUnit;

Егер Uses хабарлауы пайдаланылса, онда ол негізгі программаның бейнелеу бөлімін ашуы тиіс. модульдер басқа модульдерді де пайдалануы мүмкін. Модульдегі Uses сөзі не Interface, не Implementation сөзінен кейін бірден жазылады.



Интерфейстік бөлік

Интерфейстік бөлік Interface қызметші сөзінен кейін ашылады. Бұл бөлік модульдің барлық глобальды объектілерін (типтер, тұрақтылар, айнымалылар және қосалқы программалар) хабарлаудан тұрады және олар негізгі программада немесе басқа модульде пайдаланылуы мүмкін. Интерфейстік бөлікте глобальды қосалқы программаларды хабарлауда тек олардың тақырыбы көрсетіледі. Мысалы,

Unit Cmplx;

Interface

Type

Complex=record



Re,im:real

End;


Function Add(x,y:Complex):Complex;

Function MulC(x,y:Complex):Complex;

Енді басқа модульде Uses Cmplx;

сөйлеміін жазатын болсақ, онда Complex типімен және Cmplx модулінен екі процедураны AddC және MulC пайдалануға мүмкін болады.



Орындалатын бөлік

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

Модульдің интерфейстік бөлігінде хабарланған қосалқы программалардың сипаттамасы орындалатын бөліктегі тақыраптың алдында тұруы керек, оған формалды айнымалылар тізімі жазылады. Егер қосалқы программаның типті толық түрде жазылатын болса, яғни формальды параметрлер тізімі мен нәтиженің хабарлануы жазылса, онда ол интерфейстік бөлікте жазылған тақырыппен сәйкес келуі тиіс.

Unit Cmplx;

Interface

Type


Complex=record

Re,im:real

End;

Function Add(x,y:Complex):Complex;



Function MulC(x,y:Complex):Complex;

begin


...

End;


Function MulC;

begin


...

End;


End.

Орындалатын бөліктегі тақырыптың қайталануы толық, әрі нақты болуы қажет. Егер біз

Function Add(x,z:Complex):Complex;

begin


...

End;


тақырыбын пайдалансақ, онда бізге интерфейстік бөлікте хабарланған функция тақырыбының сәйкес келмейтіндігі жөнінде хабарлайтын еді (екінші параметр У болуы қажет).

Инициализацияланатын және аяқталатын бөлік

Инициализацияланатын және аяқталатын бөлік көпшілік жағдайда initialization және finalisation сөздерімен бірге болмауы мүмкін. Инициализацияланатын бөлікте басқаруды негізгі программаға бергенге дейінгі операторлар орналасады, әдетте ол жұмысқа дайындау үшін пайдаланылады. Мысалы, ондағы айнымалылар оқылып, қажетті файлдар оқылуы қажет. Аяқталатын бөлікте негізгі программаның жұмысы аяқталғаннан кейін орындалатын операторлар көрсетіледі. Егер инициализацияланатын бөлікте бірнеше модульдер болатын болса, онда бұл бөліктер Uses сөйлеміндегі келтірілген ретпен бірінен соң бірі орындалады. Егер бірнеше модульдің аяқталатын бөлігі болатын болса, онда бұл бөліктер Uses сөйлемідегі келтірілген ретке кері, яғни алдымен ең ішкі орналасқан — бірінен соң бірі орындалады.



ТАПСЫРМА:

Тапсырма №1. Комплекс сандар арифметикасын орындайтын модуль құрайық.

Тапсырма №2. Y(x)=(1-) функциясының мәнін кесте түрінде шығаратын және оны қосынды түріндегі қатарға жіктейтін программа құрайық. Мұндағы Х-тің мәндері Хn-нен Хк-ға дейін h=(x-x)/10 қадаммен өзгеретін болсын. У(Х)-тің мәнін есептеу функция түрінде, ал S(X)-тің мәнін есептеу процедура түрінде ұйымдастырылсын. Модуль жоба қосылып, құрылған қосымшада орындалатын болсын.
жүктеу 5,29 Mb.

Достарыңызбен бөлісу:
1   ...   11   12   13   14   15   16   17   18   ...   29




©g.engime.org 2024
әкімшілігінің қараңыз

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау