Ординалды типтер

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

type operator = (plus,minus,multi,divide);

color = (white,red,blue,yelow,purple,green);

Санақтап шығу типі ординалды типтер қатарына жататындығына байланысты ол элементтерге ord(x), pred(x), succ(x) функцияларын және қатынас операцияларынқолдануға болады. Бұл типтегі деректерді енгізу/шығару функциялары арқылы енгізуге және шығаруға болмайды, оларды программаның ішінде оның оқылуының және түсініктілігін жоғарылату үшін пайдаланады. Санақтап шығу типтермен жұмыс жасау мысалы Р21программасында көрсетілген.

Интервалды (аралық) тип – ол базалық деп аталатын, басқа алдын-ала анықталған ординалды типтің ішкі жиыны. Интервалды ілескен екі нүктелер арқылы ажыратылған ең үлкен және ең кіші мәндерін көрсетіп типтерді сипаттау бөлімінде беруге болады, мысалы:

type days=(mon,tue,wed,thu,fri,sat,sun);

workdays=mon..fri; index=l..30; letter='a'..'z';

Интервалды айнымалылар бөлімінде беруге болады: var а:1..100; b:-25..25;

Қолданылатын операциялар мен функциялар базалық типке қолданылатындай. Программада интервалдық типтерді қолдану жадыны үнемдеуге және программаның орындалу барысында меншіктеулерді қадағалауға мүмкіндік береді. Мысалы: егер k – жылдағы айдың нөмірі болатын болса, онда var k:integer; сипаттаудың орнына var k:l..12 жазуға болады.

7.2 Құрама құрылымдар

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

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

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

Жоғарыда құрама тип – массив қарастырылған еді. Ол біртипті элементтердің фиксацияланған мөлшер санынан тұратын тізбек. Массивтің барлық элементтері ортақ атуға (массив атауы) ие және индекстері арқылы ажыратылады. Индекстерді есептеуге болады, олардың типі ординалды болуы тиіс. Егер массивтер бірдей сипатталған болатын болса, онда оларды көшірмелеуге болады, мысалы: b:=a.

Программа Р22, массивті қолданып, а[1]=а[2]=1; a[k]=a[k-1]+a[k-2] к>2схема бойынша экранда Фибоначчидің алғашқы 20 санын шығарады.

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

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

5,3,2,4,1 → 5,3,2,1,4 → 5,3,1,2,4 → 5,1,3,2,4 → 1,5,3,2,4.

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

p:= true;

егер жұптарды қарап шығу барысында кемінде бір орын ауыстыру орын алған болса, р мәні қарама-қарсы мәнге ауыстыралады: p:=false; ол тізбектіліктің реттелгендігін және жұптарды қарап шығуды қайталау керек екендігін білдіреді. Егер кезекті қарап шығудан кейін p=true шарты орындалса қарап шығу циклі аяқталады. Бастапқы тізбектілік программада 10 элементтен – бүтін сандардан тұратын тұрақтылар массиві ретінде берілген.

Есептерді шешу барысында символдар тізбектерін пайдалану қажеттілігі жиі кездеседі. Оны символдар массиві ретінде сипаттауға болады, бырақ, Паскальда мұндай мақсаттар үшін арнайы тип бар: string[n] - n символдардан тұратын жол, мұндағы n ≤ 255. Айнымалы-жолдарды сипаттау тәсілдері массивтерді сипаттауға ұқсас.

· жолдық тип типтерді сипаттау бөлімінде, бұл типтегі айнымалылар – айнымалыларды сипаттау бөлімінде анықталады: type word:string[20]; var a,b,c: word;

· жолдық типті және айнымалыларды сипаттау бөліміндегі сәйкес айнымалыларды сипаттауды беттестіруге болады: var a,b,c: string[20]; d:string[30];

· жолдық айнымалыны және оның бастапқы мәнін тұрақты-жол ретінде анықтауға болады: const l:string[11]='информатика'.

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

Бір жолдық типтегі айнымалылар үшін лексикографикалық рет анықталған, ол символдық типтің реттелгендігіне байланысты:

'fife' < 'tree' {себебі 'f'<'t'}; 4 > '237' {себебі '4' > '2'}.

Жолдық типтегі шамалар үшін логикалық <, >, = операциялардан басқа коммутативті емес біріктіру операциясы анықталған, ол плюс таңбасы арқылы белгіленеді:

а:='кол ' + 'о'+'кол'; {нәтижедеа='колокол'}

Жолдық шамалар үшін келесі төрт стандартты функциялар анықталған:

· біріктіру - concat(s1,s2,..,sk); функцияның мәні - s1,s2,...,sk жолдарды біріктіру нәтижесі, егер ол қамтыған символдар саны 255-тен аспайтын болса;

