Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
samost_pascal_delphi_2012.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
4.33 Mб
Скачать

Виклик процедур і функцій.

Процедуру можна викликати з розділу операторів основної програми або іншої підпрограми за допомогою оператора виклику:

< ім'я > (<список фактичних параметрів>);

Виклик функції не оформляється у вигляді окремого оператора. Звернення до функції осущесвляєтся шляхом використання імені функції у виразі:

< вираз >:=< ім'я > (<список фактичних параметрів>);

Параметри, які задають в операторові виклику процедури або функції, називаються фактичними.

Фактичними параметрами-аргументами можуть бути константи, змінні, вирази

Фактичними параметрами-результатами можуть бути змінні.

Типи даних в операторові виклику не указують.

Відповідність між фактичними і формальними параметрами :

  • Між фактичними і формальними параметрами повинна бути відповідність по кількості і типам.

  • Порядок проходження формальних і фактичних параметрів повинен співпадати.

  • Імена відповідних пар фактичних і формальних параметрів можуть не співпадати.

Оператор виклику працює так:

  1. значення фактичних параметрів привласнюються відповідним формальним параметрам процедури або функції

  2. виконується процедура або функція

  3. визначаються параметри-результати, значення яких привласнюються (повертаються) відповідним фактичним параметрам оператора виклику.

Область дії параметрів:

Змінні, описані в розділі var основної програми, називаються глобальними. Вони діють у всіх підпрограмах даної програми. Пам'ять під глобальні змінні виділяється при компіляції програми в сегменті даних.

Змінні, описані в розділі описи конкретної процедури, називаються локальними. Вони створюються при вході в процедуру і знищуються при виході. Пам'ять під них виділяється в програмному стеку.

Процедури можуть одержувати і повертати значення не тільки за допомогою параметрів-результатів, але і через глобальні змінні. Тому списків параметрів в процедурі може і не бути. Проте використання локальних змінних дозволяє оптимізувати програму, уникати помилок.

У TurboPascal допускається будь-який рівень вкладеності процедур і функцій.

Задача 24:

Використовуючи процедуру для обчислення ступені числа, знайти значення виразу: y=a4x4 + a3x3 + a2x2 + a1x + a0.

Розв'язання:

program ex2;

var a: array[0..4] of integer;

i, x: integer;

y,s: longint;

Procedure Degree(xx,n : integer; var st : longint);

var i : integer;

begin

st:=1;

for i:=1 to n do st:=st*xx;

end;

{ початок основної програми}

begin

write(‘введіть значення змінной х ‘); readln(x);

writeln(‘введіть масив коеффіцієнтів’);

for i:=0 to 4 do begin write(‘a[‘,i,’]=’); readln(a[i]); end;

y:=a[0];

for i:=1 to 4 do

begin

Degree(x,i,s); y:=y+a[i]*s;

end;

writeln(‘y=’,y);

end.

Задача 25:

Підсумувати різні частини масиву.

Розв'язання:

Program sumir;

var a: array [1..100] of integer; sa1, sa2,sa3 : integer;

n,l,t : integer;

procedure summa(a:array [1..100] of integer; k,m :integer; var s:integer);

var

i:integer;

begin

s:=0;

for i:=k to m do s:=s+a[i];

end;

BEGIN

for t:=1 to 100 do

begin

write(‘введіть черговий елемент масиву ‘); readln(a[i]);

end;

summa(a,10,20,sa1);

summa(a, n , l , sa2);

summa(a, n,n+3,sa3);

end.

Задача 26:

Скласти програму, яка обчислює число сполучень без повтореннь із n елементів по k. Число сполучнь без повтореннь обчислюється за формулою

Позначимо через n і k змінні для зберігання введених чисел; С - змінну для зберігання результата. Викорисаємо функцію для обчислення факторіала числа n. (n!=1*2*..*n)

Розв'язання:

program sochet;

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

writeln(‘ введення n і k :’); readln(n,k);

a1:=factorial(n); { обчислення n!}

a2:=factorial(k); { обчислення k!}

a3:=factorial(n-k); { обчислення (n-k)!}

c:=a1 div (a2*a3); { результат}

writeln(‘результат=’,c) ;

end.

Перший рядок в описі функції - це її заголовок. Службове слово Function (функція) вказує на те, що ім'ям factorial названа функція. У дужках записаний список формальних параметрів функції, що складається з однієї змінної цілого типу. Далі в заголовку вказаний тип значення функції. У цьому прикладі результат функції factorial - довге ціле число. За заголовком функції йде описова частина функції, яка, як і у програмі, може складатися з розділів опису змінних, констант, типів.

У цьому прикладі є змінні i (лічильник циклу) rez(для накопичення значення факторіалу). Далі йде розділ операторів(тіло функції). У тексті програми описи функцій завжди йдуть за розділом опису змінних і до початку основної частини, як і опису процедур. Нехай n=5, k=3. Коли в програмі зустрічається оператор a1 :=factorial(n), виконуються наступні дії:

  • виділяється пам'ять для змінних, описаних у функції factorial;

  • формальному параметру присвоюється значення фактичного: n:=n(n=5);

  • виконується функція, яка обчислює факторіал числа 5;

  • значення функції передається в місце звернення до цієї функції, тобто присвоюється змінній a1;

  • у операторах a2 :=factorial(k) a3:=factorial(n - k) ще двічі викликається функція factorial з параметрами k=3 n - k=2.

Функція - це самостійна частина програми, що має власні змінні, яким відводиться окреме місце в пам'яті ЕОМ. Цим пояснюється той факт, що змінні з однаковими іменами, використовувані у функції і в основній програмі, є різними(змінна n основної програми і параметр n функції). При виконанні програми машина "не плутає" імена цих змінних, так як зони їх дії не співпадають.

Задача 27:

Написати функцію, що підраховує кількість цифр натурального числа. Використовуючи її, визначити, в якому з двох цих чисел більше цифр.

Розв'язання:

Program chisla;

Var n1, n2 : longint;

k1, k2 : byte;

Function kol(x : longint): byte;

var k: byte;

begin

k:=0;

While x<>0 do Begin Inc(k); x:=x div 10; end;

kol:=k;

end;

BEGIN

writeln(‘Введіть два числа’); readln(n1, n2);

k1:=kol(n1); k2:=kol(n2);

if k1=k2 Then writeln(‘однакова кількість цифр’)

else if k1>k2 Then Writeln(‘у першому числі цифр більше’)

else writeln(‘у другому числі цифр більше ’)

END.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]