Паскаль-программалау тілі (авторы:В.Н.Кирнос)

Аудармашы Бексарыұлы.М

 

 §10. Процедуралар мен функциялар

 

Біз Бейсиктегі қосалқы программаларды қолдануды еске түсірейік. Соған ұқсас, Паскальда да сондай құрылым беруге болады. Олар функциялар мен процедуралар түрінде болады. Екі құрылым да жеке үзінді түрінде бейнеленеді.

10.1 Функциялар

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

function функция аты (параметрлер тізімі: 1-тип): 2-тип

Мұнда функция аты әдеттегідей (бірінші символы әріп болатын латынның 63-ке дейінгі әрпінен және цифрлардан тұратын символдар жиынтығы), параметрлер тізімі –функция тәуелді болатын(1-тип) типтері көрсетілген айнымалылар тізімі, 2-тип- функция типі(мұнда функцияның қорытынды мәні көрсетіледі) беріледі.

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

Функцияны сипаттау негізгі программа басталғанға дейін, яғни негізгі программаның айнымалыларын сипаттаудан кейін, бірақ негізгі программадағы begin-ге дейін орындалуы керек.

  

10.1-мысал. Қабырғалары мен екі диагоналының ұзындықтары

                  

 белгілі бесбұрыштың ауданын есептеңіз.          

                     Бесбұрыштың ауданы қабырғалары белгілі үшбұрыш

                     аудандарының қосындысына тең. Әр үшбұрыштың

                     ауданын есептеу үшін Герон формуласын қолданамыз 

                     (қабырғаларын шартты түрде x,y,z деп белгілейік).

 

 S=,    мұнда p=(x+y+z)/2.      

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 Hanoi;

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.

 

                          

 

 

 

 

 

 

 

 

 

 

Hosted by uCoz