· ерекшелеу - copy(s,i,k); s жолдан i-ші символдан бастап k символдар ерекшелінеді: а:=сору('крокодил',4,3) ; {нәтижеде а='код'};

· жолдың ұзындығын анықтау - length(s); s жолдың ағымдағы мәнін құрайтын символдар саны есептеледі: b:=length('автоматика'); {b=10};

· позицияны анықтау - pos(s,t); s жол t жолға бірінші рет кірген позиция нөмірі есептеледі; егер s жол t жол құрамына кірмеген болса, онда нәтиже 0-ге тең: с:=pos('ом','компьютер'); {с=2}.

Сонымен қатар, Паскальда жолдық шамаларды өндеуге арналған төрт стандартты процедуралар анықталған:

· жою - delete(s,i,k); s жолдан i-ші символдан бастап k символдар жойылады: s:='таракан'; delete(s,5,2); {нәтижедеs='таран'};

· кірістіру - insert(s,t,i); i-ші позициядан бастап s жол t жолға кірістіріледі t:='Tapaн’; insert('ка',t,5); {t='таракан'};

· санды символдар жолына түрлендіру - str(k,s). k санына апострофтарды қосу арқылы s жолы пайда болады: str(564,s); {s='564'};

· цифрлардан тұратын жолды санға түрлендіру - val(s,k,i); егер s жолда цифрлардан өзге символдар болмаса і саны i=0, керісінше жағдайда i цифрдан өзге бірінші символдың позициясына тең: val('780',k,i); {k=780; i=0}.

Р24 программасындажолдықшамаларды пайдаланып 100 символдан аспайтын мәтіндегі дауысты әріптер саны анықталады. Бұл жерде 18 кіші және үлкен әріптерден тұратын тұрақты-жолды анықтап, берілген мәтіннің кезекті символы тұрақты-жолдың элементі болатындығын цикл ішінде тексерген ыңғайлы. Р25 программасындаsqr функциясы ехр функцияға алмастырылады, оған delete және insert процедураларын ретімен қолдану арқылы қол жеткізеді. Р26 программасында 10 латын сөздері енгізіліп алфавит бойынша реттеледі. 10 элемент-жолдардан тұратын массив анықталған және оның элементтері көпіршік әдісі арқылы реттелген.

 

 

10.4 Жалғау операторы (with)

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

with Date do

if month = 12 then

begin

month := 1;

year := year + 1

end else

month := month + 1;

Бұл келесіге эквивалентті:

if Date.month = 12 then

begin

Date.month := 1;

Date.year := Date.year + 1 end else

Date.month := Date.month + 1;

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

Келесі айнымалылар жарияланған болсын дейік:

Type Point = record

x,y: integer; end;

var

x: Point;

y: Integer;

Бұл жағдайда х-ке де у-ке де айнымалыға немесе жазбаның өрісіне сияқты сілтеу жасауға болады. Операторда:

with x do

begin

x := 10;

y := 25;

end;

with және кілттік сөздердің арасындағы х нұсқағыш типтегі айнымалыға қатысты, ал құрама операторда x пен y x.x пен y.y –терге сілтеп тұр.

with V1,V2,...Vn do s; оператор

келесі операторларға эквивалентті.

with V1 do

with V2 do

...

with Vn do

S;

Екі жағдайда да, егер Vn - v1-дің де v2-нің де өрісі болып табылса, онда ол v1.Vn емес v2.Vn ретінде интерпретацияланады.

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

Сонымен, with оператор жазбаның өрістеріне, сонымен қатар, объекттің өрістеріне, әдістеріне және қасиеттеріне сілтеу жасауды қысқартуға мүмкіндік береді. Ол келесі түрге ие:

withжазба немесе объект аталуыdoоператор

немесе

withатаулар тізіміdoоператор

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

var

DateOfBirthday=record

Day: Integer;

Month: Integer;

Year: Integer;

end;

Онда with операторын пайдаланбай оның өрістеріне мәндерді меншіктеу түрі:

DateOfBirthday.Day:=23;

DateOfBirthday.Month:=2;

DateOfBirthday.Year:=1965;

with операторын пайдалану арқылы алдыңғы жазуды қысқартуға болады:

with DateOfBirthday do

begin

Day:=23;

Month:=2;

Year:=1965;

end;

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

var

x,y,z: integer;

a: record

x,y: integer;

end;

b: record

x: integer;

end;

онда программаның келесі фрагменті:

with a,b do

begin

x:=1; y:=2; z:=3;

end;

келесі фрагментке эквивалентті:

with a do

with b do

begin

x:=1; y:=2; z:=3;

end;

сонымен қатар және келесі фрагментке эквивалентті

b.x:=1;

a.y:=2;

z:=3;