Программалау тілі Павлодар 2005 1 ббк 32. 973-01я73 Қ59



Pdf көрінісі
бет5/7
Дата28.01.2017
өлшемі0,52 Mb.
#2916
түріПрограмма
1   2   3   4   5   6   7

Есеп:  екі   оң   сандар   үшін,   ең   үлкен   орта   бөлгішін   табу 
программасын құрайық. 
Екі санның біреуі 0 тең болғанға дейін цікл ұйымдастырылады. 
Whіle циклін қолданайық. 
Сонда блок схемаға сәйкес программа мына түрде жазылады:
Program  NOD;
Var   a,b : іnteger;
Begіn
Wrіteln(‘вв.два числа’);
Readln(a,b);
Whіle  b > 0  do
Begіn
c := a  mod  b;
a := b;
b := c;
end;
Wrіteln(‘nod= ‘, a);
readln;
End
Есептер
1. Осы   есептің   алгоритмін   басқаша   қалай   ұйымдастыруға 
болады?
2. Repeat …until  циклін қолданып программаға аударыңыз.
3.
Үш   санның   ең   үлкен   орта   бөлгішін   табу   керек.   Ескерту: 
ЕҮОБ(a,b,c) =  ҮОБ(ЕҮОБ(a,b),c)
4.
Берілген   натурал   x   және   y   сандары,   қатарынан   нөлге   тең 
емес.   D   =   ЕҮОБ   (x,y)   табу   және   d   =   q*x   +   w*y   теңдігін 
қанағаттандыратын, бүтін d  және w  сандарын іздеу.
2.12. Процедуралар және функциялар
Турбо   Паскаль   тілінде  ішкі   программаның  екі  түрі   бар   – 
процедуралар   және   функциялар.   Олардың   құрылымдары   негізгі 
програманың құрылымына өте ұқсас. 
Процедуралар
Ескерту:  процедураның   сипаттамасы  міндетті  түрде 
тақырыппен басталуға тиіс. 
Тақырыпта procedure резервтелген сөзінен кейін процедураның 
аты   жазылады,   ары   қарай   дөңгелек   жақшаның   ішінде  формалды 
параметрлердің тізімі сипатталады. Тақырыптың соңында үтір нүкте 
қойылады.
Процедураның жалпы форматы:
46
a, b
b>0
ЕҮОБ
а
c:=a mod b;
a:=b;   b:=c;
басы
соңы

Procedure <процедураның аты>  {<параметрлері>};
<сипаттау бөлімі>
begin
<операторлар бөлімі>
end;
Процедураның   орындалу   нәтижесінде   –   бір  немесе   бірнеше 
мәндер   есептеледі.   Ол   (немесе   олар),   негізгі   программаға   оның 
параметрінің мәні ретінде беріледі. Процедура шақырылғанда оның 
формалды  параметрлері,   негізгі   программадағы   сәйкес  нақты 
параметрлерге тізбектелу кезегімен ауысады.
  Нақты   параметрлер  –   негізгі   программадан   процедура 
шақырылғанда,   оған  тізбектелу   кезегімен  мәндерін   беретін 
параметрлер.
Ескерту:  формалды және нақты параметрлердің саны және 
типтері дәлме-дәл тізбектелу тәртібімен сәйкес келу керек!
Формалды параметрлер –  бұл, нақты  параметрлерге мәндерін 
беруге   типін   және   орнын   анықтайтын,  процедурада   қатынасушы 
жалған айнымалылар.
Формалды   параметрлер   екі   түрге   бөлінеді:   айнымалы- 
параметрлер және мәндік параметрлер.
  Айнымалы-   параметрлердің    алдында  Var  сөзі   тұрады. 
Процедура   орындалу   нәтижесінде   бұл   айнымалы-параметрлердің 
мәндерінің   өзгергу   салдарынан,   негізгі   программада   оған   сәйкес 
нақты-параметрлердің мәндері өзгертеді.   
  Мәндік-  параметрлердің    алдында  Var  сөзі   тұрмайды. 
