1. Що визначає тип змінної? Які типи змінних ви знаєте?
2.
Де трапляються впорядковані набори даних? У чому зручність їх використання на відміну від невпорядкованих?
3. Який загальний вигляд і як виконується команда циклу з лічильником у мові програмування, яку ви вивчали?
У 8-му класі ви створювали проєкти, у яких використовувалася невелика кількість змінних. Але існує багато задач, у яких потрібно опрацювати значення досить великої кількості змінних.

Наприклад, нехай потрібно скласти проєкт для знаходження середньої маси ста учнів та учениць 9-х класів. Очевидно потрібно використати 100 змінних, значенням кожної з яких буде маса відповідного(-ої) дев’ятикласника(-ці), знайти суму значень цих змінних і поділити її на 100.
Якщо використати 100 змінних з іменами, наприклад, a, b,c, ..., z, aa, ab,ac, ..., az, ba, bb, bc, ..., bz, ca, cb, cc, ..., cv, то команда знаходження суми їхніх значень буде містити в правій своїй частині 100 доданків або потрібно включити до тексту програми такі 100 команд: sum := a; sum := sum + b;
sum := sum + c;
...
sum := sum + cv;
Усе це робить текст програми громіздким і незручним, зважаючи на те, що кількість учнів/учениць може бути ще більшою або взагалі заздалегідь невідомою.
Для розв’язування задач, у яких опрацьовується значення багатьох змінних, можна піти іншим шляхом: розглядати всі ці змінні як елементи деякого впорядкованого набору змінних. Такими впорядкованими наборами змінних, наприклад, є:
• значення середніх щоденних температур протягом місяця;
• значення щоденних курсів валют протягом тижня;
• семестрові оцінки учня/учениці;
• врожаї пшениці в Україні протягом останніх 15 років та інші.
Впорядкований набір змінних одного типу називається одновимірним масивом. Кожна змінна, що входить до одновимірного масиву, називається елементом одновимірного масиву.
Одновимірний масив має ім’я, яке записують за правилами для імен змінних. Ім’я елемента одновимірного масиву складається з імені цього масиву і порядкового номера (індекса) цього елемента в масиві, який узято у квадратні дужки.
Так, для вищенаведеного прикладу доцільно використати одновимірний масив, що складається зі 100 елементів. Якщо ім’я цього масиву a, то імена змінних – елементів цього масиву – будуть такі: a[1], a[2],a[3], ..., a[100]. Кожна з цих змінних матиме дійсний тип і певне значення.
Тоді, щоб знайти суму значень усіх цих 100 змінних, достатньо записати такі команди:
|
Pascal |
Python |
|
sum := 0; for i := 1 to 100 do sum := sum + a[i]; |
sum = 0 for i in range(100): sum = sum + a[i+1] |
Виконання цього фрагмента проєкту відбуватиметься так:
|
Команда мовою Pascal |
Результат виконання |
Команда мовою Python |
Результат виконання |
|
sum := 0 |
sum = 0 |
sum = 0 |
sum = 0 |
|
i := 1 |
i = 1 |
range(100) |
Згенеровано набір чисел 0, 1, 2, …, 99 |
|
i ≤ 100 |
true |
У наборі є невикористані числа? |
true |
|
|
|
Змінна i набуває початкового значення |
і = 0 |
|
sum := sum + a[i] |
sum = 0 + a[1] = a[1] |
sum = sum + a[i+1] |
sum = 0 + a[0+1] = a[1] |
|
i := i +1 |
i = 2 |
У наборі є невикористані числа? |
true |
Продовження таблиці
|
Команда мовою Pascal |
Результат виконання |
Команда мовою Python |
Результат виконання |
|
i ≤ 100 |
true |
Змінна i набуває наступного значення |
і = 1 |
|
sum := sum + a[i] |
sum = a[1] + a[2] |
sum = sum + a[i+1] |
sum = a[1] + a[2] |
|
i := i +1 |
i = 3 |
У наборі є невикористані числа? |
true |
|
i ≤ 100 |
true |
Змінна i набуває наступного значення |
і = 2 |
|
sum := sum + a[i] |
sum = a[1] + a[2] + a[3] |
sum = sum + a[i+1] |
sum = a[1] + a[2] + a[3] |
|
i := i +1 |
i = 4 |
У наборі є невикористані числа? |
true |
|
i ≤ 100 |
true |
Змінна i набуває наступного значення |
і = 3 |
|
sum := sum + a[i] |
sum = a[1] + a[2] + a[3] + a[4] |
sum = sum + a[i+1] |
sum = a[1] + a[2] + a[3] + a[4] |
|
... |
... |
… |
… |
|
i := i +1 |
i = 100 |
У наборі є невикористані числа? |
true |
|
i ≤ 100 |
true |
Змінна i набуває наступного значення |
і = 99 |
|
sum := sum + a[i] |
sum = a[1] + a[2] + a[3] + a[4] + ... + a[100] |
sum = sum + a[i+1] |
sum = a[1] + a[2] + a[3] + a[4] + ... + a[100] |
|
i := i +1 |
i = 101 |
У наборі є невикористані числа? |
false |
|
i ≤ 100 |
false |
|
|
У результаті виконання наведеного фрагмента проєкту значення змінної sum дорівнюватиме сумі значень усіх 100 змінних – елементів одновимірного масиву, тобто загальній масі даних 100 учнів. Після цього можна обчислити шукану середню масу, поділивши знайдену суму на 100.
Очевидно, що використання одновимірних масивів і їх опрацювання в циклі робить програмний код коротшим та ефективнішим.
Звертаємо вашу увагу, що за таким алгоритмом знаходять суму 100 елементів масиву для будь-якої задачі, незалежно від суті елементів масиву (маса, температура, заробітна плата та ін.).
У рядку var змінна a типу одновимірний масив, у якому 100 елементів дійсного типу, записується так:
var a: array [1..100] of real (англ. array – масив).
У квадратних дужках указується діапазон номерів елементів масиву: від 1 до 100. Після цього зазначається тип елементів масиву. За цим записом компілятор виділяє в пам’яті комп’ютера 100 ділянок під кожну зі 100 змінних – елементів одновимірного масиву. Розмір кожної ділянки пам’яті залежить від типу елементів масиву.
Звертаємо вашу увагу:
• кількість елементів масиву може бути довільною, не лише 100;
•
інколи зручно нумерувати елементи одновимірного масиву, починаючи не з 1. Так, у деяких задачах (кілька з них ми розглянемо нижче) зручно нумерувати елементи, починаючи з 0, наприклад, a: array [0..12] of real, а в задачі, у якій використовується щорічна чисельність населення України в період з 1991 по 2021 роки, зручно використати одновимірний масив a: array [1991..2021] of integer;
• номер елемента одновимірного масиву може задаватися як цілим числом, так і значенням виразу, що набуває цілочисельного значення, наприклад a[i+2], але перед цим змінна і має набути певного цілого значення.
Для введення і виведення значень елементів одновимірного масиву в середовищі Lazarus можна скористатися багаторядковим текстовим полем (компонент (елемент керування)
TMemo на вкладці Standard), який можна розмістити на формі так само, як й інші компоненти (мал. 5.1).

Мал. 5.1. Багаторядкове текстове поле і його властивості
![]()
Серед властивостей цього компонента є багато таких, які мають раніше розглянуті нами компоненти: Name, Color, Font, Enabled, Visible, Height, Width, Top, Left та ін.
Розглянемо ще кілька властивостей багаторядкового текстового поля:
• ScrollBars (англ. scroll – прокручування, bars – прямокутні смуги) – значення цієї властивості визначає наявність чи відсутність на цьому компоненті смуг прокручування (горизонтальної, вертикальної, обох) для перегляду тексту, якщо він виходить за межі компонента;
• ReadOnly (англ. read – читати, only – тільки) – значення цієї властивості визначає можливість або неможливість редагування вмісту компонента: False – можна редагувати, True – не можна (тільки для читання);
• Lines (англ. lines – лінії, рядки) – значенням цієї властивості є набір значень (текстів), розташованих в рядках цього компонента; кожен рядок багаторядкового текстового поля має номер, нумерація рядків починається з 0;
• Lines.Count (англ. count – підрахунок) – значення цієї властивості дорівнює кількості заповнених даними рядків компонента; звертаємо вашу увагу, що ця властивість відсутня у списку властивостей на вкладці Властивості вікна Інспектор Об’єктів.
Задача 1. Ввести значення елементів одновимірного масиву з 10 чисел, що знаходяться в рядках багаторядкового текстового поля, піднести ці числа до квадрата і вивести їх в інше багаторядкове текстове поле.
Розмістимо на формі два багаторядкових текстових поля з іменами Memo1 і Memo2 івстановимо для них значення властивостей Height = 180, ScrollBars = ssVertical.
Доцільно очистити вміст цих багаторядкових текстових полів і в перше з них увести 10 чисел. Це можна зробити у вікні Редактор рядків. Щоб відкрити це вікно, потрібно (мал. 5.2):
Мал. 5.2. Вікно Редактор рядків для введення значень у багаторядкове текстове поле перед запуском проєкту на виконання
1. Вибрати багаторядкове текстове поле.
2. Вибрати кнопку
в кінці рядка Lines на вкладці Властивості.
3. У вікні Редактор рядків видалити текст першого рядка і ввести 10 чисел, кожне число у новому рядку.
4.
Вибрати кнопку ОК.
Розмістимо на формі також кнопку, встановимо для неї Caption = ‘До квадрата’ і створимо обробник події Click для цієї кнопк и.
Нижче наведено текст відповідної процедури і вікно з результатом виконання проєкту (мал. 5.3). У тексті процедури використані два стандартні методи для багаторядкового текстового поля: Clear (англ. clear – очищувати), що видаляє всі рядки цього компонента, і Append (англ. append – додавати), що додає Мал. 5.3. Вікно виконання до багаторядкового текстового поля новий ря- проєкту піднесення значень
док і виводить у нього значення параметра, елементів одновимірного
вказаного в дужках. масиву до квадрата procedure TForm1.Button1Click(Sender: TObject); var a: array [0..9] of real; i: integer; begin
for i := 0 to 9 do
a[i] := StrToFloat(Memo1.Lines[i]); // дані з рядків першого багаторядкового текстового поля перевести в число і присвоїти елементам одновимірного масиву
for i := 0 to 9 do
a[i] := a[i]*a[i]; // піднести значення елементів одновимірного масиву до квадрата
Memo2.Clear; // очистити друге багаторядкове текстове поле, наприклад від результату попереднього виконання проєкту
for i := 0 to 9 do
Memo2.Lines.Append(FloatToStr(a[i])); // вивести значення елементів одновимірного масиву в рядки другого багаторядкового текстового поля
end;
Після вибору кнопк и До квадрата значення елементів одновимірного масиву з першого багаторядкового поля будуть піднесені до квадрата і виведені в рядки другого багаторядкового текстового поля.
Поки не закрили вікно проєкту, можна ввести в перше багаторядкове текстове поле інші числа і знову вибрати кнопку До квадрата. Тоді в другому багаторядковому текстовому полі побачимо квадрати нових уведених чисел.
У наведеній процедурі використано одновимірний масив, елементи якого мають номери від 0 до 9. Це зроблено з урахуванням того, що номери рядків багаторядкового текстового поля починаються з 0. Тобто перший по порядку верхній рядок багаторядкового текстового поля має номер не 1, як ми звикли, а 0.
Можна було б розглядати одновимірний масив, елементи якого мають номери від 1 до 10. У цьому разі процедура виглядатиме так: procedure TForm1.Button1Click(Sender: TObject); var a: array [1..10] of real; i: integer;
begin
for i := 1 to 10 do a[i] := StrToFloat(Memo1.Lines[i-1]);
for i := 1 to 10 do a[i] := a[i]*a[i]; Memo2.Clear;
for i := 1 to 10 do Memo2.Lines.Append(FloatToStr(a[i])); end;
Для розв’язування задач на опрацювання одновимірних масивів мовою Python може бути використано тип даних список (англ. list). Елементи списку записують у квадратних дужках, розділяючи їх комою. Наприклад, створити змінну а типу список можна такою командою:
a = [4, –6.3, 0, 3.5, –8, 5.1, –2]
Усього у цьому списку 7 елементів. Кожен елемент списку має свій номер (індекс). У мові Python номери (індекси) елементів списків розпочинаються з нуля. Номерами елементів наведеного списку з іменем а є цілі числа від 0 до 6. Значенням елемента a[0] є число 4, значенням елемента a[1] є число –6.3 і т.д. Останній елемент цього списку a[6] має значення –2.
Далі, говорячи про одновимірний масив, матимемо на увазі, що він створений як список, і для роботи з ним будемо використовувати функції та методи, призначені для опрацювання списків:
• len(a) – функція для визначення кількості елементів списку а;
• a.append(x) – метод додавання в кінець списку а нового елемента зі значенням х.
Номер елемента списку може задаватися як цілим числом, так і значенням виразу, що набуває цілочисельного значення, наприклад a[i+2], але перед цим змінна і має набути певного цілого значення.
Під час виконання проєктів можна вводити елементи одновимірного масиву з клавіатури. Для цього спочатку можна створити змінну типу список, яка не міститиме жодного елемента (порожній список), а потім додати до цього списку потрібні елементи.
Задача 1. Увести значення елементів списку з 10 чисел з клавіатури, піднести ці числа до квадрата та вивести отриманий список.
Нижче наведено текст проєкту та вікно з результатом його виконання (мал. 5.4). Нагадаємо, що в дробових числах дробова частина має відокремлюватися від цілої частини крапкою, а не комою.

