// обчислення суми та виведення результатів в Edit
summa(sum);
str(sum:7:3,sv);
Edit1.Text:=sv;
// обчислення кількості від’ємних елементів з виведенням результатів
kol_otr(kol);
Edit2.Text:= IntToStr(kol);
// пошук мінімального елемента
min_el(min, nom);
// виведення результатів в Edit
str(min:7:3,smin);
Edit3.Text:=IntToStr(nom)+'-й елемент '+smin;
// формування масиву результатів із обміном елементів
r:=v;
pr:=r[1]; r[1]:=r[nom];r[nom]:=pr;
// виведення масиву в ListBox
for i:=1 to n do
begin str(r[i]:7:3,sr);
str(i:3,si);
ListBox1.Items.Add(si+sr);
end;
end;
end.
Приклад 2 Скласти схему алгоритму та проект програми в Delphi для введення 15-ти (або менше) цілих чисел з компонента Мемо та вивести їх за зростанням у вікно повідомлень (ShowMessage).
Схеми алгоритмів підпрограм наведено на рисунках 5.6-5.7.
Рисунок 5.6 – Схема підпрограми сортування вектора за зростанням
Форма проекту із результатами роботи програми має вигляд:
Текст програми:
unit Unit1;
interface
…………………………………………..
implementation
{$R *.DFM}
Type vect=array[1..15]of integer;
// процедура сортування вектора за зростанням
procedure sort(var x:vect; n:integer);
var i,j,z:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if x[i]>x[j] then
begin z:=x[i]; x[i]:=x[j]; x[j]:=z; end;
end;
// процедура відгуку на кнопку “Новий масив”
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear; edit1.Clear;
end;
// процедура відгуку на натиснення кнопки “Пуск”
procedure TForm1.Button1Click(Sender: TObject);
var a:vect;
i, k:integer;
sa,sr:string;
begin
// визначення та виведення кількості введених чисел
k:=Memo1.Lines.Count; edit1.text:=intToStr(k);
// введення елементів вектора
for i:=1 to k do
begin
sa:= Memo1.Lines[i-1];
a[i]:=StrToInt(sa);
end;
sort(a,k); // сортування вектора
// виведення елементів вектора
sr:='';
for i:=1 to k do
begin sa:=IntToStr(a[i]);
sr:=sr+sa+#13; end;
ShowMessage(sr);
end;
end.
4 Контрольні запитання
1 Що є масив у програмуванні? Чи є обмеження на розмір масиву?
2 Що є індекси масиву? Які величини можуть бути індексами? Як по-значаються індекси масиву?
3 Які з наведених нижче описувань одновимірних масивів є хибні й чому?
а) Type A : array [ 1..10 ] of integer;
Var B : A;
б) Var B : array [ 1..10 ];
в) Var B=array [ 1..10 ] of integer;
4 Запишіть опис одновимірного масиву, який складається з послідовності 25 дійсних чисел.
5 Запишіть опис одновимірного констант-масиву, який складається з послідовності символів вашого прізвища.
6 Які компоненти форми проекту в Delphi для виведення значень одновимірних масивів Ви знаєте?
7 Які компоненти форми проекту в Delphi для введення значень одновимірних масивів Ви знаєте?
8 Запишіть оператори введення масиву 15 цілих чисел за допомогою компонентів Memo та ListBox.
9 Запишіть оператори виведення масиву 17 дійсних чисел у п’ять різних компонентів.
10 Запишіть оператори визначення середнього значення для масиву з 12 дійсних чисел.
5 Лабораторне завдання
1.Скласти схеми алгоритмів, розробити проект форми та програми на алгоритмічною мовою Object Pascal для виконання індивідуального завдання відповідно до варіантів у середовищі Delphi. В проекті передбачити введення елементів масиву з клавіатури через компонент Memo й виведення цих масивів та здобутих результатів на форму в компоненти Edit, Memo, ListBox або Label (за вказівкою викладача).
2. Оформити протокол для виконання лабораторної роботи.
3.При виконанні програми на комп’ютері значення елементів масиву (послідовность чисел) обрати самостійно. Занести результати обчислень до протоколу.
6 Варіанти індивідуальних завдань
1 В масиві з 10 цілих чисел знайти найбільший елемент і поміняти його місцями з останнім елементом.
2 Упорядкувати за зростанням масив, що містить 12 дійсних чисел.
3 Масив цілих чисел складається з 11 елементів. Здобути новий масив різниць елементів вихідного масиву та їхньго середнього арифметичного.
4 Визначити кількість елементів масиву з 8 дійсних чисел, які перевищують за значенням останній елемент масиву.
5 Масив дійсних чисел складається з 9 елементів. Обчислити суму остачі від цільночисельного ділення елементів масиву на два.
6 Масив цілих чисел містить 10 елементів. Із вихідного масиву здобути новий, розташувавши спочатку всі додатні числа й нулi, після цього від’ємні, зберігаючи порядок їхнього слідування.
7 В масиві з 9 дійсних чисел визначити різницю між добутком усіх додатніх елементів і сумою модулів усіх від’ємних.
8 В масиві з 10 дійсних чисел знайти найменший елемент і поміняти його місцями з першим елементом.
9 Визначити індекси мінімального й максимального елементів масиву, що містить 11 цілих чисел.
10 Масив містить 8 дійсних чисел (додатніх і від’ємних). Розташувати елементи масиву в порядку зростання значень їхніх модулів.
11 В масиві з 11 цілих чисел знайти найбільший і найменший елементи і поміняти їх місцями.
12 Масив містить 10 цілих чисел. Замінити парні за значенням (а не за індексом) числа на нулі.
13 В масиві з 8 дійсних чисел обчислити суму елементів, абсолютна величина яких не перевищує 1.5 .
14 Розташувати елементи масиву з 8 цілих чисел у зворотному порядку.
15 Масив містить 8 дійсних чисел. Поміняти місцями першу половину масиву з другою.
16 Масив містить 10 цілих чисел. Поміняти місцями елементи, які стоять в масиві поряд ( 1 і 2, 3 і 4 тощо ).
17 В масиві з 8 дійсних чисел обчислити частку від ділення суми елементів з непарними індексами на суму елементів з парними індексами.
18 В масиві з 10 цілих чисел обчислити половину суми мінімального й максимального елементів масиву.
19 Масив містить 7 дійсних чисел. Обчислити суму квадратів тих чисел, абсолютна величина яких перевищує значення 2.5.
20 Масив містить 11 цілих чисел. Обчислити суму тих елементів масиву, значення яких належать до проміжку [ 3, 6 ].
21 Замінити всі непарні елементи масиву з 10 цілих чисел одиницями (непарні за значенням, а не за індексом ).
22 В масиві з 8 дійсних чисел поміняти місцями максимальний елемент масиву із третім елементом.
23 Масив містить 12 цілих чисел. Обчислити різницю між сумою елементів, індекси яких є кратні 3, і сумою елементів, індекси яких є кратні 4.
24 Масив містить 14 дійсних чисел. Обчислити добуток додатніх елементів, які не перевищують число 4.
25 В масиві з 10 цілих чисел розташувати елементи так: спочатку всі від’ємні й нулi, потім додатні, зберігаючи порядок їх слідування.
26 Масив містить 11 цілих чисел. Обчислити суму елементів масиву, значення яких можна поділити на два без остачі.
27 Масив містить 8 дійсних чисел. Визначити кількість тих елементів масиву, значення яких є менше за середнє арифметичне елементів масиву.
28 Упорядкувати за спаданням масив з 12 цілих чисел.
29 В масиві з 10 дійсних чисел визначити середнє арифметичне додатніх елементів.
30 В масиві з 11 цілих чисел поміняти місцями мінімальний елемент з передостаннім елементом масиву.
Лабораторна робота №6
Багатовимірні масиви
1 Мета роботи
Вивчити засоби використання багатовимірних масивів в програмах алгоритмічною мовою Object Pascal у середовищі Delphi.
2 Основні теоретичні відомості
2.1 Вимірність масиву
Кількість індексів визначає вимірність масиву, наприклад, вектори в програмах – це одновимірні масиви, матриці – двовимірні. Кількість індексів у елементів масивів є необмежена. Значення індексів записують після імені масиву в квадратних дужках і відокремлюють комами. Наприклад:
b[4,5], Matr [I,J+1], P['F','K'] - елементи матриць: b45, Matri,j+1, P’F’,’K’;
Masivlarge[i+2*m,True,25,n] - елемент масиву з чотирма індексами Masivlargei+2m,True,25,n.
У пам’яті комп’ютера елементи масиву розміщуються один за одниму такій спосіб, що при переході від молодших адрес до старших найперш змінюється крайній правий індекс. Так само, як і одновимірний масив, багатовимірний масив загалом може займати в пам’яті не більш за 2 Гбайт.
2.2 Описування багатовимірних масивів
Багатовимірні масиви (як і одновимірні) в програмах можна описувати двома способами :
1) Typeім'я_типу = аrray [тип_індексу1, тип індексу2, …] оfтип_елементів_масиву;
Varім'я_масиву:ім'я_типу;
2)Varім'я_масиву : аrray[тип_індексу1, тип індексу2, …] оf
тип_елементів;
Можна вказувати індекси іншим способом, наприклад, для двовимірного масиву :
Кількість елементів масиву дорівнює добутку кількості елементів кожного індексу.
Приклади описування масивів:
Type Matr1 = array [ 0.. 11,1..4,3..7 ] of boolean;
Matr2 = array [ 1.. 5, 1.. 5 ] of integer;
Matr3 = array [ 'a'..'e', -2..5, 1..8 ] of real;
Matr4 = array [ Boolean ,1..5,1..3,2..5] of char;
Var A : Matr1; B : Matr2; C : Matr3; D : Matr4;
X : array [ 1.. 8, 0.. 5 ] of boolean;
Тут описано :
А - тривимірний масив 240 елементів логічного типу;
B- квадратна матриця величин розміром 5´5
B11 B12 … B15
B21 B22 … B25
……………… ,
B51 B52 … B55
яка складена з цілих елементів:B[1,1], B[1,2], ... ,B[1,5], B[2,1], B[2,2], ... ,B[2,5],... ,B[5,1], B[5,2], ... ,B[5,5].
C - тривимірний масив 320 елементів дійсного типу;
D - четиривимірний масив 120 елементів символьного типу;
X - матриця елементів логічного типу розміром 8´6 елементів.
Для описування багатовимірних масивів зручно використовувати також типізовані констант-масиви, які дозволяють одночас описати масив й задати його значення в розділі констант:
Значення елементів багатовимірних масивів слід записувати використовуючи вкладені дужки для кожного індексу, враховуючи, що спочатку змінюється останній індекс, за ним – передостанній і так далі, до першого індексу. Так, значення елементів матриць слід перераховувати за рядками. Наприклад, для матриці В розміром 3х4
1 2 3 4
R = 5 6 7 8
9 0 –1 –2
слід записати такий оператор:
Соnst R:array[1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,0, –1,–2));
Значення елементів багатовимірних масивів, як і одновимірних масивів із загальним описом, можна присвоювати один одному лише одним оператором присвоєння, не використовуючи цикли. Наприклад, при описуванні масивів
Var F,G : array[1..4,1..4] of real;
після введення або обчислення значень масиву G можна присвоїти такі ж самі значення масиву F одним оператором F:=G;
2.3Виведення елементів багатовимірних масивів
Виводити значення масивів можна у файл або на форму, використо-вуючи різноманітні компонети Delphi. При цьому, виводити значення елементів масивів можна лише поелементно, для чого слід зорганізувати цикли змінювання за значеннями кожного індексу. Як зорганізувати виведення масивів у файл, буде розглянуто далі в інших лабораторних роботах. Тепер розглянемо, як організувати виведення багатовимірних масивів на форму за допомогою компонентів Edit, Label, Memo, ListBox, StringGrid та функції ShowMessage.
В наведених прикладах використовуватимемо змінні, які мають такий опис:
Соnst R :array[1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,–1,–2,–3));
Var B: array [ 1.. 5, 1.. 5 ] of integer;
i,j, ier : integer;
sb, st :string;
2.3.1 В компонентEdit можна виводити лише один рядок значень багатовимірного масиву, відокремлюючи елементи пропусками. Кількість елементів, котрі можна побачити, є обмеженою довжиною компонента Edit на формі вікна.
Приклад фрагмента програми виведення 3-го рядка масиву В:
і:=3; // присвоєння номера рядка
st:=’’; // очищення рядка st,
For j:=1 to 5 do // початок циклу за індексами у рядку масиву
begin
str(В[i,j]:4:1, sb); // перетворення числа на рядкову величину
st:=st+sb +’ ’; // нагромадження рядка значень масиву
end;
Edit1.Text:=st; // присвоєння значень рядка масиву компоненту Edit1
2.3.2 В компонентLabel можна виводити масиви, відокремлюючи елементи пропусками (’ ’) або символами переходу до нового рядка (#13) за тими ж самими правилами, що і в компонент Edit, лише в програмі замість Edit1.Text треба писати Label1.Caption (наприклад, Label1.Caption:=st; ).
Приклад виведення матриці R:
Label1.Caption:= ’’; // очищення компоненти Label
For i:=1 to 3 do // початок циклу за індексами рядків
begin
st:=’’; // очищення рядка st
For j:=1 to 4 do // початок циклу за індексами стовпчиків
begin
str(R[i,j]:2, sb); // перетворення числа на рядкову величину
st:=st+sb +’ ’; // нагромадження рядка значень масиву
2.3.3 Виведення у вікно діалогу за допомогою функції ShowMessage організують так само, як і в попередніх прикладах, лише замість оператора присвоєння треба записати оператор виклику процедури. Наприклад,
ShowMessage(st);.
2.3.4 За допомогою компонента Memo можна виводити масиви з будь-якою кількістю елементів, оскільки можна використовувати лінійки прокручування (надати властивості ScroollBar значення ssBoth або ssVertical).
Приклад виведення значень матриці R:
Memo2.Clear; // очищення компонента
For i:=1 to 3 do // початок циклу за індексами рядків
begin
st:=’’; // очищення рядка st
For j:=1 to 4 do // початок циклу за індексами стовпчиків
begin
str(B[i,j]:2, sb); // перетворення числа на рядкову величину
st:=st+sb +’ ’; // нагромадження рядка значень масиву
end;
Memo2.Lines.Add(sb); // виведення рядка значень масиву
end;
2.3.5 Виведення масивів за допомогою компонента ListBox організують так само, як і з компонентом Memo, лише замість Memo треба писати оператор виклику процедури ListBox. Наприклад, замість оператора
Memo2.Lines.Add(sb);
треба записати
ListBox1.Items.Add(sb); .
2.3.6 Виведення масивів за допомогою компоненту StringGrid(сітка).
Компонент String-Gridмає вигляд таблиці з комірками і розташована на вкладці Additional палітри компонент.
Цю компоненту ми будемо використовувати вперше, тому наведемо опис її основних власти-востей (таблиця 6.1):
Таблиця 6.1 – Властивості компонента StringGrid
Властивість
Призначення
Name
Ім’я компонента для доступу до його властивостей
ColCount
Кількість стовпчиків таблиці
RowCount
Кількість рядків таблиці
Cells
Масив комірок таблиці. Наприклад, Cells[i,j] – це комірка розташована на перетинанні i-го стовпчика та j-го рядка (нумерація починається з нуля).
FixedCol
Кількість фіксованих стовпчиків (для заголовка)
FixedRow
Кількість фіксованих рядків (для заголовка)
Options.goEditing
Ознака дозволу на редагування вмісту комірки
Options.Tabs
Ознака дозволу на переміщення по таблиці за до-помогою клавіші <Tab>
Options.goColSizing
Ознака дозволу на змінювання ширини стовпчиків
Options.goRowSizing
Ознака дозволу на змінювання висоти рядків
В кожній комірці (Cells) можна розташувати величину рядкового типу, як і в іншіх компонентах, якими ми користувалися раніше (Edit, Label та ін.). Властивості групи Options відкривають подвійним клацанням і надають їм значення true або false. Наприклад для виведення матриці Rкомпоненті StringGrid слід надати властивості, подані в таблиці 6.2.
Таблиця 6.2 – Значення властивостей компоненти StringGrid
Властивість
Значення
Name
mb
ColCount
RowCount
FixedCol
FixedRow
Options.goColSizing
True
Options.goRowSizing
True
Приклад фрагмента програми:
For i:=1 to 3 do // цикл фіксованих заголовків рядків
mb.cells[0,i]:=IntToStr(i)+'-й рядок';
For j:=1 to 4 do // цикл фіксованих заголовків стовпчиків
mb.cells[j,0]:=IntToStr(j)+'-й стовпчик';
For i:=1 to 3 do // початок циклу за індексами рядків
begin
For j:=1 to 4 do // початок циклу за індексами стовпчиків
begin
str(R[i,j]:3, sb); // перетворення числа на рядкову величину
mb.cells[j,i]:=sb; // виведення значення масиву в комірку
end;
end;
2.4 Введення багатовимірних елементів масиву
Вводити значення масивів можна використовуючи такі компоненти Delphi, як StringGrid, Memo, ListBox. Як і при виведенні масивів, при введенні слід організовувати цикли змінювання з кожного індексу.
2.4.1. За допомогою компонента StringGridможна вводити масиви лише під час виконання програми.
Наприклад для виведення матриці В компоненту StringGrid слід надати такі властивості:
Властивість
Значення
Name
mb
ColCount
RowCount
FixedCol
FixedRow
Options.goColSizing
True
Options.goRowSizing
True
Options.goEditing
True
Options.Tabs
True
Приклад фрагмента програми:
For i:=1 to 5 do // цикл фіксованих заголовків рядків
mb.cells[0,i]:=IntToStr(i)+'-й рядок';
For j:=1 to 5 do // цикл фіксованих заголовків стовпчиків
mb.cells[j,0]:=IntToStr(j)+'-й стовпчик';
For i:=1 to 5do // початок циклу за індексами рядків
begin
For j:=1 to 5 do // початок циклу за індексами стовпчиків
begin
str(B[i,j]:3, sb); // перетворення числа на строкову величину
mb.cells[j,i]:=sb; // виведення значення масиву в комірку
end;
end;
2.4.2 Введення через пропуск елементів багатовимірного масиву за допомогою компонент Memo або ListBox потребує складення спеціальної підпрограми зчитування рядкової величини та перетворення її на масив величин іншого типу. Таку підпрограму буде розглянуто при вивченні роботи з рядковими величинами.