Кіріспе Өңдеу ұғымы Алгоритм ұғымы



бет11/11
Дата15.09.2017
өлшемі1,13 Mb.
#32899
1   2   3   4   5   6   7   8   9   10   11

ПРОЦЕДУРАЛАР

Кез-келген процедура атынан басталады. Ол резервтелген сөз Procedure арқылы басталады. Одан кейін процедураның идентификаторы жазылады. Ал дөңгелек жақшаның ішінде формальды параметрлер көрсетіледі. Негізгі бағдарламадан кейін нүктелі үтір арқлы ыарқылы жазылады.


Форматы:
    Procedure <аты {(формальды параметрлер)};
Мысал.
   Procedure Sort(R: integer; F: real);

   Procedure Sum; { процедура арқылы іске асатын алгоритм формальды параметрді талап етпейді}

  Процедураның аты бағдарлама атымен сәйкес келмеуі керек. Процедура денесі бағдарламаның құрылымы сияқты қызмет атқарады.
Мысал.

    N бүтін сандарын енгізетін процедура. Негізгі бағдарлама құрылымында тип анықталған болсын:


Type Mas=array[1..100] of integer;
Процедураның түрі төмендегәдей болуы мүмкін:
Procedure Nget(Var M:Mas;N:integer);

Var


    I: integer; { цикл параметрі}

Begin


    Writeln('Енгізу керек', N:4, ' бүтін саны ');

    For I:= 1 to N do Read(M[i]);

End;
Процедураны шақыру негізгі бағдарламада немесе басқа бағдарлама ішіндегі бағдарламада оператор арқылы жазуға болады. Оның ішінде формальды параметрлерін де жазуға болады.

Мысалы, Nget(M,K); операторы Nget процецдарысының шақырылуын көрсетеді. Ол K бүтін сандарын енгізуді көрсетеді.



  1. Формальды және нақтылы параметрлер


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

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

Процедурада сипатталған айнымалылар локальдылық қасиетіне ие болады. Олардың қолданылу аймағы тек қана процедура мен функция ішінде ғана атқарылады.

Процедураны шақыру аты арқылы іске асады.

Бағдарлама ішіндегі формальды параметрлер бағдарлама ішіндегі ретпен, тізбекпен орындалады.

Формальды параметрлердің екі түрі бар:


•мән-параметрлері (осы параметрлер бағдарлама ішіндегі бағдарламада ауыспайды);

•айнымалы-параметр (бұл параметрлер негізгі бағдарламада ауысуы мүмкін).


Мән-параметр

Мән-параметрі орнына өрнектің мәні қойлады, Ол аргумент ретінде беріледі. Бұл параметр атауды және типті көрсетумен сипатталады.

Мән-параметрі негізгі бағдарламадан бағдарлама ішіндегі бағдарламаға өзінің мәнінің көшірмесі ретінде беріледі.

Мән-параметрі бағдарлама ішіндегі бағдарламаның атында көрсетіледі. Егер мән-параметрі бірнеше болса, оны нүктелі үтір арқылы жазуға болады.


Мысал.
Procedure Vvod(A, B, C : real; N : integer);

Function Mmax(X, Y : real) : real;


Параметрлер типі формальды параметрлер секциясынан алдын-ала анықталған идентификатор арқылы көрсетілген болуы керек. Жазба ретінде
Procedure HHL(I: array[1..40] of real);
Қате жазба болады. Айнымалы типін алдын-ала сипатталған типтер блогында жазу керек:
Тype Massiv = array[1..15] of real;

Procedure HHL(I: Massiv);


Нақтылы параметр ретінде мән-параметрінің орнынан кез-келген өрнекті жазуға болады. Мысалы:
Vvod(Z,  ABS(T), 2*L);

H:=Mmax(X+Y,D-F);

HHL(P);

  1. Айнымалы-параметр


Айнымалы-параметр орнына айнымалы қойлады, оның мәні процедурада немесе функцияда өзгеруі мүмкін. Осы параметрді сипаттау үшін var қызметші сөзі қолданылады..

Айнымалы-параметр негізгі бағдарламадан бағдарлама ішіндегі бағдарламаға беріледі. Ол адрес арқылы көрсетіліп жазылады. Сәйкесінше осы параметрлерді өзгертуге болады.

Айнымалы-параметр бағдарлама ішіндегі бағдарлама атында көрсетіледі. VAR кілтті сөзі жазылған жағдайда бағдарламаны шақыру кезінде айнымалы атын қолдану керектігін көрсетеді. VAR қызметші сөзінің қызмет етуі жақын тұрған нүктелі үтірге дейін әсер етеді.

Мысал.


Procedure MAXMIN(VAR MAX, MIN: real; A: Massiv; N: Word);
Мұндағы MAX, MIN – айнымалы-параметр;

A, N – мән-параметрі.

