Оператор

немесе

for айнымалы:=бастапқы мән downto соңғы мән do оператор

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

Егер for... to циклы үшін цикл айнымалысының бастапқы мәні соңғы мәннен үлкен болса немесе for... downto циклы үшін цикл айнымалысының бастапқы мәні соңғы мәннен аз болса, онда цикл тұлғасы бір де бір рет орындалмайды. Егер цикл процедурада немесе функцияда пайдаланылатын болса, онда циклдың параметр-айнымалысы локальды ретінде сипатталуы тиіс.

for в Pascal ABC –да цикл тұлғасы бос болуы мүмкін емес. Циклдың параметр-айнымалысын цикл ішінде өзгерту логикалық қате болып табылады. Мысалы, бірінің ішіне бірі салынған for операторы бар келесі фрагмент қате болып табылады:

for i:=1 to 10 do

for i:=1 to 5 do

write(i);

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

var

en: (red,green,blue,white);

c: char;

...

for en:=red to blue do

write(Ord(en):2);

for c:='a' to 'z' do

write(c);

for циклының негізгі кемшілігі ол цикл параметрін тек 1-ге ғана өсіруге немесе азайтуға мүмкіндік беретіндігінде. Оның негізгі артықшылықтары қатарына ықшамдық және мәндер аралығында символдық және санақтап шығу типтерін пайдалану мүмкіндігі жатады.

Бірнеше мысалдарды қарастырайық.

Блок-схемаларда for цикл операторына 10.4 суреттегі құрылым сәйкес.

Сурет 10.4 - for операторың жұмыс жасау блок-схемасы

Мысал 10.4. Есептегішті ұйымдастыру алгоритмі. Кейбір тізбектілік берілген. Тізбектіліктің оң таңбалы мүшелер санын анықтау керек.

Program P10_4;

Var

a: real;

n, L: integer;

Begin

L:= 0;

for n:= 1 to 50 do

begin

a:= cos(2 * n - 1);

if a>0 then L:= L + 1;

end;

