Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодАлгКП.doc
Скачиваний:
109
Добавлен:
18.02.2016
Размер:
2.27 Mб
Скачать

Практикалық жұмыс №10

Тақырыбы: Ішкі программалар

Жұмыс мақсаты: Программа ішіндегі ішкі программаларды: процедуралар менфункцияларды құру мүмкіндіктерін қарастыру

Жұмыстың орындалу тəртібі:

  1. Теориялық мəліметтермен танысу.

  2. Жеке нұсқада тапсырмалар орындау.

  3. Бақылау сұрақтарына жауап беру.

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

10.1 Негізгі түсініктер

10.1.1 Процедураны сипаттау жəне шақыру

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

Процедура – арнайы ат берілген, қандай да бір аргументтер санына байланысты нəтижені есептеуге арналған операторлар жиынтығы.

Процедура немесе функция (жалпы аты – ішкі программа) негізгі программаның немесе басқа процедураның (функцияның) сипаттау бөлімінде анықталады. Процедураның (функция) құрылымы негізгі программа құрылымына ұқсас: тақырып бөлігі, сипаттау бөлігі жəне орындалу бөлігінен тұрады.

Процедура тақырыбының синтаксисі:

PROCEDURE <процедура аты> [( <формальді параметрлер тізімі >)];

Мысалы:

PROCEDURE PR1 ( A,B,C : INTEGER; VAR S: REAL);

мұндағы PR1 – процедура аты, ал А,В,С,S – параметр болып табылатын айнымалылар аты.

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

Процедура операторы процедураны негізгі программадан немесе басқа процедурадан (функциядан) шақыруды іске асырды.

Шақыру төмендегі форма бойынша іске асырылады:

<процедура аты > [(<нақты параметрлер тізімі>)];

Жоғарыда келтірілген процедура аты үшін төмендегідей шақыру операторын жазуға болады:

PR1 (A,B,C,S);

Процедура тақырыбындағы тізім форматының процедураны шақырудағыдан айырмашылығы бар. Шақыру кезінде айнымалылар, тұрақтылар жəне өрнектер үтір арқылы жазылады, ал тақырыпта, айнымалылардың жазылуы айнымалыларды сипаттау бөліміндегі айнымалыларды жариялауға ұқсас келеді. Тізімдегі барлық элементтер үшін мəндер типі көрсетілу керек. Бір типке жататын айнымалылар үтір арқылы жазылады, ал əр түрлі типтегі мəндер тобы нүктелі үтір арқылы ажыратылады. Процедура орындалғаннан кейін, басқару процедураны шақыру операторынан кейін ораласқан жолға беріледі.

Сонымен, процедура деп қандай да бір есепті шешуге арналған атауы бар программа бөлігін атайды. Процедура программаның процедураны сипаттау бөлімінде көрсетіледі.

Процедураның жазылуының жалпы түрі:

PROCEDURE процедура аты ( типтері сипатталған формальды параметрлер тізімі );

<сипаттау бөлімдері>

Begin

операторлар бөлімі

End;

Формальды параметрлер деп процедура ішінде қолданылатын және процедураны әр шақырғанда әртүрлі бастапқы және соңғы ие болатын айнымалыларды атайды.

Программаның процедура бөліміндегі негізгі программаға қатысы жоқ айнымалы жергілікті айнымалы деп аталады. Олар процедурадан қатысы жоқ айнымалы жергілікті айнымалы деп аталады. Олар процедурадан шығу кезінде жойылып кетеді. Жергілікті айнымалылар процедураның VAR бөлімінде сипатталуы тиіс.

Негізгі программаның қажетті жерінде процедураны шақыру операторы орналасады.

Процедураны шақыру операторының жазылу үлгісі:

Процедура аты (нақты параметрлер тізімі);

Мысал: ABCDE бесбұрышының қабырғалары AB=m, BC=n, CD=r, DE=t, EA=q, диагоналдары AC=u, AD=v. Үшбұрыш ауданын табуға арналған GERON процедурасын қолданып, бесбұрыштың ауданын табыңдар.

Program Audan; {негізгі программа}

Var m, n, r, t, q, S1, S2, S3, Z:real;

Procedure GERON (a,b,c:real; Var S:real);

Var P: real; {P-жергілікті айнымалы}

Begin {процедура басы}

P=(a+b+c)/2;

S:=sqrt(P*(P-a)*(P-b)*(P-c));

End; {процедура соңы}

begin {негізгі программа басы}

readln(m, n, r, t, q, u, v);

GERON(m, n, u,S1);

GERON(r, u, v,S2);

GERON(t, q, v,S3);

Z:=S1+S2+S3;

Writeln(‘Бесбұрыштың ауданы’,Z);

End. {негізгі программаның соңы}

