Задача 2. Зобразити рух Сонця на блакитному небі в горизонтальному напрямку.
program Sun;
uses crt,graph;
var driver,mode,i :integer;
begin clrscr;
driver:=detect;
initgraph(driver,mode,’’);
i:=0;
while i<=750 do
begin
setcolor(14); setbkcolor(3);
setfillstyle(1,14);
circle(i,100,50);
floodfill(I,100,14);
delay(200); {пауза 0,2с}
setfillstyle(1,3); setcolor(3);
circle(i,100,50);
floodfill(I,100,3);
i:=i+5
end;
end.
Параметри-значення і параметри-змінні у процедурах
Функції .
1. Поняття процедури, її структура та опис.
Підпрограмою — називається найменована логічно закінчена група вказівок, яку можна викликати для виконання довільну кількість раз з різних місць програми.
Процедура — це незалежна найменована частина програми, призначена для виконання конкретних дій.
Процедура складається із заголовка і тіла. Це нібито програма в мініатюрі. Коли процедура виконає своє завдання, програма продовжить виконуватися з вказівки, яка слідує безпосередньо за вказівкою виклику процедури. Використання імені процедури в програмі називається вказівкою процедури або викликом процедури. Формат запису процедури:
procedure <ім'я процедури>;
<тіло процедури>;
Процедури без параметрів
Використання процедур дає можливість підвищити продуктивність праці, зробити програму більш наочною, спростити розробку великих програм тощо.
Так, наприклад, програму знаходження об'єму конуса можна розбити на декілька процедур:
Procedure InputDate;
Procedure Vkazivka;
procedure OutputDate.
Procedure InputDate виконує введення даних в програму.
Procedure Vkazivka виконує вказівки для знаходження об'єму конуса. Procedure OutputDate виконує виведення даних на дисплей.
Всі змінні, які використовуються в процедурах без параметрів, описуються в основній програмі.
Задача. Скласти програму знаходження об'єму конуса.
ProgramVkonus;
Const P=3.14;
Var R,H,V:real;
procedureInputDate;
beginwrite('r=');
readln(R);
write('h=');
readln(H);
end;
procedureVkazivka;
begin
V:=P*Sqr(R)*H/3;
end;
procedureOutputDate;
begin
writeln('V=',V);
end;
begin{Основна програма}
InputDate;
Vkazivka;
OutputDate;
end.
Процедури з параметрами
У процедурі можна оголошувати константи, змінні, інші процедури і функції. Розділ опису в процедурах має таку саму структуру, як і в основній програмі.
Оголошені всередині процедури змінні називаються локальними по відношенню до даної процедури. Локальні змінні не доступні поза межами даної процедури. Зміни, які відбуваються з локальними змінними всередині процедури, не впливають на значення змінних з такими самими іменами, які описані поза даною процедурою.
Змінні, які використовуються в процедурі, але описані поза нею, називаються глобальнимипо відношенню до даної процедури. Будь-які зміни значень глобальних змінних всередині процедури змінюють значення цих змінних поза процедурою.
Приклад програми, в якій використовується принцип локалізації.
Program LOKALIZACIA;
Var A,B: integer;
procedure LOKAL;
var A,X:char;
begin
А:='!';
Х:='?';
В:=В+1;
end;
begin
А:=0;
В:=100;
LOKAL;
writeln('a=',A,' b=',B);
end.
Змінна X — локальна для процедури LOKAL, тому головна програма не може змінити її значення або звернутись до неї.
Змінна В — глобальна для процедури LOKAL, вона відома і в програмі, і в процедурі. Поскільки в процедурі немає іншого оголошення для змінної В, то всі зміни, які відбуваються зі значенням В в процедурі, зберігаються і після виходу з неї.
Змінна А в основній програмі належить до цілого типу, але в процедурі LOKAL є своя власна змінна А, яка належить до типу char. Змінна А з головної програми недоступна в процедурі LOKAL. Всі зміни, які відбуваються зі значенням А в процедурі, втрачають свій зміст при виході з неї.
Отже, в результаті виконання програми LOKAL на екран будуть виведені два числа: а=0 і b= 101.
В Турбо-Паскалі введено розширення мови, завдяки чому в процедурі можуть бути доступними як локальні відносно неї змінні, так і змінні з такими ж іменами, які описані в основній програмі. Для того, щоб реалізувати таку можливість, звернення до змінних в процедурі виконується таким чином. До локальних змінних звернення реалізується просто по їх імені (тобто як в стандартній мові). Для звернення до змінних, які однойменні з локальними, але введені в основній програмі, використовується така форма:
ім'я програми. ім'я змінної
ім'я програми — ім'я програми, яке вказано в заголовку програми "program ..."
ім'я змінної— ідентифікатор змінної, вказаний в розділі опису змінних — "var ...."
З врахуванням цього програму LOKALIZACIA можна перетворити так, щоб в процедурі LOKAL були доступні однойменні змінні, описані як в самій процедурі, так і в основній програмі.
Звернення до процедур і функцій
Program LOKALIZACIA 1;
Var A,B: integer;
procedure LOKAL;
var A,X: char;
begin
A:= '!';
X:= '?';
B:=B+1;
LOKALIZACIAl.A:=LOKALIZACIA1.A+12;
end;
begin
A:=0;
B:=100;
LOKAL;
writeln('a=‘,A,‘b=‘,b);
end.
В результаті виконання програми Lokalizacial на екрані появляться такі значення змінних: а=12 і b=101.
2. Параметри-значення і параметри-змінні у процедурах
1.Параметри-значення
Наведений вище формат опису процедури можна доповнити таким чином. Після заголовка процедури в круглих дужках можуть вказуватись змінні (з допомогою яких в процедуру передаються дані) і їх типи, які називаються параметрами-значеннями.Перед ними відсутнє службове слово VAR.
Формат запису процедури:
ім'я процедури (ім'я змінної:тип змінної);
тіло процедури;
Змінні, які описані в заголовку процедури, називаються формальними параметрами. Змінні або константи, які описані у вказівці процедури при її виклику, називаються
фактичними параметрами.
При зверненні до процедури з параметрами всі формальні параметри замінюються фактичними в порядку їх перелічення.
Program PARAMETR;
Var C,D:integer;
procedure PARAM(A,B: integer);
var S: integer;
begin
S:=0;
S:=A+B;
writeln('s=',S)
end;
begin
С:=10;
D:=100;
param(C,D); { 1-ий спосіб }
param( 10,100) { 2-ий спосіб }
end.
Змінні А і В — це формальні параметри. Змінні С і D — фактичні параметри. Значення фактичних параметрів С=10 і D=100 передаються формальним параметрам А і В.
Зверніть увагу на те, як двома способами можна викликати процедуру і передати значення змінним.
Такий спосіб передачі параметрів процедурі називається передачею за значенням. При цьому значення фактичного параметра робиться доступним для процедури. Його можна використовувати в роботі, змінювати довільним чином. Але ці зміни проявляються тільки в межах процедури, тобто є локальними. Вони не впливають на фактичні параметри поза процедурою.
2. Параметри-змінні
Для того, щоб процедура змогла змінювати значення фактичних параметрів, потрібно змінити спосіб передачі параметрів в процедуру. Новий спосіб називається передачею по імені.
При використанні цього способу заголовок процедури змінюється таким чином: перед ідентифікатором формального параметра в заголовку процедури вказується службове слово Var.
Змінні, перед якими записане службове слово Var, називаються параметрами-змінпими.
При виконанні процедури формальні параметри-змінні замінюються фактичними параметрами. Будь-які зміни значення формального параметру-змінної приводять до зміни значення фактичного параметру-змінної. За допомогою параметрів-змінних в основну програму передаються результати дії вказівок над даними.
Задача. Дано дві трійки чисел: А1, В1, СІ і А2, В2, С2.
Знайти значення сум:
S1 = min(Al, В1, СІ) + min(A2, В2, С2),
S2 = max(Al, В1, СІ) + max(А2, В2, С2).
Звернення до процедур і функцій
Для знаходження тіп і max з трьох чисел використаємо процедуру МіnМах.
Program PRIKLAD;
Var Al,Bl,Cl,A2,B2,C2,MІNl,MIN2,MAXl,MAX2,Sl,S2:real;
procedure MinMax(A,B,C:real; var MIN,MAX:real);
begin
MAX:=A;
if MAX<B then MAX:=B;
if MAX<C then MAX:=C;
MIN:=A;
if MIN>B then min:=B;
if МIN>С then MIN:=C; end;
begin
write('Al=');
readln(Al);
write('Bl=');
readln(Bl);
write('Cl=');
readln(Cl);
write('A2=');
readln(A2);
write('B2=');
readln(B2);
write('C2=');
readln(C2);
MinMax(A 1 ,B 1 ,C 1 ,MIN 1 ,MAX 1);
MinMax(A2,B2,C2,MIN2,MAX2);
S1:=MIN1+MIN2;
S2:=MAX1+MAX2;
Writeln('Sl=',Sl);
Writeln('S2=',S2);
end.
3. Функції
Якщо результатом виконання деякої процедури є одне скалярне значення, то цю процедуру бажано оформити як функцію. Формат опису функції:
function <ім'я функції>(список формальних параметрів):<тип результату>;
Звернення до функції (обов'язково повинно бути включене у вираз як операнд) має такий вигляд :
<ім'я функції> (список фактичних параметрів).
Задача. Знайти значення числа комбінацій n!
Знаходження значення факторіалу числа оформимо у вигляді функції. Тоді програма розв'язання даної задачі матиме вигляд:
Program KOMBINACIJ;
var N,M,C:integer;
function FACT(K:integer):integer;
var i,F:integer;
begin
F:=l;
for i:=l to K do F:=F*i;
FACT:=F;
end;
begin
write('n=');
readln(N);
write('m=');
readln(M);
C:=FACT(N)Div(FACT(M)*FACT(N-M));
Writeln ('Кількість комбінацій з ',n,' no ',m,' = ',C);
end.
Зверніть увагу на те, що в самому тілі функції FACT необхідно змінній, ім'я якої співпадає з ім'ям самої функції, присвоїти значення результату виконання функції: FACT:=F.
Задача 1. Знайти площу п’ятикутника, у якого сторони дорівнють:
AB = 2м, BC =a м, CD = b м, DE = cм, AE = d м, AC =4 м, AD = 5 м.
Program Pyatukytnuk;
Var
a,b,c,d,f,g,h: integer;
S,S1,S2,S3 : real;
Function ploscha(x,y,z:integer):real;
Var
p,S:real;
begin
If (x+y>z) and (x+z>y) and (y+z>x) Then
begin
P:=(x+y+z)/2;
S:=sqrt(p*(p-x)*(p-y)*(p-z));
end
Else
begin
Writeln(‘Такий трикутник не існує’);
S:=0
end;
ploscha:=S
End;
Begin
Write (‘Введіть сторону=BC> ‘);
ReadLn(a);
Write (‘Введіть сторону=CD> ‘);
ReadLn(b);
Write (‘Введіть сторону=DE> ‘);
ReadLn(c);
Write (‘Введіть сторону=AE> ‘);
ReadLn(d);
f:=2;
g:=4;
h:=5;
S1:=ploscha(f,a,g);
S2:=ploscha(g,b,h);
S3:=ploscha(h,c,d);
if (S1<>0) and (S2<>0) and (S3<>0) then
begin
S:=S1+S2+S3;
Writeln(‘S=’,s:5:2)
end
else
begin
Writeln(‘Пятикутника не існує’);
Writeln(‘уведіть іншу величину сторін)’;
end;
ReadLn;
End.
Задача. За допомогою функції, що визначає, яке з двох чисел більше, визначити яке з чотирьох чисел більше.
Program max_4chucla;
Uses crt;
Var
a,b,c,d,max:real;
Function maximym(a,b,max:real):real;
begin
Max:=a;
If max<b then max:=b;
Maximym:=max;
end;
Begin
clrscr;
write('a=>');
readln(a);
write('b=>');
readln(b);
write('c=>');
readln(c);
write('d=>');
readln(d);
max:=maximym(maximym(maximym(a,b,max),c,max),d,max);
writeln('max=',max:4:2);
readln;
End.
Запитання для самоконтролю:
- Для чого призначені процедури ?
- Як описується заголовок процедури ?
- Чим відрізняються формальні і фактичні параметри ?
- Чим відрізняються локальні і формальні змінні ?
- Для чого призначені функції ?
- Як описується заголовок функції ?
- Яка різниця між процедурою і функцією ?
- Як викликаються процедури і функції ?
Завдання
Знайти довжину сторін трикутника АВС, якщо відомі координати його вершин А(х1,y1,z1), B(х2,y2,z2), C(х3,y3,z3). Необхідно скористатись формулою: