159
Тема 1. Вступ Програмування на мові Паскаль

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

  • Upload
    morrie

  • View
    101

  • Download
    2

Embed Size (px)

DESCRIPTION

Програмування на мові Паскаль. Тема 1. Вступ. Алгоритм. Алгоритм – це чітко визначений план дій для виконавця. Властивості алгоритму дискретність : складається з окремих кроків (команд) зрозумілість : повинен включати тільки команди відомі для виконавця (які містяться в СКВ) - PowerPoint PPT Presentation

Citation preview

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

Тема 1. Вступ

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

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

Алгоритм

Властивості алгоритму• дискретність: складається з окремих кроків

(команд)• зрозумілість: повинен включати тільки команди

відомі для виконавця (які містяться в СКВ)• визначеність: при однакових вхідних даних завжди

видає один і той самий результат• скінченність: закінчується за скінчену кількість

кроків• масовість: може застосовуватися багатократно при

різних вихідних даних • коректність: видає правильне рішення при будь-

яких допустимих вихідних даних

Алгоритм – це чітко визначений план дій для виконавця.

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

Програма

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

програмування• набір команд для комп’ютера

Команда – це опис дій, які повинен виконати комп’ютер.

• звідки отримати вихідні дані?

• що потрібно з ними зробити?

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

Мови програмування

• Машинно-орієнтовані (низького рівня) – кожна команда відповідає одній команді процесора (асемблер)

• Мови високого рівня – наближені до реальної (англійської) мови, легше сприймаються людиною, не залежать від відповідного комп’ютера

• для навчання: Бейсик, ЛОГО, Паскаль• професійні: Сі, Фортран, Паскаль• для задач штучного інтелекту: Пролог,

ЛИСП• для Інтернету: JavaScript, Java, Perl, PHP,

ASP

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

Мова Паскаль

1970 – Ніклаус Вірт (Швейцарія)

• мова для навчання студентів

• розробка програм “зверху-вниз”

• різноманітні структури даних (масиви, структури, множини)

Підзадача1 Підзадача2 Підзадача3

1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3

Задача

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

З чого складається програма?

program <ім’я програми>;const …;{константи}var …; {змінні}

begin … {основна програма}end.

{ процедури і функції }

коментарі у фігурних дужках не опрацьовуються

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

З чого складається програма?

Константа – постійна величина, яка має ім’я.

Змінна – змінна величина, яка має ім’я (комірка пам’яті).

Процедура – додатковий алгоритм, який описує деякі дії (малювання кола).

Функція – додатковий алгоритм, для виконання обчислень (обчислення квадратного кореня, sin).

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

Імена програм, констант, змінних

Імена можуть містити• латинські букви (A-Z)

• цифри

• знак підкреслення _

великі і маленькі букви не розрізняються

Імена НЕ можуть містити• українські букви• пропуски• дужки, знаки +, =, !, ? та ін.

ім’я не може починатися з цифри

Які імена правильні?

AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B

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

Константи

const i2 = 45; { ціле число }

pi = 3.14; { дійсне число }

qq = 'Вася'; { рядок символів }

L = True; { логічна величина }

ціла і дробова частина відділяються крапкою

можна використовувати українські букви!

