Програмування на
мові Паскаль
Тема 1. Вступ
© К.Ю. Поляков
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Алгоритм
Властивості алгоритму
• дискретність: складається з окремих кроків
(команд)
• зрозумілість: повинен включати тільки команди
відомі для виконавця (які містяться в СКВ)
• визначеність: при однакових вхідних даних завжди
видає один і той самий результат
• скінченність: закінчується за скінчену кількість
кроків
• масовість: може застосовуватися багатократно при
різних вихідних даних
• коректність: видає правильне рішення при будь-
яких допустимих вихідних даних
Алгоритм – це чітко визначений план дій для
виконавця.
Програма
Програма – це
• алгоритм, записаний на будь-якій мові
програмування
• набір команд для комп’ютера
Команда – це опис дій, які повинен
виконати комп’ютер.
• звідки отримати вихідні дані?
• що потрібно з ними зробити?
Мови програмування
• Машинно-орієнтовані (низького рівня) – кожна
команда відповідає одній команді процесора
(асемблер)
• Мови високого рівня – наближені до реальної
(англійської) мови, легше сприймаються
людиною, не залежать від відповідного
комп’ютера
• для навчання: Бейсик, ЛОГО, Паскаль
• професійні: Сі, Фортран, Паскаль
• для задач штучного інтелекту: Пролог,
ЛИСП
• для Інтернету: JavaScript, Java, Perl, PHP,
ASP
Мова Паскаль
1970 – Ніклаус Вірт (Швейцарія)
• мова для навчання студентів
• розробка програм “зверху-вниз”
• різноманітні структури даних (масиви,
структури, множини)
Підзадача1 Підзадача2 Підзадача3
1.1 1.2 1.3 2.1 2.2 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;
var a, b: integer;
begin
a := 5;
b := a + 2;
a := (a + 2)*(b – 3);
end.
a
? 55
b
? 5+27
a
5 7*428
Оператор присвоєння
Загальна структура:
<ім’я змінної> := <вираз>;
Арифметичні вирази можуть містити
• константи
• імена змінних
• знаки арифметичних дій:
+ - * / 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;
)2)((
)(5 22
addc
badca
x



)(
)(35
cb
ab
dcac
z 


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 30
через Enter:
25
30
a25
b30
a25
b30
Оператор виведення
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
це виводить комп'ютер
це вводить користувач
Блок-схема лінійного алгоритму
початок
кінець
c := a + b;
ввести 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. Розгалуження
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Алгоритми розгалуження
Задача. Ввести два цілих числа і вивести на екран
більше з них.
Ідея розв’язання: потрібно вивести на екран перше
число, якщо воно більше другого, або друге, якщо воно
більше першого.
Особливості: дії виконавця залежать від деяких умов
(якщо … інакше …).
Алгоритми, в яких послідовність кроків залежить від
виконання деяких умов, називаються розгалуженими.
Варіант 1. Блок-схема
початок
max:= a;
ввести a,b
вивести max
a > b?
max:= b;
кінець
так ні повна форма
розгалуження
блок «логічний
вираз»
Якщо a = b??
Варіант 1. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
if a > b then begin
end
else begin
end;
writeln (‘Більше число ', max);
end.
max := a;
max := b;
повна форма
умовного
оператора
Умовний оператор
if <умова> then begin
{що робити, якщо умова правильна}
end
else begin
{що робити, якщо умова неправильна}
end;
Особливості:
• перед else НЕ ставиться крапка з комою
• друга частина (else …) може бути відсутня (неповна
форма)
• якщо в блоці один оператор, можна забрати слова
begin і end
Що неправильно?
if a > b then begin
a := b;
end
else
b := a;
end;
if a > b then begin
a := b;
else 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
else b > a begin
b := a;
end;
begin
end
begin
end
Варіант 2. Блок-схема
неповна форма
розгалуження
початок
max:= a;
ввести a,b
вивести max
max:= b;
кінець
так ні
b > a?
Варіант 2. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
max := a;
if b > a then
writeln (‘Більше число ', max);
end.
max := b;
неповна форма
умовного
оператора
Варіант 2Б. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
max := b;
if ??? then
???
writeln (‘Більше число ', max);
end.
max := a;
a > b
Що неправильно?
if a > b then begin
a := b;
else b := a;
if a > b then begin
a := b;
end;
else b := a;
if a > b then
else begin
b := a;
end;
if a > b then
a := b;
else b := a; end;
a := b
end
a := b if b >= a then
b := a;
Завдання
"4": Ввести три числа і знайти найбільше з них.
Приклад:
Ввести три числа:
4 15 9
Найбільше число 15
"5": Ввести п’ять чисел і знайти найбільше з них.
Приклад:
Ввести п’ять чисел:
4 15 9 56 4
Найбільше число 56
Програмування на
мові Паскаль
Тема 3. Складені умови
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Складені умови
Задача. Фірма набирає співробітників від 25 до 40 років
включно. Ввести вік людини і визначити, чи підходить
вона фірмі (вивести відповідь “підходить” або “не
підходить”).
Особливості: потрібно перевірити, виконання двох умов
одночасно.
Чи можна розв’язати відомими методами??
Варіант 1. Алгоритм
початок
ввести x
‘підходить'
кінець
так ні
x >= 25?
так ні
x <= 40?
‘не підходить' ‘не підходить'
Варіант 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;
not (a > b)
(a < b) and (b < c)
not (a >= b) or (c = d)
(a < c) or (b < c) and (b < a)
(a < b) xor not (b > c)
Для яких значень x істинні умови:
(x < 6) and (x < 10)
(x < 6) and (x > 10)
(x > 6) and (x < 10)
(x > 6) and (x > 10)
(x < 6) or (x < 10)
(x < 6) or (x > 10)
(x > 6) or (x < 10)
(x > 6) or (x > 10)
Складена умова
True
True
FALSE
(-, 6)

(6, 10)
(10, )
(-, 10)
(-, 6)  (10,)
(-, )
(6, )
x < 6
x > 10
x < 10
x > 6
True
True
Завдання
"4": Ввести номер місяця і вивести назву пори року.
Приклад:
Ввести номер місяця:
4
весна
"5": Ввести вік людини (від 1 до 150 років) и вивести
його разом з наступним слово “рік”, “роки" або
“років".
Приклад:
Ввести вік: Ввести вік:
24 57
Вам 24 роки Вам 57 років
Програмування на
мові Паскаль
Тема 4. Цикли
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Цикли
Цикл – це багатократне виконання однакової
послідовності дій.
• цикл з відомою кількістю кроків
• цикл з невідомою кількістю кроків (цикл з умовою)
Задача. Вивести на екран квадрати і куби цілих чисел від
1 до 8 (від a до b).
Особливості: однакові дії виконуються 8 раз.
Чи можна розв’язати відомими методами??
Алгоритм
початок
i, i2, i3
кінець
ні
так
i <= 8?
i := 1;
i := i + 1;
i2 := i * i;
i3 := i2 * i;
задати початкове значення
змінної циклу
перевірити, чи все виконали
обчислити квадрат і куб
вивести результат
перейти до
наступного i
Алгоритм (з блоком "цикл")
початок
i, i2, i3
кінець
i2 := i * i;
i3 := i2 * i;
i := 1,8
блок "цикл"
тіло циклу
Програма
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 1 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
...
downto
Цикл з змінною
for <змінна> := <початкове значення> to
<кінцеве значення> do begin
{тіло циклу}
end;
Збільшення змінної на 1:
for <змінна> := <початкове значення>
downto
<кінцеве значення> do begin
{тіло циклу}
end;
Зменшення змінної на 1:
Цикл з змінною
Особливості:
• змінна повинна бути тільки цілою (integer)
• крок зміни змінної циклу завжди рівний 1 (to) або -1
(downto)
• якщо в тілі циклу тільки один оператор, слова
begin і end можна не писати:
• якщо кінцеве значення менше початкового, цикл (to)
не виконується ні разу (перевірка умови в початку
циклу, цикл з передумовою)
for i:=1 to 8 do
writeln(‘Привіт');
Цикл з змінною
Особливості:
• в тілі циклу не дозволяється змінювати змінну циклу
(чому?)
• при зміні початкового і кінцевого значення всередині
циклу кількість кроків не змінюється:
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 ??? then begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
end;
...
i mod 2 = 1
виконується
тільки для
непарних i
Що погано??
Як змінюється крок? – II
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
від 1 до 5. Початкове значення i дорівнює 1, з кожним
кроком циклу i збільшується на 2.
Розв’язання:
...
???
for k:=1 to 5 do begin
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
???
end;
...
i := i + 2;
i := 1;
Як змінюється крок? – III
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
від 1 до 5. Знаючи k, потрібно розрахувати i.
Розв’язання:
...
for k:=1 to 5 do begin
???
i2 := i*i;
i3 := i2*i;
writeln(i:4, i2:4, i3:4);
end;
...
i := 2*k – 1;
k 1 2 3 4 5
i 1 3 5 7 9
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. Цикли з умовою
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Цикл з невідомою кількістю кроків
Приклад: Відрізати поліно від бревна. Скільки разів потрібно
зробити рух пилкою?
Задача: Ввести ціле число (<2000000) і визначити кількість
цифр у ньому.
Ідея розв’язання: Відрізаємо послідовно останню цифру,
збільшуємо лічильник.
Проблема: Невідомо, скільки кроків потрібно зробити.
Розв’язання: Потрібно зупинитися, коли n = 0, тобто потрібно
робити “поки n <> 0".
n count
123 0
12 1
1 2
0 3
Алгоритм
початок
count
кінець
ні
так
n <> 0?
count := 0;
count := count + 1;
n := n div 10;
обнулити лічильник цифр
ввести n
виконувати
"поки n <> 0"
Програма
program qq;
var n, count: integer;
begin
writeln(‘Ввести ціле число');
read(n);
count := 0;
while n <> 0 do begin
count := count + 1;
n := n div 10;
end;
writeln('В числі ', n, ' знайшли ',
count, ' цифр');
end.
, n1: integer;
n1 := n;
n1,
виконувати
"поки n <> 0"
Що погано??
Цикл с умовою
while <умова> do begin
{тіло циклу}
end;
Особливості:
• можна використовувати складені умови:
• якщо в тілі циклу тільки один оператор, слова
begin і end можна не писати:
while (a<b) and (b<c) do 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;
i := 1;
while i <= 10 do begin
{тіло циклу}
i := i + 1;
end;
for i:=a downto b do
begin
{тіло циклу}
end;
i := a;
while i >= b do begin
{тіло циклу}
i := i - 1;
end;
Заміна while на for можлива тільки тоді, коли можна
наперед розрахувати кількість кроків циклу.
Заміна циклу for на while можлива завжди.
Завдання
"4": Ввести ціле число і знайти суму його цифр.
Приклад:
Ввести ціле число:
1234
Сума цифр числа 1234 рівна 10.
"5": Ввести ціле число і визначити, чи правда, що в
його записі є дві однакові цифри.
Приклад:
Ввести ціле число: Ввести ціле число:
1234 1224
Ні. Так.
Послідовності
Приклади:
• 1, 2, 3, 4, 5, …
• 1, 2, 4, 7, 11, 16, …
• 1, 2, 4, 8, 16, 32, …
• ...,
32
5
,
4
1
,
8
3
,
2
1
,
2
1
...,
32
5
,
16
4
,
8
3
,
4
2
,
2
1
an = n a1 = 1, an+1 = an+1
a1 = 1, an+1 = an + n
an = 2n-1 a1 = 1, an+1 = 2an
b1 = 1, bn+1 = bn+1
c1 = 2, cn+1 = 2cnn
n
n
c
b
a 
Послідовності
Задача: знайти суму всіх елементів послідовності,
які по модулю більші 0,001:
...,
32
5
,
16
4
,
8
3
,
4
2
,
2
1
,1 
...
32
5
16
4
8
3
4
2
2
1
1 S
Елемент послідовності (починаючи з №2):
c
b
za 
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
кінець
ні
так
|a| > 0.001?
S := S + a;
S := 0; b := 1;
c := 2; z := -1;
a := 1;
початкове
значення
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:
Відповідь:
S = 1.157
"5": Знайти суму елементів послідовності з
точністю 0,001:
Відповідь:
S = 1.220
...
819
8
277
6
95
4
33
2
1 







S
...
24313
10
818
8
275
6
93
4
32
2
1 









S
Цикл з післяумовою
Задача: Ввести ціле додатне число (<2000000) і
визначити кількість цифр в ньому.
Проблема: Як не дати ввести від'ємне число або нуль?
Розв’язання: Якщо вводиться неправильне число,
повернутися назад до введення даних (цикл!).
Особливості: Один раз тіло циклу потрібно виконати в
будь-якому випадку => перевірку умови циклу потрібно
виконувати в кінці циклу (цикл с післяумовою).
Цикл с післяумовою – це цикл, в якому перевірка умови
виконується в кінці циклу.
Цикл з післяумовою: алгоритм
початок
кінець
так
ні
n > 0?
тіло циклу
умова ВИХОДУ
блок "типовий
процес"
ввести n
основний
алгоритм
Програма
program qq;
var n: integer;
begin
repeat
writeln(‘Ввести додатне число');
read(n);
until n > 0;
... { основний алгоритм }
end.
until n > 0;
умова ВИХОДУ
Особливості:
• тіло циклу завжди виконується хоча б один раз
• після слова 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. Оператор вибору
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Оператор вибору
Задача: Ввести номер місяця і вивести кількість
днів в цьому місяці.
Розв’язання: Кількість днів у місяцях:
28 днів – 2 (лютий)
30 днів – 4 (квітень), 6 (червень), 9 (вересень),
11 (листопад)
31 день – 1 (січень), 3 (березень), 5 (травень),
7 (липень), 8 (серпень), 10 (жовтень),
12 (грудень)
Особливості: Вибір не з двох, а з декількох варіантів в
залежності від номера місяця.
Чи можна розв’язати відомими методами??
Алгоритм
початок
кінець
оператор вибору
жоден з
варіантів
не підійшов
ввести M
так
ні
M = 1? D := 31;
ні
M = 2? 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)
або символьного типа (char)
case i+3 of
1: begin a := b; end;
2: begin a := c; end;
end;
var c: char;
...
case c of
'а': writeln('Антилопа');
'б': writeln('Борсук');
else writeln('Не знаю');
end;
Оператор вибору
Особливості:
• якщо потрібно виконати тільки один оператор,
слова begin і end можна не писати
• не можна ставити два однакових значення
case i+3 of
1: a := b;
1: a := c;
end;
case i+3 of
1: a := b;
2: 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: a := c;
end;
3..6:
case a+c/2 of
2: a := b;
4: a := c;
end;
case a of
2: a := b; d := 0;
4: a := c;
end;
begin
end;
Завдання (з захистом від неправильного введення)
"4": Ввести номер місяця і вивести кількість днів в ньому, а
також кількість помилок при введенні.
Приклад:
Введіть номер місяця: Введіть номер місяця:
-2 2
Введіть номер місяця: В цьому місяці 28 днів.
11 Ви вводили неправильно 0 раз.
В цьому місяці 30 днів.
Ви вводили неправильно 1 раз.
"5": Ввести номер місяця і номер дня, вивести кількість
днів, які залишилися до Нового року.
Приклад:
Ввести номер місяця:
12
Ввести день:
25
До Нового року залишилося 6 днів.
Програмування на
мові Паскаль
Тема 7. Графіка
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Система координат
(0,0)
(x,y)
X
Y
x
y
Керування кольором
Колір і товщина ліній, колір точок:
Pen ( 1, 255, 0, 0 );
Колір і стиль заливки:
Brush ( 1, 0, 255, 0 );
Колір тексту:
TextColor ( 0, 0, 255 );
товщина
лінії
R(red)
0..255
G(green)
0..255
B(blue)
0..255
0 – виключити
1 – включити
R G B
R G B
Точки, відрізки і ламані
(x1, y1)
(x2, y2) Pen (1, 0, 255, 0);
Line (x1, y1, x2, y2);
(x, y) Pen (1, 0, 0, 255);
Point (x, y);
(x1, y1) (x2, y2)
(x3, y3)
(x4, y4)
(x5, y5)
Pen (1, 255, 0, 0);
MoveTo (x1, y1);
LineTo (x2, y2);
LineTo (x3, y3);
LineTo (x4, y4);
LineTo (x5, y5);
Фігури з заливкою
(x1, y1)
(x2, y2)
Pen (1, 0, 0, 255);
Brush (1, 255, 255, 0);
Rectangle (x1, y1, x2, y2);
(x1, y1)
(x2, y2)
Pen (1, 255, 0, 0);
Brush (1, 0, 255, 0);
Ellipse (x1, y1, x2, y2);
Brush (1, 100, 200, 255);
Fill (x, y);
(x, y)
Як відмінити заливку??
Текст
TextColor (0, 0, 255);
Brush (1, 255, 255, 0);
Font (20, 30, 600);
MoveTo (x, y);
writeln ('Привіт!');
(x, y)
розмір
10 пікселів
кут
повороту
насиченість:
400 – нормальний
600 – жирний
30о
Приклад
(200, 50)
(100, 100)
(300, 200)
program qq;
begin
Pen(2, 255, 0, 255);
Brush(1, 0, 0, 255);
Rectangle(100, 100, 300, 200);
MoveTo(100, 100);
LineTo(200, 50);
LineTo(300, 100);
Brush(1, 255, 255, 0);
Fill(200, 75);
Pen(2, 255, 255, 255);
Brush(1, 0, 255, 0);
Ellipse(150, 100, 250, 200);
end.
Завдання
"4": "Жабка"
"5": "Корона"
Штриховка
(x1, y1)
(x2, y2)
N ліній (N=5)
h
1
12



N
xx
h
Rectangle (x1, y1, x2, y2);
Line( x1+h, y1, x1+h, y2);
Line( x1+2*h, y1, x1+2*h, y2);
Line( x1+3*h, y1, x1+3*h, y2);
...
h := (x2 – x1) / (N + 1);
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;
var x, h: real;
x
заокруглення до
найближчого цілого
x
Як міняти колір?
(x1, y1)
(x2, y2)
Brush ( 1, c, c, c );
Fill ( ???, ??? );
сірий: R = G = B
Крок зміни c:
1
255


N
hc
x
(x-1, y1+1)
var c, hc: integer;
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;
Штриховка
(x1, y1)
(x2, y2) (x3, y2)
a
h
1
23



N
xx
h12 xxa (x3+a, y1)
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);
...
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;
x x-a
Штриховка
(x1, y1)
(x2, y2)
hx
hy
y x y
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);
...
1
12



N
xx
hx
1
12



N
yy
hy
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. Графіки функцій
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Побудова графіків функцій
Задача: побудувати графік функції y = 3 sin(x) на
інтервалі від 0 до 2π.
Аналіз:
максимальне значення ymax = 3 при x = π/2
мінімальне значення ymin = -3 при x = 3π/2
Проблема: функція задана в математичній системі
координат, будувати потрібно на екрані, вказуючи
координати в пікселях.
Перетворення координат
(x,y)
X
Y
x
y
Математична
система координат
Екранна система
координат (пікселі)
(xе,yе)
xе
yе
(0,0)
(0,0)
a
b
k – масштаб (довжина
зображення одиничного
відрізка на екрані)
xе = a + kx
yе = b - ky
Програма
2π
h – крок зміни x
w – довжина осі ОХ в пікселях
на екрані
осі координат
цикл
побудови
графіка
program qq;
const a = 50; b = 200; k = 50;
xmin = 0; xmax = 6.2832;
var x, y, h: real;
xe, ye, w: integer;
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": Побудувати графік
функції (еліпс)
1
916
22

yx
Програмування на
мові Паскаль
Тема 9. Процедури
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Процедури
Задача: Побудувати фігуру:
Особливості: Три схожі фігури.
подібності: розміри, кут повороту
відмінності: координати, колір
Чи можна розв’язати відомими методами??
Скільки координат потрібно задати??
Процедури
Процедура – це допоміжний алгоритм, який призначений
для виконання деяких дій.
Примітка:
• виконання однакових дій в різних місцях програми
• розбивка програми (або іншої процедури) на
підзадачі для кращого сприймання
Підзадача1 Підзадача2 Підзадача3
1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3
Задача
Процедури
Порядок розробки:
• виділити однакові або схожі дії (три фігури)
• знайти в них спільне (розміри, форма, кут повороту) і
відмінності (координати, колір)
• відмінності записати у вигляді невідомих змінних, вони будуть
параметрами процедури
(x, y) 100
60 (x+100, y)
(x, y-60)
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;
заголовок
тіло процедури
координати
колір
параметри
Програма
program qq;
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.
(100,100)
100
60
процедура
фактичні параметри
виклик
процедури
procedure Tr( x, y, r, g, b: integer);
begin
...
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;
begin
x := 1; y := 2;
Exchange ( x, y );
writeln ( ’x = ’, x, ’ y = ’, y );
end;
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
ця процедура
працює з
копіями
параметрів
x = 1 y = 2
Параметри-змінні
Примітка:
таким чином процедура (і функція) можуть повертати
декілька значень,
Заборонені варіанти виклику
Exchange ( 2, 3 ); { числа }
Exchange ( x+z, y+2 ); { вирази }
procedure Exchange ( a, b: integer );
var c: integer;
begin
c := a; a := b; b := c;
end;
var
параметри можуть змінюватися
Задания
"4": Використовуючи процедуру, побудувати фігуру.
"5": Використовуючи процедуру, побудувати фігуру.
Програмування на
мові Паскаль
Тема 10. Рекурсія
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Рекурсивні об’єкти
Рекурсивний об’єкт – це об’єкт, визначений через один
або декілька таких же об’єктів.
У попа була собака, він її любив.
Вона з’їла кусок м’яса, він її убив.
В ямку закопав, надпис написав:
Казка про попа і собаку
Приклади: Казка про попа і собаку:
Факторіал:






.1,)!1(
,1,1
!
NNN
N
N
якщо
якщо
12)1(!
1234!34!4
123!23!3,12!12!2,1!1



NNN
Малюнок з рекурсією:
Дерево Піфагора
Дерево Піфагора з N рівнів – це стовбур і відходячі від нього
симетрично два дерева Піфагора з N-1 рівнем, такі що довжина
їх стовбурів в 2 рази менша і кут між ними рівний 90o.
6 рівнів:
Як довести, що це рекурсивна фігура??
Дерево Піфагора
Особливості:
• коли зупинитися?
• дерева мають різний нахил
коли кількість рівнів, що
залишилися стане рівним
нулю!
(x1, y1)
(x0, y0)
α
α+45o
α-45o
L
x1 = x0 + L·cos(α)
y1 = y0 – L·sin(α)
нахил "дочірніх" дерев
α + π/4
α – π/4
Процедура кут α довжина стовбура
procedure Pifagor(x0, y0, a, L: real;
N: integer);
const k = 0.6; { зміна довжини }
var x1, y1: real; { локальні змінні }
begin
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;
рекурсивні
виклики
завершити, якщо N=0
Рекурсивною називається процедура,
викликаюча сама себе.
Програма
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. Анімація
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Анімація
Анімація (англ. animation) – оживлення
зображення на екрані.
Задача: всередині синього квадрата 400 на 400
пікселів зліва направо рухається жовтий
квадрат 20 на 20 пікселів. Програма
зупиняється, якщо натиснута клавіша Esc
або квадрат дійшов до границі синьої
області.
Проблема: як зобразити переміщення об’єкта на екрані?
Прив’язка: розміщення об’єкта задається координатами (x,y)
Принцип анімації:
1. малюємо об’єкт в точці (x,y)
2. затримка на декілька мілісекунд
3. затираємо об’єкт
4. змінюємо координати (x,y)
5. переходимо до кроку 1
Як "зловити" натискуванням клавіші?
Подія – це зміна в стані якого-небудь об’єкта або дія
користувача (натиснення на клавішу, клік мишкою).
IsEvent – логічна функція, яка визначає, чи були які-небудь
дії користувача.
Event – процедура, яка визначає, які саме дії відбулися.
if IsEvent then begin
Event(k, x, y);
if k = 1 then
writeln('Клавіша з кодом ', x)
else { k = 2 }
writeln('Мишка: x=', x, ' y=', y);
end;
var k, x, y: integer;
Як вийти з циклу при натисканні Esc?
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;
...
until stop;
end;
якщо що-небудь відбулося...
що відбулося?
якщо натиснута клавіша
з кодом 27 (Esc), то стоп
True, якщо потрібно зупинитися
запуск циклу
Процедура (малювання і стирання)
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;
(x, y)
(x+20, y+20)
Ідея
• одна процедура малює і стирає
• стерти = намалювати кольором фону
• границю квадрата відключити (в
основній програмі)
малювати (True) або ні (False)?
малюємо: колір пензлика – жовтий
стираємо: колір пензлика – синій
тільки заливка!
Повна програма
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
...
end;
Draw(x, y, True);
Delay(10);
Draw(x, y, False);
x := x + 1;
if x >= 400-20 then stop := true;
until stop;
end.
процедура
початкова
умова
вихід по
клавіші Esc
вихід при
досягненні границі
синій фон
чекаємо 10 мс
відключити границю
"4": Два квадрати рухаються
в протилежних напрямках:
"5": Два квадрати рухаються
в протилежних напрямках
і відбиваються від стінок
синього квадрата:
Завдання
Керування клавішами
Задача: жовтий квадрат всередині синього квадрата керується
клавішами-стрілками. Коди клавіш:
вліво – 37 вверх – 38 Esc – 27
вправо – 39 вниз – 40
Проблема: як змінити напрям руху?
Розв’язання:
if {була подія} then begin
if {натиснута клавіша} then begin
{отримати код клавіші - code}
if code = 37 then x := x – 1;
if code = 38 then y := y – 1;
if code = 39 then x := x + 1;
if code = 40 then y := y + 1;
if code = 27 then stop := True;
end;
end;
IsEvent
Event ( k, code, i);
if k = 1 then begin
case code of
37: x := x – 1; 38: y := y – 1;
39: x := x + 1; 40: y := y + 1;
27: stop := True;
end;
якщо було
натиснуто на
клавішу, …
Програма
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
Delay(20);
Draw(x, y, False);
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
if IsEvent then begin
...
end;
Що погано??
процедура
основний цикл
опрацювання
подій
Як забрати блимання?
Проблема: навіть якщо не натиснута жодна клавіша,
квадрат перемальовується через кожні 20 мс
(блимання!)
Що бажається: не перемальовувати квадрат, якщо
не було ніяких подій
Розв’язання: намалювати квадрат і чекати подію
Нова проблема: як чекати подію?
Розв’язання нової проблеми: пустий цикл "поки не
трапилася подія, нічого не робити":
while not IsEvent do;
Програма
program qq;
var x, y, k, code, i: integer;
stop: boolean;
begin
...
repeat
Draw(x, y, True);
while not IsEvent do;
until stop;
end.
procedure Draw(x,y: integer; flag: Boolean);
begin
...
end;
Draw(x, y, False);
Event(k, code, i);
...
while not IsEvent do;
процедура
малюємо квадрат
чекаємо подію
тільки тепер стираємо
Що можна покращити??
"4": Квадрат рухається при
натисненні стрілок, проте
не може вийти за границі
синього квадрата:
"5": Квадрат неперервно
рухається, при натисненні
стрілок міняє напрям і
відбивається від стінок
синього квадрата:
Завдання
Обертання
Задача: зобразити модель обертання Землі навколо
Сонця.
Проблема: рух по колу, як змінюються координати?
Розв’язання: використовувати в якості незалежної
змінної (змінювати в циклі) кут повороту α
(x0, y0)
α
L
(x, y)
x = x0 + L·cos(α)
y = y0 – L·sin(α)
Процедура
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;
малювати (True) або ні (False)?
малюємо: колір пензлика – голубий
стираємо: колір пензлика – чорний
тільки заливка!
радіус Землі
(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; { признак зупинки програми }
begin
...
end.
procedure Draw(x, y: integer; flag: Boolean);
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);
Delay(100);
Draw(x, y, False);
a := a + ha;
until stop;
end.
залити фон чорним
малюємо Сонце
нові координати
поворот на ha
чекаємо 100 мс
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := true;
end;
"4": Зобразити модель Сонця
з двома планетами, які
обертаються в
протилежних напрямках:
"5": Зобразити модель
системи Сонце-Земля-
Місяць:
Завдання
Програмування на
мові Паскаль
Тема 12. Випадкові числа
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Випадкові числа
Випадкові події: всюди…
• підкидання монети (“герб" або “копійка")
• падіння снігу
• броунівський рух
• перешкоди при телефонному зв’язку
• шум радіоефіру
Випадкові числа – це така послідовність чисел, для якої
неможливо передбачити наступне число, якщо навіть
відомі попередні.
Проблема: як одержати на комп’ютері?
Можливі розв’язання:
• використовувати зовнішнє джерело шумових перешкод
• з допомогою математичних перетворень
Псевдовипадкові числа
Псевдовипадкові числа – це така послідовність чисел, яка має
властивості випадкових чисел, проте кожне наступне число
обчислюється по заданій формулі.
Приклади:
1. Випадкові цілі числа [0,m) (лінійний конгруентний метод)
2. Випадкові дійсні числа [0,1]
Література:
Д. Кнут, Мистецтво програмування для ЕОМ, т.2.
1073741823mod)1234516807( 1  nn xx
 k
nn xx )( 1
дробова частина числа
a, c, m – цілі числаmcxax nn mod)( 1  
просте число 230-1
наприклад, k = 5
Розподіл випадкових чисел
Модель: сніжинки падають на відрізок [a,b]
a b a b
розподіл
рівномірний нерівномірний
Скільки може бути різних розподілів ??
Розподіл випадкових чисел
Особливості:
• розподіл – це характеристика всієї послідовності, а не одного
числа
• рівномірний розподіл один, комп’ютерні датчики
(псевдо)випадкових чисел дають рівномірний розподіл
• нерівномірних – багато
• будь-яке нерівномірне можна отримати з допомогою
рівномірного
a b
2
21 xx
x


a b
12
1221 xxx
x



рівномірний розподіл
рівномірний розподіл
Генератор випадкових чисел в Паскалі
Цілі числа в інтервалі [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 );
if IsEvent then begin
Event(k, code, i);
if (k = 1) and (code = 27) then stop := True;
end;
until stop;
end.
випадкові координати
випадковий колір
вихід по клавіші Esc
"4": Ввести з клавіатури
координати кутів
прямокутника і заповнити
його точками випадкового
кольору.
"5": Заповнити трикутник
точками випадкового
кольору (рівномірно або
нерівномірно).
Підказка: візьміть
рівнобедрений трикутник з
кутом 45о.
Завдання
(100,100)
(300,200)
Програмування на
мові Паскаль
Тема 13. Функції
© К.Ю. Поляков, 2006-2007
Переклад: Н. Б. Мартинчук
Р. М. Васильчик
Функції
Функція – це допоміжний алгоритм (підпрограма),
результатом роботи якої є деяке значення.
Приклади:
• обчислення , ,
• розрахунок значення по складених формулах
• відповідь на запитання (просте число або ні?)
Для чого?
• для обчислення однакових розрахунків в різних
місцях програми
• для створення загальнодоступних бібліотек функцій
xsin xxcos
В чому відмінність від процедури??
Функції
Задача: скласти функцію, яка обчислює більше з
двох значень, і навести приклад її використання
Функція:
формальні параметри
function Max (a, b: integer): integer;
begin
if a > b then Max := a
else Max := b;
end. це результат
функції
Функції
Особливості:
• заголовок починається словом function
• формальні параметри описуються так само, як і для
процедур
• можна використовувати параметри-змінні
• в кінці заголовка через двокрапку вказується тип
результату
• функції розміщуються ВИЩЕ основної програми
Max (a, b: integer): integer;function
function Max (a, b: integer): ;integer
function qq( a, b: integer; x: real ): real;a, b: integer; x: real
function Max ( a, b: integer): integer;var
Функції
Особливості:
• можна оголошувати і використовувати локальні змінні
• значення, яке є результатом, записується в змінну, ім’я якої
співпадає з назвою функції; оголошувати НЕ ПОТРІБНО:
function Max (a, b: integer): integer;
begin
...
end;
Max := a;
function qq (a, b: integer): float;
begin
...
end;
var x, y: float;
В Delphi:! Result := a;
Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Введіть два числа');
read(a, b);
max := Max ( a, b );
writeln(‘Найбільше число ', max );
end.
function Max (a, b: integer): integer;
begin
...
end;
c
c
c
Імена змінних, функцій і процедур
не повинні співпадати!
!
фактичні параметри
виклик функції
Логічні функції
Задача: скласти функцію, яка визначає, чи дійсно, що
задане число – просте.
Особливості:
• відповідь – логічне значення (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;
begin
writeln(‘Ввести ціле число');
read(N);
if Prime(N) then
writeln(N, ' – просте число')
else writeln(N, ' – складене число');
end.
function Prime (N: integer): boolean;
var count, i: integer;
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;
виклик функції
результат – логічне значення
перебір тільки до N
умова – це логічне значення
Завдання
"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)
Приклад:
Ввести кут в градусах:
45
sin(45) = 0.707

!7!5!3
sin
753
xxx
xx x в радіанах!

Pascal osnovu

  • 1.
    Програмування на мові Паскаль Тема1. Вступ © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 2.
    Алгоритм Властивості алгоритму • дискретність:складається з окремих кроків (команд) • зрозумілість: повинен включати тільки команди відомі для виконавця (які містяться в СКВ) • визначеність: при однакових вхідних даних завжди видає один і той самий результат • скінченність: закінчується за скінчену кількість кроків • масовість: може застосовуватися багатократно при різних вихідних даних • коректність: видає правильне рішення при будь- яких допустимих вихідних даних Алгоритм – це чітко визначений план дій для виконавця.
  • 3.
    Програма Програма – це •алгоритм, записаний на будь-якій мові програмування • набір команд для комп’ютера Команда – це опис дій, які повинен виконати комп’ютер. • звідки отримати вихідні дані? • що потрібно з ними зробити?
  • 4.
    Мови програмування • Машинно-орієнтовані(низького рівня) – кожна команда відповідає одній команді процесора (асемблер) • Мови високого рівня – наближені до реальної (англійської) мови, легше сприймаються людиною, не залежать від відповідного комп’ютера • для навчання: Бейсик, ЛОГО, Паскаль • професійні: Сі, Фортран, Паскаль • для задач штучного інтелекту: Пролог, ЛИСП • для Інтернету: JavaScript, Java, Perl, PHP, ASP
  • 5.
    Мова Паскаль 1970 –Ніклаус Вірт (Швейцарія) • мова для навчання студентів • розробка програм “зверху-вниз” • різноманітні структури даних (масиви, структури, множини) Підзадача1 Підзадача2 Підзадача3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 Задача
  • 6.
    З чого складаєтьсяпрограма? program <ім’я програми>; const …;{константи} var …; {змінні} begin … {основна програма} end. { процедури і функції } коментарі у фігурних дужках не опрацьовуються
  • 7.
    З чого складаєтьсяпрограма? Константа – постійна величина, яка має ім’я. Змінна – змінна величина, яка має ім’я (комірка пам’яті). Процедура – додатковий алгоритм, який описує деякі дії (малювання кола). Функція – додатковий алгоритм, для виконання обчислень (обчислення квадратного кореня, sin).
  • 8.
    Імена програм, констант,змінних Імена можуть містити • латинські букви (A-Z) • цифри • знак підкреслення _ великі і маленькі букви не розрізняються Імена НЕ можуть містити • українські букви • пропуски • дужки, знаки +, =, !, ? та ін. ім’я не може починатися з цифри Які імена правильні? AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B
  • 9.
    Константи const i2 = 45;{ ціле число } pi = 3.14; { дійсне число } qq = 'Вася'; { рядок символів } L = True; { логічна величина } ціла і дробова частина відділяються крапкою можна використовувати українські букви! Може приймати два значення: • True (істина, “так") • False (хибність, "ні")
  • 10.
    Змінні Змінна – цевеличина, яка має ім’я, тип і значення. Значення змінної величини під час виконання програми може змінюватися. Типи змінних: • integer { цілі } • real { дійсні } • char { один символ } • string { рядок } • boolean { логічні } Оголошення змінних (виділення пам’яті): var a, b: integer; Q: real; s1, s2: string;
  • 11.
    Як змінюється значеннязмінної? Оператор – це команда мови програмування високого рівня. Оператор присвоєння служить для зміни значення змінної. Приклад: program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. a ? 55 b ? 5+27 a 5 7*428
  • 12.
    Оператор присвоєння Загальна структура: <ім’язмінної> := <вираз>; Арифметичні вирази можуть містити • константи • імена змінних • знаки арифметичних дій: + - * / div mod • виклики функцій • круглі дужки ( ) множення ділення ділення націло остача від ділення
  • 13.
    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. Які оператори неправильні? ім’я змінної повинно знаходитися зліва від знака := ціла і дробова частина відділяються крапкою неможливо записати дійсне значення в цілу змінну
  • 14.
    Ручна прокрутка програми programqq; 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
  • 15.
    Порядок виконання операцій •обчислення виразів у дужках • множення, ділення, div, mod зліва направо • додаванні і віднімання зліва направо 2 3 5 4 1 7 8 6 9 z := (5*a*c+3*(c-d))/a*(b-c)/ b; )2)(( )(5 22 addc badca x    )( )(35 cb ab dcac z    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));
  • 16.
    Додавання двох чисел Задача.Ввести два цілих числа і вивести на екран їх суму. Найпростіше розв’язання: program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln ( c ); end.
  • 17.
    Оператор введення read (a ); { ввести значення змінної a} read ( a, b ); { ввести значення змінних a і b} Як вводяться два числа? через пропуск: 25 30 через Enter: 25 30 a25 b30 a25 b30
  • 18.
    Оператор виведення write (a ); { вивести значення змінної a} writeln ( a ); { вивести значення змінної a і перейти на новий рядок} writeln ( ‘Привіт!' ); { виведення тексту} writeln ( ‘Відповідь: ', c ); {виведення тексту і значення змінної c} writeln ( a, '+', b, '=', c );
  • 19.
    Формати виведення program qq; vari: 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< всього символів всього символів в дробовій частині
  • 20.
    Повний розв’язок program qq; vara, b, c: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. Протокол: Ввести два цілих числа 25 30 25+30=55 це виводить комп'ютер це вводить користувач
  • 21.
    Блок-схема лінійного алгоритму початок кінець c:= a + b; ввести a, b вивести c блок «початок» блок «ввести» блок «процес» блок «вивести» блок «кінець»
  • 22.
    Завдання "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
  • 23.
    Програмування на мові Паскаль Тема2. Розгалуження © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 24.
    Алгоритми розгалуження Задача. Ввестидва цілих числа і вивести на екран більше з них. Ідея розв’язання: потрібно вивести на екран перше число, якщо воно більше другого, або друге, якщо воно більше першого. Особливості: дії виконавця залежать від деяких умов (якщо … інакше …). Алгоритми, в яких послідовність кроків залежить від виконання деяких умов, називаються розгалуженими.
  • 25.
    Варіант 1. Блок-схема початок max:=a; ввести a,b вивести max a > b? max:= b; кінець так ні повна форма розгалуження блок «логічний вираз» Якщо a = b??
  • 26.
    Варіант 1. Програма programqq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); if a > b then begin end else begin end; writeln (‘Більше число ', max); end. max := a; max := b; повна форма умовного оператора
  • 27.
    Умовний оператор if <умова>then begin {що робити, якщо умова правильна} end else begin {що робити, якщо умова неправильна} end; Особливості: • перед else НЕ ставиться крапка з комою • друга частина (else …) може бути відсутня (неповна форма) • якщо в блоці один оператор, можна забрати слова begin і end
  • 28.
    Що неправильно? if a> b then begin a := b; end else b := a; end; if a > b then begin a := b; else 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 else b > a begin b := a; end; begin end begin end
  • 29.
    Варіант 2. Блок-схема неповнаформа розгалуження початок max:= a; ввести a,b вивести max max:= b; кінець так ні b > a?
  • 30.
    Варіант 2. Програма programqq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := a; if b > a then writeln (‘Більше число ', max); end. max := b; неповна форма умовного оператора
  • 31.
    Варіант 2Б. Програма programqq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := b; if ??? then ??? writeln (‘Більше число ', max); end. max := a; a > b
  • 32.
    Що неправильно? if a> b then begin a := b; else b := a; if a > b then begin a := b; end; else b := a; if a > b then else begin b := a; end; if a > b then a := b; else b := a; end; a := b end a := b if b >= a then b := a;
  • 33.
    Завдання "4": Ввести тричисла і знайти найбільше з них. Приклад: Ввести три числа: 4 15 9 Найбільше число 15 "5": Ввести п’ять чисел і знайти найбільше з них. Приклад: Ввести п’ять чисел: 4 15 9 56 4 Найбільше число 56
  • 34.
    Програмування на мові Паскаль Тема3. Складені умови © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 35.
    Складені умови Задача. Фірманабирає співробітників від 25 до 40 років включно. Ввести вік людини і визначити, чи підходить вона фірмі (вивести відповідь “підходить” або “не підходить”). Особливості: потрібно перевірити, виконання двох умов одночасно. Чи можна розв’язати відомими методами??
  • 36.
    Варіант 1. Алгоритм початок ввестиx ‘підходить' кінець так ні x >= 25? так ні x <= 40? ‘не підходить' ‘не підходить'
  • 37.
    Варіант 1. Програма programqq; var x: integer; begin writeln(‘Ввести вік'); read ( x ); if x >= 25 then if x <= 40 then writeln (‘Підходить') else writeln (‘Не підходить') else writeln (‘Не підходить'); end.
  • 38.
    Варіант 2. Алгоритм початок ввестиx ‘підходить' так ніx >= 25 і x <= 40? ‘не підходить' кінець
  • 39.
    Варіант 2. Програма programqq; var x: integer; begin writeln(‘Ввести вік'); read ( x ); if (x >= 25) and (x <= 40) then writeln (‘Підходить') else writeln (‘Не підходить') end. складена умова
  • 40.
    Складена умова Складена умова– це умова, яка складається з декількох простих умов (відношень), зв’язаних з допомогою логічних операцій: • not – НІ (заперечення, інверсія) • and – І (логічне множення, кон'юнкція, одночасне виконання умов) • or – АБО (логічне додавання, диз'юнкція, виконання хоча б одної з умов) • xor – виключаюче АБО (виконання тільки одної з двох умов, але не обох) Прості умови (відношення) < <= > >= = <> дорівнює не дорівнює
  • 41.
    Складена умова Порядок виконання •вирази в дужках • not • and • or, xor • <, <=, >, >=, =, <> Особливості – кожна з простих умов обов'язково береться в дужки. Приклад 4 1 6 2 5 3 if not (a > b) or (c <> d) and (b <> a) then begin ... end
  • 42.
    Істинне чи хибнепри a := 2; b := 3; c := 4; not (a > b) (a < b) and (b < c) not (a >= b) or (c = d) (a < c) or (b < c) and (b < a) (a < b) xor not (b > c) Для яких значень x істинні умови: (x < 6) and (x < 10) (x < 6) and (x > 10) (x > 6) and (x < 10) (x > 6) and (x > 10) (x < 6) or (x < 10) (x < 6) or (x > 10) (x > 6) or (x < 10) (x > 6) or (x > 10) Складена умова True True FALSE (-, 6)  (6, 10) (10, ) (-, 10) (-, 6)  (10,) (-, ) (6, ) x < 6 x > 10 x < 10 x > 6 True True
  • 43.
    Завдання "4": Ввести номермісяця і вивести назву пори року. Приклад: Ввести номер місяця: 4 весна "5": Ввести вік людини (від 1 до 150 років) и вивести його разом з наступним слово “рік”, “роки" або “років". Приклад: Ввести вік: Ввести вік: 24 57 Вам 24 роки Вам 57 років
  • 44.
    Програмування на мові Паскаль Тема4. Цикли © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 45.
    Цикли Цикл – цебагатократне виконання однакової послідовності дій. • цикл з відомою кількістю кроків • цикл з невідомою кількістю кроків (цикл з умовою) Задача. Вивести на екран квадрати і куби цілих чисел від 1 до 8 (від a до b). Особливості: однакові дії виконуються 8 раз. Чи можна розв’язати відомими методами??
  • 46.
    Алгоритм початок i, i2, i3 кінець ні так i<= 8? i := 1; i := i + 1; i2 := i * i; i3 := i2 * i; задати початкове значення змінної циклу перевірити, чи все виконали обчислити квадрат і куб вивести результат перейти до наступного i
  • 47.
    Алгоритм (з блоком"цикл") початок i, i2, i3 кінець i2 := i * i; i3 := i2 * i; i := 1,8 блок "цикл" тіло циклу
  • 48.
    Програма 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. змінна циклу початкове значення кінцеве значення
  • 49.
    Цикл з зменшеннямзмінної Задача. Вивести на екран квадрати і куби цілих чисел від 8 до 1 (в зворотному порядку). Особливості: змінна циклу повинна зменшуватися. Розв’язання: ... for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; ... downto
  • 50.
    Цикл з змінною for<змінна> := <початкове значення> to <кінцеве значення> do begin {тіло циклу} end; Збільшення змінної на 1: for <змінна> := <початкове значення> downto <кінцеве значення> do begin {тіло циклу} end; Зменшення змінної на 1:
  • 51.
    Цикл з змінною Особливості: •змінна повинна бути тільки цілою (integer) • крок зміни змінної циклу завжди рівний 1 (to) або -1 (downto) • якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: • якщо кінцеве значення менше початкового, цикл (to) не виконується ні разу (перевірка умови в початку циклу, цикл з передумовою) for i:=1 to 8 do writeln(‘Привіт');
  • 52.
    Цикл з змінною Особливості: •в тілі циклу не дозволяється змінювати змінну циклу (чому?) • при зміні початкового і кінцевого значення всередині циклу кількість кроків не змінюється: n := 8; for i:=1 to n do begin writeln('Привіт'); n := n + 1; end; немає зациклювання
  • 53.
    Цикл з змінною Особливості: •після виконання циклу в багатьох системах встановлюється перше значення змінної циклу, при якому порушується умова: for i:=1 to 8 do writeln('Привіт'); writeln('i=', i); for i:=8 downto 1 do writeln('Привіт'); writeln('i=', i); i=9 i=0
  • 54.
    Скільки разів виконаєтьсяцикл? 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
  • 55.
    Як змінюється крок? Задача.Вивести на екран квадрати і куби непарних цілих чисел від 1 до 9. Особливості: змінна циклу повинна збільшуватися на 2. Проблема: в Паскалі крок може бути 1 або -1. Розв’язання: ... for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; end; ... i mod 2 = 1 виконується тільки для непарних i Що погано??
  • 56.
    Як змінюється крок?– II Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Початкове значення i дорівнює 1, з кожним кроком циклу i збільшується на 2. Розв’язання: ... ??? for k:=1 to 5 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); ??? end; ... i := i + 2; i := 1;
  • 57.
    Як змінюється крок?– III Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Знаючи k, потрібно розрахувати i. Розв’язання: ... for k:=1 to 5 do begin ??? i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; ... i := 2*k – 1; k 1 2 3 4 5 i 1 3 5 7 9 i = 2k-1
  • 58.
    Завдання "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
  • 59.
    Програмування на мові Паскаль Тема5. Цикли з умовою © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 60.
    Цикл з невідомоюкількістю кроків Приклад: Відрізати поліно від бревна. Скільки разів потрібно зробити рух пилкою? Задача: Ввести ціле число (<2000000) і визначити кількість цифр у ньому. Ідея розв’язання: Відрізаємо послідовно останню цифру, збільшуємо лічильник. Проблема: Невідомо, скільки кроків потрібно зробити. Розв’язання: Потрібно зупинитися, коли n = 0, тобто потрібно робити “поки n <> 0". n count 123 0 12 1 1 2 0 3
  • 61.
    Алгоритм початок count кінець ні так n <> 0? count:= 0; count := count + 1; n := n div 10; обнулити лічильник цифр ввести n виконувати "поки n <> 0"
  • 62.
    Програма program qq; var n,count: integer; begin writeln(‘Ввести ціле число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числі ', n, ' знайшли ', count, ' цифр'); end. , n1: integer; n1 := n; n1, виконувати "поки n <> 0" Що погано??
  • 63.
    Цикл с умовою while<умова> do begin {тіло циклу} end; Особливості: • можна використовувати складені умови: • якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: while (a<b) and (b<c) do begin {тіло циклу} end; while a < b do a := a + 1;
  • 64.
    Цикл з умовою Особливості: •умова перевіряється кожен раз при вході в цикл • якщо умова на вході в цикл хибна, цикл не виконується жодного разу • якщо умова ніколи не стане хибною, програма зациклиться a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a < b do d := a + b;
  • 65.
    Скільки разів виконуєтьсяцикл? 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; зациклювання
  • 66.
    Заміна for наwhile і навпаки for i:=1 to 10 do begin {тіло циклу} end; i := 1; while i <= 10 do begin {тіло циклу} i := i + 1; end; for i:=a downto b do begin {тіло циклу} end; i := a; while i >= b do begin {тіло циклу} i := i - 1; end; Заміна while на for можлива тільки тоді, коли можна наперед розрахувати кількість кроків циклу. Заміна циклу for на while можлива завжди.
  • 67.
    Завдання "4": Ввести цілечисло і знайти суму його цифр. Приклад: Ввести ціле число: 1234 Сума цифр числа 1234 рівна 10. "5": Ввести ціле число і визначити, чи правда, що в його записі є дві однакові цифри. Приклад: Ввести ціле число: Ввести ціле число: 1234 1224 Ні. Так.
  • 68.
    Послідовності Приклади: • 1, 2,3, 4, 5, … • 1, 2, 4, 7, 11, 16, … • 1, 2, 4, 8, 16, 32, … • ..., 32 5 , 4 1 , 8 3 , 2 1 , 2 1 ..., 32 5 , 16 4 , 8 3 , 4 2 , 2 1 an = n a1 = 1, an+1 = an+1 a1 = 1, an+1 = an + n an = 2n-1 a1 = 1, an+1 = 2an b1 = 1, bn+1 = bn+1 c1 = 2, cn+1 = 2cnn n n c b a 
  • 69.
    Послідовності Задача: знайти сумувсіх елементів послідовності, які по модулю більші 0,001: ..., 32 5 , 16 4 , 8 3 , 4 2 , 2 1 ,1  ... 32 5 16 4 8 3 4 2 2 1 1 S Елемент послідовності (починаючи з №2): c b za  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;
  • 70.
    Алгоритм початок S кінець ні так |a| > 0.001? S:= S + a; S := 0; b := 1; c := 2; z := -1; a := 1; початкове значення a := z*b/c; b := b + 1; c := 2*c; z := -z; перший елемент новий елемент зміни Перестановка??
  • 71.
    Програма 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. перехід до наступного доданка початкове значення збільшення суми розрахунок елемента послідовності
  • 72.
    Завдання "4": Знайти сумуелементів послідовності з точністю 0,001: Відповідь: S = 1.157 "5": Знайти суму елементів послідовності з точністю 0,001: Відповідь: S = 1.220 ... 819 8 277 6 95 4 33 2 1         S ... 24313 10 818 8 275 6 93 4 32 2 1           S
  • 73.
    Цикл з післяумовою Задача:Ввести ціле додатне число (<2000000) і визначити кількість цифр в ньому. Проблема: Як не дати ввести від'ємне число або нуль? Розв’язання: Якщо вводиться неправильне число, повернутися назад до введення даних (цикл!). Особливості: Один раз тіло циклу потрібно виконати в будь-якому випадку => перевірку умови циклу потрібно виконувати в кінці циклу (цикл с післяумовою). Цикл с післяумовою – це цикл, в якому перевірка умови виконується в кінці циклу.
  • 74.
    Цикл з післяумовою:алгоритм початок кінець так ні n > 0? тіло циклу умова ВИХОДУ блок "типовий процес" ввести n основний алгоритм
  • 75.
    Програма program qq; var n:integer; begin repeat writeln(‘Ввести додатне число'); read(n); until n > 0; ... { основний алгоритм } end. until n > 0; умова ВИХОДУ Особливості: • тіло циклу завжди виконується хоча б один раз • після слова until ("до тих пір, поки не…") ставиться умова ВИХОДУ із циклу
  • 76.
    Скільки разів виконуєтьсяцикл? 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; зациклення
  • 77.
    Завдання (з захистомвід неправильного введення) "4": Ввести натуральне число і визначити, чи правда що сума його цифр дорівнює 10. Приклад: Ввести число >= 0: Введіть число >= 0: -234 1233 Потрібно додатне число. Ні Ввести число >= 0: 1234 Так "5": Ввести натуральне число і визначити, які цифри зустрічаються декілька разів. Приклад: Введіть число >= 0: Введіть число >= 0: 2323 1234 Повторяються: 2, 3 Немає повторів.
  • 78.
    Програмування на мові Паскаль Тема6. Оператор вибору © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 79.
    Оператор вибору Задача: Ввестиномер місяця і вивести кількість днів в цьому місяці. Розв’язання: Кількість днів у місяцях: 28 днів – 2 (лютий) 30 днів – 4 (квітень), 6 (червень), 9 (вересень), 11 (листопад) 31 день – 1 (січень), 3 (березень), 5 (травень), 7 (липень), 8 (серпень), 10 (жовтень), 12 (грудень) Особливості: Вибір не з двох, а з декількох варіантів в залежності від номера місяця. Чи можна розв’язати відомими методами??
  • 80.
    Алгоритм початок кінець оператор вибору жоден з варіантів непідійшов ввести M так ні M = 1? D := 31; ні M = 2? D := 28; так ні M = 12? D := 31; так вивести D помилка
  • 81.
    Програма 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. жоден варіант не підійшов
  • 82.
    Оператор вибору Особливості: • післяcase може бути ім’я змінної або арифметичний вираз цілого типу (integer) або символьного типа (char) case i+3 of 1: begin a := b; end; 2: begin a := c; end; end; var c: char; ... case c of 'а': writeln('Антилопа'); 'б': writeln('Борсук'); else writeln('Не знаю'); end;
  • 83.
    Оператор вибору Особливості: • якщопотрібно виконати тільки один оператор, слова begin і end можна не писати • не можна ставити два однакових значення case i+3 of 1: a := b; 1: a := c; end; case i+3 of 1: a := b; 2: a := c; end;
  • 84.
    Оператор вибору Особливості: • значення,при яких виконуються однакові дії, можна групувати case i of 1: a := b; 2,4,6: a := c; 10..15: a := d; 20,21,25..30: a := e; else writeln(‘Помилка'); end; перечислення діапазон суміш
  • 85.
    Що неправильно? case aof 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: a := c; end; 3..6: case a+c/2 of 2: a := b; 4: a := c; end; case a of 2: a := b; d := 0; 4: a := c; end; begin end;
  • 86.
    Завдання (з захистомвід неправильного введення) "4": Ввести номер місяця і вивести кількість днів в ньому, а також кількість помилок при введенні. Приклад: Введіть номер місяця: Введіть номер місяця: -2 2 Введіть номер місяця: В цьому місяці 28 днів. 11 Ви вводили неправильно 0 раз. В цьому місяці 30 днів. Ви вводили неправильно 1 раз. "5": Ввести номер місяця і номер дня, вивести кількість днів, які залишилися до Нового року. Приклад: Ввести номер місяця: 12 Ввести день: 25 До Нового року залишилося 6 днів.
  • 87.
    Програмування на мові Паскаль Тема7. Графіка © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 88.
  • 89.
    Керування кольором Колір ітовщина ліній, колір точок: Pen ( 1, 255, 0, 0 ); Колір і стиль заливки: Brush ( 1, 0, 255, 0 ); Колір тексту: TextColor ( 0, 0, 255 ); товщина лінії R(red) 0..255 G(green) 0..255 B(blue) 0..255 0 – виключити 1 – включити R G B R G B
  • 90.
    Точки, відрізки іламані (x1, y1) (x2, y2) Pen (1, 0, 255, 0); Line (x1, y1, x2, y2); (x, y) Pen (1, 0, 0, 255); Point (x, y); (x1, y1) (x2, y2) (x3, y3) (x4, y4) (x5, y5) Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5);
  • 91.
    Фігури з заливкою (x1,y1) (x2, y2) Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); (x1, y1) (x2, y2) Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); Brush (1, 100, 200, 255); Fill (x, y); (x, y) Як відмінити заливку??
  • 92.
    Текст TextColor (0, 0,255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привіт!'); (x, y) розмір 10 пікселів кут повороту насиченість: 400 – нормальний 600 – жирний 30о
  • 93.
    Приклад (200, 50) (100, 100) (300,200) program qq; begin Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end.
  • 94.
  • 95.
    Штриховка (x1, y1) (x2, y2) Nліній (N=5) h 1 12    N xx h Rectangle (x1, y1, x2, y2); Line( x1+h, y1, x1+h, y2); Line( x1+2*h, y1, x1+2*h, y2); Line( x1+3*h, y1, x1+3*h, y2); ... h := (x2 – x1) / (N + 1); 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; var x, h: real; x заокруглення до найближчого цілого x
  • 96.
    Як міняти колір? (x1,y1) (x2, y2) Brush ( 1, c, c, c ); Fill ( ???, ??? ); сірий: R = G = B Крок зміни c: 1 255   N hc x (x-1, y1+1) var c, hc: integer; 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;
  • 97.
    Штриховка (x1, y1) (x2, y2)(x3, y2) a h 1 23    N xx h12 xxa (x3+a, y1) 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); ... 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; x x-a
  • 98.
    Штриховка (x1, y1) (x2, y2) hx hy yx y 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); ... 1 12    N xx hx 1 12    N yy hy 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;
  • 99.
    Завдання "4": Ввести зклавіатури кількість ліній штриховки і побудувати фігуру, заливши всі області різним кольором. "5": Ввести з клавіатури кількість кіл і побудувати фігуру, заливши всі області різними кольорами.
  • 100.
    Програмування на мові Паскаль Тема8. Графіки функцій © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 101.
    Побудова графіків функцій Задача:побудувати графік функції y = 3 sin(x) на інтервалі від 0 до 2π. Аналіз: максимальне значення ymax = 3 при x = π/2 мінімальне значення ymin = -3 при x = 3π/2 Проблема: функція задана в математичній системі координат, будувати потрібно на екрані, вказуючи координати в пікселях.
  • 102.
    Перетворення координат (x,y) X Y x y Математична система координат Екраннасистема координат (пікселі) (xе,yе) xе yе (0,0) (0,0) a b k – масштаб (довжина зображення одиничного відрізка на екрані) xе = a + kx yе = b - ky
  • 103.
    Програма 2π h – крокзміни x w – довжина осі ОХ в пікселях на екрані осі координат цикл побудови графіка program qq; const a = 50; b = 200; k = 50; xmin = 0; xmax = 6.2832; var x, y, h: real; xe, ye, w: integer; 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. Що погано??
  • 104.
    Як з’єднати точки? Алгоритм: Якщоперша точка перейти в точку (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.
  • 105.
    Завдання "4": Побудувати графік функціїy = x2 на інтервалі [-3,3]. "5": Побудувати графік функції (еліпс) 1 916 22  yx
  • 106.
    Програмування на мові Паскаль Тема9. Процедури © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 107.
    Процедури Задача: Побудувати фігуру: Особливості:Три схожі фігури. подібності: розміри, кут повороту відмінності: координати, колір Чи можна розв’язати відомими методами?? Скільки координат потрібно задати??
  • 108.
    Процедури Процедура – цедопоміжний алгоритм, який призначений для виконання деяких дій. Примітка: • виконання однакових дій в різних місцях програми • розбивка програми (або іншої процедури) на підзадачі для кращого сприймання Підзадача1 Підзадача2 Підзадача3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 Задача
  • 109.
    Процедури Порядок розробки: • виділитиоднакові або схожі дії (три фігури) • знайти в них спільне (розміри, форма, кут повороту) і відмінності (координати, колір) • відмінності записати у вигляді невідомих змінних, вони будуть параметрами процедури (x, y) 100 60 (x+100, y) (x, y-60) 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; заголовок тіло процедури координати колір параметри
  • 110.
    Програма program qq; 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. (100,100) 100 60 процедура фактичні параметри виклик процедури procedure Tr( x, y, r, g, b: integer); begin ... end; формальні параметри
  • 111.
    Процедури Особливості: • всі процедурирозміщені вище основної програми • в заголовку процедури перераховуються формальні параметри, вони позначаються іменами, оскільки можуть змінюватися • при виклику процедури в дужках вказуються фактичні параметри (числа або арифметичні вирази) в тому ж порядку procedure Tr( x, y, r, g, b: integer); Tr (200, 100, 0, 255, 0); x y r g b
  • 112.
    Процедури Особливості: • для кожногоформального параметра після двокрапки вказується його тип • якщо однотипні параметри стоять поряд, їх перераховують через кому • всередині процедури параметри використовуються так само, як і змінні procedure A (x: real; y: integer; z: real); procedure A (x, z: real; y, k, l: integer);
  • 113.
    Процедури Особливості: • в процедуріможна оголошувати додаткові локальні змінні, інші процедури не мають до них доступу program qq; procedure A(x, y: integer); var a, b: real; begin a := (x + y)/6; ... end; begin ... end. локальні змінні
  • 114.
    Параметри-змінні Задача: скласти процедуру,яка міняє місцями значення двох змінних. Особливості: потрібно, щоб зміни зроблені в процедурі, стали відомі програмі яка викликає program qq; var x, y: integer; begin x := 1; y := 2; Exchange ( x, y ); writeln ( ’x = ’, x, ’ y = ’, y ); end; procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; ця процедура працює з копіями параметрів x = 1 y = 2
  • 115.
    Параметри-змінні Примітка: таким чином процедура(і функція) можуть повертати декілька значень, Заборонені варіанти виклику Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { вирази } procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; var параметри можуть змінюватися
  • 116.
    Задания "4": Використовуючи процедуру,побудувати фігуру. "5": Використовуючи процедуру, побудувати фігуру.
  • 117.
    Програмування на мові Паскаль Тема10. Рекурсія © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 118.
    Рекурсивні об’єкти Рекурсивний об’єкт– це об’єкт, визначений через один або декілька таких же об’єктів. У попа була собака, він її любив. Вона з’їла кусок м’яса, він її убив. В ямку закопав, надпис написав: Казка про попа і собаку Приклади: Казка про попа і собаку: Факторіал:       .1,)!1( ,1,1 ! NNN N N якщо якщо 12)1(! 1234!34!4 123!23!3,12!12!2,1!1    NNN Малюнок з рекурсією:
  • 119.
    Дерево Піфагора Дерево Піфагораз N рівнів – це стовбур і відходячі від нього симетрично два дерева Піфагора з N-1 рівнем, такі що довжина їх стовбурів в 2 рази менша і кут між ними рівний 90o. 6 рівнів: Як довести, що це рекурсивна фігура??
  • 120.
    Дерево Піфагора Особливості: • колизупинитися? • дерева мають різний нахил коли кількість рівнів, що залишилися стане рівним нулю! (x1, y1) (x0, y0) α α+45o α-45o L x1 = x0 + L·cos(α) y1 = y0 – L·sin(α) нахил "дочірніх" дерев α + π/4 α – π/4
  • 121.
    Процедура кут αдовжина стовбура procedure Pifagor(x0, y0, a, L: real; N: integer); const k = 0.6; { зміна довжини } var x1, y1: real; { локальні змінні } begin 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; рекурсивні виклики завершити, якщо N=0 Рекурсивною називається процедура, викликаюча сама себе.
  • 122.
    Програма 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);
  • 123.
    "4": Використовуючи рекурсивнупроцедуру, побудувати фігуру: "5": Використовуючи рекурсивну процедуру, побудувати фігуру : Задания
  • 124.
    Програмування на мові Паскаль Тема11. Анімація © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 125.
    Анімація Анімація (англ. animation)– оживлення зображення на екрані. Задача: всередині синього квадрата 400 на 400 пікселів зліва направо рухається жовтий квадрат 20 на 20 пікселів. Програма зупиняється, якщо натиснута клавіша Esc або квадрат дійшов до границі синьої області. Проблема: як зобразити переміщення об’єкта на екрані? Прив’язка: розміщення об’єкта задається координатами (x,y) Принцип анімації: 1. малюємо об’єкт в точці (x,y) 2. затримка на декілька мілісекунд 3. затираємо об’єкт 4. змінюємо координати (x,y) 5. переходимо до кроку 1
  • 126.
    Як "зловити" натискуваннямклавіші? Подія – це зміна в стані якого-небудь об’єкта або дія користувача (натиснення на клавішу, клік мишкою). IsEvent – логічна функція, яка визначає, чи були які-небудь дії користувача. Event – процедура, яка визначає, які саме дії відбулися. if IsEvent then begin Event(k, x, y); if k = 1 then writeln('Клавіша з кодом ', x) else { k = 2 } writeln('Мишка: x=', x, ' y=', y); end; var k, x, y: integer;
  • 127.
    Як вийти зциклу при натисканні Esc? 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; ... until stop; end; якщо що-небудь відбулося... що відбулося? якщо натиснута клавіша з кодом 27 (Esc), то стоп True, якщо потрібно зупинитися запуск циклу
  • 128.
    Процедура (малювання істирання) 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; (x, y) (x+20, y+20) Ідея • одна процедура малює і стирає • стерти = намалювати кольором фону • границю квадрата відключити (в основній програмі) малювати (True) або ні (False)? малюємо: колір пензлика – жовтий стираємо: колір пензлика – синій тільки заливка!
  • 129.
    Повна програма program qq; varx, 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 ... end; Draw(x, y, True); Delay(10); Draw(x, y, False); x := x + 1; if x >= 400-20 then stop := true; until stop; end. процедура початкова умова вихід по клавіші Esc вихід при досягненні границі синій фон чекаємо 10 мс відключити границю
  • 130.
    "4": Два квадратирухаються в протилежних напрямках: "5": Два квадрати рухаються в протилежних напрямках і відбиваються від стінок синього квадрата: Завдання
  • 131.
    Керування клавішами Задача: жовтийквадрат всередині синього квадрата керується клавішами-стрілками. Коди клавіш: вліво – 37 вверх – 38 Esc – 27 вправо – 39 вниз – 40 Проблема: як змінити напрям руху? Розв’язання: if {була подія} then begin if {натиснута клавіша} then begin {отримати код клавіші - code} if code = 37 then x := x – 1; if code = 38 then y := y – 1; if code = 39 then x := x + 1; if code = 40 then y := y + 1; if code = 27 then stop := True; end; end; IsEvent Event ( k, code, i); if k = 1 then begin case code of 37: x := x – 1; 38: y := y – 1; 39: x := x + 1; 40: y := y + 1; 27: stop := True; end; якщо було натиснуто на клавішу, …
  • 132.
    Програма program qq; var x,y, k, code, i: integer; stop: boolean; begin ... repeat Draw(x, y, True); Delay(20); Draw(x, y, False); until stop; end. procedure Draw(x,y: integer; flag: Boolean); begin ... end; if IsEvent then begin ... end; Що погано?? процедура основний цикл опрацювання подій
  • 133.
    Як забрати блимання? Проблема:навіть якщо не натиснута жодна клавіша, квадрат перемальовується через кожні 20 мс (блимання!) Що бажається: не перемальовувати квадрат, якщо не було ніяких подій Розв’язання: намалювати квадрат і чекати подію Нова проблема: як чекати подію? Розв’язання нової проблеми: пустий цикл "поки не трапилася подія, нічого не робити": while not IsEvent do;
  • 134.
    Програма program qq; var x,y, k, code, i: integer; stop: boolean; begin ... repeat Draw(x, y, True); while not IsEvent do; until stop; end. procedure Draw(x,y: integer; flag: Boolean); begin ... end; Draw(x, y, False); Event(k, code, i); ... while not IsEvent do; процедура малюємо квадрат чекаємо подію тільки тепер стираємо Що можна покращити??
  • 135.
    "4": Квадрат рухаєтьсяпри натисненні стрілок, проте не може вийти за границі синього квадрата: "5": Квадрат неперервно рухається, при натисненні стрілок міняє напрям і відбивається від стінок синього квадрата: Завдання
  • 136.
    Обертання Задача: зобразити модельобертання Землі навколо Сонця. Проблема: рух по колу, як змінюються координати? Розв’язання: використовувати в якості незалежної змінної (змінювати в циклі) кут повороту α (x0, y0) α L (x, y) x = x0 + L·cos(α) y = y0 – L·sin(α)
  • 137.
    Процедура 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; малювати (True) або ні (False)? малюємо: колір пензлика – голубий стираємо: колір пензлика – чорний тільки заливка! радіус Землі (x-r, y-r) (x,y) (x+r, y+r)
  • 138.
    Константи і змінні programqq; const rSun = 60; { радіус Сонця} L = 150; { радіус орбіти Землі } x0 = 200; { координати центра Сонця} y0 = 200; var x, y, { координати Землі } k, code, i: integer; { для Event } a, ha: real; { кут повороту, крок } stop: boolean; { признак зупинки програми } begin ... end. procedure Draw(x, y: integer; flag: Boolean); begin ... end;
  • 139.
    Основна програма 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); Delay(100); Draw(x, y, False); a := a + ha; until stop; end. залити фон чорним малюємо Сонце нові координати поворот на ha чекаємо 100 мс if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := true; end;
  • 140.
    "4": Зобразити модельСонця з двома планетами, які обертаються в протилежних напрямках: "5": Зобразити модель системи Сонце-Земля- Місяць: Завдання
  • 141.
    Програмування на мові Паскаль Тема12. Випадкові числа © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 142.
    Випадкові числа Випадкові події:всюди… • підкидання монети (“герб" або “копійка") • падіння снігу • броунівський рух • перешкоди при телефонному зв’язку • шум радіоефіру Випадкові числа – це така послідовність чисел, для якої неможливо передбачити наступне число, якщо навіть відомі попередні. Проблема: як одержати на комп’ютері? Можливі розв’язання: • використовувати зовнішнє джерело шумових перешкод • з допомогою математичних перетворень
  • 143.
    Псевдовипадкові числа Псевдовипадкові числа– це така послідовність чисел, яка має властивості випадкових чисел, проте кожне наступне число обчислюється по заданій формулі. Приклади: 1. Випадкові цілі числа [0,m) (лінійний конгруентний метод) 2. Випадкові дійсні числа [0,1] Література: Д. Кнут, Мистецтво програмування для ЕОМ, т.2. 1073741823mod)1234516807( 1  nn xx  k nn xx )( 1 дробова частина числа a, c, m – цілі числаmcxax nn mod)( 1   просте число 230-1 наприклад, k = 5
  • 144.
    Розподіл випадкових чисел Модель:сніжинки падають на відрізок [a,b] a b a b розподіл рівномірний нерівномірний Скільки може бути різних розподілів ??
  • 145.
    Розподіл випадкових чисел Особливості: •розподіл – це характеристика всієї послідовності, а не одного числа • рівномірний розподіл один, комп’ютерні датчики (псевдо)випадкових чисел дають рівномірний розподіл • нерівномірних – багато • будь-яке нерівномірне можна отримати з допомогою рівномірного a b 2 21 xx x   a b 12 1221 xxx x    рівномірний розподіл рівномірний розподіл
  • 146.
    Генератор випадкових чиселв Паскалі Цілі числа в інтервалі [0,N]: var x: integer; ... x := random ( 100 ); { інтервал [0,99] } Дійсні числа в інтервалі [0,1] var x: real; ... x := random; { інтервал [0,1] }
  • 147.
    Випадкові числа Задача: заповнитипрямокутник 400 на 300 пікселів рівномірно точками випадкового кольору Як отримати випадкові координати точки? x := random ( 400 ); y := random ( 300 ); Як досягти рівномірності? забезпечується автоматично при використанні функції random Як отримати випадковий колір? Pen (1, random(256), random(256), random(256)); Point ( x, y );
  • 148.
    Програма 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 ); if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := True; end; until stop; end. випадкові координати випадковий колір вихід по клавіші Esc
  • 149.
    "4": Ввести зклавіатури координати кутів прямокутника і заповнити його точками випадкового кольору. "5": Заповнити трикутник точками випадкового кольору (рівномірно або нерівномірно). Підказка: візьміть рівнобедрений трикутник з кутом 45о. Завдання (100,100) (300,200)
  • 150.
    Програмування на мові Паскаль Тема13. Функції © К.Ю. Поляков, 2006-2007 Переклад: Н. Б. Мартинчук Р. М. Васильчик
  • 151.
    Функції Функція – цедопоміжний алгоритм (підпрограма), результатом роботи якої є деяке значення. Приклади: • обчислення , , • розрахунок значення по складених формулах • відповідь на запитання (просте число або ні?) Для чого? • для обчислення однакових розрахунків в різних місцях програми • для створення загальнодоступних бібліотек функцій xsin xxcos В чому відмінність від процедури??
  • 152.
    Функції Задача: скласти функцію,яка обчислює більше з двох значень, і навести приклад її використання Функція: формальні параметри function Max (a, b: integer): integer; begin if a > b then Max := a else Max := b; end. це результат функції
  • 153.
    Функції Особливості: • заголовок починаєтьсясловом function • формальні параметри описуються так само, як і для процедур • можна використовувати параметри-змінні • в кінці заголовка через двокрапку вказується тип результату • функції розміщуються ВИЩЕ основної програми Max (a, b: integer): integer;function function Max (a, b: integer): ;integer function qq( a, b: integer; x: real ): real;a, b: integer; x: real function Max ( a, b: integer): integer;var
  • 154.
    Функції Особливості: • можна оголошуватиі використовувати локальні змінні • значення, яке є результатом, записується в змінну, ім’я якої співпадає з назвою функції; оголошувати НЕ ПОТРІБНО: function Max (a, b: integer): integer; begin ... end; Max := a; function qq (a, b: integer): float; begin ... end; var x, y: float; В Delphi:! Result := a;
  • 155.
    Програма program qq; var a,b, max: integer; begin writeln(‘Введіть два числа'); read(a, b); max := Max ( a, b ); writeln(‘Найбільше число ', max ); end. function Max (a, b: integer): integer; begin ... end; c c c Імена змінних, функцій і процедур не повинні співпадати! ! фактичні параметри виклик функції
  • 156.
    Логічні функції Задача: скластифункцію, яка визначає, чи дійсно, що задане число – просте. Особливості: • відповідь – логічне значення (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 складене } Як краще??
  • 157.
    Логічні функції program qq; varN: integer; begin writeln(‘Ввести ціле число'); read(N); if Prime(N) then writeln(N, ' – просте число') else writeln(N, ' – складене число'); end. function Prime (N: integer): boolean; var count, i: integer; 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; виклик функції результат – логічне значення перебір тільки до N умова – це логічне значення
  • 158.
    Завдання "4": Скласти функцію,яка визначає суму всіх чисел від 1 до N і навести приклад її використання. Приклад: Ввести число: 100 сума = 5050 "5": Скласти функцію, яка визначає, скільки зерен попросив положити на N-ту клітку винахідник шахмат (на 1-шу – 1 зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …) Приклад: Ввести номер клітки: 28 На 28-ой клітці 134217728 зерен.
  • 159.
    Завдання (варіант 2) "4":Скласти функцію, яка визначає найбільший спільний дільник двох натуральних чисел і навести приклад її використання. Приклад: Ввести два числа: 14 21 НСД(14,21)=7 "5": Скласти функцію, яка обчислює синус як суму ряду (с точністю 0.001) Приклад: Ввести кут в градусах: 45 sin(45) = 0.707  !7!5!3 sin 753 xxx xx x в радіанах!