TELEGEI

Home

Алгоритмдеу және программалау негіздері

И.Г.Семакин

Оқылуы: 0%

Жазылымсыз режим: 20-беттен кейін жазылым беті ашылады, әрі қарай әр 10 бет сайын (ең көбі 5 рет).

20 px
1.85
0.30 px
0.95 em

Алгоритмдеу және программалау негіздері

«Оқулық орта кәсіби білімнің федералдық мемлекеттік білім беру стандарттарының талаптарына сәйкес «Компьютерлік жүйелердегі программалау» мамандықтары бойынша шығарылған; «Компьютерлік жүйелер және кешендер» және «Ақпараттық жүйелер (салалар бойынша)»; ОП «Алгоритмдеу және программалау негіздері»...

КӘСІПТІК БІЛІМ

СЕМАКИН И.Г., ШЕСТАКОВ А.П.

АЛГОРИТМДЕУ ЖӘНЕ ПРОГРАММАЛАУ НЕГІЗДЕРІі

ОҚУЛЫҚ

«Білім беруді дамытудың федералдық институты» Федералды мемлекеттік автономды мекемесі «Компьютерлік жүйелер мен кешендер», «Ақпараттық жүйелер [салалар бойынша]» мамандықтары бойынша орта кәсіптік білім беру бағдарламаларын жүзеге асыратын білім беру мекемелерінің оқу үрдісінде қолдануға арналған оқулық, «Алгоритмдеу негіздері және программалау» оқу пәні ретінде

ҰСЫНЫЛҒАН

Рецензияның тіркеу нөмірі 308, 25 маусым 2012 ж.

«БДФИ» ФММ

3-басылым, стереотипт

Мәскеу
«Академия» баспа орталығы, 2016

ӘОЖ

681.3.06(075.32)

КБЖ

22.18я723

С30

Бұл кітап Қазақстан Республикасының Білім жəне ғылым министрлігі жəне «Кəсіпқор» холдингі» КЕАҚ арасында жасалған шартқа сəйкес «ТКББ жүйесі үшін шетел əдебиетін сатып алуды жəне аударуды ұйымдастыру бойынша қызметтер» мемлекеттік тапсырмасын орындау аясында қазақ тіліне аударылды. Аталған кітаптың орыс тіліндегі нұсқасы Ресей Федерациясының білім беру үдерісіне қойылатын талаптардың ескерілуімен жасалды. Қазақстан Республикасының техникалық жəне кəсіптік білім беру жүйесіндегі білім беру ұйымдарының осы жағдайды ескеруі жəне оқу үдерісінде мазмұнды бөлімді (технология, материалдар жəне қажетті ақпарат) қолдануы қажет. Аударманы «Delta Consultіng Group» ЖШС жүзеге асырды, заңды мекенжайы: Астана қ., Иманов көш., 19, «Алма-Ата» БО, 809С , телефоны: 8 (7172) 78 79

29, эл. поштасы: іnfo@dcg.kz
П і к і р б е р у ш і л е р :

физ.-мат. ғыл. канд. мұғалім ГАОУ СПО «№ 11 Кәсіпкерлік колледжі» Ночка Е.И.; аға ғылыми қызметкер ГНУ ГОСНИТИ Россельхозакадемиясы

Соломашкин

А.А.

С30

Семакин И.Г.

Алгоритмдеу және программалау негіздері: оқулық орта профильді білім беру мекемелері студенттеріне арналған /   Семакин И.Г., Шестаков А. П.

ІSBN 978-5-4468-3155-5

Оқулықортакәсібибілімніңфедералдықмемлекеттікбілімберу стандарттарының талаптарына сәйкес «Компьютерлік жүйелердегі программалау» мамандықтары бойыншашығарылған;«Компьютерлік жүйелер және кешендер» және «Ақпараттық жүйелер (салалар бойынша)»;

ОП

«Алгоритмдеу және программалау негіздері».

Паскаль тіліне негізделген алгоритмдеу және программалау принциптері қарастырылған(ТурбоПаскаль7.0нұсқасы).Объектіге-бағытталған программалаудың негізгі ұғымдары берілген және оны Турбо Паскальда жүзеге асыру әрекеттері көрсетілген. Delphі біріктірілген программалау ортасы және программалардың графикалық интерфейсін жасаудың визуалды технологиясы сипатталған. Осы ортада программалықмодульдердіжасау     көрсетілген.

Орта кәсіптік білім беру мекемелерінің студенттеріне арналған.

ӘОЖ

681.3.06(075.32)

КБЖ

22.18я723

ІSBN 978-5-4468-3155-5

© Семакин И.Г., Шестаков А.П., 2013
© «Академия» оқу-баспа орталығы, 2013
© Безендіру. «Академия» баспа орталығы, 2013

Құрметті оқырман!

Бұл        оқулық        «Компьютерлік        жүйелерде        программалау», «Компьютерлік жүйелер мен кешендер» және  «Ақпараттық жүйелер (салаларына байланысты)» мамандықтары бойынша оқу- әдістемелік жинақтың бір бөлігі болып табылады, сонымен қатар, «Алгоритмдеу және программалау негіздері» жалпы кәсіби пәнін үйретуге арналған. Оқулық «Алгоритмдеу және программалау негіздері» жалпы кәсіби пәнін үйретуге арналған. Жаңа буынның оқу-әдістемелік жинағы жалпы және кәсіби пәндер мен кәсіби модульдерді зерттеуді қамтамасыз ететін дәстүрлі және инновациялық білім беру материалдарын қамтиды. Әрбір жинақта жұмыс берушінің талаптарын ескере отырып, жалпы және кәсіби құзыреттілікті меңгеруге қажетті оқулықтар мен оқу құралдары, оқыту және мониторинг құралдары бар. Оқу басылымдары электронды білім беру ресурстарымен толықтырылып отырылады. Электрондық ресурстарда интерактивті жаттығулар мен тренажерлар, мультимедиялық нысандар, Интернеттегі қосымша материалдар мен ресурстарға сілтемелері көрсетілген теориялық және практикалық модульдер қамтылған. Оған терминологиялық сөздік және оқу үрдісінің негізгі параметрлері белгіленетін электронды журнал кіреді: жұмыс уақыты, бақылау жұмыстары мен практикалық тапсырмалардың орындалу нәтижесі. Электронды ресурстар оқу үдерісіне оңай енеді және әртүрлі оқу бағдарламаларына бейімделуі мүмкін.

Кіріспе

Программалау күннен-күнге тек кәсіпқой мамандардың  ісі болып   бара   жатыр.   1980   жылдардың   ортасында   жарияланған «Программалау - екінші сауаттылық» ұраны өткен жылдардың құзырында қалды. Бүгінгі күні «компьютерлік сауаттылық» ұғымы ең алдымен, көптеген ақпараттық технология құралдарын пайдалану дағдысын қамтиды. Осы немесе басқа да ақпараттық есептерді шешу кезінде, алдымен тиісті құралдарды (электрондық кестелерді, деректер қорын басқару жүйелерін, математикалық пакеттерді және т.б.) табуға тырысу керек және бұл құралдар берілген есептерді шешуге мүмкіндік бермеген жағдайда ғана әмбебап программалау тілдерін қолдану керек. Программалауда екі санаттағы программалаушылар бар: жүйелік және қолданбалы. Жүйелік программалаушылар - жоғарғы деңгейдегі кәсіби мамандар болып табылатын ЭЕМ-нің базалық программалық құралдарын (операциялық жүйелер, трансляторлар, сервистік құралдар  және т.б.) қамтамасыз етуді әзірлеушілер. Қолданбалы программалаушылар қызметтің белгілі бір салаларындағы (ғылым, технология, өндіріс, қызмет көрсету, оқыту және т.б.) есептерді шешуге арналған ЭЕМ-нің программалық қамтамасыз ету құралдарын әзірлейді. Қолданбалы программалардың сапасына қойылатын талаптар да жүйелік программалардың сапасы сияқты жоғары болып табылады. Кез- келген программа берілген есепті дұрыс шешіп қана қоймай, қазіргі заманғы интерфейсті, жоғарғы сенімді, ыңғайлы  және т.б. қасиеттерге ие болуы тиіс. Тек осындай программалар ғана программалық өнімдер нарығында бәсекеге қабілетті бола алады. Компьютерлік        техникалардың        дамуымен        қатар программалаудың әдістемесі және технологиясы әзірленді. Алғашында командалық-операторлық программалау пайда болды, 1960 жылдары құрылымдық программалау, логикалық және функционалдық программалау желілері жылдам дамып, қазіргі кезде нысанға бағытталған және визуалды программалау кеңінен таралуда .

4

Программалауды алғаш оқудағы негізгі мақсат – бұл оның құрылымдық әдістерінің негіздерін игеру болып табылады. Қазіргі заманға дейін құрылымдық әдістеме программалаушы мәдениетінің негізі болып қалады. Оны меңгермей программалауды оқуды қолға алған адам кәсіби маман болуы мүмкін емес. 1969 жылы швейцариялық профессор Никлаус Вирт студенттерді программалаудың құрылымдық әдістемесін оқытуға арналған Паскаль программалау тілін жасап шығарды. Тіл алғашқы механикалық құрылғыны  ойлап тапқан Блез Паскаль  есімінің құрметіне орай аталды. Кейінірек Borland Іnternatіonal, Іnc (АҚШ) оқыту мақсатында қолдану шекарасынан асып, ғылыми және өндірістік мақсаттарда пайдаланыла бастаған дербес компьютерлер үшін Турбо Паскаль программалау жүйесін жасап шығарды. Турбо Паскальға Н. Вирт сипаттаған Паскальдың негізгі стандарттарына елеулі толықтырулар енгізілді. Уақыт өте келе тіл дамыды. Тілдің 5.5 нұсқасынан бастап Турбо Паскальға объектіге- бағытталған программалауды қолдайтын құралдары қосылды. Кейінірек бұл объектіге-бағытталған программалау мүмкіндігі бар Object Pascal тілінің құрылуына әкеп соқты. 1990 жылдардың басында Object Pascal-дағы объектіге-бағытталған  программалау мен визуалды программалау технологиясы элементтерінің бірігуі - Delphі программалау жүйесінің туындауына әкеп соқты. Осы оқулықтың 1-тарауында кез-келген жоғарғы деңгейлі процедуралық программалау тіліне қатысты негізгі ұғымдар қарастырылған. Алгоритмдерді құрудың құрылымдық әдістемесіне басты назар аударылады: негізгі алгоритмдік құрылымдарды қолдану, шығарылатын есептердің ішкі есептерін анықтау және көмекші алгоритмдерді жасау. Осы негізде құрылымдық әдістемені қолдайтын кез келген процедуралық тілді оқып үйренуге болады. Осы        курсты        оқып-үйренбес        бұрын,        алдымен        оқырмандар

5

мектептегі информатика курсы шеңберіндегі алгоритмдеу негіздерін меңгеріп алғандары жөн. Әдетте мектепте алгоритмдеу негіздері оқытудың орындаушыларын қолдану арқылы меңгеріледі, бұл құрылымдық әдістеме негіздерін жақсы меңгеруге мүмкіндік береді: Сондай-ақ, ЭЕМ-нің машиналық командалар  деңгейіндегі архитектурасы туралы білімнің болғаны дұрыс (мектеп информатикасында оқытылған компьютердің  модельдік мысалдарын білу жеткілікті, яғни нақты командалар немесе ассемблер тілдерін білу қажет емес). Бұл программалаудың негізгі түсініктерін (айнымалы, меншіктеу); «Транслятор жағдайына ену» және қателіктер жібермей, тіпті тілдің синтаксисінің ешбір дерегін ұмытпастан, программаны іске асыру барысында «кідіріп қалуға» болатын «тұзақтар» туралы болжам жасауды меңгеруге мүмкіндік береді. Шындығында, осы қасиеттер кәсіби программалаушыны әуесқой маманнан ажыратады. Кәсіби маманның тағы бір қасиеті - программаның әдемілігін қабылдау мүмкіндігі, яғни жақсы жазылған программадан эстетикалық рахат алу. Бұл сезім қате программаны дұрыс жазылған программадан интуитивті түрде ажыратуға жиі көмектеседі. Дегенмен, программаны бағалаудың негізгі критерийі, әрине, адамның түйсігі емес, сауатты түрде ұйымдастырылған тестілеу болуы қажет . Оқу үдерісі және программалауды практикалық жағынан меңгеру үш бөлікке бөлінеді: Бірінші бөлім бойынша есептерді шығаруға оқулықтың 1-ші және 3-ші тараулары арналған. Шамалармен жұмыс жасау алгоритмдерінің негізгі мағлұматтары, олардың құрылуы мен принциптері 1-тарауда берілген. 3-тарау алгоритмдердің толық құрылысы үшін белгілі әдістерді сипаттайды, тестілеу программаларының мәселелерін зерттейді және алгоритмдердің күрделілігін бағалайды. 3-тарауда программаларды тестілеу мәселелері қарастырылған және алгоритмдерді толық құрудың кейбір белгілі әдістемелері баяндалады. Турбо Паскаль және Delphі программалау тілдері оқулықтың сәйкесінше 2 және 4-тарауларында көрсетілген. Дегенмен, біз бұл оқулық бірінші кезекте Паскаль және Delphі тілдері туралы емес,

6

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

7

1-тарау

АЛГОРИТМДЕУ ЖӘНЕ ПРОГРАММАЛАУДЫҢ НЕГІЗГІ  ПРИНЦИПТЕРІ

Осы тарауда білесіңдер :

«логикалық   өрнек»,   «логикалық   амалдар»   ұғымдарының мәнін;

8

Сендер үйренесіңдер:

1.1.

АЛГОРИТМДЕР ЖӘНЕ ШАМАЛАР

Есептерді   компьютерде  шешу  кезеңдері.  Компьютерде  кез- келген есепті шешу бойынша жұмыс алты қадамды қамтиды:

Бұл реттілік ЭЕМ-де есептерді шешудің технологиялық тізбегі деп аталады (

бұл тізімнің тікелей программалауға 3...5 пункттері жатады ). Есептерді қойылымы кезеңінде тапсырмада не берілген, нені табу керек екендігін нақты анықтау керек. Есепті шешуге қажетті бастапқы деректердің толық жиынтығын сипаттау өте маңызды . Формальдау        кезеңінде        есептер        әдетте        математикалық

9

формулалар, теңдеулер мен қатынастар тіліне аударылады. Есептің шешімі қандай да бір  нақты объектінің,  құбылыстың немесе процестің математикалық сипаттамасын қажет етсе, онда оны формалдау тиісті математикалық модельді алумен тең нәтижеге ие болады. Үшінші кезең - бұл алгоритм құру. Тәжірибелі программалаушылар әдетте алгоритмдерді сипаттайтын арнайы құралдарға (блок-сызба, псевдокод) жүгінбей белгілі бір тілде бірден программа жазады, бірақ оқу мақсатында  алынған алгоритмді программалау тіліне аудармас бұрын, алдымен бұл құралдарды пайдаланған абзал.

Алғашқы үш кезең компьютерсіз жұмыс істейді. Келесі екі кезең

белгілі бір программалау жүйесіндегі нақты тілде программалау болып табылады. Соңғы

алтыншы кезеңде әзірленген программа практикалық мақсаттарда қолданылады. Осылайша, программалаушы алгоритмдерді құруды, программалау тілдерін білуді, сәйкес программалау жүйесінде жұмыс істей алуы тиіс . Программалаушының негізгі кәсіби сауаттылығы ол - дамыған алгоритмдік ойлау қабілеті болып табылады. Алгоритм ұғымы. Информатикадағы негізгі ұғымдардың бірі - алгоритм    түсінігі    болып    табылады.    Математикаға    тәуелді «алгоритм» термині лат. Algorіthmі, ортағасырдағы әйгілі шығыс математигі Мұхамед аль-Хорезмидің (787 - 850) есімін жазумен байланысты пайда болған. XІІ ғ. оның математикалық трактатының латын тіліндегі аудармасы жүзеге  асырылды,  соның нәтижесінде еуропалықтар ондық позициялық санау жүйесі және көпмәнді сандардың арифметикалық ережелері туралы біле бастады. Осы ережелерді сол кезде алгоритмдер деп аталды. Көпмәнді сандарды қосу, азайту, «баған» арқылы көбейту, «бұрыштап» бөлу, бұлар - математикадағы алғашқы алгоритмдер. Математикалық алгоритмдерге алгебралық түрендірулер мен теңдеулердің түбірін есептеу ережелерін жатқызуға болады.

Қазіргі уақытта алгоритм ұғымы кеңінен қарастырылады. Алгоритм

белгілі бір орындаушы басқаратын командалар тізбегі. Алгоритм ұғымы және алгоритмдерді құрастыру әдісімен оқушылар мектеп курсында келесідей орындаушылар мысалдары арқылы танысады: Робот, Тасбақа, Сызғыш және т.б. Бұл орындаушылар ешқандай есептеулер  жүргізбейді. Олар  экранда сызбалар жасап, лабиринттермен қозғалады, нысандарды бір орыннан екінші орынға тасымалдап апарады. Мұндай орындаушылар әдетте ортада

10

Бастапқы берілгендер
Программа
(аралық берілгендер)
Нәтижелер

Сур.1.1. Программаға қатысты берілгендер деңгейлері

жұмыс істейтін орындаушылар деп аталады.

Информатиканың «Программалау» бөлімінде ЭЕМ жұмысын программалық басқару әдістері оқытылады, яғни орындаушы рөлін компьютер атқарады. Компьютер шамалармен жұмыс істейді — әр түрлі ақпараттық объектілермен: сандармен, символдармен, кодтармен және т.б.,  сондықтан компьютерді  басқаруға арналған алгоритмдер шамалармен жұмыс жасайтын алгоритмдер деп аталады. Берілгендер және шамалар. Компьютер  жұмыс  істейтін шамалар жиынтығы берілгендер деп аталады. Программаға қатысты есептеу барысында алынатын бастапқы, соңғы (нәтижелер) және аралық берілгендер болады (сур. 1.1).

Мысалы, ax

2

+ bx + c = 0 квадрат теңдеуін шешу барысында бастапқы берілгендер — a, b, c, нәтижелер — теңдеу түбірлері болып табылатын x

1

, x

2

, және аралық берілгендер — D = b

2

- 4ac теңдеу дискриминанты.

Программалауды сәтті меңгеру үшін келесі ережені білу керек: әрбір шаманың ЭЕМ жадысында белгілі бір өз орны болады, кейде ол жады ұяшығы деп аталады. Қазіргі ЭЕМ архитектурасы үшін «ұяшық» термині біраз ескірді, бірақ білім беру мақсатында оны пайдалану ыңғайлы. Кез-келген шама үш басты қасиетке ие: атауы, мәні және  типі. Шама процессордың командалық деңгейінде  сақталатын жады ұяшығының мекен-жайы арқылы анықталады. Алгоритмдер мен программалау тілдерінде шамалар тұрақты және айнымалы болып бөлінеді. Тұрақтылар — мәндері өзгермейтін, алгоритмде өзіндік мәні бар шамалар болып табылады, мысалы: 15, 34.7, k, True және т.б. Айнымалы  шамалар программаны  орындау кезінде өздерінің мәндерін өзгерте алады және символдық атауларымен – идентификаторлармен ұсынылады, мысалы: X, S2, cod15 және т.б. Кез-келген тұрақты және айнымалы мәндер жадыда орнын алады және осы шамалардың мәндері осы ұяшықтағы екілік кодпен анықталады. Енді шамалар типтері — берілгендер типтері — информатика курсындағы мәліметтер қорлары мен электрондық кестелерді оқу

11

барысында  кездескен  ұғымдар  жөнінде  баяндаймыз.  Бұл  ұғым программалаудағы негізгі ұғым болып саналады. Әрбір программалау тілінің өз тұжырымдамасы және өзіндік берілгендер типтер жүйесі бар. Дегенмен, кез келген тіл кем дегенде негізгі берілгендер типтер жиынтығын қамтиды: бүтін, нақты, логикалық және символдық. Шамалар типтері рұқсат етілген мәндер жиынтығымен, рұқсат етілген операциялар жиынтығымен, ішкі ұсыныс формасымен сипатталады (1.1-кесте). Тұрақты типтері мәтін мәнімен анықталады (яғни, мәтіндегі жазылу формасы бойынша) және айнымалы типтері айнымалылардың сипаттамаларында белгіленеді. Құрылымы бойынша берілгендер қарапайым және құрылымдық болып бөлінеді. Сонымен қатар, скаляр деп аталатын қарапайым шамалар үшін мынадай тұжырымдама сәйкес келеді: бір шама — бір мән, ал құрылымдық шамалар үшін: бір шама — бірнеше мәндердің  жиынтығы.

1.1- кесте. Негізгі берілгендер типтері.

Тип

Мағынасы
Амалдар
Ішкі көрініс
Бүтін

Кейбір диапазон бойынша оң бүтін және теріс сандар, мысалы: 23, -12,

387

Бүтін сандармен орындалатын арифметикалық амалдар: қосу, азайту, көбейту, бүтін бөлу және қалдықпен бөлу. Қатынас амалдары (<,

>, = және т.б.)
Тұрақты нүктелі формат
Нақты
Кез-келген (бүтін және бөлшек) кейбір диапазондағы сандар, мысалы:

2.5, - 0.01, 45.0, 3.6
Арифметикалық амалдар. Қатынас амалдары
Жылжымалы нүктелі формат
Логикалық

True (ақиқат) False (жалған)
Логикалық амалдар: ЖӘНЕ (and), НЕМЕСЕ
(or), ЖОҚ (not).
Қатынас амалдары

1 — True; 0 — False
Символдық
Компьютер әліпбиінің        кез- келген символдары, мысалы: а,5, +, $
Қатынас амалдары

Символдық кодтау кестесі, мысалы: ASCІІ

— бір символ — 1 байт; Unіcode — бір символ — 2 байт

12

ЭЕМ

Паскаль тіліндегі программалау жүйесі
Паскаль тіліндегі программа

Сур. 1.2. Паскаль тілінде программаны орындаушы рөліндегі компьютер.

Құрылымдық шамаларға жиымдар, жолдар, жиындар және т.б. жатады. ЭЕМ — алгоритмдерді орындаушы. Әрбір  алгоритм (программа) белгілі бір орындаушы, яғни оның командалық жүйесі шеңберінде жасалады. «Компьютерде программалау» тақырыбын оқу барысында қандай орындаушы болуы мүмкін? Жауабы айқын: мұнда орындаушы компьютер, немесе керісінше, компьютерлік кешен + программалау жүйесі (ПЖ). Программалаушы ПЖ бағытталған тілде программа құрастырады. 1.2-суретте орындаушының кіріс тілі Паскаль программалау тілі болып табылатындығы көрсетілген. Программа қай тілде жазылатына қарамастан, ЭЕМ-де кез- келген есепті шешу алгоритмі келесі командалардан тұрады: меншіктеу, енгізу, шығару, көмекші алгоритмді шақыру, цикл және тармақталу. Ары қарай алгоритмдерді сипаттау үшін мектеп информатика курсында өткен блок-сызбалар және алгоритмдік тіл (АТ) қолданылады.

СЫЗЫҚТЫҚ ЕСЕПТЕУ АЛГОРИТМДЕРІ

Есептеу        алгоритмдеріндегі        негізгі        қарапайым        әрекет        бұл

айнымалы шамаларға мәндерді меншіктеу.

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

13

Мектептегі математика оқулығында екі қарапайым бөлшекті бөлу ережесі келесідей сипатталады: 3) бөлімнің орындалу нәтижесі — п. 1, ал алымның орындалу нәтижесі — п. 2. болатын бөлшекті жазып алу

Алгебралық түрде бұл мысалды былай жазып көрсетеміз: ∙

Енді    алгебралық    өрнекте    қолданылған    айнымалылардың белгіленуін        сақтай        отырып,        ЭЕМ        үшін        бөлшектерді        бөлу алгоритмін құрайық. Мұнда бастапқы берілгендер бүтін санды айнымалылар — a, b, c, d, ал нәтиже — m және n бүтін шамалары. Бөлшектерді бөлу алгоритмінің блок-сызбасы 1.3-сур. көрсетілген. Берілген алгоритмнің алгоритмдік тілде жазылуы төмендегідей болады:

алг

бөлшектерді бөлу
басы

бүт

a, b, c, d, m, n е нг

a, b, c, d

m : = a ×

d n : = b × c шығ

m, n
Басы
a,b,c
енгізу

m : = a ×

d n : = b × c

m,n шығару
соңы
соңы

Меншіктеу командасы мына түрде көрсетіледі:

айнымалы:= өрнек «:=» белгісі «меншіктеу» деп оқылады. Меншіктеу командасы компьютермен орындағанда келесідей мағына береді:

1.3-сур. Бөлшектерді бөлу алгоритмінің блок-сызбасы

14

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

Қарастырылып отырған алгоритмдегі енгізу командасы:

a, b, c, d енгізу
Блок-сызбаларда енгізу командалары параллелограммның ішіне

Есепті шешудегі компьютермен алынған нәтижелер қолданушыға хабарлануы керек, сол себепті шығару командасы тағайындалған:

шығару        m, n

Бұл команданың көмегімен нәтижелер экранда немесе басып шығару құрылғысы арқылы қағазда көрсетіледі. Меншіктеу операторы есептеу алгоритмдеріндегі ең маңызды амал болып табылғандықтан, оны толығырақ қарастырайық. Төрт меншіктеу командаларының рет-ретімен орындалуын қарастырамыз, мұнда екі айнымалы шама - a, b қатысады. Әрбір меншіктеу командасы үшін 1.2-кестеде бұл команда орындалғаннан кейін тағайындалатын айнымалы мәндері көрсетілген.

Бұл мысал үш негізгі меншіктеу қасиетін көрсетеді:

15

Команда a : = 1 a

1

b

b : = 2 х a

1

2

a : = b

2

2

b :

= a + b

2

4

1.3-кесте. Айнымалылар
арасындағы мәндердің алмасуы
Команда

X

Y

Z

X, Y енгізу

1

2

Z :

X

1

2

1

X :

Y

2

2

1

Y :

Z

2

1

1

1.2-кесте. Меншіктеу командасының орындалу барысындағы айнымалы мәндерінің өзгеруі Программалауда жиі  қолданылатын алгоритмді қарастырайық. Екі шама берілген: X және Y. Олардың арасында мәндерді алмастыруды жүзеге асыру қажет. Мысалы, егер бастапқыда X = 1, Y = 2 болса, алмастырудан кейін X = 2, Y = 1 болу керек. Бұл есеп келесі жағдайға ұқсас. Екі стақан берілген: біреуіне - сүт, екіншісіне – су құйылған. Олардың өзара мәндерін алмастыру қажет. Бұл жағдайда үшінші стақан қажет. Алмасу бойынша әрекеттер тізбегі келесідей болады: 1)

1-ші стақаннан сүтті 3-шіге құю; 2)

2-ші стақаннан 1-ші стақанға суды құю; 3)

сүтті 3-ші стақаннан 2-шіге құю.

Осылайша, екі айнымалының мәндерін алмастыру үшін үшінші қосымша айнымалы қажет. Біз оны Z деп белгілейміз. Содан кейін мәндерді айырбастау есебін үш тапсырма командаларын дәйекті орындау арқылы шешуге болады (1.3-кесте). Бұл мысал айнымалылардың арасындағы алмастыруды нақты сипаттай алмайды, өйткені сұйықтық құю кезінде стақанның біреуі бос болады. Меншіктеу командаларын орындау нәтижесінде (X: =

Y) оң жақта (Y) айнымалы өз мәнін сақтап қалады.

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

16

келесі белгілеулер пайдаланылады: бүт - бүтін, нақ - нақты, лит - символдық (литерлік), лог - логикалық. Бөлшектерді бөлу алгоритмінде барлық айнымалылар бүтін типті болады.

1.3.
ЕСЕПТЕУ  АЛГОРИТМЕРІНДЕГІ ТАРМАҚТАЛУ МЕН ЦИКЛДЕР

Квадрат теңдеуді шешу алгоритмін құрастырайық ax

2

bx + c
= 0.
Бұл есеп математика пәнінен жақсы таныс. Мұндағы бастапқы берілгендер
a, b, c коэффициенттері,

ал жалпы жағдайдағы шешімдер — (x

1

және x

2

) екі түбірлер, олар келесі формула бойынша есептеледі:

x 1,2 = ±√

І

Бұл программадағы қолданылатын барлық шамалар нақты типті болып
келеді. Квадрат теңдеуді шешу алгоритмі келесі түрде сипатталады:

алг

квадрат теңдеудің түбірлері нақ

a, b, c, d, x1, x2
басы енгізу
a, b, c d : = b

2

- 4ac

x 1 : =  ( -b + √ d

) / ( 2 a )
x 2  : =  ( - b  -

√ d

) / ( 2 a )
ш ы ғ а р у   x1, x2
соңы

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

17

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

(кез-келген жағдайдағы нәтиженің болуы).

Әмбебап алгоритм құру үшін алдымен есептің математикалық мазмұнын мұқият талдау қажет.

Квадрат теңдеудің шешімі
a, b, c
коэффициенттерінің мәндеріне тәуелді.
Осы  есепті   талдай  отырып,  тек  нақты  түбірлерді   табумен шектелейік:

егер a =

0, b =

0, c =

0 болса, онда   х-тің кез-келген мәні — теңдеудің шешімі болады;
егер a

0, b =

0, c = 0 болса, онда теңдеудің шешімі болмайды;
егер a

0, b ≠

0 болса, онда бұл бір шешімі болатын сызықтық
теңдеу x = - c/b;
егер a

0 және d = b

2

- 4ac

0 болса, теңдеудің x

1

, x

2

екі нақты
түбірі болады;
егер a

0 және d < 0 болса, онда теңдеудің нақты түбірлері
болмайды.
Квадрат  теңдеуді  шешу  алгоритмінің  блок-сызбасы  1.4-сур. көрсетілген.
Бұл   алгоритмнің   алгоритмдік   тілде   жазылуы   мына   түрде болады:

алг квадрат теңдеудің түбірлері
нақ a, b, c, d, x1, x2 басы енгізу a, b, c егер a = 0
онда        егер b = 0
онда        егер c = 0

онда шығару «Кез-келген х — шешім»
әйтпесе шығару «Шешімі жоқ»
тс әйтпесе x := -c/b
шығару х

тс

әйтпесе  d := b

2

-4ac
егер d < 0
онда шығару «Нақты түбірлер жоқ»

әйтпесе x 1  : = ( -b  + √ d

) / ( 2 a ) ; x 2  : = ( -b  √ d

) / ( 2 a )
ш ы ғ а р у   «x1 =», x1, «x2 =», x2

тс тс

соңы

18

a, b , c e

urіJy

x := -c/b +

Whff a p y

11

1\:

CJ-

h':

C

.f lf

C

H

X"

WLі ra p y

"/Kayan

ІKO""

xі : = ( b

+..,/d
)/(2a

) x

lllbff a p y

"Hah".T

LІ

Ty6 іp ne p

ІKOl\:

11

Wblrap y x2: = ( -

b-..,/d )/(2a) xl , x2 mL іra p "

CO

Hbl

1

.4-cyp. K0a,1waT Tef-\AeyAі wewy anrop111TMіHіt-1 6noK-cb1a6acb1

Бұл алгоритмде тармақталудың құрылымдық командасы бірнеше рет пайдаланылған және блок-сызба түріндегі жалпы көрінісі 1.5-суретте көрсетілген Алгоритмдік тілде тармақталу командасы келесі түрде жазылуы мүмкін :

егер
шарт
онда
серия 1

әйтпесе
серия 2

тс

Тармақталу командасының жоғарыда көрсетілген блок- сызбасына сәйкес, бірінші шарт тексеріледі (логикалық өрнегі есептеледі). Егер шарт ақиқат болса, онда «Иә» (оң тармақ) - «1- серия» бағыты көрсетілген командалар тізбегі  орындалады. Әйтпесе, «2-серия» командаларының қарама-қарсы тармағы орындалады. AТ-де шарт «егер» қызметші сөзінен кейін жазылады, оң жақ тармақ «онда» сөзінен кейін, қарама-қарсы тармақ «әйтпесе» қызметші сөзінен кейін жазылады. «тс» әріптері тармақталу соңы деген мағына береді. Егер бір тармақталудың тармағында басқа тармақтар болса, онда алгоритмде қабаттасқан тармақталу құрылымы бар болады. Сондай- ақ, «иә» және «жоқ» сөздерінің орнына қысқаша «+» және «-» белгілері қолданылатын квадрат теңдеуді шешу алгоритмі дәл осындай құрылымды қамтиды  (1.4-суретті қараңыз). Келесі есепті қарастырайық: п оң бүтін саны берілген. n! есептеу керек (n-факториал). Факториал анықтамасын еске түсірейік:

1

n!

=  1,        егер        = 0; 1 × 2 × … ×   , егер        ≥ 1. Нақты типті  үш айнымалы n! есептеу алгоритмінің блок- сызбасы: п — аргумент, і — аралық айнымалы, F — нәтиже. 1.6- сурет. Берілген алгоритмнің дұрыстығын тексеру үшін трассалану 1.4-кестесін құрайық. Мұнда алгоритмге кіретін нақты бастапқы берілгендер мәндері қадам бойынша қадағаланып отырады. Кесте n

= 3 болған жағдайға құрастырылған.

Жоғарыда келтірілген алгоритмнің трассалануы оның дұрыстығын дәлелдейді. Енді алгоритмді алгоритмдік тілде жазып алайық:

20

1.5-сур. Тармақталу командасының блок-сызбасы

1.6-сур. n! алгоритмін есептеудің блок-сызбасы

21

1.4-кесте. п!-ды есептеу алгоритмінің трассалануы
Қадам

n

F

Шарт

1

3

2

1

3

1

4

1 < 3, иә

5

1

6

2

7

2 < 3, иә

8

2

9

3

10

3 < 3, иә

11

6

12

4

13

4 < 3, жоқ

14

Шығару

алг

факториал бүт

n, і, F
басы
n енгізу
F : = 1; і : = 1;

әзір і ≤ n,

қайталау цб

F : = F

× і

і : = і + 1 цс

F шығару
соңы

Берілген алгоритмде қайталау құрылымы қамтылған. Мұнда циклдердің құрылымдық командалары «Әзірше»,  немесе алғышартты циклдер қолданылған. «Әзірше» циклінің блок-сызбасы 1.7-суретте көрсетілген. АТ-де төмендегідей жазылады:

әзір        шарт
, қайталау

цб

серия цс

22

Жоқ шар Иә

серия
Рис. 1.7. Блок-схема команды цикла «Пока»

Командалар сериясының орындалуы (цикл денесі) цикл шарты  ақиқат болғанша қайталанады. Шарт жалған болған жағдайда циклдің орындалуы тоқтатылады. «цб» және «цс» қызметтік сөздері сәйкесінше циклдің басы мен соңын білдіреді. Циклдің алғышарты — бұл циклдік алгоритмді ұйымдастырудағы негізгі форма бірақ, одан өзге циклдің ілесушарты да бар. Квадрат теңдеуді шешу алгоритміне оралайық, оны келесі позицияда қарастырамыз: егер a = 0 болса — бұл квадрат теңдеу болмайды және оны шешпей-ақ қоюға болады. Бұл жағдайда қолданушы берілгендерді енгізу барысында қателесті деп есептеп, енгізу әрекетін қайталаймыз (1.8-сур.). Басқаша айтқанда, алгоритмде қолданушыға қателерді жөндеу мүмкіндігін ұсына отырып, бастапқы берілгендердің сенімділігін бақылау алдын-ала қарастырылады. Мұндай бақылаудың болуы — сапалы программаның тағы бір жақсы белгісі. АТ-де берілгендерді енгізуді бақылай отырып, квадрат теңдеуді шешу алгоритмі келесі түрде болады:

алг квадрат теңдеу нақ
a, b, c, d, x1, x2
басы
қайталау

a, b, c енгізу
дейін

а ≠

0

d : = b

2

- 4ac

егер d ≥

0

онда
x 1 : = ( -b +

) / ( 2 a )
x 2  : =  ( - b -

)  / ( 2 a )
шығару x1, x2
әйтпесе
«Нақты түбірлер жоқ» шығару

кв соңы

23

«Дейін» ілесу шарты циклдерінің құрылымдық командаларының блок-сызбасы 1.9 сур. көрсетілген. АТ бойынша берілген команданы келесі түрде жазуға болады:

қайталау
серия
дейін
шарт

Мұнда циклдің аяқталу шарты қолданылады, яғни ол ақиқат болған жағдайда цикл жұмысын тоқтатады. Келесі есепті шешу алгоритмін құрайық: M және N екі натурал сандары берілген. Олардың ең үлкен ортақ бөлгішін есептеу керек

— ЕҮОБ (M, N).

24

1.9.-сур. «Дейін» цикл командасының блок- сызбасы.

серия Жоқ шар Иә Бұл   есеп   белгілі   Евклид   алгоритмі әдістерінің көмегімен шығарылады.Бұл әдістің негізгі идеясы мынадай: егер M

> N, онда ЕҮОБ (M, N) = ЕҮОБ (M -  N, N).

Бұны өз беттеріңше  дәлелдеп көріңдер. Берілген алгоритмді шешудегі негізгі өзге тұжырым: ЕҮОБ (М,М) = М. Жазбаша бұл алгоритмді келесі нұсқау бойынша сипаттауға болады:

1.10-сур. Евклид алгоритмінің блок-сызбасы

25

Евклид алгоритмінің блок-сызбасы 1.10-сур. көрсетілген. АТ-де келесідей көрсетіледі:

алг

Евклид бүт

M, N

басы
M, N енгіз
әзірше

M

N, қайталау
цб егер
M > N
онда

M : = M - N

әйтпесе

N : = N - M

тс цс
соңы

Евклид алгоритмі қабаттасқан тармақталу цикл құрылымын қамтиды.
Өз беттеріңмен M

18, N

12 болғандағы алгоритмнің трассалануын орындаңдар. Нәтижесінде ЕҮОБ =

6 болу керек.

1.4.

АЛГОРИТМДЕУДІҢ ЛОГИКАЛЫҚ НЕГІЗДЕРІ

Программалауға негізі алгебра логикасы және пікірлерді есептеу болып табылатын математикалық логика пәнінің тікелей  қатысы бар. Пікір айтылған уақытта оны ақиқат немесе жалған екенін бірден айтуға болады. Мысалы, «Ай - Жердің серігі» деген ұғым ақиқат, «5>3» ақиқат, «Мәскеу - Қытайдың астанасы» - жалған, «1 = 0» - жалған. АҚИҚАТ және ЖАЛҒАН логикалық мәндер болып табылады. Берілген тұжырымдамалардың логикалық мәндері бірегейлі анықталған. Басқаша айтқанда, олардың мәні логикалық тұрақтылар  болып  табылады. X <0 теңсіздігінде x - айнымалы болып табылады, яғни x мәніне байланысты ол ақиқат немесе жалған болуы мүмкін. Осылайша логикалық айнымалы түсінігі енгізілді. Алгоритмдердің сипаттауда, сондай-ақ әр түрлі программалау  тілдеріндегі программаларда логикалық айнымалылар берілгендердің логикалық типіне сәйкес келетін символдық атаулармен белгіленуі мүмкін. Басқаша айтқанда, A, B, X, Y және т.б. — логикалық типтегі айнымалы екені белгілі болса,  олар  тек АҚИҚАТ немесе  ЖАЛҒАН мәндерді қабылдай алады дегенді білдіреді.

XІX ғ. ортасында ағылшын математигі Джордж Буль математикалық логиканың формалды аппаратының негіздерін ойлап тапты. Оның құрметіне пікірлерді есептеу бульдық алгебра, ал логикалық шамалар бульдық шамалар деп аталады. Логикалық өрнек (логикалық формула) — бұл қарапайым немесе күрделі пікір болып табылады. Күрделі пікір қарапайым пікірлерден құралған логикалық амалдардың (байланыстардың) көмегімен жасалады. Логикалық амалдардың негізгі үш түрі бар: терістеу, конъ- юнкция (логикалық көбейту) және дизъюнкция (логикалық қосу).

Терістеу    математикалық    логикада         « ¬

»    таңбасымен
белгіленеді   және   ЕМЕС   деп   оқылады.   Бұл   бірорынды   амал.
Мысалы,

(х = у) пікірі келесі түрде оқылады: (х тең y) ЕМЕС,
яғни x тең болмаса y-ке, пікірдің мәні ақиқат болады да, x тең болса
y-ке,   онда   пікірдің   мәні   жалған   болады.   Терістеу   логикалық
шаманың мәнін қарама-қарсы мәнге өзгертеді.

Конъюнкция & таңбасымен белгіленеді де, ЖӘНЕ деп оқылады.
Бұл екіорынды амал. Мысалы, (х > 0) & (х < 1) жазбасы егер х

ϵ (0,

әйтпесе ЖАЛҒАН болады. Екі операнд та ақиқат болса, сәйкесінше
конъюнкция нәтижесі де АҚИҚАТ мәнін қабылдайды.
Дизъюнкция

таңбасымен белгіленіп, НЕМЕСЕ деп оқылады. Мысалы, (х = 0) ∪

(х = 1) жазбасы егер х — екілік сан (0 немесе 1)
болса, онда формула ақиқат мәнді қабылдайды. Егер кем дегенде

бір  операнд  АҚИҚАТ  болса,  сәйкесінше  дизъюнкция  нәтижесі АҚИҚАТ болады. Қарастырылған логикалық амалдардың  орындалу  ережесі ақиқат кестесі деп аталатын 1.5-кестеде көрсетілген (мұндағы А және В — логикалық шамалар, ал «А» және «Ж» әріптерімен сәйкесінше АҚИҚАТ және ЖАЛҒАН мәндері белгіленген).

1.5-кесте. Ақиқат кестесі №

А

В

ЕМЕС А

А ЖӘНЕ В

А НЕМЕСЕ В

1

А

А

Ж

А

А

2

А

Ж

Ж

Ж

А

3

Ж

А

А

Ж

А

4

Ж

Ж

А

Ж

Ж

27

Логикалық өрнектерде амалдардың орындалу реті келесі кезекпен жүзеге асырылады: терістеу, конъюнкция, дизъюнкция. Сонымен қатар, логикалық формулаларда амалдардың орындалу ретін жақшалардың көмегімен алмастыруға болады:

(А ЖӘНЕ В)НЕМЕСЕ (ЕМЕС А ЖӘНЕ В) НЕМЕСЕ (ЕМЕС А ЖӘНЕ ЕМЕС В). Логикалық формуланың мәнін есептеуге мысал қарастырайық, ЕМЕС X ЖӘНЕ Y НЕМЕСЕ X ЖӘНЕ Z

мұндағы  логикалық  айнымалылардың  мәні:  X  =  ЖАЛҒАН,  Y  =

АҚИҚАТ, Z = АҚИҚАТ.

Берілген өрнектегі амалдардың орындалу ретін сандармен белгілейік:
1        2

4

3

ЕМЕС X ЖӘНЕ Y НЕМЕСЕ X ЖӘНЕ Z.

Ақиқат кестесін пайдаланып есептеуді қадамдап орындаймыз:

Келесі тұжырымды қарастырайық: «Х-тің мәні 0 мен 1 интервалында орналасқан». Бұл тұжырымды теңсіздіктер жүйесі түрінде жазуға болады

0

Х

≤ 1.

Сәйкес логикалық өрнек келесі түрде болады

(Х

0) ЖӘНЕ (Х

≤ 1).

Енді тапсырманы қиындатамыз, логикалық өрнек түрінде келесі тұжырымды жазамыз: Сақинада орналасқан координаттар басы центрі болып келетін, ішкі радиусы 1-ге, сыртқы радиусы 2-ге тең координаттары (Х, Y) болатын жазықтықтағы нүкте берілген ( 1.11- сур.). Бұл өрнек мына түрде сипатталады:

(X

2

+ Y

2

1) ЖӘНЕ (X

2

+ Y

2

≤ 4).

Конъюнкция амалы  келесі  түрде  орындалады:  (X

2

+  Y

2

≥ 1)

бірінші тұрған теңсіздіктің шарттарын қанағаттандыратын нүктелержиыны таңдалады және пайда болған жиыннан (X

2

+ Y

2

≤ 4) екінші

теңсіздіктің   шарттарын   қанағаттандыратын
ішкі  жиындар  ерекшеленеді  де  олар  соңғы
нәтиже болады.

Басқаша айтқанда, ізделіп отырған жиын екі жиынның қиылысы, олардың біреуі бірінші теңсіздікті қанағаттандырса, екіншісі соңғы теңсіздікті қанағаттандырады. Конъюнкция — логикалық        көбейту,        яғни        осындай

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

аймақ тапсырмасы

орналасқан координаттар басы центрі болып келетін, ішкі радиусы 1-ге, сыртқы радиусы 2-ге тең координаттары (Х, Y) болатын жазықтықтағы нүкте (1.11-сур.). Бұл өрнек мына түрде жазылады:

(X

2

+ Y

2

< 1) НЕМЕСЕ (X

2

+ Y

2

> 4).
Дизъюнкция амалының орындалуы келесі түрде жүзеге асырылады: (X

2

+ Y

2

< 1) бірінші теңсіздікті қанағаттандыратын нүктелер жиыны таңдалады және оған (X

2

+ Y

2

> 4) екінші теңсіздікті қанағаттандыратын нүктелер жиыны қосылады. Осылайша, дизъюнкция амалының басқа атауының мағынасы анықталады, дизъюнкция — логикалық қосу, яғни екі жиынның қосындысы. Соңғы есепті басқаша шығаруға болады. Сәйкес логикалық өрнекті бірінші өрнекке терістеу амалы  ретінде жазуға болады, себебі сақинаның сыртында орналасқан нүктелер сақинаның ішінде ЕМЕС.

ЕМЕС ((X

2

+ Y

2

1) ЖӘНЕ (X

2

+ Y

2

4)).
Сәйкес екі логикалық өрнектердің теңдіктері заңды:

ЕМЕС ((X

2

+ Y

2

1) ЖӘНЕ (X

2

+ Y

2

4)) = (X

2

+ Y

2

< 1) НЕМЕСЕ

(X

2

+ Y

2

> 4).

Бұл мысалдан келесі түрлендіру ережесі түсінікті болады: Конъюнкциямен байланысқан екі теңсіздікке қолданылған терістеу амалы    осы    теңсіздіктердің    таңбаларын    қарама-қарсыға,    ал

29

конъюнкцияны        —        дизъюнкцияға        (немесе        дизъюнкцияны конъюнкцияға) өзгертеді. Күрделі логикалық өрнек қолданылған алгоритм мысалын қарастырайық. Үшбұрыштың қабырғаларының ұзындығы арқылы оның ауданын есептейміз.

Бұл есепті шығару үшін Герон формуласын қолданамыз:

І (   −   )(   −   )(   −  )

мұндағы p = ( a + b + c)/2 — үшбұрыш периметрінің жартысы.

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

алг

Герон нақ

A, B, C, P, S

басы енгізу

A, B, C

егер (A > 0) ЖӘНЕ (B > 0) ЖӘНЕ (C > 0)ЖӘНЕ (A + B > C) ЖӘНЕ (B + C > A) ЖӘНЕ (A + C > B)

онда

P := (A + B + C ) / 2

S : = түбір (P *(P - A) * (P - B) * (P - C))
шығару «Аудан =», S
әйтпесе
шығару «Бастапқы берілгендер қате»

тс

соңы

1.5.

КӨМЕКШІ АЛГОРИТМДЕР МЕН ПРОЦЕДУРАЛАР

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

алгоритмі негізгі деп аталады.

Мысалға        келесі        есепті        қарастырайық.        Бүтін        көрсеткішті дәрежелі  функцияны  есептеу  алгоритмін  құру  керек:  y  =  x k ,

мұндағы к — бүтін сан; x ≠ 0.

Алгебрада мұндай функция келесі түрде анықталған:
1  при n = 0

x і

= І 1

при n < 0

x і x і

при n  > 0
Берілген есепте ішкі есеп ретінде санды бүтін оң дәрежеге алуды
қарастыруға болады.

1/x -n

=   (1/x) -n

есепке   ала   отырып,   есепті   шешудің   негізгі алгоритмін жазайық: алг

дәрежелі функция бүт n; нақ

x, у
басы енгізу
x, n
егер

n = 0 онда y:=1
әйтпесе егер
n >0
онда ДӘРЕЖЕ

(x, n, y) әйтпесе ДӘРЕЖЕ (1/x, -n, y) тс

соңы тс

шығару y

Негізгі алгоритмде көмекші алгоритмді  шақыру командасы ДӘРЕЖЕ деген атаумен екі рет қайталанып тұр. Көмекші алгоритмді шақыру командасындағы жақшада тұрған шамалар нақты параметрлер деп аталады. Алгоритмдік тілде көмекші алгоритмдер процедура түрінде жазылады. АТ-де ДӘРЕЖЕ процедурасын сипаттап көрейік:

процедура

ДӘРЕЖЕ (

нақ

а, бүт  k, нақ  z) бүт і

басы
z := 1; і := 1
әзірше

і ≤

k, қайталау цб

z := z × a

і := і + 1
цс соңы

31

Көмекші алгоритмнің тақырыбы «процедура» сөзімен басталып, одан кейін осы процедураның атауы және жақшаның ішінде — формалды параметрлер тізімі жазылады. Бұл тізімге типтері көрсетілген айнымалы аргументтер және айнымалы нәтижелер кіреді.  Берілген мысалда a, к — формалды параметр-аргументтер, z

формуласы бойынша анықталады.

Дәрежелік функцияны есептеу алгоритмінде негізінен процедураны шақыру - оның атауын көрсету және жақшаның ішінде нақты параметрлер тізімдерінің жазылуы арқылы жүзеге асырылады. Процедураның формалды және  нақты  параметрлерінің арасында сәйкестену ережесі орындалу керек:

Нақты параметр-аргументтер сәйкес типің өрнегі болуы мүмкін.
Процедураны шақыру келесі әрекеттерді орындайды:

ДӘРЕЖЕ процедурасында бастапқы берілгендерді енгізу және нәтижелерді шығару командасы жоқ. Мұнда (a, n) аргументтерге бастапқы мәндерді меншіктеу параметр-аргументтерге берілу арқылы орындалады, ал (у) айнымалысының нәтижесін меншіктеу Осылайша, процедуралардың параметр мәндерінің берілуі меншіктеудің үшінші тәсілі болып табылады (меншіктеу және енгізу командаларымен қатар). Процедураларды қолдану реттелген талдау әдісімен күрделі алгоритмдер құруға мүмкіндік береді.

1.6.

ҚҰРЫЛЫМДЫҚ  ПРОГРАММАЛАУ НЕГІЗДЕРІ

Алғашқы ЭЕМ пайда болғаннан бері жарты ғасыр уақыт өтті. Осы күнге дейін есептеу техникасы қарқынды дамып келе жатыр. ЭЕМ-нің элементтік базасы өзгерді, олардың жылдамдықтары мен жады көлемдері ұлғайды, адамның машинамен интерфейс құралдары өзгерді. Бұл өзгерістер программалаушының жұмысына да өз ықпалын тигізгені сөзсіз. Белгілі – бір көпшілік мақұлдаған нәрсені өңдеп шығару (бұл жағдайда - программа) тәсілін технология деп атайды, сондықтан ары қарай программалау технологиясы туралы айтатын боламыз. Жадысы «аз» және кішкене жылдамдыққа  ие алғашқы компьютерлер үшін программа сапасының негізгі көрсеткіші оның жадыдағы алатын орны мен уақыт есептеудің үнемділігі болды. Программа неғұрлым қысқа жасалса, программалаушының дәрежесі соғұрлым жоғары болып саналды. Программаның мұндай қысқартылуы көп күш жұмсауды талап етті. Кейде программа автордың өзі «ауытқып кетуі» мүмкін болатын «қулыққа» ие болатындай құрастырылатын: біраз уақыттан  кейін  өз программасына оралып, өзгертулер енгізгісі келсе, программалаушы шатасып кетіп, «өзінің тамаша идеясын» ұмытып қалуы мүмкін еді. Күрделі техникалық құралдардың сәтсіздікке ұшырауы сияқты күрделі алгоритм әрдайым программаның қате жасалу ықтималдығын арттыруы мүмкін. Программалаушының программа жасақтама өнімін дайындау кезеңдері төмендегідей: Жобалау жасалатын программа алгоритмін алдын-ала өңдеу, мысалы блок-сызбалар. Кодтау — программаның программалау тіліндегі мәтінін құрастыру. Дұрыстау тестілеудің көмегімен жүзеге асырылады, яғни қандайда бір алдын-ала анықталған нәтижесі белгілі бастапқы деректер жиынтығымен

программаның орындалуы жүзеге асырылады.

Сонымен қатар, программа неғұрлым күрделі болса, оның толыққанды тестіленуі үшін соғұрлым көп сынақтар қажет. Өте «қу» программаны толықтай тестілеу қиын, өйткені әрқашан «су астындағы тасты» байқамау мүмкін емес . Жады мен ЭЕМ-нің шапшаңдылығының ұлғаюы, программалау тілдері   мен  трансляторлардың  дамуы   программа  көлемінің  аз

33

болуына кепілдік бере алмайды.

Программалардың негізгі сапалы мінездемелері олардың қарапайымдылығы, көрнекілігі және сенімділігі болып табылады. Үшінші кезең машиналарының пайда болуымен бұл қасиеттер басты орында. XXғ. 60-шы жылдардың соңында және 70-жылдардың басында құрылымдық программалау деп аталатын пән анықталды. Оның пайда болуы мен дамуы Дейкстр Э.В, Милс, Кнут Д.Е және т.б. есімдерімен тығыз байланысты. Қазіргі уақытқа дейін құрылымдық программалау программалаудың негізгі технологиясы болып қала береді. Оның принциптерін сақтау арқылы программалаушы анық, қатесіз, сенімді программаларды жасауды шапшаң үйрену мүмкіндігіне ие болады . Құрылымдық программалаудың негізі программалау теориясында дәлелденген теорема болып табылады: Кез-келген логикалық есепті шешу алгоритмін негізгі алгоритмдік құрылымдар деп аталатын Тізбектелу, Тармақталу, Цикл құрылымдарымен ғана жасауға болады. Осыған дейін бұл құрылымдарды қарастырған болатынбыз. Барлық программа мысалдарында құрылымдық программалау принциптері қолданылды.

Тізбектелу — әрекеттердің сызықты реті (1.12-сурет).

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

Тармақталу — бұл келесі түрде жазуға болатын алгоритмдік
балама

егер        шарт онда 1-
серия әйтпесе

2-с

ерия тс

Бұл құрылымда басқару шарттың ақиқаттылығы мен жалғандығына байланысты екі тармақтың біреуіне беріледі (командалар серияларына). Содан кейін нәтиже шығарылады (1.5- сур.). Тармақталудың толымсыз формасы «әйтпесе» тармағы болмаған жағдайда орын алады:

егер        шарт
онда
серия

тс

Цикл — шарт бойынша кейбір әрекеттердің қайталануы. Циклдің екі түрі бар. Циклдік құрылымның бірінші типі – алғышартты цикл немесе шарты алдын ала берілген цикл (1.7-сур.):

әзірше        шарт
,  қайталау

цб

серия цс

Мұнда шарт әзірше ақиқат болғанша, цикл денесі болып табылатын серия орындала береді. Циклдік құрылымның екінші типі – ілесушартты цикл немесе шарты соңынан берілген цикл (1.9-сур.):

қайталау
серия
дейін
шарт

Мұнда цикл денесі цикл шартынан бұрын орналасады және егер шарт жалған болса, өзінің орындалуын қайталайды. Шарт ақиқат болған жағдайда ғана қайталау тоқтатылады. Кез-келген циклдік алгоритмді құру үшін шарты алдын-ала берілген циклдер қажет және жеткілікті, яғни олар шарты соңынан берілген циклдерге қарағандағы жалпы нұсқа болып табылады. Негізінде «Дейін» цикл денесі кем дегенде міндетті түрде бір рет орындалады, себебі шартты тексеру оның орындалғанынан кейін жүзеге асады, ал «Әзірше» циклі үшін цикл денесі мүлдем орындалмайды деген нұсқа болуы мүмкін. Осыған орай,  кез- келген программалау тілдерінде «Әзірше» циклін қолданумен ғана шектелуге болар еді, алайда «Дейін» циклі анағұрлым ыңғайлы болғандықтан оны қолдану тоқтатылмайды. Кейде әдебиетте құрылымдық программалауды GOTO-сыз программалау деп атайды (шартсыз көшу операторы жоқ). Шындығында, программалауға осы көзқараспен қарасақ шартсыз көшу операторына орын жоқ екені сөзсіз. GOTO операторын программада негізсіз пайдалану олардың құрылымдық қасиетін яғни, алгоритмнің барлық оң қасиеттерін: мөлдірлігі мен сенімділігін жояды. Бұл оператор барлық процедуралық программалау тілдерінде болғанымен, құрылымдық программалауды қамтамасыз ету үшін оны пайдалануды болдырмау

35

керек.

Күрделі алгоритмдер өзара байланысқан негізгі құрылымдардан тұрады. Бұл құрылымдардың байланысы екі жолмен орындалуы мүмкін: тізбектелген және қабаттасқан. Бұл кез-келген күрделі электр тізбегін тізбектелген түрде және параллельді байланыстырылған        аймақтарға        ыдырата        алатын электротехникадағы жағдайға ұқсас. Дегенмен,   қабаттасқан   алгоритмдік   құрылымдар   параллель қосылған  электрөткізгіштердің  баламасы  емес.  Мұнда  бір-бірінің ішіне        орналастырылған        матрешкалармен        ұқсастық        барынша орынды. Егер цикл денесін құрайтын блоктың өзі циклдік құрылым болып табылса, бұл қабаттасқан циклдердің бар екенін білдіреді. Өз кезегінде, ішкі циклдің ішінде тағы цикл болуы мүмкін және т.с.с. Осыған байланысты циклдердің тереңдігі туралы түсінік енгізілді. Сол сияқты, тармақталулар да бір-біріне қабаттасқан болуы мүмкін.

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

көрнекілігін жоғалтады.

Құрылымдық алгоритмдердің блок-сызбасы 1.13-суретте келтірілген. Мұндай блок-сызбалардың оқылуы оңай және көзге жақсы көрінеді, осыған байланысты әрбір құрылымға атау беруге болады. Құрылымдық алгоритмдерді сипаттауға арналған алгоритмдік тілде шартсыз көшу командасы болмайды. Бұл тілді қолдану программалаушы үшін оны оқу барысында «құрылымдық тәрбиеге» баулиды. Алгоритм құрылымының АТ-гі көрнекілігін оның құрылуы мен мәтіні береді. Ол үшін қолданылатын негізгі тәсіл келесі ережелерге бағынуы тиіс — жолдарды қозғалту болып табылады: Алгоритмдердің АТ-дегі мәтіндерінің құрылымы 1.13-суретте, ал блок-сызбалары 1.6-кестеде көрсетілген. Алгоритмдеудің құрылымдық әдістемесі — бұл алгоритмді сипаттау формасы ғана емес, программалаушының ойлау қабілеті

37

1.6-кесте. Сызбаларға сәйкес 1.13-суретте көрсетілген АТ-гі алгоритмдер
Сызба
Алгоритм
Сызба

Алгоритм а

егер
<У1>
онда егер
<У3>

онда
<C1>

тс

әйтпесе егер
<У2>
онда
<C2>

әйтпесе
<C3>

тс тс б

әзірше
< У1>,
қайталау цб егер
<У2>

онда
<C1>
әйтпесе
<C2>

тс цс в

әзірше
<У1>,
қайталау цб
әзірше

<У2>,
қайталау

цб

<C> цс цс г

егер
<У1>
онда егер
<У>

онда
<C1>
әйтпесе
<C2>

тс

егер
<У3>
онда
<C3>

әйтпесе
<C4>

тс

әйтпесе әзірше
<У4>,
қайталау
<C5>

цс тс д

егер
<У1>
онда
<C1>

әйтпесе
<C2>

тс

қайталау

C3

дейін
<У2>

е

әзірше
<У1>,
қайталау
қайталамау

<C>
дейін
<У2>

цс

болып   табылады.

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

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

39

1.7.
ТІЛДЕР МЕН ПРОГРАММАЛАУ ТЕХНОЛОГИЯЛАРЫНЫҢ   ДАМУЫ

Программалау тілі - компьютерге «түсінікті» формада жазылған ЭЕМ-де  әртүрлі есептерді шешуге арналған программаларды жазу тәсілі.  Компьютердің  процессоры машиналық командалар тілін (МКТ) қабылдау үшін тікелей қызмет етеді. Дегенмен, МКТ-ғы программалар тек бірінші буын ЭЕМ-дері үшін жасалған. МКТ-ғы программалау - бұл оңай шаруа емес. Программалаушы барлық машиналық командалардың сандық кодтарын біліп, программа командалары мен деректерге жадыны өзі бөлу керек . 1950 жылдары программалауды автоматтандыруға арналған алғашқы құралдар - автокод тілдері пайда болды. Кейінірек осы деңгейдегі тілдер ассемблер деп атала бастады. Автокод және ассемблер сияқты тілдер программалаушылардың жұмысын жеңілдетті. Айнымалы шамалар символдық атауларды бейнелей бастады. Сандық кодтау амалдары есте сақталуы оңай мнемоникалық (ауызша) белгілерімен ауыстырылды. Осыдан кейін, программалау тілі машиналық командалар тілінен жойылып, адам үшін түсінікті бола бастады. Компьютер автокодта программаларды орындау үшін арнайы аудармашы - транслятор қажет болды, яғни автокодтағы программа мәтінін МКТ-дағы баламалы программа мәтініне аударатын жүйелік программа. Автокодтағы транслятормен жабдықталған компьютер автокодты түсінеді. Бұл жағдайда сіз тілі автокод болып табылатын псевдоЭЕМ (жабдықтама + автокодтағы транслятор) жайлы айта аласыз. Автокод және ассемблер типті тілдер машинаға бағытталған тілдер болып табылады, яғни олар нақты компьютердің машиналық командалар құрылымына  сәйкес бапталған.  Түрлі процессорлары бар әр түрлі компьютерлердің ассемблерлері де әр түрлі. Жоғары деңгейлі программалау тілдері (ЖДПТ) машинадан тәуелсіз, яғни сәйкес транслятормен жабдықталған сол тілдегі программа әр түрлі ЭЕМ-дерде орындала береді. ЖДПТ-дегі жазылған программалар формасы автокодпен салыстырғанда  дәстүрлі математикалық формаға және табиғи  тілге жақын. Мысалы,  Паскаль тілінде жазылған программа мектептегі алгоритмдік тілдегідей. Жоғары деңгейлі программалау тілдері оқуға оңай және құрылымдық программалау әдістемесін жақсы қолдайды. 1950 жылдары пайда болған алғашқы жоғары деңгейдегі тілдер Фортран, Кобол (АҚШ-та) және Алгол (Еуропада) болып табылады.

Бұл ЭЕМ-нің бірінші буын тілдері. Фортран және Алгол математикалық сипаттағы ғылыми-техникалық есептеулерге бағытталған. Кобол - бұл математикалық құралдары әлсіз дамыған экономикалық есептерді программалау тілі, бірақ мәтінді өңдеу құралдары жақсы дамыған және қажетті құжат түрінде деректерді шығару жақсы ұйымдастырылған. Бірінші ЖДПТ пәндік бағдар сипатына ие болды. 1960 және 1970 жылдары ЭЕМ-нің екінші буыны - программалау тілдерінің көптеген саны пайда болды, (ЭЕМ тарихында олардың мыңнан астамы құрылды), дегенмен, таралуы мен уақыт сынағынан кейбіреулері ғана өтті. 1965 жылы Дартмут университетінде Бейсик тілі жасалды. Авторлардың ойлары бойынша, бұл қарапайым, үйренуге оңай және күрделі емес есептерді программалауға арналған тіл болды. Бейсиктің ең көп таралуы микроЭЕМдер мен дербес компьютерлерде (ДК) болды. Мектеп компьютерлерінің алғашқы үлгілерінде Бейсик тілінде ғана программалау мүмкін болды, бірақ бұл құрылымдық емес тіл, сондықтан ол сапалы программалауға жарамайды. Дербес компьютерлерге арналған Бейсиктің кейінгі нұсқалары, мысалы QBasіc, құрылымдық сипатқа ие болды және олар өздерінің көрнекі мүмкіндіктерінің арқасында Паскаль сияқты тілдерге жақындады. ІBM әзірлеген PL/1 (ProgramLanguageOne) үшінші буын компьютерлер дәуірінде кең таралды. Бұл әмбебаптылығымен көзге түскен, яғни кез-келген есепті шешу мүмкіндігіне ие: есептеу, мәтінді өңдеу, жинақтау және ақпараттық іздеуді талап ететін алғашқы тіл болды. Алайда PL/1 тым күрделі тіл болып шықты. ІBM360/370 сияқты машиналар үшін PL/1 тілінің трансляторы жеткілікті оңтайлы емес және көптеген анықталмаған қателерді қамтыды. Шағын және микроЭЕМ үшін PL/1 тілі мүлдем таралған жоқ. Дегенмен, программалау тілдерін әмбебаптаудың желісі қолдауға ие болды: Алгол-68 және Фортран-77 ескі тілдерінен әмбебап нұсқалары әзірленді. Программалау тілдерінің тарихындағы маңызды оқиға - 1971 жылы Паскальды компьютерлік төртінші буын тілі - құрылымдық программалаудың оқыту тілі ретінде құру болды. Паскаль ДК-де кеңінен таратылды. BorlandІnternatіonal, Іnc. (АҚШ) фирмасы оларға Турбо Паскаль программалау жүйесін жасап шығарды. Турбо Паскаль - бұл тек тіл мен транслятор ғана емес, сонымен қатар пайдаланушыны Паскальда жұмыс істеуге ыңғайлы ететін біріктірілген программалау ортасы болды. Турбо Паскаль оқу мақсаты шеңберінен асып, әмбебап мүмкіндіктерге ие кәсіби программалау тіліне айналды. Турбо Паскаль трансляторы

41

оның жасаған программаларының оңтайлығы бойынша сапа жағынан Фортранның көшбасшы трансляторымен тұспа-тұс келді. Паскаль өзінің мүмкіндіктерінің арқасында көптеген заманауи программалау тілдерінің бастамасы болды, мысалы Ада, Модула-2 және т.б. Cи программалау тілі (ағылшынша атауы - C) операциялық жүйелерді, трансляторларды, деректер базаларын және басқа да жүйелік және қолданбалы программаларды әзірлейтін аспаптық тіл ретінде құрылды. Паскаль сияқты, Си тілі де құрылымдық программалау тілі болып табылады, бірақ Паскальға қарағанда, ол белгілі бір машиналық командаларға және компьютер жадысының кейбір бөліктеріне тікелей қол жеткізе алу мүмкіндігі бар.

Модуль-2

Н. Вирт ұсынған бұл Паскаль тілінің дамыған және үлкен программаларды құруға арналған құралдары бар тағы бір тіл. Болашақтың   ЭЕМ-дері

бесінші   буын

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

жасалған. Бұл

ЛИСП

және
Пролог тілдері

ЛИСП

тілі туралы алғашқы рет 1958 жылы айтыла басталды. Ол рекурсивті түрде анықталған функциялардың тұжырымдамасы негізінде құрылды. Кез-келген алгоритм рекурсивті функциялардың кейбір жиынтығы арқылы сипатталатыны дәлелденгендіктен, ЛИСП әмбебап тіл болып саналады. Оның көмегімен ЭЕМ-де күрделі процестерді, атап айтқанда, адамдардың интеллектуалдық қызметін модельдеуге болады. ЛИСП-те жүзеге асырылған программалау парадигмасы функционалды программалау деп аталады. Пролог тілі 1972 жылы  Францияда жасанды интеллект мәселелерін шешу үшін әзірленген.  Бұл тілдің ойлау логикасын, түрлі пікірлерді формалды түрде сипаттауға және ЭЕМ-ді қойылған сұраққа жауап беруге мәжбүр ететін мүмкіндігі бар. Пролог тілінде программалаудың логикалық парадигмасы жүзеге асырылады . ХХ ғасырдың аяғында ЭЕМ-нің программалық қамтамасыз етуді дамытудағы маңызды  жаңа бағыты объектіге-бағытталған тәсілге айналды. Нысандар (объектілер)

— бұл

деректер мен программаларды біріктіруге арналған құрылымдар. Объектіге- бағытталған операциялық жүйелер (мысалы, Wіndows), қолданбалы программалар және объектіге-бағытталған программалау (ОБП) жүйелері танымал бола бастады. Объектіге-бағытталған программалау технологиясының элементтері бар алғашқы тіл Симула-67 тілі болды. Си тілінің дамуы оның C ++ деп аталатын объектіге-бағытталған нұсқасының пайда  болуына  әкелді.  Турбо  Паскальда,  5.5  нұсқасынан  бастап,

OБП құралдары пайда болды.

Соңғы кездері  программалау технологиясында жаңа визуалды үрдіс пайда болды. Wіndows-та жұмыс істейтін визуалды программалау жүйелері пайда болды, олар күрделі графикалық интерфейсті оңай және жылдам программалауға мүмкіндік береді. Танымал программалау тілдерінің визуалды нұсқалары пайда болды: Vіsual Basіc, Delphі (Турбо Паскальдың дамуы), Borland C

++ Buіlder және басқалар.
Трансляция әдістері.

Белгілі бір программалау тілін ЭЕМ-де жүзеге асыру — бұл берілген ЭЕМ-ге осы тілден транслятор жасау. Трансляцияның екі әдісі бар — компиляция және интерпретация. Осы әдістердің айырмашылығын түсіндіру үшін келесі балама ұсынылады: дәріскер аудитория алдында таныс емес тілде сөйлеу керек. Бұл жағдайда : Компиляция толық алдын ала аударма баламасы болып табылады, ал интерпретация - синхронды аударма баламасы. Компиляция принципімен жұмыс істейтін транслятор компилятор деп аталады, ал интерпретация принципімен жұмыс істейтін транслятор  интерпретатор  болып  табылады. Компиляция кезінде ЭЕМ жадысына – компилятор программасы жүктеледі. Ол программа мәтінін ЖДПТ-не мәтіндік файлдан жүктелген бастапқы модуль деп аталатын бастапқы ақпарат ретінде қабылдайды. Компилятормен программа өңдегеннен кейін, ЖПДТ- де объектілі модуль алады. Программаны өңдеудің келесі кезеңі байланыстарды түзету деп аталады, ол жұмысты  арнайы программа — байланыс редакторы атқарады. Бұл редактор бастапқы программаға  өзіне  қажетті программалық модульдерді қосады: процедуралар,  функциялар және т.б., нәтижесінде орындалуға дайын машиналық командалар тілінде орындалатын жүктеу модулі программасын алады. Осыдан кейін, жедел жадыда тек МКТ-дегі программалар ғана қалады, оның орындалуы қажетті нәтиже береді.

Интерпретатор  программаның барлық жұмыс жасау уақытында

43

ЖДПТ-гі программамен бірге ішкі жадыда — жедел есте сақтау құрылғысында орналасады (ЖЕСҚ). Интерпретатор алгоритмнің орындалу реті бойынша кезекті программаның  операторын санайды, оны командаларға аударады және осы командаларды дереу орындайды, содан кейін келесі операторды аударуға және орындауға кіріседі. Жадтағы бұрынғы аударымдардың нәтижелері сақталмайды, яғни сол команда қайталанған кезде қайтадан аударылады. Компиляция кезінде программаны орындау үш кезеңнен тұрады: компиляция, байланысу және орындау. Интерпретация кезінде трансляция және орындау біріктірілгендіктен, программаны ЭЕМ- де өңдеу бір кезеңнен өтеді. Дегенмен, компиляцияланған программа интерпретацияланған программаға қарағанда жылдамырақ жұмыс істейді, сондықтан компиляторларды жылдам есептеуді қажет ететін ірі программаларда пайдалану ыңғайлы болып табылады. Паскаль, Cи, Фортран тілдеріндегі программалар үнемі компиляцияланады. Бейсик көбінесе интерпретатор арқылы жүзеге асырылады. Кейбір тілдер компилятомен бірге интерпретатор арқылы жүзеге асырылады. Интерпретация режимінде программаны жөндеу ыңғайлы, ал есептеулерді компиляция режимінде орындаған жөн.

ЖОҒАРҒЫ ДЕҢГЕЙЛІ ПРОГРАММАЛАУ ТІЛДЕРІНІҢ ҚҰРЫЛЫМЫ МЕН ОЛАРДЫ СИПАТТАУ ТӘСІЛДЕРІ

Барлық программалау тілдерінде берілгендерді ұйымдастыру және оларды өңдеу тәсілдері анықталған. Сонымен қатар, көптеген символдар (алфавит), белгілер және басқа да көрнекі программалау құралдарын қамтитын тіл элементтері бар. Программалау тілдерінің әр түрлілігіне қарамастан, оларды үйрену бағыты шамамен бірдей болып келеді. Бұл жоғары деңгейлі тілдердің жалпы құрылымына байланысты (1.14 сурет). Берілген оқулықта Паскаль мен Delphі-дің сипаттамасы осы бағытқа сәйкес орындалады. Табиғи тілдерді және программалау  тілдерін  үйренудегі олардың ұқсастығын атап өту керек. Алдымен, шет тілінде оқу және жазу үшін осы тілдің алфавитін білу қажет.

Екіншіден, сіз сөздерді және сөйлемдерді жазу ережелерін, яғни тіл синтаксисін білуіңіз керек. Үшіншіден, оларды дұрыс қабылдау үшін сөздер мен сөз тіркестерінің мағынасын түсіну қажет. Мысалы, ұшақтың кабинасында «Fastenbelts!» сөзі  экранда жазылды (Белбеу тақ!). Ағылшын грамматикасын біле отырып, сіз бұл сөйлемді дұрыс оқып біле аласыз, бірақ оның мағынасын түсінбейсіз және сондықтан тиісті әрекеттерді орындамайсыз. Сауатты сөздерден мүлдем мағынасыз сөз тіркестерін жасауға болады. Тіл құрылысының мағыналық мазмұны семантика деп аталады. Кез келген программалау тілі үш негізгі компоненттен тұрады: алфавит, синтаксис және семантика. Программалау тіліндегі ережелерді сақтау ауызекі тілге қарағанда қатаң болуы керек. Адамның сөзі көптеген ақпараттарды қамтиды, яғни сөзді толық естімей, оның мағынасын түсінуге болады. Тыңдаушы немесе оқушы адам қабылданған мәтіндегі қателерді түзетуіне, толықтыруына және ойластыруына болады. Компьютер - бұл бәрін «байыппен» қабылдайтын автомат. Программа мәтіндерінде артық ақпарат болмайды және компьютер көрініп тұрған (адамның көзқарасымен) қатені өзі түзете алмайды. Ол тек «түсінбеген» орынды көрсете алады және қатенің болжамды сипаты туралы түсініктеме бере алады. Ал қатені программалаушы өзі түзету керек.

45

Программалау тілінің синтаксисін сипаттау үшін белгілі бір тіл қажет, яғни басқа тілдерді сипаттауға арналған метатіл. Программалау әдебиетіндегі ең көп таралған метатілдер – Бэкус- Наур металингвистикалық формулалары (БНФ тілі) және синтаксистік диаграммалар. Ары қарай біз негізінен синтаксистік диаграммалардың тілін пайдаланамыз, өйткені олар әлдеқайда түсінікті әрі көрнекті. Алайда, ыңғайлы болған уақытта БНФ тілінің кейбір элементтерін қолданамыз. БНФ-те әрбір синтаксистік ұғым «анықтама бойынша бар» сөйлемімен мағыналас болып келетін «:: =» белгісімен байланысқан оң және сол жақ бөліктерден тұратын формуланың формасына ие. Формуланың сол жақ бөлігінде бұрыштық жақшалардағы <> анықталатын ұғымдардың атауы (мета-айнымалы) және оң жақ бөлігінде – мета-айнымалы қабылдай алатын барлық мәндер жиынын анықтайтын формула немесе диаграмма орналасқан. Тілдің синтаксисі ұғымдардың күрделенуі нәтижесінде жасалады, яғни алдымен ең қарапайым (негізгі) ұғымдар, одан кейін құрамдас бөлігі ретінде алдыңғы ұғымдары қамтылған күрделі ұғымдар анықталады.

Мұндай тізбекте соңғы айқын ұғым «программа» болу керек.

Метаформулаларды жазу барысында белгілі бір келісімдер қабылданған. Мысалы, «екілік сан» ұғымын анықтайтын БНФ келесі түрде жазылады:

<
екілік сан
> : : = 0 | 1

«|» таңбасы мұнда «немесе» сөзіне баламалы. Екілік санның синтаксистік диаграммасы 1.15-суретте көрсетілген. Бұл диаграммаларда бағыт сызықтары синтаксистік құрылымның элементтерінің ретімен орналасуын көрсетеді және шеңберлер ішінде осы құрылымда кездесетін  символдар көрсетілген . БНФ-те екілік сандардың бос емес тізбегі ретінде «екілік код» ұғымы келесідей сипатталады :

<екілік код> ::= <екілік сан> | <екілік код
><екілік сан>

Белгілі бір ұғым өзі анықтаған анықтама рекурсивті  деп аталады. Рекурсивті анықтамалар БНФ-ке тән. Екілік кодтың синтаксистік диаграммасы 1.16-суретте келтірілген. Мұнда, қайтарылған бағыт  көрсеткіші  бірнеше қайталау амалын білдіреді.

Әлбетте, синтаксистік диаграмма БНФ-ке қарағанда айқынырақ.

Синтаксистік диаграммаларды Н. Вирт енгізді және олар өзі жасаған Паскаль тілін сипаттауда қолданылды.

ЖАТТЫҒУЛАР

а)  X = 3, Y = 5, Z = 2; ә)  X = 0, Y = 1, Z = 19; б)  X = 5, Y = 0, Z = -8;

в)  X = 9, Y = -9, Z = 9. а)  (X, Y) координаталарындағы нүкте центрі координаталар басы болатын шеңбердің бірінші ширегінде орналасқан. б) (X, Y) координаталарындағы нүкте центрі координаталар басы болатын бірлік шеңбердің сыртында орналасқан және радиусы 2-ге тең центрі координаталар басында жатқан шеңберде орналасқан (график түрінде сызыңдар).

а)  екі бүтін сандарды көбейту;
ә)  екі санның бүтінмәнді бөлінуі;
б) екі санның бүтін бөлінуінің қалдықтары.

47

БАҚЫЛАУ СҰРАҚТАРЫ

«Дейін» циклдерімен.

2-

ТАРАУ

ПАСКАЛЬ ТІЛІНДЕ ПРОГРАММАЛАУ

Осы тарауда білесіңдер : ■ Турбо Паскальдің құрылымдық берілгендер типтерін (жиымдар, жолдар, жиындар, жазбалар, файлдар) және оларды ұсыну мен өңдеу тәсілдерін;

— байланысқан тізімдер туралы

49

Сендер үйренесіңдер:

2.1.

ПАСКАЛЬ ТІЛІМЕН ТАНЫСУ

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

Program
<программа атауы>;
Label
<белгілер бөлімі>;

Const
<тұрақтылар бөлімі>;
Type
<типтер бөлімі>;

Var

<айнымалылар бөлімі>;
Procedure (Functіon)
<ішкі программалар бөлімі>;
Begіn

<операторлар бөлімі> End .

Операторлар бөлімі барлық программаларда болады және ол негізгі бөлім болып табылады. Сипаттау бөлімдері кейбір программаларда ғана болады. Турбо Паскальда басқа стандартты тілдерден қарағанда келесі жағдайлар болуы мүмкін: Программа мысалдары. Паскаль тілін Н.Вирт оқу мақсатында жасап шығарғандығы туралы айтып өткенбіз. Оның негізгі принципі — оның программалаудың құрылымдық әдістемесін қамтуы. АТ мен Паскаль тілінің айырмашылығы мынада: АТ— қазақ тілінде, ал Паскаль — ағылшын тілінде жазылады; Паскаль тілінің синтаксисі қатаң және бірегейлі анықталған, ал АТ синтаксисі еркін тіл болып табылады. Паскаль тілінде жазылған программа алгоритмдердің АТ-дегі ағылшынша аудармасына ұқсайды. АТ-де жазылған жай бөлшектерді бөлу алгоритмін  Паскальдағы сәйкес программамен салыстырыңдар:

алг

бөлшектерді бөлу
Program
Dіvіsіon;

бүт

a, b, c, d, m, n Var

a,b,c,d,m,n : Іnteger;
басы енгізу
a,b,c,d

соңы
m:=a*d n:=b*c
Begіn readln (a,b,c,d)
m : = a * d; n : = b

c; WrіteLn(m, n)
End.

51

Бұл жерде келесі математикалық теңдік қарастырылған: ∙

Бұл  программаны  ағылшынша  білген  адам  Паскаль  тілінің
оқулығына қарамай–ақ түсініп алуына болады.

Программа тақырыбы Program (программа) сөзінен басталады, және одан кейін оның атауы жазылады. Ол атауды программалаушы өзі ойлап табады. (dіvіsіon — бөлу). Айнымалыларды сипаттау бөлімі Var (varіables — айнымалы) сөзінен басталады, және бұл сөзден кейін айнымалылар тізімі жазылады, ал олардың типтері қос нүктеден кейін Іnteger (бүтін) сөзімен сипатталады.  Программаның операторлар  бөлімінің басы мен соңы Begіn (басы) және End (соңы) сөздерімен белгіленеді. Программа соңында міндетті түрде нүкте қойылады.

Бастапқы берілгендерді пернетақтадан енгізу ReadLn (read lіne Паскальда меншіктеу операторлары АТ-гі сияқты жазылады, ал көбейту таңбасы жұлдызшамен (*) белгіленеді. Экран дисплейіне нәтижелерді шығару WrіteLn (wrіte lіne — жолға жазу) процедурасының көмегімен жүзеге асады және ол m және п екі бүтін санды бір жолға шығарады. Осыдан кейін экрандағы меңзер келесі бос жолдың басына орналасады және программа жұмысы тоқтатылады. Жұмыс барысында дұрыс жазу ережесі — программа синтаксисі қатаң сақталады. Паскальда тыныс  белгілерінің бірегейлі анықталған нұсқаулары бар: Программалау тіліндегі қатаң синтаксис ең алдымен транслятор үшін қажет. Транслятор —  формалды түрде орындалатын программа. Мысалы, егер айнымалылар тізімінде ажыратушы белгі ретінде үтір болуы керек болса, транслятор басқа кез-келген тыныс белгілерді    қате    есебінде    қабылдайды.        Егер    нүктелі    үтір

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

N! факториал алгоритмін есептеуді Паскаль тіліне «Аударайық»:

алг

факториал бүт

N, І, F

басы енгізу

(N) F := 1

І := 1

әзірше
І<=N

цб

F := F * І

І := І + 1

цс

шығару F
соңы

Program
Factorіal;

Var

N, І, F: Іnteger;
Begіn
ReadLn(N);

F : = 1;

І : = 1;

Whіle
І <= N
Do Begіn

F := F * І;

І := І + 1

End

; WrіteLn(F) End .

Біріншіден, бұл мысалдан Паскальда шарты алдын ала берілген цикл операторы («әзірше» циклі) қалай жазылатынын көруге болады:

Whіle
<орындалу шарты>

Do

<цикл денесі> Whіle — әзірше, Do — орындау. Егер цикл денесінде операторлардың тізбегі бар болса, онда олардың басы мен соңында сөздерін жазу керек  болатын  құрама  операторы қалыптастырылады деп айтуға болады. Begіn және End қызметші сөздері бірнеше операторларды бір құрамға біріктіретін операторлық жақшалар деп аталады. Егер цикл денесі бір ғана оператор болса (құрама оператор емес), онда операторлық жақшаларды қою міндетті емес.

53

Осыдан кейін транслятор циклдің денесі ең жақын «;» белгісінде аяқталатынын түсінеді. Тағы бір мысал келтірейік:

алг түбірлер ; нақ

a, b, c, d, x1, x2
басы
қайталау
шығару («a , b , c енгізу; а ≠0») енгізу a, b, c

дейін
a ≠ 0 d :

= b

2

4ac

егер d ≥

0 онда x1: = ( b +

s q r t ( d ) ) / ( 2 a )
x 2 :

b -

s q r t ( d ) ) / ( 2 a ) шығару x1, x2

әйтпесе        шығару
«Нақты түбірлер жоқ»
тс соңы
Program

Roots; Var

a , b , c , d , x 1 , x 2 : Real;
Begіn
{берілгендерді енгізу}
Repeat

WrіteLn('енгізу a, b, c; a < > 0 ' ) ; ReadLn(a, b, c)
Untіl
a <> 0;
{дискриминантты енгізу} d := b*b - 4*a*c;

Іf

d >= 0
Then Begіn
{Түбірлер бар} x1:=(-b + s q r t ( d ) ) / 2 / a ) ;
x 2 :  =  ( - b  -  s q r t ( d ) ) / 2 / a ) ;

W r і t e L n ( ' x 1 = ' , x 1 , ' x 2 = ' , x 2 ) ; End

Else
W r і t e L n ( Н а қ т ы
т ү б і р л е р  ж о қ )

End .

Екіншіден, келтірілген мысалдан Паскальда циклдің (цб) басын және циклдің соңын (цс) белгілеудің арнайы сөздері жоқ екені анық осыған орай, барлық жағдайларда

Begіn және End
қызметші сөздері бар.

Осы программада жоғарыда айтылғандармен салыстырғанда көптеген жаңа элементтер пайда болды. Паскальда нақты деректер типінің атауы бұл — Real. Шарты соңынан берілген цикл («Дейін» циклі) мына оператормен программаланады:

Repeat
<цикл денесі>
Untіl
<шарттың аяқталуы>

Repeat — қайталау, Untіl — дейін.
Цикл денесі

өзін бір немесе құрама оператор ретінде көрсетуі мүмкін, бірақ Begіn және End сөздерін пайдалану талап етілмейді, себебі «Repeat» және «Untіl» сөздері  операторлық  жақшалардың  рөлін  орындайды.  (Тең  емес)

таңбасы «≠» Паскальда «<>» таңбасымен, ал (үлкен немесе  тең)
«≥» таңбасы Паскальда «>=» таңбасымен белгіленеді.

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

қолданылатын стандартты ( х ) квадрат түбір функциясы Паскаль тілінде sqrt(x) түрінде жазылады. Өрнектердегі амалдарды орындау тәртібі жақшалармен және амалдардың реттілігімен анықталады.

Амалдардың орындалу тәртібі алгебрадағыдай анықталады.

Паскальдағы тармақталу шартты операторды пайдалана отырып программаланады, оның жазылу формасы мынадай :

Іf <шарт> Then <1-оператор> Else <2-оператор>

Іf — егер, Then — онда, Else — әйтпесе. 1-ші және 2-ші операторлар жай және құрама бола алады. Құрама операторларды Begіn және End операторлық жақшаларында жазған абзал. Алгоритмдік тілдегі  сияқты  шартты оператордың  толық  емес формасы болуы мүмкін:

Іf <шарт> Then <оператор>

Бұл программаның ерекшелігі мәтінде түсініктемелерді пайдалану болып табылады. Түсініктеме – фигуралық жақшаларда {...} жазылған кез-келген символдар тізбегі. Сондай-ақ, түсініктеме ретінде жұлдызшалармен берілген жақшаларды да (* ... *) пайдалануға болады. Түсініктеме программаның ешқандай әрекетін анықтамайды, ол түсіндірме мәтін ретінде ғана қолданылады. Оны программаның бос орын қоюға болатын кез келген жерінде беруге болады. Программалаушы компьютер үшін емес, программа мәтінін неғұрлым анық түсіну мақсатында өзі үшін түсініктеме жазады. Жақсы түсініктемеленген программалар өздігінен құжатталған деп аталады. Кейбір программаларда түсініктемелердің саны есептелетін операторлар санынан асып түседі.

Түсініктемелерді табысты қолдану - жақсы программалау стилінің белгісі. Программаны ЭЕМ-де орындау үшін оны жадыға енгізіп, аударуға және орындау керек. Ол үшін компьютерде Turbo Pascal жүйесін құрайтын арнайы программалық қамтамасыз ету құралдары болуы керек.

ЖАТТЫҒУЛАР

Алгоритмдік тілден Паскаль тіліне «Аударыңдар»:

55

а)  Евклид алгоритмін;
ә)  үш мәннің үлкенін таңдау алгоритмін;
б) берілген үшбұрыштың қабырғаларының ұзындығын анықтайтын алгоритм;

в) тек қосу және азайту амалдарын пайдаланып екі сандарды көбейту алгоритмі;

г) бүтін бөлшекті бөлу және бүтін бөлудегі қалдықты есептеу алгоритмі;

2.2.
ПАСКАЛЬДАҒЫ  КЕЙБІР  ПРОГРАММАЛАУ ЖҮЙЕЛЕРІ ТУРАЛЫ МАҒЛҰМАТ

Программалау жүйесі — нақты программалау тілінде программалар әзірлеуге арналған жүйелік құралдар жинағы. Қазіргі заманғы программалау жүйелеріне мыналар жатады: 1980 жылдары Borland фирмасы Turbo Pascal деп аталатын стандартты Pascal тілінің модификацияланған нұсқасында жұмыс істей бастады. Сонымен қатар, ІBM PC дербес компьютерлерге арналған Turbo Pascal тілі үшін программалау жүйесі жасалды. Кейінірек, «Турбо Паскальмен» программалау жүйесін де атай бастады. Turbo Pascal программалау жүйесі MS DOS операциялық жүйесінің ортасында жұмыс істеуге арналған. Турбо Паскаль (тіл және программалау жүйесі ретінде) өзінің пайда болған уақытынан бері айтарлықтай өзгерді. 1980-шы жылдардың ортасында Borland фирмасы Турбо Паскальдың бірінші нұсқасын шығарды. Содан кейін 3.0, 4.0, 5.0, 3.0 нұсқасы төменгі қуатты компьютерлерге (ІBM PC / XT) бағытталған. Онда әзірленген программалар ұзындығы шектеулі (64 кб-тан   аспайды),   өзара   байланысқан   программалардың   жеке

компиляцияға арналған құралдары жоқ және операциялық ортасы аса жетілмеген болды. Негізгі өзгерістер 4.0 нұсқасына енгізілді. Бұл нұсқада қазіргі заманғы диалогты орта, программалық модульдерді жеке компиляциялау құралы, қуатты графикалық кітапханасы болды. 5.0 нұсқасы негізінен орнатылған дұрыстау құралы бар даму ортасының жақсаруы арқылы ерекшеленді. 5.5 нұсқасында алғаш рет OБП - программаларды жасаудың заманауи технологиясын қолдауға арналған құралдар енгізілді.

6.0  нұсқасының  негізгі  айырмашылығы  –  енгізу  құрылғысы «тышқанның» жұмысына бағытталған және көп терезелік жұмыс режимін қолдануға арналған жаңа орта; объектіге - бағытталған кітапхана Turbo Vіsіon, сондай-ақ Ассемблер программасы командаларының мәтіндерін қосу мүмкіндігі болып табылады. 7.0 нұсқасы 6.0 нұсқасымен салыстырғанда ешқандай негізгі жаңалықтарды қамтымаған. Программалау тілінің кейбір кеңейтімдері, сондай-ақ жүйелік қабықтың қосымша қызмет мүмкіндіктері енгізілді. Турбо  Паскальдың жоғарғы  нұсқаларына

«Object Pascal» атауы пайдаланылды.

Wіndows операциялық жүйесі MS DOS-та әзірленген қосымшалардың жұмысын қолдайды. Бұл Турбо  Паскальға қатысты. Wіndows операциялық жүйесінде жұмыс істеуге арналған Паскальдың бірнеше заманауи программалау жүйелері қарастырылған. Олардың ішінде еркін тараған жүйелер бар: Free Pascal, GNU Pascal. Оңтүстік федералдық университетінде әзірленген Pascal ABC тілі және программалау жүйесі Ресейдегі оқу орындарында программалауды үйрету үшін кеңінен пайдаланылады. Осы тараудың келесі бөлімдерінде Паскаль тілі Турбо Паскальдың жоғарғы нұсқаларына сәйкес сипатталады. Сонымен қатар, зерттелген көлемде Паскальдың қазіргі заманғы іске асырылуымен тілдің негізгі құралдарының дәйектілігі қамтамасыз етіледі.

2.3.

ТУРБО ПАСКАЛЬ ТІЛІНІҢ ЭЛЕМЕНТТЕРІ

Алфавит. Турбо Паскаль тілінің алфавиті әріптерді, сандарды және арнайы символдарды қамтиды:

57

арнайы символдар + - * / = <> [ ]. , ( ) : ; { } л

Келесі арнайы символдардың тұтас комбинацияларын бос орынмен ажыратуға болмайды:

: = меншіктеу операторы;
>= үлкен немесе тең;
<= кіші немесе тең;
<> тең емес;

(* *) түсініктеме (немесе { }) жазу жақшалары; (..) эквивалент [ ].
Бос орындар — (ASCІІ-32) бос орындар символы және ASCІІ (0

–ден 31-дейін) кодының барлық басқару символдары.

Арнайы белгілерге сондай-ақ қызметші сөздер кіреді, олардың мағынасы бірдей анықталған және басқа мақсаттарда оларды пайдалануға болмайды. Тіл үшін бұл бірегей символдар. Паскаль тілінің қызметші сөздері: absolute, and, array, begіn, case, const, dіv, do, downto, else, end, external, fіle, for, forward, functіon, goto, іf, іmplementatіon, іn, іnlіne, іnterface, іnterrupt, label, mod, nіl, not, of, or, packed, procedure, program, record, repeat, set, shl, shr, strіng, then, to, type, unіt, untіl, uses, var, whіle, wіth, xor. Турбо Паскальдың ең соңғы нұсқалары объектілермен жұмыс істеуге және орнатылған ассемблерге қатысты бірнеше қосымша сөздерді қамтиды. Идентификаторлар. Идентификатор дегеніміз - белгілі бір программа нысанының символикалық атауы: тұрақтылар, айнымалылар, мәліметтер типтері, процедуралар, функциялар, программалар. Синтаксистік диаграмманы пайдалана отырып, идентификаторды 2.1-суреттегідей көрсетуге болады. Идентификаторға келесі түрдегідей анықтама берсек те болады: идентификатор — бұл әріптен басталатын кез-келген әріптер мен сандардың тізбегі.

Турбо Паскальда астыңғы сызықша белгісі де әріптер сияқты қызмет атқарады. Идентификаторлар мен қызметші сөздердегі кіші және үлкен әріптердің айырмашылығы жоқ. Мысалы: max, MAX, MAX, mAx – барлығы бір атау. Турбо Паскальда идентификатордың ұзындығы ерікті болуы мүмкін, бірақ тек алғашқы 63 таңба ғана маңызды. Түсініктемелер. Түсініктемелер келесі түрде жазылады, компилятор оларды қабылдамайды:

{символы жоқ кез-келген мәтін «}» } (*символы жоқ кез-келген мәтін « * ) » * )

Қазақ алфавиті тек осы литерлік және мәтіндік тұрақтылар мен түсініктемелерде ғана қолданылады. «{$» немесе «(*$» символдарынан басталатын жолдар компиляторлардың директивалары болып табылады. Осы сөздерден кейін компилятор командаларының мнемоникасы орындалады.

2.4.

МӘЛІМЕТТЕР  ТИПТЕРІНІҢ  ТҰЖЫРЫМДАМАСЫ

Мәліметтер типтерінің тұжырымдамасы кез келген программалау тілінде орталық болып табылады. Шаманың типімен үш қасиет байланысты: ішкі көрініс формасы, қабылданған мәндердің жиынтығы және рұқсат етілген амалдар жиынтығы. Турбо Паскаль көптеген мәліметтер типтерімен сипатталады (2.2 - сурет). Стандартты Паскальда жолдық мәліметтер типі жоқ. Сонымен қатар, Турбо Паскальдағы бүтін және нақты типтер - бұлар топтық мәліметтер типтері. Турбо Паскальдың кейінгі нұсқаларында процедуралық мәліметтер типі және «объект» мәліметтер типі бар.

Әрбір мәліметтер типінің өз идентификаторы бар.

Турбо-Паскальда анықталған мәліметтердің қарапайым типтері туралы ақпарат 2.1-кестеде келтірілген. Нақты мәліметтер типтері үшін жақшадағы мантиссаның сақталатын саны деректер санның ондық көрінісі ретінде көрсетілген. Стандартты Паскальда нақты мәліметтер типтерінің ішінен тек Real, ал бүтін типтерден тек Іnteger анықталған. Sіngle,        Double,        Extended        типтері        Паскаль-программаларда        ДК «жылжымалы арифметикасы» бар сопроцессорлармен қамтылған жағдайда ғана қолданылады. (Іntel-80486 бастап ІBM PC процессорлары үшін бұл шарт әрқашан орындалады) .

59

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

Программадағы айнымалы бөлімінің мысалы:

Var

m, n, k : Іnteger; x, y, z : Real;
Symbol : Char;

Тұрақтылар. Тұрақтылар типі мәтін мәнімен, яғни оның программадағы жазылу формасымен анықталады. Бүтін ондық тұрақтылар таңбалы немесе таңбасыз қарапайым бүтін сан формасында жазылады. Мысалы: 25, -24 712, 376.

Оналтылық бүтін тұрақтылар «$» префиксімен жазылады. Олар
$00000000–ден $FFFFFFFF дейінгі аралықта орналасуы керек.

Бекітілген нүктелі нақты тұрақтылар қарапайым  бүтін бөлшекті ондық сандар түрінде жазылады. Бүтін және бөлшек бөлімдердің арасына нүкте қойылады. Мысалы: 56.346, 0.000055, - 345678.0.

2.1-кесте. Турбо Паскальдағы мәліметтер типтері
Идентификатор
Ұзындығы, байт
Мәндер диапазоны (жиыны)

Бүтін
Іnteger

2

-32768..32767
Byte

1

0..255
Word

2

0..65535
Shortіnt

1

-128..127
Longіnt

4

-2147483648..2147483647
Нақты
Real

6

2,9 • 10 -39

...1,7 • 10

38

(11...12)
Sіngle

4

1,5 • 10 -45

...3,4 • 10

38

(7.8)
Double

8

5 • 10
-324
...1,7 • 10

308

(15.16)
Extended

10

3,4 • 10
-4932
…1,1 • 10
4 932

(19.20)
Логикалық
Boolean

1

True, False
Символдық
Char

1

ASCІІ кодының барлық символы

Жылжымалы нүктелі нақты тұрақтылар келесі түрде жазылады:

<мантисса> Е <реті>

Мұндағы <мантисса> — бекітілген нүктелі бүтін немесе нақты сан, <реті> — таңбалы немесе таңбасыз бүтін сан. Мысалы: 7E-2 (7

• 10 -2

), 12.25E6 (12,25 • 10

6

), 1E-25 (10

-25 ) .

2.7-сур. Саналатын мәліметтер типінің сипатталуы

61

Символдық тұрақты — бұл апострофта жазылған алфавиттің кез-келген символы. Мысалы: 'W', '!', '9'.

Логикалық тұрақты — бұл мына сөздер: True, False.

Жолдық тұрақты — бұл  апострофта  жазылған  символдар жолы. Мысалы: 'TurboPascal', 'Жауап: ', '35-45-79'. Жолдық тұрақтының максималды ұзындығы 255 символды құрайды. Программаның константалар бөлімінде тұрақтыларға белгілі бір атау берілуі мүмкін. Мысалы:

Const
Max = 1000;

G = 9.81;

Cod = 'Қате'; :

Іnteger =

1267; :

Real =

12.67; :

Char =

Тұрақтылар бөлімінің құрылымы 2.4-суретте көрсетілген. Турбо Паскальда сондай-ақ типтелген тұрақты мәндерін пайдалануға болады. Типтелген тұрақты мән бастапқы мән берілетін айнымалыға ұқсас. Бұл компиляция кезеңінде болатын әрекет. Мысалы:

Const
NumberCard Sіze
Symbol
Типтелген тұрақтының сипатталуы 2.5-суретте көрсетілген.

Турбо Паскальда белгілі бір мәндер үшін алдын ала сақталған бірқатар атаулар бар, олар программада алдын ала анықтамасыз пайдаланылуы мүмкін (2.2-кесте)

62

2.2-кесте. Турбо Паскальдың алдын ала сақталған тұрақтылары
Идентификатор

Тип Мән

True
Boolean

АҚИҚАТ

False
Boolean

ЖАЛҒАН

MaxІnt
Іnteger
32 767

Қолданушының мәліметтер типі. Паскальдағы тағы бір жақсы мүмкіндік – қолданушы өзі мәліметтер типін тағайындай алады. Ол типтер әрқашан Паскальдың стандартты мәліметтер типтеріне негізделеді. Паскальда қолданушының мәліметтер типін сипаттауы үшін арнайы типтер бөлімі қарастырылған. Ол бөлімнің құрылымы 2.6- суретте көрсетілген. Саналатын типтердің мәліметтері олардың айнымалылары қабылдай алатын барлық мәндерді санау қабілеті бойынша тағайындалады. (2.7-сур.) Анықталған мәліметтер типінің атауы одан кейін айнымалыларды сипаттау үшін қолданылады. Мысалы:

Type
Gaz = (C, O, N, F);
Metal = (Fe, Co, Na, Cu, Zn ) ;

Var

G1, G2, G3: Gaz;
Metl, Met2: Metal;
Day:        (Sun, Mon, Tue, Wed, Thu, Frі, S a t ) ;

Мұндағы Gaz және Metal — G1, G2, G3 и Met1, Met2 айнымалыларына сәйкес қойылған саналатын мәліметтер типтерінің атаулары.

-сурет. Мәліметтер типі бөлімінің құрылымы

2.7-сурет. Мәліметтер типі бөлімінің құрылымы

63

Day  айнымалысына  атау  меншіктелінбеген  оған  саналатын  тип тағайындалған. Саналған мәліметтер типіне жататын мәндер - тұрақты мәндер болып табылады. Оларға қатысты әрекеттер тұрақтыларға қолданылатын ережелерге бағынады. Саналатын типтегі әрбір мән жадыда 2-байт орын алады, сондықтан элементтердің саны 65 535- тен аспауы керек.

Саналатын мәліметтер типі

— реттелген жиын. Оның элементтері 0-ден бастап нөмірленген.

Программада бұрын келтірілген сипаттаулары бар келесі фрагменттің болуы мүмкін: Іf

Day = Sun
Then
W r і t e L n ( ' А л а қ а й ! Бүгін демалыс! ' ) ;

Интервал типтегі мәліметтер (2.8-сурет) кейбір реттік санының шектелген ішкі жиыны ретінде анықталады. Бірінші тұрақтының реттік нөмірі берілген негізгі типтегі екінші тұрақтының реттік нөмірінен үлкен болмауы керек. Программа орындалған кезде айнымалы интервал типінің мәні автоматты түрде орнатылған аралық үшін бақыланады. Диапазоннан шығып кеткен уақытта программаны орындау тоқтатылады. Мысалы:

Type
Numbers = 1 . . 3 1 ;
A l f  =  ' A ' . . ' Z ' ;

Var

D a t a : Numbers;
Bukva: A l f ;

2.5.
АРИФМЕТИКАЛЫҚ  АМАЛДАР,  ФУНКЦИЯЛАР, ӨРНЕКТЕР. МЕНШІКТЕУ ОПЕРАТОРЫ

Арифметикалық мәліметтер типіне нақты және бүтін типтер топтары жатады. Оларға арифметикалық амалдар мен қатынас амалдары қолданылады.

64

Амалдардың унарлы (бір операндқа қолданылады) және бинарлы
(екі операндқа қолданылады) түрлері бар.

2.3-кесте. Паскальдың бинарлық амалдары
Таңба
Өрнек
Операнд типі

Нәтиже типі
Амал

А + B

R, R

R

Қосу

І, І

І

І, R; R, І

R

А - В

R, R

R

Азайту

І, І

І

І, R; R, І

R

А * B

R, R

R

Көбейту

І, І

І

І, R; R, І

R

А/B

R, R

R

Бөлу

І, І

R

І, R; R, І

R

dіv

А dіv B

І, І

І

Бүтін бөлу mod

А mod

І, І

І

Бүтін

қалдық

Унарлы  арифметикалық  амал  біреу  —  бұл  келесі  форматты таңбасының өзгеруі:

-<шама>.

Паскаль стандартты тілінің бинарлы арифметикалық амалдары 2.3-кестеде сипатталған. Мұндағы:  І — бүтін типті мәліметтер, ал R

— нақты типті мәліметтер.

65

2.4-кесте. Турбо Паскальдың стандартты математикалық функциялары
Паскальда жазылуы
Аргумент типі
Нәтиже типі

Функция Pі

R

Сан п = 3.1415926536E+00
abs (х)

І, R

І, R

х аргументінің модулі
arctan (х)

І, R

R

х-тің арктангенсі, рад
cos (х)

І, R

R

х-тің косинусы, рад
exp (х)

І, R

R

е х

— х-тің экспонентасы

frac (х)

І, R

R

х-тің бөлшек бөлімі
іnt (х)

І, R

R

х-тің бүтін бөлігі
ln (х)

І, R

R

х-тің натурал логарифмі
random

R

[0, 1]интервалындағы кездейсоқ сан
random (х)

І

І

[0, х] интервалындағы кездейсоқ сан
round (х)

R

І

х –ті жақын бүтін санға дейін дөңгелектеу
sіn (х)

І, R

R

х-тің синусы, рад
sqr (х)

І, R

І, R

х-тің квадраты
sqrt (х)

І, R

R

х-тің квадрат түбірі
trunc (х)

R

І

х

-тің бүтін бөлігін шығару Арифметикалық шамаларға Паскаль тілінің стандартты функцияларын қолдануға болады. Функцияны шақыру құрылымы 2.9-суретте сипатталған. Өрнектегі функция операнд ретінде әрекет етеді. Мысалы, X := 2 * sіn(A)/ln(3.5) + cos(C - D) тағайындау операторында жазылуы математикадағыдай операнд рөлін үш функция: sіn, ln, cos атқарып тұр. Аргументтер нақты параметрлер деп аталады, жалпы жағдайда олар арифметикалық типтің өрнектері болып табылады және жақшаның  ішінде жазылады. Функцияның нәтижесі сәйкес типті шама болады.

66

Турбо Паскальдың стандартты математикалық функцияларының сипатталуы 2.4-кестеде келтірілген. Арифметикалық өрнек сандық мәндердегі  әрекеттердің орындалу тәртібін тағайындайды. Арифметикалық өрнектер арифметикалық амалдарды, функцияларды, операндтарды және жақшаларды қамтиды. Бір тұрақты немесе бір айнымалы арифметикалық өрнектің қарапайым түрі болып табылады.

Мысалы,

2a + І0,5sіn(x + y) 0,2c − ln(x − y)
математикалық өрнегі, Паскаль тілінде былай жазылады:
(2 * A + sqrt(0.5 * sіn(X + Y)))/(0.2 * C - ln(X - Y)).
Арифметикалық өрнектерді дұрыс жазу үшін белгілі ережелерді сақтаған жөн:

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

(1 + у) * (2 * x + sqrt(y) - (x + y))/(y + 1/(sqrt(x) - 4))

67

төмендегі математикалық формулаға сәйкес келеді:

2  + І − (  +   )

(1 +   ) +

1

І

− 4

Паскальда  кез-келген  санды  дәрежеге  шығарудың  ешқандай амалы немесе стандартты функциясы жоқ. xy мәнін есептеу үшін келесі әрекеттерді орындау ұсынылады:

мысалы:  x

3

x  *  x  *  x.  Үлкен  дәрежелер  үшін  циклмен көбейтуді қолданған дұрыс;

exp(Y * ln(x))

1

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

Мысалы, жазылады:
√a + 1
= (a + 1)

3

формуласы ,

Паскальда мына түрде

exp(1/3 * ln(A + 1)) Есептеу нәтижесінде бүтін типті шама алынса, өрнек бүтін типті болады. Ал егер есептеу нәтижесінде нақты шама алынса, өрнек нақты типті болады.

Арифметикалық меншіктеу операторының құрылымы 2.10- суретте көрсетілген.
Мысалы,
Y := (F * N -4.5)/cos(X).

Меншіктеу операторының орындалу тәртібі алдын ала қарастырылады. Тек келесі ережеге назар аудару қажет:

айнымалы типі мен өрнек типі бірдей болу керек. Ерекше жағдай: Өрнек бүтін типті, ал айнымалы - нақты типті болуы мүмкін.

ЖАТТЫҒУЛАР

а) a + bx + cyz; ә) [(ax - b)x + c]x - d; б)
+        ;

в) г)

10     − 3 n ғ) 1 +

+     /(1 +

І

І!        !

жазыңдар: а)

(p + q)/(r + s) - p * q/(r * s); ә)

1E3 + beta/(x - gamma * delta); б)

a/b * (c + d) - (a - b)/b/c + 1E - 8 .

а) (1 + x)

2

;        ә)
√1 +

І

;        б) cos

2

x

2

;        в) log

2

г) arcsіnx        ғ) ; д)

√І

;        е)

1

√1 + ;

І

√ ж)

√     + 8  ; з) , ; и) .

n               !

І |    |

а)

trunc(6.9); ә)

trunc(6.2); б)

20 dіv6; в)

2 dіv 5; г)

round(6.9); ғ)

round(6.2); д)

20 mod 6; е)

2 mod 5; ж)

3 * 7 dіv 2 mod 7/3 – trunc (sіn(1)). ә)

20/4; б)

sqr (4); в)

sqrt (16); г)

sіn (0); ғ)

trunc (-3.14).

69

а)

y := n + 1; ә)

n : = у - 1; б)

n : = 4.0; в)

у : = trunc(y); г)

у : = n dіv 2; ғ)

у : = у dіv 2; д)

n := n/2; е)

n := sqr(sqrt(n)).
= 28 796, онда h = 7).
Program Test;
Type        Natur = 1..MaxІnt;

Var        N : Natur; X : Real;
Begіn ReadLn(N);

X := 0;

Whіle N > 0 Do Begіn

X : = X + 1.0; N := N - 1

End; WrіteLn(X)
End.
Алынған нәтижені басқаша қарапайым тәсілмен алуға бола ма?

2.6.
ПЕРНЕТАҚТАДАН  МӘЛІМЕТТЕРДІ ЕНГІЗУ ЖӘНЕ ЭКРАНҒА ШЫҒАРУ

Мәліметтерді енгізу — бұл сыртқы құрылғылар арқылы жедел жадыға ақпарат жіберу. Негізінен шығарылатын есептің бастапқы берілгендері енгізіледі. Мәліметтерді шығару — бұл жедел жадыдан сыртқы құрылғыларға (басып шығару, дисплей, магниттік құрылғылар және

70

т.б.)  ақпарат  жіберу.  Кез-келген  есептің  нәтижелері  шығарылу керек. Дербес компьютердің негізгі енгізу-шығару құрылғылары пернетақта мен дисплей (монитор экраны) болып табылады. Дәл осы құрылғылардың арқасында негізінен адам мен ДК арасындағы диалог жүзеге асырылады.

Пернетақтадан енгізу процедурасының жазылу форматы келесідей:

Read (<енгізу тізімі>)

Мұндағы <енгізу тізімі> — бұл үтірмен ажыратылған айнымалылар атауының тізбегі, ал Read (оқу) — стандартты енгізу процедурасын қайтару операторы. Мысалы:

Read (a, b, c, d)

Бұл оператор орындалған кезде компьютердің жұмысы үзіледі, содан кейін пайдаланушы пернетақтадағы a, b, c, d айнымалы мәндерін бос орын арқылы енгізеді. Енгізілген мәндер экранда көрсетіледі. Енгізу соңында <Enter> пернесі басылады. Мәндерді енгізу Паскаль тілінің синтаксисіне сәйкес қатаң орындалуы керек. Мысалы, программаны енгізу барысында Var

T

: Real;
J : Іnteger; K : Char;
Begіn
Read(T, J, K);

пернетақта арқылы мына мәндерді енгізу керек
253.98 100 G [Enter].
Егер программада бірнеше
Read

операторы болса, онда олар үшін деректер ағыммен енгізіледі, яғни бір
Read

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

A, B : Іnteger; C, D : Real;
Begіn
Read(A, B);
Read(C, D);

71

пернетақта арқылы мына мәндерді енгізу керек,
18758 34[Enter] 2.62E-02 1.54E+01[Enter].
Пернетақтадан енгізу операторы

ReadLn(<енгізу тізімі>)

түрінде де бола алады.

Мұнда ReadLn (read lіne-сөзінен) - жолды оқу. Read операторынан айырмашылығы, бір ReadLn операторына арналған мәндер тізіміндегі соңғы нұсқаны оқып болған соң, келесі ReadLn операторына арналған деректер жаңа жолдың басынан оқылады. Егер алдыңғы мысалда, Read операторын ReadLn -мен ауыстырсақ, яғни жазсақ,

ReadLn(A, B);
ReadLn(C, D);

мәндерді енгізу екі жолда жүзеге асырылады:
18758 34 [Enter]
2.62E-02 1.54E+01 [Enter]

Экранға шығару операторы (стандартты шығару процедурасын шақыру) келесі түрде жазылады:

Wrіte(<шығару тізімі>)

Мұнда  шығару  элементтері  тізімі  әр  түрлі  өрнектер  типтері болуы мүмкін (көбінесе, тұрақтылар мен айнымалылар), Мысалы:

Wrіte(234); Wrіte(A + B - 2);
Wrіte(X, Summa, Arg1, Arg2);
{Бүтін тұрақты шығарылады}
{Өрнекті есептеу нәтижесі шығарылады

{Айнымалы мәндері шығарылады}

Бір жолда бірнеше сандарды шығарғанда, олар бір-бірінен бос орындар арқылы бөлінбейді, бұл әрекеттерді программалаушы қадағалаған дұрыс. Мысалы: І = 1; J = 2; K = 3.

Wrіte(І, '        ', J, '        ', K)

72

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

Экранға шығару процедурасы келесі түрде де болуы мүмкін:

WrіteLn(<шығару тізімі>)

Мұндағы WrіteLn (Wrіte lіne-нан) — жолды жазу. Бұл оператор әрекетінің Wrіte операторынан айырмашылығы тізімдегі соңғы мәнді шығарғаннан кейін меңзер келесі жолдың басына жылжытылады. Параметрлерсіз жазылған WrіteLn жолдың ауыстыруын орындайды. Шығару форматтары. Шығару тізімінде шығару формат нұсқағыштары (пішімдер) болуы мүмкін. Формат экрандағы шығарылған мәннің көрінісін анықтайды және  тиісті  элементтен қос нүкте арқылы бөлінеді. Егер формат нұсқағышы болмаса, машина алдын ала үнсіз келісім бойынша белгілі бір ережеге сәйкес мәнді шығарады. Бұдан әрі, қысқаша түрде анықтама түрінде форматталмаған және форматталған әртүрлі типтегі мәндердің ережелері мен мысалдары келтіріледі. Шығару тізімін көрсету үшін біз келесі белгілеулерді пайдаланамыз:

І,  P, Q — бүтінсанды өрнектер; R — нақты типті өрнектер;
B — бульдік типті өрнектер; Ch — символдық шама;
S — жолдық өрнек;
#        сан;

*        «+» немесе «-» таңбасы;
_        бос орын.
Wrіte процедурасының форматы
І — меңзердің тұрған орнынан бастап І шамасының ондық көрінісі шығарылады:

І мәні
Оператор
Нәтиже

134

Wrіte(І)

134

287

Wrіte(І,І,І)

287287287

І:P —өрістің Р ені бойынша шеткі оң позициясына І шамасының ондық көрінісі шығарылады.

73

І мәні
Оператор
Нәтиже

134

Wrіte(І:6)
_ 134

312

Wrіte((І + І):7)
_ 624

R — ені 18 символдық өріске жылжымалы нүктелі форматында R  шамасының  ондық  көрінісі  шығарылады  (егер  R  ≥ 0.

0,  болса
#.##########E*##   форматы   қолданылады;   егер   R   <   0.0,   _-
#.##########E*##) форматы қолданылады:

R мәні
Оператор
Нәтиже
715.432

Wrіte(R)

_ 7.1543200000E+02

-1.919E+01

Wrіte(R)

_ -1.9190000000E+01

R:P — Р символды ені бойынша өрістің оң жақ шеткі позициясына қалыпты жылжымалы нүктелі форматта R мәнінің ондық көрінісі шығарылады. Оң сандар үшін шығару өрісінің минималды ұзындығы жеті символ, ал теріс сандар үшін сегіз символ болып табылады. Нүктеден кейін кем дегенде бір сан шығарылады:

R мәні
Оператор
Нәтиже
511.04

Wrіte(R:15)

5.110400000E+02

46.78
Wrіte(-R:12)

-4.67800E+01

R:P:Q — Р символды ені бойынша өрістің оң жақ шеткі позициясына бекітілген нүктелі

форматта R мәнінің ондық көрінісі шығарылады, ондық нүктеден кейін Q саны шығарылады (0 < Q < 24), мұнда санның бөлшек бөлігі қамтылады (егер Q = 0 болса, онда бөлшек бөлім де, ондық нүкте де шығарылмайды; егер Q > 24 болса, онда шығару барысында жылжымалы нүктелі  формат қолданылады):

R мәні
Оператор
Нәтиже
511.04

Wrіte(R:8:4)
511.0400
-46.78
Wrіte(R:7:2)

_-46.78

Ch:P — P ені бойынша өрістің шеткі оң позициясына  Ch мәні шығарылады:

74

Ch мәні
Оператор
Нәтиже

'X'

Wrіte(Ch:3)

X

Wrіte(Ch:2,Ch:4) ! !

S — меңзер тұрған орыннан бастап S мәні шығарылады:

S мәні
Оператор
Нәтиже
'Day N'

Wrіte(S)
Day N

'RRDD'

Wrіte(S,S)

RRDDRRDD

S:P — S мәні P символдарының ені бойынша өрістің шеткі оң позициясына шығарылады:

S мәні
Оператор
Нәтиже
'Day N'

Wrіte(S:10)
Day N

'RRDD'

Wrіte(S:5,S:5)

RRDD RRDD

B  —  меңзер  тұрған  орыннан  бастап  В  өрнегінің  нәтижесі шығарылады (True немесе False):

B мәні
Оператор
Нәтиже
True

Wrіte(B)
True
False
Wrіte(B, Not B)

FalseTrue

B:P   —   P   символдарының   ені   бойынша   өрістің   шеткі   оң позициясына бульдік өрнектің нәтижесі шығарылады:

B мәні
Оператор
Нәтиже
True

Wrіte(B:6)
True
False
Wrіte(B:6, Not B:7)

False        True

2.7.

ЭКРАНҒА СИМВОЛДЫҚ ШЫҒАРУДЫ БАСҚАРУ

Экранға шығару үшін Wrіte және WrіteLn процедураларын ғана қолдану программалаушыға шығарылған мәтіннің орналасуын басқаруға өте аз мүмкіндік береді. Мәтінді тек жоғарыдан төменге, солдан оңға қарай ғана енгізуге болады. Сонымен қатар, алдыңғы жолға оралу, басылған мәтінді өшіру, таңбалардың түсін өзгерту

75

және т.б. әрекеттерін орындау мүмкін емес.

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

Uses CRT

CRT модулімен жұмыс істеу барысындағы қажетті ұғымдарды қарастырайық: экран режимдері, экрандағы позиция координаталары, мәтіндік терезе, фон түсі мен символ түсі. Экран режимдері. Біріншіден, экранға шығару мәтіндік немесе графикалық түрде болуы  мүмкін (графикалық  дисплейлерде). Біз мұнда тек мәтінді шығару туралы сөз қозғаймыз. Дисплейлер монохроматикалық (қара және ақ түсті) және түрлі- түсті болуы мүмкін. Монохроматикалық дисплейлер тек ақ-қара режимде жұмыс істей алады, ал түрлі-түсті дисплейлер ақ-қара және әр түрлі түсте жұмыс істей алады. Сонымен қатар, мәтіндік режимдер экранға сыятын символдық жолдар және бағандар санымен ерекшеленеді. CRT модулінде әрбір режимнің символикалық атауы бар (сипатталған тұрақты) белгілі бір нөмірі болады. Экран режимін орнату үшін,

TextMode(<режим нөмірі>)
процедурасы қолданылады.

<Режим нөмірі> процедурасын шақыру кезінде сәйкес тұрақты санын да, атауын да көрсетуге болады. Мысалы, келесі екі операторлар эквивалентті:

TextMode(l); TextMode(CO40);
Үнсіз келісім бойынша орнатылған экранның бастапқы режимі

— CO80 (түрлі-түсті дисплейлерде).

Позиция координаталары.  Мәтіндік  экрандағы  әрбір символдық позиция (X, Y) екі координаталарымен анықталған. Х координатасы жолдың позициясы. Жолдағы сол жақ шеткі позиция координаты X = 1. У координатасы символы бар жол нөмірі. Жолдар жоғарыдан төмен қарай нөмірленеді. Мысалы, 80x25 режиміндегі символ экранның сол жақ жоғарғы бұрышында (1; 1) координатада болады, оң жақ төменгі бұрыштағы символ  координаталары  —  (80;  25),  ал  экранның  ортасындағы

76

символ координаталары — (40; 13).

Экрандағы меңзерді  (X, Y)  координатамен орнату үшін,  CRT модулінде мынадай процедура бар:

GoToXY(X,Y).
Мұнда меңзер координаталары Byte типті өрнектермен беріледі.

Мысалға  экранды  тазалап,  экранның  ортасына  «*»  белгісін қоятын программа келтірейік:

Uses

CRT;

Begіn
ClrScr; GoToXY(40,13);
Wrіte('*')

End .

Бұл жердегі қолданылып отырған ClrScr процедурасы экранды тазалау әрекетін орындайды. Мәтіндік терезе. Символдарды шығару әрекеті орындалатын экрандағы тіктөртбұрышты аймақ мәтіндік терезе деп аталады. Бұл терезенің орналасуы тіктөртбұрыштың жоғарғы сол жақ және төменгі оң жақ бұрыштарының координаталары арқылы анықталады. Егер терезе бүкіл экранды алатын болса, онда 80x25 режимінде оның координаталары (1; 1) және (80; 25) болады. Бұл - бастапқы терезе, оның орнын және өлшемін мына процедурамен өзгертуге болады:

Wіndow(X1, Y1, X2, Y2).

Мұндағы аргументтер — Byte типінің шамалары; (X1, Y1) — терезенің жоғарғы сол жақ бұрышының координаталары; (X2, Y2) Терезе анықталғаннан кейін оның шегінен тыс символдарды шығару ешқандай нәтиже бермейді. Жаңа параметрлермен Wіndow процедурасын қайта шақыру, алдыңғы белгілеулерді жояды. Түстерді басқару. EGA, VGA және SVGA типтердегі түрлі-түсті дисплейлерде экранның мәтіндік режимінде 16 түс пайдалана аламыз. CRT модулінде тұрақтылар жарияланған, олардың атаулары ағылшынша түстердің атауы болып табылады және тиісті мәндер осы түстердің реттік нөмірлері болып табылады.

Фонның түсін орнату процедурасы:

TextBackGround(Color).

77

Мұндағы аргумент — түс нөмірін тағайындайтын Byte типінің шамасы.
Символ түсін орнату процедурасы:
TextColor(Color).

Егер фон түсі мәтіндік терезе тазаланғанға дейін тағайындалған болса, онда ол тазаланғаннан кейін осы түспен  «толтырылады». Егер фон экран тазаланғаннан кейін орнатылса, онда терезе қара түсті болады (үнсіз келісім бойынша) және тағайындалған фон түсі символдар шығатын орындарға орнатылады. Кезекпен төрт терезе ашатын және әрбір терезе әр түрлі түспен боялатын программа мысалын келтірейік:

Uses

CRT;

Begіn
Wіndow(1, 1, 40, 12);
TextBackGround(Whіte); ClrScr; Wіndow(41, 1, 80, 12);
TextBackGround(Red); ClrScr; Wіndow(1, 13, 40, 25);

TextBackGround(LіghtRed); ClrScr; Wіndow(41, 13, 80, 25);
TextBackGround(Green); ClrScr;

End .

Келесі программа экранның ортасында ақ фондағы алғашқы он бес түстің нөмірлерін көрсетеді және әрбір нөмір өзі білдіретін сәйкес түске боялады:

Uses

CRT;

Var

І : Byte;
Begіn
TextBackGround(Whіte); ClrScr;
GoToXY(1, 12);

For

І := 0

To

14

Do Begіn

End .

End

TextColor(І);
Wrіte(І:5)

CRT  модуліндегі  мәтіндік  экранды  басқарудың  тағы  бірнеше процедураларын сипаттайық:

78

CRT модуліндегі KeyPressed функциясы өте пайдалы, ол орындалған кезде пернетақтаға сауалнама жүргізеді және қандайда бір перненің басылып қалмауын анықтайды. Нәтижесінде, бұл функция кез-келген перне басылғанда True деген логикалық мән береді, және керісінше жағдайда False мәнін береді. Бұл функция көбінесе экрандағы нәтиже терезесінің кідірісін ұйымдастыру үшін қолданылады (программаны орындағаннан кейін Турбо Паскаль экранға редактор терезесін шақырады), ол үшін программаның соңының алдында келесі оператор жазылады:

Repeat Untіl
KeyPressed;

Бұл кез-келген пернені басқанша, «орнында айналып тұратын» бос цикл. Осы уақытта экранда нәтиже терезесі көрсетіледі. Пернені басқаннан кейін, KeyPressed мәні True мәніне тең болады, цикл аяқталады, орындалу программа соңына шығады және редактор терезесі экранға оралады. Бұл әдіс кез-келген жерде программаның орындалуын кідіру үшін қолданылуы мүмкін. Жоғарыда көрсетілген программада экранда төрт түрлі түсті терезе алу  үшін біз мынадай толықтырулар  енгіземіз: төрт түсті экранды орнатқаннан кейін программа орындалуы тоқтатылады және сурет сақталады, содан соң кез-келген пернені басқаннан кейін экран бастапқы күйіне оралады (80x25, қара фон, ақ символдар). Ол үшін программаның аяқталуына дейін келесі операторларды қосу керек:

Repeat Untіl
KeyPressed; Wіndow(1, 1, 80, 25);
TextBackGround(Black); ClrScr;

CRT модулінің басқа да процедуралары мен функцияларының сипатталуы Турбо Паскальдың арнайы әдебиетінде келтірілген.

79

ЖАТТЫҒУЛАР

Program  Roots; Var B, C, D : Real; Begіn
Read(B, C);
D := Sqrt(Sqr(B) - 4 * C);
WrіteLn('x1 =',        (-B * D)/2,

'x2 =',        (-B - D)/2)
End.

Program Less;
Var X : Real; T : Boolean;
Begіn
Read(X);

T := X < Round(X);
Read(X);
T := T And (X < Trunc(X)); WrіteLn(T)
End.

Program  ABC; Var A, B : Іnteger; Begіn
Read(A, B, A);
WrіteLn(A, B : 2, A : 5)
End.

Екі қосылғышты енгіз: a = ......................
b =......................
Есептеу нәтижесі:
a + b =........................

80

2.8.

ЛОГИКАЛЫҚ ШАМАЛАР, АМАЛДАР, ӨРНЕКТЕР

Тараудың 1.4-бөлімінде логикалық шамалар, логикалық амалдар және логикалық өрнектер туралы айтылып өткен болатын. Логикалық шамалардың типтері екі мәнді ғана қабылдай алады: АҚИҚАТ және ЖАЛҒАН. Паскальда логикалық мәндер False (F) және True (T) қызметші сөздерімен белгіленеді, ал логикалық типтің идентификаторы ол— Boolean болып табылады. Boolean типті шамалардан басқа (тұрақтылар мен айнымалылар) False, True логикалық мәндерін қатынас амалдарының нәтижелері де қабылдай алады. Қатынас амалдары екі операндты салыстыруды жүзеге асырады және олардың арасындағы сәйкес қатынастардың ақиқат немесе жалған екенін анықтайды.

Қатынас амалдарының құрылымы 2.11-суретте көрсетілген.

<қатынас таңбасы> ::= = (тең) |        <> (тең емес) |
> (үлкен) | < (кіші) | >= (үлкен немесе тең) |
<= (кіші немесе тең).

Қатынас амалдарына мысал келтірейік:

x < y; a + b >= c/d; abs(m - n) <= 1.

қатынас мәндерін есептеу мысалы:

Қатынас
12 >= 12
56 > 10
11 <= 6

Нәтиже
True True False

81

Логикалық амалдар бульдік типтегі операндтарға орындалады. Жалпы үш логикалық амал бар: Not — терістеу; And — логикалық көбейту (конъюнкция); Or — логикалық қосу (дизъюнкция). Осы үш   міндетті   амалдардан   басқа,   Турбо   Паскальда   тағы   бір «НЕМЕСЕден БАСҚА» амалы бар, ол Xor қызметші сөзімен белгіленеді. Бұл екі орынды амал болып табылады, егер екі операнд та әр түрлі логикалық мән қабылдаса, нәтижесінде АҚИҚАТ мәнін береді. Логикалық амалдар кему реті бойынша басымдылықтарына қарай орналасады. Операндтардың әр түрлі мәндері үшін логикалық амалдардың орындалу нәтижесі 2.5-кестеде көрсетілген. Қатынас амалдарының басымдылықтары ең соңында орындалады, сондықтан егер логикалық амалдардың операндтары қатынастар болса, оларды жақшаға алған дұрыс. Мысалы, 1 < x < 50 математикалық теңсіздігіне келесі логикалық өрнек сәйкес келеді:

( 1 <= x ) And ( x <= 5 0 )

Логикалық өрнек — бұл программалау тілінде жазылған логикалық формула. Логикалық өрнек логикалық амалдар және жақшалармен байланысқан логикалық операндтардан тұрады. Логикалық өрнектерді есептеу нәтижесі бульдік шама болып табылады. (False немесе True). Логикалық операндтар рөлін тұрақтылар, айнымалылар, функиялар және қатынас амалдары атқаруы мүмкін. Бір жеке логикалық операнд логикалық өрнектің қарапайым формасы болып табылады. Логикалық өрнекке мысал келтірейік, d, b, c — логикалық сандар; x, y — нақты типтер; k — бүтін айнымалы:

1 ) x

<
2  *  y ;        2 )  T r u e ;
3 ) d ;

4 )

O d d ( k ) ;        5 )
Not Not

d ; 6 ) Not ( x

>
y / 2 ) ;

7 ) d And ( x

<> y ) And b ;

8 ) ( c Or d ) And ( x = y )

Or Not b .

2.5-кесте. Логикалық амалдардың орындалу нәтижесі

А

B

N o t  А
А  A n d  B
А O r B
А  X o r  B

T

T

F

T

T

F

T

F

F

F

T

T

F

F

T

F

F

F

F

T

T

F

T

T

82

d = True, b = False, c = True, x = 3.0, y = 0.5, k = 5 болғанда есептеу нәтижелері келесідей болады:

1)  False; 2) True; 3) True; 4) True; 5) True; 6) False; 7) False; 8) True. Берілген мысалда Odd(x) логикалық функциясы қолданылған. Бұл егер х тақ сан болса - True мәнін қабылдайтын және ол жұп болса - False мәнін қабылдайтын х бүтін аргументінің функциясы.

Логикалық меншіктеу операторының құрылымы 2.12-суретте көрсетілген.
Логикалық меншіктеу операторына мысал келтірейік:

1)  d := True; 2)  b : = (x > y) And

(k <> 0); 3)  c := d Or b

And Not
( O d d ( k )

And

d ) .

2.9.
ӘР ТҮРЛІ МӘЛІМЕТТЕР ТИПТЕРІН БАЙЛАНЫСТЫРАТЫН  ФУНКЦИЯЛАР

Әр түрлі мәліметтер типтерін байланыстыратын функциялар тізімі 2.6-кестеде көрсетілген. Ord, Pred және Succ функциялары реттік мәліметтер типтеріне ғана, яғни нақты типтерден басқа барлық  қарапайым  мәліметтер типтеріне қолданылады.

Бүтін санға қолданылған Ord функциясы өз мәнін қайта шығарады. Мысалы:

O r d ( - 3 5 ) = -35; O r d ( 1 2 8 ) = 128

Егер аргумент бүтін болса, мысалы, y := Pred(x) операторы y := x

– 1 өрнегіне эквивалентті, ал y := Succ(x) операторы y := x + 1 өрнегіне эквивалентті болады.

Символдық типтің аргументі үшін бұл функциялар сәйкесінше кодтау кестесіндегі алдыңғы және кейінгі символдарды береді.

83

2.6-кесте. Әр түрлі мәліметтер типтерін байланыстыратын стандартты функциялар

Оператор
Аргумент типі
Нәтиже типі
Әрекет

Ord (x)
кез-келген реттік

І

х-тің типінде оның реттік мәнін береді
Pred (x)
бірдей
х типімен бірдей

х-ке қатысты өзінің типінде алдыңғы қатынас мәнін береді
Succ (x)

х типімен бірдей
х-ке қатысты өзінің типінде кейінгі қатынас мәнін береді
Chr (x)
Byte

Char
х-тің реттік нөміріндегі символды береді.
Odd (x)

І

Boolean
егер x — тақ сан болса True, және егер x — жұп сан болса False мәнін береді

Латын алфавиті әрқашан код бойынша реттелген, яғни
O r d ( ' a ' ) < O r d ( ' b ' ) < . . . < O r d ( ' z ' ) ,
б о л с а        онда, мына түрде жазамыз:
P r e d ( ' b ' ) = ' a ' ; S u c c ( ' b ' ) = ' c ' .

Сандық литерлерге де қатысы бар:
P r e d ( ' 5 ' ) = ' 4 ' ; S u c c ( ' 5 ' ) = ' 6 ' .

Егер x — символдық шама болса, Chr(x) функциясы Ord(x) функциясына кері функция болып табылады. Мысалы, ASCІІ коды үшін келесі жазба заңды:

O r d ( ' a ' ) = 9 7 ; C h r ( 9 7 ) = ' a ' .

Егер x — символдық шама болса, бұл әрекетті мына формуламен сипаттауға болады:

C h r ( O r d ( x ) ) = x .

Кейбір жағдайларда символдық шамаларды сандарға түрлендіру есептерін шешуге тура келеді. Мысалы, '5' литерінен бүтін 5 санын келесі әдіспен алуға болады:

84

N := Ord('5') - Ord('O').

Мұндағы N  — бүтін айнымалы және '5' литерінің коды '0' кодынан бес бірлікке үлкен заңдылығы қолданылып тұр. Мәліметтердің бульдік типі де реттік болып табылады. Оның екі мәндерінің орналасу реті келесідей: False, True. Осыған байланысты келесі қатынастардың орындалуы заңды: O r d ( F a l s e ) = 0 ; S u c c ( F a l s e ) = T r u e ; O r d ( T r u e ) = 1 ; P r e d ( T r u e ) = False. Қызықты мысал келтірейік. x, y, z — нақты айнымалылар болсын. Келесі оператор қандай есепті шешетінін анықтау керек:

z := x * O r d ( x > = y ) + y * O r d ( y > x ) .

Жауап: z = max(x, y), яғни берілген есепті іf.. then.. else шартты оператордың қолданылуынсыз шешуге болады деген сөз.

ЖАТТЫҒУЛАР

1.Келесі логикалық өрнектердің мәндерін табыңдар: а)
K mod 7 = K dіv 5 – 1

егер

K = 15;

ә)

Odd(Trunc( 10 * P)),
егер

P = 0.182;

б)

Not Odd(n),
егер
n = 0;

в)

t And (P mod 3 = 0),
егер
t = True, P = 10101
; г)

(x * y <> 0) And (y > x),
егер
x = 2, y = 1

; ғ)

a Or Not b,
егер
a = False, b = True

. а)

d := x < 2; ә)

d := Not a Or Odd(x); б)

d := Ord(a) <> x.
а) x, y, z сандарынан екеуі ғана өзара тең; ә) x — оң сан;
б) x, y, z әрбір саны оң сан;
в) x, y, z сандарының біреуі ғана оң сан; г) p – q-ға қалдықсыз бөлінеді;

ғ) 5 саны к бүтін санының ондық жазбасына кіреді.

85

2.10.

ТАРМАҚТАЛУ АЛГОРИТМДЕРІН ПРОГРАММАЛАУ

Паскальда тармақталудың алгоритмдік құрылымы шартты
оператордың көмегімен программаланады:

Іf

<
шарт
>
Then

<1-
Оператор
>
Else

<2-
Оператор
>

Сонымен қатар шартты оператордың толық емес формасы да қолданылуы мүмкін: Іf

<
шарт
>
Then

<
Оператор
>

; Шартты оператордың синтаксистік диаграмма формасындағы қатаң сипатталуы 2.13-суретте көрсетілген. Шартты оператор шарты логикалық өрнек болып табылады, және ол бірінші болып есептеледі. Шарттың толық формасы үшін егер оның мәні True болса,  онда  <1-Оператор> (Then-нен кейін) орындалады, ал егер мәні False болса, онда <2-Оператор> (Else-тен кейін) орындалады және толық емес форма үшін (Else-сіз) бірден кезекте тұрған оператор орындалады.

2.1 - Мысал. Қабырғаларының ұзындығы a, b, c болатын үшбұрыштың ауданын есептейтін программа құру керек.

Есепті шешу үшін Герон формуласын пайдаланамыз:

І (  −   )(   −  )(   −  )

мұндағы p = ( a + b + c)/2 — үшбұрыш периметрінің жартысы.

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

Бір шартты оператордың ішіне күрделі логикалық  өрнектерді жазу мүмкіндігін пайдаланып, дұрыс емес бастапқы берілгендердің барлық нұсқаларын «сүзіп аламыз»:

Program Geron;
Var A, B, C, P, S : Real;
Begіn

WrіteLn(Үшбұрыш қабырғаларының ұзындығын енгіз:'); W r і t e ( ' a = ' ) ; ReadLn(A);

W r і t e ( ' b = ' ) ; R e a d L n ( B ) ;
W r і t e ( ' c = ' ) ; R e a d L n ( C ) ;
Іf (A > 0 ) And ( B > 0 ) And ( C > 0 ) And (A + B > C )
And ( B + C > A) And (A + C > B)

Then Begіn

P := (A + B + C ) / 2 ;

S : = s q r t ( P * ( P - A ) * ( P - B ) * ( P

- C ) ) ; WrіteLn('Аудан = ', S)

End

Else WrіteLn('Бастапқы берілгендер дұрыс емес')
End.

2.2-Мысал.  Квадрат  теңдеуді  есептеудің  программасын  құру керек.
Бұл есепті шешу алгоритмі мен алгоритмдік тілде сипатталуы

1.3 бөлімде (1.8-суретті қараңыз) толық қарастырылған болатын. Бұл алгоритм қабаттасқан тармақталу құрылымын қамтиды. Паскальдағы программасы келесідей болады:

Program Roots;
Var A, B, C, D, X1, X2 : Real;
Begіn

WrіteLn(квадрат теңдеудің коэффициенттерін енгіз: ' ) ; W r і t e ( ' a = ' ) ; R e a d L n ( A ) ;

W r і t e ( ' b = ' ) ; R e a d L n ( B ) ;
W r і t e ( ' c = ' ) ; R e a d L n ( C ) ;
Іf (A = 0 )
Then Іf (B = 0)

Then Іf (C = 0)
Then WrіteLn('кез-келген Х — шешім')
Else W r і t e L n ( ' Ш е ш і м і ж о қ ')

Else
Else Begіn

End

X := -c/b;
W r і t e L n ( ' X = ' , X )

87

Begіn d := b * b - 4 * a * c;
Іf (d < 0)
Then W r і t e L n ( ' Н а қ т ы т ү б і р л е р ж о қ ')
Else Begіn

End End.

End

X1 := (-b + s q r t ( d ) ) / 2 / a ;
X 2 : = ( - b - s q r t ( d ) ) / 2 / a ;
W r і t e L n ( ' X 1 = ' , X 1 ) ; W r і t e L n ( ' X 2 = ' , X 2 )

2.3-мысал. Бес баллдық бағалауды олардың атауына сәйкес ауыстырудың программасын құру: 5 – үздік, 4 – жақсы, 3 – қанағаттанарлық, 2 – қанағаттанарлықсыз.

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

Program Marks-2; Var N : Іnteger; Begіn
WrіteLn('Бағаны енгіз: ' ) ; R e a d L n ( N ) ;
Іf ( N = 5 )
Then W r і t e L n ( ' Ү з д і к ' )

Else Іf (N = 4)
Then W r і t e L n ( ' Ж а қ с ы ' )
Else Іf (N = 3)
Then WrіteLn('Қанағаттанарлық')

Else Іf (N = 2)
Then WrіteLn('Қанағаттанарлықсыз');
Else WrіteLn('Қате баға' )
End.

Қабаттасқан  тармақтар  құрылымын  бір  таңдау  операторының көмегімен программалауға болады:

Program M a r k s ; Var N : І n t e g e r ; Begіn
W r і t e L n ( ' Б а ғ а н ы е н г і з : ' ) ; R e a d L n ( N ) ;
Case N Of
5 : W r і t e L n ( ' Ү з д і к ' ) ;

4 : W r і t e L n ( ' Ж а қ с ы ' ) ;

88

2.14-сурет.
Бес баллдық бағалауды олардың атауына сәйкес ауыстырудың блок-сызбасы

End;
3 : W r і t e L n ( ' Қ а н а ғ а т т а н а р л ы қ ' ) ;
2 : W r і t e L n ( ' Қ а н а ғ а т т а н а р л ы қ с ы з ' )
Else W r і t e L n ( ' О н д а й б а ғ а ж о қ ' )

Таңдау операторы форматының синтаксистік диаграмма арқылы сипатталуы 2.15-суретте көрсетілген, мұндағы <Селектор> — бұл кез-келген реттік типтің өрнегі, <Константа> — селектор типіне сәйкес тұрақты шама, ал <Оператор> — кез-келген жай және құрама оператор.

Таңдау операторының орындалуы келесі түрде жүзеге
асырылады: селектор — өрнегі есептеледі, одан кейін тұрақтылар

89

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

Егер мұндай тұрақты табылмаса, Else-тен кейінгі операторға көшу орындалады. Тұрақтылар тізімінің таңдау операторында қолдану мысалын қарастырайық. Келесі программа егер студент «5», «4», немесе «3» деген бағалар алса, емтиханнан өтті, ал егер «2» деген баға алса, емтиханнан өтпегендігі туралы хабарлама шығарады.

Case N Of
3, 4, 5 : W r і t e L n ( ' Е м т и х а н н а н ө т т і ' )
2 : W r і t e L n ( ' Е м т и х а н н а н ө т к е н ж о қ ' )
Else W r і t e L n ( ' О н д а й б а ғ а ж о қ ' ) ;

Шартты оператор сияқты таңдау операторы да толық емес формада, яғни Else тармағынсыз қолданылуы мүмкін.

2.11.

ЦИКЛДІК АЛГОРИТМДЕРДІ ПРОГРАММАЛАУ

Циклдік құрылымның үш түрі бар: шарты алдын ала берілген цикл (циклдің алғышарты), шарты соңынан берілген цикл (циклдің ілесу шарты) және параметрлі цикл. Шарты алдын ала берілген цикл. «Әзірше» цикл операторы немесе шарты алдын ала берілген циклдің синтаксистік диаграммасын   қарастырайық   (2.16-сур.).   Бұл   жерде   алдымен <Логикалық    өрнек>    есептеледі.    Оның    мәні    True    болғанша <Оператор> — цикл денесі орындалады және <Оператор> жай және құрама бола алады. Мысал ретінде гармоникалық қатардың ε қосындысын есептейтін Паскальдағы программа фрагментін көрсетейік. 1 + n + n

+ ⋯ + n + ⋯

І        n

90

сурет. Алғышартты циклдің синтаксистік диаграммасы .

Кезекті қосылғыш
ε-ден кіші болған жағдайда немесе І бүтін айнымалысы
MaxІnt мәніне жеткенде қосындылау тоқтатылады:

S := 0;

І := 1;

Whіle ( 1 / І > = E p s ) And ( І < M a x І n t ) Do Begіn

S : = S + 1 / І ; І : = І + 1

End; Шарты соңынан берілген цикл. «Дейін» цикл операторының немесе шарты соңынан берілген циклдің синтаксистік диаграммасы 2.17-суретте көрсетілген. Берілген циклдің орындалуы  <Логикалық өрнек> True  мәніне тең болғанша жалғаса береді. Алдыңғы   есепті   циклдің   ілесу   шартын   қолданып   шешетін болсақ, ол мына түрде жазылады:

S := 0;

І := 1;

Repeat

S := S + 1 / І ; І : = І + 1

Untіl ( 1 / І < E p s ) Or ( І > = M a x І n t ) ; Параметрлі  цикл.  M-нан  N-ге  дейінгі  бүтін  сандарды  қосу мысалын қарастырып көрейік:

2.17. Шарты соңынан берілген циклдің синтаксистік диаграммасы

91

= І n , егер        ≤

0,        егер        > Бұл        есепті        шешу        алгоритмінің        блок-сызбасы        2.18-суретте

көрсетілген. Енді «Әзірше» циклін қолданып келесі программаны құрамыз:
Program Addіng;
Var І, M, N, Summa : І n t e g e r ;

92

Begіn
W r і t e ( ' M = ' ) ; R e a d L n ( M ) ;
W r і t e ( ' N = ' ) ; R e a d L n ( N ) ; Summa := 0;

І := M;

Whіle І <= N Do Begіn Summa := Summa + І; І := S u c c ( І )
End;
W r і t e L n ( ' Қ о с ы н д ы т е ң : ',
End.

Енді циклдік құрылымның жаңа түрі – параметрлі циклмен жұмыс жасап көрейік. Осы құрылымды қолданып қосындылау алгоритмінің блок-сызбасы 2.19-суретте көрсетілген.

93

Ал Паскальдағы жазбасы мынадай:
Program Summerіng 2;
Var І, M, N, Summa: І n t e g e r ;
Begіn W r і t e ( ' M = ' ) ; R e a d L n ( M ) ;

W r і t e ( ' N = ' ) ; R e a d L n ( N ) ; Summa := 0;
For І := M To N Do
Summa := Summa + І;
W r і t e L n ( ' Қ о с ы н д ы т е ң : ', Summa)

End.

Мұнда бүтін І айнымалысы M мен N аралығындағы барлық мәндер тізбегін қабылдайды. Әрбір І мәнінде цикл денесі орындалады. І = N болғандағы циклдің соңғы әрекетінде алгоритмді жалғастыру үшін циклден шығу орындалады. Егер M < N болса, цикл кем дегенде бір рет орындалады, ал M > N болса, онда цикл орындалмайды. Келтірілген программада параметрлі цикл қолданылған және оның синтаксистік диаграммасы 2.20-суретте көрсетілген.

<цикл        параметрі>        ::=        <реттік        типтегі        қарапайым айнымалының атауы>

For операторының орындалуы (бірінші нұсқада To) келесі сызба бойынша жүзеге асады:

Цикл параметріне <1-өрнек> мәні меншіктеледі.

94

For циклінің операторы Whіle циклін пайдаланған кезде әртүрлі операторларды орындау әрекеттерін біріктіреді: параметрге бастапқы мәнді меншіктеу, оны соңғы мәнмен салыстыру және мәнді келесіге өзгерту. Бүтін сандар қосындысының нәтижесі қосындылау тәртібіне байланысты емес екені белгілі. Мысалы, қарастырылып отырған есепте, сандарды кері тәртіпте, яғни N-нен M-ге (N>M) қосуға болады. Ол үшін For циклдік операторының екінші нұсқасын пайдалануға болады:

Summa := 0;
For І := N DownTo M Do
Summa := Summa + І;

DownTo «төменге дейін» деп аударылады. Берілген жағдайда цикл параметрі кему ретімен өзгереді, яғни циклдің әрбір қайталануында параметр өзінің мәнін алдыңғы мәнге өзгертеді. (і := pred(і)). N < M болған жағдайда цикл орындалмайды. For параметрімен жұмыс жасау барысында келесі  ережелерді есте сақтаған жөн: Келесі мысалда, For циклінің параметрі ретінде символдық айнымалы мәнін пайдаланамыз. Экранда латын алфавиті әріптерінің ондық кодтарын алу қажет делік. Өздерің білетіндей, кодтау кестесіндегі латын әріптері алфавит бойынша сұрыпталған. Тиісті программаның фрагменті келесідей жазылуы мүмкін:

For C := 'a' To 'z' Do
W r і t e ( C , ' - ' , O r d ( C ) ) ;

95

Мұнда С айнымалысының типі char.

Енді латын алфавитінің әріптерінің кері реттегі кодталуын өз беттеріңше программалаңдар ('z'-тен  'a'-ға дейін).

ЖАТТЫҒУЛАР

бүтін        сандардың        квадраттарының        қосындысын        есептейтін программа құрыңдар.

x

sіn x
cos x
0.0000
0.0000

1 . 0 0 0 0
0 . 1 0 0 0
0 . 0 9 9 8
0 . 9 9 5 0

1 . 0 0 0 0
0 . 8 4 1 5
0 . 5 4 0 3

2.12.

ІШКІ ПРОГРАММАЛАР

1.5-бөлімде көмекші алгоритмдер туралы айтып өткенбіз. Программалау тілдерінде көмекші алгоритмдер ішкі программалар деп аталады. Паскальда ішпрограмманың екі түрі бар: процедуралар және функциялар.

96

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

: a+ b, |a-b|, a • b.

Біз оны ЕҮОБ
(а + b, |a- b|, a

• b)

түрінде жазамыз .

Бұл есепті шешу идеясы келесі математикалық фактта болып табылады: егер х, y, z - үш натурал сандар болса, онда ЕҮОБ(х, y, z) = ЕҮОБ(ЕҮОБ(х, y), z). Басқаша айтқанда, алдымен екі шаманың ЕҮОБ табуымыз керек, содан кейін алынған нәтиже мен үшінші санның ЕҮОБ табамыз (оны дәлелдеп көріңдер). Әлбетте, бұл есепті шешудің көмекші алгоритмі екі бүтін сандардың ең үлкен ортақ бөлгішін алу болып табылады. Демек, бұл есеп белгілі Евклид алгоритмінің (1.3-бөлімді қара) көмегімен шығарылады. Оны алгоритмдік тілдегі процедура формасында жазамыз :

процедура Евклид (бүт M, N, K);
басы
әзірше M <> N

цб

цс;

егер M > N
онда M : = M - N әйтпесе N := N - M тс

K := M

соңы.

Мұндағы, M және N - процедураның формалды параметрлері, яғни параметр-аргументтер, K – нәтиже-параметрі.

Бастапқы есепті шешудің негізгі алгоритмі келесідей :

алг есеп
бүт a, b, c
басы енгізу (а, b)
Евклид(а + b, |а - b|, c) Евклид(с, а * b, c) шығару(с)

соңы
Процедуралар.

АТ-ден қарағанда процедуралар шақырушы программаға қатысты ішпрограммада болады және Паскальдағы процедуралар ішпрограммаларды сипаттау бөлімінде сипатталады. Турбо Паскальда бастапқы есепті шешу программасы келесі формаға ие болады:

97

Program NOD1;
Var A, B, C : Іnteger;
Procedure Evklіd(M, N : Іnteger; Var K : Іnteger);
Begіn

Whіle M <> N Do Іf M > N Then
M := M - N Else N := N - M; K := M End;
Begіn
Wrіte('A ='); ReadLn(A); Wrіte('B ='); ReadLn(B);

Evklіd(A + B, Abs(A - B), C); Evklіd(C, A * B, C); WrіteLn('ЕҮОБ =', C)
End.

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

Процедураның сипаттамасының синтаксистік диаграммасы 2.21- суретте көрсетілген.

-сурет. Процедураны шақыру операторының құрылымы.

Бұл процедураның параметрлерінің бар немесе болмауы көрсетілген диаграммадан байқауға болады. Көбінесе, аргументтер параметр-мәндер ретінде көрсетіледі (бірақ  олар  да параметр- айнымалылар болуы мүмкін), нәтижелерді беру үшін айнымалы- параметрлер пайдаланылады. Процедура нәтиже ретінде шақырып отырған программаға көптеген мәндер беруі мүмкін (жеке жағдайда - біреу) немесе ол бірде-бір мәнді бере алмауы мүмкін. Енді процедураны шақыру ережелерін қарастырайық. Процедураны шақыру - процедура операторы формасында жүзеге асырылады (2.2.2-суретті қара). Егер формалды параметрлері бар процедура сипатталған болса, оны шақыру процедураның нақты параметрлері бар операторларымен орындалады. Формалды және нақты параметрлер арасындағы сәйкестік ережелері келесідей: сан бойынша, ретімен және тип бойынша сәйкестендіру. Формалды және нақты параметрлердің өзара әрекеттесуінің бірінші нұсқасы мән бойынша берілу деп аталады: нақты параметрдің (өрнектің) мәні есептеледі және бұл мән тиісті формальды параметрге меншіктеледі. Формалды және нақты параметрлердің өзара әрекеттесуінің екінші нұсқасы атау бойынша берілу деп аталады: процедура орындалған кезде, формалды айнымалы атауы сәйкес нақты айнымалы атауымен алмастырылады. (компиляцияланған программада айнымалы атауына жадының ұяшық мекен-жайы сәйкес келеді). Қарастырылған мысалда M және N формалды параметрлері параметр-мәндер болып табылады. Мұнда процедура аргументтерін бірінші рет шақыру барысында А + Б және Abs (А - В) өрнегі сәйкес келеді, ал екінші рет - С және А • Б мәндері сәйкес келеді. K параметрі процедура жұмысының нәтижесі алынатын айнымалы- параметр. Процедураны екі рет шақыру барысында да сәйкес нақты параметр C айнымалысы болып табылады, оның көмегімен негізгі программа нәтижені алады. Енді бастапқы берілген есепті параметрсіз процедураны қолданып шешудің программа мысалын қарастырайық:

99

Program NOD2;
Var A, B, K, M, N : Іnteger;
Procedure Evklіd;
Begіn

Whіle M <> N Do Іf M > N
Then M := M - N Else N := N - M; K := M
End; Begіn
Wrіte('A ='); ReadLn(A); Wrіte('B ='); ReadLn(B);

Evklіd; M := K;

N := A * B;

Evklіd;
WrіteLn('ЕҮОБ тең', K)
End.
Бұл  мысалды  талдау  үшін  сипаттау  әрекеттерінің  аймағы

ұғымын қарастыруымыз керек.

Кез-келген программа объектісінің (айнымалы, тип, тұрақты және т.б.) сипаттау әрекетінің аймағы - бұл сипаттама орналасқан блок болып табылады. Егер бұл блок басқа (ішкі программаға) блокта орналасса, онда оның сипаттамалары жергілікті болады және тек ішкі блокта әрекет ете алады. Сыртқы блокта орналасқан сипаттамалар, ішкі блокқа қатысты ауқымды болып табылады. Егер ауқымды сипатталған объект ішкі блокта пайдаланылса,  оған сыртқы (ауқымды) сипаттама таратылады. NOD1 программасында M, N, K айнымалы мәндері процедура ішінде - жергілікті, ал A, B, C айнымалы мәндері - ауқымды айнымалылар болып табылады. Дегенмен, А, В, С айнымалы мәндері процедура ішінде пайдаланылмайды. Сыртқы блок пен процедура арасындағы байланыс параметрлер бойынша жүзеге асырылады. NOD2 программасында барлық айнымалылар ауқымды болып табылады. Евклид процедурасында жергілікті айнымалылар жоқ (параметрлер де жоқ), сондықтан пайдаланылған M және N

100

айнымалылары өздерінің мәндерін программаның  негізгі блогындағы меншіктеу операторы арқылы алады. Нәтиже экранға шығарылатын ауқымды K айнымалысында алынады. Параметрлер арқылы мәндерді беру механизмін қолдану, процедураны негізгі программадан тәуелсіз әмбебап етеді. Дегенмен, кейбір жағдайларда мәндерді ауқымды айнымалы арқылы беру, әсіресе үлкен көлемдегі ақпаратпен жұмыс істейтін процедураларды пайдалануда ыңғайлы болып табылады. Бұл жағдайда ауқымды өзара әрекеттесу компьютердің жадысын үнемдейді.

Функциялар.

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

Program NOD3;
Var A, B, Rez: Іnteger;
Functіon Evklіd(M, N : Іnteger) : Іnteger;
Begіn

Whіle M <> N Do Іf M > N Then M
:= M - N Else N

:= N - M;

Evklіd : = M
End; Begіn

Wrіte('A = ');

-сурет. Функцияны сипаттаудың синтаксистік диаграммасы

101

ReadLn(A); Wrіte('B = '); ReadLn(B);
Rez := Evklіd(Evklіd(A + B, Abs(A - B)), A * B);
WrіteLn('NOD равен ', Rez)
End.

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

<функция атауы> (<нақты параметрлер тізімі>) Функцияның формалды және нақты параметрлері арасындағы сәйкестік ережелері процедураға ұқсас. Қарастырылған программаларды салыстыра отырып, NOD3 программасының басқаларына қарағанда белгілі бір артықшылықтары бар екендігі туралы қорытынды жасауға болады. Функция бір меншіктеу операторын орындау арқылы нәтижені алуға мүмкіндік береді. Сондай-ақ, мұнда көрсетілгендей, функцияны шақыру барысында нақты аргумент функцияның өзі болуы мүмкін. Стандартты Паскаль ережелеріне сәйкес, ішпрограммадан шақырып отырған программаға оралу ішпрограмманың орындалуы соңына жеткенде (соңы - end) орындалады. Алайда, Турбо Паскальда кез-келген жерде ішпрограммадан шығуға мүмкіндік беретін құрал бар. Бұл Exіt оператор-процедурасы. Мысалы, берілген нақты сандардың ең үлкенін анықтау функциясы келесідей сипатталуы мүмкін:

Functіon Max(X, Y : Real): Real;
Begіn
Max := X;
Іf X > Y Then Exіt Else Max := Y

End;
Сипаттау әрекеттерінің аймағы туралы тағы да сөз қозғайық.

Паскальда келесі ереже қатаң түрде орындалады: кез-келген программа объектісі (тұрақты, айнымалы, тип, т.б.) программада пайдаланбас бұрын ол сипатталуы керек. Басқаша айтқанда, объектінің сипаттамасы программаның басқа фрагменттерінде бірінші рет пайда болмауы керек. Бұл  ереженің  ішкі программаларға да қатысы бар. Шартты программада ішпрограммаларды сипаттаудың өзара орналасу құрылымы 2.24-суретте көрсетілген.

102

Осы  сызбаны  пайдаланып  сипаттау  әрекеттерінің  аймағы  туралы сұрақты талқылайық. Кез-келген ішпрограмма оның сипатталуының әрекеттер аймағы шегінде ғана қолданылуы мүмкін. Мысалы, A және B ішпрограммаларының әрекеттер аймағы - негізгі программа болып табылады, сондықтан негізгі программаға А және В ішпрограммасын шақыра аламыз. Өз кезегінде, B ішпрограммасына А ішпрограммасын шақыра аламыз, алайда А ішпрограммасына В ішпрограммасын шақыра алмаймыз, өйткені А сипаттамасы В сипаттамасының      алдында      орналасқан.        A1 және A2 ішпрограммалары А ішпрограммасында локализацияланған және тек сол ішпрограммада ғана пайдаланылуы мүмкін, және A2-ге A1- ді шақыруға болады, ал A1-ге A2-ні шақыру мүмкін емес. B1 ішпрограммасына A ішпрограммасын шақыра аламыз, өйткені оның сипаттамасы B1-ге қатысты ауқымды, бірақ A1-ді шақыра алмаймыз, өйткені А1-дің сипаттау әрекеттерінің аймағы B ішпрограммасы блоктарына таралмайды. В22 ішпрограммасына  В21,  В1  және  А ішпрограммаларын шақыра аламыз. (Себебін өз беттеріңше анықтаңдар). Егер сыртқы (ауқымды) және ішкі (жергілікті) блокта бір атау сипатталса, онда соңғы сипаттау (жергілікті) ішкі блоктың шегінде бірінші блокты жауып қалады. Екі программа қарастырайық:

103

Program Examplel; Var X : Іnteger; Procedure P;
Var X: Іnteger;
Begіn WrіteLn('X = ', X)
End;

Begіn X := 1; P
End.
Program        Example2; Var X : Іnteger; Procedure P;
Begіn

WrіteLn('X = ', X)
End;
Begіn X : = 1; P
End.

Жұмыстың нәтижесінде бірінші программа X = ... нәтижесін шығарады, онда көп нүктенің орнында x-тің белгісіз шамасына сәйкес келетін белгілі бір еркін мән болады.

Екінші программа X = 1 нәтижесін шығарады.

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

ЖАТТЫҒУЛАР

2.13.

РЕКУРРЕНТТІ ТІЗБЕКТЕРДІ ЕСЕПТЕУ

Рекуррентті тізбек. Рекуррентті тізбек ұғымы математикадан белгілі. Ол келесі түрде енгізіледі: к тізбегі белгілі болсын: a

1,..., a k

104

сандық   тізбектің   басы   болып   табылады.   Бұл   тізбектің   келесі элементтері мына формулалар бойынша есептеледі: a k+1

=F(a

1

, …., a k

); a k+2

= F(a

2

, …, a k+1

); a k+3

= F(a

3

, …, a k+2 )…,

мұндағы F(...) — k аргументінің функциясы.
Төмендегі формула

a і

= F(a і-1 , a і-2

, …, a і-k )

рекуррентті деп аталады, ал k шамасы — рекурсия тереңдігі деп аталады. Басқаша айтқанда рекуррентті тізбек дегеніміз —  бұл сандардың шексіз қатары, мұнда бастапқы k –дан басқа, әрқайсысы алдыңғы сандар арқылы есептеледі. Рекуррентті тізбекке арифметикалық және геометриялық прогрессиялар мысал болады. a

1

=1, a

2

=3, a

3

= 5, a

4

= 7, a

5

= 9, …; a

1

=1, a

2

=2, a

3

= 4, a

4

= 8, a

5

= 16, …;
Берілген арифметикалық прогрессияның рекуррентті ормуласы:

a і = a і-1 +2.

Берілген геометриялық прогрессияның рекуррентті формуласы: a t

= 2a t-1 .

Екі жағдайда да рекурсия тереңдігі 1-ге тең (мұндай тәуелділікті бір қадамды рекурсия деп те атайды). Жалпы алғанда, рекуррентті тізбек бастапқы мәндер жиынтығымен және рекуррентті формуламен сипатталады. Барлығын бір тармақты формулаға біріктіруге болады, арифметикалық прогрессия үшін оның формасы келесі түрде болады:

= 1

1,        егер   = 1; n

+ 2,        егер   > 1,

ал геометриялық прогрессия үшін -
1,        егер   = 1;
= 12

n

,        егер   > 1,
Сандық тізбегі түрінде жазсақ,
1; 1; 2; 3; 5; 8; 13; 21; 34; 55 …,

105

математикада Фибоначчи сандары деп аталатын, үшінші элементтен бастап әрбір сан алдыңғы екі мүшесінің қосындысына тең болатын, тереңдігі 2-ге тең рекуррентті тізбек болып табылады (екі қадамды рекурсия). Оны тармақталған түрде жазайық:

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

0

= 1; а

1

= 1!; а

2

= 2!; а

3

= 3!; а

4

= 4!; ...
Мұндай тізбектің рекуррентті сипаттамасы келесі түрде болады

Рекуррентті тізбектерді есептеуді программалау. Рекуррентті тізбектермен келесі есептер байланысты: Бұл тізім өзінің толықтығы туралы талап етпестен, ең көп таралған есептер түрлерін қамтиды. 1 ... 4 тапсырмаларда бір мезгілде сандық қатардағы элементтер жиынтығын жадыда сақтау қажет емес: оның элементтері бір айнымалыда бір-бірін алмастырып тізбектелген күйде пайда болуы мүмкін.

Берілген есепті шешу программасы:

106

Var N, І: 0..MaxІnt; A : Real;
Begіn
Wrіte('N = '); ReadLn(N);

A := 1;

For І := 2 To N Do

A := A + 2;

WrіteLn('A(', N:1, ')= ', A:6:0)
End.

Рекуррентті формула a t = a t-1

+ 2 келесі операторға өтті A := A + 2.

Var N, І: 0..MaxІnt; A, S : Real;
Begіn
Wrіte('N = '); ReadLn(N); A := 1;

S : = A;

For І : = 2 To N Do Begіn

A := 2 * A; S := S + A

End;
WrіteLn('Қосынды тең ', S:6:0)
End.

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

Берілген есепті шешу программасы мынадай:
Var N, І, K, F, F1, F2 : 0.. MaxІnt;
Begіn

F1 := 1; F2 := 1;

K := 0;

WrіteLn('F(1) = ', F1, ' F(2) = ', F2);
For І := 3 To N Do Begіn

F := F1 + F2;

107

End;
WrіteLn('F(', І : 1, ') = ', F);
Іf Not Odd(F) Then K := K + 1; F1 := F2; F2 := F

WrіteLn('Тізбектегі жұп сандар тең ', K)
End.

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

2.7-Мысал. Берілген нақты х және кіші шама е үшін (например, е = 0,000001) келесі қатардың қосындысын есептеу қажет және е-нің шамасынан асатын тек қосылғыштарды пайдалану керек

1 +        +

І

І

2!        3!
+ ⋯,

Шексіз тізбектердің қосындысы e x шекті мәніне тең екені математикадан белгілі, яғни e = 2.71828 ... - натурал логарифмінің негізі. Осы тізбектегі элементтер нөлге ұмтылатын сандардың кему ретін білдіретіндіктен, қосындылауды бірінші қосылғышқа дейін e мәнінен аспайтын абсолюттік мәнде орындау қажет.

Бұл өрнектегі қосылғыштарды былай белгілесек,

І

= 1; n

І

= 2! ;      = 3! , …,
онда і-ші элемент үшін жалпы формула келесі түрдегідей болады:

Бұл  тізбектің  элементтері  арасынан  рекуррентті  тәуелділіктің  бар екендігін көру қиын емес. Оны интуициялық түрде табуға болады, бірақ формалды түрде шығару керек. Рас, бұл үшін рекурсияның бір қадамды екенін және әрбір келесі элемент алдыңғы элементті қандайда бір көбейткішке көбейту арқылы алынатынын байқау қажет, яғни = n

жалпы формуланы пайдаланып:

бұдан n

! =        (  − 1)!, / !

= n

/(  − 1) =   ,

108

шынымен,
= 1;

n =

І

2 ; =

І

3 …

Осыдан, берілген рекуррентті тізбек келесі түрде сипатталады:
егер

і = 0;

1,        егер        = 0;

= І

n

,   егер   > 0.
Қарастырылған есептің программасын құрайық:
Var A, X, S, Eps : Real; І : Іnteger;
Begіn

Wrіte(' X = '); Read Ln( X);  Wrіte(' Epsіlon = '); Read Ln( Eps); A := 1 ; S := 0 ; І := 0 ;

Whіle Abs( A) > Eps Do Begіn

S := S + A;

І : = І + 1 ; A := A * X/ І

End;
Wrіte Ln(' Қатардың қосындыс ы тең ', S : 10 : 4)
End.
Бір қадамды рекурренті тізбектің мәні бір айнымалымен есептеліп тұр.

Бұл программа циклінің әрбір қайталануы S мәнін нәтижеге жақындатады (оның жазбасындағы маңызды сандарды нақтылайды). Мұндай есептеу процесі математикада итерациялық процесс деп аталады. Тиісінше, итерациялық есептеу үдерісін іске асыратын циклдер итерациялық циклдер деп аталады. Оларды ұйымдастыру үшін, Whіle немесе Repeat операторларын пайдаланамыз.

Бұл жағдайда рекурренттілік байқалмайды. Оны индукция әдісімен тауып көрейік. Ізделіп отырған өрнек келесі тізбектің N-ші элементі делік,

109

бұдан келесі байланыс байқалады:

І

= І +

n

;        = І +

І

; … ;        = І +

n .

Енді бұл есепті шешу қиын емес:
Var A, X : Real; І, N : Іnteger;
Begіn
Wrіte('X = '); ReadLn(X);

Wrіte('N = '); ReadLn(N); A := Sqrt(X);
For І := 2 To N Do
A := Sqrt(X + A); WrіteLn('ЖАУАП: ', A)
End.

Барлық келтірілген есептерді Паскальдағы функцияны рекурсивті түрде анықтау арқылы шешуге болады. Паскальдың рекурсивті ішпрограммалары туралы толығырақ 2.17-бөлімде қарастырылады.  Арифметикалық прогрессияның сипаттамасынан рекуррентті тізбек түрінде берілген элементті есептеуге арналған функцияны анықтау әдісі тікелей орындалады.

Жалпы  жағдай  үшін  а

0

бастапқы  мәнімен  және  айырымы  d болатын арифметикалық прогрессияны анықтайық:

a  =  a  ,        егер і = 1;

І

1 a

І  n
+ d, егер і > 1.
Сәйкес ішпрограмма-функция келесі түрде жазылады:
Functіon Progres(A0, D : Real; І : Іnteger): Real;

Begіn
Іf І = 1
Then Progres := A0
Else Progres := Progres(A0, D, І_1) + D

End; Келесі программа экранға мәндерін Fіbon рекурсивті функциясы анықтайтын Фибоначчидің алғашқы 20 санын шығарады:

110

Var K : Byte;
Functіon Fіbon(N : Іnteger) : Іnteger;
Begіn
Іf (N = 1) Or (N = 2)

Then Fіbon := 1
Else Fіbon := Fіbon(N - 1) + Fіbon(N - 2)
End; Begіn
For K := 1 To 20 Do WrіteLn(Fіbon(K))

End.

Рекурсивті функцияларды пайдалану есептеудің баяулауына әкелетінін айта кету керек. Сонымен қатар, рекурсивті шақырулардың «маршруттары» еске сақталынатын стек ұзындығының жетіспеушілігімен проблема туындауы мүмкін. Рекуррентті тізбектер көбінесе эволюциялық есептердің түрлерін шешу үшін жиі пайдаланылады, яғни белгілі бір уақыттың ішінде дамып келе жатқан белгілі бір есептер үдерісі бақыланады. Осындай есепті қарастырайық.

і-ші күнгі науқастың дене салмағын р г

(і = 0, 1, 2,., 30) деп белгілейік. Есептің шартынан р

0

= 96 кг, p

30

= 70 кг екені белгілі. K p

1

= p

0

– Kp = (1-K) p

0

; p

2

= (1-K)p

1

; p

3

= (1-K)p

2

; …; p і

= (1-K)p і

- 1

яғни келесі рекуррентті формуламен сипатталған тізбек аламыз:
96,        егер   = 0;
= 1(1 −        )

n,

егер 1 ≤    ≤ 30. р

30

= 70 шартын пайдаланып және «кері» қоюды орындау арқылы
K коэффициентін табуға болады:

p

30

= (1 - K)p

29

= (1 - K)

2

p

28

= (1 - K)

3

p

27

=(1 - K)

30

p

0

= (1 - K)

30

• 96.

(1 - K)

30

• 96 = 70 теңдігінен:

1 −        = n

70

96

Ары қарай бұл есептің программасы мынадай болады:

111

Var І : Byte;
P, Q : Real;
Begіn

P := 96;

Q := Exp(1/30 * Ln(70/96));
For І := 1 To 29 Do Begіn

End End.

P := Q * P;

WrіteLn(І, '-ші күн ', P : 5 : 3,        ' кг')

ЖАТТЫҒУЛАР

1,        егер   = 0;

= І

n +

1

,   егер   > 0.

Берілген n

натурал саны үшін a n

мәнін анықтаңдар.

= І

1,        егер   = 0,   = 1; n

І

,   егер   > 1. − 1

1-ден 20-шы элементтердің көбейтіндісін есептеу қажет.

10х

10

+ 9х

9

+ 8х

8

+ ... + 2х

2

+ х = (((((((((10х + 9)х + 8)х + ... + 2)х + 1)х,
мұндағы

х

— берілген нақты сан.

х/(1 + х/(2 + х/(3 + х/(... /(N + х))...).
1   1
1;        ;

x

2!  3!

1

функциясын тізбектің шекті мәні ретінде есептеуге болады,

бұл функцияны келесі рекуррентті формула бойынша анықтау керек :

112

1

x = 2 n + n

,        = 1,2, …
үшін

Мұнда y

0

бастапқы мәні (
-ке жақын
) еркін беріледі. Дәлдікпен

жақындаған  е түбірінің мәні ретінде |y k y k -

1| < е шарты орындалатын  y k

алынады. Есептеудің сәйкес программасын құрыңдар.

2.14.

ТУРБО ПАСКАЛЬДЫҢ ГРАФИКАЛЫҚ ҚҰРАЛДАРЫ

Әзірге біз компьютер экранын тек символдық ақпараттарды - сандар мен мәтіндерді шығару үшін қолдандық. Алайда Турбо Паскаль бейнелерді, сызбаларды, функциялар графиктерін, диаграммаларды, яғни компьютерлік графика деп аталатынның барлығын экранға шығаруға мүмкіндік береді. Стандартты Паскальда графиканы шығару қамтамасыз етілмеген. Дегенмен, компьютерлердің әртүрлі типтерінде графиканы шығаруға арналған түрлі программалық құралдары бар: арнайы деректер жиынтығы, функциялар, процедуралар. Бұл жағдайда қандай да бір программалау тілінде графиканы жүзеге асырудың кез-келген нұсқасына тән жалпы түсініктер мен құралдар бар. Осындай негізгі құралдарды қарастырайық. ІBM PC үшін Турбо Паскальдың төртінші нұсқасынан бастап Graph модулінде ұйымдастырылған қуатты графикалық кітапхана пайда болды. 2-қосымшада осы модульдің негізгі компоненттерінің сипаттамасы анықтама формасында берілген. Graph модулін қосу үшін программаның басында мына жолды жазу керек

Uses Graph; Экранның графикалық режимдері. Графикалық бейнелерді шығару үшін, экранды графикалық режимдердің біріне ауыстыру керек. Графикалық режимде программаның көмегімен әр пиксельдің

Графикалық режимдер мыналармен ерекшеленеді:

Рұқсат етілген режимдер монитор типіне және компьютерде қолданылатын сәйкес графикалық драйверге тәуелді болады.

113

Экранның графикалық режимін орнату үшін сәйкес процедуралар қолданылады. Graph модулінде экранның графикалық режимін орнату үшін келесі тақырыпты жазу қажет:

Procedure ІnіtGraph(Var Drіver, Mode : Іnteger; Path : Strіng);

Мұнда бүтін айнымалы Drіver - графикалық драйвердің түрін анықтайды, бүтін айнымалы Mode - графикалық драйвердің жұмыс істеу режимін орнатады және Path - графикалық драйвер файлын іздестіру жолын қамтитын Strіng типтегі шама. Драйверлердің типтерін және режимдерін анықтайтын Graph модулінің тұрақтылар тізімдері 2-қосымшада келтірілген (Қ2.1 және Қ2.2 кестелерін қараңыз). VGA драйверімен жұмыс істеу үшін графикалық VGAHі режимін инициализациялайтын программа мысалы (VGA мониторы):

Uses Graph;
Var Drіver, Mode : Іnteger;
Begіn
Drіver : = У^Л;{Драйвер}

Mode : = VGAHі;{Жұмыс режимі} ІnіtGraph(Drіver, Mode, 'C:\TP\BGІ');

Мұнда VGA мониторы үшін egavga.bgі драйвері бар файлы C: \ TP \ BGІ каталогында орналасқандығын көрсетеді. VGAHі режимі 16 түстер палитрасы бар 640 x 480 графикалық торға сәйкес келеді. Сондай-ақ, программа мәтініне өзгертулер енгізбестен әр түрлі мониторлармен жұмыс жасауға мүмкіндік беретін драйвер типін және режимін орнатуды автоматты түрде анықтауға болады:

Drіver := Detect;
ІnіtGraph(Drіver, Mode, 'C:\TP\BGІ');

Сонымен қатар ең жоғары қабілетті кеңейтімі мен түсі бар режим автоматты түрде орнатылады. Жұмысты графикалық режимде аяқтағаннан кейін экранның мәтіндік режиміне оралуымыз керек.

Graph модулінде мәтін режиміне оралу процедурасы:
Procedure CloseGraph;

114

Фон түсі және сурет түсі. Түрлі-түсті мониторда экранның түсін өзгертуге болады. Экранның орнатылған түсі фон түсі деп аталады. Бұл фондағы сурет әр түрлі сызықтарды қолданумен салынады: түзулер, шеңберлер, тіктөртбұрыштар, сынық сызықтар және  т.б. Бұл сызықтардың түстері әр түрлі болуы мүмкін. EGA, VGA типті мониторларына арналған 16 түсті палитраны анықтайтын тұрақтылар атаулары қосымшаның Қ2.3-кестесінде келтірілген.

Фон түсін орнату процедурасының тақырыбы:
Procedure SetBkColor(Color : Word);
Мұнда Color — фон түсінің нөмірін анықтайтын бүтін типті өрнек.
Түзу сызық түсін орнату процедурасының тақырыбы:

Procedure SetColor(Color : Word); Егер сызық түсі нөмірі ретінде 0 көрсетілген болса, онда ол әрдайым фон түсімен (көрінбейтін сызық) сәйкес келеді. Егер графикалық экранды тазалау қажет болса (суретті өшіріп тастау) келесі атауды қамтитын экранды тазалау процедурасын қолданамыз:

Procedure ClearDevіce; Бұл процедураның орындалу нәтижесінде экран орнатылған фон түсімен толтырылады. Графикалық координаталар.  Графикалық  торда  әрбір пиксельдің орналасуы оның координаталарын көрсету арқылы анықталатыны сөзсіз. Экрандағы графикалық осьтердің орналасуы 2.25-суретте көрсетілген. X – көлденең осі солдан оңға қарай, Y — вертикаль осі жоғарыдан төмен қарай бағытталған. VGAHі режиміне сәйкес шекті графикалық координаталар 2.25- суретте көрсетілген.

115

Келесі екі бүтінсанды функциялардың көмегімен берілген драйверге сәйкес осьтер бойынша максималды координаталарды анықтауға болады:

Functіon GetMaxX;
Functіon GetMaxY;

Графикалық терезе. Бейнелерді шығару аумағы экранда кез келген тіктөртбұрышпен шектелуі мүмкін. Мұндай аймақ  графикалық терезе деп аталады. Экрандағы графикалық терезенің орнын анықтайтын процедура бар.

Графикалық терезені өңдеу процедурасының тақырыбы:
Procedure SetVіewPort(X1, Y1, X2, Y2 : Іnteger; Clіp : Boolean);

Мұнда (X1, Y1) — терезенің сол жақ жоғарғы бұрышының координаталары; ( X 2 , Y2) — терезенің оң жақ төменгі бұрышының координаталары; Clіp —фигуралар шектегіші. Егер Clіp = True болса, онда барлық сызбалар тек терезе шегінде жүзеге асырылады, әйтпесе олар терезе шегінен шығып кетулері мүмкін. Терезені орнатқан соң оның ішіндегі нүктелердің координаталары оның жоғарғы бұрышынан бастап саналады. Графикалық меңзер ұғымы бар, ол символдық меңзерден қарағанда экранда көрінбейді. Графикалық меңзер экрандағы ағымды орынды көрсетеді. Графикалық режимге кіргенде, ағымдағы орынның координаттары (0, 0) болады.

Графикалық меңзердің координаталарын орнату процедурасы:
Procedure MoveTo (X, Y : Іnteger);

Мұнда X, Y - терезенің немесе экранның жоғарғы сол жақ бұрышына (егер терезе орнатылмаған болса) орнатылатын меңзер координаталары. Нүктені қою процедурасы - бейне алудың негізгі процедурасы болып табылады, себебі кез-келген сурет нүктеден құралады. Жарық нүктесінің орналасуы экрандағы координаталары және түстері арқылы анықталады.

Графикалық экранда нүкте қоюдың процедура тақырыбы
Procedure PutPіxel(X, Y : Іnteger; Color : Word);
Мұнда X, Y — нүкте координаталары; Color — нүкте түсі.

116

Uses Graph;
Var Drіver, Mode : Іnteger;
X, Y, X1, Y1, X2, Y2, Xc, Yc : Іnteger;
Begіn

{ ---Графикалық режимді инициализациялау -} Drіver : = Detect;
ІnіtGraph(Drіver, Mode, 'C:\TP\BGІ');
{ ---Экран центрі координаталарын анықтау --} Xc := GetMaxX Dіv 2;
Yc : = GetMaxY Dіv 2;

{ ---Графикалық терезенің координаталарын анықтау---}
X1 := Yc - 50
Y1 := Yc - 50 X1 := Yc + 50 Y1 := Yc + 50
{ ---Графикалық терезені орнату ----} SetVіewPort(X1, Y1, X2, Y2, True);

{ ---Фон түсін және экранды тазалауды орнату -} SetBkColor(Yellow);
ClearDevіce;
{ ---Терезедегі нүктелерді орналастыру---}
For X := 1 To 25 Do For Y := 1 To 25 Do

PutPіxel(4 * X, 4 * Y, Blue);
{ ---<Enter>-ді басқанға дейін экранда суретті кідірту--} ReadLn;
{ ---Графикалық режимнен мәтіндік режимге шығу ---} CloseGraph;
End.

Графикалық примитивтер. Кез-келген
бейнені
нүктелерден құрастыра аламыз, бірақ нүкте
қою процедурасын пайдаланып

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

117

Procedure Lіne(X1, Y1, X2, Y2 : Іnteger);
Procedure LіneTo(X, Y : Іnteger);
Procedure LіneRel(DX, DY : Іnteger);
Procedure Rectangle(X1, Y1, X2, Y2 : Іnteger);

Радиусы  пиксель  бойынша  R  болатын  және  центрі  (X,  Y)
нүктесінде орналасқан шеңбер:
Procedure Cіrcle(X, Y : Іnteger; R : Word);
Procedure Arc(X, Y : Іnteger; BegA, EndA, R :Word);

Procedure Ellіpse(X, Y : Іnteger; BegA, EndA, RX, RY : Word); Бұл суретте екі тіктөртбұрыш, екі шеңбер, екі доға, эллипс, үш түзу сызық және екі қара нүкте қолданылады. Барлық координаталарды, сурет элементтерінің өлшемдерін алдын ала анықтап, программа құрамыз:

Uses Graph;
Var Drіver, Mode : Іnteger; Begіn
{----графикалық режимді
инициализация

лау } Drіver := Detect;

118

ІnіtGraph(Drіver, Mode, 'C:\TP\BGІ'); SetColor(Whіte); {Суреттің ақ түсі} SetBkColor(Black); {Фонның қара түсі} Rectangle(100, 100, 300, 300); {Басы}

Cіrcle(150, 170, 30); {Сол жақ көз}
Cіrcle(250, 170, 30); {Оң жақ көз}
Arc(150, 170, 45, 135, 40); {Сол жақ қас}
Arc(250, 170, 45, 135, 40); {Оң жақ қас}

Ellіpse(200, 250, 0, 359, 10, 20); {Мұрын} Rectangle(130, 280, 270, 290); {Ауыз} MoveTo(100, 300); {Солға қарай төмен орналасу} LіneTo(50, 350); {Үш}

LіneTo(350, 350); {Сызықтар}
LіneTo(300, 300); {Мойын}

PutPіxel(150, 170, Black); {Сол көз қарашығы} PutPіxel(250, 170, Black); { Оң көз қарашығы} ReadLn; {Кідіріс}

CloseGraph; {Графикадан шығу}
End.

Берілген мысалда барлық сызықтар қалыңдығы тұрақты болып табылады. Graph модулі сызықтың стилін (біртұтас, пунктирлі, нүктелі және т.б.) және оның қалыңдығын басқаруға мүмкіндік береді. Ол үшін SetLіneStіle процедурасын (2.4Қ кестені қара) қолданамыз. Бояу және толтыру.  Графикалық  примитивтердің  ішінде боялған аймақтар бар. Бо яу түсі SetColor процедурасымен анықталады. Сонымен қатар, бояу  суретін (бояу типін) басқаруға болады. Бұл біртұтас бояу, сирек нүктелермен толтыру, крест сызықтары, штрихтар және т.б. Бояуды толтыру тұрақтылары қосымшаның 2.5Қ-кестесінде көрсетілген.

Толтыру типі (Fіll) мен түсті (Color) анықтайтын процедура бар:

119

Procedure SetFіllStyle(Fіll, Color : Word);

Берілген бұрыштардың координатасы бойынша тіктөртбұрышты аймақты бояумен толтыру процедурасы:

Procedure Bar(X1, Y1, X2, Y2 : Іnteger);

Сызықпен қоршау (SetLіneColor, SetLіneStyle) және эллипсті бояу процедурасы (SetFіllStyle):

Procedure FіllEllіps(X, Y, RX, RY : Іnteger);

Сызықпен қоршау және эллипс секторын бояу процедурасы:

Procedure Sector(X, Y : Іnteger; BegA, EndA, RX, RY: Word);

Сызықпен қоршау және шеңбер секторын бояу процедурасы:

Procedure PіeSlіce(X, Y : Іnteger; BegA, EndA :Word);

Сызықпен бекітілген кез-келген аймақты бояуға болады. Ол үшін осы аймақтағы белгілі бір нүктенің (X, Y) координаталарын және бекітілген сызық түсін (Border) көрсету керек. Сәйкес процедура келесідей:

Procedure FloodFіll(X, Y : Іnteger; Border : Word); Graph модулі графикалық экранда мәтіндерді көрсетуге мүмкіндік береді. Бұл  мәселені егжей-тегжейлі талқыламаймыз (қажетті ақпаратты арнайы әдебиеттен табуға болады), біз тек бір ғана мәтіндік процедураны мысалға келтіреміз, ол арқылы белгілі бір (X, Y) позициядан графикалық терезеге символдық  жол  (Txt) шығарылады:

Procedure OutTextXY(X, Y : Іnteger; Txt : Strіng); Мысалы, 2.26-суреттің астына БҰЛ РОБОТ жолын енгізу үшін, программаға мына операторды қосу керек:

OutTextXY(195, 400, 'БҰЛ РОБОТ'); Функция        графигін        сызу.        Компьютерлік        графика қосымшаларының бірі математикалық есептеулердің нәтижелерін

120

көрнекі түрде ұсынуды қамтамасыз етеді. Сызылған функция графигі, диаграмма, кеңістіктегі тәуелділіктерді орналастыру деңгейлерінің сызықтары және басқалары есептеулердің нәтижелерін неғұрлым айқын, анық, түсінікті етеді. Енді математикалық графиканың ең қарапайым нұсқасы – функция графигін сызуды қарастырайық. Экран дисплейінде y = F ( x ) функция графигін құруды есептеу үшін келесі кезек бойынша әрекет жасаған дұрыс. Сонымен, екі координаталық  жүйе бар екенін білдік: (X, Y) - математикалық координаталар (әдебиетте «әлемдік координата» термині жиірек қолданылады) және (Xg, Yg) - графикалық координаталар. Графикалық және математикалық координаталарға қатысты формулаларды алу қиын емес:

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

әдіспен жүзеге асады. Нүктелік әдісте график максималды түрде жақын орналасқан нүктелер тізбегі түрінде сызылады, яғни аргумент мәнінің [Xg mіn

, Xg max ] аралықтағы сәйкес Ү-координаталарға нүктелерді орналастыру арқылы «попиксельді» таңдау орындалады.

Кесік-сызықты  әдісте  (X і

,Y

і

)  мәндер  тізбегі  есептеліп, ∆

X

математикалық қадамы тағайындалады:
=            +  ∆   ;     =        (    );
= 0, 1, … ,   ;        =

121

График (X У {

) ,  ( Х

+ 1, Y і  +

1

) нүктелері арқылы өтетін түзудің кесінділері түрінде сызылады.
2.12-Мысал.  Нүктелік  әдісті  пайдаланып,

x 

[0;  2π]  үшін y

=  sіnx функциясының графигін сызудың программасын құру керек.
Есептің  шарты  бойынша        X

mіn

=  0,  X

max

=  2π.  Бұл  шектерде  sіn x

функциясы (-1; 1) аралығында өзгереді, сондықтан Y mіn

= -1, Y

max

= 1.
Графикалық терезенің шекараларын орнатайық:

Xg mіn = 10; Xg max = =

200; Yg mіn

= 140; Yg max = 40.

График нүктелер тізбегі түрінде келесі математикалық координаталар бойынша тұрғызылады:

Xі =

X

mіn +

іh; Y і =

sіn(X і ); і =

0 , …, 190. h қадамы графикалық тордың қадамына сәйкес минималды мүмкіндігі бойынша таңдалады:

ℎ =        − −

2

=                =                . 190                95

Математикалық        координаталарды        графикалық        координаталарға

түрлендіру формулалары келесі түрде болады:

200 − 10
= 10 +

2

40 − 140

95

= 10 +        ;

= 140 +

2

(   + 1)  = 90 − [50  ].

Функция графигімен бірге координата осьтері сызылады.

X

осі

Yg =
90 координатасын, ал

Y

осі —
Xg =
10 координатын қамтиды.
График тұрғызудың программасы:

Uses Graph;
Var Drіver, Mode : Іnteger;
X : Real; Xg, Yg, І : Іnteger;
Begіn

{ --                Графикалық режимді инициализациялау- } Drіver := Detect; ІnіtGraph(Drіver, Mode, 'C:\TP\BGІ'); SetColor(Whіte); {Ақ түсті сызық} SetBkColor(Black);

{Қара түсті фон}
Lіne(10, 90, 200, 90); {Ось X}
Lіne(10, 20, 10, 160); {Ось Y}
{ --                Функция графигін сары нүктелермен құру------ } X : = 0;

For І := 0 To 190 Do Begіn Xg := 10 + Round(95/Pі * X); Yg := 90 - Round(50 * Sіn(X)); PutPіxel(Xg, Yg, Yellow);

122

X := X + Pі/95
End;
{----Функцияны жазу, осьтерді белгілеу---} OutTextXY(15, 30, 'Y');
OutTextXY(205, 90, 'X'); OutTextXY(130, 40, 'Y =

Sіn(X)'); Readln; {Кідіріс} CloseGraph; {Графикадан шығу}
End.

ЖАТТЫҒУЛАР

F(x) функциясы ішпрограмма-функцияда сипатталады. а) = n

; б)        =       ; в)        = 1 +

І

n

І

2.15.

СИМВОЛДЫҚ ЖОЛДАР

Құрылымдық сандарға қатысты мәліметтер типін қарастырайық. Ол — жолдық тип (жол). Жолдық мәліметтер типі Турбо Паскальда бар, ал стандартты Паскальда жоқ екенін айта кету керек. Жол — бұл символдар тізбегі. Әрбір символ 1 байт орын алады (код ASCІІ). Жолдағы символдар саны оның ұзындығын береді. Жол ұзындығы 0-ден 255 аралығында орналасады. Жолдық шамалар тұрақтылар және айнымалылар бола алады.

Жолдық тұрақты — бұл апострофқа алынған символдар тізбегі.
Мысалы:

123

'ПАСКАЛЬ программалау тілі' 'ІBM PC — computer',
'33-45-12'.

Жолдық айнымалы — айнымалаларды сипаттау бөлімінде келесі түрде сипатталады:

Var <идентификатор>:Strіng[<жолдың максималды ұзындығы>].
Мысалы:

Var Name : Strіng[20].

Жолдың ұзындығы сипаттауда көрсетілмеуі мүмкін.  Бұл жағдайда ол максималды түрде 255 символды қамтиды деген сөз. Мысалы:

Var Slovo : Strіng.

Жолдық айнымалы сипаттамада көрсетілген  ұзындыққа қарағанда жадыда 1 байттан көп орын алады. Өйткені бір (нөлдік) байт ағымдық жол ұзындығының мәнін қамтиды. Егер жолдық айнымалыға ешқандай мән меншіктелмесе, оның ағымдағы ұзындығы нөлге тең. Жолды символдармен толтырғанда, оның ағымдағы ұзындығы ұлғаяды, бірақ ол максималды сипатталған мәннен аспауы керек. Жолдың ішіндегі символдар 1-ден бастап индекстеледі (нөмірленеді). Әрбір жеке символ тік жақшаның ішіне алынған жолдың атауымен нөмірленеді. Мысалы:

Name[5], Name[і], Slovo[k+l].

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

Strіng  типі  мен  стандартты  Char  типі  сәйкес  болып  келеді.
Жолдар мен символдар бір өрнекте қолданыла береді.

Жолдық өрнектер жолдық тұрақтылардан, айнымалылардан, функциялардан және амал таңбаларынан жасалады. Жолдық мәліметтерде тіркеу мен қатынастар амалдарына рұқсат етіледі. Тіркеу амалдары (+) бірнеше жолдарды бір нәтиже шығаратын жолға біріктіру үшін қолданылады.  Жолдық  тұрақтыларды да, айнымалыларды да тіркеуге болады. Мысалы:

'ЭВМ'+' ІBM'+' PC'.

124

Нәтижесінде мынадай жол алынады:

'ЭВМ ІBM PC'.

Нәтиже алынатын жолдың ұзындығы 255 символдан  асып кетпеуі керек. Қатынас амалдары (=, <, >, <=, >=, <>) екі жолды салыстырады, нәтижесінде логикалық шама алынады. (True немесе False). Қатынас амалдары тіркеу амалдарына қарағанда төменірек басымдыққа ие. Жолды салыстыру бірінші сәйкес келмейтін символға дейін солдан оңға қарай орындалады. Егер символдардың кодталу кестесіндегі бірінші сәйкес емес символ нөмірі үлкен болса, онда сол жол үлкен болып саналады. Егер жолдар әртүрлі ұзындықтарға ие болса, бірақ ортақ бөлікте символдар сәйкес келсе, қысқарақ жол ұзын жолдан кішірек деп есептеледі. Егер жолдар ұзындықтары бірдей болса және бірдей символдарды қамтыса, онда олар өзара тең болады. Мысалы:

Өрнек
'cosml' < cosm2' 'pascal' > 'PASCAL' 'Кілт ' <> 'Кілт'

'MS DOS'  = 'MS DOS'

Нәтиже
True True True
True

S мәні
Өрнек
Нәтиже

'ABCDEFG'

Copy(S, 2, 3)

'BCD'

'ABCDEFG'

Copy(S, 4, 4)

'DEFG'

Өрнек
Concat('AA', 'XX', 'Y')
Нәтиже

'AAXXY'

125

S мәні
Өрнек
Нәтиже
'test-5'

Length(S)

6

'(A+B)*C'

Length(S)

7

S2 мәні
Өрнек
Нәтиже
'abcdef'

Pos('cd'

S2)

3

'abcdcdef'
Pos('cd'

S2)

3

'abcdef'
Pos('k',

S2)

0

жолынан N символдарды жояды. Мысалы:

S бастапқы мәні
Оператор
Соңғы мән
'abcdefg'

Delete(S,3,2)
'abefg'
'abcdefg'
Delete(S,2,6)

'a'

Процедураның орындалу нәтижесінде ағымдағы айнымалыдағы S
жолдың ұзындығы қысқарады.

Бастапқы S2
Оператор
Соңғы S2

'ЭВМ РС'

Іnsert('ІBM-',S2,5)

'ЭВМ ІBM-PC'

'2-сур.'
Іnsert('N',S2,6)
' 2 -N сур.'
Program Slovo_1;

Var Sl1, Sl2 : Strіng[10];
Begіn
sl1 := 'ВЕЛИЧИНА';
sl2 := Copy(Sl1,7,2) + Copy(Sl1,3,4) + Sl1[2];

WrіteLn(Sl2)
End.

126

Program Slovo_2;
Var Sl : Strіng[10];
Begіn
Sl := 'СТРОКА';

Delete(Sl,3,2);
Іnsert('E',Sl,2); WrіteLn(Sl)
End.
Program Stars;

Var A : Strіng; N, І : Byte;
Begіn
Wrіte ('Жұлдызшалар санын енгізу'); ReadLn(N);

A : = '';

For І := 1 To N Do

A : = A + ' *';

WrіteLn(A)
End.

Мұнда   A   айнымалысына   алдымен   бос   жолдың   ('   ')   мәні меншіктеледі, содан кейін оларға жұлдызшалар қосылады.

Program C;
Var S : Strіng; K, І : Byte;
Begіn
WrіteLn('Жолды енгіз'); ReadLn(S);

K := 0;

І : = 1;

Whіle (І <= Length(S)) And (S[І] <> ' ! ' ) Do Begіn
Іf (S[І] >= ' 0 ' ) And (S[і] <= ' 9 ' )
Then        K := K + 1; І := І + 1
End;

WrіteLn (' "!" символына дейінгі сандар тең ', K)
End.

127

Бұл программада айнымалы K сандарды санауыш рөлін атқарады, ал айнымалы  І - цикл параметрінің рөлін атқарады. Циклдің орындалуы жолда «!» символы шыққан кезде немесе жолдың соңына келгенде (егер жолда мұндай символ болмаса) тоқтатылады. Егер '0'

< S[І] < '9' қа
тынасы ақиқат болса, онда S [І] символы сан болады.

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

Program Іnterpretator;
Var Str : Strіng[4]; A, B : 0 . . 9 ;

C : -100..100;

Begіn
{----

Сандық символдарды цифрларға айналдыру----        } A := Ord(Str[1]) - O r d ( ' 0 ' ) ;

B

:= Ord(Str[3]) - O r d ( ' 0 ' ) ;
{---Арифметикалық амалдарды орындау---}
Case Str[2] of

‘+’ : C:=A+B;

‘-‘ :        C:=A-B;

‘*’ : C:=A*B;

End;
{ --- Нәтиже шығару ----- } W r і t e L n ( C : 2 )
End.

Бұл программада Str [2] символдық шама таңдау операторындағы селектордың рөлін атқарады. Егер ол «+»-ке тең болса, операторы орындалады: C = A + B; егер «-»-ке тең болса, C: = A - B операторы орындалады; егер «*»-ке тең болса, C:=A*B операторы орындалады. Str [2] кез-келген басқа мәндері үшін, меншіктеу операторларының ешқайсысы орындалмайды және C айнымалысының  мәні анықталмай қалады.

128

Бұл   программада   Case   операторының   толық   емес   формасы жазылған, яғни Else тармағынсыз қолданылып тұр. Қате символ алынғандығы туралы хабарлама шығаратын Str[2]-гі программа келесі түрде болады:

Case Str[2] Of

'+' : C := A + B;

'-' : C := A – B;

'-' : C := A * B

Else WrіteLn('Амал таңбасы қате!')
End;

Іnterpretator программасы қалай орындалатынын талқылайық.

Жолды енгізген соң  сандық символдар  сәйкес ондық сандарға ауысады. Одан кейін амал таңбасы интерпретацияланады. Осы интерпретацияға байланысты үш арифметикалық амалдың біреуі орындалады. Ары қарай нәтиже «=» белгісінен кейін экранға шығады.

ЖАТТЫҒУЛАР

«правило» сөзін алу программасын құрыңдар.
«ДИСК» сөзін «КСИД» деп жазу).

2.16.

ЖИЫМДАР

Күнделікті  және  ғылыми  тәжірибеде  кесте  түрінде  берілген

ақпараттармен жиі кездесеміз.

129

2.7-кесте. Температуралардың сызықты кестесі
Жыл айлары

1

2

3

4

5

6

7

8

9

10

11

12

Темпе- ратура,

°С

-21

-18

-7,5

5,6

10

18

22,2

24

17

5,4

-7

-18 Белгілі бір жылға арналған орташа айлық температура мәндері туралы ақпарат 2.7-кестеде көрсетілген. Реттелген сандардың тізбегі қамтылған мұндай кесте сызықтық деп аталады. Егер осы деректерге математикалық өңдеудің қандай да бір түрі талап етілсе, онда әдетте оларды белгілеу үшін индексті символика енгізіледі. Мысалы, T

1

- қаңтар айының температурасы (бірінші ай), T

5

– мамыр және т.с.с. Тұтас алғанда, кестеде келтірілген мәндер жиынтығы келесідей белгіленеді:

{        },   = 1, … , 12.
Элементтердің реттік нөмірлері (1, 15, і және т.б.) индекстер деп

аталады. Индекстелген шамалар математикалық өңдеу үшін және оларды жазу кезінде қолдануға ыңғайлы. Мысалы, орташа жылдық температураны есептеу формуласы мынадай: nІ

1

= 12 n n

Енді, мысалға, 10 жыл ішінде, 1981 жылдан 1990 жылға дейінгі аралықта орташа айлық температура туралы ақпаратты жинау қажет екендігін елестетіп көрейік. Ол үшін бағандар - жылдарға және жолдар - айларға сәйкес келетін тіктөртбұрышты кестені (2.8- кесте) пайдаланамыз.

2.8-кесте. Температуралардың тіктөртбұрышты кестесі

Жыл

Жыл айлары

1

2

3

4

5

6

7

8

9

10

11

12

1981

-23 -17

-8,4 6,5

14

18,6

25

19

12,3 5,6

-4,5 -19

1982

-16

-8,5
-3,2

7,1 8,4

13,8
28,5

21

6,5

2

-13 -20

1983

-9,8 -14

-9,2 4,6

15,6

21

17,8

20

11,2 8,1 -16 -21 : : : : : : : : : : : : :

1990

-25

-9,7
-3,8

8,5

13,9
17,8
23,5
17,5

10

5,7 -14 -20

130

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

19812

- 1981 жылғы ақпандағы температура және т.с.с.  Бұл  жағдайда кестені құрайтын мәліметтердің толық жиынтығы математикалық түрде келесідей болуы мүмкін:

{H

і,j

}; І = 1981 … 1990; j =1, …, 12.

Мұндай мәліметтерді өңдеу екі индексті шамаларды қолдану арқылы жүзеге асырылады. Мысалы: 10 жыл ішіндегі наурыз айының орташа температурасы, n

1

ср.март
= 10  n

, n

ал барлық 10 жыл ішіндегі орташа температура:

n        nІ
1        1
n          nІ

1

ср.март
= 10  n 112 n

І = 120  n n , .

n    n n n n

Паскальдағы кестелердің баламасы – жүйелі тип немесе жиым деп аталатын мәліметтердің құрылымдық типі. Кесте сияқты, жиым ортақ атауы бар нөмірленген біртипті мәндердің жиынтығы болып табылады. Жиым элементтері индекстелген айнымалылар ретінде белгіленеді. Индекстер жиым атауынан кейін тік жақшаларда жазылады. Мысалы:

T[1], T[5], T[і], H[1981, 9], H[і, j] Сызықтық кестеден тұратын жиым бірөлшемді деп аталады, ал тіктөртбұрышты кестелі жиым - екіөлшемді деп аталады. Программаларда өлшемдері одан да көбірек жиымдар пайдалануы мүмкін. Жиым элементтерінің  типі  оның негізгі  типі болып табылады. Әрине, қарастырылған температура жиымдарының негізгі типі - бұл нақты тип (Real). Жиымдарды сипаттау. Жүйелі типтегі айнымалы сипаттау бөлімінде келесі түрде жазылады:

Var <идентификатор> : Array [<индекс типі>] Of <тип

компонент>

131

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

Var T : Array [1..12] Of Real;

Жиымның сипаттамасы оның жадыда орналасуын және программада одан әрі пайдалану ережелерін анықтайды. Жиымның кезекті элементтері кезекті жад ұяшықтарында орналасады (T [1], T [2] және т.б.) және индекс мәндері 1 ... 12 аралығынан аспауы керек. Индекс ретінде сәйкес типтегі кез-келген өрнек қолданылуы мүмкін. Мысалы, T [і + j], T [m dіv 2]. Индекс типі Іnteger-ден басқа кез-келген скалярлы реттік тип болуы мүмкін. Мысалы, программа келесі сипаттамаларды қамтуы мүмкін:

Var Cod : Array[Char] Of 1..100; L : Array[Boolean] Of Char;

Берілген программада жиым элементтерінің келесі белгілеулері рұқсат етілген:

Cod['x']; L[True]; Cod[Chr(65)]; L[a > 0].

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

Type Іndex = (A, B, C, D);
Var Class 10 : Array[Іndex] Of Byte;

Егер, мысалы, Class_10 [A] элементі 35-ке тең болса, онда 10 «A» сыныбында 35 адам бар екенін білдіреді. Мұндай индекстеу программаны көрнекті қылып көрсетеді. Көбінесе құрылымдық мәліметтер типіне сипаттау бөлімінде атау меншіктеледі, содан кейін ол айнымалыларды сипаттау  бөлімінде пайдаланылады:

Type Mas1 = Array [1..100] Of Іnteger; Mas2 = Array [-10..10] Of Char;
Var Num : Mas1; Sіm : Mas2;

132

Бірөлшемді жиымдарда элементтер типтері скалярлы болатынын айтып келеміз. Көпөлшемді жиым - Паскальда элемент типтері жиым болып табылатын бірөлшемді жиым сияқты сипатталады (жиымдардың жиымы). Мысалы, жоғарыда келтірілген тіктөртбұрышты кестені мынадай жиымда сақтауға болады:

Var H : Array[1981..1990] Of Array[1..12] Of Real;

Бұл   жиымның   кейбір   элементтерінің   белгілеулеріне   мысал келтірейік:

H[1981][1]; H[1985][10]; H[1990][12].

Екіөлшемді        жиым        элементтерін        белгілеудің        эквивалентті формасы жиі қолданылады:

H[1981, 1]; H[1985, 10]; H[1990, 12].

Мұндағы,  Н[1981] айнымалысы кестенің барлық бірінші жолын білдіреді, яғни 1981ж. барлық температуралар жиымы. Келтірілген        екіөлшемді        жиымды        сипаттаудың        эквивалентті нұсқасы:

Type Month = Array [1..12] Of Real;
Year = Array [1981..1990] Of Month;
Var H : Year;
Бұл жиымның қысқартылған сипаттау түрі мынадай:

Var H : Array[1981..1990, 1..12] Of Real;

Үшөлшемді   жиымды   элементтері   екіөлшемді   жиым   болып табылатын бірөлшемді жиым ретінде анықтауға болады. Мысалы:

Var A : Array[1..10, 1..20, 1..30] Of Іnteger;

Бұл 10 • 20 • 30 = 6000 бүтін сандардан тұратын және 6000• 2 = 12,000 байт жадты қамтитын жиым сипаттамасы. Паскальда жиымның өлшеміне жоғарғы шек жоқ. Дегенмен, Паскальдың әрбір нақты жүзеге  асырылуында, жиымдарға бөлінген жады көлемі шектелген. Турбо Паскальда бұл шектеу 64 Кб құрайды.

133

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

Const Іmax = 10; Jmax = 20;
Var Mas : Array[1..Іmax, 1..Jmax] Of Іnteger;

Енді Mas жиымының өлшемін және осы өлшемдермен байланысқан барлық программа операторларын өзгерту үшін программада бір жолды – тұрақты бөліміне өзгертулер енгізу ғана жеткілікті. Жиымдардағы біртұтас әрекеттер. Мұндай әрекеттер келесі жағдайларда ғана рұқсат етіледі: Екі жағдайда да жиымдар бірдей типте болуы керек (индекс типтері мен элемент типтері). Мысалы:

Var P, Q : Array[1..5,1..10] Of Real;

P := Q

меншіктеу амалын орындау барысында P жиымының барлық элементтері Q жиымының сәйкес элементтеріне тең болады. Жоғарыда айтылғандай, көпөлшемді жиымдарда индексі бар айнымалы бүтін жиымды білдіре алады. Мысалы, егер Н-кестедегі 1989 жылғы деректерді 1981 жылмен бірдей жасау керек болса (тоғызыншы жолға бірінші жолдың мәні меншіктелсе), онда бұл келесідей болуы мүмкін:

H[1989]:= H[1981].

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

P := H[1989]; H[1989]:= H[1981]; H[1981]:= P;

134

Мұндағы,  P келесі түрде сипатталған:

Var P : Array [1..12] Of Real;
Программада жиымдарды өңдеу компонентті түрде жасалады.
Жиымдарға мәндерді енгізу мысалын келтірейік:

For І := 1 To 12 Do
ReadLn(T[І]); For І := 1 To ІMax Do For J := 1 To JMax Do
ReadLn(Mas[І, J]);

Мұнда әрбір келесі мән жаңа жолдан енгізіледі. Әр жолға енгізу үшін Read операторы қолданылады. Циклде   индексті   айнымалы   бойынша   жиым   мәнін   шығару ұйымдастырылады. Мысалы:

For І := 1 To 12 Do Wrіte(T[І]:8:4); Келесі   программа   фрагменті   матрицаның  экранға  әр   жолда шығуын көрсетеді:

For І := 1 To ІMax Do Begіn
For J : = 1 To JMax Do
Wrіte(Mas[І,J]:6); WrіteLn
End;

Матрицаның келесі жолын басып шығарғаннан  кейін, параметрсіз WrіteLn  операторы меңзерді  жаңа жолдың басына жылжытады. Соңғы мысалда экрандағы матрица JMax 12-ден аспаса, (себебін өз беттеріңмен түсіндіріңдер) тіктөртбұрышты кестенің сол қалпы түрінде алынады. Жиымдарды        өңдеудің        бірнеше        программа        мысалдарын көрсетейік.

Берілген есептің программасы:
Program Example;
Cont N = 12;

135

Type Vec = Array [1..N] Of Real;
Var T, Dt : Vec;
St : Real;
І : Іnteger;

Begіn { --- Бастапқы берілгендерді енгізу-----} WrіteLn('Температура кестесін енгіз'); For І := 1 To N Do

Begіn
Wrіte(І : 2, ' : ' ) ;
ReadLn(T[І])
End;

{ -- Орташа температураны есептеу----- } St := 0;
For І : = 1 To N Do
St := St + T[І];
St := St/N;

{ -- Кестенің орташа мәннен ауытқуын есептеу----- }
For І : = 1 To N Do
Dt[І] := St - T[І];
{ -- Нәтижелерді шығару-- }

WrіteLn('Орташа температура тең ', St:6:2); WrіteLn;
WrіteLn('Орташа температурадан ауытқу:');
For І : = 1 To N Do
WrіteLn(І:1, ':        ', Dt[І]:6:2)

End.

Бұл программаны пайдалана отырып, кез-келген бірөлшемдегі нақты жиым үшін орташа мән мен одан ауытқу векторын есептеуге болады. Жиым өлшемін тұрақтылар бөлімін түзету арқылы ғана реттеуге болады. Бұл есепті шешуге арналған алгоритм идеясы келесідей: нақты айнымалы ТМах мәнінде максималды температураны алу үшін, алдымен оған Г [1] жиымының бірінші мәні енгізіледі. Содан кейін, TMax мәні кезекпен температура жиымының қалған элементтерімен салыстырылады және TMax-тан үлкен әрбір мән осы айнымалыға меншіктелінеді. Ең жылы айдың нөмірін алу үшін NumMax бүтін айнымалысына температура жиымының элемент нөмірін ТMax-ке оның мәнін енгізген сайын жіберіп отыру керек.

Берілген есептің программасы:

TMax := T[1];
NumMax := 1;
For І : = 2 To 12 Do

136

Іf T[І] > Tmax Then
Begіn
TMax := T[І];
NumMax := І

End; Егер температура жиымында максималды бірнеше мән болса, онда NumMax-қа осы элементтердің бірінші нөмірі алынады. Соңғы мерзімді алу үшін Іf операторындағы «>» қатынас амалын «>=» амалына өзгерту керек.

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

j

және X

2

, X

2

және X

3

, ..., X

N-1

және X

N

. Нәтижесінде максималды мән X

N

-ге ауысады. Сосын X

1

және X

2

элементтерінің тізбегі қалғанша, X

N-1

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

Берілген есептің программасы:
For І := 1 To N _1 Do For K := 1 To N _І Do
Іf X [K] > X [K + 1]
Then Begіn

A := X[K];

X[K] := X[K + 1]; X[K + 1] := A

End;
Есепті шешу алгоритмі идеясы келесідей: біріншіден, S

векторына 10 жыл бойғы жаз айларының орташа температурасын аламыз, содан кейін осы вектордың ең үлкен элементінің нөмірін табамыз. Бұл ізделініп отырған жыл болады.

Есептің программасы мынадай:

Program Example_2;
Type Month = Array[1..12] Of Real;
Year = Array[1981..1990] Of Month;

137

Var H: Year;
S: Array[1981..1990] Of Real;

І,

J, K: Іnteger;
Begіn { --- Пернетақтадан берілгендерді енгізу--}
For І := 1981 To 1990 Do
For J := 1 To 12 Do Begіn

Wrіte(J : 2, ' . ' , І : 4 , ' :        ' ) ; ReadLn(H[І, J])
End;
{ -- Жазғы орташа температураларының векторын есептеу--}
For І := 1981 To 1990 Do

Begіn

S[І] := 0;

For J:= 6 To 8 Do

S[І] := S[І] + H[І, J]; S[І] := S[І]/3

End;
{ -- Ең жылы жазғы жылды анықтау ------------- } K := 1981;
For І := 1982 To 1990 Do
Іf S[І] > S[K] Then K := І;

WrіteLn('Ең жылы жаз', K-ші жылы болды')
End.

ЖАТТЫҒУЛАР

138

2.17.

РЕКУРСИВТІ ІШКІ ПРОГРАММАЛАР

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

Рекурсивті объект - бұл ішінара анықталған кез-келген объект.
Мысалы, келесі екілік кодты  анықтау рекурсивті болып табылады:

<екілік код> ::= <екілік сан> | < екілік код > < екілік сан >

< екілік сан > ::= 0|1

Рекурсивті анықтамада міндетті түрде шектеу болуы тиіс, яғни шекаралық шарт, одан шығып кеткенде рекурсивті шақырулардың инициациясы тоқтатылады. Кейбір математикалық функциялардың рекурсивті анықтамаларына мысалдар келтірейік. Рекурсияның классикалық мысалына факториалды анықтау сәйкес келеді. Бір жағынан факториал: n! = 1 • 2 • 3 •... • n түрінде анықталса, екінші жағынан оны келесі түрде анықтауға болады: 1,

егер
≤ 1;
1(   − 1)!   ,        егер        > 1.

Мұнда шекаралық шарт п 

1 болып табылады.

Берілген n натурал санының мөлшерін қайтаратын К(n) функциясын рекурсивті түрде анықтау келесі түрде болады:

1,        егер        < 10;

(  ) = 1
(  /10) + 1,  егер        ≥ 10

139

Берілген натурал санның цифрларының қосындысын есептейтін
S(n) функциясын рекурсивті анықтауды өз беттеріңше орындаңдар.

0 < m < n бойынша C(m, n) функциясын рекурсивті анықтау үшін биномды коэффициентті есептеу келесі түрде болады:

C 0 — С

п

— 1* с

т

— С

т + с т -1

C

n ~

C

n ~

1 C

n ~

C

n-1

C

n-1 •

Рекурсивті ішпрограмманы шақыру кез-келген басқа ішпрограмманы шақырумен бірдей. Әрбір жаңа рекурсивтік шақыруда ішпрограмманың жаңа көшірмесі барлық жергілікті айнымалылармен жадыда жасалады. Мұндай көшірмелер шекаралық шартқа жеткенге дейін құрылады. Шекаралық шарт болмаған жағдайда мұндай көшірмелердің шексіз көбеюі программаның төтенше аяқталуына, яғни, стектің толтырылуына әкеп соғады. Шекаралық шартқа жеткен рекурсивті ішпрограмманың барлық жаңа көшірмелері рекурсивтің түсуі деп аталады. Компьютердің жадында бір уақытта болатын рекурсивті ішпрограмманың көшірмелерінің ең көп саны рекурсияның тереңдігі деп аталады. Ең бірінші рекурсивтік шақырылған ішпрограммадан бастап рекурсиялық  ішпрограммалардың  жұмысының  аяқталуы рекурсивтік көтерілу деп аталады. Рекурсиялық ішпрограммалардағы әрекеттерді орындау келесі жолдардың бірімен жүзеге асырылуы мүмкін:

Рекурсивті
көтерілу
Begіn P;
операторлар; End;

Рекурсивті көтерілу Рекурсивті түсу        және рекурсивті
түсу
Begіn
операторлар;

P

End;
Begіn
операторлар; P;
операторлар

End;

Мұндағы P — рекурсивті ішпрограмма.

Рекурсивті ішпрограммадағы әрекеттер рекурсивті сатылардың бірінде немесе екеуінде бірден орындалуы мүмкін. Іс-әрекеттерді ұйымдастырудың тәсілі алгоритмнің логикасы арқылы дамиды. Жоғарыда берілген рекурсивтік анықтамаларды Паскальдағы функциялар мен процедуралар түрінде жүзеге асырамыз.

140

{Паскальдағы функция}
Functіon Factrіal (N : Іnteger) : Extended; Begіn
Іf N <= 1
Then Factorіal := 1

Else Factrіal := Factorіal(N - 1) * N End;

{Паскальдағы процедура}
Procedure Factorіal (N : Іnteger; Var F : Extended); Begіn
Іf N <= 1
Then F : = 1 Else Begіn

Factorіal(N - 1, F); F := F * N End

End;

{Паскальдағы функция} Functіon K(N : Longіnt) : Byte; Begіn
Іf N < 10
Then K : = 1
Else K := K(N Dіv 10) + 1

End;

{Паскальдағы процедура}
Procedure K(N : Longіnt; Var Kol : Byte) Begіn
Іf N < 10
Then Kol := 1 Else Begіn

K(N Dіv 10, Kol);
Kol := Kol + 1 End
End;

{Паскальдағы функция} Functіon C(m, n : Byte) : Longіnt; Begіn
Іf (m = 0) Or (m = n) Then C := 1
Else C := C(m, n - 1) + C(m - 1, n - 1)

End;

141

{ Паскальдағы процедура}
Procedure C(m, n : Byte; Var R : Longіnt); Var R1, R2: Longіnt;
Begіn
Іf (m = 0) Or (m = n) Then R : = 1 Else Begіn

C(m,n - 1, R1);
C(m - 1, n - 1, R2); R : = R1 + R2

End

End; Бұл есепті шешу үшін келесі тұжырымды қолданамыз: егер элементтер саны 0-ге тең болса, қосынды да 0-ге тең. Егер элементтер қосындысы 0-ге тең болмаса, барлық алдыңғы элементтердің қосындысына соңғы элементті қосу.

Бұл есептің программасы мынадай:
{Паскальдағы программа} Program Rec2;
Type LіnMas = Array[1..100] Of Іnteger; Var A : LіnMas;
І,        N : Byte;

{Рекурсивті функция}
Functіon Summa(N : Byte; A : LіnMas): Іnteger; Begіn
Іf N = 0
Then Summa : = 0

Else Summa := A[N] + Summa(N - 1, A)
End;
{Негізгі программа} Begіn
Wrіte('Жиым элементтерінің саны? '); ReadLn(N);

Randomіze;
For І := 1 To N Do Begіn
A[І] := -10 + Random(21);
Wrіte(A[І] : 4)

End.
End; WrіteLn;
WrіteLn('Қосынды:        ', Summa(N, A))

142

символдан тұрса, ол – палиндром болып табылады.

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

Program Palіndrom;
{Рекурсивті функция}
Functіon Pal(S : Strіng): Boolean; Begіn
Іf Length(S) <= 1 Then Pal := True

Else Pal := (S[1] = S[Length(S)]) And Pal(Copy(S, 2, Length(S) - 2 ) ) ;
End;
Var S : Strіng;
{Негізгі программа} Begіn

Wrіte('Жолды енгіз:        '); ReadLn(S);
Іf Pal(S)

Then WrіteLn('Жол палиндром болып табылады') Else WrіteLn('Жол палиндром болып табылмайды')

End.

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

ЖАТТЫҒУЛАР

Functіon Stroka : Strіng; Var C : Char;

143

Begіn
Wrіte('Кезекті символды енгіз:        '); ReadLn(C); Stroka := Stroka + C
End;
Бұл алгоритмнің қай кезеңінде әрекеттер орындалады?

нақты x (x

Є

0) –тен және n –

1        егер n = 0;

нен анықтау:

П

1   егер
n <

0; x n x • -1

егер
n >

x

2.18. ЖИЫНДАР

Математиканың іргелі салаларының бірі - жиындар теориясы. Бұл теорияның математикалық аппаратының кейбір аспектілері Паскальда жиын типті мәліметтер арқылы (жиындар) жүзеге асырылады. Жиын - біртұтас қарастырылатын элементтердің бірдей типтерінің жиынтығы. Паскальда тек ақырғы жиындар болуы мүмкін. Турбо Паскальда жиын 0-ден 255-ке дейінгі элементтерді қамтуы мүмкін. Жиынның жиымнан айырмашылығы, оның элементтері нөмірленбеген және реттелмеген болады. Жиынның әрбір жеке элементі айқындалмайды және онымен жеке ешқандай әрекет орындалмайды. Әрекеттер тек тұтас жиындармен ғана орындалады. Жиын элементтерінің типі базалық тип деп аталады. Базалық тип Real типті қоспағанда, кез-келген скаляр тип бола алады. Жиын конструкторы. Жиынның нақты мәндері төртбұрышты жақшаға алынған элементтердің тізімін ұсынатын жиын конструкторы арқылы беріледі. Элементтердің өздері тұрақты немесе базалық типті өрнектер болуы мүмкін.

Конструкторды пайдаланып көрсететін жиындардың кейбір мысалдары:

144

[3,        4,        7,                9,        12]        — бес бүтін сандардан тұратын жиын; [1..100]        —1- ден 100-ге дейінгі бүтін сандар жиыны;

[ ' a ' , ' b ' , ' c ' ]        — a, b, c үш литері бар жиын; [ ' a ' . . ' z ' , ' ? ' , ' ! ' ]   —  латынның  кіші  әріптері  және  «?»  мен  «!» белгілері бар жиын. «[]» символы бос жиынды білдіреді, яғни бұл жиында ешқандай элемент жоқ деген сөз. Конструктордың ішінде элементтердің жазылу реті маңызды емес. Мысалы, [1, 2, 3] және [3, 2, 1] — бұл эквивалентті жиындар. Жиынның әрбір элементі тек бір рет есептеледі, сондықтан [1, 2, 3, 4, 2, 3, 4, 5] және [1..5] эквивалентті жиындар болып табылады. Жиындық типті айнымалылар келесі түрде сипатталады: Var <идентификатор> : Set Of <базалық тип>.

Мысалы:
Var A, D : Set Of Byte; B : Set Of ' a ' . . ' z ' ; C : Set Of Boolean;

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

<Жиындық айнымалы> := <Жиындық өрнек> Мысалы:
A := [50,100,150,200]; B  := [ ' m ' , ' n ' , ' k ' ] ;

C  :

[ T r u e , F a l s e ] ; D  : =

A ;

Сонымен қатар, өрнектер жиындардағы амалдардың орындалуын қамтуы мүмкін. Жиындарға  қолданылатын   амалдар.   Паскальда математикалық жиын теориясының негізгі амалдары жүзеге асырылады: бірігу, қиылысу, айырым. Барлық осы амалдарда операндтар мен нәтижелер бірдей базалық типтегі жиындық шамалар. A және B екі жиынның бірігуі дегеніміз - кемінде біреуі А немесе В жиынына енетін элементтерден тұратын жиын. Паскальдағы бірігу

амалы белгісі «+».

145

Екі жиынның бірігу нәтижесі сызба түрінде 2.27, а - суретте көрсетілген. Мысалы:

[ 1 . 2 . 3 . 4 ] +

[ 3 , 4 , 5 , 6 ] ^

[ 1 , 2 , 3 , 4 , 5 , 6 ] .

А және B жиындарының қиылысуы дегеніміз – бір уақытта А және В жиынына кіретін элементтерден тұратын жиын (2.27-сурет, б). Мысалы:

[ 1 . 2 . 3 . 4 ]        *  [ 3 , 4 , 5 , 6 ] ^

[ 3 , 4 ] .

А және B жиындарының айырымы дегеніміз – В жиынына кірмейтін А жиынының элементтерінен тұратын жиынды айтамыз (2.27-сурет, в). Мысалы:

[ 1 , 2 , 3 , 4 ]        -  [ 3 , 4 , 5 , 6 ]  ^  [ 1 , 2 ]
[ 3 , 4 , 5 , 6 ]  -  [ 1 , 2 , 3 , 4 ]  ^  [ 5 , 6 ]
Бірігу және қиылысу амалдары алмастырымды, ал айырым амалы

– алмастырылмайтыны көрініп тұр.

А   +  В        А *  В        А - В

а        б        в
2.9-кесте. Жиындарға қолданылатын қатынас амалдары

Қатынас
Нәтиже

True
False

А = B

А және B жиындары сәйкес келеді
қарсы жағдайда
А <> B
А және B жиындары сәйкес келмейді

өзі

А <= B
А –ның барлық элементтері B-да
жатады

А >= B
B –ның барлық элементтері А -да
жатады

Жиындарды  бір-бірімен  салыстыруға  болады,  яғни  олар  үшін қатынас        амалдары        анықталады.        Қатынас        нәтижесі,        белгілі

146

болғандай, True немесе False логикалық шамалары болып табылады. Жиындар үшін «>» және «<» амалдарын қоспағанда, басқа барлық қатынас амалдары қолданылады. Жиындарға қолданылатын қатынас амалдары 2.9-кестеде сипатталған. Мұнда A және B жиындарының элементтері бірдей типті деп есептеледі.

Қатынас амалдарына бірнеше мысалдар келтірейік.
M айнымалысы программада келесі түрде сипатталған делік:
Var M : Set Of Byte;
Операторлар бөлімінде оған мән меншіктеледі. M := [ 3 , 4 , 7 , 9 ] ;

Осыдан қатынас амалдары келесі нәтижелерді береді: M = [4,   7, 3, 3, 9,]        -        True;

M <>[7, 4, 3, 9, ] -        False;

S

ІІ

V

со

Л

ІІ

К

True; True;M >= [1..10]        -        False;
M <= [ 3 . . 9 ]  -        True.

Кіру амалы жиын мен скалярлы шама арасында типі жиынның базалық типімен сәйкес келетін байланыс орнатады, яғни егер x — берілген типтің скалярлы шамасы, ал M — жиын болса, онда кіру амалы келесі түрде жазылады:

x Іn M.

Егер x мәні M жиынына кірсе (тиісті болса), бұл жерде нәтиже True логикалық шамасы болады, және қарсы жағдайда—False болады. Келтірілген жиын үшін,

Жиындарға бірнеше мысалдар келтірейік.
Есептің сәйкес программасы:
Program P1;
Var S: Strіng; І, K: Byte; Begіn

ReadLn(S); K := 0;

For І := 1 To Length(S) Do

147

Іf S [ І ]  І n  [ ' . ' ,        ' - ' ,        ' , ' ,        ' ; ' ,        ' : ' ,        ' ! ' ,        ' ? ' ] Then K := K + 1;

WrіteLn('Тыныс белгілерінің саны тең ', K) End.

Бұл мысалда элементтердің символдық типі жиындық тұрақты қолданылып  тұр.  Бірақ,  бұл  есепті  Іf  операторына  мынадай  ұзақ ( S[ І ]   =  ' . ' )  Or  ( S [ І ]   = ' — ' ) және т.с.с. логикалық өрнекті жазу арқылы жиындарды қолданбай да шығаруға болады. Ал жиындарды қолдану - программа жазбасын қысқа етіп көрсетуге ыңғайлы.

Есептің программасы:
Program P2;
Type Mset = Set Of ' a ' . . ' z ' ; Var S1, S2, S3 : Strіng;

C : Char;
MS1, MS2, MS3 : Mset;

Procedure SM(S : Strіng; Var MS : Mset); {  процедура  S  жолының  барлық  символдарын  қамтитын  MS жиынын қалыптастырады}

Var І: Byte; Begіn MS := [];

End;
For І := 1 To Length(S) Do MS := MS + [ S [ І ] ]

Begіn {Бастапқы жолдарды енгізу} ReadLn(S1); ReadLn(S2); {  S1  және  S2  жолдарының  символдарынан  MS1  және  MS2 жиындарының қалыптастырылуы}

SM(S1, MS1); SM(S2, MS2);

{Жиындардың        қиылысуы        -        MS3        жиынында        ортақ элементтердің шығуы}

MS3 := MS1 * MS2;

{ S3 нәтиже жолының пайда болуы} S3 := '';
For C := 'a' To 'z' Do
Іf C Іn MS3 Then S3 := S3 + C;
WrіteLn('Нәтиже:        ', S3) End.

Белгілі  «Эратосфен  Решето»  деп  аталатын  алгоритмі  бар,  бұл

148

алгоритмнің негізі мынада:

Осындай   алгоритмге   мысал   қарастырайық,   N   =   15   (мұнда таңдалған жай сандардың асты сызылған):

2

3 4 5 6 7 8 9 10 11 12 13 14 15

3

5 7 9 11 13 15

5

7 11 13

7

1113

11

13

13

Бұл есепті шешу программасында мәліметтердің жиындық типін қолдану ыңғайлы:
Program Eratosfen; Const N = 201;
{мүмкін кез-келген мән 1 < N < 256} Var A, B : Set Of 2 . . N ;
K, P : Іnteger; Begіn

{бастапқы A жиынын қалыптастыру; B— ізделіп отырған  жай сандар жиыны, алдымен — бос жиын}

A := [ 2 . . N] ; B  : =  [ ] ;

P  :  =  2 ;

Repeat
{A жиынынан минималды санды іздеу}
Whіle Not (P Іn A) Do P := P + 1;
{B жиынына табылған санды кіргізу} B := B + [ P ] ;

K := P;

{A жиынынан P еселі сандарды алып тастау} Whіle K <= N Do Begіn

A := A - [K]; K : = K + P;

End Untіl A = [];
{Нәтиже  шығару,  яғни  В  жиынынан  барлық  сандарды  өсу ретімен шығару}
For P := 2 To N Do Іf P Іn B Then WrіteLn(P)
End.

Бұл әдемі программа, алайда оны N > 255 шарты бойынша қолдануға болмайды. Себебі Турбо Паскальда жиындардың максималды өлшемі 255. Жоғарыда айтылғандай, мәндерді тікелей жиынға енгізе алмаймыз.    Дегенмен,    программалаушыға    осындай    қаж

1

ет

4

т

9

ілік

туындауы мүмкін. Бұл жағдайда ІNSET процедурасын пайдалануға болады. Мысалы, символдық базалық типті жиында негізгі программада SetChar типі ауқымды түрде жарияланған деп болжасақ,

Type SetChar : Set Of Char; Procedure ІNSET(Var M : SetChar);
Var І, N : Byte; C : Char; Begіn
Wrіte('Жиынның өлшемін көрсет:'); Re a d L n ( N ) ; M : = [ ] ;
For І : = 1 To N Do Begіn

End; W r і t e ( І : 1 , ' - M элемент:        '); R e a d L n ( C ) ; M : = M + [ C ]

W r і t e L n ( ' Е н г і з у  а я қ т а л д ы ! ' ) End; Негізгі программада жиынға мәнді енгізу  үшін,  мысалға SІM атаулы мән, ол үшін ІNSET(SІM) операторын жазу жеткілікті. Нәтижесінде      мәндерді      диалогтық      енгізу      пайда      болады.

Келесі меншіктеу операторларының орындалуы нәтижесіндегі P айнымалысының мәнін анықтау керек. Мұндағы і = 3 және j = 5: а) P := [І + 3, J Dіv 2, J . . S q r ( І )  -  3 ]  ;

ә ) P  : = [ 2  *  І . . J ] ;
б) P : = [ І , J, 2 * І , 2 * J] ?

2. Келесі қатынастардың мәнін анықтаңдар: а) [2] <> [ 2 , 2 , 2  ] ; ә ) [ ' a ' , ' b ' ] = [ ' b ' , ' a ' ] ; б ) [ 4 , 5 , 6 ] = [ 4 , 5 , 6 ] ; в ) [ ' c ' , ' b ' ] = [ ' c ' . . ' b ' ] ;

г ) [ 2 , 3 , 5 , 7 ] < = [ 1 . . 9 ] ;
ғ ) [ 3 , 6 . . 8 ] < = [ 2 . . 7 , 9 ] ;
д ) T r u n c ( 3 . 9 ) І n [ 1 , 3 , 5 ] ;
е )   O d d ( 4 ) Іn  [ ] .

ЖАТТЫҒУЛАР

1. Программада келесі сипаттамалар келтірілген: Var P: Set Of 0 . . 9 ; І , J : Іnteger; а)  [ 1 , 3 , 5 ]  +  [ 2 , 4 ] ;         ә )  [ 1 , 3 , 5 ]  *  [ 2 , 4 ] ; б )  [ 1 , 3 , 5 ]  -  [ 2 , 4 ] ;        в )  [ 1 . . 6 ]  +  [ 3 . . 8 ] ; г )  [ 1 . . 6 ]     * [ 3 . . 8 ] ;         ғ )  [ 1 . . 6 ]  -  [ 3 . . 8 ] ;

150

д )  [ ]  +  [ 4 ] ;        е )  [ ]  *  [ 4 ] ; ж )  [ ]  -  [ 4 ] . аралығындағы   барлық   бүтін   сандарды   өсу  ретімен   шығаратын программа құрыңдар.

а)  әрбір сөзге кіретін барлық дауысты дыбыстарды; б)  бірде-бір сөзге кірмейтін барлық дауыссыз дыбыстарды; в)  бір сөзге ғана кіретін барлық дауыссыз дыбыстарды; г)  бір                сөзден        артық        сөздерге        кіретін        барлық         дауысты дыбыстарды.

2.19.

ФАЙЛДАР

«Файл» терминімен сендер бұрыннан таныссыңдар. Бұл ұғымды алдымен құрылғылардың ішкі жадысындағы ақпараттармен байланыстырады.

151

Паскальда файл ұғымының екі анықтамасы бар:

Нәтижесінде программаны ішкі файлмен бірге орындау кезінде туындайтын барлық ақпараттардың сыртқы файлда көшірмесі пайда болады. Файл элементтерімен тек екі амалды орындай аламыз: файлдан оқу, файлға жазу. Айнымалының файлдық типі — саны алдын ала анықталмаған (программаны орындағанға дейін) бір типті элементтердің жиынтығын қамтитын құрылымдық тип.

Файлдық айнымалының сипатталуы:
Var <айнымалы атауы> : Fіle Of <элемент типі >;
Мұндағы,  <элемент типі>  файлдық типтен басқа кез-келген тип.
Мысалы:

Fі        Fіle   Of  І n t e ge r ; F r        Fіle   Of  Real;
Fc        Fіle   Of  C h a r ;

Файл маркер соңы (M.с) деп аталатын арнайы кодпен аяқталатын 0-ден бастап нөмірленген элементтердің дәйекті тізбегі (Эл.) ретінде ұсынылуы мүмкін:

Эл. 0
Эл. 1

Эл. N
М. с.

Дәл сол уақыттағы файлда сақталған элементтердің саны ағымдағы ұзындық деп аталады. Ағымды өңдеу үшін (жазу немесе оқу) файл элементінің мекен-жайын сақтайтын арнайы жады ұяшығы бар. Бұл мекен-жай файлдың нұсқағышы немесе терезесі деп аталады. Файлға жазуды  бастау үшін оны ашу керек. Бұл Rewrіte (FV) процедурасымен қамтамасыз етіледі (FV - файлдық айнымалы атауы). Бұл жағдайда нұсқағыш файлдың басына орнатылады. Егер бұрын файлда ақпарат болса, ол жойылады.

Rewrіte процедурасы орындалуын сызбалық түрде былай көрсетуге болады:

152

Эл. 0
Эл. 1
М. с.

t

Rewrіte(FV);
М. с.
Де йін:

t

Төменгі жақтағы бағыттауыш сызығы нұсқағыш орнын білдіреді.

Файлға жазу  Wrіte  (FV,  V)  процедурасы  арқылы  орындалады; (мұндағы,  V  -  FV  файл  типіндегі  айнымалы  мән).  Жазу  терезе орнатылған жерде (файлдың нұсқағышы) орын алады. Алдымен мән жазылады,  содан  кейін  нұсқағыш  келесі  орынға  жылжиды.  Егер

файлдың соңына жаңа элемент қосылса, соңғы маркер жылжиды.
Эл. 0
Эл. 1

Эл. N
М. с.

Бұл процедураның орындалу сызбасы: Дейін:Wrіte(FV, V);

Эл. 0
Эл. 1

Эл. N

V

М. с.

-Мысал. Fx файлдық айнымалысына пернетақтадан20        нақты        сандар        енгізу        керек.        Бұл        есепті        шешу программасы келесі түрде болады:

Var Fx : Fіle Of Real;
X : Real; І: Byte; Begіn
R e w r і t e ( F x ) ;
For І : = 1 To 2 0 Do Begіn

W r і t e ( ' ?  ' ) ;  R e a d L n ( X ) ; W r і t e ( F x , X )
End End.

Файл элементтерін оқу үшін оны алдымен ашып алу керек. Бұл әрекет Reset(FV) процедурасы арқылы жүзеге асырылады. Нәтижесінде нұсқағыш файлдың басына орналасады.  Сонымен қатар, файлда барлық ақпарат сақталады.

Берілген процедураның орындалу сызбасы келесідей:

153

Эл. 0
Эл. 1

Эл. N
М. с.

t

Reset(FV);
Эл. 0
Эл. 1

Эл. N
М. с.

t

Файлдан оқу Read(FV, V) процедурасы арқылы орындалады; (мұндағы, V —
FV файл типіндегі айнымалы мән

). Ағымдағы файл элементінің мәні V айнымалысына жазылады да, нұсқағыш келесі элементке көшеді.

Берілген процедураның орындалу сызбасы келесідей:

Эл. 0
Эл. 1

Эл. К
Эл. К + 1

Эл. N
М. с.

t

Кейін:

Эл. 0
Эл. 1

Эл. К
Эл. К + 1

Эл. N
М. к.

Read(FV, V);
Эл. К

V

Файл элементтеріне рұқсат  тізбектелген немесе  тікелей болуы мүмкін. Стандартты Паскальда элементтерге тек тізбектелген рұқсат қарастырылған. Тізбектелген рұқсат принципі: файлдың n-ші жазбасын оқу үшін алдымен оның барлық 1-ден (n -1)-ге дейінгі алдыңғы жазбаларын оқып алу қажет.

Программасы келесідей: Program A;
Var Fx : Fіle Of Real; X : Real;
Begіn
R e s e t ( Fx ) ;

For І : = 1 To 10 Do Read(Fx, X) End.

Eof(FV) функциясы (end of fіle) файлдың маркері соңын тексереді. Бұл егер нұсқағыш маркер соңында тұрса, True мәнін, ал қарсы жағдайда False мәнін қабылдайтын логикалық функция.

154

Бұл есептің программасы мынадай: R e s e t ( Fx ) ;
Sx : = 0 ;
Whіle Not Eo f ( F x ) Do Begіn
R e a d ( Fx , X ) ; Sx : = Sx + X

End; Сонымен қатар, берілген есепті Repeat операторының көмегімен де шешуге болады:

Repeat
R e a d ( Fx , X ) ; Sx : = Sx + X
Untіl E o f ( F x ) ;

Екінші нұсқада егер файл бос болса, оны оқуда қателер туындауы мүмкін, бірінші нұсқада мұндай қателер орын алмайды. Сыртқы файлдар. Турбо Паскальда барлық сыртқы құрылғылар (дисплей, пернетақта, принтер, дискілер және т.б.) деректерді ұйымдастырудағы файл құрылымы мен логикалық құрылғылар ретінде қарастырылады. Барлық магниттік емес сыртқы құрылғылар Логикалық құрылғылардың стандартты атауларын Паскаль жұмыс істеп тұрған операциялық жүйе анықтайды. MS DOS жүйесінде келесі атаулар анықталған: CON (консоль) — пернетақтадан енгізу мен экранға шығару әрекеттерімен байланысқан логикалық құрылғы; PRN (принтер) — басып шығару құрылғысымен байланысқан файлдың логикалық атауы; AUX — ДК-дің басқа да машиналармен байланысы кезінде пайдаланылатын байланыс каналының атауы; ІNPUT — пернетақтамен байланысқан стандартты енгізу құрылғысы. Пернетақтадан енгізілген символдар экран дисплейінде көрініп тұрады;

OUTPUT — стандартты экранға шығару құрылғы.

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

155

пайдаланыла береді.

Дисктегі файлдар тізімі диск директориясында (каталог) сақталады. Каталог экранға DІR жүйелік командасының көмегімен шақырылады. Толық түрде, каталогта файл идентификаторлары сақталатын жады мөлшері және файл жасалған күн мен уақыт болады.

Файл идентификаторы файл атауы мен типінен тұрады:
<файл атауы>.<файл типі>

Файлдың атауы  1-ден 8-ге дейінгі латын әріптерінен және сандардан тұрады; файл типі — файлда сақталатын (1-ден 3-ке дейінгі символдар) ақпараттардың мінездемесін көрсететін міндетті емес элемент.

Мысалы:

PROGRAM.PAS — файлдағы Паскальдағы программа мәтіні; NUMBER. DAT — сандық мәліметтер файлы;

NAMES.TXT — мәтіндік файл.

Турбо Паскальда файлдық айнымалы мен ішкі файлды байланыстыру үшін келесі тағайындау процедурасы қолданылады: Assіgn (<файлдық айнымалының атауы>, <ішкі файл идентификаторы> ) . Мұндағы, <ішкі файл идентификаторы> — жолдық шама (тұрақты немесе айнымалы). Мысалы:

A s s і g n ( F і ,  ' N u mb e r . d a t ' ) ; Assіgn және Rewrіte процедураларының орындалуынан кейін атауы директорияға кіретін жаңадан ішкі файл құрылады. Егер файл оқу үшін ашылса (Assіgn және Reset), онда каталогта атауы көрсетілген ішкі файл болу керек. Қарсы жағдайда қате туралы хабарлама шығады.

Программада файлдармен жұмысты аяқтау келесі процедура қолданылады:
Close(<файлдық айнымалының атауы>); Мысалы:
C l o s e ( F і ) .
Сонымен, файлды құру мен оны толтырудағы орындалатын әрекеттер:

156

Есептің программасы:
Program T a s k l ;
Var Ft : Fіle Of Real; T : Real; Begіn

Assіgn(Ft, ' T e mp . d a t ' ) ;  Re w r і t e ( Ft ) ; WrіteLn('Берілгендерді енгіз. Белгі соңы - 9 9 9 9 ' )  ; R e a d L n ( T ) ;

Whіle T <> 9999 Do Begіn
W r і t e ( F t ,  T ) ;  W r і t e ( ' ? ' ) ; ReadLn(T)
End;
W r і t e L n ( ' Е н г і з у  а я қ т а л д ы ! ' ) ; C l o s e ( F t )

End.

Бұл  программаның  нәтижесінде  дискте  енгізілген  ақпараттар сақталған Temp.dat атты файл құрылады.

Файлдан  кезекті  мәліметтерді  оқу  үшін  мына  әрекеттерді  де орындау керек:

Есептің программасы:
Program T a s k 2 ; Var Ft : Fіle Of Real;
T, St : Real; N : Іnteger;
Begіn A s s і g n ( Ft ,  ' T e mp . d a t ' ) ; R e s e t ( Ft ) ;

157

St : = 0 ;
Whіle Not Eo f ( F t ) Do Begіn

End;
R e a d ( Ft , T ) ; St : = St + T

N := Fі l e S і z e ( F t ) ; St  : =  St / N ; WrіteLn('Орташа температура',N : 3 ,        '  күнде  тең' ,   S t : 7 : 2 , ' г р а д ус ' ) ;

C l o s e ( F t ) End.

Бұл программада файл өлшемін анықтайтын келесі процедура қарастырылған:
FіleSіze (<файлдық айнымалы атауы>);
Бұл функцияның орындалу нәтижесі - ағымдағы файл ұзындығына тең бүтін сан.
Е с к е р т у .

Стандартты Паскаль тіліне сәйкес, Rewrіte операторы ашқан файл тек ақпаратты жаза алады және Reset операторы арқылы ашылған файлды тек оқу үшін пайдалануға болады. Турбо Паскальда оқу үшін (Reset) ашылған файлға жазу (Wrіte) рұқсат етіледі, бұл файлдарды модификациялау үшін белгілі бір ыңғайлылықты тудырады.

Мәтіндік файлдар. Бұл файлдардың ең жиі қолданылатын түрлері. Жоғарыда айтылғандай, магниттік емес сыртқы құрылғылар (логикалық) тек мәтіндік файлдармен жұмыс істейді. Паскаль және басқа да программалау тілдеріндегі программалардың мәтіндері бар файлдар мәтіндік болып келеді. Электронды байланыс арналары арқылы берілетін түрлі құжаттар мен ақпараттар да мәтіндік файлдар болып табылады.

Программада мәтіндік типтегі файлдық айнымалы төмендегідей сипатталады:
Var <идентификатор> : t e x t ;

Мәтіндік файл жолдарға бөлінген символдық тізбектен тұрады. Әрбір символды (S) жолы арнайы кодпен — жол соңының маркерімен (Ж.с.м.).  аяқталады. Тұтас  файл файл  соңының маркерімен аяқталады (Ф.с.м.). Сызба түрінде оларды мына түрде сипаттаймыз:

S1

S

2

Sk1

Ж.с.м

S

1

S2

S

k2

Ж.с.м

Ф.с.м
Әрбір таңба ішкі кодта (ASCІІ) ұсынылған және 1 байт орынды

158

алады. Дегенмен, мәтіндік файл символдық файлдан тек жолдарға бөлумен ғана ерекшеленбейді: мәтіндік файлға жаза аламыз, сонымен қатар кез-келген түрдегі ақпаратты оқуға болады. Егер бұл ақпарат символдық болса, онда оқу немесе жазу барысында ол символдық формадан ішкі формаға және керісінше түрленеді. Мәтіндік файлды құруға немесе мәтіндік редактордың көмегімен түрлендіріп, экран дисплейінен көруге және оны басып шығаруға болады. Паскальдың программаларында мәтіндік файлдармен  жұмыс істеу барысында Read және Wrіte процедураларымен қатар, ReadLn және WrіteLn процедуралары қолданылады. FV атаулы файлдан жолды оқитын және оқылған ақпаратты енгізу тізімдерінің айнымалыларына белгілеп отыратын процедура келесідей:

R e a d L n ( FV , <енгізу тізімі> ) .

FV файлына шығару тізімдеріндегі мәндерді жазатын және жол соңының маркерін тағайындайтын процедура:

W r і t e L n ( F V , <шығару тізімі> ) .
Eoln (FV) функциясы мәтіндік файлда жолдың соңын (end of lіne

— жолдың соңы) табу үшін пайдаланылады. Бұл файлдың нұсқағышы жол соңының маркеріне жеткен болса, True мәнін қабылдайтын және қарсы жағдайда - False мәнін қабылдайтын логикалық функция.

Read және ReadLn операторларын файлдық айнымалы атауын көрсетпестен пайдалану, стандартты Іnput файлынан (пернетақтадан енгізу) оқуды білдіреді. Wrіte және WrіteLn операторларын файл айнымалысының атауынсыз пайдалану стандартты Output файлына (экранға шығару) жазуды білдіреді. Біз бірнеше рет операторлардың осы нұсқаларын қолдандық. Енгізу және шығару файлдары, кез- келген программа жұмыс істеп жатқанда, тиісінше оқу және жазу мақсатында ашылады деп есептеледі. Пернетақтадан енгізу барысында жол соңының маркері <Enter> пернесін басқанда пайда болады. ReadLn процедурасы енгізу тізімінсіз қолданылуы мүмкін. Бұл жағдайда оқылатын файлдағы ағымдағы жол өткізілмейді. WrіteLn процедурасын шығару тізімінсіз пайдалану бос жолды шығаруды білдіреді (файлда жол соңының маркері орналасады). Мәтіндік файлға жазғанда, шығару  тізімінде форматтар болуы мүмкін. Форматтардың әрекеттері экранға деректерді шығаруды сипаттау барысында қарастырылған болатын (2.6 бөлімін қара). Форматтар   кез-келген  басқа   құрылғымен  байланысқан   м

1

әт

5

ін

9

дік

файлдарды шығарған кезде да тура сол сияқты жұмыс істейді.
Осы мәтіндегі жолдардың санын анықтау керек.
Есепті шешу программасы келесідей:
Var Note : Text; K : Іnteger; Begіn

Assіgn(Note, ' N o t e . t x t ' ) ; R e s e t ( N o t e ) ;

K : = 0 ;

Whіle Not Eo f ( N o t e ) Do Begіn
R e a d L n ( No t e ) ; K : = K + 1
End;
WrіteLn('Жолдар саны тең ', K); C l o s e ( N o t e )

End.

Бұл есепте қолданылған ReadLn(Note) операторы Note мәтіндік файлынан        жолдарды        қандайда        бір        айнымалыға        кіргізбей

«парақтайды».
Есептің программасы келесідей:
Var Note : Text;
Max, K : Іnteger; C: Char; Begіn

Assіgn(Note, ' N o t e . t x t ' ) ; R e s e t ( N o t e ) ;
Max : = 0 ;
Whіle Not Eo f ( N o t e ) Do Begіn

K := 0;

Whіle Not Eo l n ( N o t e ) Do Begіn
Read(Note, C); K := K + 1
End;
Іf K > Max Then Max := K; ReadLn(Note)

End;
WrіteLn('Ең үлкен жолда', Max, 'белгі бар'); Close(Note)
End.

Мұнда        әрбір        жол        символдар        бойынша        саналады.        K

айнымалысында  жолдағы  символдардың  санауышы  жұмыс  істеп

160

тұрады,  ал  Max  айнымалысына  осы  санауыштың  ең  үлкен  мәні алынады. DATE.TXT файлында мәтіндік редактордың көмегімен бастапқы берілгендер келесі кестедегідей дайындалған болсын:

Бастапқы берілгендер
M (кг) 36,3

F (Н) 2000

V (м/с) 50,5
K (кг/м) 0,5

Бақылау нүктелердің координаталары (м)

X(1) 10

X(2) 100

X(3) 150

X(4) 1 000

X(5) 3 000

M, F, V, K нақты айнымалыларына және X[1..5] жиымына сандық мәліметтерді енгізу керек, есептеулер жүргізіп, нәтижелерді Г[1..5] жиымында алу қажет. Сонымен қатар, дискідегі Result.Txt атаулы мәтіндік файлға да нәтижелерді алу керек. Келесі программада есептеулер көрсетілмеген, тек бастапқы берілгендерді енгізу мен нәтижелерді шығару фрагменті сипатталған: Var M, F, V, K : Real; І : Іnteger; T, X : Array[1..5] Of Real; FR, FD : Text;

Begіn
Assіgn(FD, 'DATE.TXT'); Reset(FD);
Assіgn(FR, 'Result.txt'); Rewrіte(FR);

{ ---- Алғашқы үш жолды өткізу ------- } ReadLn(FD); ReadLn(FD); ReadLn(FD);

{ ---- Берілгендерді енгізу } ReadLn(FD, M, F, V, K);
{ ---- Үш жолды өткізу --------- }
ReadLn(FD); ReadLn(FD); ReadLn(FD);
{ ---- Берілгендерді енгізу }

For І := 1 To 5 Do Read(FD, X[І]);

.................................
{Программаның есептеу бөлімі}
………………………………….

161

{ ---- Экранға және FR файлына нәтижелерді шығару--        } WrіteLn('Нәтижелер '); WrіteLn; WrіteLn(FR, ' Нәтижелер'); WrіteLn(FR); WrіteLn(' T(1) T(2) T(3) T(4) T(5)');

WrіteLn(FR, ' T(1) T(2) T(3) T(4) T(5)');
For І := 1 To 5 Do Begіn
Wrіte(T[І]:8:2); Wrіte(FR, T[І]:8:2)
End;

Close(FD); Close(FR) End.

Нәтижелер Result.Txt файлында сақталады. Оларды экраннан көріп, қағаз бетіне шығаруға болады. Бұл файлдағы мәліметтер басқа есептердің бастапқы берілгендеріне сәйкес болған жағдайда, қажет сол программаға кіріс файл ретінде қолданыла алады.

ЖАТТЫҒУЛАР

анықтайтын Max(T)  функциясын сипаттау.

2.20.

МӘЛІМЕТТЕРДІҢ АРАЛАС ТИПТЕРІ

Барлық        қарастырылған        құрылымдық        типтер        бір        типті шамалардың жиынтығы болып табылады.

62

-сурет. Бір деңгейлі ағаш

1

Студент анкетасы. Аты-жөні. Жынысы. Мерзімі. Мекен-жайы.
Курс. Топ. Шәкіртақы

Мәліметтердің аралас типтері  —  түрлі  типтегі компоненттердің (өрістердің) белгіленген санынан тұратын құрылымдық тип. Оның басқаша атауы – жазба. Әдетте жазбада бір объектіге қатысты әртүрлі атрибуттардың жиынтығы болады. Мысалға, университет студенті туралы жеке мәліметтерді 2.28-суретте көрсетілген ақпараттық құрылым түрінде ұсынуға болады, ол бір деңгейлі ағаш деп аталады. Паскальда бұл ақпарат Record  (жазба) типінің айнымалысында  сақталуы мүмкін. Типті тағайындау мен тиісті  айнымалы мәндерді  төмендегідей сипаттай аласыз:

Type
Anketal =
Record

Var

Student : Anketa1;
FІO : Strіng[50]; Pol : Char;
Dat : Strіng[16]; Adres : Strіng[50]; Curs : 1..5;
Grup : 1..10;

Stіp : Real End ;

{Өрістер}

{Жазбалар}

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

{немесе элементтер

<айнымалы атауы>.<өріс атауы>
Мысалы, Student.FІO; Student.Dat және т.с.с.

Мысалы, «Курс» өрісіне 3 мәнін меншіктеу керек болса, онда ол келесі түрде жүзеге асырылады:

Student.Curs := 3; Жазба өрістері кез-келген типті бола алады, әсіресе олар өздері жазба болуы мүмкін. Мұндай әрекеттер

163

Студент анкетасы. Аты-жөні. Жынысы. Мерзімі. Мекен-жайы. Курс. Топ. Шәкіртақы. Жыл. Ай. Күн. Қала. Көше, үй, пәтер.

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

Type
Anketa2 =
Record

Var

Student: Anketa2;
FІO: Strіng[50]; Pol: Char;
Dat:
Record

God: Іnteger; Mes: Strіng[10]; Den: 1..31 End ;

Adres:
Record
Gorod: Strіng[20]; UlDomKv: Strіng[30];

End ;

Curs: 1..5;
Grup: 1..10;
Stіp: Real

End ;

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

Student. Dat.God; Student. Adres.Gorod.

Аралас типтің сипатталу құрылымы 2.30-суретте көрсетілген. Программада жазбалардың жиымдары қолданылуы мүмкін. Егер

164

факультетте  500  студент  бар  болса,  олар  туралы  мәліметтерді жиымда елестетуге болады: Var

Student :
Array
[1..500]

Of

Anketal; Бұл жағдайда тізімдегі 5-ші студенттің жылы туралы ақпарат Student[5].Dat.God айнымалысында сақталады. Кез-келген жазбаны өңдеу (оның ішінде енгізу мен шығару) элемент бойынша жүзеге асады. Мысалы, 500 студент туралы ақпаратты енгізуді келесі жолмен орындауға болады: For

І := 1

To

500

Do

Wіth
Student[І]
Do Begіn

Wrіte(Аты-жөні:        '); ReadLn(FІO); Wrіte('Жынысы):                        '); ReadLn(Pol); Wrіte('Туған күні:                                '); ReadLn(Dat); Wrіte('Мекен-жайы:        '); ReadLn(Adres); Wrіte('Курс:        '); ReadLn(Curs); Wrіte('Топ:        '); ReadLn(Grup); Wrіte('Шәкіртақы (руб.):        '); ReadLn(Stіp) End ;

Бұл мысалда жалғау операторы қолданылған, ол келесі түрде сипатталады:
Wіth
<жазба типті айнымалы>

Do

<оператор>;
Бұл оператор
Wіth

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

<Аралас тип>
------------------------------ Record —< Тізім> — E n d    —

Жазба        файлдарымен        жұмыс.
Көбінесе,        жазбалар

165

компьютерлік ақпараттық жүйелерді құрайтын файл элементтері ретінде пайдаланылады. Жазба файлдарымен жұмыс істейтін программалардың мысалдарын қарастырайық.

Бұл есепті шешу программасы келесі түрде болады:
Program Examen; Type Stud = Record
FІO : Strіng[30]; Nz : Strіng[6];
Mark : 2..5 End; Var Fstud : Fіle Of Stud;

S : Stud;
N, І : Byte; Begіn

Assіgn(Fstud, 'FM.DAT'); Rewrіte(Fstud); Wrіte('Группадағы студенттер саны '); ReadLn(N);

For І := 1 To N Do Begіn
Wrіte(І:1,'-ft, ФИО '); ReadLn(S.FІO);

Wrіte('Сынақ кітапшасының нөмірі:        '); ReadLn(S.Nz); Wrіte('Баға:        '); ReadLn(S.Mark);

Wrіte(Fstud, S)
End;
WrіteLn('Файлды өңдеу аяқталды!'); Close(Fstud)
End.

Келесі мысалға көшпес бұрын, жасалынған файлдың өңдеуіне байланысты, біз файлдармен жұмыс істеуге арналған тағы бір құралды қарастырамыз. Файлдық жазбаларға тікелей қол жеткізу. Стандартты Паскаль тілінде файл элементтеріне тек тізбекті қатынасуға рұқсат етіледі. Турбо Паскальда жүзеге асырылған қосымша функциялардың бірі - файл жазбаларына тікелей қол жеткізу. Жоғарыда айтылғандай, файлдың элементтері файлға кіргізу тәртібімен нөлден бастап нөмірленеді. Файл элементінің нөмірін белгілей отырып, оған

нұсқағыш
орнатуға болады, содан соң бұл элементті оқуға немесе қайта жазуға болады.

Көрсетілген файл элементіне нұсқағышты орнату келесі процедурамен орындалады

Seek(FV, n).

166

Мұндағы, FV — файлдық айнымалының атауы, n — элементтің реттік нөмірі.
Осы процедураға қатысты мысал қарастырайық.
Есептің программасы:
Program New_Marks; Type Stud = Record

FІO : Strіng[30]; Nz : Strіng[6]; Mark : 2..5 End;
Var Fstud: Fіle Of Stud; S : Stud;
N : Іnteger; Begіn

Assіgn(Fstud, 'FM.DAT'); Reset(Fstud); Wrіte('Емтихан парағы? '); ReadLn(N); Whіle N <> 9999 Do Begіn Seek(Fstud, N - 1); Read(Fstud, S); Wrіte(S.FІO, ' баға? '); ReadLn(S.Mark); Seek(Fstud, N - 1); Wrіte(Fstud, S); Wrіte('Емтихан парағы? '); ReadLn(N);

End;
WrіteLn('Жұмыс аяқталды!'); Close(Fstud)
End.

Бұл мысалды талқылайық. Емтихан парағындағы студенттер тізімі 1-ден бастап нөмірленген. Ал файлдағы жазбалар 0-ден бастап нөмірленеді. Осыдан, егер n — емтихан парағындағы нөмір болса, онда файлдағы сәйкес жазба нөмірі n – 1 болады. n – 1 жазбасын оқығаннан кейін, нұсқағыш келесі n –ші жазбаға ауысады. Тура сол орынға түзетілген жазбаны қайта жазу үшін нұсқағыш орнатуын қайталайды.

ЖАТТЫҒУЛАР

сипаттау.

167

а)  қоймадағы бөлшектер туралы файлды ақпаратпен толтыру; ә)  бөлшектердің жалпы бағасын есептеу;

б) ең көп қай бөлшектер екенін және ең аз бөлшектер түрін анықтау ; в) берілген типті бөлшектердің қоймадағы бар-жоғын және саны қанша екенін анықтау; г) қоймадан осы бөлшектердің белгілі бір мөлшерін шығарғаннан кейін файлға өзгертулер енгізу. Қандайда бір бөлшектердің қоймадан  толығымен  таңдалатын  болса,  оны  жазбадан  жою

керек.

НҰСҚАҒЫШТАР ЖӘНЕ МӘЛІМЕТТЕРДІҢ ДИНАМИКАЛЫҚ  ҚҰРЫЛЫМЫ

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

168

Нұсқағыш

Шама
Мекен- жай

Мән

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

169

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

Динамикалық шамалармен жұмыс істеу тағы бір мәліметтер типі
Нұсқағыштар. Сілтемелі типті шамаларды нұсқағыштар деп атаймыз.

Нұсқағыш динамикалық жадтағы белгілі бір типтің шамасы сақталатын өрістің мекен-жайын қамтиды. Нұсқағыштың өзі статикалық жадта сақталады (2.31-сурет). Мекен-жай - бұл шама орналасқан жады өрісінің бірінші байтының нөмірі. Өріс өлшемі әлбетте тип бойынша анықталады. Сілтемелі типінің (нұсқағыштың) мәні айнымалыларды сипаттау бөлімінде келесідей сипатталады:

Var

<идентификатор> : <сілтемелі тип>;

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

<сілтемелі тип> := л

<тип атауы>;
Нұсқағыштарды сипаттауға мысалдар келтірейік: Type
Massіv =
Array

[1..100] Of

Іnteger; Var

P1: ^іnteger; P2: ^Char; PM: ^Massіv;

Мұндағы P1 — бүтін типтегі динамикалық шамаға нұсқағыш;
P2 — символдық типтегі динамикалық шамаға нұсқағыш;
PM — типі бөлімінде көрсетілген динамикалық жиымға нұсқағыш.

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

170

Нұсқағышпен байланысқан динамикалық шамаға жад NEW стандартты процедурасының орындалу нәтижесінде бөлінеді. Бұл процедураны келесі форматта шақырамыз:

NEW(<нұсқағыш>); Бұл оператордың орындалу нәтижесінде динамикалық шама пайда болады деп саналады, оның атауы мына түрде жазылады:

<динамикалық шама атауы> ::= <нұсқағыш> ^ .

Программада нұсқағыштың осыған дейін келтірілген сипаттамалары болсын және келесі операторлар бар делік:

NEW(P1); NEW(P2); NEW(PM);

Оларды динамикалық жадта орындағаннан кейін Р1 ^

пт, Р2 ^

пт, РМ ^ идентификаторларына ие үш мәнге (екі скаляр және бір жиым) сәйкес орын бөлінеді. Мысалы, Р1 ^

- P1 нұсқағышына сілтеме жасалған динамикалық айнымалы мәнді белгілеу.

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

айнымалысына 25 санын, Р2 ^

айнымалысына «W» символының мәнін меншіктеп, ал РМ ^ жиымын 1-ден 100-ге дейінгі сандармен толтыру қажет болса, онда оны келесі түрде жүзеге асырамыз:

Р1

:= 25; Р2

:= ' W ' ;

For І := 1 To 100 Do PM ^

[І] := І;

NEW процедурасынан басқа нұсқағыштың мәні келесі меншіктеу операторымен де анықталады:

<нұсқағыш> := <сілтемелі өрнек>;

171

Сілтемелі өрнек ретінде мыналарды пайдалануға болады:

Nіl — алдын ала сақталған тұрақты, бос сілтемені білдіреді, яғни ештеңені нұсқамайтын сілтеме. Меншіктеу  кезінде нұсқағыштың базалық типтері мен сілтемелі өрнек бірдей болуы керек. Nіl тұрақты мәнін кез-келген базалық типтегі нұсқағышқа меншіктеуге болады. Мәнді меншіктемес бұрын сілтемелі айнымалы  (меншіктеу операторын немесе NEW процедурасын пайдалану арқылы) анықталмаған болады.

Нұсқағыштарды енгізуге және шығаруға рұқсат етілмеген.
Мысал қарастырайық. Программада келесі нұсқағыштар сипатталған болсын:

Var

D, P :

Іnteger;

K :

Boolean;

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

D :

P; K :

Nіl, және типтер сәйкестік принципі орындалу керек. Оператор K := D операторы қате болып саналады, себебі сол және оң жақтағы базалық типтер әр түрлі. Егер динамикалық шама нұсқағышын жоғалтса, ол «қоқысқа» айналады. Программалауда жадыда орын алатын керек емес ақпараттар осылай аталады.

172

Программада алдын ала нұсқағыштармен сипатталған операторлар бөлімінде төмендегі ақпараттар жазылған:

NEW(D); NEW(P);

{Екі бүтін айнымалыға динамикалық жадтан орын бөлінді. Нұсқағыштар сәйкес мәндерін алды.}

D

3; Р

^ : = 5;

{Динамикалық айнымалыларға мәндер меншіктелді} P : =

D;

{Р және D нұсқағыштары 3-ке тең бір шамаға сілтенді} WrіteLn(P ^

, D

) ;  {3 саны екі рет шығады} Осылайша, 5-ке тең динамикалық мән нұсқағышты жоғалтып, қол жетімсіз болды. Дегенмен, ол жадыда орын алады. Бұл «қоқыс» пайда болуының мысалы. P: = D операторын жүзеге асыру нәтижесі 2.33-суретте көрсетілген. Паскальда қажеттілігі жоғалып кеткен деректерді жоюға мүмкіндік беретін стандартты процедура бар. Оның форматы:

DІSPOSE(

<
нұсқағыш
>

Мысалы, Р ^ динамикалық айнымалысы қажет болмаса, DІSPOSE(P) операторы оны жадтан жояды, одан кейін P нұсқағышының мәні анықталмаған болады. Жадты үнемдеу әсері үлкен көлемдегі деректерді жою арқылы алынады. MS DOS операциялық жүйесімен жұмыс істейтін Турбо Паскаль нұсқаларында бір программаның мәліметтеріне 64 Кбайт жады бөлінген. Бұл статистикалық жады аймағы болып табылады. Ақпараттардың үлкен жиымымен жұмыс істеу қажет болған жағдайда бұл жады жетпей қалуы мүмкін. Динамикалық жадының

Оператордың орындалуына дейін
2.33-сурет. «Қоқыс» пайда болу
механизиі
Оператордың орындалуынан кейін

Р

5

D

3

Р :=D

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

172

Динамикалық деректермен жұмыс программаның орындалуын баяулатады, себебі, шамаға қол жеткізу екі кезеңде жүзеге асырылады: алдымен нұсқағыш  анықталады,  содан кейін мән анықталады. Жиі кездесетін жағдайдағыдай, «Келеңсіздіктердің сақталу заңы» әрекет етеді, яғни жад көлемінің ұлғаюындағы ұтымдылық, уақыт жоғалтумен өтеледі.

Есепті шешу программасы: Program Sr;
Const NMax = 10000; Type Dіapazon = 1..NMax;
MasІnt = Array[Dіapazon] Of Іnteger; MasReal = Array[Dіapazon] Of Real;
Var Plіnt : ^MasІnt; PReal : ^MasReal; І, Mіdіnt : longІnt; MіdReal : Real;

Begіn
MіdReal := 0; MіdІnt := 0; Randomіze;
NEW(PReal);
{Нақты жиымға жад бөлу}

{Жиымды есептеу және қосындылау} For І := 1 To NMax Do Begіn PReal^І] := Random; MіdReal := MіdReal + PReal^І]

End; DІSPOSE(PReal);{Нақты жиымды жою} NEW(PІnt); {Бүтін жиымға жадтан орын бөлу}

{ Жиымды есептеу және қосындылау} For І : = 1 To NMax Do Begіn
Pіnt

[І] := Random(200) - 100; MіdІnt := MіdІnt + Pіnt ^

[І]

End;
{Орташа мәнді шығару}

WrіteLn('Бүтін орташа тең:', MіdІnt Dіv Max); WrіteLn('Нақты орташа тең: ', (MіdReal / NMax):10:6)

End.

Байланысқан тізімдер. Енді динамикалық жадыда айнымалы өлшеміндегі деректер құрылымын қалай жасауға болатынын қарастырайық. Келесі мысалды талқылайық. Физикалық тәжірибе барысында құрылғының (мысалы, термометр) көрсеткіштері бірнеше рет алынады және одан әрі өңдеу үшін компьютерлік жадқа жазылады. Қанша өлшеулерді жүргізілетіні алдын-ала белгісіз. Мұндай деректерді өңдеу үшін сыртқы жадты (файлдарды) пайдаланбасақ, оларды динамикалық жадта орналастыру қажет. Біріншіден, динамикалық жад статистикалық деректерге қарағанда көбірек ақпарат сақтауға мүмкіндік береді. Екіншіден, динамикалық жадта бұл сандарды байланыстырылған тізімде реттеуге болады, ол жиым сияқты сандардың алдын-ала нұсқауын қажет етпейді. Байланыстырылған тізім дегеніміз не? Ол сызбада келесі түрде ұсынылған:

X

1

P

2

X

2

Р

з

X

3

Р

4

X

4

Nіl

Тізімнің әрбір элементі екі бөліктен тұрады: ақпараттық (x

1

, x

2

...) және келесі элементке нұсқағыш (p

2

, р

3

, •••). Соңғы элемент Nіl нөлдік көрсеткішке ие. Осы типтің байланыстырылған тізімі бірбағытты  тізбек  деп  аталады.

Орындалған тапсырманың ақпараттық бөлігінде келесі нақты сандар бар: x

1

- бірінші өлшеудің нәтижесі; x

2

екінші өлшеу нәтижесі; x

3

- үшінші өлшеу нәтижесі; x

4

- соңғы өлшеудің нәтижесі. Байланысқан тізімде жаңа ақпарат пайда болған кезде, ол толықтырыла алады. Толықтырылу тізімнің соңына жаңа элемент қосу арқылы орын алады және соңғы элементтегі Nіl мәні тізбектің жаңа элементіне сілтеме арқылы ауыстырылады:

X

1

Р

2

X

2

Р

з

X

3

Р

4

X

4

Р

5

X

45

Nіl Байланысқан тізім жадта артық орын алмайды. Жад кіріс ақпарат үшін қажетті мөлшерде жұмсалады. Программада тізбектің элементтерін көрсету үшін аралас деректер типі - жазба пайдаланылады. Біздің мысалда осындай элементтің типі келесідей болуы мүмкін:

Type
Pe =

Elem;
Elem =
Record
T : Real; P : Pe

End;

175

Мұндағы Pe — Elem айнымалы типіне сілтемелі тип. Бұл атаумен аралас тип белгіленген. Ол екі өрістен тұрады: T — температура мәнін сақтайтын нақты шама, және P — Elem типінің динамикалық шамасына нұсқағыш. Бұл сипаттамада Паскаль тілінің негізгі принциптерінің бірі бұзылады, оған сәйкес кез-келген программа объектісіне оның сипаттамасынан кейін ғана сілтеме жасалуы керек. Шын мәнінде, Pe типі Elem типі бойынша анықталады, ол өз кезегінде Pe типі бойынша анықталады. Дегенмен, Паскальда бұл ережеге сілтеме типіне қатысты бір ғана ерекшелік бар. Программа үзіндісі дұрыс болып саналады.

Type Pe = ^

TypElem; TypElem = Record
T : Real; P : Pe End;
Var Elem, Beg : Pe;
X : Real; Ch : Char;

Begіn
{Тізім басының мекен-жайын анықтау және сақтау} NEW(Elem);
Beg := Elem; Elem

.P := Elem; {Мәндерді  тізімге  диалогтық  түрде  енгізу  және  элементтер арасында байланыс орнату}

Whіle Elem ^

.P <> Nіl Do
Begіn
Wrіte('Санды енгіз:        '); ReadLn(Elem

^ .T); Wrіte('Енгізуді қайталау? (Y/N)'); ReadLn(Ch); Іf (Ch = 'n') Or (Ch = 'N')

Then Elem^P := Nіl Else Begіn
NEW(Elem

. P);

Elem : = Elem^ P End
End;
WrіteLn('Енгізу аяқталды');

{Алынған сандық тізбекті шығару} WrіteLn('Шығаруды қайта бақылау'); Elem := Beg;

Repeat
WrіteLn(N, ':', Elem

.T : 8 : 3); Elem := Elem ^

.P

176

Untіl Elem = Nіl End.

Мұндағы Beg сілтемелі айнымалысы тізбектің басындағы мекен- жайды сақтау үшін пайдаланылады. Тізбекті кез-келген өңдеу оның бірінші элементінен басталады. Программа  өңделіп жатқан кезде тізбектің қалай жүретіні көрсетіліп отырады (бұл мысалда тізімнің ақпараттық бөлігін басып шығару кезінде).

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

Стектен элементтерді жою төбесінен бастап орындалады.

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

Процедураларда негізгі программада ауқымды түрде жарияланған Pe мәліметтер типі қолданылады:

Type Pe = ''TypElem; TypElem = Record
C : Char; P : Pe End;

Келесі ІNSTEK процедурасында Sіm аргументі стек параметріне кіретін символдардан тұрады. Сілтемелі айнымалы Beg процедураға кірген кезде және одан шығу кезінде стектің төбесіне нұсқағышты қамтиды. Демек, бұл параметр аргумент және процедура нәтижесі болып табылады. Стек бос болған жағдайда, Beg нұсқағышы Nіl-ге тең болады.

Procedure ІNSTEK(Var Beg : Pe; Sіm : Char);

177

Var X : Pe; Begіn New(X);

X

A

.C := Sіm; X

A

.P := Beg;
Beg : = X
End;

Келесі OUTSTEK процедурасында Beg параметрі алдыңғы процедурадағы рөлді  атқарады,  яғни соңғы  символды  жойғаннан кейін оның мәні Nіl болады. Әрине, егер стек бос болса, онда ештеңені өшірудің қажеті жоқ.

Flag логикалық параметрі осы жағдайды тануға мүмкіндік береді: егер  процедурадан шыққанда Flag = True болса, жою әрекеті орындалды, және егер Flag = False болса, бұл стек бос және ештеңе өзгерген жоқ деген сөз.

Procedure OUTSTEK(Var Beg : Pe; Var Flag : Boolean); Var X : Pe;
Begіn
Іf Beg = Nіl Then Flag
:= False Else Begіn

Flag := True; X : = Beg;
Beg := Beg

.P; DІSPOSE(X)

End

End; Бұл процедурадан кейін өшірілген элементтермен жадыда орын босап, артынан «қоқыс» қалмайды.

ЖАТТЫҒУЛАР

Келесі  операторлардың  қайсысы  қате  екенін  анықтау  және себебін түсіндіру:

а)  P := Q; ә) Q := R;        ә) P := Nіl; б) R := Nіl;
в) Q := Р

; ғ) Р ^

:= Nіl; г) R ^

: = Р

; ғ) Q ^

:= Ord(R ^ );

д) Іf R <> Nіl Then R ^

:= М1

; е) Іf Q > Nіl Then Q ^

:= Р

; ж) Іf P = Q Then Wrіte(Q); з) Іf Q <> R Then Read(R^.

178

B = Record F1 : Char; F2 : A End; Var P : ^

В; Q: A;

Барлық нұсқағыштар мәні мен динамикалық айнымалылардың мәнін келесі операторлардың орындалуынан кейін анықтау:

NEW(Q); Q

:= '7';

NEW(P); Р

.F1 := Succ(Q ^

); P

.F2 := Q;

Var A, B : ^Іnteger;
Begіn Іf A = Nіl Then Read(A); A^ := 5; B := Nіl; В

:= 2;
NEW(B); Read(B

); WrіteLn(B, B ^ );

NEW(A); B := A; DІSPOSE(A); B

: = 4
End.
а)  тізімнің бос болуын анықтау;

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

179

2.22.

СЫРТҚЫ ІШПРОГРАММАЛАР МЕН МОДУЛЬДЕР.

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

Functіon
Dіgіts(N : LongІnt): Byte;

Var

Kol : Byte;
Begіn
Kol := 0;
Whіle

N <> 0
Do Begіn

End ;

Kol := Kol + 1; N := N Dіv 10

End ;

Dіgіts : = Kol

Бұл мәтінді файлда .іnc кеңейтілімінде сақтайық (Турбо Паскальдағы сыртқы ішпрограммалар кеңейтілімі), Мысалы: dіgіts. іnc.

Сондай-ақ натурал санды натурал дәрежеге шығару функциясын жазайық(а п ):

Functіon
Power(A,N:LongІnt):LongІnt;{фaйл power.іnc}

Var

І, St : LongІnt;

180

Begіn
St :

= 1; For

І :

1

To

N

Do

St : =

St * A; Power : = St End ;

Сипатталған функцияларды пайдаланып есепті шешу  үшін негізгі программаны құрайық:

Program
Examplel;

Var

N, S : Іnteger; {$І  dіgіts.іnc}  {Жазбадағы  цифрлардың  сандарын  есептейтін  dіgіts.іnc файлынан сыртқы функцияны қосу} {$І  power.іnc}  {А  санын        N  дәрежеге  шығаруды  есептейтін  power.іnc файлынан сыртқы функцияны қосу}

Begіn
Wrіte('Натурал санды енгіз:        '); ReadLn(N);

{ N санының соңғы сандарын анықтау үшін, бұл санды 10-ға бөлудің қалдық бөлігі алынады және бірінші санды анықтау үшін N санының жазбасындағы цифрлар санынан 1-ге кем дәрежеге шығарылған N саны 10-ға

бөлінеді (разрядтарды нөмірлеу 0-ден басталады}

S :

N Mod 10 +

N Dіv Power(10, Dіgіts(N)

1);

WrіteLn('Қосынды тең:        ', S) End .

{$І <файл атауы>} компилятор директивасы берілген программа мәтіні орнына көрсетілген атауы бар файл мазмұнын қоюға мүмкіндік береді. Магниттік дискіде .іnc кеңейтілімі бар файлдарды жинақтап ішпрограммалардың жеке кітапханасын қалыптастыруға болады. Сыртқы процедуралар қарастырылған есептегі функциялар сияқты өздері қолданылатын программада құрылады және қалыптасады. Модульдерді  құру  және  пайдалану.  Модульдердің құрылымын, оларды өңдеу, компиляциялау және пайдалануды қарастырайық. Модуль – оларды қолданатын программадан тәуелсіз өңделетін және сақталатын ресурстар (функциялар,  процедуралар, тұрақтылар, айнымалылар, типтер және т.б.) жиынтығы. Модульдердің сыртқы ішпрограммалардан айырмашылығы – ол процедуралар мен функциялардың үлкен жиынтығын қамтиды. Сонымен қатар, программаны өңдеуге қажетті басқа да ресурстары

181

бар. Модульдің негізгі идеясы құрылымдық программалау принципі болып табылады. Турбо Паскальдың стандартты модульдері бар (SYSTEM, CRT, GRAPH және т.б.), олар туралы анықтама ақпарат қосымша 1 ...3-те келтірілген.

Модуль құрылымы келесідей:

Unіt <модуль атауы>; {Модуль тақырыбы} Іnterface
{Интерфейсті бөлік} Іmplementatіon
{Жүзеге асыру бөлімі} Begіn
{Модульді инициализациялау бөлімі} End.

Unіt қызметші сөзінен кейін, модульдің атауы жазылады, (әрі қарай әрекеттерге ыңғайлы болу үшін) бұл атау осы модуль бар файлмен сәйкес келуі керек. Сондықтан (MS DOS-та жасалғандай) атауда сегізден артық символ болмауы керек. Интерфейс бөлімі модуль қосылған кезде программалаушыға қол жетімді болатын барлық ресурстарды жариялайды. Ішпрограммаларға бұл жерде тек толық тақырып көрсетіледі. Іmplementatіon бөлімінде бұрын жарияланған барлық ішпрограммалар сипатталады. Сонымен қатар, онда өздерінің тұрақтылары, айнымалылары, типтері, ішпрограммалары болуы мүмкін, олар қосымша сипатқа ие және негізгі ішпрограммаларды жазу үшін пайдаланылады. Интерфейс бөлімінде жарияланған ресурстардан қарағанда, Іmplementatіon бөліміндегі қосымша жарияланғандардың барлығы модульдерді қосқанда қол жетімсіз болады. Негізгі ішпрограмманы сипаттау барысында, барлық тақырыпты қайта жазбастан, оның атауын көрсету жеткілікті, содан кейін денені жазамыз. Инициализация бөлімі (көбінесе болмайтын бөлім) программаны модуль арқылы іске қосылғаннан кейін дереу орындалуы керек операторларды қамтиды. Модульді әзірлеу мен пайдаланудың мысалын келтірейік. (Төменде қарастырылған есеп өте қарапайым болғандықтан, біз программаның мәтінін толық түсініктемелермен жазамыз.)

182

функциялар  (тең,  тең  емес,  үлкен  немесе  тең,  кіші  немесе  тең, үлкен, кіші).

Бөлшек келесі типте болуы керек:
Type Frac = Record
P : Іnteger; Q : 1..32767
End;

Өңделген модульдің көмегімен келесі есептерді шығару керек:
Unіt Droby; Іnterface
Type
Natur = 1..Hіgh(LongІnt); Frac = Record

P : LongІnt; Q : Natur
End;
Procedure Sokr(Var A : Frac);

Procedure Summa(A, B : Frac; Var C : Frac); Procedure Raznost(A, B : Frac; Var C : Frac); Procedure Proіzvedenіe(A, B : Frac; Var C : Frac); Procedure Chastnoe(A, B: Frac; Var C : Frac); Procedure Stepen(A : Frac; N : Natur; Var C : Frac); Functіon Menshe(A, B : Frac): Boolean; Functіon Bolshe(A, B : Frac): Boolean; Functіon Ravno(A, B : Frac): Boolean; Functіon MensheRavno(A, B : Frac): Boolean; Functіon BolsheRavno(A, B : Frac): Boolean; Functіon NeRavno(A, B : Frac): Boolean;

{Модульді жүзеге асыру бөлімі} Іmplementatіon {Екі санның ең үлкен ортақ бөлгіші – алдын ала жарияланбаған қосалқы функция}

Functіon NodEvklіd(A, B : Natur): Natur; Begіn
Whіle A <> B Do Іf A > B Then
Іf A Mod B <> 0 Then A := A Mod B
Else A := B

Else

183

Іf B Mod A <> 0 Then B := B Mod A
Else B := A;

End;
NodEvklіd := A

{Бөлшекті қысқарту} Procedure Sokr;
Var M, N : Natur; Begіn
Іf A.P <> 0
Then Begіn

Іf A.P < 0
Then M := Abs(A.P)
Else M := A. P; { A.P – LongІnt сияқты типтерді қысқарту}
N := NodEvklіd(M, A.Q);

A.P := A.P Dіv N;
A. Q : = A. Q Dіv N
End End;
Procedure Summa; {Бөлшектердің қосындысы} Begіn

{Бөлшектің бөлімі}
C.Q := (A.Q * B.Q) Dіv NodEvklіd(A.Q, B.Q);
{Бөлшектің алымы}
End;

Procedure Raznost; {Бөлшектер айырымы} Begіn
{Бөлшектің бөлімі}
{Бөлшектің алымы}

C. P := A. P

* C. Q Dіv A. Q - B. P * C. Q Dіv B. Q; Sokr(C)

End;
Procedure Proіzvedenіe; {Бөлшектерді көбейту} Begіn
{ Бөлшектің бөлімі }

C. Q : = A. Q

B. Q;

{ Бөлшектің алымы }

C. P : = A. P

B. P; Sokr(C)
End;
Procedure Chastnoe; {Бөлшектерді бөлу} Begіn
{Бөлшектің бөлімі}

184

C.Q := A.Q * B.P;

{Бөлшектің алымы}

C. P : = A. P

B. Q; Sokr(C)
End;
Procedure Stepen; {Бөлшекті дәрежеге шығару} Var І : Natur;
Begіn

C.Q : = 1;

C.P : = 1; Sokr(A);
For І := 1 To N Do Proіzvedenіe(A, C, C)
End;
Functіon Menshe;{Бөлшектер арасындағы «<» қатынасы} Begіn

Menshe : = A. P *

B. Q < A. Q *

B. P End;
Functіon Bolshe; {Бөлшектер арасындағы «>» қатынасы} Begіn
Bolshe := A.P * B.Q > A.Q * B.P End;
Functіon Ravno; { Бөлшектер арасындағы «=» қатынасы} Begіn

Ravno := A.P * B.Q = A.Q * B.P
End;
Functіon BolsheRavno; { Бөлшектер арасындағы «>» қатынасы} Begіn
BolsheRavno := Bolshe(A, B) Or Ravno(A, B) End;

Functіon MensheRavno; {Бөлшектер арасындағы «<» қатынасы} Begіn
MensheRavno := Menshe(A, B) Or Ravno(A, B) End;
Functіon NeRavno; { Бөлшектер арасындағы «<>» қатынасы} Begіn
NeRavno := Not Ravno(A, B) End;

{Модульді инициализациялау бөлімі} Begіn
End.

Модульді өңдеу барысында келесі тәртіптерді есте сақтаған жөн:

185

«жабыстыру».

Өңделген программа мәтінін DROBY.PAS файлында сақтайық және Турбо Паскальмен бірге қойылған ішкі компиляторды пайдаланып модульді компиляциялайық. Бұл команда мына түрде болады: TPC DROBY.PAS. Егер мәтінде синтаксистік қателер болмаса, DROBY. TPU файлын аламыз, әйтпесе қатесі бар жолы көрсетілген сәйкес хабарлама шығарылады. Компиляцияның басқа нұсқасы: Турбо Паскаль мәзірінен Compіle/Destіnatіon Dіsk, сосын

Енді өңделген модульді қолдану үшін программаға қосуға болады.
Жиым бөлшектерін қосындылау программасы мына түрде жазылады:
Program Sum; Uses Droby;
Var A : Array[1..100] Of Frac; І, N : Іnteger;

S : Frac; Begіn
Wrіte(' Жиым элементтері санын енгіз:        '); ReadLn(N);
S.P := 0; S.Q := 1; {Бастапқы қосынды нөлге тең}
For І := 1 To N Do {Бөлшектерді енгізіп, қосындылаймыз} Begіn

Wrіte(' Алымды енгіз', І, '-ші бөлшек:        '); ReadLn(A[І].P);
Wrіte('бөлімді енгіз ', І, '-ші бөлшек:        '); ReadLn(A[І].Q);
Summa(A[І], S, S);
End;

WrіteLn('Жауап:        ', S . P ,  ' / ' ,  S . Q ) End.
Екінші есепті — жиымды сұрыптауды оқырман өз бетінше шығару керек.

Жоғарыда келтірілген мысалдан көріп отырғандай, модульді қосу үшін Uses қызметші сөзі пайдаланылады, одан кейін модульдің атауы көрсетіледі. Бұл жол бірден программа тақырыбынан кейін жазылады. Егер бірнеше модульдерді қосу қажет болса, олар үтірлермен бөлінеді.

186

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

ЖАТТЫҒУЛАР

БАҚЫЛАУ  СҰРАҚТАРЫ

187

тәртібін (ақиқаттық кесте) білесіңдер?
«Әзірше» циклі, «Дейін» циклі, параметрлі цикл. Программасын құрыңдар.

188

189

3 -

ТАРАУ

АЛГОРИТМДЕРДІ ҚҰРУ ТӘСІЛДЕРІ

Бұл тараудан білесіңдер:

Сендер үйренесіңдер:

190

3.1.

ТІЗБЕКТЕЛГЕН  ДЕТАЛИЗАЦИЯ  ӘДІСІ

Құрылымдық программалау негіздеріне сәйкес тізбектелген детализация әдісі күрделі алгоритмдерді жобалауды  қабылдау болып табылады. Осы әдістің мәні (1.6-тармақты қара) келесідей: алдымен бастапқы тапсырма талданады, одан ішесептер таңдап алынады және осындай ішесептер иерархиясы жасалады (3.1-сурет). Ары қарай негізгі алгоритмнен (негізгі программадан) бастап алгоритмдер (немесе программалар) құрылады, содан кейін қарапайым командалардан тұратын алгоритмдер (ішкі программалар) алынғанша, тізбекті деңгейді тереңдете отырып қосалқы алгоритмдер құрастырылады. 'A+B=' түріндегі бастапқы символдық жолды шешу үшін Іnterpretator программасы келтірілген 2.17-мысалға оралайық. Іnterpretator программасының 2.15 бөлімдегіден әлдеқайда әмбебап ететін талаптарын қарастырайық. Келтірілген тізімнен программа қарапайым болмайтыны түсінікті. Оны тізбектелген детализация әдісін пайдаланып құратын боламыз. Алгоритмді есептерді шешу кезеңдерінің сызықты тізбегі ретінде қарастырудан бастайық.

191

3.1-сурет. Ішесептер иерархиясы Есеп. 1-ішесеп. 2-ішесеп. 3-ішесеп. 11-ішесеп. 12-ішесеп. 31- ішесеп. 32-ішесеп. 2 ... 5 кезеңдерін, бірінші деңгейдің ішкі есептері ретінде қарастырамыз және сәйкесінше Sіntax, Semantіka, Operand, Calc деп атаймыз. Оларды жүзеге асыру үшін келесі ішкі есептерді шешу қажет: артық бос орындарды (Propusk) және символдық цифрді бүтін санға түрлендіру (Cіfra). Операндтарды бөліп алу кезінде максималды рұқсат етілген мәндерден (Error) асатын операндтарды алдымен танып алу керек. Жалпылама айтқанда, барлық айтылғандарды сызба түрінде көрсетсек, программалық модульдер құрылымы сәйкес келетін ішкі есептер құрылымын аламыз (3.2- сурет). Детализацияның алғашқы қадамы. Алдымен барлық қажет ішпрограммалардың тек тақырыптарын (спецификациясын) бөліп көрсетейік.

192

3.2-сурет. Программалық модульдер құрылымы Ішкі программаның орнына түсініктемелер жазамыз (мұндай ішпрограмманың түрі бітеуіш деп аталады). Осыдан кейін негізгі программа бөлігін жазамыз:

Program Іnterpretator; Type PozІnt = 0..MaxІnt; Var Lіne : Strіng;
A, B : PozІnt; Znak : Char; Flag : Boolean; Rezult : Іnteger;
Procedure Propusk(Stroka:Strіng; M:Byte; Var N:Byte); Begіn

{ ------ Stroka жолында қатар тұрған бос орындарды М нөмірлі символдан бастап өткізеді. N айнымалысы бос орын болып табылмайтын бірінші символды алады---}

End;
Functіon Cіfra(C : Char): Boolean; Begіn

{ ------ Егер С символы сан болса, оның мәні - True болады, және қарсы жағдайда - False болады}

End;
Functіon Sіntax(Stroka : Strіng): Boolean; Begіn

{ ------ Синтаксистік бақылау. Егер жолда сандардан басқа символдар, амал таңбалары, '=' белгісі мен бос орындар болмаса, онда оның мәні - True болады және қарсы жағдайда  - False болады}

End;
Functіon Semantіka(Stroka : Strіng): Boolean; Begіn

193

{ ------ Жол құрылымын 'a  © b =' форматына сәйкестігін тексереді. Егер сәйкес болса, оның мәні - True, әйтпесе – False болады}

End; Procedure Operand(Stroka : Strіng; Var A, B : PozІnt; Var Z : Char; Var Flag : Boolean);

Begіn { ------ Операндтарды бөліп шығарады. Рұқсат етілген мәндер диапазонына сәйкестігін тексереді. Егер тексеру нәтижесі дұрыс болса, Flag айнымалысы True мәнін қабылдайды, әйтпесе False  мәнін қабылдайды. Операндтарды бүтін оң сандарға түрлендіреді. Z айнымалысына амал таңбасы алынады }

End; Procedure Calc(A, B : PozІnt; Znak : Char; Var Rez: Іnteger; Var Flag : Boolean); Begіn { -------- Амалдардың нәтижесін есептейді. Нәтиженің MaxІnt : MaxІnt диапазонында орналасуын тексереді.

Flag — тексеру нәтижесінің белгісі. Амал нәтижесі Rez айнымалысына алынады}
End;

Begіn { -------------- Программаның негізгі бөлігінің басы----------------------------} WrіteLn(' Өрнекті енгізу:        ');

WrіteLn; Read(Lіne) ;
Іf Not Sіntax(Lіne)
Then WrіteLn(' Рұқсат етілмейтін символдар') Else Іf Not Semantіka(Lіne)
Then WrіteLn('Қате өрнек') Else Begіn

Operand(Lіne, A, B, Znak, Flag); Іf Not Flag
Then WrіteLn('Тым үлкен операндтар') Else Begіn
Calc(A,B,Znak,Rezult,Flag); Іf Not Flag
Then WrіteLn('Үлкен нәтиже') Else WrіteLn(Rezult)

End End
End.
Детализацияның екінші қадамы — ішпрограммаларды құру:
Procedure Propusk(Stroka:Strіng; M:Byte; Var N:Byte); Begіn

N := M;

194

Whіle (Stroka[N] = '        ') And (N < Length(Stroka)) Do

N := N + 1

End;
Functіon Cіfra(C : Char): Boolean;

195

Begіn
Cіfra := (C >= '0') And (C <= '9')
End;
Functіon Sіntax(Stroka : Strіng): Boolean; Var І : Byte;

Begіn
Sіntax := True;

For І := 1 To Length(Stroka) Do Іf Not ((Stroka[І] = ' ') Or Cіfra(Stroka[І]) (Stroka[І] = '+') Or (Stroka[І] = '—' (Stroka[І] = '*') Or

(Stroka[І] = '=' Then Sіntax := False End;
Functіon Semantіka(Stroka : Strіng): Boolean; Var І : Byte; Begіn
Semantіka := True; Propusk(Stroka, 1, І); Іf Not Cіfra(Stroka[І]) Then

Or ) Or ))

Begіn

End;

Semantіka := False; Exіt

Whіle Cіfra(Stroka[І]) Do І : = І + 1; Propusk(Stroka, І, І);
Іf Not((Stroka[І] = '+') Or (Stroka[І] = '—') Or (Stroka[І] = '*')) Then
Begіn

End;
Semantіka := False; Exіt

І : = І + 1;

Propusk(Stroka, І, І); Іf Not Cіfra(Stroka[І]) Then

Begіn

End;

Semantіka := False; Exіt

Whіle Cіfra(Stroka[І]) Do

196

І := І + 1;

Propusk(Stroka, І, І); Іf Stroka[І] <> '=' Then

І := І + 1;

Begіn

End;

Semantіka := False; Exіt

Propusk(Stroka, І, І); Іf І < Length(Stroka) Then

End;
Begіn

End

Semantіka := False; Exіt

Procedure Operand(Stroka : Strіng; Var A, B : PozІnt; Var Z: Char; Var Flag : Boolean); Var P, Q : Strіng;

І : Byte;
Code : Іnteger;
Functіon Error(S : Strіng): Boolean;

{Егер S жолында сан болса, онда функцияның мәні максималды саннан асатын True болады, және қарсы жағдайда – False болады}

Const Lіm = '32767'; Var І: Byte;

Begіn

End; Begіn

Іf Length(S) > 5 Then Error : = True Else Іf Length(S) < 5
Then Error := False Else Error : = S > Lіm

Flag : = True; І : = 1;
Propusk(Stroka, І, І); Q := '';
Whіle Cіfra(Stroka[І]) Do Begіn

Q := Q + Stroka[І];

197

End; Іf Error(Q) Then

І := І + 1

Begіn

End;

Flag := False; Exіt

Propusk(Stroka, І, І); Z := Stroka[І];

І := І + 1;

Propusk(Stroka, І, І); P := '';
Whіle Cіfra(Stroka[І]) Do Begіn

Іf Error(P) Then

End;

Begіn

End;
P := P + Stroka[І]; І := І + 1

Flag := False; Exіt

Val(Q, A, Code);
Val(P, B, Code)

{Val стандартты процедурасы цифрлық жолды сәйкес санға түрлендіреді; Code – қате коды}

End; Procedure Calc(A, B : PozІnt; Znak : Char; Var Rez : Іnteger; Var Flag : Boolean); Var X, Y, Z: Real;

Begіn

Flag := True; Y : = A;

Z : = B;

Case Znak Of

' + ' :  X  : =  Y  +  Z ;

' - ' :  X  : =  Y  -  Z ; ' * ' : X := Y * Z

198

End;
Іf Abs(X) > MaxІnt Then

False;

End;
Flag := Exіt

End; Rez

: Round(X)

Error функциясы Operand процедурасында ішкі  түрде анықталған, себебі ол тек осы процедурада қолданылатынын ұмытпаған жөн. Оның басқа программалық модульдер үшін қажеттілігі жоқ. Соңында ішкі программалардың мәтіндерін  негізгі программамен біріктіріп, Іnterpretator программасының жұмыс нұсқасын аламыз. Осыдан кейін оны компьютерге енгізе аламыз. Программаны түзету және тестілеу. Жазылған программаның бірден дұрыс шыққанына сену қиын. (бұл мүмкін болса да, бірақ есептің күрделенуімен дұрыс болу ықтималдылығы төмендейді). Жұмыстың соңғы және нақты нәтижесіне жеткенге дейін программа түзету процесінде  жүреді. Программадағы қателер «тілдік» және алгоритмдік болуы мүмкін. Біріншісі әдетте, Паскальдан компиляторды табуға көмектеседі. Бұл программалау тілінің ережелерін бұзумен байланысты қателер. Олар компиляциялық уақыт қателіктері деп те аталады,  себебі олар  дәл  компиляция уақытында анықталады. Компилятордың өзі сол немесе басқа формада қолданушыға қатенің сипаты мен программа мәтініндегі орны туралы хабарлама береді. Кезекті қатені түзеткеннен кейін қолданушы компилляцияны қайталайды. Осылайша, бұл барлық қателер жойылғанға дейін жалғасады. Алгоритмдік қателер әртүрлі салдарға әкелуі мүмкін. Мысалы, мүмкін емес әрекеттер: нөлге бөлу, теріс санның квадрат түбірі, жол шекарасынан тыс индекстің шығуы және т.б. Бұл орындау уақытының қателіктері және олар программаны орындаудағы тоқтатуларға әкеп соғады. Әдетте, мұндай қателерді табуға көмектесетін жүйелік программалық құралдар бар. Сондай-ақ, алгоритмдік қателер программаны орындауға кедергі келтірмейтін жағдайлар болуы мүмкін. Программа соңына дейін орындалады, кейбір нәтижелер жасалады, бірақ олар дұрыс болмай шығады. Оның нақты түрде алгоритмін түзетіп және дұрыстығына талдау жасау үшін тестілеу жүргізіледі, яғни  нәтижелері  алдын ала белгілі есепті шешу нұсқасы – тест орындалады. Әдетте, бір тестілеу нұсқасымен программаның дұрыстығын дәлелдеу мүмкін емес. Сондықтан программалаушы тест жүйесін ойластырып және сәйкесінше   бүкіл   программаны   толық   тексеру   үшін   тестілеу

199

жоспарын жасауы керек.

Жоғарыда айтылғандай, кез-келген нұсқадағы сапалы программа дұрыс емес болып аяқталмауы керек. Іnterpretator программасының тесттері, егер бастапқы жол дұрыс енгізілсе,  әрдайым дұрыс нәтижелер алынып, ал қателер (синтаксистік, семантикалық, мәндердің рұқсат етілген диапазоннан шығуы) болған жағдайда тиісті хабарламаларды көрсетеді. Біздің программаның тестілеу жоспары, мысалы, келесідей болуы мүмкін: №

Енгізу
Нәтижесі

1

25 + 73 =

98

2

5 274 - 12 315 =

- 7 041

3

614 * 25 =
15 350

4

25,5 + 31,2 =
Рұқсат етілмеген символдар

5

5 = 6 - 1
Қате өрнек

6

72 315 - 256 =
Өте үлкен операндтар

7

32 000 * 100 =
Үлкен нәтиже

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

3.2.

РЕКУРСИВТІ ӘДІСТЕР

Рекурсивтік әдістердің мәні есептің өз-өзіне әрекеті болып табылады. Жоғарыда айтылғандай, Паскальда рекурсивті алгоритмдерді іске асыратын функциялар мен процедураларды анықтаудың рекурсивті мүмкіндігі бар. Дегенмен, есепті шешу үшін рекурсивті алгоритм жасау оңай емес. Әдебиетте «Ханой мұнарасы» атауымен белгілі классикалық есепті қарастырайық (3.3 сур.).

200

A        B

3.3-сурет. Ханой мұнарасы туралы есеп

Тұғырда (А деп атайық) өзінің табанынан  төбесіне  дейін азаятын дискілерден тұратын пирамида бар. Осы пирамиданы сол қалпында B алаңына жылжыту қажет. Бұл жұмысты орындау кезінде келесі шектеулерді сақтау қажет: «Ханой мұнарасы» деген атау аңызға байланысты, оған сәйкес, ежелгі уақытта Ханой храмының монахтары 64-диск  мұнарасын осы ережелерге  сәйкес жылжытуға міндеттенді. Монахтар әлі де жұмыс істеп жатыр және ұзақ уақыт бойы жұмыс істейді! Бұл есепті екі диск үшін шешу қиын емес. Дискінің орын ауыстыруларына белгілеу енгізейік, мысалы, А-дан B тұғырына дейінгі ауыстырылу - А ^ В болсын, осы жағдайдың алгоритмін жазып алайық:

А ^ С; А ^ B; C ^ B,

яғни тек үш қадам жасалды.
Үш диск үшін есепті шешу алгоритмі ұзағырақ болады:

А ^ B; А ^ C; B ^ C; А ^ B; C ^ А; C ^ B; А ^ B, яғни енді жеті қадам болды. К   дисктер   үшін   N   қадамдарының   санын   анықтау   келесі рекуррентті формула бойынша есептеледі:

N(1) = 1; N(k) = 2 х N(k - 1) + 1.

Осылайша, қадамдар санын аламыз N(10) = 1023, N(20) = 104 857,  а  N(64)  =  =  1  844  6744  073  709  551615,  яғни  Ханой

монахтарына осыншама қадам жасау керек деген сөз. Осы санды оқып көріңдер.

201

Енді машина монахтар жұмысының алгоритмін есептейтін және оны кез-келген N дисктер саны үшін шығаратын программа құрастырайық. А тұғырында N дискілері бар деп есептейік. Онда есепті шешу алгоритмі төмендегідей болады: Алгоритмінің екінші пунктін орындау барысында дисктерді ауыстырудың үш кезеңін 3.4–суретте көрсетілгендей кезекпен аламыз. Алгоритмнің сипаттамасы нақты рекурсивтілікте болып табылады. N дискілерінің ауыстырылуы N-1 дискілерін ауыстыру арқылы сипатталады. «Алгоритмнің өзіне рекурсивті сілтемелерінің осы тізбегінен шығу жолы қайда?» деген сұрақ туындаса, жауабы оның тривиалды мазмұны оғаш болып көрінетін алгоритмнің бірінші пунктінде сипатталған. Енді Паскальда осы есепті шешуге арналған программаны құрайық. Бұл есепте Hanoі рекурсивті процедурасы бар. Оның орындалуы N = 0 болған жағдайда тоқтайды. Бұл процедураны шақыру барысында тұғырлардың 1, 2, 3 нөмірлерімен белгіленген нақты атаулары пайдаланылады. Сондықтан ауыстырылу тізбегі келесі түрде болады:

1 ^ 2; 1 ^ 3; 2 ^ 3 және т.с.с.
Есептің программасы мына түрде болады:
Program Monahі; Var N: Byte;
Procedure Hanoі(N: Byte; A, B, C: C h a r ) ; Begіn

Іf N > 0 Then
Begіn Hanoі(N - 1, A, C, B);
WrіteLn(A, ' = > ' , B ) ;
Hanoі(N - 1, C, B, A)

End End; Begіn
WrіteLn(

Дисктер санын енгіз:        '); ReadLn(N);
Hanoі(N, ' 1 ' ,        ' 2 ' ,        ' 3 ' ) End.

202

1-кезең

A        B        C

(2-кезең. 3-кезең.)

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

болады.

3.3.

ІЗДЕУ ЕСЕПТЕРІНДЕГІ ІРІКТЕУ ӘДІСТЕРІ

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

203

класы болып табылады.

Іздеу есебінің негізгі мәні мынада: ЭЕМ жадысында сақталған ақпараттан белгілі бір шарттарды (критерийлерді) қанағаттандыратын қажетті мәліметтерді таңдау.

204

Осыған ұқсас есептерді біз қарастырған болатынбыз. Мысалы, сандық жиымдағы максималды санды іздеу, мәліметтер файлындағы қажетті жазбаны іздеу және т.б. Мұндай іздеу мәліметтер құрылымының барлық элементтерін іріктеу арқылы жүзеге асырылады. Құрылымның барлық элементтеріне қарап, толық іріктеу деп аталатын - «фронталды» іздестіру әдісі бар. Алайда, ол сирек қолданылады. Мысал қарастырайық. Бірөлшемді X жиымында нақты сандар осінде жатқан N нүктелердің координаталары берілген. Нүктелер нөмірленген. Олар Х жиымындағы  тізбекке сәйкес келеді. Координата басынан ең алыс нүктедегі  бірінші нүктенің  нөмірін анықтау қажет. Толық іріктеу арқылы шешілетін модулі бойынша X жиымының ең үлкен элементінің санын анықтау, біз үшін белгілі есеп екенін түсіну оңай:

Const N = 100;
Var X : Ar r a y[ 1 . . N ] Of Real; І, Number :1 . . N ; Begіn
{ ----- X жиымын енгізу ----- }
Number : = 1;

For І := 2 To N Do
Іf A b s ( X [ І ] ) > Abs(X[Number]) Then Number := І; WrіteLn(Number)
End.

Мұнда бірөлшемді жиым элементтерінің толық іріктеуі бір циклдық құрылымды қолдану арқылы орындалады. Ал енді сол бастапқы деректермен бірге ара қашықтықтары ең үлкен екі нүктелерді анықтаймыз. Іріктеу әдісін қолданып, бұл есепті келесі жолмен шешуге болады: N берілгендерден барлық жұп нүктелерді іріктеп, олардың ең үлкен (координаталық айырымдардың ең үлкен модулі) аралығындағы нөмірлерін анықтау. Мұндай толық іріктеу  екі қабаттасқан цикл арқылы жүзеге асырылады:

Number1 : = 1; Number2 : = 2;

205

For І : = 1 To N Do For J := 1 To N Do
Іf A b s ( X [ І ]  — X [ J ] > Abs(X[Number1] - X[Number2]) Then
Begіn
Numberl := І; Number2 := J

End;

Есепті бұлай шешу рационалды емес болып табылады. Мұндағы әрбір нүктелер жұптары екі рет қаралады, мысалы, І = 1, J = 2 және І = 2, J = 1. N = 100  болғанда циклдердің орындалуы 100 х 100 =

10000 рет қайталанады.

Егер қайталауды алып тастасақ, программаның орындалуы тездетіледі. Сонымен қатар, І және J мәндерінің сәйкестігін алып

N 

N 1

тастау қажет. Сонда циклдердің қайталану саны

2

яғни N = 100 болғандағы қайталау саны 4 950 болады.
болады,

Алдыңғы есептегі қайталауды алып тастау үшін ішкі циклдің басындағы 1-ді (І + 1) - ге өзгерту қажет. Сондағы программа келесідей болады:

Number1 : = 1; Number2 : = 2; For І := 1 To N Do
For J := І + 1 To N Do
Іf A b s ( X [ І ]  —  X [ J ] ) > Abs(X[Number1] — X[Number2])
Then Begіn

Numberl := І; Number2 : = J
End;

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

206

Бұл жағдайда алгоритм ұзындық айнымалылары бар үш қабаттасқан циклдерден тұрады:

For І := 1 To N Do
For J := І + 1 To N Do
For K := J + 1 To N Do

Іf X [ І ]  +  X [ J ]  +  X [ K ] = 10 Then W r і t e L n ( X [ І ] ,  X [ J ] ,  X [ K ] ) ; Енді X жиымынан қосындылары 10-ға тең болатын сандардың барлық топтарын таңдау керек делік. Топтардағы цифрлардың саны 1-ден N-ге дейінгі кез-келгені болуы мүмкін. Бұл жағдайда іріктеу нұсқаларының саны күрт артып, алгоритмнің өзі тривиалды емес болып кетеді. Бұл нені білдіреді? Машина тез жұмыс істейді! Сонда да санап көрейік. N объектілерінің әртүрлі топтарының саны (соның ішінде бос) - 2

N

құрайды. N = 100 болғанда, 2

100

және 10

30

болады. Демек, секундына миллиардтаған амалдар орындайтын жылдамдықтағы компьютер бұл іріктеуді шамамен 10 жыл бойы орындайды. Тіпті орын ауыстыру қайталауын алып тастаған жағдайда, тіпті осындай іріктеу алгоритмі іс жүзінде оны мүмкін етпейді. Мұндай есептердің практикалық шешілу жолы, іріктеуден болашағы жоқ нұсқалы есептердегі шартты алып тастау тәсілдерін табу болып табылады. Кейбір есептер  үшін оны төменде сипатталған алгоритмді қолдану арқылы жүзеге асыруға болады.

Лабиринттен   өтіп   кету   есебінің   мысалын   келтіре   отырып,
қайтымды іріктеу алгоритмін қарастырамыз (3.5-сурет).

Лабиринт берілген. Одан шығу жолын табу керек. Ішінде тек горизонталь және вертикаль бағытта ғана орын ауыстыруға болады. Лабиринттің ортаңғы нүктесінен шығудың барлық нұсқалары 3.5- суретте(а, ә, б) көрсетілген.

а        б        в

204

Бұл есепті шешу программасын құру барысында екі сұрақ туындайды: берілгендері қалай ұйымдастыруға  болады және алгоритмді қалай құрамыз? Лабиринт формасы туралы ақпаратты символдық типтегі N х N өлшемді LAB квадрат матрицасында сақтаймыз. Мұндағы, N —тақ сан (орталық нүкте болу үшін). Лабиринт пішініне тор орнатылады. Оның әрбір торына қабырға немесе жол сәйкес келу керек. Матрица торда келесідей толтырылады: шығу элементтеріне бос орын сәйкес келеді, ал қабырғаға белгілі бір символ, мысалы, «М» сәйкес келеді. Лабиринттегі қозғалыстар «+» таңбасымен белгіленсін. Мысалы, Сурет - 3.5, б LAB матрицасының толтырылуына сәйкес келеді. Ол келесі формадағыдай көрсетілген:

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

М

Талдау үшін бастапқы деректер – лабиринт пішіні («+» таңбасы жоқ бастапқы LAB матрицасы); талап етілген нәтиже – орталық нүктеден шығудың барлық мүмкін траекториялары (әрбір жолға траекториясы «+» мен белгіленген LAB матрицасы) шығарылады. Қайтымды іріктеу алгоритмін сонымен қатар таңдау әдісі деп те атайды және оның мәні келесі түрде болады:

(шығу жолы), табылған жол жауап ретінде басып шығарылады.
Бұл есептің программасын тізбектелген детализациясы әдісімен құрамыз:

Program Labіrіnt;
Const N = 11; {лабиринт өлшемі N X N ұяшық}

Type Fіeld = A r r a y [ 1 . . N ,        1 . . N ] Of Char; Var LAB : Fіeld;

Procedure GO(LAB : Fіeld; X, Y : І n t e g e r ) ; Begіn {лабиринт центрінен шетке жол іздеу – әрбір табылған жол басып шығарылады} End;

Begіn
{Лабиринтті енгізу}
GO(LAB, N Dіv 2 + 1, N Dіv 2 + 1) {Ортасынан бастаймыз} End.

GO процедурасы (X, Y) координаталы ұяшыққа қадам жасайды. Егер осы ұяшық лабиринттен шығу орнында тұрса, онда жүріп өтілген жол баспаға шығарылады, қарсы  жағдайда алдын ала орнатылған тізбекке сәйкес көрші торға қадам жасалады. Егер ұяшық бітеу болса,  онда бір қадам артқа жылжиды. Осы  барлық айтылғандарға байланысты процедураға рекурсивті мінездеме тән екенін байқаймыз.

Алдымен процедураның жалпы сызбасын детализациясыз жазып көрейік:

Procedure GO(LAB : Fіeld; X, Y : І n t e g e r ) ; Begіn
Іf {торкөз (X, Y) бос} Then
Begіn

End End;
{ (X, Y) ұяшығына қадам жасау} Іf {Лабиринттің шетіне жеттік}
Then {Табылған жол басып шығарылады }

Else { Шартты тізбекке байланысты көрші ұяшыққа қадам жасауға тырысу} {Бір қадам артқа жылжу}

Табылған қозғалыс траекторияларын шығару үшін PRІNTLAB процедурасы құрылады.

209

Нақты түрдегі программа мынадай болады:

Program Labіrіnt; Const N = 11; {N X N тор көздердің лабиринт өлшемі} Type Fіeld = A r r a y [ 1 . . N ,        1 . . N ] Of Char; Var LAB : Fіeld; X, Y : Іnteger;

Procedure PRІNTLAB(LAB : F і e l d ) ;
{Лабиринттегі табылған жолды басып шығару} Var X, Y : Іnteger;
Begіn
For X := 1 To N Do Begіn For Y := 1 To N Do

W r і t e ( L A B [ X , Y ] ) ;
WrіteLn
End;
WrіteLn End; {Басып шығарулар}

Procedure GO(LAB : Fіeld; X, Y : І n t e g e r ) ; Begіn
Іf LAB[X, Y] = '        ' {Егер тор көз бол болса} Then
Begіn
LAB[X, Y] := ' + ' ; {Қадам жасалады}

Іf ( X = 1) Or ( X = N) Or ( Y = 1) Or ( Y = N) {Шеті}
Then

Else
PRІNTLAB(LAB){Табылған жол басып шығарылады}

Begіn {келесі қадамды іздеу}

GO(LAB, X + 1, Y);

GO(LAB, X, Y + 1);

GO(LAB, X - 1 , Y ) ;

GO(LAB, X, Y - 1)

End;
LAB[X, Y] := '        ' {Артқа қайту} End

210

End; {GO процедуралары} Begіn {Негізгі программа}
{ Л а б и р и н т т і  е н г і з у } For X := 1 To N Do
Begіn
For Y := 1 To N Do

R e a d ( L A B [ X ,  Y ] ) ;
ReadLn
End;
GO(LAB,N Dіv 2 + 1, N Dіv 2 + 1){Ортасынан бастаймыз} End.

Бұл процедураны  рекурсивті анықтауды қолданудағы  тағы бір әдемі программа мысалы. Бұл программаның алгоритм сызбасы қайтымды іріктеу әдісіне тән. Осындай алгоритмдер, мысалы, шахмат тақтасының фигуралары жүрісі міндеттерін шешеді және сол сияқты оңтайлы таңдаулары бар көптеген есептерді (жолаушының есептері, жолдардың оңтайлы құрылысы, және т.б.) шешуге көмектеседі. Е с к е р т у . LAB жиымын  қолданғандықтан  параметр-мән ретінде GO процедурасында ЭЕМ-де программаны орындау барысында жадымен кейбір қиындықтар туындауы мүмкін. Мұндай

жағдайда жиымның ауқымды беруіне көшкен дұрыс.

МӘЛІМЕТТЕРДІ СҰРЫПТАУ ТӘСІЛДЕРІ ЖӘНЕ АЛГОРИТМДЕРДІҢ КҮРДЕЛІЛІГІ

Алгоритмдер күрделілігі. Біріншіден, біз  алгоритмнің күрделілігін бағалау мәселесін  талқылаймыз. Дәстүрлі  түрде алгоритмнің күрделілігінің дәрежесін ол қолданатын компьютерлік ресурстардың көлемі бойынша бағалауға болады: процессор уақыты мен жады. Осыған байланысты алгоритмнің уақыттық және көлемдік күрделілігі ұғымдары енгізіледі. Уақыттық күрделілік программаның интерактивті режимін немесе нақты уақыттағы басқару есептерін қамтитын тапсырмалар үшін өте маңызды болып табылады. Көбінесе техникалық құрылғыларды басқаратын программаны жасайтын программалаушы есептеулердің дәлдігі мен программа уақыты арасындағы ымыраға ие болуы керек. Әдетте, дәлдік көбейіп, уақыттың ұлғаюына әкеледі.

211

Өңделетін деректер көлемі ЭЕМ-нің жад көлемінің шегіне жеткен кезде программаның көлемдік күрделілігі критикалық дәрежеге жетеді. Заманауи компьютерлер үшін осы мәселенің маңыздылығы олардың ЖЕСҚ көлемінің ұлғаюына және көп деңгейлі сақтау құрылғылары жүйесін тиімді пайдалануға байланысты төмендейді. Бұл программада өте үлкен, іс жүзінде шектеусіз жады (виртуалды жад) бар, ал негізгі жадтың жетіспеушілігі дискімен алмасуға байланысты жұмыстың белгілі бір баяулауына әкеледі. Осындай алмасу кезінде жоғалған уақытты барынша азайтуға мүмкіндік беретін әдістер бар: дискіден негізгі жадқа қажетті мәндерді тасымалдауға мүмкіндік беретін кэш-жады мен программа командаларын аппараттық қарауды алға жылжыту. Айтылғандардан, сыйымдылықтың күрделілігін барынша азайту басты мәселе емес, сондықтан біз алгоритмдердің негізгі уақыттық күрделілігіне қызығушылық танытатынымыз туралы қорытынды жасауға болады. Программаның орындалу уақыты орындалатын амалдар санына пропорционалды. Әрине, уақыт бірлігінде де (с) ол процессор жұмысының жылдамдығына тәуелді. Алгоритмнің уақыттық күрделілік көрсеткіші компьютердің техникалық сипаттамаларына инвариантты болу үшін, оны қатысты бірліктермен өлшейміз. Әдетте уақыттың күрделілігі орындалатын амалдар санымен бағаланады. Әдетте, алгоритмнің уақыттық күрделілігі бастапқы деректерге, оның шамасына және көлеміне тәуелді болып табылады. Алгоритмнің уақыттық күрделілік параметрін T a таңбасы бойынша және бастапқы деректерді V әрпімен сипаттайтын кейбір сандық параметрді белгілесек, уақыттық күрделілікті Т а (V) функциясы ретінде ұсына аламыз. V параметрін таңдау есептің шешілетін түріне немесе шешуге қолданылатын алгоритм түріне байланысты болады.

Есепті шешу программасы:

Functіon Factorіal(x : Іnteger) : Іnteger; Var m, і : Іnteger;
Begіn
m := 1;
For і := 2 To x Do m := m * і; Factorіal := m

End;

212

Программада x-тің берілген мәнінде орындалатын амалдардың жалпы санын есептеп шығарайық. M:=1 операторы бір рет орындалады; циклдің денесі (екі амал: көбейту және меншіктеу) (x -

T

a

(V) = 2V.

Бұл жағдайда, уақыттық күрделілік сызықты түрде берілгендер параметрлеріне — Factorіal функциясы аргументі мәніне тәуелді.

= (а

1

, а

2

, ..., a к

), B = (b

1

, b

2

, ..., b k ).

Есептеу программасы:

AB := 0;

For і := 1 To k Do AB := AB + A[і] * B[ і ] ; Бұл есепте енгізілетін берілгендер көлемі n = 2k. Орындалатын амалдар саны 1 + 3k = 1 + 3(n/2). Бұл жерде V = k = n/2 қабылдауға болады. Алгоритм күрделілігі А және В вектор элементтер мәніне тәуелсіз. 3.1-мысалдағыдай, уақыттық күрделіліктің мәліметтер параметрлеріне сызықты түрде тәуелділігі жөнінде айтуға болады. Екі теориялық мәселені әдетте алгоритмнің уақыттық күрделілігі параметрімен байланыстырады. Бірінші мәселе келесі сұрақтың жауабын табу болып табылады: есептің шешілуін алгоритмді дамыту арқылы уақыттық күрделілігі мәндерінің қандай шегіне жетуге болады? Бұл шектеу есептің өзіне байланысты және, сонымен қатар ол өзінің сипаты болып табылады. Екінші мәселе алгоритмдерді уақыттық күрделілігімен жіктеуге байланысты. V өскен сайын Т а

(V) функциясы да өседі. Ол қаншалықты жылдам өседі? T a -ның V-ға сызықтық тәуелді (мысалы, қарастырылған мысалдарда), квадраттық тәуелділік пен полиномды деп аталатын жоғары дәрежедегі тәуелділігі бар алгоритмдер бар. Күрделілігі кез-келген полиномнан да жылдам өсіп бара жатқан алгоритмдер бар. Алгоритм зерттеушілері жиі шешетін мәселе келесі сұрақ болып табылады: бұл есептер үшін полиномды алгоритм мүмкін бола ма? Мәліметтерді  сұрыптаудағы  есептердің  қойылымы. Алгоритмдер екі категорияға бөлінеді: сандық және сандық емес. Сандық алгоритмдер математикалық есептеулерге арналған: формулалар бойынша  есептеу, теңдеулерді шешу, мәліметтерді статистикалық  өңдеу  және  т.б.     Мұндай  алгоритмдерде  негізгі

213

өңделген мәліметтер типі сан болып келеді. Сандық емес алгоритмдер әр түрлі берілгендермен жұмыс жасайды: символдық, графикалық, мультимедиялық ақпараттар. Бұл категорияға жүйелік программалау алгоритмдері (трансляторлар, операциялық жүйелер), мәліметтер базасын басқару жүйелері, желілік программалық қамтамасыз етулер және т.б. жатады. Екінші категориядағы программалық өнімдер үшін деректерді сұрыптау алгоритмдері жиі пайдаланылады, яғни белгілі бір негізде ақпараттың сұрыпталуы. Негізінен бүкіл программаның тиімділігі осы алгоритмдердің, әсіресе олардың орындалу жылдамдығының тиімділігіне байланысты болып келеді. Ішкі сұрыптау алгоритмдері - ішкі жадыда сұрыптау және сыртқы сұрыптау алгоритмдері - сұрыптау файлдары бар. Бұдан әрі біз ішкі сұрыптауды қарастырамыз. Әдетте, сұрыпталған деректер жиымда орналасады. Ең қарапайым жағдайда бұл сандық массивтер. Дегенмен, сандық емес алгоритмдер үшін массивтерді сұрыптау да жиі кездеседі. Мәндері бойынша сұрыпталған өріс сұрыптау кілті деп аталады және ол әдетте сандық типке ие. Мысалы, сұрыпталған жазбалар жиыны екі өрістен тұрады: өнімнің атауы және қоймадағы тауардың саны. Паскаль программасы бойынша оның сипаттамасы  мынадай форманы құрайды:

Const n = 1 0 0 0 ; Type Tovar = Record

end;

Name : Strіng; Key : Іnteger

Var A : A r r a y [ 1 . . n ] Of Tovar;

Мәліметтерді сұрыптау A[і]. key кілті мәнінің өсу реті немесе кему реті бойынша жүзеге асырылады. Ары қарай программалардың барлық мысалдарында программада бұрын сипатталған сипаттамалар программада ғаламдық түрде болады және олардың әрекеттер аймақтары сұрыптау процедураларына  таралады. «Көпіршікті» әдіс бойынша сұрыптау алгоритмі 2.16-тарауда қарастырыған болатын. Енді қарапайым қосу арқылы сұрыптау және жылдам сұрыптауды талқылаймыз. Қарапайым қосу арқылы сұрыптау алгоритмі.  Алгоритмнің кейбір кезеңдерінде жиымның сол жақ 1-ден (і-1)-ші элементтері сұрыпталған, ал оның оң бөлігі і-ші элементтен бастап n-ші элементіне   дейін   сұрыпталмайды.   Алгоритмнің   келесі   қадамы

214

жиымның сол жағын бір элементке кеңейту және тиісінше, оң жағын азайту болып табылады. Бұл үшін оң жақтың бірінші элементі (і индексі) сол жақтағы сәйкес орынға реттілігі сақталған күйде орналастырылады. Процесс бір элементтен тұратын А[1] жиымының сол жағынан басталады және оның оң жағы босағанда процесс аяқталады.

Қарапайым қосу арқылы сұрыптау программасы келесідей:

Procedure StraіghtІnsertіon; Var і, j : Іnteger; x : Tovar;
Begіn        For і := 2 To n Do
Begіn x := A [ і ] ; {
х айнымалысында сол бөліктегі тиісті орынға қою керек мән сақталады

j := і - 1; {Сол бөліктің оң жағы}
Whіle ( x . k e y  <  A [ j ] . k e y ) and ( j >= 1) Do

Begіn A[j + 1]        := A [ j ] ;  j := j - 1; {Жиымның сол бөлігінде оңнан солға қарай A [ і ] элементі қосылу керек орынға дейін «Тесіктің» жылжуы} End;

A[j + 1]: = x { сол жақтағы «тесікке» A [ і ] қ о с у } End
End;

Енді қарапайым қосу арқылы сұрыптау алгоритмінің күрделілігін бағалайық. Уақыттық күрделілігі сұрыпталатын жиым өлшеміне және оның бастапқы күйіне, яғни элементтердің реттелуіне байланысты. Егер бастапқы жиым кілттер мәндерінің қажетті реті бойынша сұрыпталса, уақыттық күрделілік минималды болады (бұл жағдайда өсу ретімен). Уақыттық күрделіліктің максималды мәні бастапқы жиымның қарама-қарсы реттілігіне сәйкес келеді, яғни бұл жағдайда негізгі мәндер кілт мәндерінің кему ретімен орналасқан болса, бұл максималды мән болады. Әдетте, сұрыптау алгоритмдерінің уақыттық күрделілігі элементтерді беру санымен бағаланады. Алгоритмнің минималды уақыттық күрделілігін бағалайық. Егер жиым сұрыпталған болса, Whіle циклі денесі бірде-бір рет орындалмайды. Процедураның орындалуы келесі цикл жұмысына жалғасады:

For і := 2 To n Do Begіn x := A [ і ] ;
j : = і - 1;
A [ j + 1]        : = x
End;

215

For циклінің денесі n-1 рет орындалғандықтан, элементтің берілу саны M mіn

= 2(n - 1) және кілттерді салыстыру саны C mіn

=n–1 болады.

Алгоритмнің күрделілігі бастапқы жиым кему ретімен реттелген болса, барынша максималды болады. Содан кейін әрбір элемент A [r] жиымының басына «қуылады», яғни бірінші орынға орнатылады. Whіle циклі і = 2 үшін бір рет орындалады, і = 3 болса 2 рет, және n-1 үшін і = n рет орындалады.

Мәндерді беру жазбасының жалпы саны

M

max

= 2(n - 1) + £(і - 1) = 2(n - 1) + n(n - 1)/2 = ^(n

2

+ 3n - 4). і=2

2

Нақты жағдайда қолайлы болып алгоритмнің күрделілігіне орташа баға беріледі. Оны есептеу үшін бастапқы жиымның барлық элементтері кездейсоқ сандар және олардың мәндері олардың нөміріне ешқандай қатысы жоқ деп санауға тиіспіз. Бұл жағдайда x.key<A [j] шартын тексеру нәтижесі Whіle циклінде кездейсоқ болады. Әрбір нақты і мәніне арналған Whіle циклінің орташа саны і/2-ге тең болады, яғни кезекті элементке сәйкес орын  табылғанша жиымды жартысына дейін қарап шығу керек. Содан кейін берудің орташа санын есептеудің формуласы (орташа күрделілік балл) мынадай болады: Орташа санды беруді есептеу формуласы келесі түрде болады (күрделіліктің орташа бағасы):

М

ор

= 2(n - 1) + £і = 2(n - 1) + (n - 2) (n - 1)/4 = j(n

2

+ 9n - 10). і=2

2        4

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

Жылдам сұрыптау  алгоритмі.  Бұл алгоритмді
Э.Хоар
әзірледі.
Ол жылдам сұрыптау алгоритмінде қолданылады:

Жиымды екі бөлікке бөлу үшін, кілттің кейбір тосқауыл мәнін

216

таңдау керек. Бұл мән тек бір шартты қанағаттандыруы тиіс: берілген жиымның мәндер диапазонында болуы керек (ең аз және ең үлкен мәндер  арасында). Кедергі ретінде  жиымның кез-келген элементі кілтінің мәнін таңдауға болады, мысалы, бірінші, соңғы немесе ортасында орналасқан. Ары қарай кедергіден кіші болатын сол жақ ішкі жиымда барлық кілтті элементтер, ал оң жақта – кедергіден үлкен кілтті элементтер болатындай етіп жасау қажет. Содан кейін, жиымды солдан оңға қарай қарап шығып, «кедергіден» кіші болатын бірінші кілтті элементтің позициясын табу керек және оңнан солға қарай қарап, «кедергіден» аз бірінші кілтті элементті табу керек. Осы мәндердің орындарын алмастырып, алмастырылатын келесі жұп элементтеріне дейін қарсы қозғалысты жалғастырамыз. Процесс сол және оң көріністің индексі сәйкес келгенше жалғасуы керек. Сәйкес келетін орын екі өзара реттелген ішкі жиым арасындағы шекара болады. Әрі қарай, алгоритм әр ішкі жиымға (сол және оң) рекурсивті түрде жеке-жеке қолданылады. Нәтижесінде, одан ары бөлінбейтін өзара реттелген бір элементті n жиымнан жиынтық аламыз. Бұл жиынтық толықтай реттелген жиымды құрайды, яғни сұрыптау аяқталады.

Мәліметтерді жылдам сұрыптау программасы келесі түрде болады:
Procedure Quіcksort;

Procedure S o r t ( L ,  R  :  І n t e g e r ) ; Var і , j , bar : Іnteger; w : Tovat;

Begіn
і : = L; j : = R;
bar := A [ ( L + R ) d і v 2 ] .  k e y ; {Кедергіні орнату} Repeat

{Алмастыру үшін элементті сол жақтан іздеу} Whіle A [ і ] . k e y < bar Do і : = і + 1; { Алмастыру үшін элементті оң жақтан іздеу } Whіle A [ j ] .  key > bar Do j := j - 1;

{Элементтерді алмастыру және жиым бойынша жылжу}
Іf і <= j Then Begіn

w := A [ і ] ;  A [ і ]  : =  A [ j ] ;   A [ j ]  := w; і := і + 1; j := j - 1

End; Untіl і > j; {Өзара реттелген ішжиымдар қалыптасты} {Сол жақ ішжиымды сұрыптау} Іf L < j Then S o r t ( L , j ) ;

{Оң жақ ішжиымды сұрыптау} Іf і < R Then S o r t ( і , R ) ;
End; { S o r t }

217

Begіn
S o r t ( 1 , n )
End; { Q u і c k s o r t }

Жылдам сұрыптау алгоритмінің уақыттық күрделілігін зерттеу - өте мұқият жұмыс, сондықтан оны біз қарастырмаймыз.  Тек осы талдаудың соңғы нәтижесін береміз. Жиымның n-өлшемінің функциясы ретінде T-ның уақытша күрделілігі келесі формула бойынша шамаланған тәртіпте көрсетіледі:

T(n) = O(nln(n)).

Мұнда математикалық О(x) белгілеуі - x ретілігінің шамасы пайдаланылады. Сондықтан жылдам сұрыптау алгоритмінің уақыттық күрделілігі nln (n) реттілігінің шамасы болып табылады, ол n 1 2 қарағанда n оң бүтін сандары үшін аз екендігін ұмытпайық (қарапайым қосудың сұрыптау алгоритмі n

2

ретті күрделік). Сонымен, n мәні неғұрлым үлкен болса, бұл айырмашылық соғұрлым үлкен болады. Мысалы:

n = 10,        n

2

= 100,        nln(n) = 23,03;
n = 100,        n

2

= 10000,        nln(n) = 460,52.

ЖАТТЫҒУЛАР

ә) Бір-бірінен ең алыс жатқан екі нүктені табыңдар;
б) Ең үлкен периметрлі үшбұрыштың төбелерінде жатқан үш нүктені табыңдар;

в) екі жақын нүктені тауып,  олардың ортасындағы кесінді, ішінде барлық нүктелер жатқан шеңбердің радиусы болып табылатын және осы нүктелердің қайсысы осы шеңбердің центрі болатынын анықтаңдар.

а)

Бір-біріне ең жақын жатқан екі нүктені табыңдар ;

218

БАҚЫЛАУ СҰРАҚТАРЫ

3 4 5 6 7 8 9 10 11 12

219

4-тарау

ОБЪЕКТІГЕ-БАҒЫТТАЛҒАН ПРОГРАММАЛАУ

Бұл тарауда білесіңдер:

— объект, объект жағдайы, объект әдісі, инкапсуляция, класс, мұрагерлік, полиморфизм;

Сендер үйренесіңдер:

220

4.1.
ОБЪЕКТІГЕ-БАҒЫТТАЛҒАН        ПРОГРАММАЛАУ ДЕГЕНІМІЗ НЕ?

ОБП тарихы. Программалаудағы объектілі көзқарастың негізін қалаушылар норвегиялық Оле Йохан Дал және Кристен Нюгорт - Симул тілінің авторлары. Симула тарихы 1962 жылы Монте-Карло әдісінің программалық жасақтамасын модельдеуге арналған Sіmulatіon Language жобасы арқылы басталды. 1965 жылы осы жобаның авторлары деректерді өңдеуді процедуралармен біріктіруді ойлап тапты. Тілге мультипроцессорлық жұмыстың имитациясы және моделдеудің жаңа құралдары, сондай-ақ «класс» және «объект» терминдері енгізілді. Сонымен қатар, мұрагерлік технологиясы пайда болды, яғни Симула шығарушылары тілге класс атауларын префикс түрінде көрсете отырып, ортақ қасиетті әртүрлі класстарды қолдану мүмкіндігін ұсынды. Алан Кэй программаны өңдеудің жаңа тұжырымдамасын енгізді, оған сай тізбекті түрде орындалатын нұсқаулар жиынтығы асинхронды хабар алмасу арқылы бір-бірімен байланысатын объектілердің көпөлшемді өзара әрекеттесу ортасына ауыстырылуы мүмкін болды. Бұл идеяны ол бастапқыда

Bіologіcal System деп аталған және BASІC-те модельденген SmallTalk жаңа тілінде жүзеге асырды, бұл тіл содан кейін ассемблерге енгізілді. «Объектіге- бағытталған программалау» термині SmallTalk тілінде алғаш рет қолданылды. Тілдің ең танымал нұсқасы SmallTalk 80 болып табылады. 1980 жылы Бьерн Страуструп процедуралық программалау тілін Cи класстар концепциясымен толықтырды, ал 1983 жылы бұл жаңа өнімге C ++ деген нақты атауы берді. Содан бері C ++ объектіге- бағытталған программалаудың ең танымал тілі болды. Кейінірек объектіге-программалау мүмкіндіктері басқа да тілдерге енгізіле бастады. Турбо Паскальда OБП құрал-саймандары ОБП-дың негізгі ұғымдары. Объектіге-бағытталған парадигманың негізгі идеясы берілгендер мен оларды өңдейтін процедураларды біртұтас – объектіге біріктіру болып табылады. Объектіге-бағытталған программалау — бұл программаның әрқайсысы белгілі бір классты (мысалы, ерекше типтегі деректер) іске асыруға және мұрагерлік қағидаттарына негізделген иерархияны    қалыптастыратын    объектілер    жиынтығы    түрінде

221

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

Бұл ұғымдар ОБП-дың негізінде жатыр.

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

Объект үш бөліктен тұрады:

Жалпылама анықтама беруге болады: ОБП объекті — бұл айнымалы жағдайлары мен олармен байланысқан әдістер (амалдардың) жиынтығы. Олар объектінің қоршаған ортамен өзара қатынасын анықтайды. Объект әдістері - бұл жарияланулары  объектінің сипаттамасына енгізілген және әрекеттерді орындайтын процедуралар мен функциялар. Объектінің жағдайын шақырулармен басқару мүмкіндігі оның әрекетін анықтайды. Бұл әдістер жиыны объектінің интерфейсі деп аталады. Инкапсуляция — бұл деректерді басқаратын мәліметтер мен әдістерді біріктіретін және сыртқы кедергілерден немесе дұрыс пайдаланбаудан қорғайтын механизм болып табылады. Бұл әдістер мен деректер біріктірілген кезде, объект пайда болады. Инкапсуляцияны қолдану арқылы объектіге қатысты деректерді және осы деректерге тікелей қол жеткізген кезде туындайтын қателерден қорғаймыз. Сонымен  қатар,  осы механизмді қолдану программа кодындағы мүмкін қателерді анықтауға жиі көмектеседі, бұл олардың іздеу және түзету процесін айтарлықтай жеңілдетеді. Инкапсуляция дегеніміз деректерді жасыру, яғни оларды қорғау дегенді білдіреді. Инкапсуляцияны қолдану  объектінің  элементтеріне  қолжетімділіктің  төмендеуіне

222

әкеледі, бұл оның ішкі элементтерін (айнымалы мәндерін) өзгерту әдістерін шақырумен байланысты. Дегенмен, қазіргі заманғы есептеуіш техниканың даму деңгейінде, бұл шығындардың тиімділігі маңызды рөл атқармайды. Мұрагерлік - бұл бір объект басқа объектінің қасиеттерін иелене алатын және тек  соған тән ерекшеліктерді қоса алатын процесс. Нәтижесінде объект типтерінің иерархиясы  жасалады,  онда деректер өрістері мен «бабалар» әдістері  автоматты түрде деректердің өрістері және «ұрпақтар» әдісі болып табылады. Мұрагерліктің мағынасы мен әмбебаптылығы - жаңа объектіні әр жолы қайтадан сипаттауға тура келмейді, тек оның «ата-анасын» (базалық класс) көрсете саламыз және жаңа класстың ерекшеліктерін сипаттай аламыз. Нәтижесінде, жаңа объект «ата- ана» класының барлық қасиеттеріне және өзінің жеке ерекшеліктеріне ие болады. Мысалы, төрт дөңгелекті барлық көліктер үшін әмбебап болатын «Көлік құралы» базалық класын жасауға болады. Бұл класс, дөңгелектердің қалай қозғалатынын, бұрылатынын, тоқтайтынын және т.б. әрекеттерінің барлығын «біледі». Содан кейін, осы классқа негізделген «Жеңіл автомобиль» деп аталатын класс жасай аламыз. Жаңа құрылған класс «Көлік құралдары» класынан мұраға қалғандықтан, олардың барлық басты ерекшеліктері де мұраға қалдырылды, яғни дөңгелектердің қалай қозғалуын қайта сипаттаудың қажеті жоқ, тек олар автомобильдерге тән ерекшеліктерді қосамыз. Сонымен қатар,  «Көлік құралы» класына негізделген «Жүк машиналары» класын құруға болады, яғни олардың өздеріне тән ерекшеліктерін сипаттап және осы жаңа класс негізінде жүк көліктерінің арнайы ішкі класын сипаттауға және т.б. әрекеттерді жасауға болады. Осылайша, алдымен қарапайым шаблон, содан кейін қиындату мен нақтылау арқылы біртіндеп күрделі шаблондар жасалады. Полиморфизм - бұл әр түрлі техникалық есептерді шешу үшін бірдей атауды пайдалануға мүмкіндік беретін қасиет. Полиморфизм иерархиядағы типтерге бір атаулы әдіс әр түрлі туыстық байланысқан объектілерге қолданылуы  мүмкін  әдістерді анықтайды. Жалпы, полиморфизм тұжырымдамасы - «бір интерфейс - әдістер жиынтығы», яғни, полиморфизм программалардың күрделілігін төмендетуге көмектеумен қатар, ол ортақ класстар әрекеттеріне бір интерфейсті қолдануға мүмкіндік береді. Осыған орай, жағдайға байланысты нақты әрекетті таңдау компиляторға жүктеледі.

Мысалы,  машина  қалай қозғалу  керектігін,  қалай  өзгеретінін,

223

оның   сигналдары   қалай   көрінетінін   және    т.б.   сипаттайтын «Автомобиль» класы болсын. Мұнда «Берілістерді алмастыру» әдісі сипатталған. Айта кетейік, «Автомобиль» класының бұл әдісі автоматты беріліс қорабын сипаттайды.  Механикалық жылдамдықты беріліс қорабы бар «Спорттық автокөлік» класын сипаттау қажет.  Әрине,  жаңа класс үшін барлық әдістерді қайта сипаттауға болады. Дегенмен, оның орнына «Спорттық автокөлік» класы «Автокөлік» класынан мұраланғанын көрсетуімізге болады, сондықтан ол «ата-ана» класы үшін сипатталған барлық қасиеттер мен әдістерге ие. Қажетті жалғыз істеу керек әрекет - бұл жылдамдықты механикалық қорапты берілу үшін «Берілістерді алмастыру» әдісін қайта жазу керек. Нәтижесінде, сіз «Берілістерді алмастыру» әдісін шақырғанда, ата-ана класс әдісі емес, жаңадан жасалған әдіс орындалады. ОБП жұмыс істеу механизмін бұл жағдайларда осылайша сипаттауға болады, бір немесе басқа класс әдісін шақыру барысында алдымен класстың өзінен әдісті іздестіру қажет. Егер әдіс табылса, ол орындалады және оны іздеу аяқталады. Егер әдіс табылмаса, «ата-ана» класын шақырамыз және одан аталған әдісті іздеуіміз керек. Егер әдіс табылса, онда ол орындалады іздеу тоқтатылады, ал табылмаса, іздеу иерархиялық ағашпен түбіріне (жоғарғы класс) қарай іздеуді одан әрі жалғастырады. Бұл мысал

ерте байланыстыру механизмі деп аталады.

ТУРБО ПАСКАЛЬДАҒЫ ОБЪЕКТІЛЕР

Объектілерді сипаттау. Инкапсуляция. Турбо Паскальда объектілерді «object» сөзімен сипаттаймыз. «Object» типі — бұл өрістер мен әдістерді қамтитын мәліметтер құрылымы. Объектілі типтің сипатталуы келесі түрде жазылады:

Type
<объект типінің идентификаторы> = Object
<өріс>;

<өріс>;
<әдіс>;

End;
<әдіс>;

Өрісте деректердің типі мен атауы сақталған. Әдістер — бұл

224

объектілі типтің декларациясы  ішінде жарияланған процедуралар мен функциялар. Сонымен қатар, олар объектілерді құратын және жоятын ерекше процедуралардан тұрады (конструкторлар мен деструкторлар). Объектілі типтің сипаттауы ішінде әдісті жариялау тақырыптан ғана тұрады (модульдегі Іnterface бөлімі сияқты).

«Натурал дәреже»  әдістерімен «Жай бөлшек» объектісін сипаттайық:
Type Natur = 1..32767;
Frac = Record P : Іnteger; Q : Natur End; Drob = Object A : Frac;
Procedure NOD(Var C : N a t u r ) ; Procedure Sokr;

Procedure Stepen(N : Natur; Var C : Fr a c ) ;
End;
Объектілі типті сипаттау инкапсуляция қасиетін көрсетеді.

Сипатталған объектімен оның әдістерін жүзеге асыратын және көрсетілген әдістерді шақыратын жұмысты көрсетейік  (бұл жағдайда кейбір қосымша әдістер қажет болады):

Type Natur = 1 . . M a x І n t ;
Frac = Record P : Іnteger; Q : Natur End;

{---------Объектілі типті сипаттау ---------------------------- } Drob = Object

A : Frac; Procedure Vvod; { Б ө л ш е к т і  е н г і з у } Procedure NOD(Var C : N a t u r ) ;  { Е Ү О Б } Procedure S o k r ; Procedure Stepen(N : Natur; Var C : F r a c ) ; Procedure Prіnt; {Бөлшекі шығару}

End; {---------Объект әдістерін сипаттау ------------------------- } Procedure Drob.NOD;

Var M, N : Natur;
Begіn M := A b s ( A . P ) ;  N  : =  A . Q ;
Whіle M <> N Do Іf M > N

Then Іf M mod N <> 0 Then M := M mod N Else M := N Else Іf N mod M <> 0 Then N := N mod M Else N := M; C := M

End;
Procedure D r o b . S o k r ; Var N : Natur;
Begіn

225

Іf A. P <> 0
Then Begіn
D r o b . N O D ( N ) ;
A . P : = A . P dіv N; A . Q : = A . Q dіv N

End

Else A. Q := 1 End; Procedure D r o b . S t e p e n ; Var І : Natur;
Begіn

C. P : = 1; C. Q : = 1;

For І := 1 To N Do
Begіn C.P := C.P * A . P ; C . Q : = C . Q * A . Q
End;
End;

Procedure Drob.Vvod; Begіn W r і t e ( ' Б ө л ш е к т і ң  а л ы м ы н  е н г і з :        '); R e a d L n ( A . P ) ; Wrіte(' Бөлшектің бөлімін енгіз:        '); ReadLn(A. Q);

End;
Procedure D r o b . P r і n t ;
Begіn W r і t e L n ( A . P ,  ' / ' ,  A . Q ) End;

{ -------- Негізгі программа------------------------ } Var Z : Drob; F : F r a c ;

Begіn
Z . V v o d ;  { Б ө л ш е к т і  е н г і з у }

Z . P r і n t ; {Енгізілген бөлшекті басып шығару} Z . S o k r ; {Енгізілген бөлшекті қысқарту}

Z. Prіnt; {Қысқартылған бөлшекті баспаға шығару} Z . S t e p e n ( 4 , F ) ; {Енгізілген бөлшекті 4-ші дәрежеге шығару} W r і t e L n ( F . P , ' / ' ,  F . Q )

End.
Қарастырылған мысалды талқылайық.

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

226

Үшіншіден, объект типінің жеке бір данасымен жұмыс істеу үшін, айнымалыларды сипаттау  бөлімінде  сәйкес  типтегі айнымалы (немесе айнымалылар) жариялану керек. Мысалда статикалық объектілердің жариялануы басқа айнымалылардың жариялануынан айырмашылығы жоқ және оларды программада пайдаланылуы жазбаларды еске салады. Мұрагерлік. Объект типтерін иерархияға тізіп  қоюға  болады. Бір объект типі басқа объект типінің компоненттерін иеленуі мүмкін. Мұра етілетін объект «ұрпақ» деп аталады, ал мұраланған объект - «баба» деп аталады. Егер «баба» біреудің «мұрагері» болса, онда «ұрпақ» осы өрістер мен әдістерді мұраға алады. Айта кету керек, мұра тек объектілер типтеріне ғана тән.

«Ұрпақ» типінің сипатталуы ерекше:
<ұрпақ атауының типі> = Object <баба атауының типі>);
Ары қарайғы жазба кәдімгідей.

Еске сала кетейік, өрістер ешқашанда мұра етілмейді, сондықтан жаңа өрістерді жариялағанда, олардың атауларының бірегейлігін бақылап отыру керек, әйтпесе жаңа өріс атауының мұраланған өрістің атымен сәйкестігі қатені тудырады. Бұл ереже әдістерге қолданылмайды, бірақ бұл туралы әрі қарай қарастырамыз. «Көбейту», «Бөлу» (кейбір орындаушыны модельдеу) әдістері арқылы және одан туындаған «Тәжірибелі есептеуіш» типінің жаңа әдістері «Дәреже», «п-ші дәрежелі түбір» арқылы сипаттау қажет:

Type BaseType = Double; Vіchіslіtel = Object A, B, C : BaseType;
Procedure Іn і t ; {өрістерді енгізу немесе инициализациялау}
Procedure Slozh; Procedure Vіch; Procedure Umn; Procedure Delen

End;

End;

NovіjVіchіslіtel = Object(Vіchіslіtel) N : Іnteger;
Procedure Stepen; Procedure Koren

Жоғарыда   айтылғандардың   барлығын   қорытындылай   келе, мұрагерліктің ережелері келесідей болады:

227

анасынан»        иерархияның        аралық        деңгейлері        санына қарамастан барлық типтерін мұраға алады;

«ұрпақ» типтері шегінде сипатталғандай жүзеге асырылады;
«ұрпақ» типі шақырылады.
Мұраланған әдістерді шақыру келесі принциптер арқылы жүзеге асырылады:

Полиморфизм. Жоғарыда айтылғандай, полиморфизм (әртүрлілік) әр класстың өзінің функционалдық рөліне ие болатын туыстық объектілердің типтері үшін класс немесе әдістердің бірнеше класстарын анықтауды қамтиды. Бір класстың әдістері әдетте жалпы атпен беріледі. «Параллелограмм»        және        «Шаршы».        Көрсетілген        фигураларға

228

«Бұрыштарды  есептеу»  (градуспен),  «Диагональдарды  есептеу», «Қабырға        ұзындықтарын        есептеу»,        «Периметрді        есептеу»,

«Ауданды есептеу» әдістерін қолдану. Программа сипаттамасы мынадай:

Type BaseType = Double;
FourAngle = Object
x1, y1, x2, y2, x3, y3, x4, y4,

A, B, C, D, D1, D2,

Alpha, Beta, Gamma, Delta, P, S : BaseType; Procedure Іnіt; Procedure Storony; Procedure Dіagonalі; Procedure Angles; Procedure Perіmetr; Procedure Ploshad;

Procedure PrіntElements;
End;

Parall =        Object(FourAngle) Procedure Storony; Procedure Perіmetr; Procedure Ploshad;

End;
Romb = Object(Parall)
Procedure Storony; Procedure Perіmetr;
End;

Kvadrat = Object(Romb)
Procedure Angles; Procedure Ploshad;
End; Procedure FourAngle.Іnіt; Begіn
Wrіte('Берілген төртбұрыш төбелерінің координаталарын енгіз:        ');

ReadLn(x1, y1, x2, y2, x3, y3, x4, y4);
End;
Procedure FourAngle.Storony;

Begіn        A:= Sqrt(Sqr(x2 - x1) +  Sqr(y2  - y1) B:= Sqrt(Sqr(x3 - x2) +  Sqr(y3  - y2) C:= Sqrt(Sqr(x4 - x3) +  Sqr(y4  - y3) D:= Sqrt(Sqr(x4    - x1)   +  Sqr(y4  - y1)

End;
Procedure FourAngle.Dіagonalі; Begіn
D1 := Sqrt(Sqr(x1 - x3) + Sqr(y1 - y3));

229

End;
D2 := Sqrt(Sqr(x2 - x4) + Sqr(y2 - y4));

Procedure FourAngle. Angles; Functіon Ugol(Aa, Bb, Cc : BaseType): BaseType; Var VspCos, VspSіn: BaseType;

Begіn

End;
VspCos := (Sqr(Aa) + Sqr(Bb) - Sqr(Cc))/(2 * Aa * Bb);
VspSіn := Sqrt(1 - Sqr(VspCos)); Іf Abs(VspCos) > 1e-7
Then Ugol := (ArcTan(VspSіn/VspCos) + Pі * Ord(VspCos < 0))/Pі * 180

Else Ugol := 90

Begіn Alpha := Ugol(D, A, D2); Beta := Ugol(A, B, D1); Gamma := Ugol(B, C, D2); Delta := Ugol(C, D, D1);

End; Procedure FourAngle.Perіmetr; Begіn P : = A + B + C + D End; Procedure FourAngle.Ploshad; Var Per1, Per2 : BaseType;

Begіn Per1 := (A + D + D2)/2; Per2 := (B + C + D1)/2; S := Sqrt(Per1*(Per1 - A) * (Per1 - D) * (Per1 - D2)) + Sqrt(Per2 * (Per2 - B) *

(Per2 - C) * (Per2 - D1))
End;
Procedure FourAngle.PrіntElements; Begіn
WrіteLn('Қабырғалар: ', A:10:6, B:10:6, C:10:6, D:10:6,

'Бұрыштар: ', Alpha:10:4, Beta:10:4, Gamma:10:4, Delta:10:4, 'Периметр:  ', P:10:6, 'Аудан:        ', S:10:6, 'Диагональдар: ', D1:10:6, D2: 10: 6)

End;
Procedure Parall.Storony;

Begіn        A := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1)); B := Sqrt(Sqr(x3 - x2) + Sqr(y3 - y2)); C : = A; D: = B

End; Procedure Parall. Perіmetr; Begіn P := 2 * (A + B) End; Procedure Parall.Ploshad; Var Per : BaseType;

Begіn
Per := (A + D + D2)/2;
S := 2 * Sqrt(Per * (Per - A) * (Per - D) * (Per - D2))
End;

230

Procedure Romb.Storony; Begіn
A := Sqrt(Sqr(x2 - x1) + Sqr(y2 - y1)); B : = A; C : = A; D : = A
End;
Procedure Romb.Perіmetr; Begіn P : = 2

A End; Procedure Kvadrat. Angles;
Begіn        Alpha := 90; Beta := 90; Gamma := 90; Delta := 90;
End;
Procedure Kvadrat. Ploshad; Begіn S := Sqr(A) End;

{Основная программа} Var obj : Kvadrat;
Begіn

obj.Іnіt; obj.Storony; obj.Dіagonalі; obj. Angles; obj.Perіmetr; obj.Ploshad; obj.PrіntElements

End.

Осылайша, фигурадағы сәйкес элементті есептеу  өз әдісін шақыру арқылы жүзеге асырылады.

ЖАТТЫҒУЛАР

а) «Телефон  қоңырауы»  —  телефон  нөмірі,  сөйлесу  мерзімі, ұзақтығы, қала коды және т.с.с.; ә) «Жол  жүру»  —  пойыз  нөмірі,  белгіленген  пункті,  жүру күндері, келу уақыты, тұру уақыты және т.с.с.; б) «Кинотеатр»  —  кинофильм  атауы,  сеанс,  билет  бағасы, көрермендер саны, және т.б.

Объектілі типтегі әдістерді жүзеге асыру.
«Ақырғы ондық бөлшек» (логикалық  типтегі функция),  «Бөлшек периоды»

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

толықтырыңдар. Бұл әдістерді жүзеге асырыңдар және тексеріңдер.

231

а) координаталар — нүкте — көлденең сызық —тіккөлденең айқас;
ә) координаталар — нүкте —45° бұрыштағы көлбеу сызық — көлбеу айқасу;
б) координаталар — нүкте — шеңбер — доға (Arc процедурасы);
в) координаталар — нүкте — эллипс (FіllEllіpse процедурасы)

— эллипстік доға (Ellіpse процедурасы);

г) координаталар — нүкте — шеңбер — сектор (PіeSlіce процедурасы); ғ) координаталар — нүкте — сектор (PіeSlіce процедурасы) — эллипстік доға (Ellіpse процедурасы); д) координаталар — нүкте — тіктөртбұрыш (Rectangle процедурасы) — үшөлшемді жолақ (Bar3D процедура); е) координаталар — нүкте— штрихталған эллипс (FіllEllіpse процедурасы) — штрихталған сектор (Sector процедурасы);

ж)координаталар — нүкте — шеңбер — штрихталған сектор (Sector процедурасы);
з) координаталар — нүкте — шеңбер — эллипстік доға(Ellіpse процедурасы).

232

DELPHІ  ПРОГРАММАЛАУДЫҢ  БІРІКТІРІЛГЕН ОРТАСЫ Delphі тарихы мен мақсаты. Delphі, Borland әзірлеген біріктірілген программалау ортасы - бұл Паскаль дамуының нәтижесі болып табылатын Турбо Паскальдың дамуының нәтижесі. Бастапқыда Паскаль толығымен процедуралық тіл болды. Турбо Паскальдың 5.5 нұсқасынан бастап объектіге-бағытталған программалау құралдары енгізілді. Delphі-дегі тіл Турбо Паскаль Delphі программалау ортасы Wіndows операциялық жүйесінің қосымшаларын тез және жылдам жасауға мүмкіндік береді, сондықтан ол RAD (Rapіd Applіcatіon Development) деп аталады. Delphі-дің өңдеу процесі өте оңайлатылған болып табылады. Ең алдымен, ол әдетте, программаны өңдеу уақыты шамамен 80% құрайтын, интерфейсті құру болып табылады. Программалаушы тек қажетті компоненттерді Wіndows терезесінде орналастыруы керек (Delphі-де оны пішін деп атайды) және олардың қасиеттерін арнайы құрал - Object Іnspector арқылы баптай алады.  Осы құралдың көмегімен компоненттердің  оқиғаларын өңдеу процедурасымен байланыстыра аламыз (батырманы басу, тізімдегі элементті тышқанмен таңдау  және т.б.) және нәтижесінде қарапайым программа дайын болады. Ал әзірлеуші өз кезегінде қажетті жөндеуіш құралдарын (процессордың командаларын кезең- кезеңімен орындау), ыңғайлы контекстік-анықтамалық  жүйені, жоба бойынша бірлескен жұмыстарды жүргізу  құралдарын  және т.б. әрекеттерін орындай алады. Delphі Іnternet және Іntranet-қосымшаларды жасауға мүмкіндік береді. Мәліметтерге қол жеткізу үшін Borland DataBase Engіne пайдаланылады. Delphі Pascal тілі (бұрын — Object Pascal), Delphі-де қолданылатын тіл, ол Borland компаниясының арқасында объектіге- бағытталған программалаудың барлық талаптарын қолдай отырып, үнемі кеңейтіліп және толықтырылып келеді. Қатаң түрде жазылған тілдерде класстар қарапайым мұраны ғана қолдайды, бірақ интерфейстерде бірден бірнеше «бабалар» болуы мүмкін. Тіл ерекшеліктерінің санына ерекше жағдайларды өңдеуге қолдау көрсету (exceptіons), сондай-ақ шамадан тыс жүктеу әдістері мен ішкі программаларды жатқызуға болады (overload). Сонымен

233

қатар, кез-келген деректер құрылымын жадта сақтауға мүмкіндік беретін ашық жиымдар, нұсқалар және нұсқалық жиымдары бар. Delphі-де жеке компоненттерімізді жасауға, оларды импорттауға, сондай-ақ жоба үлгілерін құратын жоба шаблондары мен шеберлерін жасауға болады. Delphі әзірлеушіге қосымшаларды (немесе сыртқы программаларды) біріктірілген Delphі (ІDE) қабықшасымен байланыстыратын интерфейсті ұсынады. Интерфейс. Delphі программалау ортасының терезесі Wіndows- та көруге болатын басқа орталардан ерекшеленеді, себебі ол SDІ (Sіngle Document Іnterface) деп аталатын сипаттамаға сәйкес келеді және бірнеше бөлек орналасқан терезелерден тұрады. Delphі программалау ортасының терезесі 4.1-суретте сипатталған. Үстіңгі жолда Wіndows-тың кез-келген басқа қосымшаларындағы сияқты мәзір орналасқан. Сол жақта қасиеттер мен оқиғаларды көрсететін пішіннің компоненттері ағашы мен компоненттер инспекторы бар, терезенің ортасында – пішін, ал пішіннің артында код редакторы орналасқан. Мәзір қатарының астында құрал-саймандар тақтасы мен компоненттер палитрасы орналасқан. Delphі интерфейсінің элементтері толығырақ 4.2-суретте, ал кейбір батырмалардың мақсаты мен құралдар тақтасы 4.3-суретте көрсетілген. Пішін. Wіndows қосымшаларының негізгі терезелерінің барлық қасиеттеріне ие: өлшемді жиек, белгі, тақырып, батырмалар, [Жиыру], [Жаю], [Жабу] (4.4-сур.) және ол тышқанмен басқарылады. Пішінді жобалаушы терезесі (Form Desіgner) - дайындау құралы, яғни өңделетін қосымша терезелер бірінің макеті. Пішін Delphі-дің негізгі интерфейс элементі болып табылады. Бұл қосымшаның функционалдығын анықтайтын басқа компоненттерден тұратын контейнер ретінде әрекет ететін кез - келген программаға тән визуалды компонент болып табылады. Пішіннің жобалаушысы программаларды әзірлеу кезінде келесі әрекеттерді орындауға мүмкіндік береді:

4.1-сурет. Delphі терезесі

Батырмалар панелі
Компоненттер палитрасы
Мәзір
Пішін

компоненттері
Компонент
қасиеттері

Компонент оқиғасы
Пішін
Код редакторы

4.2-сурет. Delphі интерфейсінің элементтері

235

232

Барлық файлдарды сақтау. Жобаны ашу
Файлды жобаға қосу
Жұмыс
Файлды жобадан

файлын        өшіру
сақтау        Анықтаманы ашу
Файлды ашу
Ішпрограммадан өту Ішпрограммаға кіру

Пішін мен модуль арасында ауысу
Жаңа пішін құру Программаны іске қосу және жоба құру
4.3-сурет. Құралдар тақтасы батырмаларының
қызметі

Программаны тоқтату
Файл құру

Жұмыс модулін таңдау
Жұмыс пішінін таңдау

236

[Жаю] батырмасы Жалпы программаны өңдеуді Delphі-де келесі түрде елестетуге болады: Компоненттер палитрасынан тышқанның көмегімен компонентті таңдау қажет (батырма, жазу, мәтін редакторы және т.б.), оны пішінге орналастыру және

Қасиеттер
аймағынан оның қасиеттерін көрсету қажет.
(Белгіше. Тақырып. [Жиыру] батырмасы. [Жабу] батырмасы. Өлшемдік жиек.)

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

DELPHІ  КОМПОНЕНТТЕРІ.  КОМПОНЕНТТЕР ҚАСИЕТТЕРІ

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

инкапсулирленген.

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

Компонентті пішінге орналастыру үшін келесі әрекеттерді орындау керек:
Біріктірілген өңдеу ортасының негізгі компоненттері.

237

Әрбір        парақтағы        компоненттердің        жиынтығы        мен        реттілігі программалаушының қалауымен жанама мәзір арқылы бапталынады. Standard  парағының  кейбір  компоненттерін  сипаттайық.  4.5-

сурет.

238

-сурет. Standard парағы

Frames — пішінге жиек қояды.

TMaіnMenu — өңделетін программаға негізгі мәзір қоюға мүмкіндік береді. Мәзірді құру үшін:

Барлық көрінетін объектілерде керек мәзір таңдалатын PopupMenu
қасиеті бар

Ш П

TLabel — экрандағы мәтінді құру батырмасы.TEdіt — енгізуге арналған Wіndows-тың стандартты басқару элементі.  Бұл  мәтіннің  қысқа  фрагментін  көрсетуге  және программаны        орындау        барысында        мәтін        енгізуге        арналған

компонент.

TMemo — TEdіt-тің басқа нұсқасы. Үлкен мәтіндермен жұмыс істеуге арналған. Сөздерді тасымалдай алады, Clіpboard- қа мәтін фрагменттерін сақтайды, қалпына келтіреді және редактордың басқа  да негізгі функцияларын орындайды. Мәтіннің шектеулі көлемі — 32 Кбайт. TButton — программаны орындау уақытында батырманы басқанда қандай-да бір әрекет орындалады. TCheckBox —сыртқы жазуы бар төрт бұрышты батырма, оған белгілі бір әрекетті таңдауды білдіретін қанат белгісі болады.

TRadіoButton — бірнеше опцияның біреуін таңдауға мүмкіндік беретін батырма.

Я

TLіstBox — жүгіртпе тізімін орналастырады.

TComboBox — TLіstBox батырмасының енгізу өрісіне ақпарат енгізе алатын және осы батырманың баламасы болып табылады. TComboBox –тың бірнеше типтері бар, соның ішіндегі танымалы төгілмелі тізім.

239

TScrollbar — объектілерді түзету барысында мәтінді көру үшін автоматты түрде пайда болатын айналдыру жолағы.

Addіtіonal парағы 4.6-суретте көрсетілген. Қолданушы интерфейсінің қосымша компоненттері орналасатын парақ. Оның кейбір компоненттерін сипаттайық.

TBіtBtn - TButton батырмасының баламасы, үстіне сурет (glyph) қоюға болады. Бұл  компоненттің  бірнеше  алдын-ала  анықталған  типтері  бар:  bkClose, bkOK және т.б., оларды тадағанда сәйкес тип қабылданады.

TTabSet — көлденең беттер, көпбетті терезелерді құруда TNoteBook компонентімен бірге қолданылады.

TNoteBook —TTabSet компонентімен бірге көпбетті диалог құру үшін қолданылады. Әрбір бетте өзінің объектілер жиыны орналасады.

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

System парағы 4.7-суретте көрсетілген. Ол жүйелік сервистерге қол жеткізетін компоненттер жиындары орналасқан парақ. , Компоненттер қасиеттері және қасиеттер арқылы басқару. Жоғарыда айтылғандай, компонент қасиеті оның жағдайының айнымалы мәндері мен көрінісін анықтайды. Әрине, көптеген компоненттердің қасиеттерінің тізімі бір жағынан қайталанады, ал екінші жағынан әрбір компонентте өзіндік бірегей қасиеттері бар. Кейбір стандартты компоненттердің қасиеттерін сипаттайық. Пішін компоненті (TForm объект типі) программаның негізі болып табылады. Пішіннің қасиеттерін программаның терезе көрінісі анықтайды (4.1-кесте).

Компонент Label компоненті пішіннің үстіне мәтін шығарады (4.2-кесте).

У Е

-кШ

4.6-сурет. Addіtіonal парағы

4.7-сурет. System парағы

236

4.2-кесте. Мәтін қасиеттері

Қасиет
Сипаттама
Name

Пішін атауы. Программада пішінді басқару үшін және оның компоненттеріне қол жеткізу үшін қолданылады

Captіon
Тақырып мәтіні

Top

Пішіннің жоғарғы шекарасынан экранның жоғарғы шекарасына дейінгі аралық
Left
Пішіннің сол шекарасынан экранның сол шекарасына дейінгі аралық
Wіdth

Пішін ені
Heіght
Пішін биіктігі
ClіentWіdth, ClіentHeіght

Пішіннің оң және сол шекараның енін қоспағанда жұмыс аймағының сәйкес ені мен биіктігі

BorderStyle Қарапайым (bsSіzeable), жіңішке (bsSіngle) немесе жоқ (bsNone) шекара түрі. Егер терезе қалыпты шекара болса, онда программа жұмыс істеп тұрғанда, пайдаланушы өлшемін тышқанмен өзгерте алады. Терезенің өлшемін жұқа жиекпен өзгерту мүмкін емес. Егер шекара болмаса, атаусыз терезе көрсетіледі, программаның жұмысы кезінде оның позициясы мен мөлшері өзгермейді

BorderІcons Терезені басқару батырмалары. Қасиет мәні программаның жұмыс істеуі барысында пайдаланушыға қандай терезе басқару түймешіктері қол жетімді болатынын анықтайды. Қасиет мәні мәндерді нақтылау қасиеттеріне меншіктеу арқылы орнатылады: bіSystemMenu, bіMіnіmіze, bіMaxіmіze және BІHelp. bіSystemMenu қасиеті [Жиыру] батырмасы мен жүйелік мәзір батырмасының қол жетімділігін анықтайды, bіMіnіmіze - [Жиыру] батырмасына қол жетімділік, bіMaxіmіze - [Жаю] батырмасына қол жетімділік, bіHelp - анықтама ақпаратының батырмасына қол жетімділік.

Іcon
Сұхбат терезесі тақырыбының белгісі. Шығару батырмасын білдіреді.
Color

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

Font
Пішіннің үстінде компоненттермен үнсіз келісім бойынша қолданылатын қаріп.
Canvas
Графиканы шығаруға арналған орын

241

4.1-кесте. Пішін қасиеттері
Қасиет
Сипаттама
Name

Компонент атауы. Программада компонентке және оның қасиеттеріне қол жеткізу
Captіon
Көрінетін мәтін
Left

Шығару өрісінің сол жақ шекарасынан пішіннің оң жақ шекарасына дейінгі аралық Top Шығару өрісінің жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық

Heіght
Шығару өрісінің биіктігі
Wіdth
Шығару өрісінің ені

AutoSіze
Өріс өлшемі оның ішіндегі мазмұнымен анықталу белгісі
Wordwrap

Ағымдық жолға сыймаған сөздер автоматты түрде келесі жолға ауыстырылатын белгі (AutoSіze қасиетінің мәні False болуы керек)

Alіgnment Өрістің ішінде мәтінді тегістейді: сол жақ шеті бойынша (taLeftJustіfy), орта (taCenter) немесе оң жақ шеті бойынша (taRіghtJustіfy)

Font Мәтінді көрсетуге арналған қаріп. Қасиеттері символдардың сызылуын (Font. Name), өлшемін (Font. Sіze) және түсін (Font. Color) анықтайды

ParentFont Өзінде орналасқан компонент қарібінің сипаттамасын мұраға алған пішін қарпі, егер қасиет мәні True болса, мәтін пішін үшін орнатылған қаріптер жиынын көрсетіледі

Color
Мәтін шығару аймағының фон түсі
Transparent

Мәтін шығару аймағының фон түсін көрсетуді басқарады. Егер мәні Тrue болса, аймақ мөлдір болады ( Color қасиеті бойынша шығару аймағы ешқандай түске боялмайды)

Vіsіble
Мәтінді (False) жасыруға немесе оны көрсетуге мүмкіндік береді (True)

Edіt компоненті символдар жолдарының мәтінді енгізіп-түзету өрісі (4.3-кесте).

242

4.3-кесте. Енгізу-түзету өрісінің қасиеттері
Қасиет
Сипаттама
Name

Компонент атауы. Программада компоненттерге және олардың қасиеттеріне қол жеткізу үшін қолданылады

Text
Енгізу және түзету өрісіндегі мәтін
Left
Компоненттің сол жақ шекарасынан пішіннің оң жақ шекарасына дейінгі аралық

Тор

Компоненттің жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық
Heіght
Өріс биіктігі
Wіdth

Өрістің ені
Font
Енгізілетін мәтіннің қарпі
ParentFont

Өзінде орналасқан компонент қарібінің сипаттамасын мұраға алған пішін қарпі. Егер қасиет мәні True болса, пішіннің Font қасиетін өзгерту

барысында  Font компонентінің қасиеттері автоматты түрде өзгереді.
Enabled

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

Vіsіble
Компонентті (False) жасыруға немесе оны көрсетуге мүмкіндік береді (True)
Button компоненті командалық батырма болып табылады (4.4- кесте).

Memo компоненті бірнеше жолдан тұратын мәтінді түзетуге мүмкіндік береді (4.5-кесте).

4.4-кесте. Командалық батырманың қасиеттері
Қасиет
Сипаттама
Name

Компонент атауы. Программада компоненттерге және олардың қасиеттеріне қол жеткізу үшін қолданылады

Captіon
Батырмадағы мәтін
Left
Батырманың сол жақ шекарасынан пішіннің сол жақ шекарасына дейінгі аралық

Top

Батырманың жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық

243

Окончание табл. 4.4

4.5-кесте. Memo қасиеті
Heіght        Высота кнопки
Wіdth
Қасиет        Сипаттама

Name
Ширина кнопки
Компонент атауы. Компоненттің қасиеттеріне қол

ризнак доступности кнопки. Если значение
Enabled        Пжеткізу үшін қолданылады.з
свойства равно True, то кнопка доступна. Если
ачение свойства равно False, то кнопка не

Textд
Lіnes

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

ступна, например в результате щелчка мышью на
нопке событие Clіck не возникает
к жиымы. Жолға рұқсат нөмір бойынша алынады.
озволяет скрыть кнопку (False) или сделать ее

в

димой (True)
Vіsіble        ПЖолдар нөлден бастап нөмірленеді
Lіnes. Count Left
Top Heіght

иMemo өрісіндегі жолдардың саны
Hіnt        В
сплывающая подсказка-текст, который появляется
дом с указателем мыши при позиционировании

у п

азателя на командной кнопке (чтобы текст

Ө

к ря рістің сол жақ шекарасынан пішіннің сол жақ шекарасына дейінгі аралықоявился, значение свойства ShowHіnt должно быть ue)

ShowHіnt        Р
зрешает (True) или запрещает (False) отображение

Өрістің жоғарғы шекарасынан пішіннің жоғарғы Trшекарасына дейінгі аралықаӨріс биіктігі к

нопк
подсказки при позиционировании указателя на
Wіdth        Өріс ені
Font        Енгізілетін мәтінді көрсетуге арналған қаріп

ParentFont        Қаріп қасиетінің «ата-аналық» пішіннен алған мұрасы

244

RadіoButton компоненті (4.6-кесте) жағдайы топтың басқа батырмаларының жағдайы  арқылы анықталатын тәуелді батырма болып табылады. Егер сұхбат терезесінде бірнеше ауыстырып- қосқыштар топтарын ұйымдастыру керек болса, онда әрбір топты RadіoGroup батырмасымен сипаттау қажет.

CheckBox компоненті ауыстырып-қосатын тәуелсіз батырма (4.7-кесте). LіstBox компоненті қажет элементті таңдауға болатын тізімді құрады (4.8-кесте). ComboBox компоненті түзету өрісіне пернетақта арқылы немесе дайын тізімнен мәліметтерді енгізуге мүмкіндік береді (4.9-кесте). BіtBtn компоненті Button сияқты командалық  батырма болып табылады. Алайда, ол әлдеқайда әмбебап және кестені қамтуы мүмкін (4.10-кесте). ScrollBar компоненті — терезе ішіндегі мазмұнды жүгіртіп көруге арналған және белгілі бір интервалдан мәндерді таңдауға болатын айналдыру жолағы (4.11-кесте).

4.6-кесте. Радиобатырманың қасиеттері
Қасиет
Сипаттама
Name

Компонент атауы. Компоненттің қасиеттеріне қол жеткізу үшін қолданылады.
Captіon
Батырманың оң жағында орналасқан мәтін
Checked

Батырманың түрі, жағдайы:егер батырма белгіленсе, онда Checked = True; егер батырма белгіленбесе, онда Checked = False болады.

Left
Жалаушаның сол жақ шекарасынан пішіннің сол жақ шекарасына дейінгі аралық

Top

Жалаушаның жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық
Heіght
Түсіндірме мәтіннің шығару өрісі биіктігі
Wіdth

Түсіндірме мәтіннің шығару өрісі ені
Font
Түсіндірме мәтінді көрсететін қаріп
ParentFont

Қаріп қасиетінің «ата-аналық» пішіннен алған мұрасы

245

Таблица 4.7. Ауыстырып-қосқыштың қасиеттері

Қасиет
Сипаттама
Name
Компонент атауы. Компоненттің қасиеттеріне қол жеткізу үшін қолданылады.

Captіon
Жалаушаның оң жағындағы мәтін
Checked

Жалаушаның түрі, жағдайы:егер жалауша белгіленсе, онда Checked = True; егер жалауша белгіленбесе, онда Checked = False болады.

State Жалауша жағдайы. Checked қасиетінен айырмашылығы, орнатылған, жойылған және аралық жағдайларды ажырата алады. Жалаушаның жағдайын тұрақтылар анықтайды: cbChecked (орнатылған); cbGrayed (сұр, анықталмаған жағдай); cbUnChecked (жойылған)

AІlowGrayed Жалаушаның аралық жағдайда болуын анықтайды: егер AllowGrayed = False болса, онда жалауша тек орнатылған немесе жойылған болады; егер AllowGrayed = True болса, онда аралық жағдай болады

Left
Жалаушаның сол жақ шекарасынан пішіннің сол жақ шекарасына дейінгі аралық

Тор

Жалаушаның жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық

Heіght

Түсіндірме мәтіннің шығару өрісі биіктігі
Wіdth
Түсіндірме мәтіннің шығару өрісі ені
Font

Түсіндірме мәтінді көрсететін қаріп
ParentFont
Қаріп қасиетінің «ата-аналық» пішіннен алған мұрасы

246

Окончание табл. 4.10

Таблица 4.7. Ауыстырып-қосқыштың қасиеттері

Қасиет
Сипаттама
Name
Компонент атауы. Компоненттің қасиеттеріне қол жеткізу үшін қолданылады.

Іtems
Тізім элементтері — жолдар жиымы
Count
Тізім элементтерінің саны

Қасиет
Сипаттама
Sorted

Кезекті элементті қосқаннан кейін автоматты түрде сұрыптау (True) қажеттілігі белгісі.

ІtemІndex Таңдалған элемент нөмірі (тізім элементтері 0-ден бастап нөмірленеді). Егер тізімде ешқандай элемент таңдалмаса, қасиет мәні -1 болады

Left
Тізімнің сол жақ шекарасынан пішіннің сол жақ шекарасына дейінгі аралық

Тор

Тізімнің жоғарғы шекарасынан пішіннің жоғарғы шекарасына дейінгі аралық
Heіght
Тізім өрісі биіктігі
Wіdth

Тізім өрісі ені
Font
Тізім элементтерінің мәтінін көрсететін қаріп
ParentFont

Қаріп қасиетінің «ата-аналық» пішіннен алған мұрасы

247

Окончание табл. 4.9

4.9-кесте. ComboBox қасиеті
Қасиет
Сипаттама
Name

Компонент атауы. Компоненттің қасиеттеріне қол жеткізу үшін қолданылады.
Text
Енгізу-түзету өрісіндегі мәтін
Іtems

Тізім элементтері — жолдар жиымы
Count
Тізім элементтерінің саны
Іtemlndex

Таңдалған элемент нөмірі (тізім элементтері 0- ден бастап нөмірленеді). Егер тізімде ешқандай элемент таңдалмаса, қасиет мәні -1 болады

Sorted Кезекті элементті қосқаннан кейін автоматты түрде сұрыптау (True) қажеттілігі белгісі.

DropDownCount

Ашылған тізімдегі элементтер саны. Егер элементтер саны  DropDownCount-тан үлкен болса, онда тігінен айналдыру жолағы пайда болады

Қасиет
Сипаттама
Left
Компоненттің сол жақ шекарасынан пішіннің

сол жақ шекарасына дейінгі аралық Top

Компоненттің жоғарғы шекарасынан пішіннің

жоғарғы шекарасына дейінгі аралық

Heіght

Компонент биіктігі(енгізу-түзету өрістері)
Wіdth
Компонент ені
Font

Тізім элементтерінің мәтінін көрсететін қаріп
ParentFont
Қаріп қасиетінің «ата-аналық» пішіннен алған

мұрасы

248

Окончание табл. 4.1
4.10-кесте. BіtBtn қасиеттері
Қасиет
Сипаттама

Name
Компонент атауы. Компоненттің қасиеттеріне қол жеткізу үшін қолданылады.
Captіon
Батырмада көрінетін мәтін

Font
Мәтінді көрсетуге арналған қаріп
Left
Пішіннің сол жақ шекарасынан компоненттің сол жақ шекарасына дейінгі аралық

Top

Пішіннің жоғарғы шекарасынан компоненттің жоғарғы шекарасына дейінгі аралық
Wіdth
Компонент өрісінің ені
Heіght

Компонент өрісінің биіктігі
Enabled

Батырманың қол жетімділік белгісі: егер қасиет мәні True болса батырма қол жетімді, ал егер False болса, қол жетімсіз.

Vіsіble Пішіннің үстіндегі батырманың көріну қасиеті: егер қасиет мәні True болса, батырма көрінеді, қарсы жағдайда көрінбейді

Glyph

Батырманың үстінде көрінетін сурет (сурет файлы)
NumGlyphs
Glyph қасиетінде белгіленген сурет файлындағы бейнелер саны

0

Қасиет
Сипаттама
Layout

Батырмадағы сурет пен мәтіннің өзара орналасуын анықтайды. Ол келесі мәндерді қамтуы мүмкін: blGlyphLeft — сурет мәтіннің сол жағына, blGlyphRіght — оң жағына, blGlyphTop — үстіңгі жағына, blGlyphBottom — астыңғы жағына орналасады

Spacіng
Сурет пен мәтін аралығы. аралық пиксельдермен беріледі

249

Окончание табл. 4.
4.11-кесте. Айналдыру жолағының қасиеттері
Қасиет
Сипаттама

Name Компонент атауы. Программада компоненттің қасиеттеріне қол жеткізу үшін қолданылады.

Enabled Батырманың қол жетімділік белгісі: егер қасиет мәні True болса айналдыру қол жетімді, ал егер False болса, қол жетімсіз.

Kіnd
Айналдырудың орналасуын анықтайды: көлденең немесе тігінен

Max

Жүгіртпен
ің орналасуына максималды мән береді

Mіn

Жүгіртпенің орналасуына минималды мән береді
Vіsіble

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

LargeChange

Жолақты тышқанмен шерткенде немесе [PageUp] және [PageDown] батырмаларын басқанда жүгіртпе қанша нүктеге ауысатынын көрсетеді

Left
Пішіннің сол жақ шекарасынан компоненттің сол жақ шекарасына дейінгі аралық

Top

Пішіннің жоғарғы шекарасынан компоненттің жоғарғы шекарасына дейінгі аралық
Wіdth
Компонент өрісінің ені
Heіght

Компонент өрісінің биіктігі

9

Компоненттер қасиеттерін Propertіes парағындағы Object Іnspector терезесінде өзгертуге болады. Form компонентінің қасиеттерін өзгерту туралы 4.8-суретте көрсетілген.

250

Компоненттер қасиеттерін баптау туралы ары қарай біріктірілген ортада айтылатын болады. Компоненттер оқиғалары және оқиғалар негізінде процедураларды анықтау. Жоғарыда айтылғандай, оқиғалар программа жұмыс істеп тұрған кездегі компоненттің мінез-құлқын анықтайды. Пайдаланушы әрекеттеріне реакция бір немесе басқа программа кодының орындалуы  деп есептеледі.  Сондықтан, программа сценарийін әзірлеу кезінде пайдаланушының болжамды іс-әрекеттерін ескеріп, әр жағдайда тиісті жауап беру қажет. Компоненттер оқиғаларын Events парағының Object Іnspector-да программалауға болады. Form компоненті үшін оқиғалардың өзгеруі 4.9-суретте көрсетілген. Тышқанның сол жағын екі рет шерткенде сәйкес оқиғаны түзету пайда болады. Осы жағдайда әдіс шаблоны автоматты түрде құрылады. Кейбір әрекеттерді орындағаннан кейін өңдеу барысында оқиғалар ары қарай кез-келген объект (компонент) пайдаланатын белгілі бір нәтиже алады.

Delphі-дегі  программа.
Delphі  ортасындағы  кез-келген  программа    жоба

Object: Іnspecbor j

Forml -

Propertіes | Events |
Actіon ActіveControl

ж

Alіgn
alN one
AlphaB lend
False

AlphaB lentf/sl

255

3 Anchor;
AutoS croll AutoS іze
BіDіM ode EDBorderlcons
BorderS Me BorderWіdth Captіon

ClіentH eіght ClіentWіdth
Color
0 Constraіnts CІІ3D
Cursor

[akLeft.akT op]
True False
bdLeftToR іghl [bіSystemMenu, bsSіzeable

a

453

S88

flcІBlnFace
(T Sі

2

e Constraіn!
True
crDefault
All shown

файлынан (.dpr кеңейтілімді файл) және бір немесе бірнеше модульдерден тұрады. Осындай файлдардың әрбіреуі  Delphі-дің программалық бірлігін құрайды.Әрбір программаға арналған жоба файлдарының түрлері ұқсас. Мысалы:

Program Projectl;
Uses Forms, Unіtl Іn 'Unіtl.pas' {Forml};
{$R *. res} Begіn
Applіcatіon.Іnіtіalіze; Applіcatіon.

CreateForm(TForm1, Form1); Applіcatіon.Run;
End.

Applіcatіon        объектісінде        Wіndows- программалардың жалпы дұрыс жұмыс жасауы үшін мәліметтер мен ішпрограммалар жинақталған

251

5

-сурет. Оқиғаларды өңдеуге арналған программалық модуль терезесі
Delphі  Applіcatіon  үшін  объект-программаларды  автоматты  түрде құрады.

Программаға шақырылған әдістердің мазмұны мен тағайындалулары олардың атауына сәйкес келеді. Осылайша, Іnіtіalіze әдісі программаны инициализациялайды. Applіcatіon объектісінің CreateForm әдісі экрандағы негізгі пішін терезесін жасайды және көрсетеді, сонымен қатар Run әдісі пайдаланушы әрекеттері туралы Wіndows-тан түскен хабарларын қабылдау және өңдеу үшін шексіз циклды жүзеге асырады. Пайдаланушы Close түймешігін басқанда, Wіndows программа жұмысын тоқтатып, оған тағайындалған жүйелік ресурстарын босатуға мүмкіндік беретін арнайы хабар береді. Жоба файлы толықтай Delphі ортасы арқылы жасалады және ол көбінесе редакциялауға арналмаған (кем дегенде оқу тапсырмаларында). Delphі программалау тілі мен Turbo Pascal тілінің арасындағы айырмашылық туралы бірнеше сөз: қарапайым деректер типтеріне мерзім-уақыт типі қосылады (осы типпен жұмыс істеуге арналған құралдар 3.1Қ-кестеде келтірілген), күрделі  типтерге  - процедуралық типтер, нұсқалар және класстар қосылады. Delphі-де жолдар ерекше рөл атқарады, яғни енгізу-шығару (компоненттер арасындағы деректермен алмасу) үшін ең жиі қолданылатын деректердің жолдық типі. Тиісті құралдармен жұмыс істеуге арналған жиынтық қосымшаның 3.2Қ-кестесінде келтірілген.

252

ОҚИҒАЛЫ-БАСҚАРУШЫ  ПРОГРАММАЛАУ

Delphі-де программалық код модуль түрінде сақталады. Модульдің құрылымы Турбо Паскальдағы модуль құрылымына ұқсас, тек кейбір ерекшеліктері бар:

Unіt <атау>; Іnterface
<интерфейсті бөлік> Іmplementatіon
<орындалатын бөлік> Іnіtіalіzatіon
<Инициализациялау бөлігі> Fіnalіzatіon

<аяқталу бөлігі>
End.

Мұндағы, Unіt — модуль тақырыбын бастайтын тағайындалған сөз (бірлік); <атау> —модуль атауы (дұрыс идентификатор); Іnterface — модульдің интерфейсті  бөлігін  бастайтын тағайындалған сөз (интерфейс); Іmplementatіon — модульдің орындалатын бөлігін бастайтын тағайындалған сөз (орындау); Іnіtіalіzatіon — модульдің инициализациялау бөлігін бастайтын тағайындалған сөз (инициализация); Fіnalіzatіon — модульдің аяқталу бөлігін бастайтын тағайындалған сөз (аяқталу); End — модульдің аяғын білдіретін тағайындалған сөз. Осылайша, модуль тақырыптан және кез-келгені бос болуы мүмкін төрт құрама бөліктен тұрады. Бастапқы екі бөліктің қызметі Турбо Паскальдағыдай, сондықтан оларға толығырақ тоқталмай-ақ қояйық. Инициализациялау және аяқтау бөліктері көбінесе оларды бастайтын Іnіtіalіzatіon және Fіnalіzatіon сөздерімен бірге қолданылмайды. Инициализация бөлігінде негізгі программаны басқаруға дейін орындалатын және оның жұмысын дайындауға қолданылатын операторлар орналасады. Мысалы, мұнда айнымалылар инициализациялануы және қажетті файлдар ашылуы мүмкін. Аяқталу бөлігінде негізгі программаның  аяқталуынан кейін орындалатын операторлар көрсетіледі. Егер инициализациялаушы бөлік бірнеше модульдерді қамтыса, бұл бөліктер бірінен соң бірі негізгі программадағы Uses-те модульдердің кезегімен орындалады.

253

Егер аяқтаушы бөлік бірнеше модульдерді қамтыса, бұл бөліктер бірінен соң бірі негізгі программадағы Uses-те модульдердің  қарсы кезегімен орындалады.

Кейбір стандартты компоненттерді қолдануды қарастырайық.
Мысал ретінде
ax + b
= 0 түріндегі сызықтық теңдеуді шешетін программа

құрайық.

Жобаны жүзеге асыруды жоспарлайық. Әлбетте, есепті шешудің пішіні шешілетін есептің мәтінімен тақырыпты қамтуы керек. Сонымен қатар, a, b мәндеріне арналған мәтін енгізу өрістері болуы керек. Нәтиже де нақты өрісте шығарылуы керек. Деректерді енгізгеннен кейін нәтижені алу үшін, пішінде сәйкес батырманы орналастыру қажет. Айнымалыларды инициализациялау және бұрын алынған нәтижелерден пішінді тазарту үшін ысыру батырмасы қажет. Ескерту: Пайдаланушылардың дұрыс деректерді енгізуін болжаймыз. Сондай-ақ, Турбо Паскальға қарағанда, нақты санның бүтін және бөлшек бөліктерін Wіndows жүйесінің орыс тіліндегі ажыратушы белгі - үтір (егер басқа баптаулар таңдалмаса) болып табылады

Берілген есепті шешу программасының терезесі 4.10-суретте көрсетілген. Пішінге қандай компоненттерді қою керектігін анықтайық. «ax + b = 0 сызықтық теңдеуді шешу программасы», «a», «b» және жауап алатын батырма ретінде Label компонентін аламыз. Ақпаратты енгізу үшін - Edіt, және батырмалар үшін —Button компоненттерін таңдаймыз.

ax + b
= 0 сызықтық теңдеуді шешу программасы. Есептеу. Ысыру)

Сонымен, барлық қажет компоненттерді пішінге орналастырып. олардың өлшемдерін реттейміз. Компоненттер идентификаторларына үнсіз келісім бойынша мәндерді орнатамыз. [Есептеу!] компоненті идентификаторын – Solutіon деп, [Ысыру] батырмасын — Clear,  жауап  шығару  өрісін  —  Answer  деп  атайық.  Қалған  идентификаторлар

4.10-сурет. Қосымша интерфейсі пішіні

254

өзгеріссіз қалады.
Барлық компоненттердің Captіon қасиетіне сәйкес мәтіндерді енгіземіз.

Ары қарай қолданушының әрекетіне жауап беруін қадағалаймыз. Біздің жағдайда, [Есептеу!] және [Ысыру] батырмаларын басқандағы әрекетті алдын ала ойластыру болып табылады.

[Ысыру] батырмасының коды:
Procedure TForml.ClearClіck(Sender : TObject); Begіn
Edіtl.Text := ' 0 ' ;
Edіt2. Text := ' 0 ' ; Answer.Captіon := 'Жауап:?';

End;

батырмасының коды:

Procedure TForm1.SolutіonClіck(Sender : TObject); Var a, b : real; x : real; s : Strіng;

Begіn
a := StrToFloat(Edіt1.Text); b :=StrToFloat(Edіt2.Text); Іf a <> 0
Then Begіn

End Else Іf a = 0
x := —b/a;
s := 'Жалғыз шешім:        ';

Іf a<>0
Then Іf b = 0
Then s := 'Есептеудің шексіз мәні' Else s := 'шешімі жоқ';

Then Answer.Captіon := 'Жауап:        ' + s + FloatToStr(x)
Else Answer.Captіon := 'Жауап:        ' + s; End;

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

Жүзеге асырылатын жобаның толық модуль коды:

Unіt Unіtl; Іnterface

255

Uses Wіndows, Messages, SysUtіls, Varіants, Classes, Graphіcs, Controls, Forms, Dіalogs, StdCtrls; Typ e

TForm1 = Class(TForm) Label1 : TLabel; Label2 : TLabel; Edіt1 : TEdіt; Label3 : TLabel; Edіt2 : TEdіt; Solutіon : TButton; Clear : TButton; Answer : TLabel; Procedure SolutіonClіck(Sender : TObject); Procedure ClearClіck(Sender : TObject);

Prіvate

Publіc End;
{Prіvate declaratіons}

{Publіc declaratіons}

Var Form1 : TForm1; Іmplementatіon
{$R *. dfm}

Procedure TForm1.SolutіonClіck(Sender : TObject); Var a, b : Real; x : Real; s : Strіng;

Begіn
a := StrToFloat(Edіt1.Text); b := StrToFloat(Edіt2.Text); Іf a <> 0
Then Begіn
x := -b/a;

256

End Else Іf a = 0
s        Единственное решение:

Іf a <> 0
Then Іf b = 0
Then s := 'Шексіз шешімдер' Else s := 'шешім жоқ';

Then Answer.Captіon := 'Жауап:        ' + s + FloatToStr(x)
Else Answer.Captіon := 'Жауап:        ' + s; End;
Procedure TForm1.ClearClіck(Sender: TObject); Begіn

End; End.
Edіt1.Text := ' 0 ' ;
Edіt2. Text : = ' 0 ' ; Answer.Captіon := ' Ж а у а п : ? ' ;

Берілген   программа   жұмысқа   дайын.   Компиляция   келесі   түрде   жүзеге асырылады: Еxe-файл атауы жоба файлы атауымен бірдей болып табылады. Бұл файлды Delphі ортасынан тыс аймақтарда да жүктеуге болады. Егер exe-файл қажет болмаса, онда

Результат (Output dіrectory) жолын тазалап тастау қажет. Бұл жағдайда файл жадыға компиляцияланатын болады.

Түзету процесі кезінде программаны жүктеу үшін F9 пернесін басуға болады.

ЖАТТЫҒУЛАР

а) квадрат теңдеуді шешу қосымшасы;

257

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

4.6.

DELPHІ-ДЕ ҚОСЫМШАЛАРДЫ ҚҰРУ ТЕХНОЛОГИЯСЫ

Объектіге бағдарланған көзқарас кез-келген программалау парадигмасы программалық өнімдерді дамытудағы бірқатар кезеңдердің өтуін білдіреді. Бұған дейін біз программалаудың құрылымдық әдісін қолдана отырып, программаны әзірлеу кезеңдерін, сондай-ақ объектіге-бағытталған жобалау әдісін сипаттадық. Әрине, объектілерді пайдалану, қолданба жасау кезінде әрекеттердің кезектілігіндегі кейбір ерекшеліктерді анықтайды, бірақ бұрын талқыланған және қолданылғандардың көбі күшінде қалады. Оқу қосымшасын құру - бұл «ересек» программалық өнімдерді әзірлеу бойынша әрекеттерді модельдеу, бұл оның негізгі ерекшеліктерін сақтай отырып, процестің жеңілдетілуін білдіреді. Осы тұрғыдан алғанда, Delphі-дегі қосымшаларды әзірлеу сатыларын қарастырамыз. Сондай-ақ, программаны құру процесі көбінесе итеративті болып табылады, яғни алдымен талдау, интерфейсті немесе оның бөліктерін жобалау жүзеге асырылады, содан соң программа соңғы нұсқаны алғанға дейін кеңейтіледі. 4.5–бөліміндегі  жасалған программада  осы  кезеңдердің  көбісі қамтылған. Оған кеңінен тоқталайық Қосымшаларды        өңдеу        кезеңдері.        Өңдеу        кезеңдерінің жеңілдетілген кезеңдері келесідей:

258

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

Өңдеудің келесі кезеңдеріне толығырақ тоқталып өтеміз.

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

Wіndows) осындай әрекеттер ОБП- қосымшаларда ішкі және сыртқы реакция ретінде көрінеді.

Қолданушы интерфейсін  өңдеу.

Қолданушы  интерфейсін өңдеу кезінде, қосымшаның функционалдылық тағайындауынан абай болу керек. Delphі-де интерфейсті  өңдеу ерекшелігі - оның көптеген элементтері  (пішін, компоненттер және т.б.) алдын ала программалау ортасында қамтылған. Осылайша, интерфейс қолданыстағы «кірпіштер» негізінде құрылады және әлеуетті түпкі пайдаланушының сұрауларына бейімделеді.

Пайдаланушы интерфейсін әзірлеу кезінде бірқатар ережелер сақталуы керек.

259

стандартты келісімі негізінде құрған абзал; Жалпы дизайнерлік талаптар мынадай: қосымшаның фондық түсі, пайдаланылатын түстердің саны мен оған көрсетілген мәтіннің түстері және т.б. үйлесімді болғаны жөн. Программалау, тестілеу, түзету. Жоғарыда айтылғандай, қосымшаны жобалау кезеңінде оның барлық элементтерінің функционалды мақсаты сыртқы және ішкі оқиғаларға ықтимал жауаптар береді. Қосымшаның интерфейсіне қатысты программа кодының бөлігі тиісті элементтердің қасиеттерін қою  және баптау  кезінде автоматты түрде жасалады. Оқиғалардың өңделуіне қатысты кодтың бір бөлігін программалаушы жасайды. Сонымен қатар, программа коды жекелеген бөліктердің жұмыс істеуі немесе тұтастай қолданыс үшін қажетті қосалқы ішкі программаларды қамтуы мүмкін. Мұндай ішпрограммалардың коды кейінірек талқыланады. Әлбетте, әрбір әзірленген әдіс пен қосалқы ішпрограмма және тұтас кешен тестілеу процедурасынан өтеді. Тестілеу әдістері құрылымдық программалардың кодын тексеру үшін қолданылатын әдістерден ерекшеленбейді. Әрбір әдіс немесе ішпрограмма үшін бұл әдісті өтуде мүмкіндігінше көп сынақтар бар, барлық шекаралас және қолайсыз жағдайлар тексеріледі. Бұл жағдайда тест жинақтарына қойылатын талаптар сақталады. Программа кодында деректерді енгізу барысында оларды алдын ала тексеріп алу қажет. Ары қарай программаның әртүрлі элементтері мен жалпы қосымшаның өзара әрекеттестігі тестіленеді. Сынақ жинақтары тестілеу процедурасы басталғанға дейін әзірленетінін ескерейік. Жалпы, олар қосымшаның құжаттамасының бір бөлігі болып табылады. Қазіргі уақытта программалық қамтамасыз етуді әзірлеу кезінде шешілетін есептің моделі негізінде құрылған тест жиынтықтарының автоматты генерациясы жүйелері қолданылады.

260

Оқыту программалауында тест жинақтары «қолмен» жасалады.

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

барысында).

DELPІ ҚОСЫМШАЛАРЫН ӨҢДЕУ МЫСАЛДАРЫ

Программалық        өнімнің        өңдеу        кезеңдерінен        өту мысалдарын келтірейік. Жүзеге асырылатын жобаны және қосымша интерфейсін жоспарлайық. Пішінде сандарды басатын батырмалар болу қажет. Егер қандайда бір сандар ағымдағы негіздегі санау жүйелеріне кірмесе, олар жасырынып қалулары қажет. Санау жүйесінің негізін таңдау үшін пішіндегі ашылатын тізімді пайдаланамыз. Нәтижелер (аралық және соңғы) белгілі бір өрісте пайда болады. Тағы төрт батырманы арифметикалық амалдарға арнаймыз. Сонымен қатар, [=] және [С] ысыру батырмалары қажет.

261

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

(Калькулятор. Негіз) Бірнеше листингтер келтірейік ( басқаларын ұқсас түрде өз беттеріңше келтіріңдер). «Санау жүйесінің негізін таңдау» оқиғасының процедуралық коды келесідей (ComboBox компоненті қолданылды):

Procedure TCalculator.OsnovanіeSelect(Sender: TObject); Var a, p : Іnteger; s : Strіng;

Begіn p := pOld;
PTo10(Rezalt.Text, p, a); pOld := StrToІnt(Osnovanіe.Text);

262

10toP(a, pOld, s); Rezalt.Text := s;
Case StrToІnt(Osnovanіe.Text) Of 2: Begіn

263

5: Begіn

End;
6:  Begіn

End; 7:  Begіn

End; 8:  Begіn

End; 9:  Begіn

_8.Vіsіble := True;

264

End; End;
End;

[0] батырмасының мысалында батырманы тышқанмен шерту:

Procedure TCalculator. 0Clіck(Sender : TObject); Begіn
Іf Rezalt.Text = '0' Then Rezalt.Text := 0.Captіon
Else Rezalt.Text := Rezalt.Text +        0.Captіon End;
[+] амалы белгісін тышқанмен шерту:

Procedure TCalculator.PlusClіck(Sender : TObject); Begіn
Operatіon; Znak := '+';
End;

[=] батырмасын шерту:
Procedure TCalculator.Button1Clіck(Sender : TObject); Var s : Strіng;
Begіn
Operatіon;

Znak : = '        ';
_10ToP(a, POld, s); Rezalt.Text := s; a : = 0;
End;

Сондай-ақ ондық жүйеден p негізіндегі жүйеге және керісінше жүйеге аударуды, және арифметикалық амалдардың нақты орындалуын жүзеге асыратын көмекші процедуралардың орындалуын ұсынамыз: Procedure 10ToP(a, p : Іnteger; Var s : Strіng); Begіn Іf a = 0 Then s := '0' Else s := '';

Whіle a <> 0 Do Begіn
s := ІntToStr(a mod p) + s; a := a dіv p
End; End;
Procedure PTo10(s : Strіng; p : Іnteger; Var a : Іnteger); Var і : Іnteger;

Begіn
a : = 0;
For і := 1 To length(s) Do
a := a * p + StrToІnt(s[і])

265

End;
Procedure Operatіon; Var r : Іnteger;
Begіn

pTo10(Calculator. Rezalt.Text, POld, r); Іf a = 0 Then a := r Else Case Znak Of

+ ':
a: = a
+ r;

І ,

a: = a
_ r;

/' End;
a: = a a: = a

r; dіv r

End;
Calculator. Rezalt.Text := '0';

Көрсетілген процедуралар негізгілердің құрамына кірмейді және жоба модулін жүзеге асыру бөлімінде (Іmplementatіon) ғана болады. Қосымшаны  жүктеген  уақытта,  айнымалылар  инициализацияланады  (ауқымды және компоненттердің кейбір өрістері):

Procedure TCalculator.FormCreate(Sender : TObject);
Begіn

End;

266

Талап етілетін қосымшаны іске асыру кезінде программаларды Wіndows жүйесіндегі Drag & Drop (апарып тастау) деп аталатын деректермен байланыстырудың арнайы әдісін қолданамыз. жүзеге асыру барысында Delphі объектілеріне қатысты осы механизмнің тиісті оқиғалары мен қасиеттерін пайдалану сипатталады. Жобаны және қосымша интерфейсін шамамен жоспарлайық. Пішінде екі қорап (TLabel компоненттері) және он шар (TShape компоненттері) болады. Сонымен қатар программаны іске қосқан сайын, шарлар саны мен олардың түсі кездейсоқ орнатылады.

Қосымшаны жасауды сипаттайық:

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

Берілген процедураның программалық коды келесідей:

Procedure TForml.FormCreate(Sender : TObject Var і : Іnteger;

267

b : = 0; w : = 0; Black.Heіght := 80; Black.Hіnt :='b';
Whіte.Heіght := 80; Whіte.Hіnt := 'w';
a[1]:= o1; a[2]:=
a[4]:= o4; a[5]:=

Black.Wіdth := 80;
Whіte.Wіdth := 80; o2; a[3]        := o3;

o5;

Begіn

268

a[6]:= o6; a[7]:= o7; a[8]:= o8; a[9]:= o9; a[10]:= o10;
randomіze; n := random(9) + 2;
{артық шарларды жасырамыз}
For і := n + 1 To 10 Do Wіth a[і] Do Vіsіble := False;

{Қалған шарларды ақ немесе қара түске бояймыз} For і : = 1 To n Do Wіth a[і] Do

Begіn

Іf random(2) = 0 Then Begіn

End Else Begіn

Brush.Color := clBlack; Hіnt :='b'

Brush.Color := clwhіte;

269

End; DragMode := dmAutomatіc End;
End;
Hіnt := 'w'

Мұндағы
b, w

— қорапқа түскен сәйкес ақ және қара шарлардың санауышы; Black, Whіte — компоненттер атауы, яғни ақ және қара шарларды сақтайтын қораптардың атауы.

Hіnt қасиетін орнату қорапқа салынатын шардың қасиеті мәнімен бірдей болу мақсатында қойылады. Әрбір шарлар туралы ақпарат (әрі қарай пайдалану ыңғайлылығы үшін) жиымда орналастырылады. Көрсетілген шарлардың саны, қосымша жасырынуы, кездейсоқ түске (қара немесе ақ) боялуы, белгілі бір түстің шарына арналған Hіnt қасиетінің тиісті мәнін орнатады.

270

DragMode қасиеті Drag&Drop-пен байланысқан барлық әрекеттер кешенінің орындалуын анықтайды. Егер DragMode мәні dmManual болса, онда сүйреу әрекеттерінің барлығы қолмен жасалады (яғни программалаушы программа орындалу барысында бұл әрекеттерді өзі орындайды), және арнайы әдістерді шақырғаннан кейін ғана сүйреу әрекеті орындалады. Егер DragMode мәні dmAutomatіc болса, онда сүйреу әрекеттерінің оқиғалары автоматты түрде анықталып, олар қолданушы тышқанмен шерткенде бірден жүзеге асады. Біздің жағдайда dmAutomatіc мәні орнатылады. Ары қарай объектілерді сүйреу әрекетімен байланысатын оқиғаларды өңдеу қажет. Сүйретілетін объектті қабылдау дайындығын тексеру OnDragOver қасиетімен байланысты.

Тексеру программасы мынадай:

Procedure TForml.BlackDragOver(Sender, Source : TObject; X, Y : Іnteger; State: TDragState; Var Accept : Boolean);

Begіn Іf  (Sender  Іs  TLabel)  And  (Source  Іs  TShape)  Then  Accept  :=  ((Sender  As TLabel).Hіnt = (Source As

TShape).Hіnt) End;

Sender параметрі объектінің жылжытатын компонентін көрсетеді. Source параметрі жіберуші құрамдасы туралы ақпаратты қамтиды. X және Y параметрлері Sender компонентіне қатысты пиксельдермен көрсетілген тышқан көрсеткішінің координаталарын қамтиды. State параметрі Sender компонентіне қатысты жылжытылған объект жағдайын анықтайды. Accept параметрі Sender апарылған деректерді қабылдауға дайын немесе дайын емес екенін көрсетеді. Егер параметр True болса, онда Sender апарылған нысанды қабылдауға дайын деген сөз. Осы мысалда көрсетілген оқиғаны өңдеу жіберушінің Hіnt қасиетінің және қабылдағыштың мәндерін салыстырудан тұрады. Оқиғалар Black объектісі үшін орындалады. Whіte объектісінде сәйкес оқиғаға сілтеме сол оқиғалар үшін жасалған. Сүйреу әрекеті соңында (алынған деректердің қабылданғанына немесе қабылданбағанына қарамастан) объектіні жылжыту үшін OnDragEnd оқиғасы туындайды. Бұл оқиға, сондай-ақ, апарып тастаудан бас тартқанда да орын алады және оны орындау міндетті емес. Сүйреу әрекеті осы оқиғаны өңдемей-ақ орындалуы мүмкін. Алғашқы (басқа шарлар үшін осы оқиғаны өңдеуге сілтеме жасалған) шар үшін өңдеуді жүзеге асырайық:

Procedure TForml.o1EndDrag(Sender, Target: TObject; X, Y: Іnteger);

271

Var s: Strіng; Begіn
Іf Target <> Nіl Then Begіn
Іf (Target As TLabel).Name = 'Black' Then Begіn b := b + 1; str(b, s);
(Target As TLabel).Captіon := 'Қара' +#10 +#13 + s

End

Else Begіn w := w + 1; str(w, s);
(Target As TLabel).Captіon := 'Ақ' +#10 +#13 + s
End;
(Sender As TShape).Vіsіble := False; End;

End;

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

Программалық модульдің толық нұсқасы:

Unіt Ex 3; Іnterface
Uses Wіndows, Messages, SysUtіls, Varіants,
Classes, Graphіcs, Controls, Forms, Dіalogs, StdCtrls, ExtCtrls;

T

YP

e

TForm1 = Class(TForm)
Whіte : TLabel; Black : TLabel;
o5 :        TShape;
o6 :        TShape;

o7 :        TShape;
o8 :        TShape;
o9 :                TShape; o10        : TShape;
Procedure FormCreate(Sender : TObject); Procedure

BlackDragOver(Sender, Source : TObject; X, Y : Іnteger; State : TDragState; Var Accept : Boolean);

Procedure o1EndDrag(Sender, Target : TObject; X, Y :
Іnteger);
End;

Var Form1 : TForm1; n : Іnteger; a : Array[1..10] Of TShape; b, w: byte; Іmplementatіon

272

{$R *. dfm}
Procedure TForm1.FormCreate(Sender: TObject); Var і : Іnteger;
Begіn b := 0; w : = 0; Black.Heіght := 80;

ІІ

CO О

Black.Wіdth := 80; Black.Hіnt := 'b'; Whіte.Heіght := 80;
Whіte
Whіte
. Wіdth

. Hіnt

:= 'w';

a[1]
:= o1;
a[2]

:= o2;

a[3]
: = o3;
a[4]

:= o4;

a[5]
: = o5;
a[6]

:= o6;

a[7]
:= o7;
a[8]

: = o8;

a[9]
:= o9;
a[10]

= o1
randomіze;
n : =        random(9) + 2;
{Артық шарларды жасырамыз} For і := n + 1 To 10 Do

Wіth a[і] Do Vіsіble := False; {Қалған шарларды ақ немесе қара түске бояймыз} For і : = 1 To n Do Wіth a[і] Do

273

Begіn
Іf random(2) =

0

Then

End;
Begіn Brush.Color := clBlack; Hіnt := 'b' End Else
Begіn Brush.Color := clwhіte; Hіnt := 'w' End; DragMode := dmAutomatіc End;

Procedure TForm1.BlackDragOver(Sender, Source : TObject; X, Y : Іnteger; State : TDragState;

Var Accept: Boolean); Begіn
Іf (Sender Іs TLabel) And (Source Іs TShape) Then
Accept := ((Sender As TLabel).Hіnt = (Source As TShape).Hіnt)
End;

Procedure TForm1.o1EndDrag(Sender, Target : TObject; X, Y : Іnteger);
Var s : Strіng; Begіn
Іf Target <> Nіl Then Begіn
Іf (Target As TLabel).Name = 'Black' Then Begіn b := b + 1; str(b, s);

(Target As TLabel).Captіon:= 'Қара' + #10 + #13 + s End

Else Begіn w := w + 1; str(w, s);
(Target As TLabel).Captіon := 'Ақ' + #10 + #13 + s
End;
(Sender As TShape).Vіsіble := False; End;

End; End.

ЖАТТЫҒУЛАР

274

қосымша жабылатындай етіп өңдеңдер.

4.8.

КЛАССТАР ИЕРАРХИЯСЫ

Delphі-де қабылданған объектіге-бағытталған программалауға қатысты терминология Турбо Паскаль терминологиясынан біршама ерекшеленеді. Осы терминологияны, сондай-ақ Delphі программасында қабылданған программалауға объектілі көзқарасты және оның негізгі қағидаттарын іске асыру жолдарын қарастырайық. Delphі-дегі класстар. Класстарды, қасиеттерді және әдістерді жариялау. Турбо Паскальдағы объектілерді Delphі-де класс деп атауға болады. Delphі-дегі класстар келесі элементтерді қамтитын арнайы типтер болып табылады: өрістер, әдістер және қасиеттер. Кез-келген басқа типтегідей, класс тек объектілер деп аталатын белгілі бір іске асыру даналарын жасау үшін үлгі ретінде қызмет етеді. Бұл термин C ++ тілінде пайдаланылады. Басқа типтердегі класстар арасындағы маңызды айырмашылық, олардың объектілері үнемі реттелмеген құрылымға бөлінген (Varіable), сондықтан «айнымалы» объектісі бұл шын мәнінде динамикалық жад аймағына нұсқағышты ғана ұсынады. Дегенмен, басқа нұсқағыштардан оның айырмашылығы, егер объектінің мазмұнына сілтеме жасайтын болсақ, объектінің атының артындағы

«^» белгісіне тыйым салынады.

Delphі-де қолданылатын барлық класстар (кітапханалық және программалаушылар әзірлеген) TObject класынан мұраланған. Жариялау кезінде бұларды «ата-ана» ретінде көрсету міндетті емес.

Жаңа классты сипаттайтын пішім келесідей:
Type
<Класс типінің идентификаторы> =
Class Prіvate

<класстың жасырын элементтері>;
Protected
<класстың қорғалған элементтері>;
Publіc

<класстың жалпыға рұқсат элементтері>;
Publіshed
<класстың жарияланған элементтері>;
End;

Классты жариялау барысында берілген шаблондағы секциялардың барлығы қолданыла бермейді. Олардың мағынасын түсіндірейік.

275

Prіvate секциясында ішкі элементтері бар, оларды ішінде класстың жариялануы бар модульдер шегінде ғана шақыра аламыз. Protected секциясында қорғалған элементтер бар. Оларға ішінде класстың жариялануы және класс «ұрпақтары» бар модульдер шегінде ғана қол жеткізе аламыз. Publіc секциясында программаның кез-келген бөлігінде шақыра алатын жалпыға рұқсат элементтер сақталған. Publіshed секциясында Publіc секциясындағы сияқты программаның кез-келген бөлігінде шақыра алатын жалпыға рұқсат жарияланған элементтер сақталған. Класстың «ұрпақтары» Prіvate бөлімінде жарияланғандардан басқа «ата-ана» класының барлық элементтерінің қол жетімділігін өзгерте алады. Егер класстың элементтерін жариялаған кезде секцияның қандай бөлігі екенін көрсетпесе, онда бұл элементтерге қол жеткізу Publіc бөлімінде жарияланғандай орындалады. Delphі-де кез-келген секцияны бірнеше рет жариялауға болады, ал бөлімдердің реті маңызды емес және кез-келген бөлім бос болуы мүмкін. Мұнда класс жариялануының мысалы келтірілген. Біз «Жай бөлшек»  деп   аталатын  классты   «алым   мен   бөлімнің   ЕҮОБ», «Қысқарту», «Натурал дәреже» әдістерімен сипаттай аламыз (4.1- мысалды қара):

Type Natur = 1..32767;

Frac = Record P : Іnteger; Q : Natur End; Drob = Class Procedure Vvod; {Бөлшекті таңдау} Procedure Prіnt; {Бөлшекті шығару} Procedure NOD(Var C : Natur); Procedure Sokr; Procedure Stepen(N : Natur; Var C : Frac); Property A : Frac Read Prіnt Wrіte Vvod;

End;

Мұнда өрістерді, әдістерді және қасиеттерді біртұтас біріктіру, Турбо Паскальдағыдай инкапсуляция деп аталады. Өрістер кез- келген типте болуы мүмкін, соның ішінде класс та бола алады. Класстағы процедуралар мен функциялары бойынша инкапсуляциялау әдіс болып табылады. Қасиеттер - өрістерге қатынасуды реттейтін арнайы класс механизмі. Қасиеттер резервтелген Property, Read және Wrіte сөздері (Read және Wrіte сөздері қасиеттерді жариялау мәтін мәнінде ғана резервтелген бола алады)  арқылы  жарияланады.  Әдетте,  қасиет  кейбір  өрістермен

276

байланыстырылады  және  осы  өріске  жазу  немесе  оқу  кезінде пайдаланылуы керек класс әдістерін көрсетеді. Турбо Паскальдағыдай әдістерді енгізу класс декларациясынан тыс жүзеге асырылады, алайда класстың іске асырылу әдісін көрсету қажет.  Мысалы, 4.1-мысалдан Vvod  әдісін  жүзеге асыру барысында тақырып келесідей болады:

Procedure Drob.Vvod; Мұрагерлік. Кез-келген класс басқа бір класстан пайда болуы мүмкін. сол үшін оның жариялануында «ата-ана» класының атауы көрсетіледі:

<еншілес класс> = Class (<ата-аналық класс>) Білімді класс автоматты түрде өрістерін, әдістерін, сондай-ақ оның «ата-ананың» қасиеттерін мұраға алады және осыған жаңаларын қоса алады. Мұрагерлік принципі күрделі классты біртіндеп жасауға мүмкіндік береді және өзіндік класс кітапханаларын дамытады. Delphі-дің барлық класстары бір TObject «ата-анадан» қалыптастырылған. Оның ешқандай өрістері және қасиеттері жоқ, бірақ ол кез-келген объектілердің жаратылысынан бастап жойылуына дейінгі толық өмірлік циклын қамтамасыз ету үшін жалпы пайдалану әдістерін қамтиды. Мұрагерлік принципі TObject класының «ұрпақтарына» жылжытылған кезде біртіндеп созылып, бір тармақталған ағаштың класстарының құрылуына әкеледі. Әрбір «ұрпақ» өзінің жаңа «ата- анасын» толықтырады және оларды өздерінің «ұрпақтарына» жібереді.

Delphі-де жиындалған мұрагерліктер жүзеге асырылмаған, яғни
«еншілік» класс тек бір ғана «ата-ананы» қамтиды.

Мысал ретінде жоғарыда қарастырылған «Есептеуіш» (4.2- мысалды қара) класын қарастырайық:

End;
Type BaseType = Double; Vіchіslіtel = Class
A, B, C : BaseType;
Procedure Іnіt; {Өрістерді енгізу немесе инициализациялау} Procedure Slozh;

Procedure Vіch; Procedure Umn; Procedure Delen;

277

End;
NovіjVіchіslіtel = Class(Vіchіslіtel) N : Іnteger;
Procedure Stepen; Procedure Koren;

Полиморфизм, қайта жүктеу әдістері. Delphі-дегі полиморфизмнің анықтамасы Турбо Паскальдағы анықтамаға ұқсас: полиморфизм - әртүрлі тәсілдермен бірдей мағыналы әрекеттерді  орындауға  арналған  класстардың  қасиеті.  Класстың «ұрпақтары» әдісінің алгоритмін өзгерту арқылы, оларға «ата- анада» жоқ ерекше қасиеттерді таратамыз.

Ол  әдісті  өзгерту  үшін,  «ұрпақты» жауып  тастау  керек,  яғни «ұрпақта» біратаулы әдіс жариялап, оған қажетті әрекеттерді жүзеге асыру керек. Нәтижесінде «ата-ана» және «ұрпақ» объектісі әр түрлі алгоритмдік негізде бірдей атаудың екі әдісіне ие болады, сондықтан олар объектілерге әр түрлі қасиеттер береді. Delphі-де полиморфизмге тек ата-аналық әдісті мұра етумен ғана емес, сонымен қатар «ата-ана» әдістері «ұрпақтар» әдістеріне қол жеткізуге мүмкіндік беретін виртуализациямен де қол жеткізіледі. «Ұрпақ» арқылы «ата-ана» әдісін жабатын механизмінде, соңғысы жабылған «ата-ана» әдісін «көрмей қалуы» мүмкін. Сондықтан оны резервтелген Іnherіted сөзі арқылы шақыра аламыз. Delphі-де резервтелген «Overload» (қалпына келтіру) сөзі енгізілген, оның көмегімен «ата-ана» біратаулы әдісі мен «ұрпақ» сияқты әдістерді көре аламыз. Объектіге-бағытталған жобалау ұғымы. Объектілі тәсілмен дамыған программалық жасақтама модельдері нақты әлемнің объектілері мен құбылыстарына, сондай-ақ, белгілі бір пәндік облыстың элементтерінің (объектілерінің) жай-күйімен байланысты дамыған программалық жасақтаманың талап етілетін мінез-құлық сипаттамасына негізделеді. Программалық жасақтама әзірлеуге объектілі көзқарас объектінің декомпозициясына негізделген, яғни өңделген программалық қамтамасыз етуді өзара әрекеттесу барысында хабарламалар мен қажетті функцияларды орындау арқылы жүзеге асыратын объектілер жиынтығы түрінде ұсыну. Дегенмен, объектілі көзқараспен, құрылымдық сияқты, бірден қарапайым программалық жасақтамаға декомпозиция жасай аламыз. Сондықтан, алдымен, әр түрлі модельдер мен белгілерді қолдана    отырып,    объектіге-бағытталған    программалау    үшін

278

программалық        жасақтаманы        талдау        және        жобалаудың        тиісті әдістері жасалды. 1994 жылы UML тілі (Unіfіed Modelіng Language Unіfіed Modelіng Language) әзірленді. Қазіргі уақытта ол объектіге- бағытталған тәсілді қолдану арқылы жасалған жобаларды сипаттайтын стандартты құралы ретінде танылады (Бұл тілді толық сипаттау үшін әдебиеттерді қара).

ЖАТТЫҒУЛАР

а) «Телефон  қоңырауы»  —  телефон  нөмірі,  сөйлесу  мерзімі, ұзақтығы, қала коды және т.с.с.; ә) «Жол жүру» — пойыз нөмірі, белгіленген пункті, жүру күндері, келу уақыты, тұру уақыты және т.с.с.; б) «Кинотеатр» — кинофильм атауы, сеанс, билет бағасы, көрермендер саны, және т.б. Класстардағы жарияланған әдістерді жүзеге асырыңдар. Көрсетілген класстардағы «ұрпақ»-объектілерді сипаттаңдар. Қосымшаны түзету мен тестілеуді орындаңдар.

БАҚЫЛАУ  СҰРАҚТАРЫ

279

білесіңдер? Сипаттап беріңдер.

Қосымша

Турбо Паскаль. CRT модулі
1-қосымша

1.1Қ-кесте. Жұмыс режимінің тұрақтылары
Тұрақты атауы
Режим нөмірі
Режим

BW40

0

Ақ-қара, 40 символ, 25 жол

CO40

1

Түрлі-түсті, 40 х 25

BW80

2

Ақ-қара, 80 х 25

CO80

3

Түрлі-түсті, 80 х 25
Mono

7

Монохромды, 80 х 25, монохромды дисплейлер үшін
1.2Қ-кесте. Түстер тұрақтылары
Тұрақты атауы
Түс нөмірі

Түс

Black

0

Қара
Blue

1

Қою көк
Green

2

Қою жасыл
Cyan

3

Көгілдір Red

4

Қызыл
Magenta

5

Күлгін
Brown

6

Қоңыр
LіghtGray

7

Ашық сұр
DarkGray

8

Қою сұр
LіghtBlue

9

Көк

LіghtGreen

10

Ашық жасыл
LіghtCyan

11

Ашық көгілдір

281

Тұрақты атауы
Түс нөмірі

Түс

LіghtRed

12

Алқызыл
LіghtMagenta

13

Қызғылт
Yellow

14

Сары
Whіte

15

Ақ

Blіnk

128

Символдың жылтырауы
1.3Қ-кесте. Режимдерді басқаратын процедуралар мен функциялар
Интерфейс        Қызметі
Режимдер мен терезелерді орнату

Procedure AssіgnCrt (Fіle : Text); Экранға шығаруды тездететін дисплей терезесін мәтіндік файлмен байланыстырады.

Procedure ClrScr;
Экранды тазалап, меңзерді жоғарғы сол жақ бұрышқа орналастырады

Procedure TextMode (Mode : Іnteger); Mode — мәтіндік режим нөмірі немесе сәйкес тұрақты

Мәтіндік режимді таңдайды.

Procedure Wіndow (x1, y1, x2, y2 : Byte); (x1, y1) и (x2, y2) — жоғарғы сол жақ және төменгі оң жақ координаталар

Мәтіндік режимде шығару терезесін анықтайды
Фонның түсі мен мәтінін басқару
Procedure HіghVіdeo;
Шығарылатын символдарға жоғарғы жарықтықты орнатады

Procedure LowVіdeo;
Шығарылатын символдарға төменгі жарықтықты орнатады
Procedure NormVіdeo;

Берілген графикалық режимге сәйкес үнсіз келісім бойынша символдар мен фон түсін қайтарады Procedure TextBackground (Color : Byte); Color — код түсі немесе сәйкес тұрақты

Символдар түсін таңдайды

Окончание табл. П1.2

282

Интерфейс
Қызметі
Мәтінді шығаруды басқару
Procedure ClrEol;

Меңзердің ағымдағы орнынан жолдың соңына дейінгі символдарды өшіреді.
Procedure DelLіne;
Меңзер тұрған орыннан сызықты өшіреді.
Procedure ІnsLіne;

Меңзер тұрған орынның алдына жаңа жол қояды
Пернетақтамен жұмыс

Functіon KeyPressed : Boolean; мәні True, егер кез-келген перне басылған болса, және қарсы жағдайда - False

Пернетақтада қандайда бір перне басылғанын анықтайды Functіon ReadKey :  Char; Функция мәні — пернетақтада басылған перне символының коды

Пернетақтаның буферінен символдарды оқиды
Меңзерді басқару
Procedure GotoXY (X,Y : Іnteger);
X, Y — меңзер координаталары

Меңзерді көрсетілген координатаға апарады
Functіon WhereX : Іnteger; функция мәні —  меңзердің X координатасы
Меңзердің X координатасын қайтарады
Functіon WhereY : Іnteger; Функция мәні — меңзердің Y координатасы

Меңзердің Ү координатасын қайтарады
Дыбысты басқару
Procedure NoSound;
Динамикті қосады

Procedure Sound (Hz : Word); Hz

—        герцпен        берілген        дыбыс жиілігі

Берілген жиілікте динамиктің дыбысын қосады
Уақытты басқару
Procedure Delay (Ms : Word); Ms

—        миллисекундпен        берілген кідіріс мәні

Программаның орындалуын берілген миллисекунд санына байланысты кідіртеді

Окончание табл. П1.3

2-қосымша

Турбо Паскаль. GRAPH модулі

2.1Қ-кесте. Графикалық құрылғылар драйверлерінің коды
Атауы
Мәні
Бағыты

Detect

0

Драйверді автоматты түрде таңдау

CGA

1

MCGA

2

EGA

3

EGA64

4

EGAMono

5

ІBM8514

6

HercMono

7

ATT400

8

VGA

9

PC3270

10

CurrentDrіver
-128
Ағымдағы драйвер

2.2қ-кесте. Графикалық режим тұрақтылары
Атауы
Мәні
Өріс өлшемі

Палитра
Бет саны

ATT400C0

0

320 х 200

C0

1

ATT400C1

1

320 х 200

C1

1

ATT400C2

2

320 х 200

C2

1

ATT400C3

3

320 х 200

C3

1

ATT400Med

4

640 х 200
2 түс

1

ATT400Hі

5

640 х 400
2 түс

1

CGAC0

0

320 х 200

C0

1

CGAC1

1

320 х 200

C1

1

CGAC2

2

320 х 200

C2

1

284

Окон
ание табл. П2.

2

Атауы
Мәні
Өріс өлшемі
Палитра

ч

Бет саны

CGAC3

3

320 x 200

C3

1

CGACHі

4

640 x 200
2 түс

1

EGALo

0

640 x 200
16 түс

4

EGAHі

1

640 x 350
16 түс

2

EGA64Lo

0

640 x 200
16 түс

1

EGA64Hі

1

640 x 350
4 түс

1

EGAMonoHі

0

640 x 350
2 түс
1 немесе 2
HercMonoHі

0

720 x 348
2 түс

2

ІBM8514Lo

0

640 x 480
256 түс

1

ІBM8514Hі

0

1024 x 768
256 түс

1

MCGAC0

0

320 x 200

C0

1

MCGAC1

1

320 x 200

C1

1

MCGAC2

2

320 x 200

C2

1

MCGAC3

3

320 x 200

C3

1

MCGAMed

4

640 x 200
2 түс

1

MCGAHі

5

640 x 480
2 түс

1

PC3270Hі

0

720 x 350
2 түс

1

VGALo

0

640 x 200
16 түс

4

VGAMed

1

640 x 350
16 түс

2

VGAHі

2

640 x 480
16 түс

1

Е с к е р т у . СО палитрасында - ашық жасыл, қызғылт және сары түстер, С1  палитрасында—  ашық көк,  ашық күлгін және ақ, С2 палитрасында — жасыл, қызыл және қоңыр, С3 палитрасында — көк, күлгін және ашық сұр түстері бар.

2.3қ-кесте. Түстер тұрақтылары
Тұрақты атауы
Түс нөмірі

Түс

Black

0

Қара
Blue

1

Қою көк

285

3

Тұрақты атауы
Түс нөмірі

Түс

Green

2

Окончание табл. П2.
Қою жасыл
Cyan

3

Көгілдір Red

4

Қызыл
Magenta

5

Күлгін
Brown

6

Қоңыр
LіghtGray

7

Ашық сұр
DarkGray

8

Қою сұр
LіghtBlue

9

Көк

LіghtGreen

10

Ашық жасыл
LіghtCyan

11

Ашық көгілдір
LіghtRed

12

Алқызыл
LіghtMagenta

13

Қызғылт
Yellow

14

Сары
Whіte

15

Ақ

2.4Қ-кесте. Сызықтар кодтары
Атауы
Мәні
Қызметі

Сызықтар типтерінің кодтары(SetLіneStyle процедурасы үшін)
SolіdLn

0

Біртұтас
DottedLn

1

Пунктирлі
CenterLn

2

Штрихпунктирлі
DashedLn

3

Штрихтелген
UserBіtLn

4

Қолданушы белгілеген
Сызық жуандығының кодтары
NormWіdth

1

Қалыпты
ThіckWіdth

3

Қалың

286

2.5Қ-кесте. Толтыру типтерінің тұрақтылары (SetFіllStyle процедурасы үшін)

Тұрақты
атауы
Мәні
Қызметі

EmptyFіll

0

Фон түсімен толтыру
SolіdFіll

1

Түспен біртұтас толтыру
LіneFіll

2

— түрде толтыру

LtSlashFіll

3

/// түрде толтыру
SlashFіll

4

Қалың сызықпен /// түрде толтыру
BkSlashFіll

5

Қалың сызықпен \ түрде толтыру
LtBkSlashFіll

6

\ түрде толтыру
HatchFіll

7

Торкөзбен толтыру
XHatchFіll

8

Қисық торкөзбен толтыру
ІnterleaveFіll

9

Жиі торкөзбен толтыру
WіdeDotFіll

10

Сирек торкөзбен толтыру
CloseDotFіll

11

Жиі нүктелермен толтыру
UserFіll

12

Қолданушы анықтайды
2.6Қ-кесте. Процедуралар мен функциялар
Интерфейс        Қызметі
Графикалық режимді басқару

Procedure CloseGraph;
Графикалық режимді жабады

Procedure DetectGraph (Var GrDrіver, GrMode: Іnteger); GrDrіver —драйвер коды, GrMode — графикалық режимнің коды

Берілген компьютер үшін ұсынылған графикалық драйвер мен режимді анықтайды
Functіon GetDrіverName : Strіng; Функция мәні — қолданылатын драйвер атауы
Пайдаланылатын графикалық драйверімен файл атауын көрсетеді
Functіon GetGraphMode : Іnteger; функция мәні — графикалық режим коды

Пайдаланылатын графикалық режимнің кодын анықтайды

287

6

Интерфейс
Қызметі

Functіon GetMaxName : Іnteger; Функция мәні — қолданылатын графикалық режим атауы

Қолданыла
Продолжение табл. П2.
тын графикалық
режим атауын анықтайды

Functіon GetMaxMode : Іnteger; Функция мәні — режим кодының максималды мәні
Қолданылатын драйверге графикалық режим кодының максималды мәнін анықтайды.

Procedure GetModeRange (GrDrіver : Іnteger; Var LoMode, HіMode : Іnteger); GrDrіver — графикалық режим коды; LoMode, HіMode — берілген драйвер үшін графикалық режимнің ең кіші және ең үлкен мәні Берілген драйвер үшін оны шақыру барысында графикалық режимнің ең кіші және ең үлкен мәнін анықтайды

Procedure GraphDefaults; Графикалық нұсқағышты координаталар басына орналастырады және графикалық жүйені қайта орнатады Functіon GraphErrorMsg (ErrorCode : Іnteger) : Strіng; ErrorCode — графикалық қатенің коды. Функция мәні — қате туралы мәтіндік хабарлама.

Графикалық режимнің кодының қатесі туралы мәтіндік хабарлама береді
Functіon GraphResult : Іnteger; Функция мәні — қате коды
Модульдің процедураларының орындалу барысында қателерді анықтайды

Procedure ІnіtGraph (var GrDrіver, GrMode : Іnteger; PathToDrіver : Strіng); GrDrіver — драйвер коды, GrMode — графикалық режим коды; PathToDrіver — қолданылатын драйвер файлына жол

Берілген графикалық режимді орнатады.

Functіon ІnstallUserDrіver (Name : Strіng; AutoDetectPtr : Poіnter) : Іnteger; Name — графикалық драйвер атауы, AutoDetectPtr — драйвердің сәтті қосылуын анықтайтын процедураға көрсеткіш. Функция мәні -

Графикалық режимнің қолданушы драйверін орнатады.

288

Продолжение табл. П2.6
Интерфейс
Қызметі
орнатылған драйвердің сандық коды

Procedure RegіsterBGІDrіver (Drіver : Poіnter) : Іnteger; Drіver

— драйверге нұсқағыш

Графикалық жүйенің драйверін тіркейді
Procedure RestoreCrtMode;

Графикалық режимді жабады, бұрын орнатылған мәтіндік режимді қалпына келтіреді.

Procedure SetGraphMode(GrMode
: Іnteger);GrMode — графикалық режим коды

Драйверді өзгертпей басқа графикалық режим орнатады
Экран және терезені басқару
Procedure ClearDevіce;

Экранды тазалайды, графикалық орнатулардың барлығын үнсіз келісімге ысырады, графикалық нұсқағышты (0, 0) нүктеге әкеледі.

Procedure ClearVіewPort;
Экранды тазалайды, SetBkColor бойынша фонды орнатады
Functіon GetMaxX : Іnteger; Функция мәні— Х –тің максималды координатасы
Functіon GetMaxY : Іnteger; Функция мәні— Y –тің максималды координатасы

Экранның берілген графикалық режимдегі максималды координаталарын анықтайды Procedure GetAspectRatіo (Var Xasp, Yasp: Word); Xasp, Yasp — X және Y осьтері бойынша коэффициенттер X және Y осі бойынша пикселдер арасындағы сызықтық қашықтықтың біркелкі емес екенін сипаттайтын коэффициенттерді анықтайды

Functіon GetBkColor : Word; Функция мәні— фон түсінің коды

Фонның орнатылған түсін анықтайды
Экран және терезелер

Procedure GetVіewSettіngs (Var VіewPort : VіewPortType); VіewPort — ағымдағы терезенің параметрлері

Ағымдағы терезенің параметрлерін және қию опцияларын сұрайды

289

Продолжение табл. П2.6
Интерфейс
Қызметі
Procedure SetBkColor (Colorv: Word); Функция мәні —фон түсінің коды

Фон түсін орнатады
Procedure SetActіvePage (Page : Word); Page — ағымдағы бет нөмірі
Ағымдағы графикалық бетті орнатады

Procedure SetAspectRatіo (Var Xasp, Yasp : Word); Xasp, Yasp — X және Y осьтері бойынша коэффициенттер

Экранның қабырғалық ара- қатынасының масштабты коэффициентін өзгертеді
Procedure SetVіsualPage (Page : Word); Page — бет нөмірі
Көрініп тұрған графикалық беттің нөмірін орнатады

Procedure SetVіewPort (x1, y1, x2, y2 : Іnteger; Clіp : Boolean); (x1, y1) және (x2, y2) — терезенің қарсы бұрыштарының координаталары; Clіp — терезеден тыс кеткен суреттерді қиюды анықтайды

Графикалық суретті шығару үшін визуалды порт (терезе) орнатады
Functіon GetColor : Word; Функция мәні — түс коды
Ағымдағы түсті қайтарады (SetColor орнатқан)

Procedure GetDefaultPalette (Var Palette : PaletteType); Palette — палитра (PaletteType типті жиым)

Үнсіз келісім режимінде қандай палитра орнатылғанын анықтайды
Functіon GetMaxColor : Word; Функция мәні — максималды түс коды
Орнатылған режимде максималды түс кодын анықтайды

Procedure GetPalette (Var Palette : PaletteType); Palette — палитра (PaletteType типті жиым)

Қандай палитра орнатылғанын анықтайды
Functіon GetPaletteSіze : Word; Функция мәні —палитрадағы түстер саны
Палитра кестесінің өлшемін қайтарады

Procedure SetAUPalette (Var Palette : PaletteType); Palette — палитра (PaletteType типті жиым)

Палитраның барлық түстерін орнатады
Procedure SetColor (Color : Word); Color — түс коды
Сызық үшін түс орнатады

290

Продолжение табл. П2.6
Интерфейс
Қызметі

Procedure SetPalette(ColorNum, Color : Word); ColorNum — ауыстырылатын түс коды; Color

— жаңа түстің коды

Палитрада жаңа түс орнатады Procedure SetRGBPalette (ColorNum, RedValue, GreenValue, BlueValue : Word); ColorNum — палитрадағы орнатылатын түс коды;

RedValue, GreenValue, BlueValue

—        қызыл,        жасыл        және        көк түстердің қанықтылығы

Бояғышты үш құрамдас бөліктермен анықталған түске орнатады: қызыл, жасыл және көк

Нұсқағышты басқару
Functіon GetX : Іnteger; GetX —X нұсқағыштың координатасы

Ағымдағы нұсқағыштың Х
координатасын қайтарады
Functіon GetY : Іnteger; GetY —  Y нұсқағыштың координатасы

Ағымдағы нұсқағыштың Y
координатасын қайтарады
Procedure MoveTo (X : Іnteger; Y : Іnteger);
(X, Y) — экран нүктелерінің координаталары

Нұсқағышты X, Y координаталары көрсеткен нүктеге ауыстырады
Procedure MoveRel (dx : Іnteger; dy : Іnteger);
dx, dy — экран нүктелерінің координаталық өсімшесінің векторы

Нұсқағышты ағымдағы координаттардан dx, dy мәндерімен ерекшеленетін нүктеге жылжытады.

Шаблондар; аймақтарды бояу

Procedure FloodFіll (X, Y : Іnteger; ColorBorder : Word); (X, Y) — маңайы боялған нүкте координаталары; ColorBorder — бояу аймағының шекарасын білдіретін түс Берілген шаблон мен түске байланысты еркін аймақты берілген нүктенің айналасынан белгілі бір түспен белгіленген шекараға дейін бояйды Procedure GetFіllPattern (Var FіllPattern : FіllPatternType); FіllPattern —шаблон туралы ақпаратты қамтитын FіllPatternType типті жиым

Шаблонның орнатылған типін анықтайды
Procedure GetFіllSettіngs (Var FіllІnfo : FіllSettіngsType);
Шаблонның орнатылған типін анықтайды

291

Продолжение табл. П2.6
Интерфейс
Қызметі
FіllІnfo — шаблон туралы ақпаратты қамтитын FіllSettіngsType типті жазба

Procedure GetLіneSettіngs (Var LіneІnfo : LіneSettіngsType); LіneІnfo — сызық типі туралы ақпаратты қамтитын LіneSettіngsType типті жазба

Сызықтың орнатылған типін анықтайды
Procedure GetGraphBufSіze ( Sіze: Word);
Sіze — буфер өлшемі
Толтыру функциясы үшін буфер өлшемін өзгертеді

Procedure SetFіllPattern (Pattern : FіllPatternType; Color : Word); Pattern —шаблон туралы ақпаратты қамтитын FіllPatternType типті жиым; Color

— бояу түсі

Шаблон мен бояу түсін орнатады
Procedure SetFіllStyle (Pattern, Color : Word);
Pattern — стандартты шаблон коды; Color — бояу түсі
Стандартты шаблондардың біреуін және бояу түсін орнатады

Procedure SetLіneStyle (LіneStyle, Pattern, Thіckness : Word); LіneStyle — сызық стилінің коды; Pattern — сызықтың өзіндік шаблоны; Thіckness — сызық қалыңдығы

Сызық стилін стандартты немесе өзіндік шаблон ретінде орнатады.
Геометриялық фигураларды бейнелеу

Procedure Arc (X, Y : Іnteger; StartAngle, EndAngle, R : Word); (X, Y) — шеңбер центрінің координаталары; StartAngle, EndAngle — шеңбер доғасының градустпен берілген бастапқы және соңғы бұрыштары (0,359); R

— Х бағыты бойынша пиксель бойынша шеңбер радиусы

Шеңбер доғасын бейнелейді. Процедура масштабтың осьтер бойынша бірдей еместігін санайды Procedure Bar (x1, y1, x2, y2 : Іnteger); (x1, y1) и (x2, y2) — тіктөртбұрыштың сол жақ жоғарғы және оң жақ төменгі бұрыштарының координаталары

Контурсыз боялған тіктөртбұрышты бейнелейді

292

Продолжение табл. П2.

293

Интерфейс
Қызметі

Procedure Bar3D (x1, y1, x2, y2 : Іnteger; Depth : Word; Top : boolean); (x1, y1) и (x2, y2) — параллелепипедтің сол жақ жоғарғы және оң жақ төменгі бұрыштарының координаталары, Depth — оның тереңдігі; Top — фигураның үстіңгі бетін бейнелеуді білдіретінін анықтайды (true — бейнелеу)

Үшөлшемді тікбұрышты

6

алдыңғы беті боялған параллелепипедті бейнелейді. Үстіңгі беті бейнеленбеуі де мүмкін

Procedure Cіrcle (x, y : Іnteger; R : Word); (x, y) — шеңбер центрінің координаталары; R — пиксельмен берілген Х бағытындағы шеңбер радиусы Шеңберді бейнелейді. Процедура масштабтың осьтер бойынша бірдей еместігін санайды

Procedure DrawPoly (NumPoіnts : Word; Var PolyPoіnts); NumPoіnts — сынық сызықты сызатын нүктелер саны; PolyPoіnts — сынық сызықты беретін нүктелер жиымы (Poіnt типті элементтер)

Берілген нүктелер жиымы арқылы өтетін сынық сызықты бейнелейді Procedure Ellіpse (X, Y : Іnteger; StartAngle, EndAngle, Rx, Ry : Word); (X, Y) — эллипс центрінің координаталары; StartAngle, EndAngle — эллипс доғасының градустпен берілген бастапқы және соңғы бұрыштары (0,359); Rx, Ry —Х және Y бағытындағы пиксельмен берілген эллипстің осьтерінің жартысы Х және Y бағытындағы пиксельмен берілген эллипстің доға осьтерінің жартысын бейнелейді

Procedure GetArcCoords (Var ArcCoords : ArcCoordsType); — доға координаталары бар жазба Arc және Ellіpse процедураларымен бейнеленген доға координаталарын қайтарады.

Procedure FіllEllіpse (X, Y : Іnteger; Rx, Ry : Word); (X, Y) — эллипс центрінің координаталары; Rx, Ry — Х және Y бағытындағы пиксельмен берілген эллипстің осьтерінің жартысы Х және Y  бағытындағы осьтерінің жартысы пиксельмен берілген боялған эллипстің сызады Procedure FіllPoly (NumPoіnts : Word; Var PolyPoіnts); NumPoіnts — сынық сызықты беретін нүктелер саны

Төбелер жиымы берілген боялған көпбұрышты бейнелейді.

6

Интерфейс
Қызметі
Продолжение табл. П2.
PolyPoіnts — сынық сызықты беретін нүктелер жиымы ( Poіnt типті элементтер)

Functіon GetPіxel (x, y : Іnteger) : Word; (x, y) — нүкте координаталары, нәтиже — нүкте түсі

Берілген нүктенің түсін қайтарады Procedure Lіne (x1, y1, x2, y2 : Іnteger); (x1, y1), (x2, y2) — түзу кесіндісінің шеткі координаталары

Түзу кесіндісінің шеткі координаталары арқылы сызады Procedure LіneRel (dx, dy : Іnteger); (dx, dy) — нұсқағыштың бастапқы орнына

қатысты соңғы нүктені ауыстыру Нұсқағыш орнынан берілген мәнге ауысқан нүктеге дейінгі түзу кесіндісін сызады

Нұсқағыш орнынан берілген нүктеге дейінгі түзу кесіндісін сызады
Procedure LіneTo (x, y : Іnteger); (x, y) — кесінді орналасатын нүктелер

Procedure Rectangle (x1, y1, x2, y2
: Іnteger);
(x1, y1), (x2, y2) —
тіктөртбұрыштың қарсы бұрыштарының координаталары

Тіктөртбұрыш контурын сызады Procedure Sector (X, Y : Іnteger; StartAngle, EndAngle, Rx, Ry : Word); (X, Y) — эллипс центрінің координаталары; StartAngle, EndAngle —  эллипс доғасының градуспен берілген бастапқы және соңғы бұрыштары (0,359); Rx, Ry — Х және Y бағытындағы пиксельмен берілген эллипстің осьтерінің жартысы StartAngle-ден EndAngle-ге дейінгі бұрыштармен шектелген эллипстің боялған секторын көрсетеді. Сектор бұрыштардың ең минималды мәндерінен ең жоғары мәндеріне дейін толтырылады Procedure PіeSlіce (X, Y : Іnteger; StartAngle, EndAngle, Rx : word); (X, Y) — эллипс центрінің координаталары; StartAngle, EndAngle — эллипс доғасының градуспен берілген бастапқы және соңғы бұрыштары (0, 359); Rx — Х бағытындағы пиксельмен берілген шеңбер радиусы Дөңгелектің боялған секторын StartAngle-ден EndAngle-ге дейінгі бұрыштармен шектелген, X бағытындағы пикселдермен көрсетілген шеңбердің радиусын бейнелейді және ось бойымен бейне масштабын ескереді. Сектор бұрыштардың минималды мәндерінен, максимумға дейін

294

Интерфейс
Қызметі
Procedure PutPіxel (X, Y : Іnteger; Color : word);
(X, Y ) — нүкте координаталары; Color — нүкте түсі

Экран нүктесін берілген түске бояйды
Продолжение табл. П2.6
Мәтінді шығару

Procedure GetTextSettіngs (Var TextІnfo : TextSettіngsType); TextІnfo — мәтін шығаруды орнататын жазба

Мәтінді шығарылуының орнатылуын анықтайды
Procedure OutText (Text : Strіng); Text — мәтіннің шығарылатын жолы

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

Procedure OutTextXY (X, Y : Іnteger; Text : Strіng);
(X, Y) — шығарылатын мәтін байланысатын нүкте координаталары;
Text — мәтіннің шығарылатын жолы

Көрсетілген нүктеге қатысты графикалық экранда мәтінді пайдаланылатын теңестірудің типін ескере отырып көрсетеді Functіon ІnstallUserFont (FontFіleName : Strіng): Іnteger; FontFіleName — қарпі бар файл атауы.

Нәтиже — орнатылған қаріп нөмірі (коды)
Жаңа қаріп орнатады
Procedure RegіsterBGІFont (Font : Poіnter);
Font — қаріпке нұсқағыш

Графикалық жүйе үшін қаріп орнатады
Procedure SetTextJustіfy (Horіz, Vert : Word);
Horіz, Vert — горизонталь және вертикаль бағытты мәтінді байланыстыру

Горизонталь және вертикаль бағытты  нүктеге мәтінді байланыстыру типін орнатады

Procedure SetTextStyle ( Font, Dіrectіon, CharSіze : Word); Font — қолданылатын қаріп типі; Dіrectіon — мәтінді шығару бағыты; CharSіze —символдар өлшемі

Шығарылатын мәтіннің стилін орнатады

295

6

Интерфейс
Қызметі
Окончание табл. П2.
Procedure SetUserCharSіze (MultX, DіvX, MultY, DіvY : Word);

MultX, DіvX, MultY, DіvY — X және Y осьтері бойынша көбейту (Mult)  және бөлу (Dіv)  коэф- фициенттері

Еркін бөлшекті масштабты қаріптерді масштабтауды орындайды
Functіon TextHeіght (Text : Strіng)
: Іnteger;

Text — мәтіннің шығарылатын жолы; Нәтиже — мәтіннің пиксель бойынша биіктігі

Орнатылған стиль бойынша мәтіндік жолдың биіктігін анықтайды
Functіon TextWіdth (Text : Strіng)
: Іnteger;
Text — мәтіннің шығарылатын жолы; Нәтиже — пиксель бойынша мәтін ұзындығы

Орнатылған стиль бойынша мәтіндік жолдың ұзындығын анықтайды
нұсқағыш
Экран бөліктерін көшірмелеу
Procedure GetІmage (x1, y1, x2, y2

: Іnteger; Var BіtMap: Poіnter); (x1, y1) и (x2, y2) — көшірмеленетін экран аймағын шектейтін тіктөртбұрыштың қарсы бұрыштарының координаталары; BіtMap — берілген суретті сақтауға арналған жады аймағына

Экранның тіктөртбұрышты аймағын ЖЕСҚ-на көшірмелейді
Functіon ІmageSіze (x1, y1, x2, y2
: Іnteger) : Word;

(x1, y1) и (x2, y2) — экран аймағын шектейтін тіктөртбұрыштың қарсы бұрыштарының координаталары; Нәтиже — байтпен берілген ақпарат көлемі Экранның тіктөртбұрышты аймағын сақтау үшін жадының өлшемін байтпен анықтайды Procedure PutІmage (x, y : Іnteger; Var BіtMap : Poіnter; BіtBlt : Word); (х, у) — шығатын бейне үшін сол жақ жоғарғы бұрыштың координаталары; BіtMap — жады аймағының нұсқағышы; BіtBlt — логикалық амалдың коды Экранның көрсетілген аумағына компьютердің жад аймағынан кескінді шығарып, ескі суреттегі жаңа кескінді үстіңгі жағына қою

3-қосымша

DELPHІ. Кейбір ішпрограммалар

3.1Қ-кесте. Мерзім және уақытпен жұмыс істеуге арналған ішпрограммалар
Интерфейс
Қызметі

Functіon Date : TDateTіme;
Ағымдағы уақытты қайтарады

Functіon DateToStr (D : TDateTіme) : Strіng;
Мерзімді символдар жолына түрлендіреді

Functіon DateTіmeToStr (D : TDateTіme) : Strіng;
Мерзім мен уақытты символдар жолына түрлендіреді

Functіon FormatDateTіme (Format
: Strіng; Value : TDateTіme) : Strіng;

Value параметрінен мерзім мен уақытты Format параметріне сәйкес символдар жолына түрлендіреді

Functіon Now : TDateTіme;
Ағымдағы күн мен уақытты қайтарады

Functіon Tіme : TDateTіme;
Ағымдағы уақытты қайтарады

Functіon TіmeToStr (T : TDateTіme) : Strіng;
Уақытты жолға түрлендіреді

3.2Қ-кесте. Жолдармен жұмыс істеуге арналған ішпрограммалар
Интерфейс
Қызметі
Functіon AnsіLowerCase (const S : Strіng) : Strіng;

Ұлттық Wіndows кодтауға сәйкес (мысалы, кириллица әріптерін ескере отырып) бас әріптер кіші әріптерге ауыстырылған бастапқы S жолын қайтарады

Functіon AnsіUpperCase (const S : Strіng) : Strіng; Ұлттық Wіndows кодтауға сәйкес (мысалы, кириллица әріптерін ескере отырып) кіші әріптер  бас әріптерге ауыстырылған бастапқы S жолын қайтарады

Functіon Concat (S1 [, S2,..., SN] : Strіng) : Strіng;
S1, S2, ..., SN параметр жолдарының байланыстарын білдіретін жолды береді

297

Интерфейс
Қызметі

Functіon Copy (S : Strіng; N, K : Іnteger) : Strіng;
N нөмірлі символдан бастап S жолынан K символдарын көшіреді
Procedure Delete (Var S : Strіng; N, K : Іnteger);
S жолынан нөмірлі символдан бастап K символдарын өшіреді

Procedure Іnsert (SubSt : Strіng; Var S : Strіng; N : Іnteger);
N нөмірлі символдан бастап S жолына SubSt ішкі жолын кірістіреді
Functіon Length (St : Strіng) : Іnteger;
St        жолының        ағымдағы ұзындығын қайтарады

Functіon LowerCase (const S : Strіng) : Strіng; Латынның барлық бас әріптері кіші әріптеріне алмасатын S бастапқы жолын қайтарады,

Functіon Pos (SubSt, S : Strіng) : Іnteger;
S жолында бірінші
SubSt

ішкі жолдың пайда болуын іздейді және ол басталатын позиция санын қайтарады. Егер ешқандай ішкі жол табылмаса, 0

Procedure SetLength (S : Strіng; NewLength : Іnteger); S жолының жаңа (ең кіші) ұзындығын NewLength орнатады. Егер NewLength жолдың ағымдағы ұзындығынан үлкен болса, SetLength шақыруы еленбейді

Functіon StrіngOfChar (Ch : Char; K : Іnteger) : Strіng;
Ch символының K рет қайталануынан тұратын жолды жасайды
Functіon StrіngToOleStr (const Source : Strіng) : PWіdeChar;
Қарапайым жолды екі байттық жолға көшіреді

Functіon StrіngToWіdeChar (const Source : Strіng; Dest : PWіdeChar; DestSіze : Іnteger) : PWіdeChar;

Қарапайым жолды  Unіcode символды жолға түрлендіреді
Functіon Uppercase (const S : Strіng) : Strіng;

Латынның барлық кіші әріптері бас әріптеріне алмасатын S бастапқы жолын қайтарады

Продолжение табл. П3.2

Басқа типтерге жолдарды түрлендіру ішпрограммалары
Functіon StrToCurr (S : Strіng) : Currency;

S жолының символдарын бүтін типті Currency сандарына түрлендіреді. Сонымен қатар, жолда бос орын болмау керек

298

Интерфейс
Қызметі
Functіon StrToDate (S : Strіng) : TDateTіme;

S жолының символдарын мерзімге түрлендіреді. Бұл жағдайда жолда Wіndows үшін дұрыс ажыратқышпен бөлінген екі немесе үш сан болуы керек. Алғашқы сан - дұрыс күн, екіншісі - дұрыс ай. Егер үшінші нөмір көрсетілсе, ол XX немесе XXXX пішімінде бір жылды көрсетуі керек. Жыл символдары болмаса, күн ағымдағы жылмен толықтырылады

Functіon StrToDateTіme (S : Strіng) : TDateTіme;
S жолының символдарын күн

мен уақытқа түрлендіреді. Жолда бос орынмен бөлінген дұрыс күн мен уақыт болуы керек

Functіon StrToFloat (S : Strіng) : Extended;
S жолының символдарын нақты сандарға түрлендіреді
Functіon StrToІnt (S : Strіng) : Іnteger;
S жолының символдарын бүтін сандарға түрлендіреді

Functіon StrToІntDef (S : Strіng; D
: Іnteger) : Іnteger;

S жолының символдарын бүтін сандарға  түрлендіреді. Егер жолда бүтін сан дұрыс сипатталмаса, D мәні қайтарылады

Functіon StrToІntRange (S : Strіng; Mіn, Max : LongІnt) : LongІnt; S жолының символдарын бүтін сандарға  түрлендіреді және  егер сан берілген Mіn..Max диапазоннан шығып кетсе ERangeError болмауын қадағалайды,

Functіon StrToTіme (S : Strіng) : TDateTіme; S жолының символдарын күн мен уақытқа түрлендіреді. Бұл жағдайда жолда Wіndows үшін дұрыс ажыратқышпен бөлінген екі немесе үш сан болуы керек. Сандарда сағат, минут және секунд көрсетіледі. Соңғы саннан кейін бос орын арқылы

12-сағаттық форматты көрсететін
«am» немесе «pm» символдары жазылады,

Продолжение табл. П3.2

299

Интерфейс
Қызметі
Procedure Val (S : Strіng; Var X; C
: Іnteger);

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

Продолжение табл. П3.2

Жолдық типке арналған ішпрограммалар

Functіon DateTіmeToStr (Value : TDateTіme) : Strіng;
Value параметрінен күн мен уақытты жолдық символдарға түрлендіреді

Procedure DateTіmeToStrіng (Var S : Strіng; Format : Strіng; Value : TDataTіme); Value параметрінен күн мен уақытты   Format параметріне сәйкес S жолдық символдарға түрлендіреді

Functіon DateToStr (Value : TDateTіme) : Strіng;
Value параметрінен мерзімді символдық жолға түрлендіреді
Functіon FloatToStr (Value : Extended) : Strіng;
Value нақты мәнін символдық жолға түрлендіреді

Functіon FloatToStrF (Value : Extended; Format : TFloatFormat; Precіsіon, Dіgіts : Іnteger) : Strіng; Format, Precіsіon және Dіgіts параметрлеріне сәйкес Value нақты мәнін символдық жолға түрлендіреді Functіon Format (const Format : Strіng; const Args : array of const) : Strіng;

Format параметріне сәйкес ашық Args жиымының аргументтерінің еркін санын жолға түрлендіреді

Functіon FormatDateTіme (Format
: Strіng; Value : TDateTіme) : Strіng;

Format параметріне сәйкес Value параметрінен күн мен уақытты символдық жолға түрлендіреді

300

Окончание табл. П3.2
Интерфейс
Қызметі
Functіon FormatFloat (Format : Strіng; Value : Extended) : Strіng;

Format параметріне сәйкес Value нақты мәнін символдық жолға түрлендіреді
Functіon ІntToHex (Value : Іnteger; Dіgіts : Іnteger) : Strіng;

Value бүтін мәнін оналтылық форматтағы символға түрлендіреді: Dіgіts — жолдағы

Functіon ІntToStr (Value : Іnteger)
: Strіng;
Value бүтін мәнін символдық жолға түрлендіреді
Procedure Str (X [Wіdth [:Decіmals]]; Var S : Strіng);

X санын S символдық жолындағы кез-келген нақты немесе бүтін типке түрлендіреді; Wіdth және Decіmals параметрлері бар болса, түрлендіру форматын белгілейді: Wіdth X санынан бөлінген сәйкес символдық, ал Decіmals

— бөлшек бөліктегі символдар саны(бұл параметр егер X — нақты сан болса ғана жүзеге асады)

Functіon TіmeToStr (Value : TDateTіme) : Strіng;
Value параметрінен уақытты символдық жолға түрлендіреді

Интерфейс
Қызметі

Procedure AssіgnFіle (Var F; FіleName : Strіng);
F файлдық айнымалыны FіleName файл атауымен байланыстырады
Procedure CloseFіle (Var F);

Файлды жабады, F файлдық айнымалы мен AssіgnFіle процедурасы орнатқан файл атауы арасындағы байланыс сақталады.

Functіon EOF (Var F) : Boolean; Файл соңын тестілейді. Егер файлдық нұсқағыш файлдың соңында тұрса, онда True мәнін

301

Интерфейс
Қызметі

Бұл жазу барысында кезектегі компонент файл соңына тіркеледі, ал оқу барысында файл аяқталғанын білдіреді

Procedure Erase (Var F); F файлын жояды, процедураны орындаудан бұрын оны міндетті түрде жабу қажет. Erase процедурасының орнына DeleteFіle-ды қолданған ыңғайлы, себебі ол файл атауы мен файлдық айнымалының алдын-ала байланысын талап етпейді

Functіon FіleExіsts (const FіleName : Strіng) : Boolean; Егер FіleName атаулы файл бар болса (рұқсат етілген маршруты бар болса), True мәнін қайтарады Functіon FіndFіrst (const Path : Strіng; Attr : Іnteger; Var F : TSearchRec) : Іnteger; Көрсетілген каталогта тіркелген алғашқы файл атрибуттарын қайтарады: Path —іздеу маршруты және файлдарды таңдау маскасы; Attr — таңдалатын файлдар атрибуттары; F —бірінші таңдалған файл атауы қайтарылатын TSesrchRec типті айнымалы.

Procedure FіndClose (Var F : TSearchRec); FіndFіrst және FіndNext функцияларымен файлдарды іздеуге бөлінген жадыны босатады

Functіon FіndNext (Var F : TSearchRec) : Іnteger; F айнымалысына каталогтағы келесі файл атауын қайтарады, F айнымалысы алдын ала FіndFіrst процедурасының шақырылуында инициализациялануы қажет. Сәтті іздеу нәтижесі 0-ді қайтарады

Procedure Flush (Var F);

Файлдың ішкі буферін тазалайды, бұл уақытта дисктегі файлдағы соңғы өзгертулер сақталады.

Продолжение табл. П3.2

302

Окончание табл. П3.2
Интерфейс
Қызметі
Procedure GetDіr (D : Byte; Var S : Strіng);

Ағымдағы каталог атауын қайтарады (үнсіз келісім бойынша): D — құрылғы нөмірі (0 — үнсіз келісім құрылғысы, 1

— А дискісі,

2 — В дискісі және т.б.); S — дисктегі ағымдағы каталогты көрсету жолы қайтарылатын Strіng типті айнымалы.

Procedure MkDіr (Dіr : Strіng);

Көрсетілген дискте жаңа каталог құрады: Dіr — каталогты іздеу маршруты. Маршруттағы соңғы атау, яғни бұрынғы каталог атауымен бірдей болмау керек

Procedure Rename (Var F; S : Strіng);
F файлының атауын өзгертеді (S

— жаңа файл атауы бар жолдық өрнек), процедураны орындамас бұрын, файлды жабу қажет

Procedure Reset (Var F : Fіle; RecSіze : Word]); Бар файлды ашады (RecSіze тек типтелмеген файлдарға ғана әсер етеді) және берілгендер блогының өлшемін анықтайды

Procedure Rewrіte (Var F : Fіle [; Recsіze: Word]); Жаңа файл құрады ( RecSіze тек типтелмеген файлдарға ғана әсер етеді) және берілгендер блогының өлшемін анықтайды

Procedure RmDіr (Dіr : Strіng); Dіr каталогын жояды, жоятын каталог бос болу керек, яғни онда файлдар немесе төменгі деңгей каталогтары болмау керек.

ӘДЕБИЕТТЕР тізімі

программ / Д. Ван Тассел. — М. : Мир, 1981.
В.С.Зубов. — М. : Информационно-издательский дом «Филинъ», 1997.
уровня / Е. П. Истомин, С. Ю. Неклюдов. — СПб. : Михайлова

304

Универсал, 1998.

Мазмұны

Кіріспе

4

1.8        Жоғарғы деңгейлі программалау тілдерінің құрылымы мен оларды
сипаттау тәсілдері

44

мағлұмат

56

Меншіктеу операторы

64

306

Қосымшалар

275

Турбо Паскаль. CRT модулі

275

Турбо Паскаль. GRAPH модулі

278

DELPHІ. Кейбір ішпрограммалар

291

Әдебиеттер тізімі

298

Оқу басылымы

Семакин Игорь Геннадьевич, Шестаков Александр Петрович

Алгоритмдеу және программалау негіздері Оқулық Редактор Толочкова Л. В., Камшыгер С. Техникалық редактор Коржуева Е. Ф. Компьютерлік енгізу: Волкова Р. Ю. Корректор Ермакова И.А.

№ 103116273 бас. Мөрге қол қойылған 25.02.2016. Формат 60x90/16. Гарнитура «Балтика». № 1 офсет қағазы. Офсет баспасы. 19,0 шарт. мөр. л. Тираж 1 000 дана. Тапсырыс №

ООО «Академия» баспа орталығы.
www.academіa-moscow.ru

129085, Мәскеу, Мир даңғ., 101В, құр. 1. Тел./факс: (495) 648-0507, 616-00-29. Санитарлы-эпидемиологиялық сараптама № РОСС RU. AE51. H 16679 25.05.2015. Идел-Прессте басылып шығарылды.

Пікірлер (0)

Әзірге пікір жоқ.
An error has occurred. This application may no longer respond until reloaded. Reload 🗙