НОУ ІНТУЇТ | лекція | Використання мови Free Pascal для обробки масивів

  1. 5.3 Операції над масивами Для роботи з масивом як з єдиним цілим треба використовувати ім'я масиву...
  2. 5.4.1 Організація введення-виведення в консольних додатках
  3. 5.4.2 Організація введення-виведення в візуальних додатках

5.3 Операції над масивами

Для роботи з масивом як з єдиним цілим треба використовувати ім'я масиву (без вказівки індексу в квадратних дужках). Для доступу до елементу масиву необхідно вказати ім'я масиву та в квадратних дужках порядковий номер елемента масиву, наприклад x [1], y [5], c [25], А [8].

У мові Free Pascal визначена операція присвоювання для масивів, ідентичних за структурою (з однаковими типами індексів і компонентів).

Наприклад, якщо масиви C і D описані як

var C, D: array [0 .. 30] of real;

то можна записати оператор

C: = D;

Така операція відразу всіх елементів масиву C присвоїть значення відповідних їм за номерами елементів масиву D.

Виконання будь-якої іншої операції над масивом треба організовувати поелементно, для чого необхідно організувати цикл, в якому послідовно обробляти елементи масиву; спочатку обробляємо перший елемент масиву, потім другий, третій, ..., Виконання будь-якої іншої операції над масивом треба організовувати поелементно, для чого необхідно організувати цикл, в якому послідовно обробляти елементи масиву;  спочатку обробляємо перший елемент масиву, потім другий, третій, -й ( см. рис. 5.1 - 5.2 ). Для обробки елементів масиву зручно використовувати цикл for..do.

5.4 Введення-виведення елементів масиву

Мова Free Pascal не має спеціальних засобів введення-виведення всього масиву, тому цю операцію слід організовувати поелементно. При введенні масиву необхідно послідовно вводити 1-й, 2-й і 3-й і т. Д. Елементи масиву, аналогічним чином вчинити і при виведенні. Отже, як для введення, так і для виведення необхідно організувати стандартний цикл обробки масиву ( см. рис. 5.3 - 5.4 ). Для звернення до елемента масиву необхідно вказати ім'я масиву та в квадратних дужках номер елемента, наприклад X [5], b [2] і т. Д.


Мал.5.1.

Блок-схема обробки елементів масиву з використанням циклу з передумовою
Мал. 5.2. Блок-схема обробки елементів масиву з використанням циклу for
Мал. 5.3. Алгоритм введення масиву X з використанням циклу з передумовою
Мал. 5.4. Алгоритм введення масиву X з використанням блоку модифікації

5.4.1 Організація введення-виведення в консольних додатках

Розглянемо реалізацію цих алгоритмів в консольних додатках.

// Введення елементів масиву X за допомогою циклу while. var x: array [1 .. 100] of real; i, n: integer; begin writeln ( 'введіть розмір масиву'); readln (N); i: = 1; while (i <= N) do begin write ( 'x (', i, ') ='); readln (x [i]); i: = i +1 end; end; // Введення елементів масиву X за допомогою циклу for. var x: array [1 .. 1 0 0] of real; i, n: integer; begin readln (N); for i: = 1 to N do begin write ( 'x (', i, ') ='); readln (x [i])} end; end.

Цикл for..do зручніше використовувати для обробки всього масиву, і в подальшому при виконанні подібних операцій з масивами ми будемо застосовувати саме його.

Висновок масиву організується аналогічно введенню, тільки замість блоку введення елемента масиву буде блок виведення.

Пропонуємо читачеві розглянути кілька варіантів виведення масиву дійсних чисел a = (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8), самостійно розібратися, чим вони відрізняються один від одного, і вирішити, який з варіантів зручніше в конкретному завданні.

// Варіант 1 for i: = 1 to n do write (a [i]: 3: 1);

Результат першого варіанту виведення масиву на екран представлений на малюнку 5.5 . Зверніть увагу, що між числами в даному варіанті відсутня пробіл.


Мал.5.5.

Результат першого варіанту виведення масиву
Мал. 5.6. Результат другого варіанту виведення масиву
Мал. 5.7. Результат третього варіанту виведення масиву // Варіант 2 for i: = 1 to n do write (a [i]: 6: 2);

Результат другого варіанту виведення масиву на екран представлений на малюнку 5.6 .

// Варіант 3 for i: = 1 to n do write (a [i]: 3: 1, '');

Результат третього варіанту виведення масиву на екран представлений на малюнку 5.7 .

// Варіант 4 writeln ( 'масив A'); for i: = 1 to n do writeln (a [i]: 6: 2);

Результат четвертого варіанту виведення масиву на екран представлений на малюнку 5.8 .

// Варіант 5 for i: = 1 to n do write ( 'a (', i, ') =', a [i]: 3: 1, ''); }

Результат п'ятого варіанту виведення масиву на екран представлений на малюнку 5.9 .


Мал.5.8.

