На тему: «Створення та обробка лінійного масиву. Використання компонента StringGrid для представлення двовимірних масивів в середовищі Delphi »
Завдання 1. Створіть додаток, яке пропонує задати розмір лінійного масиву, заповнює цей
масив випадковими цілими числами, виводить список елементів масиву, обчислює суму всіх елементів і кількість позитивних, визначає мінімальний і максимальний елементи масиву за вибором.
Рішення: Створіть папку для збереження проекту «масив1». Збережіть проект - Massiv. На формі розмістіть компоненти Label1, 2 і Edit1, 2 і кнопку Button1. Для властивості Caption кнопки задайте значення «Створити масив». Розмістіть на формі панель GroupBox1 і задайте значення «Визначити», для властивості Caption.
У цій панелі розмістіть компоненти CheckBox1, 2,3,4, для властивості Caption яких задайте значення: «Мінімальний елемент», «Максимальний елемент», «Сума всіх елементів», «Число позитивних елементів»,
відповідно. Навпроти них розмістіть компоненти Edit3, 4,5,6. Якщо компоненти CheckBox не будуть відображатися, то слід виділити панель GroupBox1 і вибрати в контекстному
меню команду
Control → Send to Back (Порядок → На задній план).
У нижній частині форми розмістіть кнопку Button2 і задайте назву - «Обчислити». Видаліть
текст Edit1, 2,3,4,5,6 з
відповідних компонентів. Вирівняйте компоненти на формі, як показано на рис. 4.1. Зафіксуйте положення компонентів на формі за допомогою команди Edit> Lock Controls з головного меню.
SHAPE \ * MERGEFORMAT
Число позитивних елементів
|
Рис. 4.1 Приклад форми проекту «масив1»
Перш ніж створювати обробники подій клацання мишею по кнопках, в розділі опису змінних необхідно оголосити
змінні цілого типу N, I, де N - розмір масиву, а I - порядковий номер елемента масиву, а також X -
динамічний масив цілих чисел.
Var Form1: TForm1; N, I: integer; X: array of integer; {Опис динамічного масиву цілих чисел}
Примітка: динамічні
масиви відрізняються від звичайних
статистичних масивів тим, що для них не оголошується заздалегідь довжина - число елементів. При оголошенні динамічного масиву місце під нього не відводиться. Перш ніж використовувати масив, треба задати його розмір процедурою
SetLength. Для попередження введення у вікно Edit1 нечислове значення, використовуйте обробку події OnKeyPress для
відповідного компонента. Виконайте це самостійно (див. лаб. Роб. № 3).
Для створення процедури обробки події, створення масиву цілих чисел, натисніть кнопку «Створити масив», потім на сторінці Події зробіть подвійне клацання на порожньому полі списку події OnClick. Після цього відредагуйте процедуру у вікні Редактора коду наступним чином:
Begin Randomize; N: = StrToInt (Edit1. Text); {число елементів масиву}
SetLength (X, N); {задати масиву Х довжину N}
Edit2. Text: = '»; {очистити вікно Edit2}
For I: = 0 to N-1 do Begin X [I]: = Round (Sin (Random (100)) * 100); {Привласнити елементу масиву випадкове значення}
Edit2. Text: = Edit2. Text + '»+ IntToStr (X [I]); {Вивести елементи масиву}
End; End; Обробку масиву опишіть у процедурі обробника події клацання мишею на кнопці «Обчислити». У вікні редактора коду в заготівлю процедури помістіть
опис локальних змінних наступне:
Var Max, Min, Sum, CountPlus: integer; де Max - максимальний елемент масиву, Min - мінімальний елемент масиву, Sum - сума всіх елементів масиву, CountPlus - кількість позитивних елементів масиву.
Текст процедури обробки масиву може бути записаний таким чином:
Begin If CheckBox 1. Checked then Min: = X [0]; Edit3. Text: = '»; If CheckBox2. Checked then Max: = X [0]; Edit4. Text: = '»; Sum: = 0; Edit5. Text: = '»; CountPlus: = 0; Edit6. Text: = '»; For I: = 0 to N-1 do Begin If CheckBox1. Checked then If Min> X [I] then Min: = X [I]; If CheckBox2. Checked then If Max <X [I] then Max: = X [I]; If CheckBox3. Checked then Sum: = Sum + X [I]; If CheckBox4. Checked then If X [I]> 0 then CountPlus: = CountPlus + 1; End; {Висновок результатів обробки масиву}
If CheckBox1. Checked then Edit3. Text: = IntToStr (Min); If CheckBox2. Checked then Edit4. Text: = IntToStr (Max); If CheckBox3. Checked then Edit5. Text: = IntToStr (Sum); If CheckBox4. Checked then Edit6. Text: = IntToStr (CountPlus); End; Збережіть файли проекту та програмного модуля, запустіть програму на виконання, задаючи різні значення числа елементів, переконайтеся у правильній роботі програми.
Завдання 2. Створіть додаток, яке виводить двовимірний масив випадкових цілих чисел і визначає мінімальний і максимальний елементи в цьому масиві.
Рішення: 1. Збережіть проект у папці «масив2» з ім'ям Massiv2 (
файл модуля можна зберегти як Unit1).
2. Створіть форму «Обробка двовимірного масиву».
3. Виберіть у палітрі компонентів сторінки Additional компонент StringGrid і розмістіть його в лівому верхньому кутку (див. рис. 5.1). Задайте для властивостей ColCount (кількість стовпців) і RowCount (кількість рядків) значення 6. Задайте для властивостей FixedCols і FixedRows (кількість фіксованих, непрокручіваемих стовпців і рядків, які використовуються для розміщення написів номерів рядків і стовпців).
Примітка: даний компонент являє собою таблицю, що містить рядки.
Таблиця може
мати смуги прокрутки, причому задане число перших рядків і стовпців може бути фіксованим. Таким чином, можна задати заголовки стовпців і рядків, постійно присутні в компоненті.
4. Праворуч від об'єкта розмістіть кнопку Button1 і задайте для неї властивість Caption значення «Заповнити». Нижче розмістіть панель GroupBox1 і надайте значення «Визначити». На даній панелі розмістіть компоненти CheckBox 1,2 і призначте властивості Caption значення «Мінімальний елемент», «Максимальний елемент» відповідно. Потім справа розмістіть компоненти Edit 1,2 і кнопку з написом «Обчислити». Вирівняйте компоненти як показано на рис. 5.1.
5. Перш ніж створювати обробники подій кнопок «Заполнить» і «Обчислити», слід додати в розділ опису змінних даного модуля цілочисельні змінні, призначені для зберігання
індексів масиву.
Var Form1: TForm1; I, J: integer; 6. Створіть процедуру обробки події клацання мишею на кнопці Button1, в якій спочатку буде виконана
операція виведення номерів рядків і стовпців, а потім осередки StringGrid1 будуть заповнені випадковими цілими числами.
SHAPE \ * MERGEFORMAT
Рис. 5.1 Приклад форми проекту «масив2»
Примітка: при вивченні мови TPascal ви використовували оператор with ... do для скорочення запису при зверненні до полів записів. Тепер можна застосовувати цей оператор для звернення до властивостей і методів об'єкта. Це робиться, щоб уникнути повторних посилань на об'єкт в наступних операторах. Наприклад, замість
того щоб, звертаючись до осередку об'єкта StringGrid1 писати StringGrid1. Cells [I, J], зручніше використовувати оператор with StringGrid1 do, в тілі якого можна неодноразово звертатися до Cells [I, J], не згадуючи імені об'єкта StringGrid1.
Процедура обробки події кнопки Button1:
Procedure TForm1. Button1Click (Sender: TObject); {Заповнення масиву}
begin randomize; with StringGrid1 do begin I: = 0; For J: = 1 to RowCount - 1 do {вивести номери рядків}
Cells [I, J]: = IntToStr (J); J: = 0; For I: = 1 to ColCount - 1 do {вивести номери стовпців}
Cells [I, J]: = IntToStr (I); End; With StringGrid 1 do {Заповнення в
таблиці двовимірного масиву}
For I: = 1 to ColCount - 1 do For J: = 1 to RowCount - 1 do Begin Cells [I, J]: = IntToStr (Round (Sin (Random (100)) * 100)); End; End; 7. Створіть процедуру обробки масиву для другої кнопки «Обчислити». Введіть
текст процедури:
procedure TForm 1. Button 2 Click (Sender: TObject); {обробка масиву}
var min, max: integer; begin if CheckBox1. Checked then with StringGrid1 do begin min: = StrToInt (Cells [1,1]); for I: = 1 to colCount - 1 do for J: = 1 to RowCount - 1 do if StrToInt (Cells [I, J]) <min then min: = StrToInt (Cells [I, J]); Edit1. Text: = IntToStr (min); End Else Edit1. Text: =''; ... (Визначення максимального записати самостійно аналогічно першій частині модуля).
End;
Додаток: Текст програми файлу модуля.
unit main; interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
Type TForm1 = class (TForm)
StringGrid1: TStringGrid;
Button1: TButton; Button2: TButton;
GroupBox1: TGroupBox; CheckBox1: TCheckBox; CheckBox2: TCheckBox;
Edit1: TEdit; Edit2: TEdit;
procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); private {Private declarations}
public {Public declarations}
end;
var Form1: TForm1;
i, j: integer; implementation {$ R *. dfm}
procedure TForm1. Button1Click (Sender: TObject); begin Randomize;
with StringGrid1 do begin i: = 0;
for j: = 1 to RowCount-1 do Cells [i, j]: = IntToStr (j);
j: = 0;
for i: = 1 to ColCount-1 do Cells [i, j]: = IntToStr (i); end;
with StringGrid1 do
for i: = 1 to ColCount-1 do
for j: = 1 to RowCount-1 do
begin
Cells [i, j]: = IntToStr (Round (Sin (Random (100)) * 100));
end; end;
procedure TForm1. Button2Click (Sender: TObject); var min, max: integer;
begin
if CheckBox1. Checked then
with StringGrid1 do begin
min: = StrToInt (Cells [1,1]);
for i: = 1 to ColCount-1 do
for j: = 1 to RowCount-1 do
if StrToInt (Cells [i, j]) <min then min: = StrToInt (Cells [i, j]);
Edit1. Text: = IntToStr (Min);
End else Edit1. Text :='';
if CheckBox2. Checked then
with StringGrid1 do begin
max: = StrToInt (Cells [1,1]);
for i: = 1 to ColCount-1 do
for j: = 1 to RowCount-1 do
if StrToInt (Cells [i, j])> max then max: = StrToInt (Cells [i, j]);
Edit2. Text: = IntToStr (Max);
End else Edit2. Text :='';
end; end.