Айнымалы-параметр типі кез-келген болуы мүмкін. Оны сипаттау кезінде жаңа типті енгізуге болмайды. Сонымен қатар айнымалы-параметрдің типін көрсетпей қолдануға да мүмкіндік беріледі.:
Procedure FUNC(VAR F);
Мұндағы F – типсіз айнымалы-параметр (сонымен бірге басқа да қарапайым типтің айнымалысын, массив типін, жазбаны қолдануға болады).

Мысалы, бағдарламаны орындағаннан кейін екі айнымалының мәні ауысады.


Program PRIMER;

Var


    X, Y: integer;

Procedure OBMEN(var M, N : integer);

Var

    T: integer;



Begin

    T:=M;

    M:=N;

    N:=T

End; { OBMEN процедурасының соңы}
Begin { негізгі бағдарлама }

    X:=2;

    Y:=3;

    writeln(X:3, Y:3);

    OBMEN(X, Y); { OBMEN процедурасын шақыру}

    writeln(X:3, Y:3)

End.
Бағдарламаны іске қосқаннан кейін экранға мынандай мәлімет шығарылады:
2 3

3 2
бағдарлама атында VAR қызметші сөзі қолданылмаса онда X және Y OBMEN(X,Y) процедурасын қолдану арқылы өзгеріске түспес еді. Онда бағдарлама қалай енгізілсе, солай шығарып берер еді.


2 3

2 3


ФУНКЦИЯЛАР
Функция да процедура сияқты қызмет атқарады. Оның екі айырмашылығы бар. Бірінші айырмашылығы ол оның атауында. Ол Function сөзінен басталады, одан кейін дөңгелек жақшаның ішінде формальды параметрлердің міндетті емес тізімі көрсетіледі.

Екінші айырмашылығы операторлар бөлімінде, тым болмаса бір мән функцияға меншіктелген болуы керек.

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

Function функция аты (параметрлер тізімі) :қайтарылатын мәннің типі;

Мәліметтерді сипаттау;

begin


функция операторлары;

функция аты := өрнек; {функцияның мәнін. Қайтару үшін қолданылатын міндетті оператор }

end;

Функцияны шақыру функция көрсеткіші арқылы іске асады. Ол кез-келген өрнекте жазылады: функция аты (аргументтер тізімі).


Мысал.
Program ProcsAndFuncts;

Var


    N: integer;
Procedure SayHello;

Begin


    Writeln ('Сәлем АЖ-11,12!');

End; { Say Hello }


Function Seventeen : integer;

Begin


    Seventeen := 17;

End; { Seventeen }


Begin { ProcsAndFuncts }

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

    N := Seventeen; { Seventeen функциясы }

End. { ProcsAndFuncts }


Функицны шақыру үшін негізгі бағарламада функцияның мәнін қолданылатын өрнек болуы тиіс. Сол өрнек ақрылы функция шақырылады. Мысалы: Funk:=Sqr(R)/Faktorial(M);

Осы операторда:


Sqr(R) – R нақтылы параметрімен квдартатты есептейтін стандартты функцияны шақыру;

Faktorial(M) – M нақтылы параметрімен факториалды есептейтін функцияны шақыру.


Мысал. Есептеу керек: s = 1 + x/1! + x2/2! + x3/3! + ... + xn/n! .

Шешімі. Дәрежені, факториалды және қосындыны есептейтеуді функция ретінде рәсімдеп алу керек:

program task1;

var x : real; {аргумент}

n : integer; {қосындыны есептеу саны }

y : real; {қосынды}


{бөлшектің үсін есептеу функциясы }

function a(x : real; i : integer) :real;

var j : integer; {көбейту счетчигі }

begin a := 1;

for j := 1 to i do a := a * x

end;
{бөлшектің бөлімін есептеу функциясы }

function b(i : integer) :real;

var j : integer; {көбейту счетчигі }

begin b := 1;

for j := 1 to i do b := b * j

end;
{Қосындыны есептеу функциясы }

function y(x : real; n : integer) : real;

var i : integer; {қосылғыштың нөмірі }

begin y := 0;

for i := 1 to n do y := y + a(x,i)/b(i)

end;
{Негізгі бағдарлама }

begin

write(' x аргументін енгшізу керек, n қосылғыш санын енгізу керек ');



readln(x,n);

write ('Қосынды ',y(x,n))

end.

  1. Локальды және глобальды айнымалы

Бағдарлама ішіндегі бағдарламада сипатталған айнымалылар локальды деп аталады. Сол айнымалы сияқты бағдарламада сипатталатын айнымалылар глобальды айныфмалылар деп аталады. Пирамиданың толық бетінің көлемін есептейтін бағдарлама құру керек. Егер олардың алты қабырғасының ұзындығы берілген. Болса. Үшбұрыштың көлемені есептеу үшін Герон формуласын қолдануға болады: Әрі оны функция ретінде сипаттау керек:


