Crc press баспасы Taylor & Francis баспа тобы



Pdf көрінісі
бет17/26
Дата20.12.2019
өлшемі6,26 Mb.
#53875
1   ...   13   14   15   16   17   18   19   20   ...   26
Байланысты:
Бағдарламалау тілдеріне кіріспе (1)
corel-draw-zhayly-zhalpy-tusinik, corel-draw-zhayly-zhalpy-tusinik, Jobs and professions

4.9-мысал
Келесі  бағдарлама:  main  және  my_print  екі  бағдарламалық  блогынан 
тұрады.  main  бағдарламасы  әрқайсысының  өлшемі  100-ді  құрайтын 
“a” and “b” екі массивін өлшейді және оларды элемент бойынша қосу 
үшін және нәтижесін басып шығару үшін my_ print ішкі бағдарламасын 
шақырады.
program main
{     integer x[100]; y[100];
for (i = 0, i = < 99; i++) read(x[i], y[i]);
call my_print(x, y);

179
}
subprogram my_print(integer a[100], b[100])
{ integer c[100];
for (i = 0; i = < 99; i++) {
c[i] = a[i] + b[i];
for (i = 0; i = < 99, i++)
print(“c[~d]= ” ~d~n”, i, c[i]);
}
}
Параметрлерді  мәні  бойынша  берудің  екі  кемшілігі  бар:  (1)  көшіру  
жад ұяшықтарының қосымша санын қажет етеді, нақты параметрлерді 
сақтау үшін осындай қажет. Егер нақты параметрі үлкен болса, мысалы, 
ірі масштабты ғылыми есептеулерде матрица өлшемі 10000 × 10000 бол-
са, онда қосымша 100 миллион × шақыратын ішкі бағдарламаны орын-
дау  үшін  жад  ұяшықтарының  (деректердің  жекелеген  элементтерінің) 
өлшемі, және (2) шақыратын ішкі бағдарлама жадынан шақырылатын 
ішкі  бағдарламаның  жадына  деректердің  ірі  құрылымдарын  көшіруге 
арналған шығындар үлкен болады.
4.4.1.1 Күрделі объектілерді бөлу үшін параметрлерді мәні бойынша 
беру
Деректердің  кеңейтілетін  құрылымдарының  күрделі  объектілері  мен 
бағдарламалаудың  объектілік  тілдеріндегі  динамикалық  объектілері 
жалпы  ғаламдық  кеңістіктің  үдемелік  саласында  сақталады.  Бұл  объ-
ектілер  сілтеменің  көмегімен  бағдарламалық  блок  ортасынан  алына-
ды. Сілтеме динамикалық аймағында сақталған деректер объектісінің 
негізгі  мекенжайына  көрсетеді.  Шақыратын  ішкі  бағдарламаға  шақы-
рылатын ішкі бағдарламаның объектісімен бөлісу қажет болса, 4.5-су-
ретте  көрсетілгендей,  параметрлерді  мәні  бойынша  беру  көмегімен 
шақыратын  бағдарламаның  ортасы  көшіріледі.  Сол  жағы  шақыратын 
ішкі  бағдарламаға  жүгінгенге  дейін  әрекеттер  жүйелілігін  көрсетеді. 
Көшіріп алынған ақпарат мекенжайды білдіреді,  формалды параметр 
объект мекенжайын ауыстырады. Бұл тетік динамикалық салада сақтау-
лы динамикалық объектілерді қолдайтын әр тілде пайдаланылады.
4.4.2 Параметрлерді сілтеме бойынша беру және оның түрлері
Параметрлерді сілтеме бойынша беру, сондай-ақ параметрлерді рұқ-
сат бойынша беру деп те аталады, 1-мәнді немесе нақты параметрдің 
жад ұяшығын формалды параметрге береді. 

