159
Програмування на мові Паскаль Тема 1. Вступ © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик

Pascal osnovu

  • Upload
    escuela

  • View
    113

  • Download
    1

Embed Size (px)

Citation preview

Програмування на

мові Паскаль

Тема 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

a5 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

badcax

)()(35

cbab

dcacz

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

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

nn

c

ba

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

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

які по модулю більші 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;

Алгоритм

початок

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

21

S

...24313

10

818

8

275

6

93

4

32

21

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

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

Як міняти колір?

(x1, y1)

(x2, y2)

Brush ( 1, c, c, c );

Fill ( ???, ??? );

сірий: R = G = B

Крок зміни c:1

255

Nhc

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

xxh

12 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

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;

Завдання

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

(0,0)

(0,0)

a

b

k – масштаб (довжина

зображення одиничного

відрізка на екрані)

xе = a + kx

yе = b - ky

Програма

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": Побудувати графік

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

1916

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

NN

якщо

якщо

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 xxx

a b

12

1221 xxxx

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

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

Цілі числа в інтервалі [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

sin753 xxx

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