Writeln

End.

Readln

Else

Begin

Begin

End.

Readln

Begin

Begin

Масиви

Begin

Begin

End.

Begin

Begin

End.

Repeat

Begin

End.

Repeat

Begin

End.

Begin

Var

End.

Case MONTH of

Begin

Write('Введіть порядковий номер місяця (від 1 до 12): ');

readln(MONTH);

3,4,5:writeln('Becнa');

6,7,8 : writeln ('Літо');

9,10,11:writeln('Ociнь');

12,1,2:writeln('Зимa')

end;

ВКАЗІВКИ ПОВТОРЕННЯ (ЦИКЛУ)

5. Вказівка повторення з параметромFOR

Цикл –це вид управляючої структури, що дозволяє кілька разів повторити задану кількість операторів. Цикли - основний засіб у програмуванні, що дозволяє коротко записувати алгоритм, який здійснює велику кількість дій.

Для реалізації циклічних алгоритмів у мові Паскаль використовуються оператори повторення (цикли):

* оператор циклу з параметром (For);

* оператор циклу з передумовою (While);

* оператор циклу з післяумовою (Repeat).

Оператор циклу з параметром передбачає повторне виконання деякого оператора з одночасною зміною значення, що присвоюється керуючою змінною (параметру цього циклу). Він має вид:

а) зі значенням 1 кроку зміни параметра:

For < параметр >:= <вираз1 > to <вираз2 >do <оператор >

Дія оператора: Параметрові циклу присвоюється значення виразу 1. Якщо це значення менше-рівне, ніж значення виразу 2, то виконується оператор. Після виконання оператора значення параметра автоматично збільшується на 1 і знову порівнюється зі значенням виразу 2 і т.д. Коли значення параметра стане більшим, ніж значення виразу 2, то виконується наступний після циклу оператор.

або

б) зі значенням -1 кроку зміни параметра:

For < параметр >:=< вираз1 > downto <вираз2 > do <оператор>

Дія оператора: Ця команда діє як попередня, але крок зміни параметра є –1.

Оператор - тіло циклу.

Параметр циклу, вираз1 і вираз2 повинні бути одного й того ж скалярного типу ( крім дійсного). Вираз1 і вираз2 обчислюється лише один раз - при вході в цикл, і, отже, повинні бути визначені до входу в цикл і не можуть бути змінені в тілі циклу.

Якщо вираз1 і вираз2 розділяє службове слово to, то після виконання оператора (тіла циклу) параметр циклу v приймає значення Succ(v), якщо ж дільником виразу1 і виразу2 служить слово downto, то параметр циклу v після виконання тіла циклу приймає значення Pred(v).

Приклад:

Піднести будь-яке дійсне число а до будь-якого цілого степення n.

Розв'язок:

program Stepin;

a,p:real;

i,n:integer;

write('введіть a - основу степеня, а=');

readln(a);

write('введіть ціле n - показник степеня, n=');

readln(n);

p:=1;

for i:=1 to n do

p := p * a;

writeln('p=',p)

6. Вказівка повторенняWHILE

Оператор For використовується лише у випадку, коли заздалегідь відома кількість повторень тіла циклу. У більш загальному випадку, коли кількість повторень заздалегідь невідома, а задана деяка умова закінчення (або продовження) циклу, у мові Pascal використовують інші оператори повторення: оператор циклу з передумовою While і оператор циклу з післяумовою Repeat.

Вказівка циклу з передумовою:

 
 

 


Дія оператора:

Оператор (тіло циклу) виконується до тих пір, поки умова істинна. Якщо при першій перевірці умова виявилась хибною, оператор не виконується. Зазначений оператор виконується нуль, один або декілька разів, поки умова справджується.

Тіло циклу WHILEвиконується до тих пір, поки умова приймає значення True. Дії, що містяться в тілі циклу, будуть виконані у крайньому випадку один раз. Таким чином, не виконання умови є умовою закінчення циклу.

 
 
Приклад 1. Роздрукувати символи латинського алфавіту. а) звичайний порядок: programlatsimvol; var S:char; begin S:='A'; while S<='Z' do begin writeln(S); S:=succ(S); end end. б) у зворотному порядку: programlatsimvol; var S:char; begin S:='Z'; while S>='A' do begin writeln(S); S:=pred(S); end end.

 


 

7. Вказівка повторенняREPEAT

 

Оператор For використовується лише у випадку, коли заздалегідь відома кількість повторень тіла циклу. У більш загальному випадку, коли кількість повторень заздалегідь невідома, а задана деяка умова закінчення (або продовження) циклу, у мові Pascal використовують інші оператори повторення: оператор циклу з передумовою While і оператор циклу з післяумовою Repeat.

