
- •Лекция 10. Обработка двумерных массивов
- •10.1. Ввод и вывод двумерного массива
- •Обработка двумерного массива
- •Объявление двумерного массива
- •Доступ к элементу массива
- •Ввод и вывод массивов
- •Пример обработки двумерного массива
- •Процедура обработки щелчка на кнопке «Вычисление» (кн. Button_calc)
- •Процедура обработки щелчка на кнопке «Очистка» (кн. Button_clear)
- •Процедура обработки события OnCreate (Создание) формы
- •Пояснения
Процедура обработки щелчка на кнопке «Вычисление» (кн. Button_calc)
procedure TForm1.Button_calcClick(Sender: TObject);
const n_max=20; // максим. число строк
m_max=10; // максим число столбцов
type matr=array[1..n_max,1..m_max] of integer;
type vect=array[1..n_max] of integer;
var n,m:integer; //n-число строк, m-число столбцов
var a:matr;
b:vect;
i,j,i0,j0,s:integer;
begin
// ввод размерности матрицы и настройка компонентов StringGrid
n:=StrToInt(Edit_n.Text);
m:=StrToInt(Edit_m.Text);
StringGrid_a.RowCount:=n;
StringGrid_a.ColCount:=m;
StringGrid_b.RowCount:=n;
StringGrid_b.ColCount:=1;
// ввод самой матрицы
if (RadioGroup1.ItemIndex =0) // вручную
then for i:=1 to n do
for j:=1 to m do
a[i,j]:=StrToInt(StringGrid_a.Cells[j-1,i-1])
else for i:=1 to n do // заполнение случайными числами
for j:=1 to m do
begin
a[i,j]:=Random(101); // числа от 0 до 100
StringGrid_a.Cells[j-1,i-1]:=IntToStr(a[i,j])
end;
// заполнение массива В
for i:=1 to n do
begin
s:=0;
for j:=1 to m do
if (a[i,j] mod 2 <>0 ) then s:=s+a[i,j];
b[i]:=s;
StringGrid_b.Cells[0,i-1]:=IntToStr(s)
end;
// поиск нечетного элемента в нижней правой позиции
for i:=n downto 1 do
for j:=m downto 1 do
if (a[i,j] mod 2 <>0 ) then
begin
i0:=i;
j0:=j;
Edit_j0.Text:=IntToStr(j0);
Edit_i0.Text:=IntToStr(i0);
exit // выход из процедуры
end;
ShowMessage('Матрица не содержит нечетных элементов')
end;
Процедура обработки щелчка на кнопке «Очистка» (кн. Button_clear)
procedure TForm1.Button_clearClick(Sender: TObject);
var i,j:integer;
begin
Edit_n.Clear ;
Edit_m.Clear ;
Edit_i0.Clear ;
Edit_j0.Clear ;
with StringGrid_a do
for i:=0 to RowCount-1 do
for j:=0 to ColCount-1 do
Cells[j,i]:='';
with StringGrid_b do
for i:=0 to RowCount-1 do
Cells[0,i]:='';
end;
Процедура обработки события OnCreate (Создание) формы
(для входа в редактор кода процедуры надо дважды щелкнуть на форме)
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize //для генерации новых случ-ных чисел при запуске приложения
end;
Пояснения
Компоненты GroupBox и RadioGroup.
Панель GroupBox (3-я кнопка справа на странице Standard) используется для зрительного объединения функционально связанных между собой элементов. Например, исходные данные мы разместили на GroupBox1, а результаты вычислений – на GroupBox2. Теперь можно по-разному настраивать свойства входных и выходных данных – с помощью соответствующего GroupBox. Свойство Caption – надпись в левом верхнем углу панели.
RadioGroup (2-я кнопка справа на странице Standard) – панель переключателей (в Delphi они называются радиокнопками). Используется для объединения группы радиокнопок, которые можно располагать столбцами или строками. В таблице 11.2 перечислены наиболее важные свойства компонента.
Таблица 11.2. Наиболее важные свойства RadioGroup
Свойство |
Описание |
Caption |
Надпись в левом верхнем углу панели |
Items |
Список надписей кнопок, имеющих строковый тип (аналогично, списку Lines компонента Memo). Щелкнув на многоточии справа от списка Items, попадаем в редактор списка строк. Сюда заносим надписи, которые хотим видеть около кнопок, по одной в строке. Сколько запишем строчек, столько будет и кнопок. Это индексированное множество строк типа string. Индексы начинаются от нуля. Items[0] – это 1-я строка списка |
Text |
Содержит все строки списка в виде одной строки |
Columns |
Число столбцов, в которых располагаются радиокнопки. По умолчанию Columns=1, т.е. радиокнопки размещаются друг под другом. Если задать, например, Columns=2, то кнопки будут располагаться в 2 столбца |
Count |
Содержит число строк списка |
Capacity |
Число строк, которое может содержать список |
ItemIndex |
Показывает индекс выбранной кнопки. Первая кнопка имеет индекс = 0. По умолчанию ItemIndex = -1, т.е. ни одна кнопка не выбрана |
Компонент RadioGroup используется, если надписи кнопок имеют приблизительно одинаковую длину и число кнопок в каждом столбце одинаково. Если желательно нерегулярное расположение кнопок, то следует использовать компоненты RadioButton, сгруппированные панелью GroupBox.
Оператор with. Используется для сокращения записи при обращении к свойствам и методам объекта.
Синтаксис:
with объект do оператор;
Пример. Вместо следующего фрагмента программы:
Form1.GroupBox1.StringGrid1.FixedCols:=0;
Form1.GroupBox1.StringGrid1.FixedRows:=0;
Form1.GroupBox1.StringGrid1.Cells[0,1]:=’Дата’;
можно написать короче, избегая повторные ссылки на объект:
with Form1.GroupBox1.StringGrid1 do
begin
FixedCols:=0;
FixedRows:=0;
Cells[0,1]:=’Дата’;
end;
Генерация случайных чисел для заполнения массива
Компьютер генерирует не случайные числа, а псевдослучайные. При этом задается некоторое начальное число, к которому применяются преобразования. Псевдослучайные числа отличаются от случайных следующими двумя свойствами:
при одинаковом начальном числе каждый раз генерируется одна и та же последовательность чисел;
псевдослучайные числа будут повторяться с некоторым периодом (хотя и очень большим). Если количество случайных чисел больше периода, то они начнут повторяться, а такие числа нельзя считать случайными.
В модуле System, подключенном в предложении uses, объявлена функция Random, которая генерирует псевдослучайные числа, равномерно распределённые в некотором диапазоне.
Существует два способа
обращения к функции
Random:
без параметра с параметром Range типа integer
функция возвращает случайные
действительные числа, равномерно
распределеныее в интервале 0х<1
функция возвращает случайные
целые числа, равномерно распределеные
в интервале
0х<
Range
Пример 1. Заполнить массив А случайными действительными числами от 0 до 1.
for i:=Low(A) to High(A) do
A[i]:=Random;
Здесь функции Low(A) и High(A) возвращают соответственно нижнюю и верхнюю границы индекса массива А.
Пример 2. Заполнить массив А случайными действительными числами от 50 до 150. Для этого достаточно сдвинуть начальное значение чисел на 50 и умножить генерируемые числа на длину интервала: (150–50):
var A1,A2:real;
. . . . . . . . . . .
A1:=50;
A2:=150;
for i:=Low(A) to High(A) do
A[i]:=А1 + (А2-А1)*Random;
//массив А заполняется случайными числами 50х<150.
Пример 3. Заполнить массив В случайными целыми числами от 0 до 100.
for i:=Low(В) to High(В) do
В[i]:=Random(101);
Пример 4. Заполнить массив В случайными целыми числами, равномерно распределенными от 100 до 200
for i:=Low(В) to High(В) do
В[i]:=100+Random(101);
Так как генерируются псевдослучайные числа, то при очередном запуске программы будет вырабатываться одна и та же последовательность. Это удобно только при отладке. Чтобы этого не происходило, нужно генератору случайных чисел задавать новое случайное число. Это делает функция Randomize, которую достаточно вставить где-нибудь в программе, например, в процедуру обработки события OnCreate Формы. Для этого надо дважды щелкнуть на Форме и записать:
procedure Tform1.FormCreate( );
begin
Randomize
end;