Программирование работы с двухмерным массивом
Федеральное бюджетное государственное общеобразовательное учреждение высшего образовательно
Уфимский государственный нефтяной технический университет
Кафедра автоматизации технологических процессов и производств
Учебно-методическое пособие
по лабораторной работе № 2
« Работа с таблицами и списками »
Уфа 2017
Лабораторная работа № 2. Работа с таблицами и списками.
Цель работы: освоение приемов работы с массивами данных, ознакомление с компонентами представления списков и таблиц.
При написании программ может возникнуть необходимость ввода или вывода массивов данных. К таковым относятся как массивы целых или реальных чисел, так и массивы символьных строк. Одномерные массивы можно выводить простым перечислением в столбик. Для этого можно использовать компонент TMemo или TListBox. Однако, при выводе двухмерного массива требуется организация выводимой информации в виде строк и столбцов. Для этого наиболее подходящим является компонент TStringGrid.
Порядок работы.
Формирование главной формы
После запуска среды программирования Delphi автоматически создается новый проект, содержащий только одну пустую форму Form1.
Измените имя формы на «MainForm», а заголовок на «Программа работы с массивами». Для этого необходимо найти в колонке Properties в окне Object Inspector свойства Name и Caption и изменить их значения на соответствующие.
|
|
Сохраните проект в отдельной папке, дав имя Massiv проекту. Для этого достаточно при сохранении файла проекта (расширение .dpr) указать это имя как имя файла.
В программе будет предусмотрен отдельный ввод одномерных и двухмерных массивов на отдельных формах. Для вызова этих форм разместите на главной форме кнопки «Ввод одномерного массива» и «Ввод двухмерного массива», а также кнопку «Расчет».
Для этого нужно найти на палитре компонентов на закладке Standart объект Button, разместить на главной форме, дать ему соответствующий заголовок (свойство Caption) и изменить размер объекта, чтобы заголовок отображался полностью. То же проделать для других кнопок Чтобы кнопки сразу получились одинакового размера можно использовать копирование объектов через команды Ctrl+C (копировать) и Ctrl+V (вставить).
На свободном месте формы разместите две текстовые строки (компонент TLabel) с текстом «Результат расчета:» для вывода результата по одномерному и двухмерному массивам (см. рисунок 1).
Внимание! Периодически не забывайте сохранять файлы проекта (кнопка SaveAll) во избежание потери результатов своей работы.
Программирование работы с одномерным массивом
|
|
Теперь создадим форму для ввода одномерного массива (кнопка New Form на панели инструментов). Дайте новой форме имя Form1 и заголовок «Ввод одномерного массива». Для ввода элементов массива будем использовать компонент строки ввода TEdit, а для отображения всех элементов массива – компонент ListBox. Кроме этих компонентов разместите на форме кнопки «Добавить», «Удалить», «ОК» и «Отмена» (см. рисунок 2).
Рисунок 1 – Главная форма
Рисунок 2 – Форма Form1
Порядок заполнения массива в процессе работы программы будет следующий: значение элемента массива вводится в строке Edit1. При нажатии на кнопку добавить оно переносится в массив как новый элемент. Для удаления последнего элемента нужно нажать кнопку «Удалить». После нажатия на «ОК» массив считается введенным, при нажатии на «Отмена» - нет.
Чтобы описать этот алгоритм работы программы, нужно написать процедуры, вызываемые при нажатии соответствующих кнопок (события OnClick кнопок).
Двойным щелчком по кнопке «Добавить» создайте такую процедуру для этой кнопки (можно также использовать закладку Events в Object Inspector).
Элементы массива хранятся в объекте ListBox в виде массива строк Items (тип TStrings). У объекта ListBox есть свойство ItemIndex (тип Integer), содержащее номер текущего выбранного элемента в списке. Если не выбрана ни одна строка из списка, его значение равно «-1».
|
|
Тип TStrings представляет собой массив строк типа String с номерами от 0 до Count-1 (свойство Count – количество строк). Чтобы обратиться, например, к 5-й строке массива строк Items, используется конструкция Items.Strings[5] или проще Items[5].
Для добавления строки в этот массив ListBox используется метод Add:
ListBox1.Items.Add(Edit1.Text)
Структура этой команды: сначала указано имя компонента ListBox1, затем идет обращение к его строкам Items, потом указывается собственно команда Add, т.е. «добавить», аргументом команды является строка текста из Edit1.
В результате получается процедура вида:
procedure TForm1.Button1Click(Sender: TObject);
Begin
ListBox1.Items.Add(Edit1.Text)
end;
Далее создается процедура для кнопки «Удалить». Для удаления используется метод Delete:
ListBox1.Items.Delete(ListBox1.Items.Count-1);
Аргументом метода является номер строки. Чтобы узнать номер последней строки необходимо узнать общее количество строк (свойство Count). От Count отнимается единица в связи с тем, что в Delphi строки нумеруются, начиная с «0».
Далее для кнопки «ОК». При нажатии на нее все элементы массива ListBox должны переписаться в массив M как числовые значения. Для этого организуется цикл по всем строкам (от 1 до Count), каждое значение массива конвертируется из строкового в числовой формат и записывается в массив М:
|
|
procedure TForm1.Button3Click(Sender: TObject);
var i : integer;
Begin
for i:=1 to ListBox1.Items.Count do
M[i]:=strtofloat(ListBox1.Items[i-1]);
MN:= ListBox1.Items.Count
end;
Массив М необходимо объявить как глобальную переменную в модуле главной формы Unit1:
Var
MainForm: TMainForm;
M : array[1..20] of real; {Пусть макс. число эл-тов будет 20}
MN : integer; {Число элементов}
Переменная MN введена для хранения числа элементов массива.
Чтобы процедура из модуля Unit2 могла работать с переменными, объявленными в Unit1, необходимо в строке uses модуля Unit2 вписать имя модуля Unit1. Например, так:
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Unit1;
После переписи элементов форму ввода нужно закрыть командой Close.
При нажатии кнопки «Отмена» достаточно выполнить команду Close без переписывания данных из ListBox1 в M.
Форма для ввода одномерного массива запрограммирована. Теперь можно приступать к программированию кнопки «Расчет» на главной форме.
Пусть при ее нажатии выводится сумма элементов массива М.
Для этого организуется цикл суммирования
procedure TMainForm.Button3Click(Sender: TObject);
var i : integer; S : real;
Begin
S:=0;
for i:=1 to NM do S:=S+M[i];
Label1.Caption:='Результат: '+floattostr(S)
end;
Здесь использованы внутренние переменные: i – счетчик, S – сумма. Сначала сумма S обнуляется, затем производится суммирование и вывод как текст в Label1.
Теперь можно сохранить результаты работы и запустить программу на исполнение.
Внимание! Для ввода десятичной точки в одних компьютерах используется запятая, в других может использоваться точка. При неправильном вводе числа программа выводит сообщение об ошибке.
Программирование работы с двухмерным массивом
Для ввода двухмерного массива создайте новую форму с именем Form2 и заголовком «Ввод двухмерного массива». Разместите на ней компонент StringGrid (закладка Additional палитры компонентов).
В таблице 1 приведены некоторые свойства компонента TStringGrid, необходимые для выполнения данной лабораторной работы.
Таблица 1 – Основные свойства объекта тип TStringGrid
Свойство | Тип | Комментарий |
Cells [ACol, ARow: Integer] | String | Определяет содержимое ячейки с табличными координатами (ACol, ARow) |
Cols[ACol: Integer] | TStrings | Все строки колонки с номером ACol |
Rows[ARow: Integer] | TStrings | Все строки ряда с номером ARow |
ColCount | Integer | Общее количество столбцов |
RowCount | Integer | Общее количество рядов |
FixedCols | Integer | Количество фиксированных (заголовочных) столбцов |
FixedRows | Integer | Количество фиксированных (заголовочных) рядов |
Col | Integer | Номер столбца текущей ячейки |
Row | Integer | Номер ряда текущей ячейки |
Options | TGridOptions | Данное свойство множественного типа определяет рад дополнительных параметров таблицы. В частности, нам наиболее важны следующие: |
| goEditing | Разрешается редактирование ячеек таблицы |
goTabs | Разрешается перемещение по ячейкам с помощью клавиши Tab и комбинации Shift+Tab |
Компонент StringGrid предназначен для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. При этом номера строк и столбцов начинаются с нуля.
Создайте таблицу из двух столбцов и двух строк: нулевая строка пусть будет фиксирована как заголовок, а вторая предназначена для ввода значений. Чтобы можно было вводить значения непосредственно в таблицу (не нажимая кнопку «Добавить», как на форме Form1), необходимо установить значение goEditing в true.
При создании приложения, работающего с данными неизвестной заранее размерности, желательно не ограничивать пользователя какими-то жесткими рамками в количестве элементов данных. Именно поэтому мы будем использовать списки и таблицы, позволяющие динамически менять свои размеры.
На форме расположите также кнопки «ОК» и «Отмена».
Рисунок 3
Запрограммируйте кнопку «Ввод двухмерного массива» главной формы на вызов окна данной формы.
Теперь можете запустить программу и проверить работу таблицы. Однако, вы не можете пока изменять количество строк таблицы. Чтобы можно было бы вводить данные в новые строки, программе необходимо постоянно проверять, не желает ли пользователь ввести новую строку. Если, находясь в нижней строке таблицы, он нажимает на клавиатуре клавишу «вниз», значит он желает ввести новую строку. Программа должна добавить ее, увеличив значение RowCount на единицу. Для проверки нажатия клавиши используется событие OnKeyDown, которое надо запрограммировать, например, так:
procedure TForm2.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
Begin
if (Key=VK_DOWN) and (StringGrid1.Row=StringGrid1.RowCount-1) then
StringGrid1.RowCount:=StringGrid1.RowCount+1
end;
Здесь VK_DOWN – код клавиши «вниз» на клавиатуре.
Далее можно запрограммировать кнопку «ОК». При ее нажатии элементы таблицы StringGrid1 должны конвертироваться из текстового формата в числовой и записываться в двухмерный массив M2:
procedure TForm2.Button1Click(Sender: TObject);
var i, j : integer;
Begin
for i:=1 to StringGrid1.RowCount-1 do
for j:=1 to 2 do
M2[i,j]:=strtofloat(StringGrid1.Cells[j-1,i])
NM2:=StringGrid1.RowCount-1
end;
Здесь i – счетчик рядов (нулевой ряд не читаем, так как он – заголовок), j – счетчик рядов (в массиве М2 они пронумерованы как 1-й и 2-й, а в StringGrid1 – как 0-й и 1-й), NM2 – количество строк массива М2.
Массив М2 и переменную NM2 необходимо объявить в модуле главной формы:
M2 : array[1..20,1..2] of real;
NM2 : integer;
В процедуры кнопок «ОК» и «Отмена» включите команды закрытия окна Close.
Добавьте в процедуру расчета на главной форме цикл суммирования элементов массива М2:
procedure TMainForm.Button3Click(Sender: TObject);
var i, j : integer; S : real;
Begin
{Подсчет суммы элементов одномерного массива М:}
S:=0;
for i:=1 to NM do S:=S+M[i];
Label1.Caption:='Результат: '+floattostr(S);
{Подсчет суммы элементов двухмерного массива М2:}
S:=0;
for i:=1 to NM2 do
for j:=1 to 2 do S:=S+M2[i,j];
Label2.Caption:='Результат: '+floattostr(S);
end;
Дата добавления: 2018-11-24; просмотров: 236; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!