Може приймати два значення:• True (істина, “так")• False (хибність, "ні")

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

Змінні

Змінна – це величина, яка має ім’я, тип і значення. Значення змінної величини під час виконання програми може змінюватися.

Типи змінних:• integer { цілі }• real { дійсні }• char { один символ }• string { рядок }• boolean { логічні }

Оголошення змінних (виділення пам’яті):

var a, b: integer;Q: real;s1, s2: string;

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

Як змінюється значення змінної?

Оператор – це команда мови програмування високого рівня.

Оператор присвоєння служить для зміни значення змінної.

Приклад:

program qq;var a, b: integer;begin a := 5; b := a + 2; a := (a + 2)*(b – 3);end.

a? 55

b? 5+27

a5 7*428

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

Оператор присвоєння

Загальна структура:

<ім’я змінної> := <вираз>;

Арифметичні вирази можуть містити• константи• імена змінних• знаки арифметичних дій: + - * / div mod

• виклики функцій• круглі дужки ( )

множення ділення ділення націло

остача від ділення

Page 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.

Які оператори неправильні?

ім’я змінної повинно знаходитися зліва від знака :=

ціла і дробова частина відділяються крапкою

неможливо записати дійсне значення в цілу змінну

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

Ручна прокрутка програми

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

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

Порядок виконання операцій

• обчислення виразів у дужках• множення, ділення, div, mod зліва направо• додаванні і віднімання зліва направо

2 3 5 4 1 7 8 6 9z := (5*a*c+3*(c-d))/a*(b-c)/ b;

)2)((

)(5 22

addc

badcax

)(

)(35cb

ab

dcacz

2 6 3 4 7 5 1 12 8 11 10 9x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));

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

Додавання двох чисел

Задача. Ввести два цілих числа і вивести на екран їх суму.

Найпростіше розв’язання:program qq;var a, b, c: integer;begin read ( a, b ); c := a + b; writeln ( c );end.

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

Оператор введення

read ( a ); { ввести значення змінної a}

read ( a, b ); { ввести значення змінних a і b}

Як вводяться два числа?

через пропуск:

25 30 через Enter:

25 30

a25b30

a25b30

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

Оператор виведення

write ( a ); { вивести значення змінної a}

writeln ( a ); { вивести значення змінної a і перейти на новий рядок}