Оператор циклу з післяумовою визначений діаграмою:

 

 


Оператор циклу з післяумовою передбачає повторне виконання деякого оператора(ів) до тих пір, поки не виконається умова.. Він має вид:

 

REPEAT <оператор1 > <оператор2 > <оператор3 > *** <оператор n > UNTIL <умова>;

Дія оператора:Спочатку виконуються зазначені оператори, а пізніше перевіряється умова. Якщо умова справджується (істинна), то виконання циклу завершується, якщо ні, то оператори виконуються ще раз, і так далі.

Тіло циклу Repeat виконується до тих пір, поки умова приймає значення False. Дії, що містяться в тілі циклу, будуть виконані у крайньому випадку один раз. Таким чином, виконання умови є умовою закінчення циклу.

 

ВКЛАДЕНІ ЦИКЛИ: Вкладені цикли– це декілька циклів записаних один за одним. Наприклад: for i:=1 to 10 do for j:=1 to 15 do <оператори>

Зауваження:

Repeat Until KeyPressed– умова, чи

натиснена клавіша (пауза);

 

Приклад 1. Роздрукувати символи латинського алфавіту.

 

а) звичайний порядок:

programlatsimvol;

var

S:char;

S:='A';

write(S);

S:=succ(S);

until S>'Z'

б) у зворотному порядку:

programlatsimvol;

var

S:char;

S:='Z';

write(S);

S:=pred(S);

until S<'A'

§ 12 Підпрограми

Підпрограми призначені для реалізації алгоритмів опрацювання окремих частин деякої складної задачі. Вони дають змогу реалізовувати концепцію структурного програмування, суть якого полягає в розкладанні складної задачі на послідовність простих підзадач і в складанні для алгоритмів розв’язування кожної підзадачі відповідних підпрограм. Розрізняють два види підпрогрампідпрограми-процедури та підпрограми-функції. Підпрограми поділяються на: стандартні та підпрограми користувача.

Стандартні підпрограми створювати не потрібно — вони містяться у стандартних модулях System, Crt, Dos, Graph тощо.

Підпрограма користувача — це пойменована група команд, яку створюють і описують в основній програмі в розділах procedure або function і до якої звертаються з будь-якого місця програми потрібну кількість разів.

1. Процедури (procedure). Загальний опис процедури:

procedure <назва> (<список формальних параметрів>); <розділи описів і оголошень процедури>; begin <розділ команд процедури> end;

У списку формальних параметрів перераховують змінні разом із зазначенням їхніх типів. Розрізняють параметри-аргументи (інший термін: параметри-значення) — вхідні дані для процедури, і параметри-результати (інший термін: параметри-змінні), через які можна повертати результати роботи процедури в основну програму. Перед списками параметрів-результатів кожного типу записують слово var.

Зауважимо, що масиви фіксованих розмірів у списках формальних параметрів не можна описувати за допомогою слова array (див. зразки програм).

Розділи описів і оголошень у підпрограмах мають таку саму структуру як і в основній програмі.

Приклад1. Розглянемо процедуру з назвою Cina, яка визначає с — вартість k хвилин телефонної розмови з похвилинною оплатою 0.6 грн. + 20% ПДВ.

procedure Cina(k:integer; var c:real);

c:=k*0.6; c:=c+0.2*c;

end;

У наведеному прикладі k є формальним параметром-аргументом, с — формальним параметром-результатом.

До процедури звертаються з розділу команд основної програми або іншої підпрограми.

Звернення до процедури:

<назва процедури> (<список фактичних параметрів>);

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

Між фактичними і формальними параметрами має бути відповідність за кількістю й типами. Зверніть увагу, відповідні фактичні та формальні параметри можуть мати різні імена.

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

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

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

 

2. Функції (function). Функція, на відміну від процедури, може повертати в місце виклику лише один результат простого стандартного типу.

Загальний опис функції:

function <назва>(<список формальних параметрів>) : <тип функції>; <розділи описів і оголошень функції>; begin <розділ команд функції, де має бути така команда: назва:=вираз> end;

У розділі команд функції має бути команда присвоєння значення деякого виразу назві функції. Результат функції повертається в основну програму через її назву (як і випадку використання стандартних функцій, таких як sin, cos).

Звернення до функції:

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

Приклад1. Створимо функцію для обчислення tg(x) та обчислимо значення виразу tg(x)+ctg(x)+tg2(x).

program Myfunc;

uses Crt;

var x,y:real;

function tg(x:real):real;

tg:=sin(x)/cos(x)

end;

begin clrscr;

writeln('Введіть х');

readln(x);

y:=tg(x)+1/tg(x)+sqr(tg(x));

writeln('y=', y:5:2); readln

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

Стек — це структура даних в оперативної пам’яті, де дані запам’ятовуються і зберігаються за принципом «перший прийшов — останнім пішов». Аналогом у військовій справі є ріжок для набоїв до автомата.

Приклад1. Рекурсивна функція обчислення суми цілих чисел від a до b має вигляд:

functionSuma(a,b:integer):integer;

if a=b then Suma := a {Це стоп-умова рекурсії}

else Suma := b + Suma(a, b–1) {Це неявний цикл}

end;

 

Приклад2. Скласти рекурсивну функцiю Factorial для обчислення факторіала числа n! = 1·2·3·...·n, (0! = 1, 1! = 1), яка грунтується на багаторазовому (рекурсивному) застосуваннi формули n! = n·(n – 1)!.

function Factorial(n : integer) : integer;

if n = 0 then Factorial := 1 {Це стоп-умова}

else Factorial := n * Factorial(n–1)

end;

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

Масив (array) — це скінчений набір елементів одного (базового) типу,

які зберігаються в послідовно розташованих комірках оперативної пам’яті і мають спільну назву.

У математиціпоняттю мaсив відповідають поняття вектората матриці. Розрізняють одно (рядки, стрічки, вектори)- та багатовимірні масиви. Двовимірний масив даних — це таблиця, що складається з декількох рядків.

1. Одновимірні масиви (рядки, вектори):

Загальний вигляд конструкції опису типу масиву такий:

TYPE <назва типу>=array [<розмір>] of<назва базового типу>;

можна і так:

<список змінних>:array [<розмір>] of<назва базового типу>;

Розмір (кількість елементів) масиву найчастіше задають у вигляді діапазону або назви деякого перерахованого типу даних.

Описати масив можна у розділі опису типівtype, у розділі констант const, або у розділі оголошення змінних var. Назви типів масивів і змінних-масивів придумує користувач.

Приклад. Розгляньте: 1) опис типу масивів (назва типу mymasyv), 2) оголошення cталого масиву (масиву-константи) vydatky типу mymasyv і 3) оголошення змінних-масивів a, a1 типу mymasyv та масивів: b (він має 7 елементів цілого типу), c (має 100 елементів-символів, тобто даних типу char).

type mymasyv= array [1..10] of real;

day=(mon, tue, wed, the, fri, sat, sun);

const vydatky: mymasyv =(1.2, 1, 1, 2, 18, 2.4, 8.97, 3, 7, 1.3);

vara, a1: mymasyv;

b: array[day] ofinteger;

c: array [1..100] of char;

Над масивами визначена єдина команда копіювання: a:=a1 – усі значення масиву a1 будуть присвоєні відповідним еле­ментам масиву a. Усі інші операції, наприклад, присвоєння конкретних значень, додавання, множення тощо, визначені лише над елементами масиву.

Доступ до елемента масиву здійснюється через назву масиву і номер елемента. Цей номер (його часто називають індексом) записується в квадратних дужках, наприклад, a[1] - перший елемент масиву а, b[tue]-другий елемент масиву b.

Щоб опрацювати всі елементи масиву використовують команду циклу for (чи while або repeat).

Приклад.Елементам описаних масивів можна надати значення так: a[1]:=15.1; b[tue]:=3; с[1]:=’a’; c[2]:=’b’. Сталі елементи мають такі значення: vydatky[1]=1.2; vydatky[2]=1; …; vydatky[10]=1.3.

Приклад. Створити масив з перших ста цілих чисел і обчислити суму всіх його елементів можна так: s:=0; for i:=1 to 100 do begin a[i]:=i; s:=s+a[i] end; writeln(s);

Задачі відшукуання в масиві конкретних даних розв’язують методом сканування (перебирання, перегляду) усіх елементів масиву за допомогою циклу і умовної команди, де зазначають умову пошуку.

Задача 1. Нехай yk — це число викликів, які поступають на АТС за k-ту секундy. Припустимо, що yk — випадкове число зі значенням від 0 до 6, яке генерується формулою yk=trunc(abs(7sin(k))). Утворити масив y з десятьма елементами . Обчислити суму викликів за перші 10 секунд роботи АТС та максимальну кількість викликів, що були за деяку одну секунду. Вивести результати обчислень.

programATS;

uses Crt;