Мал. 5.4. Виконання проєкту піднесення значень елементів списку до квадрата
a = [ ] # створити порожній список for i in range(10):
x = float(input(‘Уведіть значення елемента списку > ‘)) # дані, що вводять
з клавіатури, перевести в число
a.append(x) # додати в кінець списку введене число for i in range(10): a[i] = a[i]**2 # піднести значення елементів списку до квадрата
print(a) # вивести нові значення елементів списку
Після запуску проєкту на виконання потрібно ввести значення елементів списку, натискаючи після введення кожного числа клавішу Enter. У результаті в квадратних дужках буде виведено список квадратів чисел, які були введені з клавіатури. Значення елементів списку розділені комами.
Значення елементів списку також можна вводити з клавіатури в один рядок, розділяючи їх пропуском. Щоб отримати числа з такого рядка символів, потрібно застосувати такі функції та методи:
• input() – уводить у пам’ять комп’ютера рядок тексту, введений у вікні виконання проєкту з клавіатури;
• split() – розділяє рядок тексту на окремі частини на місцях пропусків, утворюючи величину типу список, елементами якого є тексти;
• map(тип, набір_значень) – перетворює кожне значення у наборі на величину вказаного типу;
• list(об’єкт) – перетворює вказаний об’єкт на величину типу список.
Команда для введення списку a з будь-якою кількістю елементів дійсного типу з використанням цих функцій і методів має вигляд: a = list(map(float, input(‘Уведіть значення елементів списку через пропуск
> ‘).split()))
Кількість елементів списку можна визначити після його створення функцією len(a).
Якщо потрібно вивести отриманий у результаті список без квадратних дужок, розділяючи числа пропуском, то потрібно перетворити числа в списку на тексти, з’єднати їх в єдиний текст, використавши метод join, та вивести цей текст:
a = list(map(str, a)) print(‘ ‘.join(a))
Нижче наведено текст проєкту для розв’язування Задачі 1 і результат його виконання (мал. 5.5). a = list(map(float, input(‘Уведіть значення елементів списку > ‘).split())) n = len(a) for i in range(n): a[i] = a[i]**2 a = list(map(str, a)) print(‘ ‘.join(a))
Мал. 5.5. Виконання проєкту з уведенням і виведенням значень елементів списку через пропуск
У багатьох задачах, особливо, коли потрібно опрацьовувати велику кількість даних, зручніше вводити дані не з багаторядкового текстового поля або з клавіатури, а з файлу, і виводити кінцеві результати не у вікно, а також у файл.
Розв’яжемо Задачу 1, використовуючи файли для введення і виведення значень елементів одновимірного масиву (списку).
Створимо текстовий файл, наприклад у текстовому редакторі Блокнот, з іменем input.txt з 10-ма числами, розмістивши їх по одному в рядку (мал. 5.6). Збережемо цей файл у папці з проєктом.
Кінцеві результати виводитимемо у файл з іменем Мал. 5.6. Вміст output.txt у тій самій папці з проєктом. файлу input.txt
Звертаємо вашу увагу, що у файлі в дробових числах дробова частина має відокремлюватися від цілої частини крапкою, а не комою.
begin
assignfile(f1, ‘input.txt’); // ц я команда пов’язує зазначений у ній конкретний файл з іменем input.txt, який розміщено в папці з проєктом, із файловою змінною f1 для коротшого звертання до цього файлу
reset(f1); // ця команда відкриває файл, пов’язаний із файловою змінною f1,для введення з нього даних
for i := 1 to 10 do
readln(f1, a[i]); // ця команда виконуватиметься в циклі 10 разів, і кожного разу вона прочитає число з першого і наступних рядків файлу, пов’язаного з файловою змінною f1, і присвоїть ці числа відповідним елементам одновимірного масиву з іменем a
closefile(f1); // ц я команда закінчує роботу з файлом, по’язаним з файловою змінною f1
for i := 1 to 10 do a[i] := a[i]*a[i];
assignfile(f2, ‘output.txt’); // ц я команда пов’язує зазначений у ній файл з іменем output.txt, який розміщено в папці з проєктом, із файловою змінною f2 для коротшого звертання до цього файлу
rewrite(f2); // ця команда відкриває файл, пов’язаний з файловою змінною f2,для виведення в нього даних. Якщо такого файлу в папці з проєктом немає, то спочатку він створюється. Якщо цей файл у папці з проєктом існує, то спочатку він очищується
for i := 1 to 10 do
writeln(f2, a[i]); // ц я команда виконуватиметься в циклі 10 разів, і кожного разу вона виведе в окремий рядок файлу, пов’язаного з файловою змінною f2,значення відповідного елемента одновимірного масиву з іменем a
closefile(f2); // ц я команда закінчує роботу з файлом, пов’язаним з файло-
вою змінною f2
end;
Рядок var для наведеного фрагмента проєкту має виглядати так: var f1, f2: textfile; a: array[1..10] of real; i: integer;
У ньому вказано дві змінні f1 іf2, які пов’язані з файлами, імена яких указані в командах assignfile, і ці змінні мають тип textfile.
f1 = open(‘input.txt’, ‘r’) # ц я команда пов’язує зазначений у ній конкретний файл input.txt, який розміщено в одній папці з проєктом, із файловою змінною f1 для коротшого звертання до цього файлу і відкриває його для читання даних
а = f1.read().split() # ц я команда читає з файлу, пов’язаного з файловою змінною f1, текст, поділяє його на окремі фрагменти тексту в місцях пропусків і утворює список з іменем а, значеннями елементів якого є тексти
а = list(map(float, а)) # ця команда перетворює список текстів на список чисел f1.close() # ця команда завершує роботу з файлом, пов’язаним з файловою змінною f1
n = len(a) for i in range(n): a[i] = a[i]**2
f2 = open(‘output.txt’, ‘w’) # ця команда відкриває файл, пов’язаний з файловою змінною f2, для виведення в нього даних. Якщо такого файлу в папці з проєктом немає, то спочатку він створюється. Якщо цей файл у папці з проєктом існує, то спочатку він очищується
for і in range(n):
f2.write(str(a[i]) + ‘\n’) # ця команда виконуватиметься в циклі і для кожного елементу списку з іменем a виведе його значення в окремий рядок зазначеного файлу, пов’язаному з файловою змінною f2. Послідовність символів ‘\n’ означає, що наступний за нею текст буде виведений у новому рядку файлу
f2.close() # ц я команда завершує роботу з файлом, пов’язаним з файловою змінною f2
Увага! Під час роботи з комп’ютером дотримуйтеся вимог безпеки життєдіяльності та санітарно-гігієнічних норм.
Задача 2. Створіть проєкт, у якому з багаторядкового текстового поля вводяться 8 цілих чисел як значення елементів одновимірного масиву, значення кожного елемента цього масиву збільшується на його номер і результати виводяться в інше багаторядкове текстове поле.
1. Відкрийте вікно середовища Lazarus.
2. Розмістіть на формі два багаторядкових текстових поля заввишки 200 і кнопк у з написом Змінити. У багаторядковому текстовому полі встановіть вертикальну смугу прокручування.
3. Збережіть проєкт у папці з іменем Вправа 5.1, створеній у вашій папці.
4. Створіть обробник події Click для кноп ки і введіть у нього такий текст: var a: array [0..7] of integer; i: integer; begin
for i := 0 to 7 do a[i] := StrToInt(Memo1.Lines[i]);
for i := 0 to 7 do a[i] := a[i] + і;
Memo2.Clear;
for i := 0 to 7 do Memo2.Lines.Append(IntToStr(a[i])); end;
5. Збережіть оновлену версію проєкту.
6. Запустіть проєкт на виконання.
7. Очистіть перше багаторядкове текстове поле і введіть у нього числа: –6; 12; –13; 0; 4; 138; –34; 55.
8. Виберіть кнопку.
9. Проаналізуйте значення, виведені в друге багаторядкове текстове поле. Чи відповідають вони умові задачі?
10. Змініть кілька чисел у першому багаторядковому текстовому полі.
11. Виберіть кнопку.
12. Проаналізуйте значення, виведені в друге багаторядкове текстове поле. Чи відповідають вони умові задачі?
13. Закрийте вікно виконання проєкту.
14. Закрийте вікно середовища Lazarus.
Задача 2. Створіть проєкт, у якому вводяться через пропуск 8 цілих чисел як значення елементів списку, кожне з цих чисел збільшується на його номер у списку і оновлений список виводиться.
1. Відкрийте вікно середовища IDLE і вікно редактора коду для створення нового файлу.
2.
Уведіть у вікні редактора коду такий текст: a = list(map(int, input(‘Уведіть 8 цілих чисел через пропуск > ‘).split())) for i in range(8): a[i] = a[i] + i a = list(map(str, a)) print(‘ ‘.join(a))
3. Збережіть проєкт у файлі з іменем вправа 5.1.py у вашій папці.
4. Запустіть проєкт на виконання.
5. Уведіть через пропуск числа: –6 12 –13 0 4 138 –34 55
6. Натисніть клавішу Enter.
7. Проаналізуйте виведені значення. Чи відповідають вони умові задачі?
8. Запустіть кілька разів проєкт на виконання та уведіть інші набори чисел.
9. Проаналізуйте виведені значення. Чи відповідають вони умові задачі?
10. Закрийте всі відкриті вікна.
Впорядкований набір змінних одного типу називається одновимірним масивом. Одновимірний масив має ім’я.
Кожна змінна, що входить до одновимірного масиву, називається елементом одновимірного масиву. Ім’я елемента одновимірного масиву складається з імені цього масиву і порядкового номера цього елемента в одновимірному масиві, який узято у квадратні дужки.
Якщо розглядати одновимірний масив зі 100 елементів дійсного типу, то в рядку var відповідна змінна з іменем a такого типу записується так: var a: array [1..100] of real. Імена елементів цього одновимірного масиву: a[1], a[2], a[3], ..., a[100].Кожна з цих змінних матиме тип real.
Для розв’язування задач на опрацювання одновимірних масивів у мові Python може бути використаний тип даних список (англ. list).
Якщо розглядати список з іменем а зі 100 елементів, то імена елементів цього списку: a[0], a[1],a[2], ..., a[99].
1○. Що таке одновимірний масив?
2○. З чого складається ім’я елемента одновимірного масиву?
3*. Які переваги має використання одновимірного масиву перед використанням окремих змінних?
4●. Що може використовуватись як номер елемента одновимірного масиву?
5*. Для розв’язування яких спортивних, фінансових, екологічних задач можна використати одновимірні масиви?
6●. Як оголошується змінна типу одновимірний масив у рядку var?
7○. Яким може бути діапазон номерів елементів одновимірного масиву?
8●. Які властивості багаторядкового текстового поля ви знаєте? Що визначають значення кожної з них?
9●. Як увести числа в багаторядкове текстове поле до запуску проєкту?
10○. Як увести значення елементів одновимірного масиву з використанням багаторядкового текстового поля?
11●. Який тип даних використовується для роботи з масивами? Як записують дані цього типу?
12○. Яка функція використовується для визначення кількості елементів масиву?
13○. Яка функція використовується для додавання до масиву нових елементів? 14●. Якими способами можна ввести значення елементів масиву з клавіатури?
15●. Якими способами можна вивести значення елементів масиву?
1○. Виконайте в зошиті фрагмент проєкту для одновимірного масиву (списку), значеннями елементів якого є числа 2; –2; 3; 0,25; –4:
|
|
|
Python |
|
dob := 1; for i := 1 to 5 do dob := dob*a[i]; |
dob = 1 for i in range(5): dob = dob*a[i] |
|
Яке значення змінної dob після завершення його виконання? Сформулюйте умову задачі, яку розв’язує цей фрагмент проєкту.
2○.Виконайте в зошиті фрагмент проєкту для одновимірного масиву, значеннями елементів якого є числа 0,5; –3; 2; –1,6:
|
|
|
|
sum := 0; for i := 1 to 4 do sum := sum + a[i]*a[i]; |
sum = 0 for i in range(4): sum = sum + a[i]*a[i] |
Яке значення змінної sum після його завершення його виконання? Сформулюйте умову задачі, яку розв’язує цей фрагмент проєкту.
3●. Запишіть рядок оголошення змінних типу одновимірний масив:
1) з іменем х, шо складається з елементів дійсного типу з номерами від 1 до 50;
2) з іменем mas, шо складається з елементів дійсного типу з номерами від 10 до 35;
3) з іменем tab, що складається з елементів з номерами від –7 до 12.
Скільки елементів у кожному з цих одновимірних масивів?
4●. Створіть проєкт, у якому створюється одновимірний масив (список) з банківських вкладів 8 клієнтів. Через рік вклад кожного збільшується на 10 %. Виведіть суми, які зможуть забрати ці клієнти через рік. Збережіть проєкт у папці з іменем Завдання 6.1.4, створеній у вашій папці.
5●. Створіть проєкт, у якому створюється одновимірний масив (список) з банківських вкладів 10 клієнтів. Через рік вклад кожного збільшується на р %. Виведіть суми, які зможуть забрати ці клієнти через рік. Збережіть проєкт у папці з іменем Завдання 6.1.5, створеній у вашій папці.
6●. Створіть проєкт, у якому створюються два одновимірних масиви (списки) з кількості опадів у місті Житомир за кожний день першої декади двох місяців. Визначте та виведіть сумарну кількість опадів у Житомирі за кожне з перших 10 днів цих місяців. Збережіть проєкт у папці з іменем Завдання 6.1.6, створеній у вашій папці.
7●.Робітник протягом місяця виготовляв деталі 6 видів. Відомо, скільки деталей кожного виду виготовив робітник і скільки гривень йому платять за виготовлення 1 деталі кожного виду. Створіть проєкт, у якому визначається,
скільки гривень отримає робітник за виготовлення деталей кожного виду. Використайте три одновимірних масиви. Збережіть проєкт у папці з іменем Завдання 6.1.7, створеній у вашій папці.
8*. Експериментально встановлено, що кількість людей, серед яких розповсюджується повідомлення в мережі TikTok, обчислюється за формулою n = 5*і + 2, де і – номер хвилини розповсюдження. Створіть проєкт для визначення, серед скількох людей розповсюджується повідомлення за кожну з перших 20 хвилин. Виведіть отримані значення у вікно та у файл. Збережіть проєкт у папці з іменем Завдання 6.1.8, створеній у вашій папці.
1. Що називається одновимірним масивом?
2. Що таке елемент одновимірного масиву? З чого складається його ім’я?
3. Як описується одновимірний масив у рядку var?
4.
Який тип даних використовують для роботи з масивами? Як записують дані цього типу?
Розглянемо кілька типових задач опрацювання одновимірних масивів:
• знаходження суми значень всіх його елементів;
• знаходження суми та кількості значень елементів, що відповідають певним умовам;
• визначення, чи є певне значення серед значень елементів масиву, і якщо є, то під яким номером;
• знаходження найбільшого та найменшого елемента.
Такі задачі досить часто розв’язують на практиці. Наведемо лише кілька прикладів таких задач. Так синоптики визначають найбільшу, найменшу, середню температуру за день, середню кількість опадів протягом місяця тощо. Під час визначення переможців у деяких змаганнях відкидають найбільшу та найменшу оцінку суддів і обчислюють середнє арифметичне тих оцінок, що залишилися. Адміністрацію вашого закладу освіти може цікавити, скільки учнів 9-х класів мають семестрові оцінки 10, 11 або 12 з інформатики, чи є у вашому класі учні, що отримали оцінку 8 за останню практичну роботу, тощо.
Звертаємо вашу увагу, що в усіх задачах, які розглянемо нижче, використовуватимуться одновимірні масиви з 10 елементів. Якщо в інших задачах потрібно буде використати одновимірні масиви з іншою кількістю елементів, то слід внести до наведених текстів проєктів відповідні зміни.
У всіх задачах, які розглянемо в цьому пункті, будемо вводити значення елементів одновимірного масиву з багаторядкового текстового поля, значення інших змінних – з текстових полів. Якщо результатом є значення елементів одновимірного масиву, то виводитимемо їх у багаторядкове текстове поле, а значення інших змінних – у написи.
Для розв’язування цих задач створюватимемо процедури, що будуть обробляти подію Click для кнопк и. Аналогічно ви зможете створювати процедури, що оброблятимуть інші події для кноп ки або події для інших об’єктів.
У всіх задачах, які розглянемо в цьому пункті, будемо вводити значення елементів одновимірного масиву з клавіатури в одному рядку, розділяючи їх пропусками.
Задача 1. Визначити суму значень усіх елементів одновимірного масиву.
Суму значень усіх елементів одновимірного масиву визначатимемо за допомогою циклу. Використаємо змінну s для накопичування шуканої суми. Перед циклом їй слід надати значення 0. У циклі послідовно переглядатимемо елементи одновимірного масиву і додаватимемо їх значення до змінної s.
Procedure TForm1.Button1Click(Sender: TObject); var a: array [0..9] of real; i: integer; s: real; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i]); // д ані з рядка багаторядкового текстового поля перевести в дійсне число і присвоїти елементу одновимірного масиву
s := 0; // п очаткове значення для змінної, значення якої визначатиме суму значень елементів одновимірного масиву
for i := 0 to 9 do s := s + a[i]; // д одавання до змінної s значення чергового елемента одновимірного масиву Label1.Caption := FloatToStr(s); // виведення результату в напис end;
Звертаємо вашу увагу: якщо в циклі використовується команда змінення значення певної величини (у даній задачі s := s + a[i]), то перед циклом цій змінній обов’язково потрібно присвоїти початкове значення (у даній задачі s := 0).
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) # уведений текст розділяється на окремі фрагменти тексту на місцях пропусків, ці фрагменти тексту перетворюються на дійсні числа, отриманий набір чисел перетворюється на список s = 0 # початкове значення для змінної, значення якої визначатиме суму значень елементів списку
for i in range(10): # перебір номерів елементів списку від 0 до 9 s = s + a[i] # додавання до змінної s значення чергового елемента списку print(s) # виведення результату
Звертаємо вашу увагу: якщо в циклі використовується команда змінення значення певної величини (у даній задачі s = s + a[i]), то перед циклом цій змінній обов’язково потрібно присвоїти початкове значення (у даній задачі s = 0).
Зауважимо, що в мові Python змінна циклу for може набувати значень не лише індексів елементів масиву, а й безпосередньо значень елементів. У такому випадку фрагмент проєкту буде такий: a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split()))
s = 0
for x in a: # перебір усіх значень елементів списку
s = s + x # додавання до змінної s значення чергового елемента списку print(s)
Задача 2. Визначити, скільки разів задане дійсне число трапляється серед значень елементів одновимірного масиву.
Очевидно, що для розв’язування цієї задачі потрібно переглянути послідовно значення всіх елементів одновимірного масиву, порівняти кожне з них з даним числом, і якщо деяке з них дорівнює цьому числу, то збільшити лічильник таких елементів на 1.
Procedure TForm1.Button1Click(Sender: TObject); var a: array [0..9] of real; i, k: integer; x: real; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i]); // в ведення значень еле-
ментів одновимірного масиву
x := StrToFloat(Edit1.Text); // введення заданого числа
k := 0; // л ічильник кількості елементів одновимірного масиву, що дорівнюють заданому числу – їх поки що не трапилося жодного
for i := 0 to 9 do
if a[i] = x then k := k + 1; // з більшення на 1 значення лічильника, якщо значення чергового елемента одновимірного масиву дорівнює заданому числу
Label1.Caption := IntToStr(k) + ‘ разів’; // в иведення результату в напис
з додаванням пояснювального тексту
end;
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) # введення значень елементів списку
x = float(input(‘Уведіть число > ‘)) # введення заданого числа
k = 0 # лічильник кількості елементів списку, що дорівнюють заданому числу – їх поки що не траплялося жодного for i in range(10): if a[i] == x:
k = k+1 # збільшення на 1 значення лічильника, якщо значення чергового елемента списку дорівнює заданому числу
print(k, ‘разів’) # виведення результату з додаванням пояснювального тексту
Задача 3. Визначити, чи є задане дійсне число серед значень елементів даного одновимірного масиву.
Можна було б розв’язати цю задачу аналогічно попередній: визначити, скільки елементів одновимірного масиву дорівнюють даному числу, і якщо ця кількість дорівнює 0, то даного числа серед значень елементів одновимірного масиву немає, а якщо більше 0, то є.
Але такий метод розв’язування цієї задачі є нераціональним. Уявіть собі, що дане число є значенням вже першого елемента одновимірного масиву. Тоді всі інші його елементи переглядати вже не потрібно, і це економить значний час розв’язування цієї задачі, особливо якщо кількість елементів одновимірного масиву велика.
Для реалізації раціонального методу розв’язування цієї задачі використаємо змінну логічного типу f і нехай її значення false визначатиме, що даного числа серед значень елементів одновимірного масиву немає, а значення true – що є. Перед початком перегляду значень елементів одновимірного масиву присвоїмо змінній f значення false, адже дане число в одновимірному масиві поки що не знайшлося. Порівнюватимемо в циклі послідовно значення елементів одновимірного масиву з заданим числом і якщо одне з них дорівнює заданому числу, то змінимо значення змінної f на true і перервемо виконання циклу командою break (англ. break – переривати). Виведення кінцевого результату реалізуємо залежно від значення змінної f.
Procedure TForm1.Button1Click(Sender: TObject);
var a: array [0..9] of real; i: integer; x: real; f: boolean; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i-1]); x := StrToFloat(Edit1.Text);
f := false; // задане число поки що не знайдено for i := 0 to 9 do if a[i] = x then begin
f := true; // з адане число є серед значень елементів одновимірного масиву
break; // п ерериваємо виконання циклу, бо число є в одновимірному масиві
end; if f then Label1.Caption := ‘Число є’ else Label1.Caption := ‘Числа немає’; end;
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) x = float(input(‘Уведіть число > ‘)) f = False # задане число поки що не знайдено for i in range(10): if a[i] == x:
f = True # задане число є серед значень елементів списку break # перериваємо виконання циклу, бо число є в списку if f:
print(‘Число є’) else:
print(‘Числа немає’)
Зауважимо, що в мові Python можна визначити наявність заданого числа серед значень елементів масиву, використовуючи операцію in (англ. in – в, усередині). У такому випадку фрагмент проєкту може мати такий вигляд:
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) x = float(input(‘Уведіть число > ‘)) if x in a: print(‘Число є’) else: print(‘Числа немає’)
Задача 4. Визначити середнє арифметичне додатних значень елементів одновимірного масиву.
Щоб визначити середнє арифметичне додатних значень елементів одновимірного масиву, потрібно визначити їх суму та кількість, після чого поділити знайдену суму на знайдену кількість. Тому будемо послідовно переглядати значення елементів одновимірного масиву, і якщо значення чергового елемента масиву додатне, додамо його до суми та збільшимо кількість таких елементів на 1.
Під час виведення результату врахуємо, що можливі одновимірні масиви, у яких не буде елементів з додатними значеннями.
Procedure TForm1.Button1Click(Sender: TObject); var a: array [0..9] of real; i, k: integer; s, m: real; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i]); s := 0; // початкове значення суми додатних значень елементів масиву k := 0; // початкове значення кількості додатних значень елементів масиву for i := 0 to 9 do
if a[i] > 0 then begin
s := s + a[i]; // д одавання додатного значення елемента масиву до їх суми
k := k + 1; // збільшення на 1 кількості додатних значень елементів масиву end;
if k = 0 then Label1.Caption := ‘Додатних елементів у масиві немає’ else begin
m := s/k; // обчислення середнього арифметичного
Label1.Caption := Середнє арифметичне: ‘ + FloatToStr(m);
// виведення середнього арифметичного end; end;
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) s = 0 # початкове значення суми додатних значень елементів списку k = 0 # початкове значення кількості додатних значень елементів списку for i in range(10): if a[i] > 0:
s = s + a[i] # додавання додатного значення елемента списку до їх суми k = k + 1 # збільшення на 1 кількості додатних значень елементів списку if k == 0: print(‘Додатних елементів у масиві немає’)
else:
m = s/k # обчислення середнього арифметичного
Задача 5. Визначити найбільше значення серед значень елементів одновимірного масиву.
Спочатку вважатимемо, що значення першого елемента одновимірного масиву є найбільшим. Після чого послідовно переглядатимемо значення всіх інших елементів одновимірного масиву, і якщо трапиться значення, яке більше того, яке ми на даний момент вважаємо найбільшим, то вважатимемо тепер вже це значення найбільшим.
Procedure TForm1.Button1Click(Sender: TObject); var a: array [0..9] of real; i: integer; max: real; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i]);
max := a[0]; // вважаємо, що найбільше значення – значення першого елемента
for i := 1 to 9 do if a[i] > max then max := a[i]; // з амінюємо найбільше значення
Label1.Caption := FloatToStr(max) + ‘ – найбільше значення’; end;
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) max = a[0] # вважаємо, що найбільше значення – значення першого елемента for i in range(1,10): if a[i] > max:
max = a[i] # замінюємо найбільше значення
print(max,’– найбільше значення’)
Зауважимо, що в мові Python можна визначити найбільше значення серед елементів масиву, використовуючи функцію max. У цьому випадку фрагмент проєкту може бути таким: a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) max = max(a)
print(max, ‘– найбільше значення’)
Пропонуємо вам подумати, як зміниться наведений фрагмент проєкту, якщо потрібно визначити найменше значення серед значень елементів одновимірного масиву.
Задача 6. Дано одновимірний масив, значення всіх елементів якого різні. Визначити найбільше та найменше значення серед елементів цього одновимірного масиву і обміняти їх місцями.
Оскільки потрібно обміняти місцями найбільше та найменше значення серед значень елементів одновимірного масиву, то потрібно визначити не тільки самі ці значення, а ще й номер елемента, значення якого найбільше, і номер елемента, значення якого найменше. Визначимо все це, переглядаючи значення елементів одновимірного масиву лише один раз.
Спочатку вважатимемо, що значення першого елемента і найбільше, і найменше, а номер найбільшого та найменшого елемента – 0. Після чого послідовно переглядатимемо всі інші елементи одновимірного масиву. Якщо значення чергового елемента одновимірного масиву більше того значення, яке ми на той момент вважаємо найбільшим, то замінюємо найбільше значення серед уже переглянутих і номер найбільшого елемента. Якщо ні, то може це значення менше ніж те, яке ми поки що вважаємо найменшим. І якщо це так, то замінюємо найменше значення серед уже переглянутих і номер найменшого елемента.
Procedure TForm1.Button1Click(Sender: TObject);
var a: array [0..9] of real; i, nmax, nmin: integer; max, min: real; begin
for i := 0 to 9 do a[i] := StrToFloat(Memo1.Lines[i-1]); max := a[0]; nmax := 0; // значення першого елемента вважаємо найбільшим min := a[0]; nmin := 0; // значення першого елемента вважаємо найменшим for i := 1 to 9 do
if a[i] > max // п орівняння значення чергового елемента з найбільшим на цей момент
then begin max := a[i]; // замінюємо значення найбільшого елемента nmax := i; // замінюємо номер найбільшого елемента end else
if a[i] < min // п орівняння значення чергового елемента з найменшим на цей момент
then begin min := a[i]; // замінюємо значення найменшого елемента nmin := i; // замінюємо номер найменшого елемента end;
a[nmax] := min; a[nmin] := max; // о бмін значеннями найбільшого і найменшого елементів
for i := 0 to 9 do
Memo2.Lines.Append(FloatToStr(a[i])); // в иведення значень елементів ма-
сиву з переставленими найбільшим і найменшим значеннями
end;
a = list(map(float, input(‘Уведіть 10 значень через пропуск > ‘).split())) max = a[0]
nmax = 0 # значення першого елемента вважаємо найбільшим min = a[0] nmin = 0 # значення першого елемента вважаємо найменшим for i in range(1, 10):
if a[i] > max: # порівняння значення чергового елемента з найбільшим на цей
момент
max = a[i] # замінюємо значення найбільшого елемента nmax = i # замінюємо номер найбільшого елемента
elif a[i] < min: # порівняння значення чергового елемента з найменшим на цей момент
min = a[i] # замінюємо значення найменшого елемента nmin = i # замінюємо номер найменшого елемента a[nmax] = min a[nmin] = max # обмін значеннями найбільшого та найменшого елементів print(a) # в иведення значень елементів списку з переставленими найбільшим і найменшим значеннями
Увага! Під час роботи з комп’ютером дотримуйтеся вимог безпеки життєдіяльності та санітарно-гігієнічних норм.
Задача 7. Багаторядкове текстове поле містить дійсні числа. Відомо, що їх кількість не перевищує 20. Ввести ці числа як значення елементів одновимірного масиву. Сформувати з від’ємних значень елементів цього масиву другий масив. Вивести значення елементів другого масиву в інше багаторядкове поле. Визначити середнє арифметичне значень елементів другого масиву. Вивести його в текстове поле.
1. Відкрийте вікно середовища Lazarus.
2. Розмістіть на формі:
• два багаторядкових текстових поля заввишки 400 і з вертикальною смугою прокручування;
• два написи: над першим багаторядковим текстовим полем з текстом Елементи і над другим – з текстом Від’ємні елементи; •текстове поле з написом біля нього Середнє арифметичне;
• кнопку з текстом Від’ємні елементи.
Орієнтовний вигляд форми з компонентами на ній наведено на малюнку 5.7.
3. Збережіть проєкт у папці з іменем Вправа 5.2, створеній у вашій папці.
4. Створіть обробник події Click для кнопк и.
Оскільки за умовою задачі кількість елементів одновимірного масиву невідома, і відомо лише, що вона не перевищує 20, то в рядку var оголосимо одновимірний масив a максимально можливої кількості елементів (20) з номерами від 0 до 19. Це дасть змогу під час виконання проєкту вводити в перше багаторядкове поле довільну кількість чисел, яка не перевищує 20.
Для визначення реальної кількості елементів для кожного такого введення ско-
ристаємося властивістю Memo1.Lines. Мал. 5.7. Форма з компонентами
для Задачі 7
Count, яка, нагадуємо, визначає реальну кількість заповнених рядків багаторядкового текстового поля.
5. Уведіть такий текст процедури:
var a, b: array [0..19] of real; s, m: real; n, i, k: integer; begin
n := Memo1.Lines.Count; // визначення кількості заповнених рядків багаторядкового текстового поля, тобто кількість чисел у ньому
for i := 0 to n - 1 do
a[i] := StrToFloat(Memo1.Lines[i]); // формування одновимірного масиву a з n чисел
s := 0; // початкове значення суми від’ємних елементів k := 0; // початкове значення кількості від’ємних елементів
Тепер будемо переглядати послідовно всі елементи масиву a. І якщо знайдемо елемент з від’ємним значенням, збільшимо кількість таких елементів (k), включимо цей елемент до другого масиву (b) і додамо його значення до суми від’ємних значень (s).
Кількість елементів у масиві b заздалегідь невідома. Але вона точно не більше за 20. Тому в рядку var оголосимо одновимірний масив b максимально можливої кількості елементів (20) з номерами від 0 до 19.
6. Додайте до процедури такий текст:
for i := 0 to n - 1 do if a[i] < 0 then begin k := k + 1; // збільшуємо кількість від’ємних елементів b[k-1] := a[i]; // включаємо знайдене від’ємне значення до масиву b під номером k-1 (оскільки номери масиву починаються з 0, то номер останнього елемента на 1 менше ніж кількість елементів)
s := s + a[i]; // додаємо від’ємне значення до суми end;
Під час обчислення середнього арифметичного від’ємних значень потрібно врахувати, що в масиві a елементів з від’ємними значеннями може й не бути. У такому разі й у масиві b не буде жодного елемента, і це також потрібно врахувати під час його виведення.
7. Додайте до процедури такий текст:
Memo2.Clear; // очищення другого багаторядкового поля if k = 0 then Memo2.Lines.Append(‘Значень, менших від 0, немає’) else for i := 0 to k-1 do Memo2.Lines.Append(FloatToStr(b[i])); // в иведення у друге багаторядкове поле повідомлення або к елементів масиву b
if k = 0 then Edit1.Text := ‘Значень, менших від 0, немає’ else begin
m := s/k; // о бчислення середнього арифметичного від’ємних значень
Edit1.Text := FloatToStr(m); // в иведення середнього арифметичного від’ємних значень
end; end;
8. Збережіть остаточну версію проєкту.
9. Запустіть проєкт на виконання.
10. Уведіть у перше багаторядкове поле числа: 3,4; –7; 0; –13; 8,75; –23; 15. Виберіть кнопку Від’ємні елементи. Проаналізуйте отриманий результат.
11. Видаліть числа з першого багаторядкового поля і введіть інші: –16; 98; –43; 45; 0; 45; –1; 29; –2,67; 55. Виберіть кнопку Від’ємні елементи. Проаналізуйте отриманий результат.
12. Видаліть числа з першого багаторядкового поля і введіть інші: 16; 98,28; 45; 0; 45; 1; 29; 2,67; 55; 0. Виберіть кнопку Від’ємні елементи. Проаналізуйте отриманий результат.
13. Уведіть свій набір чисел до першого багаторядкового поля. Виберіть кнопку Від’ємні елементи. Проаналізуйте отримані результати
14. Закрийте вікно виконання проєкту.
15. Закрийте вікно середовища Lazarus.
Задача 6. Увести значення елементів списку – дійсні числа, кількість яких не перевищує 20. Сформувати з від’ємних значень елементів цього списку другий список. Вивести значення елементів другого списку. Визначити середнє арифметичне значень елементів другого списку і вивести його.
1. Відкрийте вікно середовища IDLE.
2. Відкрийте вікно редактора для створення нового проєкту.
3.
Уведіть такий текст: a = list(map(float, input(‘Уведіть значення через пропуск > ‘).split())) n = len(a) # визначення кількості елементів списку s = 0 # початкове значення суми від’ємних елементів k = 0 # початкове значення кількості від’ємних елементів b = [] # створюємо порожній список для від’ємних значень елементів списку a
Тепер будемо переглядати послідовно всі елементи списку a. І якщо знайдемо елемент з від’ємним значенням, збільшимо кількість таких елементів (k), включимо цей елемент до другого списку (b) і додамо його значення до суми від’ємних значень (s).
4. Додайте до проєкту такий текст:
for x in a: if x < 0: k = k + 1; # збільшуємо кількість від’ємних елементів b.append(x) # додаємо значення х до списку b s = s + х # додаємо від’ємне значення до суми
Під час обчислення середнього арифметичного від’ємних значень потрібно врахувати, що в списку a елементів з від’ємними значеннями може й не бути. У такому разі й у списку b не буде жодного елемента, і це також потрібно врахувати під час його виведення.
5. Додайте до проєкту такий текст: if k == 0: print(“Від’ємних значень немає”) # виведення повідомлення else:
print(b) # виведення елементів списку b m = s/k; # обчислення середнього арифметичного від’ємних значень print(“Середнє арифметичне від’ємних значень:”, m) 6. Збережіть проєкт у вашій папці у файлі з іменемвправа 5.2.py.
7. Запустіть проєкт на виконання.
8. Уведіть через пропуск числа: 3.4 –7 0 –13 8.75 –23 15. Натисніть клавішу Enter. Проаналізуйте отриманий результат.
9. Запустіть проєкт на виконання та введіть інші числа: –16 98.43 45 0 45 –1 29 –2.67 55. Натисніть клавішу Enter. Проаналізуйте отриманий результат.
10. Запустіть проєкт на виконання та введіть інші числа: 22 98.43 45 0 45 0 2.15
55. Натисніть клавішу Enter. Проаналізуйте отриманий результат.
11.
Запустіть проєкт на виконання. Уведіть свій набір чисел. Натисніть клавішу Enter. Проаналізуйте отримані результати.
12. Закрийте всі відкриті вікна.
Фрагмент проєкту для знаходження суми значень всіх елементів одновимірного масиву:
|
|
|
|
s := 0; for i := 1 to 10 do s := s + a[i]; |
s = 0 for i in range(10): s = s + a[i] |
Фрагмент проєкту для знаходження кількості значень елементів одновимірного масиву, що дорівнюють заданому числу:
|
|
|
|
k := 0; for i := 1 to 10 do if a[i] = x then k := k + 1; |
k = 0 for i in range(10): if a[i] == x: k = k + 1 |
Фрагмент проєкту для визначення, чи є дане число серед значень елементів одновимірного масиву:
|
|
|
|
f := false; for i := 1 to 10 do if a[i] = x then begin f := true; break; end; |
f = False for i in range(10): if a[i] == x: f = True break |
Фрагмент проєкту для визначення найбільшого значення серед елементів одновимірного масиву:
|
|
|
|
max := a[1]; for i := 2 to 10 do if a[i] > max then max := a[i]; |
max = a[0] for i in range(1, 10): if a[i] > max: max = a[i] |
1●. Для розв’язування якої задачі можна використати наведені фрагменти проєктів?
|
|
|
|
а) s := 0; for i := 1 to 10 do s := s + a[i]; б) k := 0; for i := 1 to 10 do if a[i] < 0 then k := k + 1; в) k := 0; for i := 1 to 10 do if a[i] = x then k := k + 1; |
а) s = 0; for i in range(10): s = s + a[i] б) k = 0; for i in range(10): if a[i] < 0: k = k + 1 в) k = 0; for i in range(10): if a[i] == x: k = k + 1 |
2●. З якою метою у наведеному фрагменті використано змінну f?
|
|
|
|
f := false; for i := 1 to 10 do if a[i] = x then begin f := true; break; end; |
f = False for i in range(10): if a[i] == x: f = True break |
Який тип цієї змінної? Чи можна було б з цією самою метою використати змінну іншого типу? Відповідь поясніть.
3●. Як потрібно змінити наведений фрагмент, щоб в ньому визначалося найменше значення елементів одновимірного масиву (списку)?
|
|
|
|
max := a[1]; for i := 2 to 10 do if a[i] > max then max := a[i]; |
max = a[0] for i in range(1, 10): if a[i] > max: max = a[i] |
4*. Якщо в одновимірному масиві кілька елементів мають найбільше значення серед значень усіх елементів цього одновимірного масиву, то фрагмент:
|
|
|
|
max := a[1]; for i := 2 to 10 do if a[i] > max then max := a[i]; |
max = a[0] for i in range(1, 10): if a[i] > max: max = a[i] |
визначає який з них? Чи зміниться щось, якщо в розгалуженні змінити знак > на знак >=?
5*. Для розв’язування якої задачі можна використати наведені фрагменти?
Порівняйте їхню ефективність.
|
|
Pascal |
|
а) max := a[0]; nmax := 0; min := a[0]; nmin := 0; for i := 1 to 9 do if a[i] > max then begin max := a[i]; nmax := i; end else if a[i] < min then begin min := a[i]; nmin := i; end; |
б) max := a[0]; nmax := 0; min := a[0]; nmin := 0; for i := 1 to 9 do begin if a[i] > max then begin max := a[i]; nmax := i; end; if a[i] < min then begin min := a[i]; nmin := i; end; end; |
|
|
Python |
|
а) max = a[0] nmax = 0 min = a[0] nmin = 0 for i in range(1, 10): if a[i] > max: max = a[i] nmax = i elif a[i] < min: min = a[i] nmin = i a[nmax] = min a[nmin] = max |
б) max = a[0] nmax = 0 min = a[0] nmin = 0 for i in range(1, 10): if a[i] > max: max = a[i] nmax = i if a[i] < min: min = a[i] nmin = i a[nmax] = min a[nmin] = max |
6●. Для чого використовується властивість Memo1.Lines.Count багаторядкового текстового поля?
7●. Для розв’язування якої задачі можна використати наведений фрагмент?
|
|
|
|
s := 0; k := 0; for i := 1 to 10 do if a[i] > 0 then begin s := s + a[i]; k := k + 1; end; sa := s/k; |
s = 0; k = 0 for i in range(10): if a[i] > 0: s = s + a[i]; k = k+1 sa = s / k |
У яких випадках під час виконання проєкту з цим фрагментом може виникнути помилка?
![]()
1●. Створіть проєкт, у якому вводяться значення середніх денних температур за кожний день тижня і визначається середнє арифметичне від’ємних з них. Використайте одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.1, створеній у вашій папці.
2●.Створіть проєкт, у якому вводяться кількості відвідувачів музею в кожний з 10 днів і визначається, скільки днів кількість відвідувачів перевищувала 100 осіб. Використайте одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.2, створеній у вашій папці.
3●. Створіть проєкт, у якому вводяться семестрові оцінки учня з 12 предметів і визначається, чи є серед них оцінки, нижчі ніж 4. Використайте одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.3, створеній у вашій папці.
4●. Випускник/випускниця 11-го класу може отримати грамоту за особливі успіхи у навчанні з певного предмету, якщо його/її річна оцінка з цього предмету – 12. Створіть проєкт для визначення кількості грамот, які можуть отримати учні/учениці цього класу. Використайте одновимірний масив (список) для збереження оцінок з даного предмету усіх учнів класу. Збережіть проєкт у папці з іменем Завдання 5.2.4, створеній у вашій папці.
5●. Випускник/випускниця 9-го класу може отримати свідоцтво з відзнакою, якщо всі його/її річні оцінки не менше ніж 10. Створіть проєкт для визначення, чи отримає даний учень/учениця свідоцтво з відзнакою. Використайте одновимірний масив (список) для збереження оцінок цього учня/учениці з усіх предметів.
Збережіть проєкт у папці з іменем Завдання 5.2.5, створеній у вашій папці.
6●. Створіть проєкт, у якому вводяться значення елементів одновимірного масиву (списку) з різних дійсних чисел, кількість яких не перевищує 50, визначається найменший і він обмінюється місцями з третім елементом. Виведіть отриманий одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.6, створеній у вашій папці.
7●. Створіть проєкт, у якому вводяться значення елементів одновимірного масиву (списку) з різних дійсних чисел, кількість яких не перевищує 30, визначається найменший і найбільший елементи. Найбільший елемент обміняйте місцями з другим елементом, а найменший – з передостаннім. Виведіть отриманий одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.7, створеній у вашій папці.
8●. Створіть проєкт, у якому вводяться семестрові оцінки учня/учениці з 15 предметів і визначається, яких оцінок у нього/неї найбільше: початкового рівня (1–3), середнього рівня (4–6), достатнього рівня (7–9) чи високого рівня (10–12). Використайте одновимірний масив (список) для збереження всіх оцінок учня/учениці. Збережіть проєкт у папці з іменем Завдання 5.2.8, створеній у вашій папці.
9*. Створіть проєкт, у якому вводяться кількості деталей, виготовлених бригадою за кожний день протягом першої половини місяця, визначається найбільша кількість деталей, виготовлена упродовж одного дня, і протягом скількох днів бригада виготовляла цю найбільшу кількість деталей. Використайте одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.9, створеній у вашій папці.
10*. Створіть проєкт, у якому вводяться кількості опадів за кожний день протягом місяця, визначається середня кількість опадів протягом цього місяця і в які дати кількість опадів більше за середню, а в які – менше від серед-
ньої. Використайте одновимірний масив (список). Збережіть проєкт у папці з іменем Завдання 5.2.10, створеній у вашій папці.
ПРАКТИЧНА РОБОТА № ???
«Знаходження сум і кількостей значень елементів одновимірного масиву за заданими умовами»
Увага! Під час роботи з комп’ютером дотримуйтеся вимог безпеки життєдіяльності та санітарно-гігієнічних норм.
1.
Створіть проєкт для розв’язування задачі: У багаторядковому текстовому полі містяться 8 оцінок учня/учениці, отриманих протягом вивчення теми. Визначте середню оцінку учня/учениці за тему. Визначте, скільки оцінок вище ніж 7.
У проєкті:
1) Розмістіть на формі потрібні елементи керування: багаторядкове текстове поле, написи, кнопк и.
2) Складіть обробник події Click для першої кнопк и, у результаті виконання якого середня оцінка учня/учениці за тему буде виведена в напис.
3) Складіть обробник події Click для другої кнопк и, у результаті виконання якого в напис буде виведено, скільки оцінок учня/учениці більше за 7 .
4) Протестуйте створений вами проєкт і проаналізуйте правильність його виконання.
2. Збережіть проєкт у папці з іменем Практична ???, створеній у вашій папці.
1. Створіть проєкт для розв’язування задачі: Уведіть 8 оцінок учня, отриманих ним протягом вивчення теми. Визначте середню оцінку учня за тему. Визначте, скільки оцінок вище ніж 7.
2. Протестуйте створений вами проєкт і проаналізуйте правильність його виконання.
3. Збережіть проєкт у вашій папці у файлі з іменем практична???.py.
ПРАКТИЧНА РОБОТА № ???
«Пошук значень в одновимірному масиві»
Увага! Під час роботи з комп’ютером дотримуйтеся вимог безпеки життєдіяльності та санітарно-гігієнічних норм.
1.
Створіть проєкт для розв’язування задачі: У багаторядковому текстовому полі міститься час, який показав кожен з учасників/учасниць змагань вашого закладу освіти з бігу на дистанцію 60 метрів. Визначте найбільший і найменший час. Визначте, скільки спортсменів/спортсменок показали найкращий час. Чи оновлено на цих змаганнях рекорд вашого закладу освіти?
2. Збережіть проєкт у папці з іменем Практична ??, створеній у вашій папці.
3. Протестуйте створений вами проєкт і проаналізуйте правильність його виконання.
1.
Створіть проєкт для розв’язування задачі: Уведіть час, який показав кожен з учасників/учасниць змагань вашого закладу освіти з бігу на дистанцію 60 метрів. Визначте найбільший і найменший час. Визначте, скільки спортсменів/спортсменок показали найкращий час. Чи оновлено на цих змаганнях рекорд вашого закладу освіти?
2. Збережіть проєкт у вашій папці у файлі з іменем практична ??.py.
3. Протестуйте створений вами проєкт і проаналізуйте правильність його виконання.
1.
Як визначити найбільший і найменший елементи одновимірного масиву?
2. Як обміняти місцями значення двох змінних?
3. Як ви розумієте поняття «Складність задачі»?
Одновимірний масив вважається впорядкованим, якщо серед значень його елементів встановлено певний порядок. Наведемо кілька прикладів впорядкованих одновимірних масивів:
• список учнів вашого класу на кожній сторінці класного журналу впорядкований в алфавітному порядку;
• список слів в орфографічному або тлумачному словнику також впорядковані в алфавітному порядку (мал. 5.7);