180
Формалды параметр бұл – нақты параметрге арналған сілтеме. Шақы-
ратын бағдарламада нақты параметрдің жад ұяшығы формалды параме-
трді түсіндіруде қолжетімді, ал нақты параметрге сәйкес жад ұяшығы 
оқылады немесе жаңартылады.
Environment of the calling subprogram A – А шақырушы кiшi бағдарла-
маның қоршаған ортағы; object – зат; heap – үйінді; Before invocation 
of B – В-ны шақырудың алдында; Environment of the calling subprogram 
B  -  B  шақырушы  кiшi  бағдарламаның  қоршаған  ортағы;  after 
invocation of B – В-ны шақырғаннан кейін.
4.5-сурет.  Объектілерге  арналған  сілтемелерді  көшіру  үшін  параметр-
лерді мәні бойынша беруді пайдалану.
Деректер  элементтерін,  мысалы,  массивті  немесе  векторды  жинауда 
деректердің бірінші элементтерінің жад ұяшықтары беріледі, ал дерек-
тердің  басқа  элементтері  жылжу  тәсілінің  арқасында  қолжетімді  бо-
лады, деректер элементінің i мекенжайын есептеп, i* (деректердің бір 
элементін) жылжу өлшемін қоса отырып және оны формалды параме-
трінде сақтаулы жад ұяшығына қоса отырып,есептеледі.
Формалды параметрдің әр түрлі атаулы мәнінің өзгерісі нақты параме-
трдің жад ұяшығындағы рұқсатпен және оның жаңаруымен сәйкес ке-
летіндігі хабарландырудан айқын болады.  Шақырылатын ішкі бағдар-
ламадағы шақыруы ішкі бағдарламадағы нәтижелерді беру қажеттілігі 
жоқ.
Параметрлерді мәні бойынша берудің бірнеше басымдықтары бар:
1. Формалды  параметр  бұл  –  деректердің  күрделі  құрылымының  жа-
дының  бірінші  ұяшығындағы  тек  көрсеткіш  қана  және  ол  деректер
құрылымының өлшеміне байланысты емес.

181
2. Жад ұяшықтарының ресурстары мен орындау уақытын артық шығын-
дай отырып, нақты параметрдің мәнін дәл көшірудің қажеттілігі жоқ.
3. Шақырушы бағдарламаа есептеу нәтижелерін анық берудің қажеттілі-
гі жоқ, себебі нақты параметрлердің жад ұяшықтары тиісті формалды
параметрлер өзгергенде, тұрақты түрде жаңарып отырады.
4.10-мысал
Келесі бағдарлама main және count екі бағдарламалық блогынан тұра-
ды. Main бағдарламалық блогы 1-ден 200-ге дейін тұтас сандарды жа-
сау үшін бағдарламалар кітапханасында кездейсоқ сандар генераторын 
пайдаланады, count шақырылатын ішкі бағдарламасы сандық мәні 100-
ден аса  d массиві бөлігінің элементтерін санайды. Тұтас сан  4 байтты 
алады және көрсеткіш 4 байтты алады.
main бағдарламасында тұтас сандар массиві мен i,j, және final_count 
үш қосымша тұтас ауыспалы сандар бар. main бағдарламасы үш нақты 
параметрді: деректерді сілтеме бойынша беру арқылы массиві; және 
параметрді мән бойынша беру арқылы j ауыспалы; және деректерді сіл-
теме  бойынша беру арқылы final_count ауыспалыны пайдалана отырып, 
count ішкі бағдарламасын шақырады.
 j ауыспалы аргументі d массивінің соңғы индексі мәнін сақтайды. “&” 
символы  мекенжайдың  шақырылған  ішкі  бағдарламаға  берілгендігін 
білдіреді, ал “*” символы келесі символ нақты параметрге сілтеме екен-
дігін және r-мәннің рұқсаты атауын өзгертудің қажеттілігі жоқ екендігін 
білдіреді.
Environment of main - Басты қоршаған орта; base – негіз; final count - 
соңғы санау; environment of count - санаудың қоршаған ортасы; last 
index - соңғы индекс; accum – жинау. 
4.6-сурет. Параметрлерді сілтеме бойынша берудің принципиалдық схе-
масы