Результат четвертого варіанту виведення масиву
Мал. 5.9. Результат п'ятого варіанту виведення масиву
Мал. 5.10. Результат шостого варіанту виведення масиву // Варіант 6 for i: = 1 to n do writeln ( 'a (', i, ') =', a [i]: 6: 2);

Результат шостого варіанту виведення масиву на екран представлений на малюнку 5.10 .

Таблиця 5.4. Властивості компонента Edit1 Властивість Name1 Text Height Left Top Width ReadOnly Значення Edit1 '' 23 103 184 492 True Таблиця 5.5. Властивості компонента Button1 Властивість Name1 Caption Height Left Top Width Значення label1 Button1 25 177 392 239

5.4.2 Організація введення-виведення в візуальних додатках

Розглянемо можливості організації введення-виведення масивів в візуальних додатках, для виведення масивів можна використовувати стандартний компонент типу TEdit.

Розглянемо ці можливості на прикладі стандартної завдання виведення масиву дійсних чисел a = (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8).

Розташуємо на формі кнопку (компонент типу TButton) і компонент типу TEdit ( см. рис. 5.11 ).

В табл. 5.4 - 5.5 наведені властивості компонентів типу TButton і TEdit.

Наше додаток одним помахом по кнопці Висновок масиву буде виводити масив a в поле введення Edit1. Алгоритм виведення масиву полягає в наступному: кожне число переводиться в рядок за допомогою функції FloatToStr, після чого отриманий рядок додається до поля виведення. Текст обробника події Button1Click з коментарями наведено нижче.

procedure TForm1. Button1Click (Sender: TObject); var // Вихідний масив a. a: array [1 .. 8] of real = (1. 1, 2. 2, 3. 3, 4. 4, 5. 5, 6. 6, 7. 7, 8. 8); i: integer; // В змінної n зберігається кількість елементів в масиві // дійсних чисел. n: integer = 8; S: string = ''; begin Edit1. Text: = ''; // Цикл for для послідовної обробки всіх елементів // масиву a. for i: = 1 to n do // Додавання в поле введення Edit1 рядки, яка отримана з // елементу масиву a [i]. Edit1. Text: = Edit1. Text + FloatToStr (a [i]) + ''; end;

Після клацання по кнопці Висновок масиву вікно програми стане подібним до того, яке представлено на Мал. 5.12 .

Для введення масивів в Lazarus в найпростішому випадку можна скористатися функцією InputBox. Як приклад розглянемо проект, в якому буде здійснюватися введення масиву при натисканні на кнопку. На формі розташуємо єдину кнопку. Текст обробник події Button1Click з коментарями наведено нижче.

procedure TForm1. Button1Click (Sender: TObject); var i, n: byte; X: array [1 .. 20] of real; begin // Кількість елементів масиву. n: = StrToInt (InputBox ( "Введення елементів масиву ',' n = ',' 7 ')); for i: = 1 to n do // Поелементний введення. // Введення чергового елемента масиву. X [i]: = StrToFloat (InputBox ( "Введення елементів масиву ',' Введіть '+ IntToStr (i) +' елемент ',' 0,00 ')); end;
Мал. 5.13. Введення розміру масиву
Мал. 5.14. Введення другого елемента масиву

При натисканні на кнопку на екрані з'явиться вікно для введення розміру масиву ( см. рис. 5.13 ).

Після коректного введення розміру масиву, послідовно будуть з'являтися діалогові вікна для введення чергового елемента, подібні представленому на Мал. 5.14 .

Для виведення масиву за допомогою діалогового вікна можна застосувати функцію MessageDlg:

for i: = 1 to n do MessageDlg ( 'X [' + IntToStr (i) + '] =' + FloatToStr (X [i]), MtInformation, [mbOk], 0)

яка буде відкривати окреме вікно для кожного елемента ( см. рис. 5.15 ).


Мал.5.15.

Висновок третього елемента масиву

Щоб у користувача була можливість переглядати елементи масиву одночасно, можна сформувати з них рядок, а потім вивести її, приміром, на форму у вигляді мітки або у вікні повідомлення:

var i, n: byte; X: array [1 .. 2 0] of real; S: string; begin // У змінну строкового типу записується порожній рядок. S: = ''; for i: = 1 to n do // Виконується злиття елементів масиву, перетворених в // рядки, і символів пробілу; результат - рядок, в якій // елементи масиву перераховані через пробіл. S: = S + FloatToStrF (X [i], ffFixed, 5,2) + ''; // Отриману рядок можна вивести у вигляді мітки Label2. Caption: = S; // Висновок рядка на форму у вигляді мітки. // Аналогічно рядок можна вивести у вигляді повідомлення, використовуючи // функцію MessageDlg (S, MtInformation, [mbOk], 0);

Найбільш універсальним способом введення-виведення як одновимірних, так і двовимірних масивів є компонент типу TStringGrid ( "таблиця рядків"). Ознайомимося з цим компонентом докладніше.

