
- •Лекция 10. Обработка двумерных массивов
- •10.1. Ввод и вывод двумерного массива
- •Обработка двумерного массива
- •Объявление двумерного массива
- •Доступ к элементу массива
- •Ввод и вывод массивов
- •Пример обработки двумерного массива
- •Процедура обработки щелчка на кнопке «Вычисление» (кн. Button_calc)
- •Процедура обработки щелчка на кнопке «Очистка» (кн. Button_clear)
- •Процедура обработки события OnCreate (Создание) формы
- •Пояснения
Объявление двумерного массива
В общем виде объявление двумерного массива выглядит так:
имя:array[НижняяГраница1..ВерхняяГраница1,
НижняяГраница2..ВерхняяГраница2] of Тип
где:
имя – имя массива;
array – слово языка Pascal, указывающее, что объявляемый элемент данных является массивом;
НижняяГраница1, ВерхняяГраница1, НижняяГраница2, ВерхняяГраница2 – целые константы, определяющие диапазон изменения индексов и, следовательно, число элементов массива;
Тип — тип элементов массива.
Примеры объявления массивов:
const n_max=10;
m_max=5;
type matr=array[1..n_max,1..m_max] of integer;
var B:matr;
type matr=array[1..10,1..5] of integer;
var B:matr;
B: array[1..10,1..5] of integer;
Это три разных объявления одного и того же двумерного массива, состоящего максимум из 10 строк и максимум из 5 столбцов.
Доступ к элементу массива
Для того, чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс соответствует номеру строки, второй – номеру столбца. Индексы указываются после имени массива в квадратных скобках через запятую.
Например, элемент В[2,j] указывает на элемент, стоящий на пересечении 2-ой строки и j-го столбца массива В.
Ввод и вывод массивов
Для ввода исходных данных и отображения результата используется компонент StringGrid (сетка, таблица), свойства которого приведены в табл. 11.1.
Таблица 11.1. Наиболее важные свойства StringGrid
Свойство |
Значение |
ColCount |
Число столбцов таблицы По умолчанию=5 |
RowCount |
Число строк таблицы По умолчанию=5 |
FixedCols |
Число фиксированных (заголовочных) столбцов По умолчанию=1. 1-я строка фиксирована (неподвижна) и выделена объёмом и цветом |
FixedRows |
Число фиксированных заголовочных строк По умолчанию=1. 1-й столбец фиксирован (неподвижен) и выделен объёмом и цветом |
Options.goEditing |
Разрешение на редактирование ячеек. По умолчанию запрещено (False) |
Options.goTab |
Разрешение пользоваться клавишей табуляции для переходов между ячейками таблицы По умолчанию запрещено (False) |
DefaultColWidth |
Умалчиваемая ширина столбца в пикселях(=64) |
DefaultRowHeight |
Умалчиваемая высота строки в пикселях (=24) |
GridLineWidth |
Толщина линии таблицы в пикселях (по умолчанию=1) |
Cells[0..ColCount-1, 0..RowCount-1] |
Ячейка-Сells 1-й индекс – номер столбца, 2-ой – номер строки. Строки и столбцы нумеруются от нуля. |
Пример обработки двумерного массива
Задача. Дана целочисленная матрица А = ||аi,j||n,m. Сформировать вектор В=(b1, b2, … bn), каждый элемент которого равен сумме нечетных элементов соответствующей строки матрицы А. Найти индексы (i0, j0) нечетного элемента матрицы А, расположенного в самой нижней ее строке и самом правом столбце. Если матрица не содержит нечетных элементов, выдать соответствующее сообщение. Предусмотреть возможность ввода матрицы вручную и заполнения ее случайными числами.
Входные данные: матрица А = ||аi,j||n,m.
Выходные данные: вектор B, i0, j0.
Блок-схема алгоритма показана на рисунке 11.1. Алгоритм состоит из ввода матрицы А, формирования вектора В, поиска индексов (i0,j0) нечетного элемента, расположенного в самой нижней правой позиции матрицы А.
Ввод матрицы. При работе с многомерными массивами сначала вводится размерность матрицы, т.е. количество ее строк (n) и столбцов (m). Затем для ввода элементов матрицы аi,j организуется пара вложенных циклов – по строкам (i) и по столбцам (j). В нашем случае необходимо добавить проверку, как вводить матрицу – вручную или случайным образом.
Формирование вектора В. Вектор В содержит n элементов – по одному для каждой строки матрицы А. Для формирования элемента bi (i=1,2,…,n) организуем внешний цикл по строкам, внутри которого методом накопления вычислим сумму (s) нечетных элементов i-ой строки. Накопление суммы осуществим во внутреннем цикле по столбцам (j). После окончания цикла по j занесем вычисленную сумму s в элемент bi.
Поиск индексов (i0,j0) нечетного элемента, расположенного в самой нижней правой позиции матрицы А. Перед началом поиска индексу i0 присвоим нулевое значение – признак того, что элемент пока еще не найден. Затем организуем пару циклов: внешний – по строкам (i), поскольку в первую очередь требуется определить номер строки, и внутренний – по столбцам (j). Оба цикла – по убыванию индекса, так как нас интересует номер самой нижней строки и номер самого правого столбца. Как только нечетный элемент найден, его индексы выводятся на экран и программа останавливается (процедура exit). Если элемент не найден (т.е. i0 осталось равным нулю), выдаем сообщение про отсутствие элемента.
Скомпонуем следующую форму и настроим ее свойства.
Исходная Форма после переименования Форма после настройки
объектов свойств объектов
В данной форме применим новые компоненты:
GroupBox (3-я кнопка
справа на странице Standard) , RadioGroup (2-я
кнопка
справа на странице Standard), StringGrid (4-я кнопка
слева на странице Additional) . Панель GroupBox1
используем для зрительного объединения
компонентов, связанных с вводом исходных
данных, а на панели GroupBox2 расположим
компоненты, в которые выводятся
результаты. Группу переключателей
(радиокнопок) RadioGroup1 используем для
выбора способа задания матрицы А –
вручную или случайным образом. Для ввода
матрицы А и вывода вектора В воспользуемся
компонентами StringGrid1 и StringGrid2 соответственно.
Настроим свойства этих компонентов.
Все кнопки на форме, а также объекты
Edit, связанные с вводом/выводом данных,
переименованы понятным образом (т.е.
изменено их свойство Name).
Свойства Form1
Form1.Caption:=Двумерные массивы
З
ададим жирный шрифт размером 9 пунктов для всех надписей на форме. Для этого щелкнем на форме – для ее выделения, затем щелкнем в Инспекторе объектов на строке
. Справа от TFont появится многоточие:
.
Щелкнем на этом многоточии и установим
параметры, показанные в диалоговом окне
«Шрифт»: начертание «жирный», размер
9.
Свойства компонентов GroupBox
Зададим надписи в левом верхнем углу панелей:
GroupBox1.Caption:=Исходные данные
GroupBox2.Caption:=Результат
Свойства компонента RadioGroup
RadioGroup1.Caption:=Ввод матрицы А
Зададим надписи для 2-х радиокнопок.
RadioGroup1.Columns:=2 – число столбцов, в которых располагаются радиокнопки.
RadioGroup1.ItemIndex:=0 – будет выбрана кнопка «вручную» (по умолчанию ItemIndex:=-1, т.е. ни одна радиокнопка не выбрана).
Щ
елкаем
на свойстве Items, затем на многоточии. В
открывшемся окне редактора строк вводим
надписи, которые хотим видеть рядом с
радиокнопками, по одной в строке, после
чего нажимаем кнопку ОК..
Свойства компонента StringGrid_А
Для ввода матрицы А используем компонент StringGrid1. Переименуем его в StringGrid_А:
StringGrid1.Name:= StringGrid_А
По умолчанию, это таблица, состоящая из 5-ти строк и 5-ти столбцов. 1-ая строка и 1-ый столбец фиксированы (неподвижны) и выделены объемом и цветом. Это заголовки таблицы. Так как нам заголовки не нужны, то мы обнуляем число фиксированных столбцов и строк:
StringGrid_А.FixedCols:=0 - число заголовочных столбцов
StringGrid_А.FixedRows:=0 - число заголовочных строк
Число строк и столбцов таблицы хранится соответственно в свойствах RowCount и ColCount. Эти свойства получат свои значения в программе после ввода размерности матрицы из компонентов Edit_n и Edit_m.
Чтобы иметь
возможность редактировать текст в
ячейках таблицы и перемещаться по
ячейкам таблицы с помощью клавиши
табуляции, надо дважды щелкнуть на
свойстве
и установить следующие два режима:
goEditing:=True (по умолчанию установлено goEditing:=False, т.е. редактирование запрещено);
goTabs:=True (по умолчанию установлено goTabs:=False)
Свойства компонента StringGrid_B
Для вывода вектора В используем компонент StringGrid2. Переименуем его в StringGrid_В, удалим заголовочные строку и столбец и зададим число столбцов равным единице, поскольку это вектор:
StringGrid2.Name:= StringGrid_В
StringGrid_В.FixedCols:=0
StringGrid_В.FixedRows:=0
StringGrid_В.ColCount:=1