Программирование работы с двухмерным массивом



Федеральное бюджетное государственное общеобразовательное учреждение высшего образовательно

 

Уфимский государственный нефтяной технический университет

 

Кафедра автоматизации технологических процессов и производств

 

 

Учебно-методическое пособие

по лабораторной работе № 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!