Процедураның   ішінде   мәндік-   параметрлермен   кез   келген   амалдар 
орындалып, мәндері өзгерседе нақты-параметрлердің мәндеріне әсері 
болмайды. 
Программада барлық айнымалылар глобальды және  жергілікті 
деп   бөлінеді.  Глобальды   айнымалылар  негізгі   программаның 
сиппаттау   бөлімінде   жаряланады.
 Жергілікті 
айнымалылар 
процедураларда және функцияларда жаряланады.  
Мысал
A
n
 – есептейтін программа құру керек, мұндағы және (n 

 0) 
бүтін сандар, клавиатурадан енгізіледі. 
Шешімі
Бүтін   санның   дәрежеге   шығаруын   есептейтін   процедура 
құрайық.
Procedure Degree (x, y : Integer; Var st : Longint);{тақырыбы}
Var i : Integer;
{сипаттау бөлімі}
47

Begin
{процедураның денесі}
St := 1;
For I := 1 to do 
st := st * x;
End;
Процедура    Degree  деп   аталды.   Жақшаның   ішінде  формалды 
параметрлердің   тізімі   типтерімен   сипатталды.   Үш   параметр 
қолданылды: біріншісі – дәреже негізі, яғни дәрежеге шығарылатын 
сан, екіншісі – дереже, ұшіншісі – нәтиже.
Бірінші   екі  x  және  y    –  мәндік  параметрлер,   үшінші  st 
айнымалы-   параметр,   сондықтан   алдында  Var  сөзі   нұсқалды   (st 
Longint  типті,   себебі   дәрежелік   функцияның   нәтижесі   тез   өседі). 
Процедураның   сипаттау   бөлімінде  цикл   санын   есептейтін  i   – 
айнымалысы жарияланды.
Процедураның   денесінде,   яғни  Begin  және  End  сөздерінің 
арасында x санының дәрежесі For циклымен есептеледі.
Degree процедурсын пайдаланып жазылған бүкіл программаның 
түрі мынадай болуы мүмкін: 
Program Example_st;
Var a, n : Integer;
 s : Longint;
Procedure Degree (x, y : Integer; Var st : Longint);
Var i : Integer;
Begin
St := 1;
For i := 1 to do 
st := st * x;
End;
Begin
Writeln(‘Вв. два числа – основание и показатель степени’);
Readln(a, n);
Degree(a, n, s);
{процедураны шақыру}
Writeln(‘Результат  ’, s);
Readln;
End.
Негізгі   программадан   Degree   процедурасы   оператор   сияқты 
шақырылды.   Жақшаның   ішінде  нақты  a,  n  және  s  параметрлері 
жазылған. 
Программа  орындалғанда  нақты  a,  n  және  s  параметрлерінің 
мәндері, сәйкес формалды x, y және st параметрлеріне меншіктелді.
48

Процедураның   жұмысы   аяқталғанда  a  және  n  айнымалы-
ларының мәндері өзгермейді, ал айнымалысы жаңа мән қабылдайды.
Енді а = 3 және n = 4 мәндері үшін программаның орындалу 
тәртібін  көрсетейік. Программада Degree(a, n, s) процедураның аты 
кезіккенде компьютер мына әректтерді орындайды:
-
Degree   процедурасында   сипатталған   айнымалыларға   жады 
ұйяшықары бөлінеді;
-
нақты  параметрлердің   мәндерін  формалды  параметрлерге 
меншіктейді: x := a (x = 3), y := n (y = 4), st := s;
-
процедураның операторлары орындалады, яғни 3
4
 есептейді;
-
табылған   нәтиже  s  айнымалысына   меншіктеледі,  a  және  
айнымалыларының   мәндері   өзгерусіз   қалады.   Осыдан   кейін 
программа, процедураны шақыру нүктесіне қайта барып, одан кейінгі 
операторлар орындалады.
Бұл процессті схема түрінде былай бейнелейік:
Суретте негізгі және процедурада қолданылған айнымалыларға 
жадыда бөлінген ұйяшықтар рамка түрінде көрсетілген. 
Мысал
49
Program Example_st;
Degree(a, n, s);
процедураны шақыру 
n
4
s
-
a
3
Procedure Degree
Begin
End;
x
3
y
4
st
-
i
-
Program Example_st;
Degree(a, n, s);
шақырылған нүктеге қайту  
n
4
s
81
a
3
Procedure Degree
Begin
End;
x
3
y
4
st
i
-
81