Program Pvest;
Var

    A, B, C, AB, BC, CA, S : real; {A, B, C, AB, BC, CA – қабырғалар ұзындығы, S – беттің қөлемі }


Function STR(A, B, C : real):real; {A, B, C : үшбұрыштың жақтарының ұзындығы }

Var


    P: real;

Begin


    P:=(A+B+C)/2;

    STR:=SQRT(P*(P-A)*(P-B)*(P-C));

End;
Begin { Негізгі бағдарлама }

    Writeln('Пирамиданың қабырғасының ұзындығын енгізіңіз');

    Readln(A, B, C, AB, BC, CA);

    Writeln('Толық беттің көлемін енгізіңіз');

    Writeln('Қабырғалы үшбұрышты пирамида:');

    Writeln(' ', A, B, C, AB, BC, CA);

    S:= STR(A,B,C)+STR(A,AB,CA)+ STR(B,AB,BC)+STR(C,CA,BC);

    {Соңғы үш қосылғыш қыр жағының көлемі }

    Writeln(' Тең болады ',S);

End.


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


Қандай болмасын бір алгоритм басқа алгоритмді көмекке шақыру арқылы орындалатын болса, онда осы процесті рекурсивті деп атауға болады. Осы жағдайда алгоритм рекурсивті деп аталады. Кей жағдайда осындай рекурсивті шақырылулар шексіздік орындалуға әкеліп жатады. Сондықтан рекурсивті алгоритмді құру үшін нәтиже басқа шақырылусыз орындалуына байланысты болады.

Соған орай қандай да бір рекурсия екі шарттан тұруы мүмкін:

1) Нәтижені басқа мән арқылы алу (қарапайым жағдайлар үшін). Осы шартты орындау үшін жаңа рекурсиялық шақырылуды талап етпеуі керек.

2) Функцияның өзін шақыру арқылы орындалады (рекурсивті шақырылу).

Мысал. Факуториалдың рекурсивті анықтамасы барлығымызға белгілі:

Мұндағы n – теріс емес. Осы функцияны Паскаль тілінде жазу керек

Шешімі: Бірінші жолда егер аргумент бірге немесе нөлге тең болса, факуториалды есептеу көрсетілген. Қалған жағдайларда n! – ді (n-1)! мәнін және оны n ға көбейту керек. Кемитін мән өзінен өзі шығады. Ең соңында 1! немесе 0! Табу керек болады. Ол осы функция арқылы табылады:

program task5;

var n : integer; { Бастапқы мән}
function fact(i:integer):integer;

begin if (i=1) or (i=0)

then fact := 1

else fact := fact(i-1)*i

end;
begin write('Қажет мәнді енгізу керек n ');

readln(n);

writeln('Факториал ',n,' тең ',fact(n))

end.


Бағдарламаның қалай орындалатындығын бақылау үшін қосымша алгоритмнің жұмыс жасау есте ұстау керек. Оған дейін негізгі алгоритм тоқтап тұрады. Осындай жаңа рекурситі алгоритмнің шақырылуы арқылы барлық айнымалы үшін орын бөлінеді. Рекурсивті алгоритмнің көшірмесін жою арқылы жадыдан барлық айнымалы жойылады. Алдыңғы рекурсивті жазба белсенді болады. Мысалы 4! есептеу керек болсын. Негізгі алгоритм n=4, арқылы fact(4) шақырылуы болады. Негізгі алгоритм тоқталады, келесі рекурсивті көшірме шақырылады fact(4): 4<>1 және 4<>0, сондықтан fact:=fact(3)*4. Фнкцкияның жұмысы тоқтатылады, келесі рекурсивті көшірме шақырылады және жұмыс жасайды fact(3): 3<>1 және 3<>0, сондықтан fact:=fact(2)*3. Назар аударатын жағдай компьютердің жадысында екі fact функциясының көшірмесі сақталған болады. Келесі көшірме шақырылады: fact(2): 2<>1 және 2<>0, сондықтан fact:=fact(1)*2. Компьютердің жадысында fact үш көшірмесі сақталады және төртінші шақырылады. fact(1): шақырылады, және жұмыс жасайды 1=1, сондықтан fact(1)=1. Осы функцияның шақырылуы жұмысты аяқтайды fact(2). fact(2):=fact(1)*2 =1*2=2. fact(3). fact(3):=fact(2)*3=2*3=6. fact(4). fact(4):=fact(3)*4= 6*4=24. Енді осы жерден бастап бағдарлама негізгі қызметіңн атқарады. Жауап экранның бетіне шығады “Факториал 4 24 ке тең”.

Мысал. Қарапайым бөлшекпен көбейту, қосу, алу, бөлуді қамтамасыз ететін процедураның жиынтығын жазу керек.