182
count бағдарламалық блогында үш формалды параметр бар: ауыспалы 
– d[0] деректер элементіне сілтеме, ауыспалы last_index j нақты па-
раметрінің көшірмесі, accum сілтемелік ауыспалысы – final_count нақты 
параметріне сілтеме. b және accum сілтемелік ауыспалысы өздері көрсе-
тетін деректер элементтерінің өлшеміне тәуелсіз.  Бағдарламадағы b[i] 
элементінің мекенжайы address(d[0]) + 4 * i ретінде есептеледі.
j  нақты  параметрі  мәнді беру  тетігі  бойынша  берілетіндігіне,  ал last_
index  формалды  параметрі  j  мәнінің  көшірмесін  алатындығына  назар 
аударыңыз. 4.6-суретте сілтеме бойынша параметрлерді берудегі сілте-
мелер көрсетілген.
program main
integer d[100], i, j, final_count;
for (i = 0; i = < 99; i++) d[i] = random_number(1, 200);
j = 50;
call count (&d,j, &final_count);
}
subprogram count (integer *b, last_index, *accum)

integer index;
*accum = 0;
while (index =< last_index)
{ if (*b[index] > 100) *accum = *accum + 1; % end_if
}% end_while
}% end_while
}
Параметрлерді сілтеме бойынша беруде бірнеше кемшіліктер бар:
1. Шақырылатын ішкі бағдарлама шақыратын бағдарламаның жад бло-
гын жаңартады. Шақырылатын бағдарламаны аяқтаған соң, шақырушы
бағдарламаның жад блогы шақырылатын бағдарлама орындағанға дей-
ін  өзінің  жай-күйіне  қатысты  өзгереді.  Егер  шақырушы  бағдарламаға
жаңару қажет болмаса, онда ол қатемен орындалады, себебі ол жадтың
бұрмаланған блогындағы есептеу мәнін оқитын болады.
2. Нақты параметр қолданылған сайын жадқа екі мәрте жүгіну болады:
бірінші  жүгіну  нақты  параметр  жадының  ұяшығына  және  ары  қарай
нақты параметрдің жад ұяшығын r-мәнге қол жеткізу үшін пайдалану.
3. Бөлінген есептеулерде, шақырушы және шақырылатын ішкі бағдар-
ламаларда  әр  түрлі  процессорларда  (немесе  компьютерлерде)  болса,
олардың  әр  түрлі  мекенжайлық  кеңістіктері  болады.  Әр  түрлі  мекен-
жайлық кеңістіктерге қол жеткізу  деректерді беру хаттамаларын, сон-
дай-ақ шығындарды біршама арттыратын деректерді орау және ашуды