writeln('L=‘, L);

End.

10.4 Ішкі циклдерді құрастыру (массивтерді өндеу, массив компоненттерін реттеу есептерінің мысалдары негізінде)

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

Ішкі цикл тұлғасының қайталануының толық саны ішкі және барлық сыртқы циклдардың итерациялар санының көбейтіндісінен аспайды. Мысалы, әрқайсысы 10 итерациядан тұратын бірінің ішіне бірі салынған үш циклді алсақ сыртқы цикл 10 рет, екінші деңгейдегі цикл 100 рет және ең ішкі цикл 1000 рет орындалады.

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

Бірінің ішіне бірі салынған циклдардан шығу проблемасының бірнеше шешімдері бар. Ең қарапайымы – кірістірілген циклдан кейін тікелей ілескен программаның нүктесіне шығу үшін шартсыз өту goto операторын қолдану.

Альтернатива — қажет болған жағдайларда өндеуді дер кезінде аяқтауды талап ететін арнайы жалаушаларды қойып циклдарды аяқтаудың штатты құралдарын пайдалану. Кемшілік — кодтың күрделенуі, өнімділіктің төмендеуі.

Кірістірілген циклды процедурада орналастыру.

Мысал 10.5. Нақты сандардың матрицасында әр жолдағы бірінші элементті сол жолдағы минималды элементпен орындарын ауыстыру керек. Алмастырудан кейін пайда болған Х матрицаны экранға шығару.

Program P10_5;

Var X: array [1..3,1..6] of real;

i, j, jmin: integer; min: real;

Begin

writeln('Х матрицаны енгізіңіз');

for i:= 1 to 3 do

for j:= 1 to 6 do read(x[i,j]);

for i:=1 to 3 do

begin

min:=+1E6;

for j:=1 to 6 do

if x[i,j]<min then

begin

min:=x[i,j];

jmin:=j;

end;

x[i,jmin]:=x[i,1];

x[i,1]:=min;

end;

for i:=1 to 3 do

begin

for j:=1 to 6 do write (x[i,j]:6:1);

writeln;

end; End.

Мысал 10.6. Нақты сандардың матрицасы берілген. P1 және P2 – сәйкесінше матрицаның оңтаңбалы және терістаңбалы элементтерінің көбейтіндісі болатын Z мәнін есептеу керек.

Program P10_6;

Var A: array [1..4, 1..6] of real;

i, j: integer; P1, P2, Z: real;

Begin

writeln(‘А матрицаны енгізіңіз');

for i:= 1 to 4 do

for j:= 1 to 6 do read(a[i,j]);

P1:= 1;

P2:= 1;

for i:= 1 to 4 do

for j:=1 to 6 do

begin

if a[i,j]>0 then P1:= P1 * a[i,j];

if a[i,j]<0 then P2:= P2 * a[i,j];

end;

Z:= P1*abs(P2);

writeln(‘Z=’, Z:10:2); end.


Лекция

11.1 Жолдық деректер

Символдардан тұратын жолдар туралы біз 6-ші лекцияда әнгімелескенбіз. Pascal ABC-те жолдар string типіне ие және саны 255-тен аспайтын символдардан тұрады. Сипаттау барысында:

var s: string;

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

Жадыны үнемдеу үшін сипаттаудың келесі түрі көзделген:

var s1: string[40];

Бұл жағдайда жол үшін 41 байт орын беріледі (нөлінші байт – жолдың ұзындығына). s1 айнымалыға 40 символдан асатын жолды меншіктеген жағдайда артық символдар алынып тасталады да s1 жолдың ұзындығы 40 байт болып есептеледі.

s1+s1 түрдегі конкатенация операциясы орындалғанда нәтиже string типті жол болып саналады, яғни 256 байт орын алады. Бырақ, егер конкатенация барысында нәтиже 255 символдан артық орын алатын болса, онда программа қателікпен аяқталады.

Жолдағы символдарға индексті пайдалану арқылы сілтеуге болады: s[i] – жолдағы i-ші символды белгілейді. Нөлінші s[0] символға сілтеу қате болып саналады. Жолдың ұзындығын өзгерту үшін SetLength процедурасын пайдалану керек. Егер индекс i жолға берілген жадының шегінен шығып кететін болса, онда қате туралы хабарлама беріледі. Бырақ, егер индекс i тек жол ұзындығының шектерінен ғана шығып кетсе, онда қате туралы хабарлама берілмейді.

Жолдармен жұмыс жасауға арналған стандартты процедуралар мен функциялар кестеде келтірілген

Кесте 11.1

Жолдармен жұмыс жасауға арналған стандартты процедуралар мен функциялар

Аталуы және параметрлер Процедура немесе функция Параметрлердің типтері Қайтарылатын мәннің типі Амал
Length(s) функция s - string integer s жолдың ұзындығын қайтарады
Copy(s,index,count) функция s - string, index, count - integer string index позициясынан бастап s жолдың ұзынды-ғы count болатын ішкі жолды қайтарады
Delete(s,index,count) процедура s - string, index, count - integer   index позициясынан бастап s жолдың count символдарын жояды
Insert(subs,s,index) процедура s, subs - string, index - integer   index позициясынан бастап s жолға subs ішкі жолды кірістіреді
Pos(subs,s) функция s, subs - string integer s жолда бірінші рет кездесетін subs ішкі жолдың позициясын (немесе егер ішкі жол табылмаса 0) қайтарады.
SetLength(s,n) процедура s - string, n - integer   s жолдың ұзындығын n-ге тең етіп орнатады
Str(x,s) Str(x:n,s) Str(x:n:m,s) процедура s - string, x - integer, n, m - integer   x-ті жолдық бейнелеуге түрлендіреді (2-i және 3-i жағдайда n және m арқылы орнатылатын форматқа сәйкес) және нәтижені s жолға жазады
Val(s,v,code) процедура s - string, v - integer, code - integer   s жолды сандық бейнелеуге түрлендіреді де нәтижені v айнымалыға жазады. Егер түрлендіру мүмкін болса онда code айнымалыға 0, егер мүмкін болмаса онда code-ге нөльдік емес мән қайтарылады.
Concat(s1,...,sn) функция s1,..., sn - string string s1,..., sn жолдардың қосылу нәтижесі болып табылатын жолды қайтарады. Нәтиже s1+s2+...+sn өрнектін нәтижесімен бірдей
IntToStr(i) функция i - integer string бүтін санды жолға түрлендіреді
StrToInt(s) функция s - string integer жолды бүтін санға түрлендіреді. Егер түрлен-діру мүмкін болмаса, онда қате орын алады
FloatToStr(r) функция r - real string нақты санды жолға түрлендіреді
StrToFloat(s) функция s - string real жолды нақты санға түрлендіреді. Егер түрлен-діру мүмкін болмаса, онда қате орын алады
UpCase(c) функция c - char char жоғары регистрге түрлендірілген с символды қайтарады
LowCase(c) функция c - char char төменгі регистрге түрлендірілген с символды қайтарады
UpperCase(s) функция s - string string жоғары регистрге түрлендірілген s жолды қайтарады
LowerCase(s) функция s - string string төменгі регистрге түрлендірілген s жолды қайтарады
Trim(s) функция s - string string s жолдың бастапқы және соңғы бос орындары жойылған көшірмесін қайтарады
TrimLeft(s) функция s - string string s жолдың бастапқы бос орындары жойылған көшірмесін қайтарады
TrimRight(s) функция s - string string s жолдың соңғы бос орындары жойылған көшірмесін қайтарады

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

Жеке символдармен жұмыс жасау үшін char типті айнымалылар сипатталады:

var ch:char;

{... }

ch:='y';

char типтегі бір айнымалы ASCII-символдың бір коды туралы ақпаратты сақтайды. Мұны мысалы, тұтынушының клавиштерді басу әрекеттерін бақылау үшін пайдалануға болады. Мұндай программаның вариантарының біреуіне мысал келтірейік:

var ch:char;

begin

repeat

writeln;

write ('Жалғастыру? (Y/N)');

readln (ch);

if (ch='Y') or (ch='y') then begin

{Бұл жерде қажетті есептеу үрдісі программаланады}

end

else if (ch='N') or (ch='n') then halt

{Программаның аяқталуы}

else writeln ('Y немесе N басыңыз');

until false;

end.

Символдардың кодтарымен жұмыс жасау үшін негізгі 2 функция бар:

function ord(x):char; х символдың ASCII-кодын қайтарады

function chr(x: byte):char; х ASCII-коды көрсетілген символды қайтарады.

Паскальда пайдаланылатын DOS кодировкасының символдар кестесін шығару үшін соңғы функцияны қолданайық:

var i,j:integer;

begin

writeln;

write ('ASCII-кодтар [32..255]');

for i:=2 to 15 do begin

writeln;

write (i*16:3,' ');

for j:=0 to 16 do write(chr(i*16+j),' ');

end;

writeln;

write ('ENTER шығу үшін...');

readln;

end.

Бұл жерде кодтары 32 ден 255 дейін болатын символдар ғана шығарылады, себебі кодтары 0 ден 31 дейін болатын алғашқы 32 символдар – баспаға шығарылмайды (мысалы, табуляциялау, жолды қайтару).

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

write ('Символ енгізіңіз: '); readln (ch);

if ch in ['A'..'Z'] then

write ('Үлкен латын;')

else if ch in ['a'..'z'] then

write ('Кіші латын;')

else if (ch in ['А'..'Я']) then

write ('Үлкен орыс;')

else if (ch in ['а'..'п']) or

(ch in ['р'..'я']) then

write ('Кіші орыс;')

else if ch in ['0'..'9'] then

write ('Цифр;')

else write

('Бұл алфавитті-цифрлы символ емес;');

write (' Сіздің символыңыздың коды= ',ord(ch));

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

var ch:char; i:integer;

begin

repeat

for i:=1 to random(72) do write ('*');

writeln;

write ('Жалғастыру? (Y/N)');

readln (ch);

until upcase(ch)='N';

end.

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

procedure upcase_ru (var s:string);

var i,l,c:integer;

begin

l:=length(s);

for i:=1 to l do begin

c:=ord(s[i]);

if (c>=ord('а')) and (c<=ord('п'))

then c:=c-32

else if (c>=ord('р')) and (c<=ord('я'))

then c:=c-80;

s[i]:=Upcase(chr(c));

end;

end;

var s:string;

begin

writeln ('Мәтіннің бір қатарын енгізіңіз:');

readln (s);

upcase_ru (s);

writeln ('Түрленген жол:');

writeln (s);

end.

Программада DOS кодировкасында кириллицаның символдары ретімен ілескен сандар арқылы кодталмағандығы ескерілген. Сонымен қатар, программада оған деректердің string (жол) типі сәйкес келетін символдар массиві пайдаланылады.

Жол - символдар, яғни char типтегі элементтер массиві. Жолдағы символдарды нөмірлеу әрдайым бірден басталады. Паскальда жолға деректердің string типі сәйкес. Жол келесі түрдегі оператор арқылы сипатталады:

var Жол_аталуы: string [ ұзындық ];

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

var s1:string;

s2:string[20];

s3:array [1..20] of string;

Мұндағы s1 – ұзындығы үнсіз бойынша жол, s2 - 20 символдан тұратын жол, s3 - әрқайсысы жадыдан 256 байтқа дейін орын алалатын 20 жолдан тұратын массив (қосымша байт жолдың ұзындығын сақтау үшін қажет).

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

s1:='А.Т. Апсеметов'; s1 жолға жолдық тұрақтының мәні меншіктелген.

s1[3]:=’В’; жолдың жеке s1 символына символдық тұрақты меншіктелген.

s2:='2009'; s2 жолға бүтін санның жазылуы болып табылатын жол меншіктелген. Мұндай жолды кейін стандартты Val процедурасы арқылы санға түрлендіруге болады.

s3[1]:='Информатика';

s3[2]:=''; — s3 жолдық массив болып табылады. Оның бірінші элементіне жолдық тұрақты меншіктелген, екінші элементіне – бос жол.

Жолдарды клавиатурадан енгізу үшін readln операторын пайдалану керек, себебі жолды енгізу Enter клавишасын басумен аяқталуы тиіс:

writeln ('Тұтынушының есімін енгізіңіз:');

readln (s1);

Жолдарды экранға немесе принтерге шығару үшін write, және writeln операторын пайдалануға болады

s2:='SUMMA';

write (s2); — экранға "SUMMA" жолы шығарылады.

writeln ('Сумма':10); — "_____Сумма" жолы шығарылады (сөздің алдында 5 бос орын) және курсор экранның келесі жолына өткізіледі.

Қосу "+" операторы жолдар үшін оларды біріктіру (конкатенациялау) амалын жүзеге асыратындай етіліп қайта анықталған:

s1:='2010' + ' жыл'; s2:='б.ғ.';

s3[3]:=s1+' '+s2;

Бұл амалдардан кейін s1 жолдың мәні ''2010_жыл", ал s3[3] жолдың мәні - ''2010_жыл_б.ғ.".

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

Қатынас "=" операциясы жолдарды символдары бойынша салыстыруға мүмкіндік береді. Бұл кезде келесі ережелер әрекет жасайды:

• тек символдардың жиынтықтары мен олардың ұзындықтары бірдей болғанда ғана жолдар бірдей болып саналады;

• әйтпесе символдардың элементтері кодтары бойынша салыстырылады. Бұл кезде ASCII-код кестесіне сәйкес жеке символдардың үлкенділігі келесідей: '0' < '1' <... < '9' < 'A' <... < 'Z' < 'a' <... < 'z' < кириллиц а символдары.

Қалған қатынас операцияларын да жолдарға қолдануға болады.

Бір қатар типтік есептерді қарастырайық:

Сөйлемді сөздерге жіктеп әр сөзді экранның жаңа жолына шығару керек. Бұл программаның жұмыс жасау алгоритмі өте қарапайым - s сөйлемнің ағымдағы жолында кемінде бір бос орын бар болса, бос орындың алдындағы жолдың бөлігі (сөз) жолдық w айнымалыға көшіріледі. Егер бос орындар қалмаған болса (немесе басынан бастап жоқ болса), онда бүкіл жол – ол бір сөз болып табылады. Кезекті сөзді өндеп болғаннан кейін (біздің жағдайда оны writeln операторы арқылы экранның жаңа жолына шығару) жолдың өнделген бөлігі бос орында қоса s-тен алынып тасталады – циклдің келесі қадамы дәл сол сөзді қайтадап тауып алмауы үшін.

var s,w:string; {сөйлем және сөз}

p:integer; {бос орынның позициясы}

begin

writeln ('Мәтін енгізіңіз');

readln (s);

repeat

p:=pos (' ',s);

if p>0 then w:=copy (s,1,p-1)

else w:=s;

writeln (w);

delete (s,1,p);

until p=0;

end.

Келтірілген программада бір қатар кемшіліктер бар. Олардың ішінен ең айқын көрінетің кемшілік – сөздердің арасындағы қосымша бос орындар ескерілмеген, оларды программа артық "бос сөздер" ретінде түсінеді. Келесі мысал арқылы олардан құтылайық.

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

repeat

p:=pos (' ',s);

if p>0 then delete (s,p,1);

until p=0;

if s[1]=' ' then delete (s,1,1);

if s[length(s)]=' ' then

delete (s, length(s),1);

writeln (s);

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

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

var s,word:string;

c,c0:char;

i,l,start:integer;

inword:boolean;

begin

writeln ('Enter string:');

reset (input); readln (s);

s:=' '+s+' ';

l:=Length (s);

inword:=false;

for i:=2 to l do begin

c0:=s[i-1];

c:=s[i];

if (c0=' ') and (c<>' ') then begin

inword:=true;

start:=i;

end;

if c=' ' then begin

if inword=true then begin

word:=copy (s,start,i-start);

writeln ('''',word,''' is word');

end;

inword:=false;

end;

end;

end.

Негізінде біздің программаның 2 қалып-күйі бар – сөздің ішінде және одан тыс. Қалып-күйлердің айырып-қосылуын inword жалауша басқарады. Кезекті сөз басталатын символдың нөмірі start айнымалыда сақталады. Программа тыныс белгілерін және сөздерді бос орыннан басқа символдар арқылы ажыратуға болатындықты ескермейді.

Жолдағы бос орындардың санын есептеу. Бұл мысал жолмен жұмыс жасауды символдар массивімен жұмыс жасау ретінде жүзеге асырады:

var s:string; k,i:integer;

begin

writeln ('text?');

readln (s);

k:=0;

for i:=1 to length (s) do

if s[i]=' ' then k:=k+1;

writeln ('k=',k);

end.


Лекция

12.1 Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рәсімдеу тәсілдері және оларды программа құрамында пайдалану.

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

Паскальда ішкі программалардың екі түрі: процедуралар және функциялар бар. Олардың арасындағы негізгі айырмашылық – функция мәнді қайтарады және өрнектің ішінде пайдаланылуы мүмкін, мысалы: X:= Sin(A); алпроцедура бір немесе бірнеше есептерді орындау үшін шақырылады: Writeln(' Бұл тексеру '); Функциялардың форматы процедураның форматына ұқсас айырмашылығы олар function тақырыбынан басталады және функцияның қайтаратын мәні үшін деректер типімен аяқталады: function функция_аты (параметрлер): деерктер типі; Кәдімгі программаның құрылымынан тек екі айырмашылық бар: процедуралар және функциялар program емес procedure немесе function тақырыптарынан басталады,және нүкте мен емес нүктелі үтірмен аяқталады. Процедуралар және фукнциялар өздерінің жеке тұрақтыларына, деректер типтеріне, айнымалылар мен жеке өздерінің процедуралары мен функцияларына ие болуы мүмкін. Бырақ, барлық бұл элементтер тек олар анықталған процедуралар мен функциялардың ішінде ғана пайдаланылуы мүмкін.

Процедуралар мен функциялардың параметрлері. Ішкі программаны сипаттау барысында көрсетілетін параметрлер формальды деп аталады. Ішкі программаны шақыру барысында көрсетілетін параметрлер фактілі деп аталады.

Егер формальды параметр var қызметші сөзімен сипатталған болса, онда оны параметр-айнымалы деп атайды да ол сілтеме бойынша жіберіледі деп айтады. Егер параметр var қызметші сөзін пайдаланбай сипатталған болса, онда оны параметр-мән деп атайды да ол мәні бойынша жіберіледі деп айтады

Егер параметр мәні бойынша жіберілетін болса, онда ішкі программаны шақыру барысында фактілі параметрлердің мәндері сәйкесінше формальды параметрлерге меншіктеледі. Мысалы, процедураның келесідей сипатталуы бар болсын:

procedure PrintSquare(i: integer);

begin

writeln(i*i);

end;

Онда PrintSquare(5*a-b) шақырылғанда 5*a-b мәні есептеліп і айнымалыға меншіктеледі, одан кейін процедураның тұлғасы орындалады.

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

procedure Mult(var a: integer);

begin

a:=a*2;

end;

онда Mult(d) шақырылған кейін d-нің мәні екі есе өседі.

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

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

procedure Print(var a: array [1..10] of integer; n: integer);

var i: integer;

begin

for i:=1 to n do

write(a[i],' ');

writeln;

end;

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

procedure PrintSquare1(i: integer);

begin

i:=i*i; // дұрыс

writeln(i);

end;

procedure PrintSquare2(const i: integer);

begin

i:=i*i; // қате!!!

writeln(i);

end;

Pascal ABC-те тұрақты параметр мәні бойынша жіберіледі (Delphi-де – сілтеу бойынша).

Программаны компиляциялап іске қосқанда программаның тұлғасында бірінші болып GetData(А,В) операторы орындалады. Оператордың бұл түрі процедураны шақыру деп аталады. Бұл шақыруды өндеу барысында программа Х пен Y (формальды параметрлерді) А мен В (фактілі параметрлерге) алмастырып GetData ішіндегі операторларды орындайды. GetData процедурасын шақыру операторындағы Х пен Y –тің алдындағы var кілттік сөзі фактілі параметрлер айнымалы болуы тиіс және айнымалылардың мәндері өзгеріліп және қайтадан шақырушы программаға жіберілуі мүмкін екендігін білдіреді. Сондықтан GetData процедурасына литералдарды, тұрақтыларды, өрнектерді және с.с. жіберуге болмайды. GetData орындалуы аяқталғаннан кейін басқару программаның негізгі тұлғасындағы GetData-ны шақырушыдан кейінгі операторға беріледі. Ол келесі оператор GetRatio функциясын шақыру болып табылады.

Мұндағы кейбір маңызды ерекшеліктерді атап кетейік. Біріншіден, GetRatio мән қайтарады, ол мән кейін бір жерде пайдаланылуы тиіс; бұл жағдайда ол мән Ratio-ға меншіктеледі. Екіншіден, функцияның негізгі тұлғасында мән GetRatio-ға меншіктеледі. Сонымен, функция қандай мәнді қайтару керек екендігін анықтайды. Үшіншіден, бұл жерде I және J формальды параметрлердің алдында var кілттік сөзі жоқ. Ол фактілі параметрлер кез келген бүтінсанды өрнек бола алатындығын білдіреді, мысалы, Ratio:=GetRatio(А+В,300), және тіпті егер формальды параметрлердің мәндері функцияның тұлғасының ішінде өзгертілсе де жаңа мәндер қайтадан шақырушы программаға жіберілмейді. Бұл процедуралар мен функциялардың арасындағы айырмашылық болып табылмайды; параметрлердің екі типін де ішкі программалардың кез келген түрінде пайдалануға болады. Процедураның сипатталуы идентификаторды процедуралық блокпен байланыстыруға мүмкіндік береді. Процедураны одан кейін процедураның операторы арқылы белсендіруге болады. Процедураны іске қосу оның ішінде процедураның аталуы және қажетті параметрлер қамтылған процедураның операторы арқылы жүзеге асырылады. Процедура іске қосылған кезде орындалуы тиіс операторлар процедура модулінің операторлық бөлімінде қамтылған. Егер процедурада қамтылған операторда процедура модулінің ішінде процедураның идентификаторы пайдаланылатын болса, онда процедура рекурсиялы түрде орындалады (орындалу барысында өзіне өзі сілтейді). Процедураны сипаттау мысалы:

program DoRatio;

var

A,B: integer;

Ratio: real;

procedure GetData(var X,Y: integer);

begin

Write('Екі сан енгізіңіз: ');

Readln(X,Y)

end;

function GetRatio(I,J: integer): real;

begin

GetRatio:= I/J

end;

begin

GetData(A,B);

Ratio:= GetRatio(A,B);

Writeln('Қатынас тең',Ratio)

end.

procedure NumString(N: integer; var S: string);

var

V: integer; begin

V:= Abs(N); S:= '';

repeat

S:= Chr(N mod 10 + Ord('0')) + S; N:= N div 10;

until N = 0;

if N < 0 then S:= '-' + S;

end;

Процедураның сипатталуында операторлар блогының алдында үзіліс жасау (interrupt) директивасы көрсетілуі мүмкін. Бұл жағдайда процедура үзіліс жасау процедурасы ретінде қарастырылады. Процедура немесе функцияның сипатталуында операторлар блогының орнына алға кететін сипаттау (forward), сыртқы сипаттау (external) немесе ішкі сипаттауды (inline) жазуға болады.

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

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

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

function Max(a: Vector; n: integer): extended;

var

x: extended;

i: integer;

begin

x:= a(1);

for i:= 2 to n do if x < a[i] then x:= a[i];

Max:= x; end;

function Power(x: extended; y: integer): extended;

var

z: extended;

i: integer;

begin

z:= 1.0; i:= y;

while i > 0 do

begin

if Odd(i) then z:= z*x;

x:= Sqr(x);

end;

Power:= z;

end;

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

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

Локальды және глобальды айнымалылар. Ішкіпрограмманың сипаттау бөлімінде сипатталған айнымалылар оның локальды айнымалылары деп аталады. Ішкіпрограммадан тыс сипатталған айнымалылар оған қатысты глобальды айнымалылар деп аталады.

Ішкіпрограмманың параметрлері оның локальды айнымалылары болып саналады. Егер локальды айнымалының аталуы глобальды айнымалының аталуымен сәйкес болса, онда локальды айнымалы глобальды айнымалыны жасырады, сондықтан ішкіпрограмманың ішінен глобальды айнымалыға сілтеуге болмайды. Мысалы:

var i: real;

procedure p;

var i: integer;

begin

// глобальды i айнымалыға процедураның ішінде сілтеуге мүмкін емес

i:=5; // локальды i айнымалыға меншіктеу;...

end;

Процедуралар, функциялар, сыртқы библиотекалар.

Программа Р30, символдар жолы арқылы экранды екі бөлімге бөліп 1, 2,..., 10 сандар үшін квадрат түбірлері кестесін және 1, 2,..., 5 сандар үшін натурал логарифмдерінің кестесін құрады. Символдар жолын экранға шығару line процедурасы ретінде ұйымдастырылған. Процедурадан программаға ешқандай ақпаратты жіберу қажет болмағандықтан процедураның аргументтері (символдардың түрі және саны) мән-параметрлер ретінде сипатталған. Бұл программада процедура бес рет орындалады.

Программа Р31, берілген төрт натуральных а, b, с, d сандар үшін сандардың бірінші және екінші паралардың ең үлкен ортақ бөлгіштерін (ЕҮОБ) экранға шығарып оларды мәні бойынша салыстырады. Программада nod(x,y) рекурсиялы функция анықталған, ол келесі ережені жүзеге асырады:

21 және 15 санларға nod(x,y) –ті ретімен қолданып, табамыз:

nod(21,15) = nod(6,15) = nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.

Сыртқы библиотекалар. Ішкі программалар (процедуралар мен функциялар) программаларда оларды құрылымдау мақсатында, сонымен қатар, программаның кейбір бөліктерін бірнеше рет қайталау барысында пайдаланылады. Процедуралар мен функциялар программалық бірліктердің ішкі программаларды сипаттау бөлімінде сипатталады. Олар бұл программалық бірліктер үшін ішкі болып табылады. Бірдей бір ішкі программалар түрлі программаларда пайдаланылған жағдайлар кездеседі. Мұндай жағдайларда оларды қажетті моментте кез келген программаларға қосуға болатын сыртқы ішкі-программаларды құрған дұрыс. Әдетте, сыртқы ішкі-программаларды жеке пакеттерге біріктіреді, оларды сыртқы ішкі-программалардың библиотекалары деп атайды. Кірістірілген библиотекалар компиляциялау барысында кез келген программаға автоматты түрде қосылады.

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

Келесі мысалда екі процедурадан және бір функциядан тұратын сыртқы библиотека құрылады. Бірінші процедура privet экранды тазартады, сәлемдемені шығарады, одан кейін бос орын клавишасы басылғаннан кейін қайтадан экранды тазартады. Екінші stepen процедурасы а санды b санға дәрежелейді. Үшінші ішкі-программа-функция mexp Тейлор қатарының негізінде жуық шамамен экспонента мәнін есептейді.

procedure PRIVET;

var a:char;

begin

clrscr; gotoxy(20,10);

write('Сәлеметсіз бе, сау болыңыз!'};

repeat {цикл экранды алмастыруға }

gotoxy(35,50);write('пробел');{мүмкіндік береді }

read(kbd,a); {бос орынды басу бойынша }

until а=' ';

clrscr;

end;

procedure STEPEN(a,b:real;var y:real);

begin

y:=exp(b*ln(a));

end;

function MEXP(x:real):real;

begin

mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;

end;

Осы үш ішкі-программалар lab.pas атаулы файлға жазылған болсын.Р32 программасы құрылған сыртқы библиотеканы пайдалану мысалын көрсетеді:

program Р32;

{$i lab} {библиотеканы қосу директивасы}

var a,b: real;

begin

PRIVET;

STEPEN(2,4,a);writeln('2 –нің 4 дәрежесі»',a);

b:=MEXP(l);

write('машинаның есептегені exp(1)=',EXP(1):6:4,'менің есептегенім ехр(1)=',b:6:4);

end.

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

Модуль құрамына келесі бөлімдер кіреді:

· тақырып (unit <модуль аталуы> түрінде) модульге сілтеу үшін керек. Модульді қамтитын файл аталуы модуль аталуымен бірдей болуы тиіс;

· интерфейс, ол interfase сөзінен басталады да тақырыптар тізімі арқылы бейнеленген және оларға негізгі программа тұлғасынан қол жеткізуге болатын процедуралар мен функцияларды қоса жариялауларды қамтиды;

· жүзеге асыру, ол implementation сөзінен басталады да модульдің интерфейстік бөлімінде санақтап шығарылған процедуралар мен функциялардың тұлғаларын қамтиды;

· инициализация, ол бос болып тек end –ты қамтуы мүмкін немесе модульді инициализациялау бойынша қажетті амалдарды орындайтын (мысалы, айнымалыларға бастапқы мәндерді меншіктейтін) операторларды қамтуы мүмкін.

Сонымен, модуль – ол тұрақтылар, деректер типтері, процедуралар мен функциялар жиынтығы. Әр модуль жеке компиляцияланады; компиляциялау нәтижесі – кеңейтпесі tpu (Turbo Pascal Unit) файл. Модульдің әр элементін қосымша жариялаусыз тұтынушының программасында пайдалануға болады, ол үшін тақырыптан кейін программаның басында пайдаланылатын модуль аталуын Uses директивасында жазған жеткілікті. Стандартты Crt, Graph және басқа модульдерді пайдаланады. Бұл модульдерде дисплей экранымен, клавиатурамен, графикалық примитивтермен және с.с. жұмыс жасауға арналған сервистік процедуралар және функциялар қамтылған.

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

(a,b) + (c,d) = (a+c,b+d),

(a,b)-(c,d) = (a-c,b-d),

(а,b) * (c,d) = (a*c-b*d, a*d+b*c),

(a,b) / (c,d) = ((a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).

Құрылатын модуль төрт процедураны қамтиды: Sum - қосынды, Raz - айырым, Proiz – көбейтінді, Chastn – бөлінді. Бұл модуль жеке компиляциялануы мүмкін. Одан кейін кез келген программа Uses CompChisla директива арқылы осы модульдің интерфейстік объекттеріне (бұл жағдайда – процедураларына) қол жеткізе алады. Модульдің интерфейстік бөлімінде процедуралардың тек тақырыптары көрсетіледі, ал «жүзеге асыру» бөлімінде процедуралардың тақырыптарынан тек атаулары қалады.

unit CompChisla;

interface

procedure Sum(a,b,с,d: real; var x,y: real);

procedure Raz(a,b,c,d: real; var x,y; real);

procedure Proiz(a,b,c, d: real; var x,y: real);

procedure Chstn(a,b,c,d; real; var x,y: real);

implementation

procedure Sum;begin x:=-a+c; y:=b+d end;

procedure Raz;begin x:=a-c; y:=b-d end;

procedure Proiz;begin x:=a*c-b*d; y:=a*d+b*c end;

procedure Chastn;

var z:real;

begin z:= c*c+d*d; x: = (a*c-)-b*d) /z; y;= (b*c-a*d) /z

end;

end.

Лекция

13.1 Сыртқы сақтауыш құрылғыларын (файлдық шамаларды) және динамикалық жадыны пайдалану арқылы программалау

Файлдармен жұмыс жасау. Компьютерлердің программалық ұйымдастырылуы, олардың сыртқы құрылғылармен байланысы, деректер қорлары файлдық құрылымға негізделген. Файлдар келесіні қамтамасыз етеді:

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

· программалардың сырқы енгізу-шығару құрылғылармен өзара әрекеттесуін.

Паскальда файлдық типтегі құрылымдалған деректер пайдаланылады. Программада деректердің бұл типі келесі түрде беріледі: type <аталуы> = file of <тип>

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

type

intfile = file of integer;

refile = file of real;

chfile = file of char;

ran =1..10;

st = set of ran;

vector = array[ran] of real;

compl = record

re,im: integer;

end;

setfile = file of st;

vecfile = file of vector;

compfile= file of compl;

Файлдық айнымалыны сипаттау кәдімгі тәсіл бойынша сипаттау бөлімінде беріледі. Мысалы: var f: intfile; немесе var f: file of integer; Файлдық айнымалы программа мен сыртқы құрылғы арасындағы буфер болып табылады да, онымен логикалық түрде байланысуы тиіс, ол байланыс оператор арқылы жүзеге асырылады:

assign (< файлдық айнымалы>,'<құрылғының аталуы:’)

Әдетте, деректерді сақтау үшін файлдар магниттік тасымалдаушыдағы сыртқы жадтың құрылғысымен байланысқан және сыртқы файлдар деп аталады. Егер, мысалы, primer.dat атаулы файл А: дисководпен логикалық түрде байланысқан болса, онда файлға салынатын барлық деректер дискілік жинақтаушыда сақталады, ал программамен файл арасындағы байланысты файлдық f айнымалы арқылы assign (f,'primer.dat') оператор орнатады. Егер сыртқы құрылғы ретінде принтер пайдаланылатын болса, онда байланыс assign(f, '1st:') оператор арқылы жүзеге асырылады. Мұндағы lst – баспаға шығаратын құрылғының логикалық аталуы.

Сыртқы енгізу-шығару құрылғылардың логикалық атаулары:

con - консоль;

trm - терминал;

kbd - клавиатура;

1st - принтер;

aux – желініңбуфері;

usr- тұтынушының драйвері.

Байланыс жүзеге асырылғаннан кейін файлдық f айнымалы сәйкесінше файл ұқсастырылады. Файлмен жұмыс жасау үшін оны ашу, ал жұмыс аяқталғаннан кейін жабу керек. Файл оқу үшін reset(f) оператор, жазу үшін - rewrite(f) оператор арқылы ашылады.

Деректерді оқу және жазу жоғарыда аталып кеткен read/write командалар арқылы жүзеге асырылады, бырақ тізімнің басында файлдық айнымалының аталуы қойылады, мысалы:

read (f, <тізім>); readln (f, <тізім>); write(f, <тізім>); writeln(f, <тізім>).

Файлды жабу close(f) командасы арқылы жүзеге асырылады.

Шартты түрде файлды бас жағы бар ал соңы бекітілмейтін лента түрінде бейнелеуге болады. Файлдың компоненттері лентаға ретімен бірінен кейін бірі жазылады:

f0 f1 f2 f3 м.к.

^ т.м.

мұндағы т.м. - ағымдағы маркер, ол файлдың жұмыс позициясын (терезені) көрсетеді; м.к. (файлдың соңын белгілейтін маркер) - файлдың соңғы элементінен кейін автоматты түрде қалыптастырылатын арнайы код.

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

rewrite(f) – файлды жазу үшін бұйрығы – файлды жазу режимінің бастапқы қалып-күйіне орнатады; ағымдағы маркер файлдың соңын белгілейтін маркерге орналастырылады. Егер f файлында осыған дейін ақпарат болса, онда ол жойылады. rеset(f) бұйрығы арқылы оқу үшін ашылған файлда ағымдағы маркер нөлдік қалып-күйіге орналастырылады, бырақ майлдағы нәрсе жойылмайды. Файлды жабу close(f) бұйрығы міндетті, себебі бұл бұйрық файлдың соңын белгілейтін маркерді қалыптастырады, ол көп жағдайда қажетті болып табылады (мысалы, eof(f) функциямен жұмыс жасау үшін). Паскальда файлдармен жұмыс жасауға арналған кірістірілген функциялар көзделген:

filesize (f) – ашылған файл компоненттерінің ағымдық мөлшер саны;

filepos (f) – маркердің ағымдық позициясының нөмірі;

геnаmе (f,имя) – f-пен байланысқан файл аталуын ауыстыру;

erase( f) - файла файлды жою;

execute (f) - СОМ-файлды орындау;

chain (f) - СНМ-файлды орындау;

seek (f,N) - маркерді N позициясына орнатады;

eof( f) – файлдың соңы табылса, TRUE қайтарады;

eoln (f) - жолдың соңы табылса, TRUE қайтарады.

Тәжірибеде литерлік (логикалық) жолдардан тұратын мәтіндік файлдар кең пайдаланылады. Сондықтан, Паскальда TEXT стандартты файлдық тип көзделген (ол file of char болып табылмайды, ол file of string[n] – ке жақындау). Логикалық жолдардың ұзындығы әртүрлі болады, соның қатарында, нөльдік. Әр жолдың соңында «жолдың соңы» (eoln - «end of line») арнайы символ қойылады. Жолдың соңын белгілейтін баспалық символ ретінде # литераны қолданады. Мәтіндік файл (text) қатаң тізбекті болып табылады, оған кейбір кірістірілген, мысалы, seek сияқты функцияларды қолдануға болмайды. Типтелген файлдармен салыстырғанда, мәтіндік файлмен бір мезгілде оқу (read) және жазу (write) операцияларын орындауға болмайды. Бырақ, writeln және readln операторлары рұқсат етілген. Сандық деректер, бүтін және нақты, мәтіндік файлда бос орын арқылы жазылуы тиіс.

Р33 программада деректерді принтерге (1st:) шығару мысалы келтірілген.

program Р33;

var

fal:text; x:real; name:string[25];

begin

assign(fal,'1st: ');rewrite(fal);x:=2.5; name:='Салтанат';

writeln(fal,x:8:2);

writeln{fal,'Сәлем, ',name); close(fal)

end. {файлдық fal айнымалы 1st: принтермен байланысады, fal файлына жазу негізінде баспаға шығаруды білдіреді}

Р34 программада 10 дан 20 дейін бүтін сандар тізбегі құрылады да «xxx.dat» файлда сақталады.

program Р34;

var

f: file of integer; i:integer;

begin

assign{f,'xxx.dat'); rewrite(f};

for i:=10 to 20 do write(f,i); close {f};

end. {Программа орындалып болғаннан кейін сыртқы xxx.dat файлы қалыптастырылады}

Р35 программада бар «xxx.dat» файлдан алғашқы бес компоненттері оқылып, осы мәндердің квадраттары дисплейге шығарылады.

program Р35;

var ff: file of integer; j,i: integer;

begin

assign(ff,'xxx.dat'); reset(ff);

for j:=l to 5 do begin read(ff,i); writeln(i*i);

end;

close(ff);

end.

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

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

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

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

Нұсқағыштың мәні содан бастап сәйкес динамикалық шама жадыда орналаса бастайтын ұяшықтың адресі болып табылады. Сілтеуіш типті беру келесі схема бойынша орындалады:

type< сілтеуіш типтің аталуы > = ^ < динамикалық шама типтің аталуы >

(^ белгі шаманың динамикалық болғандығын көрсетеді).

Мысалы:

type

р = ^ integer;

q = ^ record

х:integer;

у:string[20]

end;

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

 
 


Бұл схемада р – нұсқағыштың аталуы; жұлдызша арқылы нұс&


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: