Програмування на мові Паскаль

Download Report

Transcript Програмування на мові Паскаль

Програмування на
мові Паскаль
Тема 1. Вступ
Алгоритм
Алгоритм – це чітко визначений план дій для
виконавця.
Властивості алгоритму
• дискретність: складається з окремих кроків
(команд)
• зрозумілість: повинен включати тільки команди
відомі для виконавця (які містяться в СКВ)
• визначеність: при однакових вхідних даних завжди
видає один і той самий результат
• скінченність: закінчується за скінчену кількість
кроків
• масовість: може застосовуватися багатократно при
різних вихідних даних
• коректність: видає правильне рішення при будьяких допустимих вихідних даних
Програма
Програма – це
• алгоритм, записаний на будь-якій мові
програмування
• набір команд для комп’ютера
Команда – це опис дій, які повинен
виконати комп’ютер.
• звідки отримати вихідні дані?
• що потрібно з ними зробити?
Мови програмування
• Машинно-орієнтовані (низького рівня) – кожна
команда відповідає одній команді процесора
(асемблер)
• Мови високого рівня – наближені до реальної
(англійської) мови, легше сприймаються
людиною, не залежать від відповідного
комп’ютера
• для навчання: Бейсик, ЛОГО, Паскаль
• професійні: Сі, Фортран, Паскаль
• для задач штучного інтелекту: Пролог,
ЛИСП
• для Інтернету: JavaScript, Java, Perl, PHP,
ASP
Мова Паскаль
1970 – Ніклаус Вірт (Швейцарія)
• мова для навчання студентів
• розробка програм “зверху-вниз”
Задача
Підзадача1
1.1
1.2
1.3
Підзадача2
2.1
2.2
Підзадача3
2.3
3.1
3.2
3.3
• різноманітні структури даних (масиви,
структури, множини)
З чого складається програма?
program <ім’я програми>;
const …;{константи}
var …; {змінні}
{ процедури і функції }
begin
… {основна програма}
end.
коментарі у фігурних дужках не
опрацьовуються
З чого складається програма?
Константа – постійна величина, яка має
ім’я.
Змінна – змінна величина, яка має ім’я
(комірка пам’яті).
Процедура – додатковий алгоритм, який
описує деякі дії (малювання кола).
Функція – додатковий алгоритм, для
виконання обчислень (обчислення
квадратного кореня, sin).
Імена програм, констант, змінних
Імена можуть містити
• латинські букви (A-Z)
великі і маленькі букви не розрізняються
• цифри
ім’я не може починатися з цифри
• знак підкреслення _
Імена НЕ можуть містити
• українські букви
• пропуски
• дужки, знаки +, =, !, ? та ін.
Які імена правильні?
AXby R&B 4Wheel Вася “PesBarbos”
TU154 [QuQu] _ABBA A+B
Константи
const
i2 = 45; { ціле число }
pi = 3.14; { дійсне число }
ціла і дробова частина відділяються крапкою
qq = 'Вася'; { рядок символів }
можна використовувати українські букви!
L
= True; { логічна величина }
Може приймати два значення:
• True (істина, “так")
• False (хибність, "ні")
Змінні
Змінна – це величина, яка має ім’я, тип і значення.
Значення змінної величини під час виконання
програми може змінюватися.
Типи змінних:
• integer
{ цілі }
• real
{ дійсні }
• char
{ один символ }
• string
{ рядок }
• boolean
{ логічні }
Оголошення змінних (виділення пам’яті):
var a, b: integer;
Q: real;
s1, s2: string;
Як змінюється значення змінної?
Оператор – це команда мови програмування високого
рівня.
Оператор присвоєння служить для зміни значення
змінної.
Приклад:
program qq;
a
var a, b: integer;
5
?
5
begin
b
a := 5;
5+2
?
7
b := a + 2;
a
a := (a + 2)*(b – 3);
7*4
28
5
end.
Оператор присвоєння
Загальна структура:
<ім’я змінної> := <вираз>;
Арифметичні вирази можуть містити
• константи
• імена змінних
• знаки арифметичних дій:
+ *
/
div
mod
множення
ділення
• виклики функцій
• круглі дужки ( )
ділення
націло
остача від
ділення
Які оператори неправильні?
program qq;
var a, b: integer;
x, y: real;
begin
ім’я змінної повинно знаходитися
зліва від знака :=
a := 5;
ціла і дробова частина
10 := x;
відділяються крапкою
y := 7,8;
неможливо записати дійсне
b := 2.5;
значення в цілу змінну
x := 2*(a + y);
a := b + x;
end.
Ручна прокрутка програми
program qq;
var a, b: integer;
begin
a := 5;
b := a + 2;
a := (a + 2)*(b – 3);
b := a div 5;
a := a mod b;
a := a + 1;
b := (a + 14) mod 7;
end.
a
b
?
?
5
7
28
5
3
4
4
Порядок виконання операцій
• обчислення виразів у дужках
• множення, ділення, div, mod зліва направо
• додаванні і віднімання зліва направо
2 3 5 4 1
7 8 6 9
z := (5*a*c+3*(c-d))/a*(b-c)/ b;
a 2  5c 2  d (a  b)
x
(c  d )(d  2a)
5ac  3(c  d )
z
(b  c)
ab
2 6 3 4 7 5 1
12 8 11 10 9
x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));
Додавання двох чисел
Задача. Ввести два цілих числа і вивести на
екран їх суму.
Найпростіше розв’язання:
program qq;
var a, b, c: integer;
begin
read ( a, b );
c := a + b;
writeln ( c );
end.
Оператор введення
read ( a );
{ ввести значення
змінної a}
read ( a, b ); { ввести значення
змінних a і b}
Як вводяться два числа?
25 a
30 b
через пропуск:
25 30
через Enter:
25
30
25 a
30 b
Оператор виведення
write ( a );
{ вивести значення
змінної a}
writeln ( a ); { вивести значення
змінної a і перейти на
новий рядок}
writeln ( ‘Привіт!' ); { виведення
тексту}
writeln ( ‘Відповідь: ', c );
{виведення тексту і значення
змінної c}
writeln ( a, '+', b, '=', c );
Формати виведення
program qq;
var i: integer;
x: real;
begin
всього
i := 15;
символів
writeln ( '>', i, '<' );
writeln ( '>', i:5, '<' );
x := 12.345678;
writeln ( '>', x, '<' );
writeln ( '>', x:10, '<' );
writeln ( '>', x:7:2, '<' );
end.
всього
символів
в дробовій
частині
>15<
>
15<
>1.234568E+001<
> 1.23E+001<
> 12.35<
Повний розв’язок
program qq;
var a, b, c: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
c := a + b;
writeln ( a, '+', b, '=', c );
end.
Протокол:
це виводить комп'ютер
Ввести два цілих числа
25 30
це вводить користувач
25+30=55
Блок-схема лінійного алгоритму
початок
блок «початок»
ввести a, b
блок «ввести»
c := a + b;
вивести c
кінець
блок «процес»
блок «вивести»
блок «кінець»
Завдання
"4": Ввести три числа, знайти їх суму і добуток.
Приклад:
Ввести три числа:
4
5
7
4+5+7=16
4*5*7=140
"5": Ввести три числа, знайти їх суму, добуток і
середнє арифметичне.
Приклад:
Ввести три числа:
4
5
7
4+5+7=16
4*5*7=140
(4+5+7)/3=5.33
Програмування на
мові Паскаль
Тема 2. Розгалуження
Алгоритми розгалуження
Задача. Ввести два цілих числа і вивести на екран
більше з них.
Ідея розв’язання: потрібно вивести на екран перше
число, якщо воно більше другого, або друге, якщо воно
більше першого.
Особливості: дії виконавця залежать від деяких умов
(якщо … інакше …).
Алгоритми, в яких послідовність кроків залежить від
виконання деяких умов, називаються розгалуженими.
Варіант 1. Блок-схема
початок
ввести a,b
так
a > b?
max:= a;
блок «логічний
вираз»
повна форма
розгалуження
ні
max:= b;
вивести max
кінець
?
Якщо a = b?
Варіант 1. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
повна форма
if a > b then begin
умовного
оператора
max := a;
end
else begin
max := b;
end;
writeln (‘Більше число ', max);
end.
Умовний оператор
if <умова> then begin
{що робити, якщо умова правильна}
end
else begin
{що робити, якщо умова неправильна}
end;
Особливості:
• перед else НЕ ставиться крапка з комою
• друга частина (else …) може бути відсутня (неповна
форма)
• якщо в блоці один оператор, можна забрати слова
begin і end
Що неправильно?
if a > b then begin
a := b;
end
else begin
b := a;
end;
if a > b then begin
a := b;
end
begin
else b
> a begin
b := a;
end;
if a > b then begin
a := b; end
else begin
b := a;
end;
if a > b then begin
a := b;
end;
end
else begin
b := a;
end;
Варіант 2. Блок-схема
початок
ввести a,b
max:= a;
так
b > a?
max:= b;
вивести max
кінець
ні
неповна форма
розгалуження
Варіант 2. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
max := a;
неповна форма
умовного
if b > a then
оператора
max := b;
writeln (‘Більше число ', max);
end.
Варіант 2Б. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
max := b;
> b then
if a ???
???:= a;
max
writeln (‘Більше число ', max);
end.
Що неправильно?
if a > b then begin
b;
a := b
else b := a;
if a > b then
b
a := b;
else b := a; end;
if a > b then begin
a := b;
end;
end
else b := a;
if a > b then
else
if b begin
>= a then
bb:=
:=a;
a;
end;
Завдання
"4": Ввести три числа і знайти найбільше з них.
Приклад:
Ввести три числа:
4
15
9
Найбільше число 15
"5": Ввести п’ять чисел і знайти найбільше з них.
Приклад:
Ввести п’ять чисел:
4
15
9
56
Найбільше число 56
4
Програмування на
мові Паскаль
Тема 3. Складені умови
Складені умови
Задача. Фірма набирає співробітників від 25 до 40 років
включно. Ввести вік людини і визначити, чи підходить
вона фірмі (вивести відповідь “підходить” або “не
підходить”).
Особливості: потрібно перевірити, виконання двох умов
одночасно.
?
Чи можна розв’язати відомими методами?
Варіант 1. Алгоритм
початок
ввести x
так
так
‘підходить'
x <= 40?
x >= 25?
ні
ні
‘не підходить'
кінець
‘не підходить'
Варіант 1. Програма
program qq;
var x: integer;
begin
writeln(‘Ввести вік');
read ( x );
if x >= 25 then
if x <= 40 then
writeln (‘Підходить')
else writeln (‘Не підходить')
else
writeln (‘Не підходить');
end.
Варіант 2. Алгоритм
початок
ввести x
так
x >= 25
і
x <= 40?
‘підходить'
ні
‘не підходить'
кінець
Варіант 2. Програма
program qq;
var x: integer;
begin
складена
writeln(‘Ввести вік');
умова
read ( x );
if (x >= 25) and (x <= 40) then
writeln (‘Підходить')
else writeln (‘Не підходить')
end.
Складена умова
Складена умова – це умова, яка складається з декількох
простих умов (відношень), зв’язаних з допомогою
логічних операцій:
• not – НІ (заперечення, інверсія)
• and – І (логічне множення, кон'юнкція,
одночасне виконання умов)
• or – АБО (логічне додавання, диз'юнкція,
виконання хоча б одної з умов)
• xor – виключаюче АБО (виконання тільки одної з
двох умов, але не обох)
Прості умови (відношення)
<
<=
>
дорівнює
>=
=
не дорівнює
<>
Складена умова
Порядок виконання
• вирази в дужках
• not
• and
• or, xor
• <, <=, >, >=, =, <>
Особливості – кожна з простих умов обов'язково
береться в дужки.
Приклад
4
1
6
2
5
3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
Складена умова
Істинне чи хибне при a := 2; b := 3; c := 4;
True
not (a > b)
True
(a < b) and (b < c)
True
not (a >= b) or (c = d)
True
(a < c) or (b < c) and (b < a)
(a < b) xor not (b > c)
FALSE
Для яких значень x істинні умови:
(x
(x
(x
(x
(x
(x
(x
(x
<
<
>
>
<
<
>
>
6)
6)
6)
6)
6)
6)
6)
6)
and (x < 10)
and (x > 10)
and (x < 10)
and (x > 10)
or (x < 10)
or (x > 10)
or (x < 10)
or (x > 10)
(-, 6)

(6, 10)
(10, )
(-, 10)
(-, 6)  (10,)
(-, )
(6, )
x<6
x > 10
x < 10
x>6
Завдання
"4": Ввести номер місяця і вивести назву пори року.
Приклад:
Ввести номер місяця:
4
весна
"5": Ввести вік людини (від 1 до 150 років) и вивести
його разом з наступним слово “рік”, “роки" або
“років".
Приклад:
Ввести вік:
24
Вам 24 роки
Ввести вік:
57
Вам 57 років
Програмування на
мові Паскаль
Тема 4. Цикли
Цикли
Цикл – це багатократне виконання однакової
послідовності дій.
• цикл з відомою кількістю кроків
• цикл з невідомою кількістю кроків (цикл з умовою)
Задача. Вивести на екран квадрати і куби цілих чисел від
1 до 8 (від a до b).
Особливості: однакові дії виконуються 8 раз.
?
Чи можна розв’язати відомими методами?
Алгоритм
початок
задати початкове значення
змінної циклу
i := 1;
перевірити, чи все виконали
i <= 8?
так
i2 := i * i;
i3 := i2 * i;
ні
кінець
обчислити квадрат і куб
вивести результат
i, i2, i3
перейти до
наступного i
i := i + 1;
Алгоритм (з блоком "цикл")
блок "цикл"
початок
i := 1,8
кінець
i2 := i * i;
i3 := i2 * i;
тіло циклу
i, i2, i3
Програма
program qq;
var i, i2, i3: integer;
початкове значення
begin
змінна циклу
кінцеве значення
for i:=1 to 8 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
end.
Цикл з зменшенням змінної
Задача. Вивести на екран квадрати і куби цілих чисел від
8 до 1 (в зворотному порядку).
Особливості: змінна циклу повинна зменшуватися.
Розв’язання:
...
for i:=8 downto 1 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
...
Цикл з змінною
Збільшення змінної на 1:
for <змінна> := <початкове значення> to
<кінцеве значення> do begin
{тіло циклу}
end;
Зменшення змінної на 1:
for <змінна> := <початкове значення>
downto
<кінцеве значення> do begin
{тіло циклу}
end;
Цикл з змінною
Особливості:
• змінна повинна бути тільки цілою (integer)
• крок зміни змінної циклу завжди рівний 1 (to) або -1
(downto)
• якщо в тілі циклу тільки один оператор, слова
begin і end можна не писати:
for i:=1 to 8 do
writeln(‘Привіт');
• якщо кінцеве значення менше початкового, цикл (to)
не виконується ні разу (перевірка умови в початку
циклу, цикл з передумовою)
Цикл з змінною
Особливості:
• в тілі циклу не дозволяється змінювати змінну циклу
(чому?)
• при зміні початкового і кінцевого значення всередині
циклу кількість кроків не змінюється:
n := 8;
for i:=1 to n do begin
writeln('Привіт');
n := n + 1;
end;
немає
зациклювання
Цикл з змінною
Особливості:
• після виконання циклу в багатьох системах
встановлюється перше значення змінної циклу, при
якому порушується умова:
for i:=1 to 8 do
writeln('Привіт');
writeln('i=', i);
for i:=8 downto 1 do
writeln('Привіт');
writeln('i=', i);
i=9
i=0
Скільки разів виконається цикл?
a := 1;
for i:=1 to 3 do a := a+1;
a= 4
a := 1;
for i:=3 to 1 do a := a+1;
a= 1
a := 1;
for i:=1 downto 3 do a := a+1;
a= 1
a := 1;
for i:=3 downto 1 do a := a+1;
a= 4
Як змінюється крок?
Задача. Вивести на екран квадрати і куби непарних цілих
чисел від 1 до 9.
Особливості: змінна циклу повинна збільшуватися на 2.
Проблема: в Паскалі крок може бути 1 або -1.
Розв’язання:
...
for i:=1 to 9 do begin
if i mod
???2 = 1 then begin
i2 := i*i;
виконується
тільки для
i3 := i2*i;
непарних i
writeln(i:4, i2:4, i3:4);
end;
end;
Що погано?
...
?
Як змінюється крок? – II
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
від 1 до 5. Початкове значення i дорівнює 1, з кожним
кроком циклу i збільшується на 2.
Розв’язання:
...
i???
:= 1;
for k:=1 to 5 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
i???
:= i + 2;
end;
...
Як змінюється крок? – III
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
від 1 до 5. Знаючи k, потрібно розрахувати i.
k
1
2
3
4
5
i
1
3
5
7
9
Розв’язання:
...
for k:=1 to 5 do begin
i ???
:= 2*k – 1;
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
...
i = 2k-1
Завдання
"4": Ввести a і b і вивести квадрати і куби чисел від a до b.
Приклад:
Введіть границі інтервалу:
4 6
4 16
64
5 25 125
6 36 216
"5": Вивести квадрати і куби 10 чисел наступної
послідовності: 1, 2, 4, 7, 11, 16, …
Приклад:
1
1
1
2
4
8
4
16
64
...
46 2116 97336
Програмування на
мові Паскаль
Тема 5. Цикли з умовою
Цикл з невідомою кількістю кроків
Приклад: Відрізати поліно від колоди. Скільки разів потрібно
зробити рух пилкою?
Задача: Ввести ціле число (<2000000) і визначити кількість
цифр у ньому.
Ідея розв’язання: Відрізаємо послідовно останню цифру,
збільшуємо лічильник.
n
count
123
0
12
1
1
2
0
3
Проблема: Невідомо, скільки кроків потрібно зробити.
Розв’язання: Потрібно зупинитися, коли n = 0, тобто потрібно
робити “поки n <> 0".
Алгоритм
початок
ввести n
обнулити лічильник цифр
count := 0;
виконувати
"поки n <> 0"
n <> 0?
ні
так
count := count + 1;
n := n div 10;
count
кінець
Програма
program qq;
n1: integer;
var n, count:, integer;
begin
writeln(‘Ввести ціле число');
read(n); n1 := n;
count := 0;
виконувати
"поки n <> 0"
while n <> 0 do begin
count := count + 1;
n := n div 10;
end;
writeln('В числі ', n1,
n, ' знайшли ',
count, ' цифр');
Що погано?
end.
?
Цикл с умовою
while <умова> do begin
{тіло циклу}
end;
Особливості:
• можна використовувати складені умови:
while (a<b) and (b<c) do begin
{тіло циклу}
end;
• якщо в тілі циклу тільки один оператор, слова
begin і end можна не писати:
while a < b do
a := a + 1;
Цикл з умовою
Особливості:
• умова перевіряється кожен раз при вході в цикл
• якщо умова на вході в цикл хибна, цикл не
виконується жодного разу
a := 4; b := 6;
while a > b do
a := a – b;
• якщо умова ніколи не стане хибною, програма
зациклиться
a := 4; b := 6;
while a < b do
d := a + b;
Скільки разів виконується цикл?
a := 4; b := 6;
while a < b do a := a + 1;
2 рази
a=6
a := 4; b := 6;
while a < b do a := a + b;
1 раз
a = 10
a := 4; b := 6;
while a > b do a := a + 1;
0 разів
a=4
a := 4; b := 6;
while a < b do b := a - b;
1 раз
b = -2
a := 4; b := 6;
while a < b do a := a - 1;
зациклювання
Заміна for на while і навпаки
for i:=1 to 10 do begin
{тіло циклу}
end;
for i:=a downto b do
begin
{тіло циклу}
end;
i := 1;
while i <= 10 do begin
{тіло циклу}
i := i + 1;
end;
i := a;
while i >= b do begin
{тіло циклу}
i := i - 1;
end;
Заміна циклу for на while можлива завжди.
Заміна while на for можлива тільки тоді, коли можна
наперед розрахувати кількість кроків циклу.
Завдання
"4": Ввести ціле число і знайти суму його цифр.
Приклад:
Ввести ціле число:
1234
Сума цифр числа 1234 рівна 10.
"5": Ввести ціле число і визначити, чи правда, що в
його записі є дві однакові цифри.
Приклад:
Ввести ціле число:
Ввести ціле число:
1234
1224
Ні.
Так.
Послідовності
Приклади:
• 1, 2, 3, 4, 5, …
an = n
a1 = 1, an+1 = an + n
• 1, 2, 4, 7, 11, 16, …
• 1, 2, 4, 8, 16, 32, …
1 1 3 1 5
, , , ,
, ...
•
2 2 8 4 32
bn
an 
cn
a1 = 1, an+1 = an+1
an = 2n-1
a1 = 1, an+1 = 2an
1 2 3 4 5
, , , ,
, ...
2 4 8 16 32
b1 = 1, bn+1 = bn+1
c1 = 2, cn+1 = 2cn
Послідовності
Задача: знайти суму всіх елементів послідовності,
1 2
3
4
5
1,  ,
,  ,
,  , ...
2 4
8 16
32
які по модулю більші 0,001:
1 2 3 4 5
S  1   
  ...
2 4 8 16 32
Елемент послідовності (починаючи з №2):
b
a z
c
n
1
2
3
4
5
...
b
1
2
3
4
5
...
c
2
4
8
16
32
...
z
-1
1
-1
1
-1
...
b := b+1;
c := 2*c;
z := -z;
Алгоритм
початок
початкове
значення
S := 0; b := 1;
c := 2; z := -1;
a := 1;
|a| > 0.001?
перший елемент
ні
так
новий елемент
зміни
S
S := S + a;
кінець
a := z*b/c;
b := b + 1;
c := 2*c; z := -z;
?
Перестановка?
Програма
program qq;
початкове
значення
var b, c, z: integer;
S, a: real;
begin
S := 0; z := -1;
b := 1; c := 2; a := 1;
while abs(a) > 0.001 do begin
збільшення
S := S + a;
суми
a := z * b / c;
z := - z;
розрахунок елемента
b := b + 1;
послідовності
c := c * 2;
end;
перехід до
наступного
writeln('S =', S:10:3);
доданка
end.
Завдання
"4": Знайти суму елементів послідовності з
точністю 0,001:
2
4
6
8
S  1



 ...
3  3 5  9 7  27 9  81
Відповідь:
S = 1.157
"5": Знайти суму елементів послідовності з
точністю 0,001:
2
4
6
8
10
S  1




 ...
2  3 3  9 5  27 8  81 13  243
Відповідь:
S = 1.220
Цикл з післяумовою
Задача: Ввести ціле додатне число (<2000000) і
визначити кількість цифр в ньому.
Проблема: Як не дати ввести від'ємне число або нуль?
Розв’язання: Якщо вводиться неправильне число,
повернутися назад до введення даних (цикл!).
Особливості: Один раз тіло циклу потрібно виконати в
будь-якому випадку => перевірку умови циклу потрібно
виконувати в кінці циклу (цикл с післяумовою).
Цикл с післяумовою – це цикл, в якому перевірка умови
виконується в кінці циклу.
Цикл з післяумовою: алгоритм
початок
ввести n
тіло циклу
ні
n > 0?
умова ВИХОДУ
так
основний
алгоритм
кінець
блок "типовий
процес"
Програма
program qq;
var n: integer;
begin
repeat
writeln(‘Ввести додатне число');
read(n);
умова ВИХОДУ
until n > 0;
... { основний алгоритм }
end.
Особливості:
• тіло циклу завжди виконується хоча б один раз
• після слова until ("до тих пір, поки не…")
ставиться умова ВИХОДУ із циклу
Скільки разів виконується цикл?
a := 4; b := 6;
repeat a := a + 1; until a > b;
3 рази
a=7
a := 4; b := 6;
repeat a := a + b; until a > b;
1 раз
a = 10
a := 4; b := 6;
repeat a := a + b; until a < b;
зациклення
a := 4; b := 6;
repeat b := a - b; until a < b;
2 рази
b=6
a := 4; b := 6;
repeat a := a + 2; until a < b;
зациклення
Завдання (з захистом від неправильного введення)
"4": Ввести натуральне число і визначити, чи правда що
сума його цифр дорівнює 10.
Приклад:
Ввести число >= 0:
Введіть число >= 0:
-234
1233
Потрібно додатне число. Ні
Ввести число >= 0:
1234
Так
"5": Ввести натуральне число і визначити, які цифри
зустрічаються декілька разів.
Приклад:
Введіть число >= 0:
Введіть число >= 0:
2323
1234
Повторяються: 2, 3
Немає повторів.
Програмування
на мові Паскаль
Тема 6. Оператор вибору
Оператор вибору
Задача: Ввести номер місяця і вивести кількість
днів в цьому місяці.
Розв’язання: Кількість днів у місяцях:
28 днів – 2 (лютий)
30 днів – 4 (квітень), 6 (червень), 9 (вересень),
11 (листопад)
31 день – 1 (січень), 3 (березень), 5 (травень),
7 (липень), 8 (серпень), 10 (жовтень),
12 (грудень)
Особливості: Вибір не з двох, а з декількох варіантів в
залежності від номера місяця.
?
Чи можна розв’язати відомими методами?
Алгоритм
початок
ввести M
M = 1?
ні
M = 2?
так
оператор вибору
D := 31;
так
D := 28;
ні
M = 12?
ні
жоден з
варіантів
не підійшов
помилка
кінець
так
D := 31;
вивести D
Програма
program qq;
var M, D: integer;
begin
writeln(‘Ввести номер місяця:');
read ( M );
case M of
2:
begin D := 28; end;
4,6,9,11: begin D := 30; end;
1,3,5,7,8,10,12: D := 31;
else
D := -1;
end;
жоден варіант не
підійшов
if D > 0 then
writeln(‘В цьому місяці ', D, ' днів.')
else
writeln(‘Неправильний номер місяця');
end.
Оператор вибору
Особливості:
• після case може бути ім’я змінної або арифметичний
вираз цілого типу (integer)
case i+3 of
1: begin a := b; end;
2: begin a := c; end;
end;
або символьного типу (char)
var c: char;
...
case c of
'а': writeln('Антилопа');
'б': writeln('Борсук');
else writeln('Не знаю');
end;
Оператор вибору
Особливості:
• якщо потрібно виконати тільки один оператор,
слова begin і end можна не писати
case i+3 of
1: a := b;
2: a := c;
end;
• не можна ставити два однакових значення
case i+3 of
1: a := b;
1: a := c;
end;
Оператор вибору
Особливості:
• значення, при яких виконуються однакові дії, можна
групувати
перечислення
діапазон
суміш
case i of
1:
a := b;
2,4,6:
a := c;
10..15:
a := d;
20,21,25..30: a := e;
else writeln(‘Помилка');
end;
Що неправильно?
case a of
2: begin a := b;
4: a := c;
end;
case a of
2: a := b ;
4: a := c
end;
case a of
2..5: a := b;
4: a := c;
end;
case a of
0..2: a := b;
6..3:
3..6: a := c;
end;
case a+c/2 of
2: a := b;
4: a := c;
end;
begin
case a of
2: a := b; d := 0; end;
4: a := c;
end;
Завдання (з захистом від неправильного введення)
"4": Ввести номер місяця і вивести кількість днів в ньому, а
також кількість помилок при введенні.
Приклад:
Введіть номер місяця:
-2
Введіть номер місяця:
11
В цьому місяці 30 днів.
Ви вводили неправильно 1
Введіть номер місяця:
2
В цьому місяці 28 днів.
Ви вводили неправильно 0 раз.
раз.
"5": Ввести номер місяця і номер дня, вивести кількість
днів, які залишилися до Нового року.
Приклад:
Ввести номер місяця:
12
Ввести день:
25
До Нового року залишилося 6 днів.
Програмування на
мові Паскаль
Тема 7. Графіка
Система координат
X
(0,0)
y
x
Y
(x,y)
Керування кольором
Колір і товщина ліній, колір точок:
Pen ( 1, 255, 0, 0 );
товщина
лінії
R(red)
0..255
G(green)
B(blue)
0..255
0..255
Колір і стиль заливки:
Brush ( 1, 0, 255, 0 );
0 – виключити
1 – включити
R
G
B
Колір тексту:
TextColor ( 0, 0, 255 );
R
G
B
Точки, відрізки і ламані
(x, y)
Pen (1, 0, 0, 255);
Point (x, y);
(x1, y1)
(x2, y2)
(x1, y1)
(x5, y5)
(x2, y2)
(x3, y3)
(x4, y4)
Pen (1, 0, 255, 0);
Line (x1, y1, x2, y2);
Pen (1,
MoveTo
LineTo
LineTo
LineTo
LineTo
255,
(x1,
(x2,
(x3,
(x4,
(x5,
0, 0);
y1);
y2);
y3);
y4);
y5);
Фігури з заливкою
(x1, y1)
(x2, y2)
Pen (1, 0, 0, 255);
Brush (1, 255, 255, 0);
Rectangle (x1, y1, x2, y2);
(x1, y1)
Pen (1, 255, 0, 0);
Brush (1, 0, 255, 0);
Ellipse (x1, y1, x2, y2);
(x2, y2)
(x, y)
?
Як відмінити заливку?
Brush (1, 100, 200, 255);
Fill (x, y);
Текст
TextColor (0, 0, 255);
Brush (1, 255, 255, 0);
Font (20, 30, 600);
(x, y)
30о
розмір
10 пікселів
кут
повороту
насиченість:
400 – нормальний
600 – жирний
MoveTo (x, y);
writeln ('Привіт!');
Приклад
program qq;
begin
Pen(2, 255, 0, 255);
(200, 50)
Brush(1, 0, 0, 255);
(100, 100)
Rectangle(100, 100, 300, 200);
MoveTo(100, 100);
LineTo(200, 50);
LineTo(300, 100);
Brush(1, 255, 255, 0);
Fill(200, 75);
(300, 200)
Pen(2, 255, 255, 255);
Brush(1, 0, 255, 0);
Ellipse(150, 100, 250, 200);
end.
Завдання
"4": "Жабка"
"5": "Корона"
Штриховка
N ліній (N=5)
(x1, y1)
h
(x2, y2)
h
x2  x1
N 1
Rectangle (x1,
Line( x1+h,
Line( x1+2*h,
Line( x1+3*h,
...
x
y1,
y1,
y1,
y1,
x2, y2);
x1+h,
y2);
x1+2*h, y2);
x1+3*h, y2);
x
h := (x2 – x1) / (N + 1);
var x, h: real;
Rectangle (x1, y1, x2, y2);
x := x1 + h;
заокруглення до
for i:=1 to N do begin
найближчого цілого
Line( round(x), y1, round(x), y2);
x := x + h;
end;
Як міняти колір?
(x1, y1) x
сірий: R = G = B
(x-1, y1+1)
Brush ( 1, c, c, c );
Fill ( ???, ??? );
Крок зміни c:
(x2, y2)
hc := 255 div (N + 1);
c := 0;
for i:=1 to N+1 do begin
Line (round(x), y1, round(x), y2);
Brush (1, c, c, c);
Fill (round(x)-1, y1+1);
x := x + h; c := c + hc;
end;
255
hc 
N 1
var c, hc: integer;
Штриховка
a
(x1, y1)
(x2, y2)
(x3+a, y1)
(x3, y2)
h
a  x2  x1
x3  x2
h
N 1
Line( x1+h,
y1, x1+h-a,
y2);
Line( x1+2*h, y1, x1+2*h-a, y2);
Line( x1+3*h, y1, x1+3*h-a, y2);
...
x
x-a
h := (x3 – x2) / (N + 1);
a := x2 – x1;
x := x1 + h;
for i:=1 to N do begin
Line( round(x), y1, round(x-a), y2);
x := x + h;
end;
Штриховка
hx 
(x1, y1)
hx
hy
(x2, y2)
x2  x1
N 1
hy 
y2  y1
N 1
Line( x1, y1+hy,
x1+hx,
y1+hy) ;
Line( x1, y1+2*hy, x1+2*hx, y1+2*hy);
Line( x1, y1+3*hy, x1+3*hx, y1+3*hy);
...
y
x
y
hx := (x2 – x1) / (N + 1);
hy := (y2 – y1) / (N + 1);
x := x1 + hx; y := y1 + hy;
for i:=1 to N do begin
Line( x1, round(y), round(x), round(y));
x := x + hx; y := y + hy;
end;
Завдання
"4": Ввести з клавіатури кількість ліній штриховки і
побудувати фігуру, заливши всі області різним
кольором.
"5": Ввести з клавіатури кількість кіл і побудувати фігуру,
заливши всі області різними кольорами.
Програмування на
мові Паскаль
Тема 8. Графіки функцій
Побудова графіків функцій
Задача: побудувати графік функції y = 3 sin(x) на
інтервалі від 0 до 2π.
Аналіз:
максимальне значення ymax = 3 при x = π/2
мінімальне значення ymin = -3 при x = 3π/2
Проблема: функція задана в математичній системі
координат, будувати потрібно на екрані, вказуючи
координати в пікселях.
Перетворення координат
Математична
система координат
Екранна система
координат (пікселі)
Y
(0,0)
x
(0,0)
(x,y)
y
b
X
k – масштаб (довжина
зображення одиничного
відрізка на екрані)
a
xе
yе
(xе,yе)
xе = a + kx
yе = b - ky
Програма
на екрані
цикл
побудови
графіка
program qq;
2π
const a = 50; b = 200; k = 50;
xmin = 0; xmax = 6.2832;
var x, y, h: real;
h – крок зміни x
xe, ye, w: integer;
w – довжина осі ОХ в пікселях
begin
w := round((xmax - xmin)*k);
Line(a-10, b, a+w, b);
осі координат
Line(a, 0, a, 2*b);
x := xmin; h := 0.05;
while x <= xmax do begin
y := 3*sin(x);
xe := a + round(k*x);
ye := b - round(k*y);
Point (xe, ye);
x := x + h;
end;
end.
Що погано?
?
Як з’єднати точки?
Алгоритм:
Програма:
Якщо перша точка
перейти в точку (xе,yе)
інакше
відрізок в точку (xе,yе)
вибір
варіанта
дії
логічна змінна
var first: boolean;
...
початкове значення
begin
...
first := True;
while x <= xmax do begin
...
if first then begin
MoveTo(xe, ye);
first := False;
end
else LineTo(xe, ye);
...
end;
end.
Завдання
"4": Побудувати графік
функції y = x2 на інтервалі
[-3,3].
"5": Побудувати графік
функції (еліпс)
2
2
x
y

1
16 9
Програмування на
мові Паскаль
Тема 9. Процедури
Процедури
Задача: Побудувати фігуру:
?
Чи можна розв’язати відомими методами?
Особливості: Три схожі фігури.
подібності: розміри, кут повороту
відмінності: координати, колір
?
Скільки координат потрібно задати?
Процедури
Процедура – це допоміжний алгоритм, який призначений
для виконання деяких дій.
Примітка:
• виконання однакових дій в різних місцях програми
• розбивка програми (або іншої процедури) на
підзадачі для кращого сприймання
Задача
Підзадача1
1.1
1.2
1.3
Підзадача2
2.1
2.2
Підзадача3
2.3
3.1
3.2
3.3
Процедури
Порядок розробки:
• виділити однакові або схожі дії (три фігури)
• знайти в них спільне (розміри, форма, кут повороту) і
відмінності (координати, колір)
• відмінності записати у вигляді невідомих змінних, вони будуть
параметрами процедури
заголовок
(x, y-60)
60
(x, y)
(x+100, y)
100
тіло процедури
параметри
procedure Tr( x, y, r, g, b: integer);
begin
MoveTo(x, y);
колір
LineTo(x, y-60);
LineTo(x+100, y);
координати
LineTo(x, y);
Brush(1, r, g, b);
Fill(x+20, y-20);
end;
Програма
формальні параметри
60
(100,100)
100
виклик
процедури
program qq;
procedure Tr( x, y, r, g, b: integer);
begin
...
end;
begin
Pen(1, 255, 0, 255);
Tr(100, 100, 0, 0, 255);
процедура
Tr(200, 100, 0, 255, 0);
Tr(200, 160, 255, 0, 0);
end.
фактичні параметри
Процедури
Особливості:
• всі процедури розміщені вище основної програми
• в заголовку процедури перераховуються
формальні параметри, вони позначаються іменами,
оскільки можуть змінюватися
procedure Tr( x, y, r, g, b: integer);
• при виклику процедури в дужках вказуються
фактичні параметри (числа або арифметичні
вирази) в тому ж порядку
Tr (200, 100, 0, 255, 0);
x
y
r
g
b
Процедури
Особливості:
• для кожного формального параметра після двокрапки
вказується його тип
procedure A (x: real; y: integer; z: real);
• якщо однотипні параметри стоять поряд, їх
перераховують через кому
procedure A (x, z: real; y, k, l: integer);
• всередині процедури параметри використовуються так
само, як і змінні
Процедури
Особливості:
• в процедурі можна оголошувати додаткові локальні
змінні, інші процедури не мають до них доступу
program qq;
procedure A(x, y: integer);
var a, b: real;
begin
a := (x + y)/6;
...
end;
begin
...
end.
локальні
змінні
Параметри-змінні
Задача: скласти процедуру, яка міняє місцями значення
двох змінних.
Особливості:
потрібно, щоб зміни зроблені в процедурі, стали
відомі програмі яка викликає
program qq;
var x, y: integer;
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
begin
x := 1; y := 2;
Exchange ( x, y );
writeln ( ’x = ’, x, ’ y = ’, y );
end;
ця процедура
працює з
копіями
параметрів
x = 1 y = 2
Параметри-змінні
параметри можуть змінюватися
procedure Exchange ( var
var c: integer;
begin
c := a; a := b; b := c;
end;
a, b: integer );
Примітка:
таким чином процедура (і функція) можуть повертати
декілька значень,
Заборонені варіанти виклику
Exchange ( 2, 3 );
{ числа }
Exchange ( x+z, y+2 ); { вирази }
Задания
"4": Використовуючи процедуру, побудувати фігуру.
"5": Використовуючи процедуру, побудувати фігуру.
Програмування на
мові Паскаль
Тема 10. Рекурсія
Рекурсивні об’єкти
Казка про попа і собаку:
Приклади:
У попа була собака, він її любив.
Вона з’їла кусок м’яса, він її убив.
В ямку закопав, надпис написав:
Казка про попа і собаку
Малюнок з рекурсією:
Факторіал:
1,
якщо N  1,

N!  
 N  ( N  1)!, якщо N  1.
1! 1, 2! 2 1! 2 1, 3! 3  2! 3  2 1
4! 4  3! 4  3  2 1
N! N  ( N  1)  2 1
Рекурсивний об’єкт – це об’єкт, визначений через один
або декілька таких же об’єктів.
Дерево Піфагора
Дерево Піфагора з N рівнів – це стовбур і відходячі від нього
симетрично два дерева Піфагора з N-1 рівнем, такі що довжина
їх стовбурів в 2 рази менша і кут між ними рівний 90o.
6 рівнів:
?
Як довести, що це рекурсивна фігура?
Дерево Піфагора
Особливості:
коли кількість рівнів, що
залишилися стане рівним
• коли зупинитися?
нулю!
• дерева мають різний нахил
x1 = x0 + L·cos(α)
α+45o
α-45o
(x1, y1)
нахил "дочірніх" дерев
L
α
(x0, y0)
y1 = y0 – L·sin(α)
α + π/4
α – π/4
Процедура
кут α
довжина стовбура
procedure Pifagor(x0, y0, a, L: real;
N: integer);
const k = 0.6;
{ зміна довжини }
var x1, y1: real; { локальні змінні }
begin
завершити, якщо N=0
if N > 0 then begin
x1 := x0 + L*cos(a);
y1 := y0 - L*sin(a);
рекурсивні
Line (round(x0), round(y0),
виклики
round(x1), round(y1));
Pifagor (x1, y1, a+pi/4, L*k, N-1);
Pifagor (x1, y1, a-pi/4, L*k, N-1);
end;
end;
Рекурсивною називається процедура,
викликаюча сама себе.
Програма
program qq;
procedure Pifagor(x0, y0, a, L: real;
N: integer);
...
довжина стовбура
кут α
end;
begin
Pifagor (250, 400, pi/2, 150, 8);
end;
x0
?
y0
кількість рівнів
Як нахилити дерево вправо на 30o?
Pifagor (250, 400, 2*pi/3, 150, 8);
Задания
"4": Використовуючи рекурсивну процедуру, побудувати фігуру:
"5": Використовуючи рекурсивну процедуру, побудувати фігуру :
Програмування на
мові Паскаль
Тема 11. Анімація
Анімація
Анімація (англ. animation) – оживлення
зображення на екрані.
Задача: всередині синього квадрата 400 на 400
пікселів зліва направо рухається жовтий
квадрат 20 на 20 пікселів. Програма
зупиняється, якщо натиснута клавіша Esc
або квадрат дійшов до границі синьої
області.
Проблема: як зобразити переміщення об’єкта на екрані?
Прив’язка: розміщення об’єкта задається координатами (x,y)
Принцип анімації:
1. малюємо об’єкт в точці (x,y)
2. затримка на декілька мілісекунд
3. затираємо об’єкт
4. змінюємо координати (x,y)
5. переходимо до кроку 1
Як "зловити" натискуванням клавіші?
Подія – це зміна в стані якого-небудь об’єкта або дія
користувача (натиснення на клавішу, клік мишкою).
IsEvent – логічна функція, яка визначає, чи були які-небудь
дії користувача.
Event – процедура, яка визначає, які саме дії відбулися.
if IsEvent then begin
var k, x, y: integer;
Event(k, x, y);
if k = 1 then
writeln('Клавіша з кодом ', x)
else { k = 2 }
writeln('Мишка: x=', x, ' y=', y);
end;
Як вийти з циклу при натисканні Esc?
True, якщо потрібно зупинитися
program qq;
var stop: boolean;
запуск циклу
k,code,i: integer;
begin
stop := False;
якщо що-небудь відбулося...
repeat
if IsEvent then begin
що відбулося?
Event(k, code, i);
if (k = 1) and (code = 27) then
stop := True;
end;
якщо натиснута клавіша
...
з кодом 27 (Esc), то стоп
until stop;
end;
Процедура (малювання і стирання)
Ідея
• одна процедура малює і стирає
• стерти = намалювати кольором фону
• границю квадрата відключити (в
основній програмі)
(x, y)
(x+20, y+20)
малювати (True) або ні (False)?
procedure Draw(x, y: integer; flag: boolean);
begin
малюємо: колір пензлика – жовтий
if flag then
Brush(1, 255, 255, 0)
стираємо: колір пензлика – синій
else
Brush(1, 0, 0, 255);
Rectangle(x, y, x+20, y+20);
end;
тільки заливка!
Повна програма
program qq;
var x, y, k, code, i: integer;
stop: boolean;
процедура
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
begin
синій фон
Brush(1, 0, 0, 255);
Rectangle(10, 10, 400, 400);
відключити границю
Pen(0, 0, 0, 255);
початкова
x := 10; y := 200; stop := false;
умова
repeat
if IsEvent then begin
вихід по
...
клавіші Esc
end;
Draw(x, y, True);
чекаємо 10 мс
Delay(10);
Draw(x, y, False);
вихід при
x := x + 1;
досягненні границі
if x >= 400-20 then stop := true;
until stop;
end.
Завдання
"4": Два квадрати рухаються
в протилежних напрямках:
"5": Два квадрати рухаються
в протилежних напрямках
і відбиваються від стінок
синього квадрата:
Керування клавішами
Задача: жовтий квадрат всередині синього квадрата керується
клавішами-стрілками. Коди клавіш:
вліво – 37
вверх – 38
Esc – 27
вправо – 39
вниз – 40
Проблема: як змінити напрям руху?
Розв’язання:
IsEvent
if {була
подія} then begin
if
{натиснута
клавіша}
then begin
Event
( k, code,
i);
if{отримати
k = 1 then
кодbegin
клавіші - code}
if code
37 then x := x – 1;
case
code= of
if37:
code
= 38
y :=y y:=– y1;– 1;
x :=
x –then
1; 38:
if39:
code
= 39
x :=y x:=+ y1;+ 1;
x :=
x +then
1; 40:
stop
:= then
True;y := y + 1;
if27:
code
= 40
end;
if code = 27 then stop := True;
end;
end;
якщо було
натиснуто на
клавішу, …
Програма
program qq;
процедура
var x, y, k, code, i: integer;
stop: boolean;
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
begin
основний цикл
...
repeat
Draw(x, y, True);
Delay(20);
Draw(x, y, False);
опрацювання
if IsEvent then begin
подій
...
end;
until stop;
end.
Що погано?
?
Як забрати блимання?
Проблема: навіть якщо не натиснута жодна клавіша,
квадрат перемальовується через кожні 20 мс
(блимання!)
Що бажається: не перемальовувати квадрат, якщо
не було ніяких подій
Розв’язання: намалювати квадрат і чекати подію
Нова проблема: як чекати подію?
Розв’язання нової проблеми: пустий цикл "поки не
трапилася подія, нічого не робити":
while not IsEvent do;
Програма
program qq;
var x, y, k, code, i: integer;
процедура
stop: boolean;
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
begin
малюємо квадрат
...
repeat
чекаємо подію
Draw(x, y, True);
while not IsEvent do;
тільки тепер стираємо
Draw(x, y, False);
Event(k, code, i);
...
until stop;
end.
?
Що можна покращити?
Завдання
"4": Квадрат рухається при
натисненні стрілок, проте
не може вийти за границі
синього квадрата:
"5": Квадрат неперервно
рухається, при натисненні
стрілок міняє напрям і
відбивається від стінок
синього квадрата:
Обертання
Задача: зобразити модель обертання Землі навколо
Сонця.
Проблема: рух по колу, як змінюються координати?
Розв’язання: використовувати в якості незалежної
змінної (змінювати в циклі) кут повороту α
(x, y)
L
x = x0 + L·cos(α)
α
(x0, y0)
y = y0 – L·sin(α)
Процедура
малювати (True) або ні (False)?
procedure Draw(x, y: integer; flag: boolean);
const r = 10;
радіус Землі
begin
малюємо: колір пензлика – голубий
if flag then
Brush(1, 100, 100, 255)
else
стираємо: колір пензлика – чорний
Brush(1, 0, 0, 0);
Ellipse(x-r, y-r, x+r, y+r);
end;
тільки заливка!
(x-r, y-r)
(x,y)
(x+r, y+r)
Константи і змінні
program qq;
const rSun = 60;
{ радіус Сонця}
L = 150;
{ радіус орбіти Землі }
x0 = 200;
{ координати центра Сонця}
y0 = 200;
var x, y,
{ координати Землі }
k, code, i: integer; { для Event }
a, ha: real;
{ кут повороту, крок }
stop: boolean; { признак зупинки програми }
procedure Draw(x, y: integer; flag: Boolean);
begin
...
end;
begin
...
end.
Основна програма
program qq;
залити фон чорним
...
begin
Brush(1, 0, 0, 0); Fill(1,1);
малюємо Сонце
Brush(1, 255, 255, 0);
Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun);
a := 0; ha := 1*pi/180; { початковий кут, крок 1o за 100 мс}
stop := false;
Pen(0,0,0,0);
{ відключаємо контури }
repeat
x := round(x0 + L*cos(a));
нові координати
y := round(y0 - L*sin(a));
Draw(x, y, True);
чекаємо 100 мс
Delay(100);
Draw(x, y, False);
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := true;
end;
a := a + ha;
поворот на ha
until stop;
end.
Завдання
"4": Зобразити модель Сонця
з двома планетами, які
обертаються в
протилежних напрямках:
"5": Зобразити модель
системи Сонце-ЗемляМісяць:
Програмування на
мові Паскаль
Тема 12. Випадкові числа
Випадкові числа
Випадкові події: всюди…
• підкидання монети (“герб" або “копійка")
• падіння снігу
• броунівський рух
• перешкоди при телефонному зв’язку
• шум радіоефіру
Випадкові числа – це така послідовність чисел, для якої
неможливо передбачити наступне число, якщо навіть
відомі попередні.
Проблема: як одержати на комп’ютері?
Можливі розв’язання:
• використовувати зовнішнє джерело шумових перешкод
• з допомогою математичних перетворень
Псевдовипадкові числа
Псевдовипадкові числа – це така послідовність чисел, яка має
властивості випадкових чисел, проте кожне наступне число
обчислюється по заданій формулі.
Приклади:
1. Випадкові цілі числа [0,m) (лінійний конгруентний метод)
xn  (a  xn1  c) mod m
a, c, m – цілі числа
xn  (16807 xn1  12345) mod 1073741823
230-1
просте число
2. Випадкові дійсні числа [0,1]

xn  (  xn1 )k
Література:

наприклад, k = 5
дробова частина числа
Д. Кнут, Мистецтво програмування для ЕОМ, т.2.
Розподіл випадкових чисел
Модель: сніжинки падають на відрізок [a,b]
розподіл
рівномірний
a
?
нерівномірний
b
a
b
Скільки може бути різних розподілів ?
Розподіл випадкових чисел
Особливості:
• розподіл – це характеристика всієї послідовності, а не одного
числа
• рівномірний розподіл один, комп’ютерні датчики
(псевдо)випадкових чисел дають рівномірний розподіл
• нерівномірних – багато
• будь-яке нерівномірне можна отримати з допомогою
рівномірного
a
b
x1  x2
x
2
рівномірний розподіл
a
b
x1  x2    x12
x
12
рівномірний розподіл
Генератор випадкових чисел в Паскалі
Цілі числа в інтервалі [0,N]:
var x: integer;
...
x := random ( 100 );
{ інтервал [0,99] }
Дійсні числа в інтервалі [0,1]
var x: real;
...
x := random;
{ інтервал [0,1] }
Випадкові числа
Задача: заповнити прямокутник
400 на 300 пікселів рівномірно
точками випадкового кольору
Як отримати випадкові координати точки?
x := random ( 400 );
y := random ( 300 );
Як досягти рівномірності?
забезпечується автоматично при використанні
функції random
Як отримати випадковий колір?
Pen (1, random(256), random(256), random(256));
Point ( x, y );
Програма
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
випадкові координати
stop := False;
repeat
x := random(400);
випадковий колір
y := random(300);
Pen(1, random(256), random(256), random(256));
Point(x, y );
вихід по клавіші Esc
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := True;
end;
until stop;
end.
Завдання
"4": Ввести з клавіатури
координати кутів
прямокутника і заповнити
його точками випадкового
кольору.
(100,100)
(300,200)
"5": Заповнити трикутник
точками випадкового
кольору (рівномірно або
нерівномірно).
Підказка: візьміть
рівнобедрений трикутник з
кутом 45о.
Програмування на
мові Паскаль
Тема 13. Функції
Функції
Функція – це допоміжний алгоритм (підпрограма),
результатом роботи якої є деяке значення.
Приклади:
• обчислення sin x , cos x , x
• розрахунок значення по складених формулах
• відповідь на запитання (просте число або ні?)
Для чого?
• для обчислення однакових розрахунків в різних
місцях програми
• для створення загальнодоступних бібліотек функцій
?
В чому відмінність від процедури?
Функції
Задача: скласти функцію, яка обчислює більше з
двох значень, і навести приклад її використання
Функція:
формальні параметри
function Max (a, b: integer): integer;
begin
if a > b then Max := a
else
end.
Max := b;
це результат
функції
Функції
Особливості:
• заголовок починається словом function
function Max (a, b: integer): integer;
• формальні параметри описуються так само, як і для
процедур
function qq( a, b: integer; x: real ): real;
• можна використовувати параметри-змінні
function Max ( var a, b: integer): integer;
• в кінці заголовка через двокрапку вказується тип
результату
function Max (a, b: integer): integer ;
• функції розміщуються ВИЩЕ основної програми
Функції
Особливості:
• можна оголошувати і використовувати локальні змінні
function qq (a, b: integer): float;
var x, y: float;
begin
...
end;
• значення, яке є результатом, записується в змінну, ім’я якої
співпадає з назвою функції; оголошувати НЕ ПОТРІБНО:
function Max (a, b: integer): integer;
begin
...
Max := a;
end;
!
В Delphi:
Result := a;
Програма
program qq;
c
var a, b, max:
integer;
function Max (a, b: integer): integer;
begin
...
end;
begin
фактичні параметри
writeln(‘Введіть два числа');
read(a, b);
виклик функції
c := Max ( a, b );
max
c );
writeln(‘Найбільше число ', max
end.
!
Імена змінних, функцій і процедур
не повинні співпадати!
Логічні функції
Задача: скласти функцію, яка визначає, чи дійсно, що
задане число – просте.
Особливості:
• відповідь – логічне значення (True або False)
• результат функції можна використовувати як логічну
величину в умовах (if, while)
Алгоритм: рахуємо кількість дільників в інтервалі від 2 до
N-1, якщо воно не дорівнює нулю – число складене.
count := 0;
for i := 2 to N-1 do
if N mod i = 0 then
count := count + 1;
if count = 0 then
{ число N просте}
else { число N складене }
?
Як краще?
Логічні функції
program qq;
var N: integer;
результат – логічне значення
function Prime (N: integer): boolean;
var count, i: integer;
N
перебір тільки до
begin
i := 2; count := 0;
while i*i <= N do
if N mod i = 0 then count := count + 1;
i := i + 1;
end;
Prime := (count = 0);
end;
умова – це логічне значення
begin
writeln(‘Ввести ціле число');
read(N);
виклик функції
if Prime(N) then
writeln(N, ' – просте число')
else writeln(N, ' – складене число');
end.
Завдання
"4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і
навести приклад її використання.
Приклад:
Ввести число:
100
сума = 5050
"5": Скласти функцію, яка визначає, скільки зерен попросив
положити на N-ту клітку винахідник шахмат (на 1-шу – 1
зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …)
Приклад:
Ввести номер клітки:
28
На 28-ой клітці 134217728 зерен.
Завдання (варіант 2)
"4": Скласти функцію, яка визначає найбільший спільний
дільник двох натуральних чисел і навести приклад її
використання.
Приклад:
Ввести два числа:
14 21
НСД(14,21)=7
"5": Скласти функцію, яка обчислює синус як суму ряду (с
точністю 0.001)
x3 x5 x7
sin x  x     
3! 5! 7!
Приклад:
Ввести кут в градусах:
45
sin(45) = 0.707
x в радіанах!