Функцияны сипаттау
Turbo Pascal-да процедуралардан басқа да ішкі программалардың түрі бар – олар функциялар. Нақты мысал қарастырайық.
Turbo Pascal-да берілген санның берілген дәрежесін сипаттайтын стандартты функция жоқ. Дегенмен, сондай функцияны өзіміз жасауға ешқандай бөгет жоқ. Дәрежені есептейтін функция анықталған программаның схемасы төмендегідей болады. (функция дәрежесін есептейтін сан да, сол сияқты дәреже көрсеткіші де бүтін сандар болсын).
Program example;
…
{белгілерді, тұрақтыларды, типтерді және айнымалыларды сипаттау бөлімі}
...
Function Power (Num, Pow:integer):integer;
Var i:integer; a:real;
Begin {функция денесінің басы}
a:=num;
for i:=1 to pow do
a:=a*num;
power:=a
end; {функция денесінің соңы}
…
Begin {программа денесінің басы}
…
Read(a,b);
X:=power(a,b)+y; {функцияға қатынас жасау}
…
End.{программа денесінің соңы}
Example программасында Power функциясы сипатталған. Программаның осы схемасында функцияның сипаттамасы (процедурадағыдай) сипаттау бөлімінің соңында болу керектігі көрініп тұр. Функция құрылымы (процедура сияқты) программа құрылымын қайталайды. Бірінші Function резервтелген сөзінен басталатын тақырып жолы болады. Одан кейін бос орыннан соң жақшаның ішінде формальды параметрлер тізімі көрсетіледі (Num – дәрежесі есептелінетін сан, Pow – дәреже көрсеткіші), осыдан кейін қос нүкте, оның соңынан функцияның мәнінің типі көрсетіледі. Тақырып жолы үтір-нүктемен (;) аяқталады. Функция тақырыбынан кейін оның сипаттау бөлімі орналасады. Қарастырылып отырған функцияда небәрі екі айнымалы ғана анықталған, бірақ программадағы сияқты мұнда да белгілерді, тұрақтыларды, Power функциясының ішіне салынған басқа да процедуралар мен функцияларды жариялауға болады.
Функцияның сипаттау бөлімінен соң оның денесі орналасады. Функцияның денесі операторлық жақшаларға алынған операторлар тізбегінен тұрады.
Power функциясына қатынас жасау үшін программа денесінде қажетті жерге оның атауын көрсету жеткілікті.
Ескерту:
-
Шақыру операторының (процедура атауы, және де нақты параметрлер болуы мүмкін) көмегімен белсендірілетін процедуралардан ерекшелігі - функция атауы өрнекке қатысады. Осы функцияға қатынас жасау мысалын Example программасынан көреміз;
-
Функцияның процедураға қарағанда басқа да ерекшеліктері болады. Мысалы, функцияны қолдану нәтижесінде қандай-да бір мән қайтарылады. Функция қайтаратын мәннің типі функцияның сипаттамасында (тақырып жолында) көрсетіледі. Егер процедура атауы оны шақыруға ғана қолданылса, функция атауы қандай-да бір қайтарылатын мәнмен байланысты болады;
-
Функцияның процедурадан тағы да қандай айырмашылығы бар? Функция қандай-да бір мән қайтаруы тиіс болғандықтан, оның денесінде міндетті түрде оң жағында функция атауы көрсетілген меншіктеу операторы болуы керек;
-
Қай кезде процедураны, қай кезде функцияны қолданған дұрыс? Бұл нақты жағдайға байланысты. Егер ішкі программа бір ғана мәнді есептейтін болса, оны функция ретінде жүзеге асыруға болады. Егер ішкі программадан бірнеше мәндерді есептеу талап етілсе, оны процедура ретінде орындаған дұрыс.
Параметрлер
Функциялар мен процедураларды қолданған кезде параметрлер өте маңызды орын алады. Алдыңғы мысалда Line процедурасын қажетті формальды параметрлермен безендірген болатынбыз. Және де Example программасының денесінде қажетті мәндерді пернетақтадан енгізуге мүмкіндік беретін Read(a,b) операторы енгізілген. Осыдан кейін осы мәндермен Line процедурасы шақырылады (Line(a,b)). Мұндағы a және b нақты параметрлер болып табылады.
Сонымен, Line процедурасын шақырған кезде a және b айнымалылары процедураның ішіне ch және ln формальды параметрлерінің көмегімен беріледі.
ПАРАМЕТРЛЕРДІ ПАЙДАЛАНУ АЙМАҒЫ
Қарастырылатын сұрақтар:
-
Процедура параметрлері;
-
Паскаль тілінің негізгі блоктары;
Процедура тақырыбында сипатталған параметрлер (белгілер, тұрақтылар, айнымалылар) жергілікті объектілер деп аталады. Олар тек осы процедура ішінде анықталушы болып саналады да негізгі программада пайдаланылмайды. Бұл объектілердің барлығы процедура іске қосылғанда ғана пайда болады да, процедура жұмысын аяқтағанда жойылады. Егер бір негізгі программа құрамында жұмыс істеудің бір айнымалысы, мысалы А кездесетін болса, онда ол әр процедурада, әр айнымалы болып саналады яғни, әрбір процедурада ішіндегі объектілер соның ішінде анықталған жергілікті объект болып табылады. Ал негізгі программаның сипаттау бөлімінде анықталған объектілер сол программаның өзінде де оның ішінде қосалқы программада да (процедуралар, функциялар) пайдаланыла береді. Өйткені олар ортақ (ауқымды) объектілер мен оның ішкі қосалқы программалар арасында мәлімет алмасу тек нақтылы параметрлер ғана емес, осы ортақ объектілер арқылы да жүргізіледі. Егер бір идентификатор, мысалы, В негізгі программада да және оның ішкі программасында да сипатталып анықталған болса, ол ортақ объект ретінде қарастырылады. Бірақ процедура ішінен ортақ объектіні пайдалана алмаймыз. Өйткені ол сол атаумен белгіленген ішкі жергілікті объектімен алмасқан болып саналады. Паскаль программалау тілінде процедуралар мен функцияларды бірінің ішіне бірін салып қабаттай беруге рұқсат етілген. Негізгі программада сипатталған процедура ішінде басқа да ішкі процедуралар мен функциялар сипатталуы мүмкін. Мұндайда шақыратын процедурада анықталатын объектілер оның ішкі процедурасына ауқымды, яғни ортақ объектілері болып табылады.
Сонымен әр түрлі блоктарда сипатталған объектілерді дұрыс пайдалану үшін мынандай ережелерді орындаған жөн:
-
Кез келген бір блокта сипатталған объектілер атаулары осы блоктың өзінде және ішкі блоктарындағы белгілі болып табылады.
-
Бір блокта сипаттаған объектілер бір – бірінен бөлек болуы тиіс. Ал, әртүрлі блоктардағы атаулары бірдей объектілер бола береді.
-
Егер блокта сипатталған бір объектінің атауы оның сыртқы блогында кездесетін болса, онда сыртқы блоктағы сол объект ішкі блокта пайдаланылмайды.
Осы ережелерді 1-суреттегі құрылымға пайдаланайық.
Осы суретке қарап мынадай тұжырымдардың дұрыстығына көз жеткіземіз: В блогында анықталған объектілер осы блокта және С, D блоктарында пайдаланыла береді. Бірақ, А блогында белгісіз болып табылады. F блогында анықталған объектілер тек осы блокта анықталуы тиіс.
Мысалы: Дөңес төртбұрыштың төрт қабырғасымен бір диоганалінің ұзындығы бойынша оның ауданын тауып көрейік.
Дөңес төртбұрыштың диогоналі оны екі үшбұрышқа бөледі. Әрбір үшбұрыштың ауданын табу үшін белгілі Герон формуласын қолданамыз.
P
2-сурет. ABCD төртбұрышы.
= ;
S= ;
Бұл төртбұрыштың ауданын табу үшін үшбұрыштың программасын 2 рет пайдаланамыз.
Program B20;
Var AB, BC, CD, DA, AC, S1, S, a, b, c, P: real;
Procedure Str1;
Begin
P:= (a+b+c)/2;
S:= sqrt (P*(P-a)*(P-b)*(P-c));
End;
Begin
Real (AB, BC, CD, DA, AC) ;
а:=AB, b:=AC, c:=CD;
Str1;
S1:=S1+S;
Write (‘S1=’, S1);
End.
Бұл программада Str1 процедураны 2 рет пайдаландық. Әр пайдалану алдында а, b, с айнымалылар жаңа мәндер қабылдап отырды, мұндағы а,b,с айнымалылары негізгі программада да, процедурада да пайдаланылды. Яғни оларды ортақ айнымалылар ретінде қарастыру керек. Ал, Р айнымалысы тек процедурада ғана пайдаланылды. Сондықтан оны ортақ емес жергілікті айнымалы ретінде қарастырылып, тек қосалқы программада сипаттау жеткілікті.
8-ДӘРІС Паскальдағы деректердің пайдаланушы типтері.
-
Деректердің пайдаланушы типтерінің сипаттамасы.
-
Типтердің үйлесімділігі. Жазулар.
-
Бекітілген бөлігі бар жазулар.
-
Нұсқалы жазулар.
ЖАЗБАЛАР
Массив сияқты жазба да көп мәліметтен тұрады. Бірақ массивтен айырмашылығы - жазбада әртүрлі типтерге жататын элементтер болуы мүмкін. Осыған байланысты жазбаның әртүрлі элементтеріне қол жеткізу механизмі ерекшеленеді. Массивте элементтердің орны индекс бойынша анықталады және массив элементтерін әртүрлі тәсілмен сұрыптауға болады. Ал жазбаға келетін болсақ, мұнда әр элементтердің жеке атауы бар, ал сұрыптау амалының мағынасы жоқ. Жазба (мәліметтердің комбинацияланған типі) қандай-да бір объект туралы ақпаратты біріктіруге қолайлы. Мұндай мәліметтер қандай-да техникалық құрылғының сипаттамалары немесе өндіріс орнының экономикалық мәліметтері немесе адам туралы мәліметтер болуы мүмкін. Жазбаны құратын элементтер өріс деп аталады.
Жазбаны сипаттау келесі түрге ие:
а=record
x,y:m;
. . .
z:n
end;
Мұндағы, а - комбинацияланған типтің атауы. RECORD және END резервтелген сөздер, бұлар жазба және соңы мағынасын береді, x,y,z - өріс атаулары, m,n- өрістер жататын типтер. RECORD сөзінен кейін үтір-нүкте қойылмайды. Жеке өрістердің сипатталуы үтір-нүктемен аяқталады.
Жазба өрістерін сипаттау кәдімгі айнымалыларды сипаттауға ұқсас. Өрістер кез-келген типке жата алады, яғни қарапайым, сол сияқты құрылымданған, сол сияқты стандартты қолданушы анықтаған типтерге жатуы мүмкін. Мысалы, өрістерінің өзі массив немесе жазба болатын жазбалар болады.
Жазба өрістері туралы бірнеше ескертулер:
-
Жазбадағы өрістер саны бекітілген және жазбаны сипаттау кезінде анықталады;
-
Жазба аясында өрістер атаулары қайталанбау керек;
-
Егер программада бірнеше комбинацияланған типтер жарияланса, онда әртүрлі типтерге жататын өріс атаулары қайталана беруіне болады. Мұндай жағдайда атау конфликтілері болмайды. Себебі жеке өрістерді шақыру жазба атауын көрсету арқылы жүзеге асырылады;
-
Программадағы басқа идентификатор сияқты өріс атаулары ондағы ақпараттың мағынасына сәйкес болуы керек.
Мысал ретінде адамдар туралы мәліметтерді алайық. Осы жазбаны сипаттау кезінде программа төмендегідей сипатталады:
type
Employee=record
ID:word;{идентифиатор (жеке. номер)}
FirstName, SecondName, SurName: string 20;
{Аты, Тегі, Әкесінің аты}
Standing:byte; {өтілі}
Salary:real; {еңбекақысы}
End;
Var
Assistant: Employee;
Жоғарыда сипатталған Employee комбинацияланған типі 6 өрістен тұрады. Олардың 3-і - FirstName, SecondName, SurName - әрбіреуі 20 символдан тұратын жолдарды көрсетеді, қалғандары ID, Standing, Salary - мазмұнына сәйкес келетін типтері бар өрістер. Employee типтеріне жататын бір жазбаның мазмұны төмендегідей болады.
ID SurName FirstName SecondName Standing Salary
14873 Петров Иван Кузмич 15ж. 1000 сом.
Жоғарыдағы мысалда келтірілген ассистент айнымалысының әр түрлі өрістерін шақыру үшін төмендегідей көрсетуге болады.
Assistant.ID:=19876
Write(Assistant. FirstName);
Read(Assistant. SecondName);
Assistant. SurName:=” Петров”;
A:= Assistant. Standing;
B:= Assistant. Salary\100;
Басқаша сөзбен айтқанда, жазба өрістерімен амалдарды типін есепке ала отырып, кәдімгі айнымалылармен жұмыс істеген сияқты орындаймыз. Жоғарыдағы мысалда фамилия, аты, әкесінің атын көрсетуге арналған өрістер жолдар болып табылады. Сондықтан осы жолдардағы символдардың кез келгенін көрсету үшін жазба атауын, өріс атауын және жолдардағы символ нөмірін көрсету жеткілікті. Осындай шақыру төмендегідей болады және бұл оператор адам атының бірінші әрпін экранға шығарады.
Write (Assistant. FirstName [1]);
Мысалы: адамның аты мен әкесінің атынан инициалын алу қажет болсын. Онда:
Write(‘Петров’);
Write(Assistant. FirstName[1],’.’);
Write (Assistant.SecondName [1],’.’);
Осы операторлар тізбегінің жұмыс нәтижесі төмендегідей.
Петров И.К.
With операторы
Егер операторда құрама атаулар қолданылса, онда мұндай операторлар тым үлкен көлемде болады. Осындай жағдайда жазба атауын өріс атауларының сыртына шығарып, өрістермен әр түрлі әрекеттер орындай аламыз. Ал жазба атауын тақырып ретінде қоюға болады. Мұндай тақырыпты жасауға With операторы мүмкіндік береді. With операторының түрі төмендегідей.
With p do s;
Мұнда With және do резевтелген сөздері қолданылған, олар сәйкесінше осыдан бастап және орындау мағыналарына ие. P идентификаторы - комбинацияланған типті айнымалының атауы, S - оператор (көбінесе құрама).
Жоғарыда көрсетілген мысалдағы Assistant жазбасының 6 өрісін шақыруды төмендегідей ұйымдастыруға болады.
With Assistant do
Begin
ID:=19876;
Write(FirstName);
Read(SecondName);
SurName:= ‘Петров’;
a:=Standing;
b:=Salary/100
end;
Бұл жерде Assistant айнымалысы With операторынан кейін бір рет қана қолданылып тұр. Содан кейін өрістермен барлық амалдар тек қана өріс атауын көрсету арқылы орындалып тұр.
Жазбалармен жұмыс істеуге бір мысал келтірейік.
program Stud;
uses crt;
type
student=record
fam:string[20];
aty:string[10];
jasy:integer;
end;
var
top:student;
i:integer;
a:array[1..5] of student;
begin
clrscr;
with top do
begin
for i:=1 to 5 do
begin
writeln(i,'-student');
write('fam:'); readln(fam);
write('aty:'); readln(aty);
write('jasy:'); readln(jasy);
a[i]:=top
end;
end;
for i:=1 to 5 do
begin
with a[i] do
writeln(fam:20,aty:10,jasy:5);
end;
readln;
end.
Бұл мысалда type бөлімінде сипатталған комбинацияланған тип Student үш өрістен тұрады: fam:string[20]; aty:string[10]; jasy:integer; Айнымалыларды сипаттау бөліміндегі top айнымалысы типі Student болатын жазба. Осыдан кейін
әр элементінің типі Student болатын а массиві жарияланған. Ары қарай, цикл денесінде топтың әрбір студентінің фамилиясын, атын және жасын енгіземіз. Келесі цикл денесінде оларды экранға шығару ұйымдастырылған.
Иерархиялық жазбалар(бірінің ішіне бірі салынған жазбалар)
Жеке өрістің өзі жазба болып келетін жазбалар болады. Жоғарыда сипатталған employeе комбинациялық типінің сипаттамасына екі жазба өрісін қосайық. Бұл өрістер қызметшінің мекен-жайы (пошталық индексі, қала, көше, пәтер, үй) және оның туған күні (күні, айы, жылы) туралы ақпаратттан тұратын екі өріс қосайық. Осы өрістерді employeе комбинациялық типінің сипаттамасына тікелей қосуға болады бірақ, осы ақпаратты кейін басқа да комбинацияланған типке де пайдаланатын болсақ, программа сипатталғанда жеке тип ретінде жазған қолайлы. Содан кейін employeе типіне өріс ретінде қосамыз. Мысалы:
Type
Adress=record
Post Code:1..9999999;{ пошталық индекс}
City, street: string[20]; { қала, көше}
House: word; {үй}
Apartment: word {пәтер}
End;
Datе=record
Day:1..31;{күні}
Month:1..12;{айы}
Year:1900..2000{жылы}
End;
NewEmployeе=record
ID:word;
First name, second name, sur name: string [20];
Starding: byte;
Salary: real;
BirthDatе: Datе;
Habitation: address;
End;
Var
New Assistant: new employeе;
Жоғарыда сипатталған NewEmployeе комбинациялық типінде сегіз өріс бар. Олардың екеуі BirthDatе, Habitation өздері жазба болып табылады. Олардың типтері Datе, Address болып табылады, олар NewEmployeе типінің алдында жарияланған. Ішкі жазбалардың өрістеріне қол жеткізу үшін негізгі өріс атауы, ішкі жазба өріс атауы және өріс атауынан тұратын құрама атауды көрсету керек.
NewEmployeе.Address.PostCode
немесе
NewEmployeе.Date.Day
Егер, жазбалар бірнеше деңгейлі ішкі жазбаларға ие болса, онда құрама атаулар өте ұзын болады. Осы жағдайда жоғарыда сипатталған With операторы қолданады. 3-суретте NewEmployeе комбинациялық типінің құрылымы көрсетілген.
9-ДӘРІС Паскальдагы графика.
-
Графика. Графикалық координаттар.
-
Мәтіндік және графиктік режимдер.
-
Мәтіндік және графикалық режимдер арасындағы ауысулар.
-
Графиканы бағдарламалау принциптері.
-
Графикалық режимді инициализациялау.
-
Графикалық қарапайымдарды шығару.
-
Graph модулінің процедуралары және функциялары.
Графикалық және текстік режимдер
Graph модулінің құралдары экранда тұтас экранға шығарылатын немесе қосымша жасалған терезелерге шығарылатын әртүрлі түрлі-түсті бейнелерді жасауға мүмкіндік береді. Сызықтар мен толтырулардың бірнеше типтері қолданылады. Шрифттардың масштабталуына икемделетін жиынтық бар. Модульдің бірқатар ішкі программалары экранда әртүрлі толтырылған және толтырылмаған фигураларды бейнелеуге мүмкіндік береді.
Графикалық режимге өту
Экранға қандай-да бір бейнені шығаруды жүзеге асыратын Graph модулінің процедуралары мен функцияларын пайдалану үшін алдымен графикалық режимді іске қосу (инициировать) қажет. Графикалық режимге өтуді InitGraph процедурасы жүзеге асырады.
InitGraph процедурасы видеоадаптердің графикалық режимге өтуін жүзеге асырады. Тақырыбы:
Procedure InitGraph(var Driver, Mode: Integer; Path: string);
Мұндағы Driver – графикалық драйверді анықтайтын параметр; Mode – көрсетілген драйвер үшін мүмкін графикалық режимдердің біреуін көрсететін параметр; Path – графикалық драйвер файлының атауы (немесе жолы);
Егер Path параметрінің мәні бос жолға сәйкес келсе, драйвер файлын іздеу ағымдағы каталогта жүргізіледі.
Driver параметрінің мәні Graph модулінде жарияланған тұрақтылардың жиынтығымен шектеледі. Бұл тұрақтылардың атауы мен мәндері төмендегі 1-кестеде көрсетілген.
1-кесте.
Тұрақты атауы
|
Сандық код
|
Detect
|
0 (Автоанықтау)
|
CGA
|
1
|
MCGA
|
2
|
EGA
|
3
|
EGA64
|
4
|
EGAMono
|
5
|
IBM8514
|
6
|
HercMono
|
7
|
ATT400
|
8
|
VGA
|
9
|
PC3270
|
10
|
Достарыңызбен бөлісу: |