Лабораторна робота
На тему: «Створення та обробка лінійного масиву. Використання компонента 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.