Екі бүтін айнымалы берілген. Олардың мәндерінің орындарын 
ауыстыру керек.
Шешімі
Айнымалылардың   мәндерінің   орнын   ауыстыруды   екі   әдіспен 
орындауға   болады   –   аралық   айнымалыны   колданып,   немесе 
қолданбай.
Бірінші әдіске сәйкес келетін процедураны жазайық.
Procedure Swap (Var x, y : Integer);
Var z : Integer;
Begin
z := x;
x := y;
y := z;
End;
Процедура  Swap деп аталды. Оның екі формалды параметрлері 
айнымалы-параметрлер   болады.   Себебі   олардың   мәндерінің   орны 
ауыстырылғаннан   кейін   өзгерілген   мәндерді   сақталуы   қажет.   Осы 
параметрлер процедураның орындалу нәтижелері болады.
Процедурада   сипатталған  z  аралық   айнымалы   ретінде 
қолданылады.
Программаның тұтастай түрі мынадай:
Program Example_sw;
Var a, b : Integer;
Procedure Swap (Var x, y : Integer);
Var z : Integer;
Begin
z := x;
x := y;
y := z;
End;
Begin
Writeln(‘Вв. два числа’);
Readln(a, b);
{мәндерді енгізу}
Swap (a, b);
{процедураны шақыру}
Writeln(‘a =’, a, ‘b =  ‘,b);
{жаңа мәндерді шығару}
Readln;
End.
Мысалда процедураның айнымалы-параметрлеріне екі параметр 
жіберіледі.   Процедура   орындалғаннан   кейін   олар   жаңа   мәндер 
қабылдайды: a айнымалысының мәні b – ға тең, ал b айнымалысының 
мәні a – ға тең болады.
50

Есептер
1.
Бірінші   мысалдағы  Degree   процедурасын   қолданып   мына 
өрнектің мәнін есептеу керек:
Y = a
1
*x
4
 + a
2
*x
3
 + a
3
*x
2
 + a
4
*x
1
 + a
5
,
мұндағы   a
1
,   a
2
,   a
3
,   a
4
,   a
5
  коэффициенттері   және   x   саны 
клавиатурадан енгізіледі.
2.
Екінші   мысалдағы   Swap   процедурасын   қолданып   үш  a,  
және айнымалыларының мәндерін өспелі реттеу керек.
3.     Үшбұрыштың   үш   төбесінің   координаттары   берілген. 
Барлық қабырғаларының ұзындықтарын табу керек.
4. Натурал   саны   берілген.   Оның   барлық   бөлгіштерін   тауып, 
санын есептеу керек.
5. ABC   үшбұрышының   үш   төбесінің   координаттары   және 
төртінші D нүкесінің координаты берілген. Осы нүкте үшбұрыштың 
ішкі нүктесі болама?
 Пысықтау сұрақтары
1. Ішкі программа деген не? Ол не үшін қолданылады? Қандай 
артықшылық береді?
2. Турбо   Паскальда   ішкі   программаның   қандай   түрлері 
қолданылады?
3. Процедураның жалпы форматының жазыуын сиппатаңыз. 
4. Формалды және нақты параметрлер деген не? 
5. Қай жерде және қалай сипатталады?
6. Формалды   айнымалы   және   мәндік   параметрлердің 
айырмашықтары неде?
7. Процедура қалай шақырылады?
8. Құрылымында   процедура   бар   программаның   орындалу 
тәртібі кандай? 
Функциялар
Функциялар  бір  мәнді   ғана   есептеуге   арналған   програмалық 
модуль. 
Тақырыбында function сөзінен кейін функцияның аты, жақшада 
формалды параметрлердің тізімі, екі нүкте, функцияның нәтижесінің 
типі нұсқалады.
Функцияның жалпы форматы:
function< функцияның аты> {<параметрлері>}:<нәтиже типі>;
<сипаттау бөлімі>
begin
<операторлар бөлімі>
< функцияның аты > := <мәні>;
51