Мал. 5.7. Фрагмент орфографічного словника
• список номерів автобусних маршрутів і відомостей про кожний з них впорядкований за зростанням номерів маршрутів (мал. 5.8);
• підсумковий протокол результатів змагань з бігу на 100 м впорядкований за зростанням часу, за який учасники пробігли дистанцію: від найменшого часу до найбільшого;
• підсумкова таб лиця чемпіонату України з футболу впорядкована за спаданням кількості набраних очок: від найбільшої кількості набраних очок до найменшої (при рівності набраних очок таб лицю впорядковують за додатковими критеріями)
та інші.
Одновимірні масиви впорядковують перш за все для того, щоб пошук необхідних даних у них відбувався значно швидше, ніж у невпорядкованих. І це значно економить час виконання проєктів, особливо якщо масиви містять багато (тисячі, або навіть сотні тисяч) елементів.
Розрізняють 4 види впорядкованості одновимірного масиву за значеннями його елементів: за зростанням, за спаданням, за неспаданням, за незростанням.
Одновимірний масив a називається впорядкованим за зростанням (зростаючим), якщо значення кожного його наступного елемента більше значення попереднього, тобто для всіх і виконується нерівність a[i+1] > a[i]. Наприклад, впорядкованим за зростанням (зростаючим) є масив: 5; 12; 32; 44,5; 88; 101.
Одновимірний масив a називається впорядкованим за спаданням (спадним), якщо значення кожного його наступного елемента менше значення попереднього, тобто для всіх і викону-
|
ється нерівність a[i+1] < a[i]. Наприклад, |
Мал. 5.8. Список автобусних маршрутів |
впорядкованим за спаданням (спадним) є масив: 45; 32; 22; 4,5; 0; –7.
Одновимірний масив a називається впорядкованим за неспаданням (неспадним), якщо значення кожного його наступного елемента не менше (більше або дорівнює) значення попереднього, тобто для всіх і виконується нерівність a[i+1] ≥ a[i]. Наприклад, впорядкованим за неспаданням (неспадним) є масив: 15; 22; 22; 34; 40; 40.
Одновимірний масив a називається впорядкованим за незростанням (незростаючим), якщо значення кожного його наступного елемента не більше (менше або дорівнює) значення попереднього, тобто для всіх і виконується нерівність a[i+1] ≤ a[i]. Наприклад, впорядкованим за незростанням (незростаючим) є масив: 35; 12; 12; 7; 7; 1.
Алгоритми перетворення невпорядкованих одновимірних масивів у впорядковані називаються алгоритмами впорядкування (сортування) одновимірних масивів.
Таких алгоритмів існує досить багато. Ми розглянемо два з них: впорядкування методом вибору і впорядкування методом обміну.
Розглянемо алгоритм впорядкування одновимірного масиву методом вибору. Будемо впорядковувати масив за зростанням.
Пояснимо ідею цього алгоритму на прикладі.
Нехай маємо такий одновимірний масив з 6 чисел. Він невпорядкований.
|
23 |
7 |
4 |
16 |
|
-2 |
10 |
|
Виберемо найменший елемент масиву (це – число –2) |
|
|
||||
|
23 |
7 |
4 |
16 |
|
-2 |
10 |
і обміняємо його місцями з першим елементом масиву.
Отримаємо масив, у якому перший елемент є найменшим серед усіх елементів масиву. Тобто перший елемент вже зайняв своє місце в майбутньому впорядкованому масиві:
|
-2 |
7 |
4 |
16 |
23 |
10 |
Виберемо найменший елемент невпорядкованої частини масиву (це – число 4)
|
-2 |
7 |
4 |
16 |
23 |
10 |
і обміняємо його місцями з першим елементом невпорядкованої частини масиву (це – число 7).
Отримаємо масив, у якому перші два елементи масиву впорядковані за зростанням. Тобто вони вже зайняли своє місце в майбутньому впорядкованому масиві:
|
-2 |
4 |
7 |
16 |
23 |
10 |
Знову виберемо найменший елемент невпорядкованої частини масиву (це – число 7)
|
-2 |
4 |
7 |
16 |
23 |
10 |
і обміняємо його місцями з першим елементом невпорядкованої частини масиву (це в даному випадку – те саме число 7).
У даному випадку вони співпали. І ми отримаємо масив, у якому перші три елементи масиву впорядковані за зростанням. Тобто вони вже зайняли своє місце в майбутньому впорядкованому масиві:
|
-2 |
4 |
7 |
16 |
23 |
10 |
Ще раз виберемо найменший елемент невпорядкованої частини масиву (це – число 10) і обміняємо його місцями з першим елементом невпорядкованої частини масиву (це – число 16). Отримаємо такий масив:
|
-2 |
4 |
7 |
10 |
23 |
16 |
в якому перші чотири елементи зайняли своє місце в майбутньому впорядкованому масиві.
Ще один раз виконаємо ці операції, і отримаємо впорядкований за зростанням одновимірний масив:
|
-2 |
4 |
7 |
10 |
16 |
23 |
Звертаємо вашу увагу, що на останньому кроці виконання алгоритму свої місця зайняли одразу два елементи масиву.
Отже, ми мали одновимірний масив з 6 чисел. І ми 5 разів виконували такі дії:
1. Вибирали найменший елемент серед елементів поки що невпорядкованої частини масиву.
2. Обмінювали цей вибраний елемент з першим елементом поки що невпорядкованої частини масиву.
Складемо фрагмент проєкту для впорядкування за зростанням одновимірного масиву з 6 дійсних чисел, що вводяться з багаторядкового текстового поля, методом вибору. Впорядкований масив виводиться в інше багаторядкове поле.
var a: array [0..5] of real; i, j, nmin: integer; min:real; begin
for i := 0 to 5 do a[i] := StrToFloat(Memo1.Lines[i]); // уведення значень елементів одновимірного масиву з 6 дійсних чисел
for i := 0 to 4 do // 5 разів повторюємо begin
min := a[i]; nmin := i; // перший елемент невпорядкованої поки що частини одновимірного масиву вважаємо найменшим і його номер – номером найменшого
for j := i+1 to 5 do // п ереглядаємо елементи масиву, починаючи з наступного і до останнього, можливо серед них є менший, ніж той, який ми на даний момент вважаємо найменшим у невпорядкованій частині
if a[j]<min then begin min := a[j]; nmin := j; end; // я кщо зустрічається елемент, менший ніж той, який ми вважаємо найменшим у невпорядкованій ча-
стині масиву, він стає найменшим і його номер стає номером найменшого
a[nmin] := a[i]; // н а місце знайденого найменшого елемента невпоряд-
кованої поки що частини одновимірного масиву ставимо перший елемент невпорядкованої частини масиву
a[i] := min // н амісце першого елемента невпорядкованої поки що части-
ни одновимірного масиву ставимо знайдений найменший
end; Memo2.Clear;
for i := 0 to 5 do Memo2.Lines.Append(floattostr(a[i]); // в иведення впоряд-
кованого одновимірного масиву
end;
Складемо фрагмент проєкту для впорядкування за зростанням списку з 6 дійсних чисел, що вводяться з клавіатури, методом вибору. a = list(map(float, input(‘Уведіть 6 чисел через пропуск > ‘).split()))
# уведення значень елементів списку з 6 дійсних чисел
for i in range(5): # 5 разів повторюємо
min = a[i] # перший елемент невпорядкованої поки що частини списку вважаємо найменшим
nmin = i # номер першого елемента невпорядкованої поки що частини списку вважаємо номером найменшого
for j in range(i+1, 6): # переглядаємо елементи списку, починаючи з наступного і до останнього, можливо серед них є менший, ніж той, який ми на даний момент вважаємо найменшим у невпорядкованій частині
if a[j]<min: # я кщо зустрічається елемент, менший ніж той, який ми вважаємо найменшим у невпорядкованій частині списку, він стає найменшим і його номер стає номером найменшого
min = a[j] nmin = j
a[nmin] = a[i] # на місце знайденого найменшого елемента невпорядкованої
поки що частини списку ставимо перший елемент невпорядкованої частини списку
a[i] = min # на місце першого елемента невпорядкованої поки що частини списку ставимо знайдений найменший
print(a) # виведення впорядкованого списку Звертаємо вашу увагу:
1. Щоб впорядкувати одновимірний масив за спаданням, потрібно на кожному кроці у невпорядкованій поки що частині масиву вибирати не найменший елемент, а найбільший. Для цього необхідно внести певні зміни у фрагмент проєкту. Обговоріть з однокласником/однокласницею які саме це зробити.
2. Якщо в одновимірному масиві є рівні між собою елементи, то наведений алгоритм впорядкує його за неспаданням. Переконайтеся в цьому разом з однокласником/однокласницею на прикладі масиву: 12; 4; 6; 2; 6; 4.
3. В Інтернеті можна переглянути візуалізацію методу вибору, наприклад, за адресами https://www.youtube.com/watch?v=Ns4TPTC8whw або https://www. toptal.com/developers/sorting-algorithms.
Розглянемо алгоритм впорядкування одновимірного масиву методом обміну. Будемо, як і в попередньому алгоритмі, впорядковувати масив за зростанням.
Для пояснення ідеї цього алгоритму розглянемо для прикладу також невпорядкований масив з 6 чисел.
|
13 |
6 |
5 |
18 |
11 |
10 |
Братимемо по черзі два сусідні елементи масиву (перший і другий, другий і третій, третій і четвертий і т.д.) і, якщо лівий з них більше правого, обмінюватимемо їх місцями.
Беремо перший і другий елементи масиву: 13 і 6, 13>6, тому обмінюємо їх місцями і отримаємо такий масив:
|
6 |
13 |
5 |
18 |
11 |
10 |
Беремо другий і третій елементи масиву: 13 і 5, 13>5, тому обмінюємо їх місцями і отримаємо такий масив:
|
6 |
5 |
13 |
18 |
11 |
10 |
Беремо третій і четвертий елементи масиву: 13 і 18, 13 не більше 18, тому не обмінюємо їх місцями і масив залишається той самий.
Беремо четвертий і п’ятий елементи масиву: 18 і 11, 18>11, тому обмінюємо їх місцями і отримаємо такий масив:
|
6 |
5 |
13 |
11 |
18 |
10 |
Беремо п’ятий і шостий елементи масиву: 18 і 10, 18>10, тому обмінюємо їх місцями і отримаємо такий масив:
|
6 |
5 |
13 |
11 |
10 |
18 |
У результаті першого проходу по масиву найбільший елемент масиву стає останнім і займає своє місце в майбутньому впорядкованому масиві. Тому в подальшому впорядкуванні попередній до нього елемент порівнювати з ним вже не потрібно.
Далі потрібно повторити цей процес, починаючи з першого елемента масиву.
Тоді після другого проходу по масиву два останні елементи займуть свої місця в майбутньому впорядкованому масиві:
|
5 |
6 |
11 |
10 |
13 |
18 |
І так далі.
Усього потрібно зробити 5 проходів по масиву. На останньому проході свої місця займуть одразу два елементи. Після чого отримаємо впорядкований за зростанням масив.
ментів масиву з 6 дійсних чисел
for i := 0 to 4 do // 5 разів повторюємо прохід по масиву
for j := 0 to 4-i do // п орівнюємо кожну пару сусідніх елементів від першого елементу масиву до останнього у невпорядкованій частині масиву
if a[j]>a[j+1] then // якщо лівий з двох сусідніх елементів більше правого з них begin
x := a[j]; a[j] := a[j+1]; a[j+1] := x; // о бмінюємо два сусідні елементи
місцями, використовуючи допоміжну змінну х
end; Memo2.Clear;
for i := 0 to 5 do Memo2.Lines.Append(floattostr(a[i]); // в иведення значень
упорядкованого масиву
end;
Складемо фрагмент проєкту для впорядкування за зростанням одновимірного масиву з 6 дійсних чисел, що вводяться з клавіатури, методом обміну. a = list(map(float, input(‘Уведіть 6 чисел через пропуск > ‘).split())) # уведення значень елементів списку з 6 дійсних чисел for i in range(5): # 5 разів повторюємо прохід по списку
for j in range(5-i): # порівнюємо кожну пару сусідніх елементів від першого елементу масиву до останнього у невпорядкованій частині масиву
if a[j]>a[j+1]: # якщо лівий з двох сусідніх елементів більше правого з них x = a[j] # о бмінюємо два сусідні елементи місцями, використовуючи допоміжну змінну х
a[j] = a[j+1] a[j+1] = x print(a) # виведення впорядкованого списку Звертаємо вашу увагу:
1. Щоб впорядкувати одновимірний масив за спаданням, потрібно при порівнянні двох сусідніх елементів обмінювати їх місцями у тому випадку, якщо лівий з них менше правого з них. Для цього необхідно внести певні зміни у фрагмент проєкту. Обговоріть з однокласником/однокласницею які саме.
2. Якщо в одновимірному масиві є рівні між собою елементи, то наведений алгоритм впорядкує його за неспаданням. Переконайтеся в цьому разом з однокласником/однокласницею на прикладі масиву: 12; 4; 6; 2; 6; 4.
3. Наведений алгоритм може бути оптимізований, якщо на кожному проході відслідковувати, чи відбувся хоча б один обмін, і завершити виконання, якщо жодного обміну не було. Спробуйте це зробити разом з однокласником/однокласницею. Це значно прискорює виконання алгоритму, якщо масив є частково впорядкованим, а особливо, якщо лише окремі його елементи стоять не на своїх місцях.
4. Метод обміну інколи називають методом «бульбашки». За аналогією з тим, як бульбашки в газованій воді спливають на поверхню, елементи одновимірного масиву «спливають» в його кінці: спочатку найбільший, потім найбільший серед тих, що залишилися і т.д.
5. В Інтернеті можна подивитися візуалізацію методу обміну, наприклад, за адресами https://www.youtube.com/watch?v=lyZQPjUT5B4 або https://www. toptal.com/developers/sorting-algorithms.
Сучасні інформаційно-комунікаційні технології опрацьовують дуже великі обсяги даних. Це, наприклад,
• дані з вимірювальних пристроїв, що неперервно надходять, наприклад, з датчиків, що визначають стан ядерного реактора;
• дані від сотень мільйонів користувачів соціальних мереж;
• дані з метеорологічних станцій, що розташовані в багатьох точках Земної кулі; • дані від користувачів мереж мобільного зв’язку; та багато інших.
Алгоритми опрацювання таких великих обсягів даних повинні працювати дуже швидко. Адже, наприклад, якщо на ядерному реакторі виникла певна небезпечна ситуація, відповідні дані мають опрацьовуватися дуже швидко, майже миттєво, щоб система безпеки реактора негайно зреагувала відповідним чином і запобігла можливій аварії.
Швидкість роботи алгоритму визначається його складністю.
Складність алгоритму – це комплексна властивість алгоритму, яка визначає:
• часову складність алгоритму – час, необхідний для виконання алгоритму, який залежіть від кількості операцій, які потрібно виконати в алгоритмі;
• ємнісна складність алгоритму – об’єм пам’яті, необхідний для розміщення вхідних даних, проміжних і кінцевих результатів, а також команд алгоритму.
Часова та ємнісна складність алгоритму тісно пов’язані між собою і кожна з них залежить від обсягу вхідних даних.
Якщо б кожна операція в комп’ютері виконувалася протягом одного й того самого часу t0, то часову складність алгоритму Т можна було б обчислити за формулою Т = t0*n, де n – кількість операцій. Але реально різні операції можуть виконуватися протягом різного проміжку часу. Тому при визначенні часової складності алгоритму інколи враховують середній час виконання однієї операції, але найчастіше – максимальний час виконання операції.
Якщо алгоритм не містить циклів (лінійні алгоритми або алгоритми з розгалуженнями), то час виконання такого алгоритму пропорційний деякій константі. Складність такого алгоритму називається константною і позначається О(1). В таких алгоритмах обсяг вхідних даних, як правило, невеликий. Такими алгоритмами є, наприклад, алгоритм для обчислення значення виразу або функції, в яких використовується одна або кілька змінних.
Якщо алгоритм містить цикли, але не містить вкладені цикли, то час виконання такого алгоритму пропорційний деякій константі, помноженій на кількість вхідних даних n, оскільки від кількості даних залежить кількість повторів команд циклу. Складність такого алгоритму називається лінійною і позначається О(n). Це означає, що якщо кількість вхідних даних збільшити, наприклад, у 5 разів, то час виконання алгоритму теж збільшиться в 5 разів. Такими алгоритмами є, наприклад, алгоритм для обчислення суми всіх елементів одновимірного масиву з n елементів або алгоритм знаходження значення найбільшого елемента такого масиву. У таких алгоритмах вхідні дані переглядаються тільки 1 раз.
Якщо алгоритм містить вкладені один в інший два цикли, то час виконання такого алгоритму пропорційний деякій константі, помноженій на квадрат кількості вхідних даних n2. Складність такого алгоритму називається квадратичною і позначається О(n2). Це означає, що якщо кількість вхідних даних збільшити, наприклад, у 5 разів, то час виконання алгоритму збільшиться в 52=25 разів. Такими алгоритмами є, наприклад, розглянуті в цьому пункті алгоритми впорядкування одновимірного масиву з n елементів. У таких алгоритмах вхідні дані переглядаються приблизно n2 разів.
Якщо алгоритм містить вкладені один в інший три цикли, то час виконання такого алгоритму пропорційний деякій константі, помноженій на куб кількості вхідних даних n3. Складність такого алгоритму називається кубічною і позначається О(n3). Це означає, що якщо кількість вхідних даних збільшити, наприклад, у 5 разів, то час виконання алгоритму збільшиться в 53=125 разів. У таких алгоритмах вхідні дані переглядаються приблизно n3 разів.
Лінійна, квадратична, кубічна складності є частковими випадками поліноміальної складності, яка позначається О(nm), де m – натуральне число.
Розрізняють ще й інші види складності алгоритмів.
З поняттям складності алгоритму безпосередньо пов’язано поняття його ефективності. Алгоритм, який виконується швидше і/або використовує менший об’єм пам’яті, вважається ефективнішим. Тому чим менша складність алгоритму, тим він ефективніший.
Ефективність алгоритму може залежати від набору вхідних даних. Так якщо порівняти розглянуті в цьому пункті алгоритми впорядкування одновимірних масивів з n елементів, то з’ясується, що для невеликої кількості елементів (n < 100) швидше виконується алгоритм впорядкування методом обміну, а для (n ≥ 100) – алгоритм впорядкування методом вибору.
Для розв’язування однієї й тієї ж задачі можна скласти алгоритм різної складності, а значить й різної ефективності. Розглянемо одну таку задачу.
Задача. Дано впорядкований за зростанням одновимірний масив з n елементів і ще одне число. Визначити, чи є це число серед елементів масиву.
У попередньому пункті був розглянутий алгоритм розв’язування аналогічної задачі, в якому елементи масиву послідовно порівнюються із даним числом. В найгіршому випадку таких порівнянь буде виконано n. Це буде у випадку, коли числа в масиві немає або якщо воно буде останнім елементом масиву.
Але для впорядкованого масиву існує ефективніший алгоритм для розв’язування цієї задачі. Порівняємо дане число із значенням елемента, який розташований посередині масиву. Якщо число менше цього елемента масиву, то воно може бути тільки в лівій половині масиву, а якщо ні – то тільки в правій. Таким чином за одне порівняння кількість елементів масиву, серед значень яких може бути дане число, зменшується вдвічі.
Далі порівняємо дане число із значенням елемента, який розташований посередині визначеної половини масиву. І після цього порівняння число елементів масиву, серед значень яких може бути дане число, зменшується ще вдвічі, тобто в 4 рази. І так далі.
Цей алгоритм називається алгоритмом половинного поділу. Він був відомий ще стародавнім грекам і називався дихотомією.
Якщо порівняти ефективності алгоритму послідовного перегляду і алгоритм половинного поділу, то при n = 1000 в першому алгоритмі потрібно виконати максимум 1000 порівнянь, а в другому – максимум 10.
Використання великої літери О для позначення складності алгоритму (так звана О-нотація) була запозичена з математики. Там її застосовують для позначення, до значень якої функції асимптотично (все ближче і ближче) наближаються значення даної функції. Наприклад, для малих додатних значень х значення функції у = х2 дуже мало відрізняється від значень функції у = х, і тому х2 = О(х). А для великих додатних значень х значення функції у = х2 + х3 дуже мало відрізняється від значень функції у = х3, і тому х3+х2 = О(х3).
Потреба у створенні швидких та ефективних алгоритмів впорядкування вперше виникла на початку ХХ ст. у США і була зумовлена значними обсягами даних, які потрібно було впорядковувати – результатами перепису населення.
З появою комп’ютерів на початку 40-х років ХХ ст. обсяг даних для опрацювання постійно збільшувався. І для зменшення часу роботи програм опрацювання цих даних розробляли більш ефективні алгоритми впорядкування.
Такі алгоритми розробили відомі математики і програмісти Джон фон Нейман (1903–1957, Угорщина, США), Чарльз Хоар (нар. 1934, Велика Британія), Дональд Шелл (1924 – 2015, США), Дональд Кнут (нар. 1938, Велика Британія), Едсгер Дейкстра (1930–2002, Нідерланди).
Українські науковці багато років займаються вдосконаленням та застосуванням алгоритмів впорядкування для оптимізації обчислень. Проблемами впорядкування даних займалися дослідники Інституту кібернетики імені В. М. Глушкова НАН України для організації обчислень на комп’ютерах із розподіленою пам’яттю. Ці дослідження стосувалися як фундаментальних досліджень символьної обробки інформації, так і їхнього практичного застосування (в паралельних обчисленнях, розпізнаванні образів, нейронних мережах, хмарних обчисленнях та ін.).
Суттєвий внесок в дослідженні цих питань внесли українські вчені Жалдак М.І. (1937–2021) і Тріус Ю.В. (нар. ).
Увага! Під час роботи з комп’ютером дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
Задача 1. Складіть проєкт для введення значень елементів одновимірного масиву з 10 дійсних чисел, впорядкування цього масиву за незростанням методом вибору і виведення впорядкованого масиву.
1. Відкрийте вікно середовища Lazarus.
2. Розмістіть на формі 2 багаторядкових текстових поля і кнопку.
3. У перше багаторядкове текстове поле введіть 10 довільних дійсних чисел.
4. Створіть обробник події Click для кноп ки.
5.
Уведіть як текст обробника події змінений відповідно до умови задачі фрагмент проєкту для впорядкування методом вибору, наведений в тексті пункту. Коментарі вводити не потрібно.
6. Збережіть проєкт у папці з іменем Вправа 5.3.1, створеній у вашій папці.
7. Виконайте проєкт. Проаналізуйте результат його виконання.
8. Змініть числа в першому багаторядковому текстовому полі.
9. Виконайте проєкт. Проаналізуйте результат його виконання.
10. Закрийте вікно середовища Lazarus.
1. Відкрийте вікно середовища IDLE та вікно створення проєкту.
2.
Уведіть змінений відповідно до умови задачі фрагмент проєкту для впорядкування списку методом вибору, наведений в тексті пункту. Коментарі вводити не потрібно.
3. Збережіть проєкт у вашій папці у файлі іменем вправа 5.3.1.py.
4. Виконайте проєкт кілька разів з різними вхідними даними. Проаналізуйте результат його виконання.
5. Закрийте вікно середовища IDLE.
Задача 2. Складіть проєкт для введення значень елементів одновимірного масиву з 10 дійсних чисел, впорядкування цього масиву за незростанням методом обміну і виведення впорядкованого.
1. Відкрийте вікно середовища Lazarus.
2. Розмістіть на формі 2 багаторядкових текстових поля і кнопку.
3. У перше багаторядкове текстове поле введіть 10 довільних дійсних чисел.
4. Створіть обробник події Click для кноп ки.
5.
Уведіть як текст обробника події змінений відповідно до умови задачі фрагмент проєкту для впорядкування масиву методом обміну, наведений в тексті пункту. Коментарі вводити не потрібно.
6. Збережіть проєкт у папці з іменем Вправа 5.3.2, створеній у вашій папці.
7. Виконайте проєкт. Проаналізуйте результат його виконання.
8. Змініть числа в першому багаторядковому текстовому полі.
9. Виконайте проєкт. Проаналізуйте результат його виконання.
10. Закрийте вікно середовища Lazarus.
1. Відкрийте вікно середовища IDLE.
2. Уведіть змінений відповідно до умови задачі фрагмент проєкту для впорядкування спаиску методом обміну, наведений в тексті пункту. Коментарі вводити не потрібно.
3. Збережіть проєкт у вашій папці у файлі іменем вправа 5.3.2.py.
4. Виконайте проєкт кілька разів з різними вхідними даними. Проаналізуйте результат його виконання.
5. Закрийте вікно середовища IDLE.
Одновимірний масив вважається впорядкованим, якщо серед значень його елементів встановлено певний порядок. Розрізняють 4 види впорядкованості одновимірного масиву за значеннями його елементів: за зростанням, за спаданням, за неспаданням, за незростанням.
Одновимірний масив a називається впорядкованим за зростанням (зростаючим), якщо значення кожного його наступного елемента більше значення попереднього, тобто для всіх і виконується нерівність a[i+1] > a[i].
Одновимірний масив a називається впорядкованим за спаданням (спадним), якщо значення кожного його наступного елемента менше значення попереднього, тобто для всіх і виконується нерівність a[i+1] < a[i].
Одновимірний масив a називається впорядкованим за неспаданням (неспадним), якщо значення кожного його наступного елемента не менше (більше або дорівнює) значення попереднього, тобто для всіх і виконується нерівність a[i+1] ≥ a[i].
Одновимірний масив a називається впорядкованим за незростанням (незростаючим), якщо значення кожного його наступного елемента не більше (менше або дорівнює) значення попереднього, тобто для всіх і виконується нерівність a[i+1] ≤ a[i].
Складність алгоритму – це комплексна властивість алгоритму, яка визначає:
• часову складність алгоритму – час, необхідний для виконання алгоритму, який залежіть від кількості операцій, які потрібно виконати в алгоритмі;
• ємнісна складність алгоритму – об’єм пам’яті, необхідний для розміщення вхідних даних, проміжних і кінцевих результатів, а також команд алгоритму.
Часова та ємнісна складність алгоритму тісно пов’язані між собою і кожна з них залежить від обсягу вхідних даних.
Якщо алгоритм не містить циклів (лінійні алгоритми або алгоритми з розгалуженнями), то час виконання такого алгоритму пропорційний деякій константі.
Складність такого алгоритму називається константною і позначається О(1).
Якщо алгоритм містить цикли, але не містить вкладені цикли, то що час виконання такого алгоритму пропорційний деякій константі, помноженій на кількість вхідних даних n. Складність такого алгоритму називається лінійною і позначається О(n).
Якщо алгоритм містить вкладені один в інший два цикли, то що час виконання такого алгоритму пропорційний деякій константі, помноженій на квадрат кількості вхідних даних n2. Складність такого алгоритму називається квадратичною і позначається О(n2).
Лінійна, квадратична, кубічна складності є частковими випадками поліноміальної складності, яка позначається О(nm), де m – натуральне число.
1○. Який одновимірний масив вважається впорядкованим? Наведіть приклади.
2○. Які ви знаєте 4 види впорядкованості одновимірного масиву? Наведіть приклади.
3●. Який одновимірний масив називається впорядкованим за зростанням? Наведіть приклади.
4●. Який одновимірний масив називається впорядкованим за спаданням? Наведіть приклади.
5●. Який одновимірний масив називається впорядкованим за неспаданням? Наведіть приклади.
6●. Який одновимірний масив називається впорядкованим за незростанням? Наведіть приклади.
7●. У чому полягає суть алгоритму впорядкування одновимірного масиву методом вибору?
8●. У чому полягає суть алгоритму впорядкування одновимірного масиву методом обміну?
9●. Що таке складність алгоритму?
10●. Що означають складності алгоритмів О(1), О(n), О(n2), О(n3)?