Көрсетілген мысалды P- жергілікті айнымалы m, n, r, t, q, u, v-нақты параметрлер, a,b,c-формальды параметрлер. GERON процедурасы негізгі программада 3 рет шақырылады.

10.1.2 Функцияны сипаттау

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

Функция тақырыбының синтаксисі:

FUNCTION <функция аты >[(<формальді параметрлер тізімі >)]:

<нəтиже типі>;

Мысал:

FUNCTION PRF (A,B,C: INTEGER) : REAL;

Функцияны сипаттаудың процедурадан айырмашылығы:

• функция орындалуының нəтижесі тек бір ғана мəн болуы тиіс;

• нəтиже идентификаторы формальді параметрлер тізімінде көрсетілмейді;

• функцияның орындалатын бөлігінде, функция атына кем дегенде бір рет нəтиже мəні меншіктелуі керек (көбіне функциядан шығарда);

• формальді параметрлер тізімінен кейін нəтиже мəні көрсетіледі;

• функция шақырылғаннан кейін басқару өрнектің функциядан кейінгі операциясына беріледі.

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

S:=PRF ( A,B,C); Writeln ( PRF ( ,B,C));

If PRF ( A,B,C)>20 then K=K+1;

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

Функцияның жазылуының жалпы түрі:

FUNCTION функция аты(формальды параметірлер аты:типі):нәтиженің типі;

Begin

Функция денесінің операторлары

End;

Функция нәтижесі функция атымен бірдей болу керек.

Функцияны шақыру операторының жазылу үлгісі:

Нәтиже:=функция аты (нақты параметірлер);

Мысалы:екі натурал санның ең ортақ бөлгішін табу функциясын қолданып (EYOБ), 4 натурал санның ең үлкен ортақ бөлгішін табыңдар.

Program m1;

Var a,b,c,d,M1,M2,M:integer;

