4.2. Создание программы «Работа с массивом» Задача. Необходимо сгенерировать матрицу случайных чисел размерностью 5 на 5 и в соответствии с имеющимся шаблоном сформировать итоговый массив по следующему правилу: если в шаблоне позиция зачернена, то в этой позиции в итоговую матрицу записывается число из той же позиции из исходной матрицы, иначе записывается 0.
Примерный вид окна программы представлен на рис. 4.3.
Процесс создания программы происходит по следующему алгоритму:
Запустить Delphi.
Сохранить проект («work4.dpr» и «main.pas»).
Настроить окно проекта:
изменить заголовок окна на «Работа с массивом» Caption;
сформировать изображение шаблона массива:
п оместить на форму элемент фигура (элемент Shape, вкладка Additional, значок );
настроить размеры фигуры, чтобы можно было из них построить квадрат размером 5 на 5 фигур. Для этого изменить свойства фигуры Width – ширина и Height – высота;
скопировать элемент в буфер (<Ctrl><С>);
сделать 24 копии (<Shift><V>);
разместить квадратики в квадрат 55;
выделить средний квадрат размером 33 (удерживая <Shift> щелкать на нужных квадратиках) – выделенные квадратики будут отмечены рамочкой ;
изменить цвет выделенного квадрата на красный (свойство Shape/Color установить в значение clRed);
поместить 2 элемента для хранения массивов:
поместить на форму 2 элемента строковаятаблица (StringGrid,Additional, ), разместив их слева (начальная матрица) и справа (итоговая матрица) от построенного шаблона;
настроить имена этих элементов SGIshod и SGItog для хранения исходного и итогового массивов соответственно (Name);
остальные настройки этих двух элементов будут совпадать – выделить эти 2 элемента;
настроить размеры таблиц (55 количество квадратиков и заголовки – итого размер 66) (свойства ColCount (количество столбцов) и RowCount (количество строк) установить в значение 6);
так как в ячейки будут записаны цифры размером 88 пикселей, изменить размеры ячеек на значение 16 (ширину (DefaultColWidth) и высоту (DefaultColHeight));
изменить размеры (свойства Width и Height установить в значение 110);
настроить заголовок строк и столбцов каждой таблицы. Для их выделения можно использовать цвет, например «ярко-голубой» (FixedColor установить в clAqua);
изменить размер шрифта, используемого в таблицах, на 8 (Font/Size);
изменить свойство ScrollBars на ssNone, для того чтобы при выводе цифр не появлялся скроллер;
поместить на форму элементы для вывода неотсортированного и отсортированного массивов:
для неотсортированного массива использовать элемент метка (Label,Standard,);
назвать элемент LSort (Name);
для отсортированного массива использовать элемент строка ввода (Edit,Standard,);
назвать элемент ESort (Name);
поместить метки для подписи всех видимых элементов: «Исходный массив», «Итоговый массив», «Шаблон», «Неотсортированный массив» и «Отсортированный массив» (Label, Standard, );
добавить кнопки запуска расчетов и выхода из программы:
добавить 2 элемента Кнопка (Button, Standard,);
назвать один «BOk» (расчет) и «BQuit» (выход) (Name);
форма готова!
Запрограммировать выход на кнопку BQuit (команда Close).
Запрограммировать свойство формы onActivate для отображения первого результата расчета сразу после запуска программы, т. е. при её активизации:
сделать активной форму – щелкнуть на окне на свободном от элементов месте;
выбрать в Инспекторе объектов на вкладке Events свойство onActivate;
дважды щелкнуть на нем для начала ввода текста программы;
ввести раздел переменных и сами переменные: параметры цикла I,J,K; массивы –исходный MIs, итоговый MIt, для описания шаблона MSh (элементы, отмеченные цветом, будут иметь значение 1, остальные 0), одномерный массив для сортировки Mass. Необходимо ввести следующие строки перед оператором begin:
Var
I,J,K : Integer;
MIs, MIt, MSh : array [1..5,1..5] of Integer;
Mass : array [1..25] of Integer;
перед заполнением массива запустить генератор псевдослучайных чисел – после слова begin –добавить оператор Randomize;
пронумеровать заголовки строк и столбцов цифрами от 1 до 5. Для этих целей удобно использовать цикл с параметром. При обращении к элементам таблицы (StringGrid) необходимо указать через точку свойство Cells. Это свойство является двухмерным массивом и позволяет хранить значения используемого массива. Нумерация индексов массива Cells начинается с 0, причем нулевые элементы – это элементы заголовков; первый индекс – это столбец, второй – строка. Текст программы будет следующим:
Randomize;
For I := 1 to 5 do
begin
{Элемент таблицы «строка» – требуется преобразование типов}
SGIshod.Cells[0,I] := IntToStr(I); {Пронумеровали строки}
SGIshod.Cells[I,0] := IntToStr(I); {Пронумеровали столбцы}
SGItog.Cells[0,I] := IntToStr(I); {Пронумеровали строки}
SGItog.Cells[I,0] := IntToStr(I); {Пронумеровали столбцы}
end;
проанализировать полученный шаблон – в данном случае структура массивов представляет квадрат и легко описывается циклом с параметром;
алгоритм обработки массива будет следующим:
обнулить массив шаблона;
обнулить итоговый массив;
заполнить массив шаблона единицами в позициях заданного шаблона (центральный квадрат размером 33);
заполнить случайными числами из диапазона 1…9 исходный массив, используя оператор Random, но так как он возвращает числа, начиная от 0, необходимо к сгенерированному числу прибавлять 1 – команда «Random(9)+1» как раз и будет генерировать числа от 1 до 9;
просматривая исходный массив, в соответствии с правилом заполнить итоговый массив;
отобразить полученный итоговый массив в элементе SGItog;
выполнив эти пункты, получим следующий текст программы:
{Обнуляем итоговый массив и массив шаблона}
For I := 1 to 5 do
For J := 1 to 5 do
begin
MSh[I,J] := 0;
MIt[I,J] := 0;
end;
{Заполняем массив шаблона}
For I := 2 to 4 do
For J := 2 to 4 do
MSh[I,J] := 1;
{Заполняем итоговый массив и отображаем его}
For I := 1 to 5 do
For J := 1 to 5 do
begin
MIs[I,J] := Random(9)+1;
SGIshod.Cells[I,J] := IntToStr(MIs[I,J]);
end;
{Заполняем по шаблону итоговый массив и отображаем его}
For I := 1 to 5 do
For J := 1 to 5 do
begin
If MSh[I,J] = 1 then MIt[I,J] := MIs[I,J];
SGItog.Cells[I,J] := IntToStr(MIt[I,J]);
end;
{Окончание заполнения массива}
для реализации алгоритма сортировки массива необходимо:
перевести двухмерный массив в одномерный – пусть элемент с индексом [1,1] будет иметь индекс [1], [1,2] – [2], [1,3] – [3], [1,4] – [4], [1,5] – [5], [2,1] – [6], [2,2] – [7] и т. д. Эту операцию также легко выполнить, используя двойной цикл по параметрам цикла двухмерного массива и внутри цикла изменяя параметр цикла одномерного массива. Текст программы дополнится после строки «{Окончание заполнения массива}» следующими строками:
k := 0;
For I := 1 to 5 do
For J := 1 to 5 do
begin
Inc(k);
Mass[k] := MIs[J,I];
end;
вывести массив в поле вывода, задаваемое меткой LSort (сначала строку сделать «пустой», а затем, чтобы цифры при выводе не сливались, добавить после каждой цифры пробел):
Lsort.Caption := ‘’;
For I:=1 to 25 do LSort.Caption := LSort.Caption+IntToStr(Mass[I])+ ‘ ’;
{Массив ещё не отсортирован}
алгоритм сортировки массива Mass написать самостоятельно. Поместить созданный текст алгоритма после строки {Массив ещё не отсортирован}.
Для того чтобы программу можно было запускать на расчет многократно, связать команду onClick кнопки BOk с командой onActivate (в поле команды onClick в Инспекторе объектов выбрать процедуру FormActivate).
Запустить программу <F9>.
Программа готова!
Индивидуальное задание Создать демонстрационную программу, используя шаблон в соответствии с номером варианта.
1
|
| 2
|
| 3
|
| 4
|
|
|
|
|
|
|
|
|
| 5
|
| 6
|
| 7
|
| 8
|
|
|
|
|
|
|
|
|
| 9
|
| 10
|
| 11
|
| 12
|
|
|
|
|
|
|
|
|
| 13
|
| 14
|
| 15
|
| 16
|
|
|
|
|
|
|
|
|
| 17
|
| 18
|
| 19
|
| 20
|
| Итоги В четвёртой теме были изучены: объявление новых типов данных; генератор случайных чисел; изучение структуры «массив»; алгоритмы операций с массивами.
При создании демонстрационной программы были получены навыки работы со следующими командами: Randomize, Random и визуальными компонентами: элемент фигура StringGrid;
|