Паскаль-программалау тілі (авторы:В.Н.Кирнос) Аудармашы Бексарыұлы.М |
§10. Процедуралар мен функциялар Біз Бейсиктегі қосалқы
программаларды қолдануды еске түсірейік. Соған ұқсас,
Паскальда да сондай құрылым беруге болады. Олар функциялар мен процедуралар
түрінде болады. Екі құрылым да жеке үзінді түрінде
бейнеленеді. 10.1 Функциялар Функцияның ерекшелігі, оған қатынасуға болатын
атының болуында және осы ат(осы функцияның орындалуы нәтижесінде)
қорытынды мәге ие. Басқаша айтқанда, функция аты айнымалы
ретінде қызмет атқарады. Мұнда функция бірнеше
параметрлерге тәуелді болғанмен, ал оның нәтижесі-бір
ғана сан екендігін астын сызып айтамыз(әзірше сандық
функция туралы). Функцияны сипаттау функцияның аты, ол тәуелді
болатын параметрлер тізімі және типі көрсетілген function қызметші сөзімен
орындалады: function функция аты (параметрлер тізімі: 1-тип):
2-тип Мұнда функция аты әдеттегідей
(бірінші символы әріп болатын латынның 63-ке дейінгі әрпінен
және цифрлардан тұратын символдар жиынтығы), параметрлер тізімі –функция тәуелді
болатын(1-тип) типтері көрсетілген айнымалылар тізімі, 2-тип- функция типі(мұнда
функцияның қорытынды мәні көрсетіледі) беріледі. Бұдан бөлек, функция бұл да программа сияқты,
онда тақыры-бынан басқа,
оның ішінде қолданылатын айнымалылардың сипат-тамасы және
begin, end қызметші сөздері
бола алады. Оның ішінде Паскальдың кезкелген операторларын қолдануға
болады. Соңғы оператордың функцияның қорытынды
мәнін функция атына меншіктеуі маңызды. Функцияны сипаттау
негізгі программа басталғанға дейін, яғни негізгі
программаның айнымалыларын сипаттаудан кейін, бірақ негізгі
программадағы begin-ге дейін
орындалуы керек.
10.1-мысал. Қабырғалары
мен екі диагоналының ұзындықтары белгілі бесбұрыштың ауданын
есептеңіз. Бесбұрыштың
ауданы қабырғалары белгілі үшбұрыш аудандарының қосындысына
тең. Әр үшбұрыштың ауданын есептеу үшін
Герон формуласын қолданамыз (қабырғаларын
шартты түрде x,y,z деп белгілейік). S= Program mys10_1; var a,b,c,d,f,g,h,s1,s2,s3,ssum:real; function
yshb(x,y,z:real):real; var p:real; begin
p:=(x+y+z)/2; yshb:=sqrt(p*(p-x)*(p-y)*(p-z)) end; begin write(‘a,b,c,d,f,g,h-қа мән бер:’);readln(a,b,c,d,f,g,h); s1:=yshb(a,b,h); s2:=yshb(h,c,g); s3:=yshb(f,g,d); ssum:=s1+s2+s3;
writeln(‘Бесбұрыш ауданы=’,ssum); end. Осы программа
бойынша есептеу жүргізсек, онда a =1,5, b =1, c =2, d =2,5, f =1, g
=2,5, h =2 болғанда, бесбұрыш ауданы =3.90 (шамамен) болады. 10.2 Процедуралар Процедураның функциядан басты
айырмашылығы, процедура бірнеше параметрлерге тәуелді болып қана
қоймай, оның нәтижелік мәні де бірнешеу болуы мүмкін.
Сондықтан да параметрлер тізімі шартты түрде мән-параметрлер
және айнымалы-параметрлер деген екі типке бөлінеді. Бұлардың
бір-бірінен айырмасы мынада, мән-параметрлер мәліметтерді «оған»(процедураға)
жеткізуге қызмет етсе, ал айнымалы-параметрлер мәліметтерді «оған»
да және «кері» де жеткізуге қызмет жасайды. Сонымен мән-параметрлер
берілген мәліметтерді процедураға жеткізуге, ал
айнымалы-параметрлер процедура жұмысының нәтижесін негізгі
программаға жеткізуге арналған. Негізгі программадан процедураға қатынас
оның аты бойынша жасалады. Процедура да негізгі программа басталғанға
дейін көрсе-тіледі. Процедураның тақырыбы былай жазылады: Procedure процедура аты(1-параметрлер: 1-тип; var 2-параметрлер: 2-тип). Мұнда 1-параметрлер – мән-параметрлер,
ал 2-параметрлер – айнымалы-параметрлер, ол міндетті түрде var қызметші сөзінен
басталады. Параметрлердін әрбір түрінің типі(1-тип және
2-тип) көрсетіледі.
10.2-мысал. Үш
үштік: a1,b1,c1; a2,b2,c2; a3,b3,c3 сандары берілген. Әр үштіктің
ең үлкені мен ең кішісін, сонан соң табылған үлкендері
мен кішілерінің ішінен олардың
ең үлкені және
ең кішісін жеке-жеке табыңыз. Program mys10_2; var a1,b1,c1,a2,b2,c2,a3,b3,c3:real; var max1,max2,max3,min1,min2,min3,max4,min4,max5,min5:real; procedure
maxmin(x,y,z:real; var max,min:real); begin if
(x>=y) and (x>=z) then
max:=x; if
(x<=y) and (x<=z) then
min:=x; if
(y>=x) and (y>=z) then
max:=y; if
(y<=x) and (y<=z) then
min:=y; if
(z>=x) and (z>=y) then
max:=z; if
(z<=x) and (z<=y) then
min:=z; end; begin
write(‘a1,b1,c1-ді енгіз:’);readln(a1,b1,c1); write(‘a2,b2,c2-ні енгіз:’);readln(a2,b2,c2); write(‘a3,b3,c3-ті енгіз:’);readln(a3,b3,c3); maxmin(a1,b1,c1,max1,min1); maxmin(a2,b2,c2,max2,min2); maxmin(a3,b3,c3,max3,min3); maxmin(max1,max2,max3,max4,min4); maxmin(min1,min2,min3,max5,min5); writeln(‘1-үштіктің ең үлкені-‘,max1,’ең кішісі-‘,min1); writeln(‘2-үштіктің ең үлкені-‘,max2,’ең кішісі-‘,min2); writeln(‘3-үштіктің ең үлкені-‘,max3,’ең кішісі-‘,min3); writeln(‘Үлкендерінің ең үлкені-‘,max4,’ең кішісі-‘,min4); writeln(‘Кішілерінің
ең үлкені-‘,max5,’ең кішісі-‘,min5); end.
Программада бірмезгілде бірнеше
функциялар мен процедура-ларды сипаттауға(қолдануға да)
болады. Оларды әдеттегідей бірі-нен кейін бірін тізбектеп жазып
орналастырады. Рекурсиялар Рекурсия ұғымымен біз Бейсикті оқып
үйренгенде танысқанбыз. Рекурсия деп, қосалқы
программалардағы өзінен өзіне қатынас жасауды айтады.
Бейсикте бұл біршама айлалы жолмен жасалса, ал Паскальда рекурсия –қатардағы
әрекет, оны функция үшін де, процедура үшін де жүзеге
асыруға болады. Рекурсияны мысал арқылы көрсету әлдеқайда
жеңілдеу. 10.3-мысал. N>M үшін мына формула
бойынша: Cnm=
N элементтен М теруін есептеңіз. Осы формула бойынша сыныптағы (N=30) оқушыларды
екі оқушыдан (M=2) қанша тәсілмен
отырғызуға болатындығын есептеуге болады. Мұнда әр
түрлі сандар үшін факториалды үш рет есептеуге тура
келеді. Факториалды есептеуді рекурсиялық
функция түрінде жазайық. Program mys10_3; var n,m,c: integer; function fact(k: integer): real; begin if k=0 then fact:=1 else fact:=k*fact(k-1) end; begin writeln(‘n,m-ді енгіз:’); readln(n,m); c:=round(fact(n)/(fact(m)*fact(n-m))); writeln(n,’элементтен’,m,’теру саны-‘,c,’ тең болады.’); end. 10.3-мысалдан fact функциясының ішінде
параметрінің мәні 1-ге кем соның өзіне қатынас
жасалғанын көреміз. Сондықтан да егер n= 5 болғанда,
функция ішінде соның өзіне,бірақ мәні 1-ге кем n=4
–ке, сосын n=3, n=2, n=1, n=0 –ге қатынас жасалады. n=0 болғанда,
функция 1 мәнін қабылдайды және оны біртіндеп 1-ге, 2-ге,
3, 4, 5-ке көбейтіп, процесс кері жүреді. Нәтижесінде 5! мәнін
аламыз. Факториал функциясын есептеу кезіндегі «толып кетуді» бол-дырмау үшін оны нақтылы типтегі
функция түрінде (факториал –бүтін сан болса да) бейнелеген жөн.
Алайда теру саны тек қана бүтін сан болатындықтан,
есептеуді толық аяқтауға
round дөңгелектеу функциясы қолданылды. Программаны
орындап, n=9, m=5 мәнін бергенде, теру саны 126-ға тең
болады.
10.4-мысал. Бүтін
оң N санының цифрларын кері ретпен басуға шығарыңыз
(n-ді 10-ға бөлгендегі қалдығын алып, оны қашан қалдық
нөлге тең болғанша бөлу). Мұнда рекурсиялық
процедураны қолданайық.. program mys10_4; var
n: integer; procedure
cifra(n: integer); begin write(n mod 10); if (n div 10)<> 0 then
cifra(n div 10) end; begin writeln(‘N санын енгіз:’); readln(n); cifra(n) end. Бір программада
бірнеше функция мен процедура қолданылған жағдайда функция
немесе процедураның бірін басқасының ішінде шақырудың
кейбір ерекшеліктері бар. Бұл жағдайда, басқаның
ішінде қолданылатын құрылым, сол құрылымның
ішінде құрылуы қажет. 10.5-мысал.
Мына түрдегі Паскаль үшбұрышын есептеңіз: C00 Мұнда жоғарыда келтірілген
формула бойынша C10 C11
n элементтен m теру санын табу қолданылады. C20 C21
C22
Теру санын есептеуді-функциямен, ал фактор- C30
C31 C32
C33 иалды табуды ішкі функция арқылы,
соның ішінде
рекурсиялық функция түрінде
жазайық.. program mys10_5; var c,r,k,i,j:
integer; function
teru(n,m: integer):
integer; function fact(k: integer): real; begin {факториалды
есептеу функциясының басы} if k=0 then fact:=1 else fact:=k*fact(k-1) end; {соңы} begin
{теру санын есептеу
функциясының басы} teru:=round(fact(n)/(fact(m)*(fact(n-m))); end;
{соңы} begin {негізгі программаның басы} writeln(‘Паскаль үшбұрышының өлшемін
енгіз:’); readln(r); for
i:=0 to
r do begin for j:=0 to i do begin c:=teru(i,j);
write(c:5); end; writeln end end. {негізгі программаның соңы}
Паскаль-программада түсініктеме сөздер
жазуға болады. Олар жүйелі жақшаға алынып жазылады.
Берілген программада біз қай жерде қай функцияның немесе программаның
басталуы мен аяқталуын көрсету үшін түсініктеме сөздер
қолдандық.. Бақылау сұрақтары 1.Паскальда қосалқы программаның
қадай түрлері қолданылады? Олардың
айырмашылықтары неде?. 2.Функция-қосалқы программасы қалай
жазылып, қалай шақырылады? 3.Процедура-қосалқы программа қалай
жазылып, қалай шақырылады? 4.Процедурада параметрлердің қай түрлерін
қолдануға болады? Олардың
айырмасы неде? 5.Рекурсия деген не? 6.Паскальдың қосалқы
программасында басқа қосалқы программа қалай
қолданылады?. Практикалық тапсырмалар 10.1. a,b,c,d сандары берілген. x=max(a,b), y=max(c,d), z=max(x,y) мәндерін
анықтаңыз. max(k,m) (к және м екі санның үлкенін
табу) мәнін есептеуді функция арқылы өрнектеңіз. 10.2. Нақты х және бүтін n-нен алынған xn-ді
есептеуді (біртіндеп көбейту арқылы) Dar(x,n) функциясы арқылы
өрнектеңіз және оны жұмыста сынап көріңіз. 10.3. Екі үшбұрыштың төбелерінің координаттары
берілген. Олардың қайсысының ауданы үлкен екенін анықтаңыз.
Ауданды координаты бойынша есептеуді функция арқылы өрнектеңіз. 10.4. Төрт натурал сан берілген. Осы сандардың ең кіші ортақ
еселігін(ЕКОЕ) табыңыз. Екі санның ЕКОЕ табуды функция арқылы
өрнектеңіз. 10.5. Жазықтықтағы n нүктелердің координаттары
Х,У жиымдары түрінде берілген. Ең қашық және ең
жақын нүктелерді табыңыз. Екі жұп нүктенің
арақашықтығын есептеуді функция арқылы өрнектеңіз. 10.6. a,b,c,d кесінділері берілген. Осы кесінділердің үшбұрыш
құруға болатын әрбір үшеуі үшін сол үшбұрыш
ауданын басып шығарыңыз. Берілген x,y,z қабырғалары
бойынша үшбұрыш ауданын оның бар-жоқтығын
тексеретіндей етіп есептеуді процедура түрінде өрнектеңіз. 10.7. a/b бөлшегін қысқармайтын p/q бөлшегіне келтіріп
және оның жұмысын тексеретін kisk(a,b,p,q) процедурасын бүтін
параметрлер бойынша сипаттаңыз. 10.8. n саны берілген. Осы санның барлық жай бөлгіштерін алу
керек. Жай санды тану процедурасын өзінше өрнектеңіз. (Жай
сан деп бір мен өзінен басқа бүтін санды бөлгіштері
жоқ санды айтады) 10.9. Натурал n, бүтін a1,a2,…,an
сандары берілген. а) толық квадраттардан тұратын; б) бестік дәрежесінен тұратын; в) жай сандардан тұратын ішкі тізбек алыңыз. Есептердің шешуі. §10. Процедуралар және функциялар 10.1. a,b,c,d сандары берілген. x=max(a,b), y=max(c,d), z=max(x,y) мәндерін
анықтаңыз. max(k,m) (к және м екі санның үлкенін
табу) мәнін есептеуді функция арқылы өрнектеңіз. Program e10_1; var a,b,c,d,x,y,z:
real; function max(k,m:real):
real; begin if
k>m then max:=k else max:=m end; begin writeln; write(‘a,b,c,d мәнін енгізіңіз:’); readln(a,b,c,d); x:=max(a,b); y:=max(c,d); z:=max(x,y); writeln(‘x=’,x,’y=’,y,’z=’,z) end. 10.2. Нақты х және бүтін n-нен алынған xn-ді есептеуді (біртіндеп көбейту арқылы) Dar(x,n) функциясы арқылы өрнектеңіз және оны жұмыста
сынап көріңіз. program e10_2; var x,y:real;
n:integer; function dar(x:real;n:integer):real; var i:integer;y:real; begin y:=1; for
l:=1 to n do y:=y*x; dar:=y; end; begin writeln; write(‘x, n-ді енгізіңіз:‘); readln(x,n); y:=dar(x,n); write(‘x-тің n дәрежесі, xn =’,y) end. 10.3. Екі үшбұрыштың төбелерінің
координаттары берілген. Олардың қайсысының ауданы үлкен
екенін анықтаңыз. Ауданды координаты бойынша есептеуді функция арқылы
өрнектеңіз. program e10_3; var x1,y1,x2,y2,x3,y3,s1,s2: real; function s(x1,y1,x2,y2,x3,y3:real):real; var a,b,c,p:real; begin a:=sqrt(sqr(x1-x2)+sqr(y1-y2)); b:=sqrt(sqr(x1-x3)+sqr(y1-y3)); c:=sqrt(sqr(x2-x3)+sqr(y2-y3)); p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)) end; begin writeln(‘1-үшбұрыш коодинаттары: x1,y1,x2,y2,x3,y3 енгізіңіз:’); read(x1,y1,x2,y2,x3,y3); s1:=s(x1,y1,x2,y2,x3,y3); writeln(‘2-үшбұрыш коодинаттары: x4,y4,x5,y5,x6,y6 енгізіңіз:’); read(x1,y1,x2,y2,x3,y3); s2:=s(x1,y1,x2,y2,x3,y3); if s1>s2 then write(‘1-ші 2-ден үлкен‘) else if s1=s2 then write(‘олар тең‘) else write(‘2-ші 1-ден үлкен‘) end. 10.4. Төрт натурал сан берілген. Осы сандардың
ең кіші ортақ еселігін(ЕКОЕ) табыңыз. Екі санның ЕКОЕ
табуды функция арқылы өрнектеңіз. program e10_4; var ekab,ekcd,n4,a,b,c,d:integer; function ekoe(a,b:integer):integer; var i,max:integer; begin if
a>b then max:=a else max:=b; ekoe:=a*b; for
i:=a*b downto max do if (i mod a=0) and (i
mod b=0) then ekoe:=i; end; begin writeln; write(‘4
натурал сан енгізіңіз:’); readln(a,b,c,d); ekab:=ekoe(a,b); ekcd:=(c,d); n4:=ekoe(ekab,ekcd); write(‘a,b-ның
үлкені:’,ekab:3); writeln(‘c,d-ның үлкені:’,ekcd:3); writeln(‘алдыңғы екеуінің үлкені:’,n4:3) end. 10.5. Жазықтықтағы n нүктелердің координаттары
Х,У жиымдары түрінде берілген. Ең қашық және ең
жақын нүктелерді табыңыз. Екі жұп нүктенің
арақашықтығын есептеуді функция арқылы өрнектеңіз. program e10_5; const n=5; var x,y:
array[1..n] of real; i,j,imx,imn,jmx,jmn:integer; max,min,d1:real; function d(x1,y1,x2,y2:real):real; begin d:=sqrt(sqr(x2-x1)+sqr(y2-y1)) end; begin writeln; for
i:=1 to
n do begin write(i,’-нүктенің Х,У –н енгізіңіз:’); readln(x[i],y[i]) end; max:=0; min:=d(x[1],y[1],x[2],y[2]); imn:=1;jmn:=2; for
i:=1 to
n-1 do for j:=i+1 to n do begin d1:=d(x[i],y[i],x[j],y[j]); if d1>max then begin
max:=d1; imx:=i;jmx:=j; end; if d1<min then
begin min:=d1; imn:=i;jmn:=j;
end; end; write(‘ең қашық нүкте ‘,imx:3,jmx:3,’ ‘,max,’ қашықта
орналасқан’); write(‘ең жақын нүкте ‘,imn:3,jmn:3,’ ‘,min,’ қашықта
орналасқан’); end. 10.6. a,b,c,d кесінділері берілген. Осы кесінділердің үшбұрыш
құруға болатын әрбір үшеуі үшін сол үшбұрыш
ауданын басып шығарыңыз. Берілген x,y,z қабырғалары
бойынша үшбұрыш ауданын оның бар-жоқтығын
тексеретіндей етіп есептеуді процедура түрінде өрнектеңіз. program e10_6; var a,b,c,d:real; procedure yshb(x,y,z:real); label 15,18; var s,p:real; begin if
(x<y+z) and (y<x+z)
and (z<x+y) then
goto 15 else goto 18; 15: write(‘қабырғалары: ’, x,y,z,’
болатын үшбұрыш
болады’); p:=(x+y+z)/2; s:=sqrt((p*(p-x)*(p-y)*(p-z)); write(‘Осы үшбұрыш ауданы =’,s); goto 20; 18: write(‘қабырғалары: ’, x,y,z,’
болатын үшбұрыш
болмайды’); 20: end; begin write(‘a,b,c,d мәндерін енгізіңіз:’); read(a,b,c,d); yshb(a,b,c); yshb(b,c,d); yshb(c,d,a); yshb(d,a,b); end. 10.7. a/b бөлшегін қысқармайтын p/q бөлшегіне келтіріп және оның жұмысын тексеретін kisk(a,b,p,q)
процедурасын бүтін
параметрлер бойынша сипаттаңыз. program e10_7; var a,b,p,q:integer; procedure kisk(a,b:integer; var p,q:integer); var i,min:integer; begin if
a<b then min:=a else min:=b; for
i:=2 to
min do if (a mod i=0) and (b mod i=0) then begin p:=a div i; q:=b div i; end; end; begin
writeln; write(‘a,b
/b<>0/ -ны енгізіңіз:’); readln(a,b); kisk(a,b,p,q); write(a,’/’,b,’=’,p,’/’,q) end. 10.8. n саны берілген. Осы санның барлық жай бөлгіштерін алу
керек. Жай санды тану процедурасын өзінше өрнектеңіз. (Жай
сан деп бір мен өзінен басқа бүтін санды бөлгіштері
жоқ санды айтады) program e10_8; var i,n,s:
integer; procedure zhai(k:integer; var s:integer); label 1; var i:integer; begin s:=0; for
i:=2 to
k-2 do if k mod i=0 then begin s:=1; goto 1 end; 1: end; begin writeln; write(‘n санын енгізіңіз:’); readln(n); for
i:=2 to
n-1 do if n mod i=0 then begin zhai(i,s); if s=0 then writeln(i)
end; end. 10.9. Натурал n, бүтін a1,a2,…,an сандары берілген. Осы сандардан а) толық квадраттардан тұратын;
б) бестік дәрежесінен тұра- тын; в) жай сандардан тұратын
ішкі тізбек алыңыз. program e10_9; const n=10; var i,s,k1,k2,k3:integer;
a1,a2,a3:array[1..n] of integer; procedure kv(k:integer; var s:integer); var i:integer; begin s:=0; for
i:=1 to
k do if i*i=k then s:=1 end; procedure d5(k: integer; var s:integer); var i,y:integer; begin s:=0; y:=1; for i:=1 to k do begin y:=y*5; if k=y then s:=1 end;
end; procedure zhai(k:integer; var s:integer); var i:integer; begin s:=0; for
i:=1 to k
do if k mod i=0 then s:=s+1 end; begin writeln; for
i:=1 to
n do begin write(‘a
‘,i,’-і енгізіңіз:’);
read(a[i]); kv(a[i],s); if s=1 then begin k1:=k1+1; a1[k1]:=a[i] end; d5(a[i],s); if s=1 then begin
k2:=k2+1; a2[k2]:=a[i] end; zhai(a[i],s); if
s<=2 then begin k3:=k3+1;
a3[k3]:=a[i] end; end; writeln; writeln(‘толық квадраттар:’); for i:=1 to k1 do write(‘ ‘,a1[i]); writeln; writeln(‘бестік дәрежелері:’); for i:=1 to k2 do write(‘ ‘,a2[i]); writeln; writeln(‘жай
сандар:’); for i:=1 to k3 do write(‘
‘,a3[i]); end. 10.10. n Фибоначчи сандарынан: 1,1,2,3,5,8,13,21...(яғни
f(n)=f(n-1)+f(n-2) ) тізбесін есептеп шығарыңыз. Фибоначчидің
кезекті санын есептеуді рекурсиялық функция түрінде өрнектеңіз. program e10_10; var i,n:integer;
f:longint; function fib(n:integer):integer; begin if n<=2 then
fib:=1 else
fib:=fib(n-1)+(fib(n-2); end; begin writeln; write(‘n-ді енгізіңіз:’); read(n); for i:=1 to n do begin f:=fib(i);
write(f:5) end; end. 10.11. Ондық санау жүйесінде берілген
санды: а) екілік санау жүйесіне; б)
сегіздік санау жүйесіне көшіретін программа құрыңыз.
Әр санау жүйесіне көшіруді жеке функция түрінде өрнектеңіз. program e10_11; var x,x1:integer; function eki(x:integer):integer; var y,z,k:integer; begin z:=1;
y:=0; while
x>0 do begin k:=x mod 2; y:=y+k*z;
z:=z*10; x:=x div 2 end; end; function segiz(x:integer):integer; var y,z,k:integer; begin z:=1;
y:=0; while
x>0 do begin k:=x mod 8; y:=y+k*z;
z:=z*10; x:=x div 8 end; end; begin write(‘сан енгізіңіз: ‘,x); x1:=eki(x); write(x,’
саны екілік жүйеде
былай жазылады:
’,x1); x1:=segiz(x); write(x,’ саны
сегіздік жүйеде былай жазылады: ’,x1); end. 10.12. X санының N-дәрежесін мына формула
бойынша: xn = Дәрежені
осылай табуды рекурсивтік функция түрінде өрнектеңіз. program e10_12; var x,y:real;
k,n:integer; function xn(x:real; n:integer):real; begin if
n=0 then xn:=1
else xn:=x*xn(x,n-1) end; begin writeln; write(‘x,n-ді
енгізіңіз :‘); readln(x,n); if
n<0 then begin k:=-1; n:=abs(n) end; y:=xn(x,n); if
k=-1 then y:=1/y; write(‘х-тің n дәрежесі =’,
y) end. 10.13. 0<M<N болғанда
N-нен M теруді мына формула бойынша: Сn0 = Cnn
= 1; Cnm = Cn-1m
+ Cn-1m+1
есептейтін программа құрыңыз. Теру санын есептеуді
рекурсивтік функция түрінде өрнектеңіз. program e10_13; var n,m,c:integer; function teru(n,m:integer):integer; begin if (m=0) or (m=n) then teru:=1 else teru:=teru(n-1,m)+teru(n-1,m-1) end; begin writeln; write(‘n
m- :’); readln(n,m); c:=teru(n,m); write(‘N-нен M бойынша C теруі =’,c) end. 10.14. Ханой мұнарасы. Тұғырға 3 білік
орнатылған: олардың сол жақтағысына ең астында үлкені,
содан жоғары біртіндеп кішірейе беретін етіп бірнеше сақина
кигізілген. Осы үш білікті пайдалана отырып, сақиналарды
бір-бірден келесі білікке көшіру керек. Мұнда үлкен сақинаны
кішінің үстіне ешқашан кигізуге болмайды. Алғашында
сол жақ білікте: а) екі сақина;
б) үш сақина; в) төрт сақина; г) 64 сақина (аңыз бойынша мұнша
сақинаны ауыстырып салумен будда монастырының бірінде монахтар
айналысады. Сол аңызда сақинаны ауыстырып салып болғанда ақырзаман
болатын көрінеді) болғандағы сақинаны ауыстырып
салудың алгоритмін құрыңыз. Ханой мұнарасы
туралы есепті шешудің программасын рекурсивтік функцияны пайдаланып құрыңыз.(Мұнда
N дискіні ауыстыру есебін N-1 дискіні ауыстыру есебіне келтіріп жеңілдетуге
болады, міне ол содан да рекурсия болып шығады). program var n:integer; procedure solve(n:integer; a,b,c:char); begin if
n>0 then begin Solve(n-1,a,c,b); writeln(‘Сақинаны ’a,‘ біліктен’,b,’ білікке ауыстыр’); Solve(n-1,c,b,a); end; end; begin writeln;
write(‘сақина санын енгізіңіз:’); read(n); Solve(n,’1’,’2’,’3’); end. |