Шешімі. Қарапайым бөлшекті есептеу үшін оны екі бүтін сан арқылы белгілеп алу керек. Біріншісі – бөлшектің алымын есептейді, екіншісі бөлімін. Есептеу кезінде бөлшекті қысқартуға тура келеді. Ол ортақ бөлгішке бөлінеді, оны есептеу үшін Евклид алгоритмі қолданылады. Егер сандардың біреуі нөлге тең болса, онда ортақ бөлгіш 1-ге тең. Сонымен қатар басқа да бөлшекті енгізу үшін процедураны құрастыру керек.:

Var x,y, {числитель и знаменатель дроби }

p,q, {числитель и знаменатель дроби }

s,t:integer; {числитель и знаменатель дроби }


{ Қарапайым бөлшекті енгізу }

procedure wwod(var a,b:integer);

begin

writeln;


write('Бүтін санды енгізу керек: алымы және бөлімі қарапайым бөлшек ');

readln(a,b)

end;
{ Нәтижені шығару }

procedure wywod(a,b:integer);

begin write(a,'/',b);writeln end;
{ Ортақ бөлгішті шығару (x,y) }

function nod(x,y:integer):integer;

begin if (x=0) or (y=0)

then nod:=1

else begin while x<>y do

begin while x>y do x:=x-y;

while y>x do y:=y-x

end;


nod:=x

end


end;
{ Бөлшекті қысқарту }

procedure sokr(var c,d:integer);

var r:integer;

begin r:=nod(c,d);

c:=c div r;

d:=d div r

end;
{ Екі бөлшекті қосу }

procedure sum(a,b,c,d:integer; var e,f:integer);

var r:integer;

begin e:=a*d+b*c;

f:=b*d;

sokr(e,f)

end;
{ Екі бөлшекті алу }

procedure raz(a,b,c,d:integer; var e,f:integer);

var r:integer;

begin e:=a*d-b*c;

f:=b*d;

sokr(e,f)

end;
{ Екі бөлшекті көбейту }

procedure mult(a,b,c,d:integer; var e,f:integer);

var r:integer;

begin e:=a*c;

f:=b*d;

sokr(e,f)

end;
{ Екі бөлшекті бөлу }

procedure del(a,b,c,d:integer; var e,f:integer);

var r:integer;

begin e:=a*d;

f:=b*c;

sokr(e,f)

end;
begin

write('Бірінші бөлшекті енгізіңіз ');

wwod(x,y);

write('Екінші бөлшекті енгізіңіз ');

wwod(p,q);

write('Қосынды '); sum(x,y,p,q,s,t); wywod(s,t);

write('Әртүрлілік '); raz(x,y,p,q,s,t); wywod(s,t);

write('Туынды '); mult(x,y,p,q,s,t); wywod(s,t);

write('Тең '); del(x,y,p,q,s,t); wywod(s,t);

end.


Бекіту сұрақтары:

  1. Глобальды және локальды айнымалылар.

  2. Процедураны және функцияны шақыру

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


Әдебиетер


  1. Дьяконов В.Ю. и др. Системное программирование. М., Высшая школа, 1990г.

  2. Новичков В.С. и др. Паскаль: Учебное пособие для сред. спец. учеб. заведений. М., Высшая школа, 1990г.

  3. Очков В.Ф., Пухначев Ю.В. 128 советов начинающему программисту. М., Энергоатомиздат, 1991г.

  4. Попков А.И. Введение в практическую информатику. Томск, Радио и связь, 1990г.

  5. Прайс, Давид Программирование на языке Паскаль. М., Мир, 1987г.

  6. Семашко Т.Л., Салтыков И. Программирование на языке Паскаль. М., Наука, 1988г.

  7. Васюкова Н.Д., Тюляева В.В. Практикум по основам программирования языка Паскаль. М., Высшая школа, 1991г.

  8. Горстко А.Б., Кочковская С.В. Азбука программирования. М., Знание, 1988г.

  9. Джонстон Г. Учитесь программировать. М., Финансы и статистика, 1989г.

  10. Докукина Т.К. Программирование и алгоритмические языки. М., Машиностроение, 1988г.

  11. Дьяконов В.Ю. и др. Системное программирование. М., Высшая школа, 1990г.

  12. Новичков В.С. и др. Паскаль: Учебное пособие для сред. спец. учеб. заведений. М., Высшая школа, 1990г.

  13. Очков В.Ф., Пухначев Ю.В. 128 советов начинающему программисту. М., Энергоатомиздат, 1991г.

  14. Попков А.И. Введение в практическую информатику. Томск, Радио и связь, 1990г.

  15. Прайс, Давид Программирование на языке Паскаль. М., Мир, 1987г.

  16. Семашко Т.Л., Салтыков И. Программирование на языке Паскаль. М., Наука, 1988г.




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




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

    Басты бет