end;
Ескерту:  функцияның денесінде  міндетті  түрде функцияның 
мәнін есептейтін бір меншіктеу операторы болуы керек: 
функцияның аты := мәні; 
Мысал
N элементтен k бойынша қайталамасыз теру санын есептейтін 
программа құру керек.
Қайталамасыз теру саны мына формула бойынша есептеледі:
)!
k
n
(
!
k
!
n
C
k
n

=
Белгілеулер: 
n, k – енгізілген сандарды сақтауға арналған айнымалылар; 
– нәтижені сақтауға арналған айнымалы.
Қайталамасыз теру санын есептеу үшін, мынаны: n!, (n-k)!, k! 
есептеу қажет.
N   cанының   факториалын:   n!=1*2*3*…*n,   есептейтін 
функцияны сипаттайық:
Function factorial(n : integer) : Longint; 
{тақырыбы}
Var  i : integer;
{сипаттама бөлімі}
rez : Longint;
Begin
{функцияның денесі}
rez := 1;
For i := 1 to n do
rez := rez * i;
factorial := rez;
{нәтижені функцияның атына}
End;
{меншіктеу}
Функциясының   нәтижесі   –   ұзын   бүтін   сан   болады.   Енді   осы 
factorial функциясын пайдаланып программа құрайық:
Program Example_fact;
Var n, k : Integer;
a1, a2, a3, c : Longint;
Function factorial(n : integer) : Longint; 
Var  i : integer;
rez : Longint;
Begin
rez := 1;
For i := 1 to n do
rez := rez * i;
factorial := rez;
End;
Begin
52

Writeln(‘Введите n и k для подсчета числа 
k
n
C
: ’);
Readln(n, k);
a1 :=  factorial(n);
{n!- есептеу}
a2 :=  factorial(k);
{k!- есептеу }
a3 :=  factorial(n-k);
{(n-k)!- есептеу}
c := a1 Div (a2 * a3);
{нәтиже}
Writeln©;
Readln;
End.
Программа   орындалғанда   функцияның   сипаттамасы   жадыда 
сақтаулы түрады. Функция өзінің атымен шақырылады, ол қандайда 
бір өрнектің ішінде тұруы мүмкін. 
Мысалы   a1:=   factorial(n)   –   дегеніміз  factorial  функциясын 
шақыруы болады. 
Функцияны   шақыруында   жазылған   параметр   –  нақты,   ал 
функцияның   сипаттамасында   жазылған   параметр   –  формалды  деп 
аталады. 
Біздің функцияда сипатталған n – формалды параметр.  Негізгі 
программадан сипатталған n – нақты  параметр. 
Функцияда   және   негізгі   программада   сипатталатын 
параметрлердің   аттары бірдей бола береді. Функция программаның 
дербес   бөлігі   болғандықтан   оның   айнымалыларына   жадыда   жеке 
ұйяшықтар бөлінеді. 
Сондықтан   программа   орындалғанда   компьютер   бірдей   атты 
айнымалыларды «шатастырмайды», себебі олардың әрекет аймақтары 
сәйкеспейді.
Енді n = 5k=3 мәндері үшін программаның орындалу тәртібін 
талдайық. 
Програмада   бірінші  a1   :=   factorial(n)  операторы   кезіккенде 
мына әректтер орындалады:
-
factorial 
функциясында   сипатталған   формалды 
айнымалыларға жадыда жеке ұйяшықтар бөлінеді;
-
формалды   параметрлерге   нақты   параметрлердің   мәндері 
меншіктеледі: n := n (n := 5);
-
бірінші  рет  функцияның   программасы  орындалады,   яғни  5 
санының факториалы табылады;
-
функция   шақырылған   жерге,   функцияның   мәні   жіберіледі, 
яғни  a1  айнымалысына   меншіктеледі.   Негізгі   программаның   келесі 
операторы a2 :=  factorial(k)   орындалады,   функция   екінші   рет 
шақырылады, т.с.
53

Сонымен   программада
 factorial 
функциясы   үш   рет 
шақырылады. Екінші ретінде k=3, үшішіде n-k=2 мәндері жіберіліп, 
нәтижелері a2 және a3 айнымалыларына меншіктеледі.
Бұл программаның оындалуын схема түрінде бейнелейік:
Мысал
Натурал санның цифрларының санын есептейтін функция жазу 
керек. Сол функцияны қолданып, берілген екі санның цифрларының 
артықтыған анықтау қажет.
Шешімі
  Ол   үшін   сан   нөлге   тең   болғанға   дейін,   соңғы   цифрларын 
жекелеп алып санау керек. Санағыштың мәнін цикл сайын 1-ге өседі 
(алғашқы мәні – 0). 
Онда мынадай функцияны сипаттауға болады:
Function Quantity(x : Longint) :Byte; 
Var  k : Byte;
{k –санағышты сипаттау}
Begin
k := 0;
{санағыштың алғашқы мәні}
While x <> 0  do
{сан нөлге тең болғанға дейін}
Begin
Inc(k);
{санағыш мәні 1-ге өседі}
x := x Div 10;
{санның соңғы цифры «кесіледі}
End;
Quantity := k;
{функцияның атына нәтиже }
End;
{меншіктеледі}
Енді   осы   функцияны   пайдаланып,   берілген   екі   санның 
цифрларының санының артықтыған анықтайтын программа құрайық:
Program Example_Quan;
54
Program Example_fact
a1 := factorial(n)
a2 := factorial(k)
a3 := factorial(n-k)
c := a1 Div (a2*a3)
n 5
k 3
a1 -
a2 -
a3 -
c -
Function factorial
Begin
End;
n
5
i
rez
120

Var n1, n2 : Longint;
k1, k2, Byte;
Function Quantity(x : Longint) :Byte; 
Var  k : Byte;
Begin
k := 0;
While x <> 0  do
Begin
Inc(k);
x := x Div 10;
End;
Quantity := k;
End;
Begin
Writeln(‘Введите два числа ’);
{сандарды енгізу}
Readln(n1, n2);
k1 :=  Quantity(n1);
{1-ші санның цифрлар саны}
k2 :=  Quantity(n2);
{2-ші санның цифрлар саны}
If  k1 = k2 Then Writeln(‘Одинаковое количество цифр’)
Else  
If k1>k2 Then Writeln(‘В первом числе цифр больше’)
Else  Writeln(‘Во втором числе цифр больше’);
Readln;
End.
Есептер
1.
Санның цифрларының қосындысын табу керек.
2.
Санның бірінші цифрын табу керек.
3.
Санның бөлгіштерінің санын табу керек.
4.
A-дан   B-ға   дейін   аралығынан,   ең   көп   бөлгіштері   бар 
сандарды табу керек.
5.
Санның барлық бөлгіштерінің қосындысын табу керек.
6.
Санның   кемелдігін   анықтау   кажет.   (алдындағы 
тапсырмадан   функцияны,   қажет   болса   өзгерте   отырып  қолдануға 
болады).
7.
Санның жай сан екенін анықтау керек.
8.
A-дан B-ға  дейін аралығынан барлық  жай сандарды  табу 
керек.
9.
Берілген   санның   полиндром   екенін   тексеретін   програма 
құру керек. (мысалы, 12721-саны полиндром)
55

10.   Берілген   сан   автоморфты   екенін   анықтау   керек,   яғни 
санның   квадраты   сол   санмен   аяқталады.   Мысалы:   6   санының 
квадраты 36 – аяғында 6.
11.
  Алдындағы   есептегі   функцияны  қолданып,   A-дан   B-ға 
дейін аралығынан барлық автоморфты сандарды табу керек.
12.
  Ең   үлкен   орта   бөлгіш   (ЕҮОБ)   функциясын   қолданып, 
бірнеше сандардың ЕҮОБ табу программасын құру керек. («Евклид 
алгоритмі» есебін қараңыз).
13.
Клавиатурадан берілген төрт санның ең кіші жалпы еселігін 
есептейтін  программа   құру   керек.   (алдыңғы   есептегі   функция 
қолданылсын).
14. Төрт   сан   берілген.   Берілген   сандардың   бірінші 
цифрларының ең үлкенін экранға шығару керек. Мысалы, егер a=25, 
b=730, c=127, d=1995, болса экранға 7 шығуы керек.
15. N   натурал саны берілген. Жай сандардың айырмасы екіге 
тең болса, оларды егіз сандар дейді. Мына n, n+1, …, 2n сандарының 
арасында егіз сандар бар ма, соны анықтау қажет.
Рекурсивті программалау мысалдары
Рекурсиялық  алгоритм  – ол, құрылымы өз ішінен өзін шақыру 
түрінде   ұйымдастырылған   алгоритм.   Осы   әдіспен   шығарылатын 
есептердің кейбір түрлерін қарастырайық. 
Берілген формулировкасы айқын рекурсивті есептің мысалы:
Есеп: Натурал санының факториалын есептеу. N! есептеу үшін, 
(N-1)! мәнін білу керек және оны N-ге көбейту қажет, жәнеде 1!=1. 
Жалпы түрде жазылуы:



>

=
=
болѓанда
N
N
N
болѓанда
N
N
1
,
)!
1
(
*
1
,
1
!
Факториалды есептеу үшін, оның мәнін есептейтін функцияны 
сипаттайық. Оның бір параметріне бұтін сан жіберіледі. Нәтиже де 
бүтін сан болады.
Function (factorial(n : integer) : longint;
Begin
If n = 1 then factorial := 1
else factorial := n* factorial (n-1);
End;
Функцияның   шақырылу   тізбегін   n   =   5   үшін   қарастырайық. 
Бірінші   рет   функция   негізгі   программадан  a:=   factorial(5) 
операторымен шақырылады. 
56



 1 болғандықтан, else тармағынан кейінгі  factorial  функция-
сына n*factorial(n-1)–ң мәні, яғни 5* factorial(4) меншіктеледі.
4 – ке тең параметрімен функция екінші рет шақырылады. 
Бұл   процесс   параметрдің   мәні   1-ге   тең   болғанына   дейін 
орындалады.   Онда  n   =  1,   сондықтан   функцияның   мәні  factorial:=1 
болады
Сонымен, n = 1 рекурсияның аяқталу шарты. 
Басқарылу   шақырылу   нүктесіне   жіберіледі,   яғни   n=2   үшін: 
factorial:= factorial(n-1), демек factorial:= 2*1, сонымен factorial(2) = 
2.
Шақырулардың   рекурсивті   тізбегімен   «жоғары»   көтеріле   кері 
қайтамыз. 
Сонымен,  factorial   (5)   =   120,   мәні   алынып,  а  айнымалысына 
меншіктеледі. 
Төменде   осы   рекурсивті   процесстің   орындалуының   көрнекі 
схемасы бейнеленген:
57

Есептер
1.
Клавиатурадан   енгізілетін  n  және   m   оң   сандары   үшін, 
Аккерман функциясын мәндерін есептейтін рекурсивті функция жазу 
керек.
2.
Арифметикалық   (геометриялық)   прогрессияның   бірінші  N 
мүшесінің қосындысын табу керек. 
58
1-ші шақыру (n=5)
Function (factorial(n : integer) : longint;
Begin
If n = 1 then factorial := 1
else factorial := n* factorial(n-1);
End;
2-ші шақыру (n=4)
Function (factorial(n : integer) : longint;
Begin
If n = 1 then factorial := 1
else factorial := n* factorial(n-1);
End;
Function (factorial(n : integer) : longint;
Begin
If n = 1 then factorial := 1
else factorial := n* factorial(n-1);
End;
3-ші шақыру (n=3)
4-ші шақыру (n=2)
Function (factorial(n : integer) : longint;

Достарыңызбен бөлісу:
1   2   3   4   5   6   7




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

    Басты бет