type vyklyk= array[1..10] of integer;

var y: vyklyk; max, s, i: integer;

clrscr;

max:=0; s:=0; {Припустимо, що max=0}

for i:=1 to 10 do

y[i]:=trunc(abs(7*sin(i))); {Обчислимо кількість викликів}

write('Кількість викликів за ', i, '–ту секунду: '); {за і-ту секунду}

writeln(y[i]:5); {Виведемо цю кількість}

s:=s+y[i]; {Обчислимо суму викликів}

if y[i]>max thenmax:=y[i]; {Обчислимо max значення }

end;

writeln('Кількість викликів за 10 секунд = ', s:3);

write('Максимальна кількість викликів за одну ');

writeln('секунду = ', max:3);

Зауваження. Випадкове ціле число зі значенням від 0 до 6 можна згенерувати також за допомогою функції random(7). На початку виконуваного блоку слід записати виклик процедури randomize (вона забезпечить іншу послідовність випадкових чисел під час виконання програми вдруге).

Задача 2. Утворити масив y, елементи якого обчислюються за формулою yk=ln(k)–3, де . Побудувати масивg, який складається з від'ємних елементів масиву y. Вивести результати обчислень. Якщо шуканих величин немає, вивести про це повідомлення.

У наступній програмі змінна n визначає кількість від’ємних елементів у новому масиві.

programDvaMasyvy;

uses Crt;

var y,g: array [1..10] of real;

k,n: integer;

begin clrscr;

n:=0; {Спочатку кількість елементів у g = 0}

for k:=1 to 10 do

y[k]:=ln(k)–3;

if y[k]<0 then {Перевіримо чи елемент від'ємний}

n:=n+1; {Збільшимо кількість елементів вектора g}

g[n]:= y[k]; {Знайдемо n-ий елемент}

end;

writeln('y(' , k, ')=' , y[k]:7:2);

end;

if n=0 then writeln('Масив у від''ємних елементів не має')

for k:=1 to n do

writeln('g[' , k , ']=' , g[k]:7:2); {Виведемо масив g }

 

2. Двовимірні масиви (матриці). Елементи двовимірного масиву (дані можуть бути подані у вигляді таблиці-матриці) визначаються іменем масиву та двома індексами: перший індекс означає номер рядка, а другий — номер стовпця, на перетині яких стоїть елемент, наприклад р[1,2], p[i,j].

Загальний вигляд конструкції опису типу матриці такий:

TYPE <назва типу>=array [<розмір>, <розмір>] of<назва базового типу>;

можна і так:

<список змінних>:array [<розмір>,<розмір>] of<назва базового типу>;

Розглянемо приклади оголошення масиву-константи bal, що має 2 рядки і 4 стовпці елементів, деякого масиву doba, який міститиме 24·60 елементів цілого типу, двовимірного масиву р розміру 9 на 9 (тут буде 9·9=81 елемент).

const bal: array [1..2, 1..4] of integer=((4,3,5,3), (4,4,5,3));

vardoba: array [0..23] of array [0..59] of integer;

const n = 9;

var p : array[1..n, 1..n] of integer;

 

Тут bal[1,1]=4, bal[1,2]=3, …, bal[2,3]=5, bal[2,4]=3. Значення елементам масивів doba i p можна надати командою присвоєння двома способами,наприклад, так: doba[16][30]:=5, doba[16,30]:=5.

Задача 3. Скласти програму для занесення в двовимірний масив р таблиці множення двох чисел і виведення масиву на екран.

programPifagor;

uses Crt;

const n = 9;

var p: array [1..n, 1..n]of integer; i, j : integer;

beginclrscr;

for i := 1 to n do begin

forj := 1 to n do begin

p[i, j] := i * j;

write(p[i, j] : 6) {Зверніть увагу на команди виведення масиву}

end; {у вигляді таблиці}

end;

readln; end.

Задача 4. Кондитерська фабрика для виготовлення п'яти сортів цукерок використовує п'ять видів сировини. Нехай норми затрат aij кожного виду сировини і на виробництво 1т цукерок сорту j задані формулою aij = 2|Sin(i)|+j, . Вивести на екран таблицю затрат сировини (тобто масив а). Визначити для якого сорту цукерок (imin) потрібно найменше сировини (min) третього виду.

programFabryka;

uses Crt;

type vytraty = array[1..5, 1..5] of real;

var i,j,imin: integer; min: real; a:vytraty;

beginclrscr;

writeln(' Вид сировини');

writeln(' 1 2 3 4 5');

for i:=1 to 5 do {Утворимо таблицю затрат}