183
қажет  етеді  және  сонымен  қатар,  деректерді  беру  арналары  төменгі 
сенімділікпен сипатталады. 
Сілтемелік  параметрлерді  дұрыс  емес  пайдалану  салдарынан  шақы-
рушы бағдарламаның жадындағы блоктың өздігінен жаңаруымен бай-
ланысты  проблеманы  жою  үшін  бірнеше  тілдер,  мысалы,  C++  және 
Modula-3 тілдерде параметрлерді сілтеме бойынша өзгертпей беру оп-
циясын  (тек  оқу  үшін  қолжетімді)  қолдайды.  Параметрлерді  сілтеме 
бойынша өзгертпей беруде нақты параметрдің мәні формалды параме-
трдің  жад  ұяшығында  сақтаулы  көрсеткіштің  көмегімен  ғана  есепте-
луі мүмкін; тиісті нақты параметрге сәйкес жад ұяшығын деструктивті 
жаңартуға болмайды.
Басқа  нұсқада  параметрді  сілтеме  бойынша  берудің  бірінші  параме-
трін беру параметрді мәні бойынша кейіннен берумен үйлеседі. Шақы-
рылатын  ішкі  бағдарламалардың  барлығының  нәтижесінде  бастапқы 
нақты параметрге қолжетімді болады: параметрлерді мәні бойыша беру 
көмегімен сатылы көшірілетін бірінші сілтеме әр келесі шақырылатын 
бағдарламада сілтеме жасайды. Мысалы, “A”бағдарламалық блогы «В» 
шақырылатын ішкі бағдарламасында «х» нақты параметрін беру үшін 
параметрлерді  сілтеме  бойынша  беруді  пайдаланады.  «В»  бағдарла-
малық  блогындағы  «у»  формалды  параметрі  «В»  шақырылатын  ішкі 
бағдарламасындағы «х»-қа сілтеме болады.  
Егер “B” бағдарламалық блогы басқа “C”бағдарламалық блогын шақы-
рады және “y”-ті параметрлерді мәні бойынша беру арқылы “C” бағдар-
ламалық блогындағы «z» формалды параметріне береді. 
“B”  және  “C”бағдарламалық  блоктары  өзінің  сілтемелері  арқылы  «х» 
нақты параметріне қолжетімділікке ие.  Мұндай схема көптеген тілдер-
де, әсіресе C#, Java және C++ сияқты объектілік тілдерде кездеседі және 
алмасу бойынша шақыру деп аталады.
4.4.3 Нәтиже бойынша шақыру 
Нәтиже бойынша шақыру, сондай-ақ режимді көшіру көмегімен пара-
метрлерді беру деп аталады, ол мән бойынша шақыруға қарама-қарсы 
болып  табылады.  Нәтиже  бойынша  шақыру  уақытында  нақты  пара-
метр    формалды  параметрдің  жад  ұяшығына  көшірілмейді.  Оның  ор-
нына, формалды параметр объект типі бойынша үнсіздікпен мәнге ини-
циализацияланады.  Шақырылатын  процедураның  соңында  формалды 
параметр мәні кері нақты параметрге көшіріледі. Мән бойынша шақыру 
сияқты нәтиже бойынша шақыру да формалды параметрлерді жергілік-
ті ауыспалы ретінде қабылдайды. Шақырылатын бағдарламаны орын-