FUNCTION EYOB`(x, y:integer):integer;

Begin

While x<>y do

If x>y then x:=x-y then y:=y-x;

EYOB:=x;

End;

begin

readln(a,b,c,d);

M1:=EYOB(a,b);

M2:=EYOB(c,d);

M:=EYOB(M1,M2);

Writeln( ‘4 санның EYOB-i=’ ,M);

end.

Қарастырылған мысалда функцияның аты мен функция нәтижесінің аты бірдей (EYOB).

x,y- формальды параметрлер, a,b,c,d-нақты параметрлер.

10.1.3 Формальді жəне нақтылы параметрлер

Процедураны (функцияны) сипаттағанда оның тақырыбында келесі параметрлер түрі көрсетілуі мүмкін:

• параметр-мəн;

• параметр-айнымалы;

• параметр-тұрақты;

• параметр-процедура;

• параметр-функция.

Параметрлерді жазғанда мыналарды есте сақтау керек:

• формальді жəне нақтылы параметрлер саны бірдей болуы керек;

• нақтылы параметрлердің жазылу реті мен типі сəйкес формальді параметрлердің жазылу реті мен типіне сəйкес болуы керек;

• формальді жəне нақтылы параметр идентификаторлары бірдей болуы мүмкін;

• формальді параметрлер Турбо Паскаль тілінде тақырып бөлігінде сипаттамалармен бірге болады жəне оларды процедураның (функцияның) сипаттау бөлігінде хабарлаудың қажеті жоқ;

• формальді параметрлер қарапайым немесе ертеде анықталған типті болуы керек.

Ішкі программаға жиымды берер кезде оны алдын ала TYPE

типтерді сипаттау бөлімінде сипаттау керек.

Мысал.

TYPE TV=ARRAY [1..30] OF INTEGER; TM=ARRAY [1..20,1..20] OF REAL;

...

PROCEDURE TOP ( A:TM; VAR B: TV ; N: INTEGER);

...

Мұнда жиымның екі типі сипатталған. TV – бір өлшемді жиым үшін жəне TM – екі өлшемді жиым үшін. Формальді параметрлер тізімінде А жəне В айнымалылары үшін, сəйкесінше, матрица мен векторды алдын ала анықтаған типтер қолданылады.

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

Параметр-мəн

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

Параметр-айнымалы

Сілтеме бойынша шақырғанда, ішкі программада берілетін айнымалылар үшін жадыдан орын бөлінбейді. Ішкі программаға айнымалының мəні емес, сəйкес нақты параметрдің жадыдағы орнына сілтеме беріледі. Осы айнымалымен есептеулер жүргізетін ішкі программа шын мəнінде сəйкес нақты параметрмен жұмыс істейді. Сондықтан, процедура орындалғанда айнымалымен орындалған өзгерістер сақталады. Параметр-айнымалыны жазған кезде формальді параметрлер тізімінде VAR қызметші сөзі көрсетіледі. Есептелетін нəтижелер үшін тек параметр-айнымалылар қолдануға болады. Формальді параметр- айнымалылар үшін нақтылы мəн ретінде тұрақты немесе өрнек қолдануға болмайды. Себебі, олардың адресі жоқ.

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

Ашық жиымды қолдануға мысал қарастырайық. Бір өлшемді жиым элементтерінің қосындысын есептеу керек.

FUNCTION SUM (VAR A: ARRAY OF INTEGER):INTEGER; VAR S,I : INTEGER;

BEGIN S:=0;

FOR I:=0 TO HIGH(A) DO S:=S+A[I];

SUM:=S; END;

Негізгі программада мұндай жиымды Var A: array [ -2 .. 3] of integer; түрінде сипаттауға болады. Бұл жерде ең маңыздысы жиымның нақты шекарасы емес оның элементтерінің саны, ол

6-ға тең.

10.1.4 Атаулардың əсер ету аймағы

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

Сурет 10.1. Атаулардың əсер ету аймағы

Суретте жеке идентификаторлардың қызмет аумағы схема түрінде көрсетілген:

• Y – 4 блоктың жергілікті айнымалысы, оған 1,2,3 блоктан қол жеткізуге болмайды.

• K, L – 2 блоктың жергілікті айнымалысы, оған 1,3,4 блоктардан қол жеткізуге болмайды.

• C – 3 блоктың ауқымды айнымалысы, 1 жəне 2 блоктан қол жеткізуге болмайды.

• B, D - 2,3,4 блоктардың ауқымды айнымалылары, 1,2,3,4

блоктардан қол жеткізуге болады.

• T - жалпы тип.

А идентификаторы əр түрлі екі айнымалыны білдіреді: А – қызмет аумағы 1 жəне 2 блоктар жəне А' айнымалысы – қызмет аумағы 3 жəне 4 блоктар. Х атауы да дəл осы сияқты: Х айнымалысы – қызмет аумағы 1, 2 жəне 3 блоктар жəне Х' айнымалысы қызмет аумағы тек 4 блок.

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

10.1.5 Рекурсивті процедуралар жəне функциялар

Рекурсия - процедура немесе функция өз құрамына кіретін операторларды орындау барысында, өзін өзі немесе басқа процедура жəне функция арқылы өзін шақыратын есептеу процесін ұйымдастыру тəсілі.

Рекурсия тікелей немесе жанама болуы мүмкін. Тікелей рекурсия кезінде ішкі программаны шақыру операторы оның орындалу бөлімінде орналасады. Кез келген тікелей рекурсивті процедураны (функцияны) рекурсивсіз етуге болады. Рекурсивті сипаттама əдетте қысқы жəне көрнекті, бірақ көп машиналық уақытты (қайталап шақыру керек болғандықтан) жəне жадыны (айнымалылардың бірнеше рет қайталануынан) қажет етеді.

Рекурсивті ішкі программа бір рет сырттан шақырылады. Рекурсивті процедура немесе функцияның жұмысының аяқталау шарты оның өзінде жазылады.

Мысал қарастырайық. F=M! мəнін есептеу керек. Факториал мəнінің рекурсивті анықтамасын төмендегідей түрде жазуға болады:

М=1 болғанда F=1

М> 1 болғанда F= M!= M*(M-1)!, демек М! (М-1)!

арқылы анықталады.

a) Рекурсивті функция

PROGRAM MAIN;

VAR M: INTEGER;

F:REAL;

FUNCTION FACT (N:INTEGER): REAL;

BEGIN

IF N=1 THEN FACT:=1

ELSE

FACT:= N* FACT(N-1);

END; BEGIN

READLN(M); F:= FACT ( M ); WRITELN (‘ M!=’, F);

END.

b) Рекурсивті процедура

PROGRAM MAIN;

VAR M: INTEGER;

F:REAL;

PROCEDURE FACT(N:INTEGER; VAR F: REAL);

VAR Q : REAL;

BEGIN

IF N=1 THEN Q:=1

ELSE FACT(N-1,Q);

F:=N*Q; END;

BEGIN READLN(M);

FACT ( M, F );

WRITELN (‘ M!=’, F);

END.

Есептің а) нұсқасында М=4 болғанда келесі іс-əрекет орындалады:

FACT:=4*FACT(3);

FACT:=3*FACT(2);

FACT:=2*FACT(1);

FACT(1):=1.

Функция бірінші рет шақырылғанда жадыдан параметр- мəнге сəйкес жергілікті айнымалылар үшін орын бөлінеді. Оған нақтылы параметрдің (М) мəні меншіктеледі. Функцияға əр кірген сайын жаңа жергілікті айнымалылар құрылады. FACT(1)=1 болғандықтан функцияның орындалуы тоқтатылады. Бұдан кейін келесі іс-əрекеттер орындалады:

FACT(1):=1;

FACT:=2*FACT(1);

FACT(2):=2;

FACT:=3*FACT(2);

FACT(3):=3*2=6;

FACT:=4*FACT(3); т.е. FACT=24.

ЖЕКЕ ТАПСЫРМАЛАР НҰСҚАЛАРЫ

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

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

  3. Берілген натурал санның жай сан екенін анықтау процедурасын қолданып, Nнен кіші барлық жай сандарды табыңдар.

  4. Кез-келген санның цифрларының қосындысын табу функциясын қолданып, цифрларының қосындысы m-ге тең (m<27) барлық 3 таңбалы натурал сандарды табыңдар.

  5. Екі нүктенің ара қашықтығын табу процедурасын қолданып, төбелері берілген үшбұрыштың периметрін табыңдар.

  6. Сөздегі дауысты дыбыстарды санау ішкі программасын қолданып, сөздер массивіндегі әр сөздегі және барлық массивтегі дауысты дыбыстардың санын табыңдар.

  7. Жазықтықтағы теңдеуі берілген 2 түзудің қиылысу нүктесін табу процедурасын қолданып, берілген L1, L2, L3 түзулерінің қиылысуынан пайда болған үшбұрыштың төбелерінің координаталарын табыңдар.

  8. Нүктеден шеңбер центріне дейінгі қашықтықты табу функциясын қолданып, 8 элементтен тұратын нүктелер массивінің центрі (1,1), радиусы R шеңберге тиісті нүктелерінің санын табыңдар.

  9. 2 санның ең үлкенін табу функциясын қолданып есептеңдер.

  10. n!-ды табу процедурасын қолданып берілген m,k натурал сандар үшін мәнін табыңдар.

  11. a,b,c,d сандары берілген. x=max(a,b), y=max(c,d), z=max(x,y) мәндерін анықтаңыз. max(k,m) (к және м екі санның үлкенін табу) мәнін есептеуді функция арқылы өрнектеңіз.

  12. Нақты х және бүтін n-нен алынған xn-ді есептеуді (біртіндеп көбейту арқылы) Dar(x,n) функциясы арқылы өрнектеңіз және оны жұмыста сынап көріңіз.

  13. Екі үшбұрыштың төбелерінің координаттары берілген. Олардың қайсысының ауданы үлкен екенін анықтаңыз. Ауданды координаты бойынша есептеуді функция арқылы өрнектеңіз.

  14. Төрт натурал сан берілген. Осы сандардың ең кіші ортақ еселігін(ЕКОЕ) табыңыз. Екі санның ЕКОЕ табуды функция арқылы өрнектеңіз.

  15. Жазықтықтағы n нүктелердің координаттары Х,У жиымдары түрінде берілген. Ең қашық және ең жақын нүктелерді табыңыз. Екі жұп нүктенің арақашықтығын есептеуді функция арқылы өрнектеңіз.

  16. a,b,c,d кесінділері берілген. Осы кесінділердің үшбұрыш құруға болатын әрбір үшеуі үшін сол үшбұрыш ауданын басып шығарыңыз. Берілген x,y,z қабырғалары бойынша үшбұрыш ауданын оның бар-жоқтығын тексеретіндей етіп есептеуді процедура түрінде өрнектеңіз.

  17. a/b бөлшегін қысқармайтын p/q бөлшегіне келтіріп және оның жұмысын тексеретін kisk(a,b,p,q) процедурасын бүтін параметрлер бойынша сипаттаңыз.

  18. n саны берілген. Осы санның барлық жай бөлгіштерін алу керек. Жай санды тану процедурасын өзінше өрнектеңіз. (Жай сан деп бір мен өзінен басқа бүтін санды бөлгіштері жоқ санды айтады)

  19. Натурал n, бүтін a1,a2,…,an сандары берілген.

а) толық квадраттардан тұратын;

б) бестік дәрежесінен тұратын;

в) жай сандардан тұратын ішкі тізбек алыңыз.

Бақылау сұрақтары

  1. Ішкі программа не үшін қолданылады?

  2. Паскальда ішкі программаның қандай түрлері бар?

  3. Процедураның жалпы түрі қалай жазылады?

  4. Функцияның жалпы түрі қалай жазылады?

  5. Негізгі программада процедура мен функцияны шақыру операторлары қалай жазылады?

  6. Формальды параметр деген не?

  7. Нақты параметр деген не?

  8. Жергілікті айнымалы деген не?

  9. Функция мен процедураның қандай ұқсастығы бар және айырмашылығы қандай?

  10. Рекурсия деген не?

Ұсынылатын әдебиеттер: 1, 2, 8