writeln ( ‘Привіт!' ); { виведення тексту}

writeln ( ‘Відповідь: ', c ); {виведення тексту і значення змінної c}

writeln ( a, '+', b, '=', c );

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

Формати виведення

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<

всього символів

всього символів

в дробовій частині

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

Повний розв’язок

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

це виводить комп'ютер

це вводить користувач

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

Блок-схема лінійного алгоритму

початок

кінець

c := a + b;

ввести a, b

вивести c

блок «початок»

блок «ввести»

блок «процес»

блок «вивести»

блок «кінець»

Page 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

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

Тема 2. Розгалуження

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

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

Алгоритми розгалуження

Задача. Ввести два цілих числа і вивести на екран більше з них.

Ідея розв’язання: потрібно вивести на екран перше число, якщо воно більше другого, або друге, якщо воно більше першого.

Особливості: дії виконавця залежать від деяких умов (якщо … інакше …).

Алгоритми, в яких послідовність кроків залежить від виконання деяких умов, називаються розгалуженими.

Алгоритми, в яких послідовність кроків залежить від виконання деяких умов, називаються розгалуженими.

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

Варіант 1. Блок-схема

початок

max:= a;

ввести a,b

вивести max

a > b?

max:= b;

кінець

так ні повна форма розгалуження

блок «логічний вираз»

Якщо a = b??

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

Варіант 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;

повна форма умовного оператора

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

Умовний оператор

if <умова> then begin {що робити, якщо умова правильна} end else begin {що робити, якщо умова неправильна} end;

Особливості:• перед else НЕ ставиться крапка з комою

• друга частина (else …) може бути відсутня (неповна форма)

• якщо в блоці один оператор, можна забрати слова begin і end

Page 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

beginend

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

Варіант 2. Блок-схема

неповна форма розгалуження

початок

max:= a;

ввести a,b

вивести max

max:= b;

кінець

так ніb > a?

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

Варіант 2. Програма

program qq;var a, b, max: integer;begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := a; if b > a then

writeln (‘Більше число ', max);end.

max := b;

неповна форма умовного оператора

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

Варіант 2Б. Програма

program qq;var a, b, max: integer;begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := b; if ??? then ???

writeln (‘Більше число ', max);end.

max := a;

a > b

Page 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 := bend

a := b if b >= a then b := a;

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

Завдання

"4": Ввести три числа і знайти найбільше з них. Приклад:

Ввести три числа:4 15 9Найбільше число 15

"5": Ввести п’ять чисел і знайти найбільше з них. Приклад:

Ввести п’ять чисел:4 15 9 56 4Найбільше число 56

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

Тема 3. Складені умови

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

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

Складені умови

Задача. Фірма набирає співробітників від 25 до 40 років включно. Ввести вік людини і визначити, чи підходить вона фірмі (вивести відповідь “підходить” або “не підходить”).

Особливості: потрібно перевірити, виконання двох умов одночасно.

Чи можна розв’язати відомими методами??

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

Варіант 1. Алгоритм

початок

ввести x

‘підходить'

кінець

так ніx >= 25?

так ніx <= 40?

‘не підходить' ‘не підходить'

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

Варіант 1. Програма

program qq;var x: integer;begin writeln(‘Ввести вік'); read ( x ); if x >= 25 then if x <= 40 then writeln (‘Підходить') else writeln (‘Не підходить') else writeln (‘Не підходить');end.

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

Варіант 2. Алгоритм

початок

ввести x

‘підходить'

так ніx >= 25 і

x <= 40?

‘не підходить'

кінець

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

Варіант 2. Програма

program qq;var x: integer;begin writeln(‘Ввести вік'); read ( x ); if (x >= 25) and (x <= 40) then writeln (‘Підходить') else writeln (‘Не підходить')end.

складена умова

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

Складена умова

Складена умова – це умова, яка складається з декількох простих умов (відношень), зв’язаних з допомогою логічних операцій:•not – НІ (заперечення, інверсія)

•and – І (логічне множення, кон'юнкція, одночасне виконання умов)

•or – АБО (логічне додавання, диз'юнкція, виконання хоча б одної з умов)

•xor – виключаюче АБО (виконання тільки одної з двох умов, але не обох)

Прості умови (відношення)

< <= > >= = <>

дорівнює не дорівнює

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

Складена умова

Порядок виконання• вирази в дужках• not• and• or, xor• <, <=, >, >=, =, <>

Особливості – кожна з простих умов обов'язково береться в дужки.

Приклад 4 1 6 2 5 3 if not (a > b) or (c <> d) and (b <> a) then begin ...end

Page 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

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

Завдання

"4": Ввести номер місяця і вивести назву пори року. Приклад:

Ввести номер місяця:4весна

"5": Ввести вік людини (від 1 до 150 років) и вивести його разом з наступним слово “рік”, “роки" або “років".

Приклад:

Ввести вік: Ввести вік:24 57Вам 24 роки Вам 57 років

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

Тема 4. Цикли

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

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

Цикли

Цикл – це багатократне виконання однакової послідовності дій.

• цикл з відомою кількістю кроків• цикл з невідомою кількістю кроків (цикл з умовою)

Задача. Вивести на екран квадрати і куби цілих чисел від 1 до 8 (від a до b).

Особливості: однакові дії виконуються 8 раз.

Чи можна розв’язати відомими методами??

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

Алгоритм

початок

i, i2, i3

кінецьні

так

i <= 8?

i := 1;

i := i + 1;

i2 := i * i;i3 := i2 * i;

задати початкове значення змінної циклу

перевірити, чи все виконали

обчислити квадрат і куб

вивести результат

перейти до наступного i

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

Алгоритм (з блоком "цикл")

початок

i, i2, i3

кінець

i2 := i * i;i3 := i2 * i;

i := 1,8

блок "цикл"

тіло циклу

Page 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.

змінна циклу

початкове значення

кінцеве значення

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

Цикл з зменшенням змінної

Задача. Вивести на екран квадрати і куби цілих чисел від 8 до 1 (в зворотному порядку).

Особливості: змінна циклу повинна зменшуватися.

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

... for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; ...

downto

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

Цикл з змінною

for <змінна> := <початкове значення> to <кінцеве значення> do begin {тіло циклу} end;

Збільшення змінної на 1:

for <змінна> := <початкове значення> downto <кінцеве значення> do begin {тіло циклу} end;

Зменшення змінної на 1:

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

Цикл з змінною

Особливості:

• змінна повинна бути тільки цілою (integer)

• крок зміни змінної циклу завжди рівний 1 (to) або -1

(downto)• якщо в тілі циклу тільки один оператор, слова begin і end можна не писати:

• якщо кінцеве значення менше початкового, цикл (to) не виконується ні разу (перевірка умови в початку циклу, цикл з передумовою)

for i:=1 to 8 do writeln(‘Привіт');

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

Цикл з змінною

Особливості:• в тілі циклу не дозволяється змінювати змінну циклу

(чому?)• при зміні початкового і кінцевого значення всередині

циклу кількість кроків не змінюється:

n := 8;for i:=1 to n do begin writeln('Привіт'); n := n + 1;end;

немає зациклювання

Page 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

НЕ ДОКУМЕНТОВАНО

Page 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

Page 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

Що погано??

Page 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;

Page 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

Page 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

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

Тема 5. Цикли з умовою

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

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

Цикл з невідомою кількістю кроків

Приклад: Відрізати поліно від колоди. Скільки разів потрібно зробити рух пилкою?

Задача: Ввести ціле число (<2000000) і визначити кількість цифр у ньому.

Ідея розв’язання: Відрізаємо послідовно останню цифру, збільшуємо лічильник.

Проблема: Невідомо, скільки кроків потрібно зробити.

Розв’язання: Потрібно зупинитися, коли n = 0, тобто

потрібно робити “поки n <> 0".

n count

123 0

12 1

1 2

0 3

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

Алгоритм

початок

count

кінець

ні

так

n <> 0?

count := 0;

count := count + 1; n := n div 10;

обнулити лічильник цифр

ввести n

виконувати

"поки n <> 0"

Page 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"

Що погано??

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

Цикл с умовою

while <умова> do begin {тіло циклу} end;

Особливості:• можна використовувати складені умови:

• якщо в тілі циклу тільки один оператор, слова begin і end можна не писати:

while (a<b) and (b<c) do begin {тіло циклу}end;

while a < b do a := a + 1;

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

Цикл з умовою

Особливості:• умова перевіряється кожен раз при вході в цикл• якщо умова на вході в цикл хибна, цикл не

виконується жодного разу

• якщо умова ніколи не стане хибною, програма зациклиться

a := 4; b := 6;while a > b do a := a – b;

a := 4; b := 6;while a < b do d := a + b;

Page 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;

зациклювання

Page 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 можлива завжди.

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

Завдання

"4": Ввести ціле число і знайти суму його цифр. Приклад:

Ввести ціле число:1234Сума цифр числа 1234 рівна 10.

"5": Ввести ціле число і визначити, чи правда, що в його записі є дві однакові цифри.

Приклад:

Ввести ціле число: Ввести ціле число: 1234 1224 Ні. Так.

Page 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

nn c

ba

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

Послідовності

Задача: знайти суму всіх елементів послідовності,

які по модулю більші 0,001:

...,32

5,

16

4,

8

3,

4

2,

2

1,1

...32

5

16

4

8

3

4

2

2

11 S

Елемент послідовності (починаючи з №2):

c

bza

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;

Page 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;

перший елемент

новий елемент

зміни

Перестановка??

Page 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.

перехід до наступного

доданка

початкове значення

збільшення суми

розрахунок елемента послідовності

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

Завдання

"4": Знайти суму елементів послідовності з точністю 0,001:

Відповідь:

S = 1.157

"5": Знайти суму елементів послідовності з точністю 0,001:

Відповідь:S = 1.220

...819

8

277

6

95

4

33

21

S

...24313

10

818

8

275

6

93

4

32

21

S

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

Цикл з післяумовою

Задача: Ввести ціле додатне число (<2000000) і визначити кількість цифр в ньому.

Проблема: Як не дати ввести від'ємне число або нуль?

Розв’язання: Якщо вводиться неправильне число, повернутися назад до введення даних (цикл!).

Особливості: Один раз тіло циклу потрібно виконати в будь-якому випадку => перевірку умови циклу потрібно виконувати в кінці циклу (цикл с післяумовою).

Цикл с післяумовою – це цикл, в якому перевірка умови виконується в кінці циклу.

Цикл с післяумовою – це цикл, в якому перевірка умови виконується в кінці циклу.

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

Цикл з післяумовою: алгоритм

початок

кінець

так

ніn > 0?

тіло циклу

умова ВИХОДУ

блок "типовий процес"

ввести n

основний алгоритм

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

Програма

program qq;var n: integer;begin

repeat writeln(‘Ввести додатне число'); read(n); until n > 0;

... { основний алгоритм }end.

until n > 0;умова ВИХОДУ

Особливості: • тіло циклу завжди виконується хоча б один раз

• після слова until ("до тих пір, поки не…") ставиться умова ВИХОДУ із циклу

Page 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;

зациклення

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

Завдання (з захистом від неправильного введення)

"4": Ввести натуральне число і визначити, чи правда що сума його цифр дорівнює 10.

Приклад:

Ввести число >= 0: Введіть число >= 0: -234 1233 Потрібно додатне число. Ні Ввести число >= 0: 1234 Так

"5": Ввести натуральне число і визначити, які цифри зустрічаються декілька разів.

Приклад:

Введіть число >= 0: Введіть число >= 0:2323 1234Повторяються: 2, 3 Немає повторів.

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

Тема 6. Оператор вибору

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

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

Оператор вибору

Задача: Ввести номер місяця і вивести кількість днів в цьому місяці.

Розв’язання: Кількість днів у місяцях:28 днів – 2 (лютий)30 днів – 4 (квітень), 6 (червень), 9 (вересень), 11 (листопад)31 день – 1 (січень), 3 (березень), 5 (травень), 7 (липень), 8 (серпень), 10 (жовтень), 12 (грудень)

Особливості: Вибір не з двох, а з декількох варіантів в залежності від номера місяця.

Чи можна розв’язати відомими методами??

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

Алгоритм

початок

кінець

оператор вибору

жоден з варіантів

не підійшов

ввести M

так

ні

M = 1? D := 31;

ні

M = 2? D := 28;так

ні

M = 12? D := 31;так

вивести Dпомилка

Page 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.

жоден варіант не підійшов

Page 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;

Page 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;

Page 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;

перечислення

діапазон

суміш

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

Що неправильно?

case a of 2: begin a := b; 4: a := c;end;

case a of 2: a := b 4: a := cend;

;

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;

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

Завдання (з захистом від неправильного введення)

"4": Ввести номер місяця і вивести кількість днів в ньому, а також кількість помилок при введенні.

Приклад: Введіть номер місяця: Введіть номер місяця: -2 2 Введіть номер місяця: В цьому місяці 28 днів. 11 Ви вводили неправильно 0 раз. В цьому місяці 30 днів. Ви вводили неправильно 1 раз.

"5": Ввести номер місяця і номер дня, вивести кількість днів, які залишилися до Нового року.

Приклад:Ввести номер місяця:12Ввести день:25

До Нового року залишилося 6 днів.

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

Тема 7. Графіка

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

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

Система координат

(0,0)

(x,y)

X

Y

x

y

Page 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

Page 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);

Page 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)

Як відмінити заливку??

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

Текст

TextColor (0, 0, 255);

Brush (1, 255, 255, 0);

Font (20, 30, 600);

MoveTo (x, y);

writeln ('Привіт!');

Привіт!

(x, y)розмір

10 пікселівкут

поворотунасиченість: 400 – нормальний 600 – жирний 30о

Page 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.

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

Завдання

"4": "Жабка"

"5": "Корона"

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

Штриховка

(x1, y1)

(x2, y2)

N ліній (N=5)

h

112

N

xxh

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

Page 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;

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

Штриховка

(x1, y1)

(x2, y2) (x3, y2)

a

h

123

N

xxh12 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

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

Штриховка

(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);

...

112

N

xxhx 1

12

N

yyhy

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;

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

Завдання

"4": Ввести з клавіатури кількість ліній штриховки і побудувати фігуру, заливши всі області різним кольором.

"5": Ввести з клавіатури кількість кіл і побудувати фігуру, заливши всі області різними кольорами.

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

Тема 8. Графіки функцій

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

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

Побудова графіків функцій

Задача: побудувати графік функції y = 3 sin(x) на інтервалі від 0 до 2π.

Аналіз: максимальне значення ymax = 3 при x = π/2

мінімальне значення ymin = -3 при x = 3π/2

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

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

Перетворення координат

(x,y)

X

Y

x

y

Математична система координат

Екранна система координат (пікселі)

(xе,yе)xе

(0,0)

(0,0)

a

b

k – масштаб (довжина зображення одиничного відрізка на екрані)

xе = a + kx

yе = b - ky

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

Програма

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. Що погано??

Page 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.

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

Завдання

"4": Побудувати графік

функції y = x2 на інтервалі

[-3,3].

"5": Побудувати графік

функції (еліпс)

1916

22

yx

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

Тема 9. Процедури

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

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

Процедури

Задача: Побудувати фігуру:

Особливості: Три схожі фігури.подібності: розміри, кут поворотувідмінності: координати, колір

Чи можна розв’язати відомими методами??

Скільки координат потрібно задати??

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

Процедури

Процедура – це допоміжний алгоритм, який призначений для виконання деяких дій.

Примітка:• виконання однакових дій в різних місцях програми• розбивка програми (або іншої процедури) на

підзадачі для кращого сприймання

Підзадача1 Підзадача2 Підзадача3

1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3

Задача

Page 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;

заголовок

тіло процедури

координати

колір

параметри

Page 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;

формальні параметри

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

Процедури

Особливості:• всі процедури розміщені вище основної програми• в заголовку процедури перераховуються

формальні параметри, вони позначаються іменами, оскільки можуть змінюватися

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

вирази) в тому ж порядку

procedure Tr( x, y, r, g, b: integer);

Tr (200, 100, 0, 255, 0);

x y r g b

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

Процедури

Особливості:• для кожного формального параметра після двокрапки

вказується його тип

• якщо однотипні параметри стоять поряд, їх перераховують через кому

• всередині процедури параметри використовуються так само, як і змінні

procedure A (x: real; y: integer; z: real);

procedure A (x, z: real; y, k, l: integer);

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

Процедури

Особливості:• в процедурі можна оголошувати додаткові локальні

змінні, інші процедури не мають до них доступу

program qq;

procedure A(x, y: integer); var a, b: real; begin a := (x + y)/6; ... end;begin ... end.

локальні змінні

Page 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

Page 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

параметри можуть змінюватися

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

Задания

"4": Використовуючи процедуру, побудувати фігуру.

"5": Використовуючи процедуру, побудувати фігуру.

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

Тема 10. Рекурсія

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

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

Рекурсивні об’єкти

Рекурсивний об’єкт – це об’єкт, визначений через один

або декілька таких же об’єктів.

У попа була собака, він її любив.Вона з’їла кусок м’яса, він її убив.В ямку закопав, надпис написав:

У попа була собака, він її любив.Вона з’їла кусок м’яса, він її убив.В ямку закопав, надпис написав:

Казка про попа і собакуКазка про попа і собаку

Приклади: Казка про попа і собаку:

Факторіал:

.1,)!1(

,1,1!

NNN

NN

якщо

якщо

12)1(!

1234!34!4

123!23!3,12!12!2,1!1

NNN

Малюнок з рекурсією:

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

Дерево Піфагора

Дерево Піфагора з N рівнів – це стовбур і відходячі від нього симетрично два дерева Піфагора з N-1 рівнем, такі що довжина їх стовбурів в 2 рази менша і кут між ними рівний 90o.

6 рівнів:

Як довести, що це рекурсивна фігура??

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

Дерево Піфагора

Особливості:• коли зупинитися?

• дерева мають різний нахил

коли кількість рівнів, що залишилися стане рівним нулю!

(x1, y1)

(x0, y0)

α

α+45o

α-45o

L

x1 = x0 + L·cos(α)

y1 = y0 – L·sin(α)

нахил "дочірніх" дерев

α + π/4

α – π/4

Page 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

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

Page 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);

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

"4": Використовуючи рекурсивну процедуру, побудувати фігуру:

"5": Використовуючи рекурсивну процедуру, побудувати фігуру :

Задания

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

Тема 11. Анімація

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

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

Анімація

Анімація (англ. animation) – оживлення зображення на екрані.

Задача: всередині синього квадрата 400 на 400 пікселів зліва направо рухається жовтий квадрат 20 на 20 пікселів. Програма зупиняється, якщо натиснута клавіша Esc або квадрат дійшов до границі синьої області.

Проблема: як зобразити переміщення об’єкта на екрані?

Прив’язка: розміщення об’єкта задається координатами (x,y)

Принцип анімації:1. малюємо об’єкт в точці (x,y)2. затримка на декілька мілісекунд3. затираємо об’єкт4. змінюємо координати (x,y) 5. переходимо до кроку 1

Page 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;

Page 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, якщо потрібно зупинитися

запуск циклу

Page 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)?

малюємо: колір пензлика – жовтий

стираємо: колір пензлика – синій

тільки заливка!

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

Повна програма

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 мс

відключити границю

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

"4": Два квадрати рухаються в протилежних напрямках:

"5": Два квадрати рухаються в протилежних напрямках і відбиваються від стінок синього квадрата:

Завдання

Page 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;

якщо було натиснуто на клавішу, …

Page 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;

Що погано??

процедура

основний цикл

опрацювання подій

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

Як забрати блимання?

Проблема: навіть якщо не натиснута жодна клавіша, квадрат перемальовується через кожні 20 мс (блимання!)

Що бажається: не перемальовувати квадрат, якщо не було ніяких подій

Розв’язання: намалювати квадрат і чекати подію

Нова проблема: як чекати подію?

Розв’язання нової проблеми: пустий цикл "поки не трапилася подія, нічого не робити":

while not IsEvent do;

Page 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;

процедура

малюємо квадрат

чекаємо подію

тільки тепер стираємо

Що можна покращити??

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

"4": Квадрат рухається при натисненні стрілок, проте не може вийти за границі синього квадрата:

"5": Квадрат неперервно рухається, при натисненні стрілок міняє напрям і відбивається від стінок синього квадрата:

Завдання

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

Обертання

Задача: зобразити модель обертання Землі навколо Сонця.

Проблема: рух по колу, як змінюються координати?

Розв’язання: використовувати в якості незалежної змінної (змінювати в циклі) кут повороту α

(x0, y0)

α

L

(x, y)

x = x0 + L·cos(α)

y = y0 – L·sin(α)

Page 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)

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

Константи і змінні

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;

Page 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;

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

"4": Зобразити модель Сонця з двома планетами, які обертаються в протилежних напрямках:

"5": Зобразити модель системи Сонце-Земля-Місяць:

Завдання

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

Тема 12. Випадкові числа

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

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

Випадкові числа

Випадкові події: всюди…• підкидання монети (“герб" або “копійка")• падіння снігу• броунівський рух• перешкоди при телефонному зв’язку• шум радіоефіру

Випадкові числа – це така послідовність чисел, для якої неможливо передбачити наступне число, якщо навіть відомі попередні.

Проблема: як одержати на комп’ютері?

Можливі розв’язання:• використовувати зовнішнє джерело шумових перешкод• з допомогою математичних перетворень

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

Псевдовипадкові числа

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

Приклади:

1. Випадкові цілі числа [0,m) (лінійний конгруентний метод)

2. Випадкові дійсні числа [0,1]

Література:

Д. Кнут, Мистецтво програмування для ЕОМ, т.2.

1073741823mod)1234516807( 1 nn xx

knn xx )( 1дробова частина числа

a, c, m – цілі числаmcxax nn mod)( 1

просте число 230-1

наприклад, k = 5

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

Розподіл випадкових чисел

Модель: сніжинки падають на відрізок [a,b]

a b a b

розподіл

рівномірний нерівномірний

Скільки може бути різних розподілів ??

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

Розподіл випадкових чисел

Особливості: • розподіл – це характеристика всієї послідовності, а не одного

числа• рівномірний розподіл один, комп’ютерні датчики

(псевдо)випадкових чисел дають рівномірний розподіл• нерівномірних – багато• будь-яке нерівномірне можна отримати з допомогою

рівномірного

a b

221 xx

x

a b

121221 xxx

x

рівномірний розподілрівномірний розподіл

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

Генератор випадкових чисел в Паскалі

Цілі числа в інтервалі [0,N]: var x: integer; ... x := random ( 100 ); { інтервал [0,99] }

Дійсні числа в інтервалі [0,1] var x: real; ... x := random; { інтервал [0,1] }

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

Випадкові числа

Задача: заповнити прямокутник 400 на 300 пікселів рівномірно точками випадкового кольору

Як отримати випадкові координати точки?x := random ( 400 );y := random ( 300 );

Як досягти рівномірності?

забезпечується автоматично при використанні функції random

Як отримати випадковий колір?Pen (1, random(256), random(256), random(256));Point ( x, y );

Page 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

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

"4": Ввести з клавіатури координати кутів прямокутника і заповнити його точками випадкового кольору.

"5": Заповнити трикутник точками випадкового кольору (рівномірно або нерівномірно).

Підказка: візьміть рівнобедрений трикутник з кутом 45о.

Завдання

(100,100)

(300,200)

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

Тема 13. Функції

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

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

Функції

Функція – це допоміжний алгоритм (підпрограма), результатом роботи якої є деяке значення.

Приклади: • обчислення , ,• розрахунок значення по складених формулах• відповідь на запитання (просте число або ні?)

Для чого? • для обчислення однакових розрахунків в різних

місцях програми• для створення загальнодоступних бібліотек функцій

xsin xxcos

В чому відмінність від процедури??

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

Функції

Задача: скласти функцію, яка обчислює більше з двох значень, і навести приклад її використання

Функція:

формальні параметри

function Max (a, b: integer): integer;begin if a > b then Max := a

else Max := b; end. це результат

функції

Page 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

Page 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;

Page 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;

cc

c

Імена змінних, функцій і процедур не повинні співпадати!

!

фактичні параметри

виклик функції

Page 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 складене }

Як краще??

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

Логічні функції

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

умова – це логічне значення

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

Завдання

"4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і навести приклад її використання.

Приклад:

Ввести число: 100 сума = 5050

"5": Скласти функцію, яка визначає, скільки зерен попросив положити на N-ту клітку винахідник шахмат (на 1-шу – 1 зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …)

Приклад:

Ввести номер клітки: 28 На 28-ой клітці 134217728 зерен.

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

Завдання (варіант 2)

"4": Скласти функцію, яка визначає найбільший спільний дільник двох натуральних чисел і навести приклад її використання.

Приклад:

Ввести два числа: 14 21 НСД(14,21)=7

"5": Скласти функцію, яка обчислює синус як суму ряду (с точністю 0.001)

Приклад:

Ввести кут в градусах: 45 sin(45) = 0.707

!7!5!3

sin753 xxx

xx x в радіанах!