184
дау уақытында формалды параметр мен нақты параметр арасында бір-
бірімен ешқандай өзара әрекет жоқ.
4.4.4 Нәтиже мәні бойынша шақыру
Нәтиже  мәні  бойынша  шақыру,  сондай-ақ  параметрлерді  кіру-шығу 
режимі бойынша беру деп аталады, r-мәнді екі тәсілмен береді: нақты 
параметрде  формалды  параметрдегі  өрнекті  анықтаған  соң,  ол  шақы-
рылатын  ішкі  бағдарлама  аяқталған  соң  нәтижені  кері  береді.    Нәти-
жені кері беру белгіленген тәртіпте жад ұяшығында жүзеге асырылады. 
Шақырылатын ішкі бағдарламаны орындау уақытында шақырушы және 
шақырылатын ішкі бағдарлама арасында ешқандай өзара әрекет орын 
алмайды. 
Мәні бойынша шақыру сияқты, нәтиже мәні бойынша шақыру да фор-
малды  параметрлерді  жергілікті  ауыспалы  сияқты  қабылдайды  және 
шақырылатын ішкі бағдарламаның жергілікті ортасында жад ұяшығын 
құрады.  Нәтиже  мәні  бойынша  шақыру  жадын  бөлу  шығындары  мән 
бойынша шақырудағы сияқты. Бірақ нәтижені мәні бойынша шақыру-
да көшіру шығындары мән бойынша шақыруға қарағанда екі есе көп, 
себебі нәтиже мәні бойынша шақыру сондай-ақ нақты параметрлердің 
нәтижелерін кері береді.
4.11-мысал
Келесі бағдарлама x[100], y[100] мен z[100, 100] жергілікті ауыспалы-
сын  жасайды  және  y[100]-те  x[100],  b[100]  ,  ал  z[100,  100]-те  c[100, 
100]» деп өзгерту керек тиісті жад ұяшықтарына a[100] мәнін көшіреді.
Түпкілікті нәтиже “multiply” ("көбейту") ішкі бағдарламасын аяқтаған
соң кері беріледі, яғни x[100] –тан нәтиже a[100] –ге көшіріледі; y[100]-
тен b[100]-ге көшіріледі; ал z[100, 100]-ден c[100, 100]-ге көшіріледі.
Program main
{   integer a[100], b[100], c[100, 100], i;
for (i = 0; i =< 99; i++) read(a[i]);
for (i = 0; i =< 99; i++) read(b[i]);
call multiply (value-result a[100], b[100], c[100, 100]);
}
subprogram multiply(integer x[100], y[100], z[100, 100])
{   integer i, j;
for (i = 0; j = < 99; i++)

185
for (j = 0; j = < 99; j++)
z[i, j] = x[i] * y[j];
}
Нәтиже мәні бойынша шақыру есептеуді жүзеге асыру нәтижесін шақы-
рушы бағдарламаға кері бергеніне қарамастан, сілтема бойынша шақы-
ру мен нәтиже мәні бойынша шақыруда бірқатар айырмашылықтар бар:
1. Сілтеме бойынша шақыру нақты параметрлердің өзгеруін сақтайды,
себебі есептеу шақырылатын ішкі бағдарламада өтеді және созылмалы
деструктивті жаңаруға байланысты соңғы мәнін сақтайды.  Нәтиже мәні
бойынша шақыруда түпкілікті мән процедура шақыруындағы аргумент
тәртібіне байланысты болса да, нақты параметрлер шақырылатын ішкі
бағдарлама  сәтті  аяқталғаннан  кейін  де  жаңара  береді.  Нәтиже  мәні
бойынша шақырудағы нақты параметрдің түпкілікті мәні 4.12-мысалда
көрсетілгендей, сілтеме бойынша шақырудағыдай болуы міндетті емес.
main ( );
main ( );
integer i;
integer i;
{i = 1; sub(&i, &i);}
{i = 1; sub(value-result i, value-result i);}
void sub(integer *j, *k);
void sub(integer j, k);
{*k = 4; *j = 2}
{k = 4; j = 2}
4.7-сурет.   Сілтеме бойынша шақыру мен нәтиже мәні бойынша шақы-
руды салыстыру.
2. Сілтеме бойынша шақыру үшін деректердің үлкен құрылымына қол-
жетімді сілтемені сақтауға арналған жадтың бір ғана ұяшығы қажет, ал
нәтиже  мәні  бойынша  шақыру  нақты  параметрдің  көшірмесін  жасай-
ды.  Осылайша,  деректердің  үлкен  құрылымына  арналған  жадты  бөлу
шығындары мән нәтижесі бойынша шақырумен салыстырғанда сілтеме
бойынша шақыруда өте аз.
3. Сілтеме бойынша шақыруда қосымша жад алуына байланысты нақты
мәнге қол жеткізуде қосымша шығындар бар. Егер шақырушы бағдар-
лама үлкен көлемді есептеулермен, үлкен массивтермен, векторлармен
немесе деректер элементтерінің үлкен жиынымен байланысты операци-
яларды орындаса, онда жадқа қолжетімділік шығындары нәтиже мәні
бойынша шақырудағы көшірудегі шығындарға қарағанда көбірек болуы
мүмкін.
4. Бөлінген есептеулерде, шақырушы және шақырылатын бағдарламалар