на Мал. 5.16 представлений проект форми, на якій розташований компонент типу TStringGrid1 (таблиця рядків). Осередки таблиці рядків призначені для читання або редагування даних. Цей компонент може служити як для введення, так і для виведення масиву.

Основні властивості цього компонента представлені в таблиці 5.6 .

Таблиця 5.6. Основні властивості компонента типу TStringGrid Властивість Опис Name Ім'я компонента ColCount Кількість стовпців таблиці RowCount Кількість рядків таблиці Cells Двовимірний масив, в якому зберігається вміст таблиці. Осередок таблиці, що знаходиться на перетині стовпця номер col і рядки номер row, визначається елементом Cells [col, row], рядки в компоненті нумерується від 0 до RowCount-1, стовпці від 0 до ColCount-1 FixedCols Кількість зафіксованих зліва стовпців таблиці, які виділяються кольором і при горизонтальній прокрутці таблиці залишаються на місці FixedRows Кількість зафіксованих зверху рядків таблиці, які виділяються кольором і при вертикальній прокрутці таблиці залишаються на місці ScrollBars Параметр визначає наявність смуг прокрутки, можливі наступні значення параме тра:

  • ssNone - відсутність смуг прокрутки (в цьому випадку користувач може переміщатися по таблиці тільки за допомогою курсору);
  • ssHorizontal, ssVertical або ssBoth - наявність горизонтальної, вертикальної або обох смуг прокрутки;
  • ssAutoHorizontal, ssAutoVertical або ssAutoBoth - поява горизонтальної, вертикальної або обох смуг прокрутки у міру необхідності

Options.goEditing Логічна змінна, яка визначає, може користувач (True) чи ні (False) редагувати вміст комірок таблиці Options.goTab Логічна змінна, яка дозволяє (True) або забороняє (False) використання клавіші Таb для переміщення курсору в наступний елемент таблиці DefaultColWidth Ширина колонок таблиці DefaultRowHeight Висота рядків таблиці GridLineWidth Ширина розмежувальних ліній між осередками таблиці Left Відстань від таблиці до лівої межі форми Top Відстань від таблиці до верхньої межі форми DefaultColWidth Ширина стовпців таблиці DefaultRo wHeight Висота рядків таблиці Height Висота компонента типу TStringGrid Width Ширина компонента типу TStringGrid Font Шрифт, яким відображається вміст комірок таблиці

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

Розмістимо на формі дві мітки, два компонента типу TStringGrid і одну кнопку. Властивості компонентів StringGrid1 і StringGrid2 можна задати такими ж, як показано в табл. 5.7 .

Таблиця 5.7. Основні властивості компонента типу TStringGrid Властивість StringGrid1 StringGrid2 Опис ColCount 8 8 Кількість стовпців таблиці RowCount 1 + 1 Кількість рядків таблиці FixedCols 0 0 Кількість зафіксованих зліва стовпців таблиці FixedRows 0 0 Кількість зафіксованих зверху рядків таблиці Options.goEditing True False Логічна змінна, яка визначає можливість редагування вмісту осередків таблиці користувачем Left 186 186 Відстань від таблиці до лівої межі форми Top 72 216 Відстань від таблиці до верхньої межі форми Height 24 24 Висота компонента Width 518 518 Ширина компонента

Вікно форми додатка введення-виведення масиву буде подібно представленому на Мал. 5.17 .

В першу таблицю будемо вводити елементи масиву, в другу - перетворений масив. Клацання по кнопці Виконати викличе таку підпрограму:

procedure TForm1. Button1Click (Sender: TObject); var n, i: integer; a: array [0 .. 7] of real; begin for i: = 0 to 7 do // Введення масиву. // З поля таблиці зчитується елемент, // перетворюється в число і присвоюється елементу масиву. a [i]: = StrToFloat (StringGrid1.Cells [i, 0]); for i: = 0 to 7 do // Вивід масиву. // Елемент масиву перетворюється в рядок і поміщається в // поле таблиці. StringGrid2.Cells [i, 0]: = FloatToStrF (a [7 - i], ffFixed, 5, 2); end;

При запуску програми на виконання з'являється вікно програми, подібне представленому на Мал. 5.17 , Користувач вводить вихідний масив, клацає по кнопці Виконати, після чого вікно додатка набирає вигляду, як на Мал. 5.18 .

У параграфі 5.4 були розглянуті різні способи введення-виведення як в консольних, так і в візуальних додатках. Надалі ми будемо використовувати ті з них, які зручніше при вирішенні конкретної задачі.

Тепер перейдемо до розгляду основних алгоритмів обробки одновимірних масивів, багато з яких аналогічні відповідним алгоритмам обробки послідовностей (обчислення суми, твори, пошук елементів за певною ознакою, вибірки і т. Д.). Відмінність полягає в тому, що в масиві одночасно доступні всі його компоненти, тому з масивами стають можливі більш складні дії (наприклад сортування елементів масиву, видалення і вставка елементів і т. Д.).