Зразок програми на C++, величини та ідентифікатори, оголошення змінних та констант, оператор присвоєння, введення і виведення даних з використанням бібліотеки iostream, арифметичні оператори і вирази, інкремент і декремент, складені оператори присвоєння
2. Алгоритм
Властивості алгоритму
• дискретність: складається з окремих кроків
(команд)
• зрозумілість: повинен включати тільки команди
відомі для виконавця (які містяться в СКВ)
• визначеність: при однакових вхідних даних завжди
видає один і той самий результат
• скінченність: закінчується за скінчену кількість
кроків
• масовість: може застосовуватися багатократно при
різних вихідних даних
• коректність: видає правильне рішення при будь-
яких допустимих вихідних даних
Алгоритм – це чітко визначений план дій для
виконавця.
3. Програма
Програма – це
• алгоритм, записаний на будь-якій мові
програмування
• набір команд для комп’ютера
Команда – це опис дій, які повинен
виконати комп’ютер.
• звідки отримати вихідні дані?
• що потрібно з ними зробити?
4. Мови програмування
• Машинно-орієнтовані (низького рівня) – кожна
команда відповідає одній команді процесора
(асемблер)
• Мови високого рівня – наближені до реальної
(англійської) мови, легше сприймаються
людиною, не залежать від відповідного
комп’ютера
• для навчання: Бейсик, ЛОГО, Паскаль
• професійні: Сі, Фортран, Паскаль
• для задач штучного інтелекту: Пролог,
ЛИСП
• для Інтернету: JavaScript, Java, Perl, PHP,
ASP
5. Мова Паскаль
1970 – Ніклаус Вірт (Швейцарія)
• мова для навчання студентів
• розробка програм “зверху-вниз”
• різноманітні структури даних (масиви,
структури, множини)
Підзадача1 Підзадача2 Підзадача3
1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3
Задача
6. З чого складається програма?
program <ім’я програми>;
const …;{константи}
var …; {змінні}
begin
… {основна програма}
end.
{ процедури і функції }
коментарі у фігурних дужках не
опрацьовуються
7. З чого складається програма?
Константа – постійна величина, яка має
ім’я.
Змінна – змінна величина, яка має ім’я
(комірка пам’яті).
Процедура – додатковий алгоритм, який
описує деякі дії (малювання кола).
Функція – додатковий алгоритм, для
виконання обчислень (обчислення
квадратного кореня, sin).
8. Імена програм, констант, змінних
Імена можуть містити
• латинські букви (A-Z)
• цифри
• знак підкреслення _
великі і маленькі букви не розрізняються
Імена НЕ можуть містити
• українські букви
• пропуски
• дужки, знаки +, =, !, ? та ін.
ім’я не може починатися з цифри
Які імена правильні?
AXby R&B 4Wheel Вася “PesBarbos”
TU154 [QuQu] _ABBA A+B
9. Константи
const
i2 = 45; { ціле число }
pi = 3.14; { дійсне число }
qq = 'Вася'; { рядок символів }
L = True; { логічна величина }
ціла і дробова частина відділяються крапкою
можна використовувати українські букви!
Може приймати два значення:
• True (істина, “так")
• False (хибність, "ні")
10. Змінні
Змінна – це величина, яка має ім’я, тип і значення.
Значення змінної величини під час виконання
програми може змінюватися.
Типи змінних:
• integer { цілі }
• real { дійсні }
• char { один символ }
• string { рядок }
• boolean { логічні }
Оголошення змінних (виділення пам’яті):
var a, b: integer;
Q: real;
s1, s2: string;
11. Як змінюється значення змінної?
Оператор – це команда мови програмування високого
рівня.
Оператор присвоєння служить для зміни значення
змінної.
Приклад:
program qq;
var a, b: integer;
begin
a := 5;
b := a + 2;
a := (a + 2)*(b – 3);
end.
a
? 55
b
? 5+27
a
5 7*428
12. Оператор присвоєння
Загальна структура:
<ім’я змінної> := <вираз>;
Арифметичні вирази можуть містити
• константи
• імена змінних
• знаки арифметичних дій:
+ - * / div mod
• виклики функцій
• круглі дужки ( )
множення ділення ділення
націло
остача від
ділення
13. program qq;
var a, b: integer;
x, y: real;
begin
a := 5;
10 := x;
y := 7,8;
b := 2.5;
x := 2*(a + y);
a := b + x;
end.
Які оператори неправильні?
ім’я змінної повинно
знаходитися зліва від знака :=
ціла і дробова частина
відділяються крапкою
неможливо записати дійсне
значення в цілу змінну
14. Ручна прокрутка програми
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
15. Порядок виконання операцій
• обчислення виразів у дужках
• множення, ділення, div, mod зліва направо
• додаванні і віднімання зліва направо
2 3 5 4 1 7 8 6 9
z := (5*a*c+3*(c-d))/a*(b-c)/ b;
)2)((
)(5 22
addc
badca
x
−+
+−+
=
)(
)(35
cb
ab
dcac
z −
−+
=
2 6 3 4 7 5 1 12 8 11 10 9
x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));
16. Додавання двох чисел
Задача. Ввести два цілих числа і вивести на
екран їх суму.
Найпростіше розв’язання:
program qq;
var a, b, c: integer;
begin
read ( a, b );
c := a + b;
writeln ( c );
end.
17. Оператор введення
read ( a ); { ввести значення
змінної a}
read ( a, b ); { ввести значення
змінних a і b}
Як вводяться два числа?
через пропуск:
25 30
через Enter:
25
30
a25
b30
a25
b30
18. Оператор виведення
write ( a ); { вивести значення
змінної a}
writeln ( a ); { вивести значення
змінної a і перейти на
новий рядок}
writeln ( ‘Привіт!' ); { виведення
тексту}
writeln ( ‘Відповідь: ', c );
{виведення тексту і значення
змінної c}
writeln ( a, '+', b, '=', c );
19. Формати виведення
program qq;
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<
всього
символів
всього
символів
в
дробовій
частині
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
це виводить комп'ютер
це вводить користувач
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
24. Алгоритми розгалуження
Задача. Ввести два цілих числа і вивести на екран
більше з них.
Ідея розв’язання: потрібно вивести на екран перше
число, якщо воно більше другого, або друге, якщо воно
більше першого.
Особливості: дії виконавця залежать від деяких умов
(якщо … інакше …).
Алгоритми, в яких послідовність кроків залежить від
виконання деяких умов, називаються розгалуженими.
Алгоритми, в яких послідовність кроків залежить від
виконання деяких умов, називаються розгалуженими.
25. Варіант 1. Блок-схема
початок
max:= a;
ввести a,b
вивести max
a > b?
max:= b;
кінець
так ні повна форма
розгалуження
блок «логічний
вираз»
Якщо a = b??
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;
повна форма
умовного
оператора
27. Умовний оператор
if <умова> then begin
{що робити, якщо умова правильна}
end
else begin
{що робити, якщо умова неправильна}
end;
Особливості:
• перед else НЕ ставиться крапка з комою
• друга частина (else …) може бути відсутня (неповна
форма)
• якщо в блоці один оператор, можна забрати слова
begin і end
28. Що неправильно?
if a > b then begin
a := b;
end
else
b := a;
end;
if a > b then begin
a := b;
else begin
b := a;
end;
if a > b then begin
a := b;
end;
else begin
b := a;
end;
if a > b then begin
a := b;
end
else b > a begin
b := a;
end;
begin
end
begin
end
29. Варіант 2. Блок-схема
неповна форма
розгалуження
початок
max:= a;
ввести a,b
вивести max
max:= b;
кінець
так ні
b > a?
30. Варіант 2. Програма
program qq;
var a, b, max: integer;
begin
writeln(‘Ввести два цілих числа');
read ( a, b );
max := a;
if b > a then
writeln (‘Більше число ', max);
end.
max := b;
неповна форма
умовного
оператора
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
32. Що неправильно?
if a > b then begin
a := b;
else b := a;
if a > b then begin
a := b;
end;
else b := a;
if a > b then
else begin
b := a;
end;
if a > b then
a := b;
else b := a; end;
a := b
end
a := b if b >= a then
b := a;
33. Завдання
"4": Ввести три числа і знайти найбільше з них.
Приклад:
Ввести три числа:
4 15 9
Найбільше число 15
"5": Ввести п’ять чисел і знайти найбільше з них.
Приклад:
Ввести п’ять чисел:
4 15 9 56 4
Найбільше число 56
34. Складені умови
Задача. Фірма набирає співробітників від 25 до 40 років
включно. Ввести вік людини і визначити, чи підходить
вона фірмі (вивести відповідь “підходить” або “не
підходить”).
Особливості: потрібно перевірити, виконання двох умов
одночасно.
Чи можна розв’язати відомими методами??
36. Варіант 1. Програма
program qq;
var x: integer;
begin
writeln(‘Ввести вік');
read ( x );
if x >= 25 then
if x <= 40 then
writeln (‘Підходить')
else writeln (‘Не підходить')
else
writeln (‘Не підходить');
end.
38. Варіант 2. Програма
program qq;
var x: integer;
begin
writeln(‘Ввести вік');
read ( x );
if (x >= 25) and (x <= 40) then
writeln (‘Підходить')
else writeln (‘Не підходить')
end.
складена
умова
39. Складена умова
Складена умова – це умова, яка складається з декількох
простих умов (відношень), зв’язаних з допомогою
логічних операцій:
• not – НІ (заперечення, інверсія)
• and – І (логічне множення, кон'юнкція,
одночасне виконання умов)
• or – АБО (логічне додавання, диз'юнкція,
виконання хоча б одної з умов)
• xor – виключаюче АБО (виконання тільки одної з
двох умов, але не обох)
Прості умови (відношення)
< <= > >= = <>
дорівнює не дорівнює
40. Складена умова
Порядок виконання
• вирази в дужках
• not
• and
• or, xor
• <, <=, >, >=, =, <>
Особливості – кожна з простих умов обов'язково
береться в дужки.
Приклад
4 1 6 2 5 3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
41. Істинне чи хибне при 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
42. Завдання
"4": Ввести номер місяця і вивести назву пори року.
Приклад:
Ввести номер місяця:
4
весна
"5": Ввести вік людини (від 1 до 150 років) и вивести
його разом з наступним слово “рік”, “роки" або
“років".
Приклад:
Ввести вік: Ввести вік:
24 57
Вам 24 роки Вам 57 років
43. Оператор вибору
Задача: Ввести номер місяця і вивести кількість
днів в цьому місяці.
Розв’язання: Кількість днів у місяцях:
28 днів – 2 (лютий)
30 днів – 4 (квітень), 6 (червень), 9 (вересень),
11 (листопад)
31 день – 1 (січень), 3 (березень), 5 (травень),
7 (липень), 8 (серпень), 10 (жовтень),
12 (грудень)
Особливості: Вибір не з двох, а з декількох варіантів в
залежності від номера місяця.
Чи можна розв’язати відомими методами??
45. Програма
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.
жоден варіант не
підійшов
46. Оператор вибору
Особливості:
• після 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;
47. Оператор вибору
Особливості:
• якщо потрібно виконати тільки один оператор,
слова begin і end можна не писати
• не можна ставити два однакових значення
case i+3 of
1: a := b;
1: a := c;
end;
case i+3 of
1: a := b;
2: a := c;
end;
48. Оператор вибору
Особливості:
• значення, при яких виконуються однакові дії, можна
групувати
case i of
1: a := b;
2,4,6: a := c;
10..15: a := d;
20,21,25..30: a := e;
else writeln(‘Помилка');
end;
перечислення
діапазон
суміш
49. Що неправильно?
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;
50. Завдання (з захистом від неправильного введення)
"4": Ввести номер місяця і вивести кількість днів в ньому, а
також кількість помилок при введенні.
Приклад:
Введіть номер місяця: Введіть номер місяця:
-2 2
Введіть номер місяця: В цьому місяці 28 днів.
11 Ви вводили неправильно 0 раз.
В цьому місяці 30 днів.
Ви вводили неправильно 1 раз.
"5": Ввести номер місяця і номер дня, вивести кількість
днів, які залишилися до Нового року.
Приклад:
Ввести номер місяця:
12
Ввести день:
25
До Нового року залишилося 6 днів.
52. Цикл з невідомою кількістю кроків
Приклад: Відрізати поліно від колоди. Скільки разів потрібно
зробити рух пилкою?
Задача: Ввести ціле число (<2000000) і визначити кількість
цифр у ньому.
Ідея розв’язання: Відрізаємо послідовно останню цифру,
збільшуємо лічильник.
Проблема: Невідомо, скільки кроків потрібно зробити.
Розв’язання: Потрібно зупинитися, коли n = 0, тобто
потрібно робити “поки n <> 0".
n count
123 0
12 1
1 2
0 3
54. Програма
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"
Що погано??
55. Цикл с умовою
while <умова> do begin
{тіло циклу}
end;
Особливості:
• можна використовувати складені умови:
• якщо в тілі циклу тільки один оператор, слова
begin і end можна не писати:
while (a<b) and (b<c) do begin
{тіло циклу}
end;
while a < b do
a := a + 1;
56. Цикл з умовою
Особливості:
• умова перевіряється кожен раз при вході в цикл
• якщо умова на вході в цикл хибна, цикл не
виконується жодного разу
• якщо умова ніколи не стане хибною, програма
зациклиться
a := 4; b := 6;
while a > b do
a := a – b;
a := 4; b := 6;
while a < b do
d := a + b;
57. Скільки разів виконується цикл?
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;
зациклюванн
я
58. Заміна 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 можлива завжди.
59. Завдання
"4": Ввести ціле число і знайти суму його цифр.
Приклад:
Ввести ціле число:
1234
Сума цифр числа 1234 рівна 10.
"5": Ввести ціле число і визначити, чи правда, що в
його записі є дві однакові цифри.
Приклад:
Ввести ціле число: Ввести ціле число:
1234 1224
Ні. Так.
61. Послідовності
Задача: знайти суму всіх елементів послідовності,
які по модулю більші 0,001:
...,
32
5
,
16
4
,
8
3
,
4
2
,
2
1
,1 −−−
...
32
5
16
4
8
3
4
2
2
1
1 +−+−+−=S
Елемент послідовності (починаючи з №2):
c
b
za =
n 1 2 3 4 5 ...
b 1 2 3 4 5 ...
c 2 4 8 16 32 ...
z -1 1 -1 1 -1 ...
b := b+1;
c := 2*c;
z := -z;
62. Алгоритм
початок
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;
перший елемент
новий елемент
зміни
Перестановка??
63. Програма
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.
перехід до
наступного
доданка
початкове
значення
збільшення
суми
розрахунок елемента
послідовності
64. Завдання
"4": Знайти суму елементів послідовності з
точністю 0,001:
Відповідь:
S = 1.157
"5": Знайти суму елементів послідовності з
точністю 0,001:
Відповідь:
S = 1.220
...
819
8
277
6
95
4
33
2
1 +
⋅
−
⋅
+
⋅
−
⋅
+=S
...
24313
10
818
8
275
6
93
4
32
2
1 −
⋅
+
⋅
−
⋅
+
⋅
−
⋅
+=S
65. Цикл з післяумовою
Задача: Ввести ціле додатне число (<2000000) і
визначити кількість цифр в ньому.
Проблема: Як не дати ввести від'ємне число або нуль?
Розв’язання: Якщо вводиться неправильне число,
повернутися назад до введення даних (цикл!).
Особливості: Один раз тіло циклу потрібно виконати в
будь-якому випадку => перевірку умови циклу потрібно
виконувати в кінці циклу (цикл с післяумовою).
Цикл с післяумовою – це цикл, в якому перевірка умови
виконується в кінці циклу.
Цикл с післяумовою – це цикл, в якому перевірка умови
виконується в кінці циклу.
66. Цикл з післяумовою: алгоритм
початок
кінець
так
ні
n > 0?
тіло циклу
умова ВИХОДУ
блок "типовий
процес"
ввести n
основний
алгоритм
67. Програма
program qq;
var n: integer;
begin
repeat
writeln(‘Ввести додатне число');
read(n);
until n > 0;
... { основний алгоритм }
end.
until n > 0;
умова ВИХОДУ
Особливості:
• тіло циклу завжди виконується хоча б один раз
• після слова until ("до тих пір, поки не…")
ставиться умова ВИХОДУ із циклу
68. Скільки разів виконується цикл?
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;
зациклення
70. Масиви
Масив – це група однотипних елементів, які мають
спільне ім’я і розміщені в пам’яті поряд.
Особливості:
• всі елементи мають один тип
• весь масив має одне ім’я
• всі елементи розміщені в пам’яті поряд
Приклади:
• список учнів в класі
• квартири в будинку
• школи в місті
• дані про температуру повітря за рік
71. Масиви
5 10 15 20 25
1 2 3 4 5
A масив
3
15
НОМЕР
елемента масиву
(ІНДЕКС)
A[1] A[2] A[3] A[4] A[5]ЗНАЧЕННЯ
елемента масиву
A[2]
НОМЕР (ІНДЕКС)
елемента масиву: 2
ЗНАЧЕННЯ
елемента масиву: 10
72. Оголошення масивів
Для чого оголошувати?
• визначити ім’я масиву
• визначити тип масиву
• визначити кількість елементів
• виділити місце в пам’яті
Масив цілих чисел:
Розмір через константу:
ім’я
початковий
індекс
кінцевий
індекс
тип
елементів
var A: array[1.. ] of integer;
const N=5;
N
var A : array[ 1 .. 5 ] of integer ;
73. Оголошення масивів
Масиви інших типів:
Інший діапазон індексів:
Індекси інших типів:
var X, Y: array [1..10] of real;
C: array [1..20] of char;
var Q: array [0..9] of real;
C: array [-5..13] of char;
var A: array ['A'..'Z'] of real;
B: array [False..True] of integer;
...
A['C'] := 3.14259*A['B'];
B[False] := B[False] + 1;
74. Що неправильно?
var a: array[10..1] of integer;
...
A[5] := 4.5;
[1..10]
var a: array ['z'..'a'] of integer;
...
A['B'] := 15;A['b']
['a'..'z']
var a: array [0..9] of integer;
...
A[10] := 'X';
75. Масиви
Оголошення:
Введення з клавіатури:
Поелементні операції:
Виведення на екран:
const N = 5;
var a: array[1..N] of integer;
i: integer;
for i:=1 to N do begin
write('a[', i, ']=');
read ( a[i] );
end;
a[1] =
a[2] =
a[3] =
a[4] =
a[5] =
5
12
34
56
13
Чому
write?
?
for i:=1 to N do a[i]:=a[i]*2;
writeln('Масив A:');
for i:=1 to N do
write(a[i]:4);
Масив A:
10 24 68 112 26
76. Завдання
"4": Ввести з клавіатури масив з 5 елементів, знайти
середнє арифметичне всіх елементів масиву.
Приклад:
Введіть п’ять чисел:
4 15 3 10 14
середнє арифметичне 9.200
"5": Ввести з клавіатури масив з 5 елементів, знайти
мінімальний з них.
Приклад:
Введіть п’ять чисел:
4 15 3 10 14
мінімальний елемент 3
При зміні N решта програми не повинна
змінюватися!
!
77. Максимальний елемент
Задача: знайти в масиві максимальний елемент.
Алгоритм:
Псевдокод:
{ вважаємо, що перший елемент – максимальний }
for i:=2 to N do
if a[i] > { максимального } then
{ запам’ятати новий максимальний елемент a[i] }
Чому цикл від i=2??
78. Максимальний елемент
max := a[1]; { вважаємо, що перший – максимальний }
iMax := 1;
for i:=2 to N do { перевіряємо всі решта }
if a[i] > max then { знайшли новий максимальний }
begin
max := a[i]; { запам’ятати a[i] }
iMax := i; { запам’ятати i }
end;
Додатково: як знайти номер максимального елемента?
Як спростити??
По номеру елемента iMax завжди можна знайти його
значення a[iMax]. Тому всюди замінюємо max на a[iMax]
і забираємо змінну max.
a[iMax]
79. Програма
program qq;
const N = 5;
var a: array [1..N] of integer;
i, iMax: integer;
begin
writeln(‘Вихідний масив:');
for i:=1 to N do begin
a[i] := random(100) + 50;
write(a[i]:4);
end;
iMax := 1; { вважаємо, що перший – максимальний }
for i:=2 to N do { перевіряємо всі решта }
if a[i] > a[iMax] then { новий максимальний }
iMax := i; { запам’ятати i }
writeln; {перейти на новий рядок}
writeln('Максимальний елемент a[', iMax, ']=', a[iMax]);
end;
випадкові числа в
інтервалі [50,150)
пошук
максимального
80. Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
інтервалу [-10..10] і знайти в ньому максимальний і
мінімальний елементи та їх номери.
Приклад:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0
максимальний a[4]=10
мінімальний a[8]=-10
"5": Заповнити масив з 10 елементів випадковими числами з
інтервалу [-10..10] і знайти в ньому два максимальних
елементи та їх номери.
Пример:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0
максимальний a[4]=10, a[7]=8
81. Інверсія масиву
Задача: переставити елементи масиву в зворотному
порядку.
Алгоритм:
поміняти місцями A[1] і A[N], A[2] і A[N-1], …
Псевдокод:
3 5 … 9 7 7 9 … 5 3
1 2 … N-1 N 1 2 … N-1 N
for i:=1 to N do
{ поміняти місцями A[i] і A[N+1-i] }
сума індексів N+1
Що неправильно??
N div 2 do
82. Як переставити елементи?
2
3
1
Задача: поміняти місцями
вміст двох чашок.
Задача: поміняти місцями вміст двох комірок пам’яті.
4 6
?4
6 4
x y
c
c := x;
x := y;
y := c;
x := y;
y := x;
3
2
1
Чи можна обійтися без c??
83. Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
i, c: integer;
begin
{ заповнити масив }
{ вивести вихідний масив }
for i:=1 to N div 2 do begin
c:=A[i]; A[i]:=A[N+1-i]; A[N+1-i]:=c;
end;
{ вивести одержаний масив }
end;
84. Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
інтервалу [-10..10] і виконати інверсію окремо для 1-ї і 2-ї
половини масиву.
Приклад:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
-4 10 3 -5 4 0 1 -10 8 -6
"5": Заповнити масив з 12 елементів випадковими числами з
інтервалу [-12..12] і виконати інверсію для кожної третини
масиву.
Приклад:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0 5 7
Результат:
10 3 -5 4 -10 8 -6 -4 7 5 0 1
85. Циклічний зсув
Задача: зсунути елементи масиву на 1 комірку, перший
елемент стає на місце останнього.
Алгоритм:
A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];
Цикл:
3 5 8 1 … 9 7
1 2 3 4 … N-1 N
5 8 1 … 9 7 3
for i:=1 to N-1 do
A[i]:=A[i+1]; Що неправильно??
чому не N?
86. Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
i, c: integer;
begin
{ заповнити масив }
{ вивести вихідний масив }
c := A[1];
for i:=1 to N-1 do A[i]:=A[i+1];
A[N] := c;
{ вивести одержаний масив }
end;
87. Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
інтервалу [-10..10] і виконати циклічний зсув ВПРАВО.
Приклад:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
0 4 -5 3 10 -4 -6 8 -10 1
"5": Заповнити масив з 12 елементів випадковими числами з
інтервалу [-12..12] і виконати циклічний зсув ВПРАВО на 4
елементи.
Приклад:
Вихідний масив:
4 -5 3 10 -4 -6 8 -10 1 0 5 7
Результат:
-4 -6 8 -10 1 0 5 7 4 -5 3 10
88. Сортування
Сортування – це розстановка елементів масиву в
заданому порядку ( по зростанню, спаданню, останній
цифрі, сумі дільників, …).
Задача: переставити елементи масиву в порядку
зростання.
Алгоритми:
• прості і зрозумілі, проте неефективні для переважної більшості
масивів
метод бульбашки
метод вибору
• складні, проте ефективні
“швидке сортування" (Quick Sort)
сортування “купою" (Heap Sort)
сортування злиттям
пірамідальне сортування
складність O(N2
)
складність O(N·logN)
час
N
O(N2
)
O(N·logN)
89. Метод бульбашки
Ідея – бульбашка повітря в стакані води піднімається з дна вверх.
Для масивів – самий маленький ("легкий") елемент переміщується
вверх ("спливає").
5
2
1
3
5
2
1
3
5
1
2
3
1
5
2
3
• починаємо знизу, порівнюємо два
сусідніх елементи; вони стоять
“неправильно”, міняємо їх місцями
• за 1 прохід по масиву один
елемент (самий маленький) стає на
своє місце
1
5
2
3
1
5
2
3
1
2
5
3
1-ий прохід
2-ий прохід 3-ій прохід
1
2
5
3
1
2
3
5
Для сортування масиву з
N елементів потрібен
N-1 прохід (достатньо
поставить на свої місця
N-1 елемент).
90. Програма
1-ий прохід:
5
2
…
6
3
1
2
…
N-1
N
порівнюються пари
A[N-1] і A[N], A[N-2] і A[N-1]
…
A[1] і A[2]
A[j] і A[j+1]
2-ий прохід
A[1] вже на своєму місці!!
for j:=N-1 downto 2 do
if A[j] > A[j+1] then begin
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c;
end;
2
for j:=N-1 downto 1 do
if A[j] > A[j+1] then begin
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c;
end;
1
i-ий прохід for j:=N-1 downto i do
...
i
1
5
…
3
6
1
2
…
N-1
N
91. Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
i, j, c: integer;
begin
{ заповнити масив }
{ вивести вихідний масив }
for i:=1 to N-1 do begin
for j:=N-1 downto i do
if A[j] > A[j+1] then begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
end;
end;
{ вивести одержаний масив }
end;
Чому цикл по i до N-1??
i
елементи вище A[i]
вже поставлені
92. Метод бульбашки з прапором
Ідея – якщо при виконанні методу бульбашки не
було обмінів, масив вже посортований і решта
проходів не потрібні.
Реалізація: змінна-прапор, показує, був чи ні
обмін; якщо вона дорівнює False, то вихід.
repeat
flag := False; { скинути прапор }
for j:=N-1 downto 1 do
if A[j] > A[j+1] then begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
flag := True; { підняти прапор }
end;
until not flag; { вихід при flag=False }
flag := False;
flag := True;
not flag;
var flag: boolean;
2
1
4
3
1
2
3
4
Як покращити??
93. Метод бульбашки з прапором
i := 0;
repeat
i := i + 1;
flag := False; { скинути прапор }
for j:=N-1 downto 1 do
if A[j] > A[j+1] then begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
flag := True; { підняти прапор }
end;
until not flag; { вихід при flag=False }
i := 0;
i
i := i + 1;
94. Метод вибору
Ідея:
• знайти мінімальний елемент і поставити на місце
першого (помінять місцями з A[1])
• із решти знайти мінімальний елемент і поставити на
друге місце (поміняти місцями з A[2]), і т.д.
4
3
1
2
1
3
4
2
1
2
4
3
1
2
4
3
95. Метод вибору
for i := 1 to N-1 do begin
nMin = i ;
for j:= i+1 to N do
if A[j] < A[nMin] then nMin:=j;
if nMin <> i then begin
c:=A[i];
A[i]:=A[nMin];
A[nMin]:=c;
end;
end;
N-1
N
потрібен N-1 прохід
пошук мінімального
від A[i] до A[N]
якщо потрібно,
переставляємо
Чи можна забрати if??
i+1
i
96. Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
інтервалу [0..100] і відсортувати його за останньою
цифрою.
Приклад:
Вихідний масив:
14 25 13 30 76 58 32 11 41 97
Результат:
30 11 41 32 13 14 25 76 97 58
"5": Заповнити масив з 10 елементів випадковими числами з
інтервалу [0..100] і відсортувати першу половину по
зростанню, а другу – по спаданню.
Приклад:
Вихідний масив:
14 25 13 30 76 58 32 11 41 97
Результат:
13 14 25 30 76 97 58 41 32 11
97. Пошук в масиві
Задача – знайти в масиві елемент, рівний X, або
встановити, що його немає.
Розв’язання: для довільного масиву: лінійний
пошук (перебір)
недостаток: низька швидкість
Як спростити? – завчасно підготувати масив для
пошуку
• як саме підготувати?
• як використовувати “підготовлений масив"?
98. Лінійний пошук
nX := 0;
for i:=1 to N do
if A[i] = X then begin
nX := i;
break; {вихід з циклу}
end;
nX := 0; { поки не знайшли ...}
for i:=1 to N do { цикл по всіх елементах }
if A[i] = X then { якщо знайшли, то ... }
nX := i; { ... запам’ятати номер}
if nX < 1 then writeln('Не нашли...')
else writeln('A[', nX, ']=', X);
nX – номер потрібного
елемента в масиві
Що погано??Покращення: після того, як знайшли X,
виходимо з циклу.
nX := 0; i := 1;
while i <= N do begin
if A[i] = X then begin
nX := i; i := N;
end;
i := i + 1;
end;
break;
i := N;
99. Двійковий пошук
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
X = 7
X < 8 8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4X > 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
6X > 6
1. Вибрати середній елемент A[c]
і порівняти з X.
2. Якщо X = A[c], знайшли (вихід).
3. Якщо X < A[c], шукати дальше в
першій половині.
4. Якщо X > A[c], шукати дальше в
другій половині.
100. Двійковий пошук
nX := 0;
L := 1; R := N; {межі: шукаємо від A[1] до A[N] }
while R >= L do begin
c := (R + L) div 2;
if X = A[c] then begin
nX := c;
R := L - 1; { break; }
end;
if x < A[c] then R := c - 1;
if x > A[c] then L := c + 1;
end;
if nX < 1 then writeln(‘Не знайшли...')
else writeln('A[', nX, ']=', X);
номер середнього
елемента
знайшли
Чому не можна while R > L do begin … end; ?
?
вийти з
циклу
зсуваємо
межі
1 L c R N
101. Порівняння методів пошуку
Лінійний Двійковий
підготовка ні відсортувати
кількість кроків
N = 2 2 2
N = 16 16 5
N = 1024 1024 11
N= 1048576 1048576 21
N ≤ N ≤ log2N+1
102. Завдання
"4": Написати програму, яка сортує масив ПО
СПАДАННЮ і шукає в ньому елемент, рівний X
(це число вводиться з клавіатури). Використати
двійковий пошук.
"5": Написати програму, яка рахує середню
кількість кроків в двійковому пошуку для
масиву з 32 елементів з інтервалу [0,100]. Для
пошуку використати 1000 випадкових чисел в
цьому ж інтервалі.