4. Лабораторна робота № 4 Оператори циклу й їх використання для операцій з масивами Мета: Набуття навичок із використання в програмах операторів циклу для операцій з масивами 4.1. Масиви Масив – це впорядкований набір однотипних даних, що мають спільне ім’я. Вони корисні при обробці великої кількості даних, коли використання простих змінних є неефективним і непрактичним. Перед використанням масиву його слід оголосити. Для оголошення масиву використовується оператор [Dim | Public | Private] <ім’я масиву> ({n1 To} m1 {, {n2 To} m2 . . . }) As <тип> де Dim, Public, Private, As i To зарезервовані слова, параметри nj і mj задають відповідно нижню і верхню межі зміни значення індексу, а j = 1, 2, …– визначає розмірність масиву. Розмірність задає кількість індексів, яка використовується для визначення елементів масиву. Visual Basic передбачає можливість опису багатовимірних масивів (одновимірних, двовимірних і т.д.) – допускається використання до 60 індексів. Якщо n – нижня межа зміни значення індексу опущена, то за замовчуванням вона приймається рівною нулю. Індекс може приймати цілочислове значення від –32768 до 32767. Оператори Dim A(18, 5) As Double Dim A(0 To 18, 0 То 5) As Double ілюструють різні способи опису одного й того самого масиву. Вони описують двовимірний масив – матрицю А, для якої визначено два індекси. Нижня границя обох індексів дорівнює 0. Верхня межа першого індексу дорівнює 18, другого – 5. Визначений масив складається з дев’ятнадцяти рядків і шести стовпців, які включають 114 елементів (19*6 = 114) типу Double. Звертання до елементів масиву здійснюється з використанням змінних з індексом. Змінна з індексом складається імені масиву, після якого в круглих дужках зазначаються значення індексів. Наприклад: А(4, 3) – означає елемент масиву А, який знаходиться в четвертому рядку й третьому стовпці. Змінні з індексами можна використовувати подібно до простих змінних, в усіх допустимих конструкціях мови, скажімо, у виразах. Значення елементу масиву можна надати з допомогою оператора присвоєння. Наприклад, оператори: A(I, J) = 4 * Cos(5 * Pi - 0.87) + A(I - 1, J) Address(I) = Street(I) & House(I) надають значення елементу числового масиву А і символьного Address. Зарезервовані слова Public і Private використовуються для означення області визначення масиву. Подібно до констант масив загального доступу Public можна описати лише в області загальних оголошень модуля. 4.2. Оператори циклу Оператори циклу дозволяють реалізувати багаторазове виконання деякої послідовності операторів. Visual Basic підтримує два типи операторів циклу: з фіксованою кількістю повторень і цикл з умовою, який повторює виконання до досягнення певної умови. Для виконання фіксованої кількості повторень використовується оператор циклу For-Next, формат якого має вигляд: For <параметр циклу> = <початкове значення> Тo <кінцеве значення> {Step <крок>} {блок операторів} {Exit For} {<блок операторів>} Next {<параметр циклу>} де For, To, Exit For, Step, Next – зарезервовані слова. Пара обов’язкових операторів For-Next складають заголовок і кінець циклу. Оператори, що знаходяться між ними утворюють тіло циклу. Цикл For-Next викликає повторне виконання операторів тіла циклу, для параметра циклу, значення якого змінюється від вказаного початкового до кінцевого з зазначеним кроком. Якщо крок не вказується, то за замовчуванням його значення приймається рівним одиниці. Після того як параметр циклу прийме усі свої допустимі значення і відповідне число раз виконаються оператори тіла циклу, буде виконуватися оператор наступний за Next. Виконання оператора циклу For-Next розглянемо на прикладі визначення суми елементів одновимірного масиву. Визначення суми елементів масиву організуємо шляхом накопичення значення суми в деякій допоміжній змінній. А саме, деякій змінній Suma надамо yekmjdt значення й далі значення цієї змінної послідовно додаватимемо значення всіх елементів масиву. В такий спосіб після додавання всіх елементів масиву змінна Suma набуде значення їх суми. Фрагмент програми для визначення суми елементів одновимірного масиву розмірністю 15 може мати вигляд: Dim A(1 To 15) As Single, Suma As Single, I As Integer ' Оператори оголошення масиву і змінних ' Змінна Suma запланована для зберігання значення суми, ' а І – параметра циклу Suma = 0 ' Присвоєння початкового значення For I = 1 To 15 ' Заголовок циклу Suma = Suma + A(I) ' Цей оператор виконається 15 разів Next I Під час виконання цього циклу For-Next його параметр І послідовно набуває значень 1, 2, 3, …, 15, що забезпечує сумування всіх елементів масиву А. В результаті виконання цього фрагмента програми у змінній Suma зберігатиметься значення суми всіх елементів масиву A. Використання масиву з символьними значеннями проілюструємо на прикладі програми "Календар", робоче вікно якої зображено на рис. 4.1. Ця програма за вказаною датою визначає день тижня. Номер дня тижня визначається за формулою , де , Int – функція, яка визначає цілу частини від числового значення аргумента, а параметри А, В і С задають відповідно рік, місяць і день дати, яка цікавить. Визначене за цією формулою N дорівнює номеру дня тижня, вважаючи понеділок першим днем. Підпрограми реакції на кнопки цього робочого вікна можуть включати такі оператори Dim A As Integer, B As Integer, C As Integer Dim N As Integer, K As Long Private Sub Vyhid_Click() End End Sub Private Sub Vyznachyty_Click() Dim Dni(7) Dni(1) = "Понeдiлок" Dni(2) = "Вівторок" Dni(3) = "Середа" Dni(4) = "Четвер" Dni(5) = "П'ятниця" Dni(6) = "Субота" Dni(7) = "Неділя" A = Val(Rik.Text) B = Val(Micjac.Text) C = Val(Den.Text) If B <= 2 Then GoTo Mitka1 B = B + 1: GoTo Mitka2 Mitka1: B = B + 13 A = A - 1 Mitka2: K = Int(365.25 * A) + Int(30.6 * B) + C - 621050 N = K - Int(K / 7) * 7 + 1 Nazva.Text = Dni(N) End Sub Для зберігання назв днів тижня в цій програмі використано символьний масив Dni. Оператор циклу допускає вкладення, тобто серед операторів у тілі циклу можуть бути інші оператори циклу. Зрозуміло, що у вкладених циклах внутрішній цикл виконується для кожного значення параметра зовнішнього циклу. При цьому внутрішній (вкладений) цикл повинен цілком міститися в зовнішньому. Число вкладення циклів не обмежене. Для ілюстрації розглянемо фрагмент програми формування вектора А(4), елементи якого є сумами стовпців матриці В(5, 4). Dim A(1 To 4) As Single, B(1 To 5, 1 To 4) As Single Dim I As Integer, J As Integer ' Оператори оголошення масивів і змінних For J = 1 To 4 ' Заголовок зовнішнього циклу A(J) = 0 ' Присвоєння початкового значення елементу вектора For I = 1 To 5 ' Заголовок внутрішнього циклу A(J) = A(J) + B(I, J) ' Обчислення суми п’яти елементів Next I Next J В наведеному прикладі внутрішній цикл з параметром І забезпечує визначення суми п’яти елементів J-го стовпця матриці В. Зазначимо, що оператор присвоєння A(J) = A(J) + B(I, J) виконається 20 (4*5) разів: по п’ять разів для кожного стовпця матриці В. Оператор присвоєння A(J) = 0 входить в тіло зовнішнього циклу з параметром J. Цей оператор виконається чотири рази, тому що параметр J в процесі виконання циклу набуває значення 1, 2, 3 і 4. Для виходу з циклу For-Next з метою передчасного припинення його виконання використовується оператор Exit For. Він може знаходиться в будь-якому місці серед операторів, що виконуються в циклі. Виконання оператора Exit For зумовлює передачу керування оператору, який слідує відразу за Next. Переважно він застосовується в умовних операторах, що перевіряють альтернативні умови припинення циклу, наприклад, через помилку в даних і ін. У Visual Basic визначено два варіанти оператора циклу Do-Loop з умовою: з передумовою й після умовою. Формат оператора циклу з передумовою має вигляд: Do [While | Until] <умова> {<блок операторів>} {Exit Do} {<блок операторів>} Loop Формат оператора циклу з після умовою такий: Do {<блок операторів>} {Exit Do} {<блок операторів>} Loop [While | Until] <умова> де Do, While, Until, Exit Do, Loop зарезервовані слова. Пари обов’язкових операторів Do-Loop визначають початок і кінець оператора циклу, а умова – це будь-який допустимий логічний вираз. Оператор While визначає повторне виконання операторів тіла циклу доти, поки задовольняється умова, тобто поки її значення – True, тоді як оператор Until навпаки – визначає виконання циклу доти, поки вказана умова не виконується, тобто поки вона зберігає значення False. Оператор Exit Do використовується для передчасного припинення виконання циклу. Він передає керування оператору, який слідує відразу за Loop. Застосування операторів While і Until на початку чи наприкінці циклу визначає момент перевірки умови: перед виконанням операторів циклу чи після. Значить в циклі з після умовою за будь-якої умови оператори циклу виконаються хоча б один раз. У випадку циклу з передумовою можлива ситуація, за якої оператори циклу не виконаються жодного разу. Під час використання операторів циклу Do-Loop важливо вірно передбачати умову його завершення. Ця умова має бути такою, щоб в результаті повторних виконань операторів в циклі вона набувала очікуваного (в розумінні досягнення завершення виконання циклу) значення, у випадку While – False, а Until – True. Якщо умову в циклі Do-Loop вказано невірно, то може виникнути ситуація, яку називають "зацикленням", за якої цикл повторює своє виконання безконечно. Вихід з такої ситуації можливий лише шляхом примусового припинення виконання програми. 4.3. Завдання Розробити програму формування значень функцій , , … , для х від a до b з кроком h. Для зберігання цих значень використати двовимірний масив. В робочому вікні програми передбачити задання початкового значення х – a, кінцевого – b і кроку його зміни – h, а також відображення зачень сформованої таблиці у вигляді колонок х, , , … , . Варіанти завдань:
для визначення значень функцій arcsin і arccos можна скористатись формулами: , де |x| < 1;
. Можливий вигляд робочого вікна цієї програми зображено на рис. 4.2. Підпрограми реакції на натиснення кнопок можуть включати оператори Option Explicit Dim a As Single, b As Single Dim h As Single, M(100, 3) As Single Dim x As Single, T As String Dim T1 As String, T2 As String, T3 As String Dim I As Integer, n As Integer, J As Integer Private Sub Obchyslyty_Click() a = Val(Pochatok.Text) b = Val(Kinec.Text) h = Val(Krok.Text) n = Int((b - a) / h) ' Кількість точок табуляції For I = 1 To n x = a + (I - 1) * h M(I, 1) = x M(I, 2) = Sin(x) M(I, 3) = Tan(x) Next I Tablyca.Text = " x sin(x) tg(x)" T = "" For I = 1 To n J = Len(Str(M(I, 1))) T1 = Str(M(I, 1)) & String$(8 - J, " ") J = Len(Str(M(I, 2))) T2 = Str(M(I, 2)) & String$(17 - J, " ") J = Len(Str(M(I, 3))) T3 = Str(M(I, 3)) T = T & vbCrLf & " " & T1 & " " & T2 & " " & T3 Next I Tablyca.Text = Tablyca.Text & T End Sub Private Sub Vyhid_Click() End End Sub 4.4. Варіанти додаткових завдань 1. Розробити програму для підрахунку середнього співвідношення м’ячів за один період волейбольного матчу. Для зберігання результатів кожного з періодів використати двовимірний масив. Зазначимо, що волейбольний поєдинок може тривати до п’яти періодів. Програма повинна передбачити можливість задання результатів кожного з періодів, відображати кінцевий рахунок у співвідношенні зіграних періодів, а також середнє співвідношення м’ячів за один період. 2. Розробити програму для підрахунку середнього співвідношення м’ячів за один період гандбольного матчу, який триває три періоди і можливу серію післяматчевих кидків, яка використовується для остаточного виявлення переможця фінального поєдинку. Відображення полів для задання післяматчевих кидків проводити лише за нічийного результату в основний час. Для зберігання результатів кожного з періодів використати двовимірний масив. Програма повинна передбачити можливість задання результатів кожного з періодів, відображати фінальний рахунок у співвідношенні закинутих м’ячів, а також середнє співвідношення м’ячів за один період. 3. Розробити програму для підрахунку середнього співвідношення м’ячів закинутих за один період баскетбольного матчу. Для зберігання результатів кожного з періодів використати двовимірний масив. Баскетбольний поєдинок може тривати три періоди, а також включати тайм-брейк для остаточного виявлення переможця. Відображення полів для задання результатів тайм-брейку проводити лише за нічийного результату в основний час. Програма повинна передбачити можливість задання результатів кожного з періодів, відображати фінальний рахунок у співвідношенні закинутих м’ячів, а також середнє співвідношення м’ячів за один період. 4. Розробити програму для підрахунку середнього співвідношення м’ячів за один сет тенісного матчу. Для зберігання результатів кожного з сетів використати двовимірний масив. Тенісний поєдинок може тривати до п’яти сетів. Відображення полів для задання результатів додаткових сетів проводити лише за нічийного результату в основний час. Програма повинна передбачити можливість задання результатів кожного з сетів, відображати кінцевий рахунок у співвідношенні зіграних сетів, а також середнє співвідношення м’ячів за один сет. 5. Розробити програму для підрахунку середнього співвідношення м’ячів за один тайм футбольного матчу. Футбольний футбольний поєдинок може тривати два тайми й у випадку нічийного рахунку передбачати ще два додаткові, а також серію післяматчевих пенальті для остаточного виявлення переможця. Відображення полів для задання результатів додаткових таймів проводити лише за нічийного результату в основний час. Для зберігання результатів кожного з таймів використати двовимірний масив. Програма повинна передбачити можливість задання результатів кожного з таймів, відображати фінальний рахунок матчу, а також середнє співвідношення м’ячів, забитих за один тайм. 6. Розробити програму для формування двовимірного символьного масиву, елементи якого зберігають прізвища та імена студентів Вашої групи (класу). Для зберігання цих даних використати двовимірний символьний масив. Програма повинна передбачати задання прізвищ та імен студентів, проводити визначення їх кількості та відображати наявні у масиві дані у текстовому полі. 7. Розробити програму визначення середньої денної та нічної температури за тиждень. Для зберігання цих температур використати двовимірний масив. Передбачити можливість вводу відповідних температур за тиждень і вивід середніх значень. 8. Розробити програму визначення середньорічної кількості опадів за сезонними показами за три останні роки. Для збереження необхідних даних використати двовимірний масив розмірністю 3 на 4. Передбачити можливість задання необхідних сезонних показами за три роки і відображення їх середніх значень. 9. Розробити програму підрахунку середнього балу за чотири роки навчання (по два семестри в рік). Для зберігання середніх семестрових оцінок використати масив розмірністю 4 на 2. Програма повинна передбачати задання оцінок кожного з семестрів за чотири роки навчання і відображення середнього балу за кожен рік навчання, а також за всі чотири роки. 4.5. Приклад виконання завдання Виконання цієї лабораторної роботи розглянемо на прикладі підрахунку результату хокейного матчу за результатами трьох окремих періодів. Результати кожного з цих періодів зберігатимемо у двовимірному масиві. Ця програма повинна передбачати задання результату кожного періоду і відображення фінального рахунку. Можливий вигляд робочого вікна програми зображено на рис. 4.3. Можливий варіант реакції на натиснення кнопок наведено нижче. Dim m(2, 4) As Integer Dim i As Integer Private Sub cmdQuit_Click() End End Sub Private Sub Rezultat_Click() m(1, 1) = Val(Sokil1.Text) m(2, 1) = Val(CSKA1.Text) m(1, 2) = Val(Sokil2.Text) m(2, 2) = Val(CSKA2.Text) m(1, 3) = Val(Sokil3.Text) m(2, 3) = Val(CSKA3.Text) m(1, 4) = 0 m(2, 4) = 0 For i = 1 To 3 m(1, 4) = m(1, 4) + m(1, i) m(2, 4) = m(2, 4) + m(2, i) Next i Sokil4.Caption = Str(m(1, 4)) CSKA4.Caption = Str(m(2, 4)) End Sub