186
екі түрлі процессорларға немесе компьютерге тиесілі, сілтеме бойынша 
шақырудағы жадқа қолжетімділік біршама болады және нақты параме-
трдің жергілікті көшірмесімен жұмыс істеген тиімді. 
4.12-мысал.
4.7-суретте көрсетілген бағдарламаның көмегімен нәтиже мәні бойын-
ша шақыру мен сілтеме бойынша шақыру арасындағы айырмашылықты 
белгілейік. Сол жақтағы бағанда сілтеме бойынша шақыру бағдарлама-
сының нұсқасы, ал оң жақ бағанда сол бағдарламаның нәтиже мәні бой-
ынша шақыру бағдарламасының нұсқасы көрсетілген. 
«&» белгісі ауыспалының мекенжайын білдіреді, ал “*” белгісі нақты 
параметр  мәніне  қолжетімділік  көрсетішкінің  атауын  өзгерту  үшін 
қолданылады. Сілтеме бойынша шақыру бағдарламасының нұсқасын-
да нақты параметрдің жад ұяшығы операторларды орындау тәртібінде 
жаңарады. Тиісінше, i ауыспалысының түпкілікті мәні 2-ге тең болады. 
Нәтиже  мәні  бойынша  шақыру  бағдарламасының  нұсқасында  нәтиже 
сол  жақтан  оңға  қарай  тәртіпте  шақырылатын  ресімнің  соңында  кері 
қайтарылады. Тиісінше, i ауыспалысының түпкілікті мәні “k” формалды 
параметрінің түпкілікті мәні болады, яғни 4-ке тең.
4.4.5 Атауы бойынша шақыру
Атауы бойынша шақыру бұл – формалды параметр нақты параметрдің 
тұтас өрнегіне қандай-да бір есептеусіз орын ауыстырғанға дейін орнын 
басатын параметрлерді берудің негізгі үшінші санаты және осы орнын 
басқан  шақырылған  ішкі  бағдарламаның  денесі  ауыстыру  деп  атала-
тын тәсіл көмегімен сауал бойынша шақырушы процедура ортасында 
орындалады.  Ауыстыру    бұл  –  шақырушы  процедура  ортасы  нақты 
параметрге қол жеткізсе, әрбір кезде есептелетін,есептелмеген өрнек-
ті параметрсіз процедура. Ауыстыру нақты параметрінің мекенжайын 
өрнек шақырушы процедура ортасында есептелген әрбір ретте қайтара-
ды. Егер орнын басқан соң шақырылатын ішкі бағдарлама денесі шақы-
рушы бағдарламада жарияланған ауыспалыда атау қақтығысы туындай-
тын жергілікті ауыспалыдан тұрса, онда шақырылатын ішкі бағдарлама 
денесіндегі жергілікті ауыспалының атауы атау қақтығысын болдырмау 
үшін өзгереді.  Атауы бойынша шақыру мен мәні бойынша шақырудағы 
айырмашылық мынада: атау бойынша шақыру кезінде нақты параметр-
дегі өрнек орнын басу алдында тікелей есептелмейді. Керісінше, ол ор-
нын басу орындалғанша кейінге қалдырылады және нақты параметрге 
қолжетімді болғанда әрбір ретте қайта есептеледі. 
4.13-мысал

187
4.8-суретте  атауы  бойынша  шақыру  параметрін  беретін  бағдарлама 
көрсетілген.  Сол  жағында  нақты    бағдарлама,  ал  оң  жағында  “sub”-
шақырылатын ішкі бағдарламасына жүгінгеннен кейінгі орындау уақы-
тындағы бағдарлама көрсетілген.
a, b, және формалды параметрлері қандай да бір есептеулерсіз xyx
z өрнегіне және w –ге орны ауыстырылады.
Тағайындау операторы өрнегінің оң жақ бөлігіндегі z ауыспалысында 
main  бағдарлама  ортасында  жарияланған  z  ауыспалысына  сәйкес  ке-
леді және sub ішкі бағдарламасында z жергілікті ауыспалысымен атау 
қақтығысына түседі.
Осылайша,  z ауыспалысы z1 –ге атауын өзгертеді және шақырылатын 
ішкі бағдарламасындағы орнын басқан дене логикалық түрде шақыру 
орнына  қойылады.  Нәтиже  4.8-суреттің  оң  жақ  бағанында  көрсетіл-
ген. Жалпы жағдайда, өрнекті қойғаннан кейін sub ішкі бағдарламасы-
ның денесі шақырылатын бағдарламасы блогының қызметін атқарады. 
Бағдарламаны орындау кезінде z1 (3 + 4) * (3 + 4) + (3 + 5) *(3 + 5) 
есептеуімен байланыстырылады, түпкілікті мәнді w ауыспалысы алады. 
Атауы  бойынша  шақыру  бұл  –  қуатты  тетік.  Соған  қарамастан,  оның 
кемшілігі бар:
1. Ауыстыруды  пайдалану  себепті  есептеуді  тоқтату,  ол  бағдарламаны
орындау мен есептеуде қосымша шығындарға алып келеді.
2. Атау қақтығысын шешу сондай-ақ қосымша шығындарды қажет етеді.
Ауыстыру  кезінде  өрнекті  есептеуді  тоқтату  жад  ұяшығындағы  иден-
тификатордың  көрінісі  орындау  уақытында  өзгеруі  мүмкін  екендігін
білдіреді,  ал  бұл  құрылымы  бойынша  бағдарламаны  түсінуден  айыр-
машылығы бар бағдарламаның орындалу уақытындағы бағдарлама си-
патында маңызды проблемаларды тудырады.
Бағдарлама
sub  ішкі  бағдарламасын  шақырғаннан 
кейінгі бағдарламаның сипаты
program main

integer x, y, z;
real r;
x = 3; y = 4; z = 5;
call sub(x + y,  x + z,  w);
}
subprogram sub (name a, b, w)
{  integer z;
z = a * a + b * b; w = square_root(z);
}
program main

integer x, y, z;
real w;
x = 3; y = 4; z = 5;

integer z1; % rename the variable
 z1 = (x + y) * (x + y) + (x + z)
* (x + z);
w = square _ root(z1);
}
}
 4.8-сурет.  Атауы бойынша шақыру тетігіне мысал.

188
program main
program main
{  integer  i, j, k; integer a[5];
    k = 3; j = 2;
for(I=0; I=<4; i++) a[i]=0;

integer temp;
temp = j; j = k; k = temp;
}
{  integer temp;
temp = k; k = a[k]; a[k] = temp;
}
}
{  integer  i, j, k; integer 
a[5];
k = 3; j = 2;
for(I=0; I=<4; i++) a[i]=0;
swap(name j, k);
swap(name k, a[k];
}
subprogram  swap(name 
m, n);
{  integer temp;
temp = m; m = n; n = 
temp;
}
4.9-сурет.  Атауы бойынша шақырудың жад ұяшықтарындағы түсініспе-
ушілік  проблемасы.
Атауы бойынша шақыру бағдарламаларында, әсіресе a[i] индекстелетін 
элементтері бар бағдарламаларда тұжырымдамаларды бекіту өте қиын, 
себебі “i” мәні 4.9-суретте және 4.14-мысалда көрсетілгендей, белгілен-
ген жад ұяшықтарымен байланысты, a[i] үшін жазылуы мүмкін бағдар-
ламадағы  “a[i]” идентификаторымен байланысты жад ұяшығын өзгерте 
отырып, өрнек ретінде есептелуі мүмкін. 
4.14-мысал
4.9-суретте swap ішкі бағдарламасына бірнеше жүгінулердің көмегімен 
ауыспалының мәнін ауыстыратын бағдарлама көрсетілген.
 Бірінші кезекте ол j және k мәндерін ауыстырады, содан кейін k және 
a[k] мәндері ауыстырылады. Ауыстыру ресімі стандартты болып табы-
лады. Суреттегі оң жақ бағанда атауды шақыру кезіндегі бағдарламаның 
сипаты көрсетілген.
swap(j, k)-ге бірінші жүгінуде, барлығы дұрыс жұмыс істейді, j = 3 және 
k= 2 мәні беріледі. Бірақ екінші шақыруда k = a[2], 0-ге тең мән беріледі. 
k 0-ге тең болса, онда a[2] жаңаруының орнына, бағдарлама a[0]-ны 2-ге 

189
тең ескі k мәніне дейін жаңарады.
Атауы  бойынша  шақыру  жад  ұяшықтары  шатасатындықтан,  импе-
ративті  тілдерде  қолданылады.  Атауы  бойынша  шақыру  алдында 
ALGOL-60  тілінде  көрсетілген.  Соңынан  оны  басқа  бағдарламалау 
тілдерінің императивті тілдерінде пайдалануды тоқтатты. Соған қара-
мастан,  қажеттілігі бойынша шақыру деп аталатын атауы бойынша 
шақыру нұсқасы функционалдық бағдарламалау тілдерінде пайдаланы-
лады, ол өрнекті есептеуді қажет болғанға дейін ұстап тұрады. Haskell 
тілі  бұл  –  бағдарламалау  тіліне  мысал,  мұнда  қажеттілігі  бойынша 
шақыру пайдаланылады.

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




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

    Басты бет