Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 31
Результат деятельности некоторой фирмы, торгующей автомобилями, может быть представлен в виде следующей таблицы.
Марка |
Январь |
Февраль |
Март |
... |
Ноябрь |
Декабрь |
ВАЗ 2106 |
||||||
ВАЗ 2107 |
||||||
ВАЗ 2108 |
||||||
ВАЗ 2109 |
||||||
ВАЗ 2110 |
||||||
ВАЗ 2111 |
Приведенная выше таблица может быть представлена как совокупность одномерных массивов:
var vaz2106 : array [1..12] of integer;
vaz2107 : array [1..12] of integer;
vaz2108 : array [1..12] of integer;
vaz2109 : array [1..12] of integer;
vaz2110 : array [1..12] of integer;
vaz2111 : array [1..12] of integer;
Возможно и такое представление таблицы:
var jan :array [6..11] of integer;
feb :array [6..11] of integer;
mar :array [6..11] of integer;
...
dec :array [6..11] of integer;
Если вся таблица содержит однородную информацию, например, только целые числа, то такая таблица может быть представлена как двумерный массив.
var vaz :array [6..11] of array [1..12] of integer;
Принято более компактное описание:
var vaz : array [6..11, 1..12] of integer;
ОБЪЯВЛЕНИЕ ДВУМЕРНЫХ МАССИВОВ
Конструкция объявления двумерного массива:
array [ тип_индекса1, тип_индекса2 ] of базовый_тип;
Объявить массив возможно в разделах объявления типов, переменных
type имя = array [ тип_индекса1, тип_индекса2] of базовый_тип;
var имя : array [ тип_индекса1, тип_индекса2] of базовый_тип;
где имя это имя типа массива, имя переменной массива и соответственно (идентификатор);
array, of зарезервированные слова, которые переводятся как «массив», «из»;
базовый_тип тип элементов массива (кроме файлового типа);
тип_индекса1, тип_индекса2 любой порядковый тип, размерность которого не превышает 2 Гб для OP Delphi 6 (для Turbo Pascal 64 Кбайт).
Тип_индекса1 характеризует порядковые номера элементов матрицы в строках, тип_индекса2 в столбцах.
В случае использования в роли типа индекса ограниченного типа (интервального типа) конструкция описания двумерного массива выглядит:
array [нижний_индекс1..верхний_индекс1,
нижний_индекс2..верхний_индекс2] of базовый_тип;
Количество элементов массива равняется величине:
Примеры объявления двумерных массивов:
const k=10; m=2; n=5;
{Объявление типа массива из пяти строк, пяти столбцов
25 целочисленных элементов}
type matrix = array [1..n, 1..n] of integer;
{Объявление переменных массивов}
{массив из пяти строк, пяти столбцов 25 целых элементов}
var a:matrix;
{ Массив из 10 строк, двух столбцов 20 действительных элементов}
b : array [1 .. k, 1 .. m] of real;
{Массив из четырех строк, трех столбцов 12 символьных элементов}
c : array [1..4, 1..3] of char;
{Массив из 256 строк, двух столбцов 512 целых элементов}
d : array [byte, 1..2] of integer;
Напомним:
объем сегмента памяти, где будут храниться данные Pascal-программы, представляет для Turbo Pascal 64 Кбайт, Object Pascal 2 Гбайт. Поэтому есть ограничения на количество элементов массива. Размер памяти можно рассчитать: произведение количества элементов массива на размер одного элемента в байтах.
Естественной формой изображения двумерного массива является таблица.
Пример: на рисунке изображен массив, который объявлен как
var а: array [1..2, 1..3] of byte;
Направление увеличения второго индекса |
||||||
1 |
2 |
3 |
||||
Направление увеличения первого индекса |
1 |
a11 |
a12 |
a13 |
||
2 |
a21 |
a22 |
a23 |
Естественное изображение двумерного массива отличается от его изображения в оперативной памяти, ведь оперативная память линейная.
1-я строка |
2-я строка |
В памяти компьютера элементы идут один за одним так, что при переходе от младших адресов к старшим наиболее быстрo изменяется правый индекс массива.
Пример:
var а: array [1..2, 1..3] of byte;
begin
//Инициализация двумерного массива
a[1,1]:=1; a[2,1]:=2; a[2,3]:=3; a[1,2]:=4; a[2,2]:=5; a[1,3]:=6;
end.
В этом случае в памяти последовательно будут размещены значения 1, 4, 6, 2, 5, 3, а не 1, 2, 3, 4, 5, 6.
= 1 |
=4 |
=6 |
= 2 |
= 5 |
= 3 |
1-я строка |
2-я строка |
Размер оперативной памяти определяется при объявлении двумерного массива и не изменяется во время работы с ним.
БАЗОВЫЕ ОПЕРАЦИИ ОБРАБОТКИ ДВУМЕРНЫХ МАССИВОВ
Двумя простейшими операциями над элементами двумерного массива является выбор определенного элемента и изменение его значения.
Для того чтобы в программе использовать элемент двумерного массива, надо выполнить операцию индексирования [ ].
Указываются: имя массива и индексы в квадратных скобках. Первый индекс это номер строки, второй номер столбца, в которых находится элемент. Между индексами ставится запятая.
имя [индекс1, индекс2]
Как индекс можно использовать константу, переменную или выражение порядкового типа.
Например,
а[2,3] элемент второй строки, третьего столбца матрицы а.
Изменить значение элемента массива можно с помощью операции присваивания:
Например:
B[5,1]:=3.2;{Элементу пятой строки первого столбца матрицы B присваивается значение 3.2}
C[4,3]:=c;{Элементу четвертой строки третьего столбца матрицы C присваивается значение символа c}
Изменить значение элемента массива можно с помощью операции ввода данных:
readln(a[1,1]); {В элемент массива a[1,1] считывается новое значение}
К элементам двумерного массива можно применять все операции, определенные для базового типа.
Перечень базовых операций над матрицами:
ВВОД ИЛИ ИНИЦИАЛИЗАЦИЯ ДВУМЕРНОГО МАССИВА
Двумерный массив вводится в память машины поэлементно.
Для этого необходимое наличие двух циклов, так как изменяется и номер строки, и номер столбца.
Ввод массива с клавиатуры:
program Vvod_matr1;
const n=3; m=4;
var а : array [1..n,1..m] of byte;
i, j:byte; {текущие индексы}
begin
writeln('Enter matrix a(',n,'*',m,')');
{Внешний цикл по строкам}
for i:=1 to n do
{Внутренний цикл по столбцам}
for j:=1 to m do
read(a[i,j]);
...
end.
При вводе массива старайтесь сохранять на экране внешний вид таблицы. Это значит, что после того как вы ввели через пробел три элемента строки, необходимо нажать клавишу Enter и приступить к вводу элементов следующей строки и т.д.
Создать массив можно, с использованием какой-нибудь функции.
for i:=1 to n do
for j:=1 to m do
a[i,j]:=sqr(i+j);
ВЫВОД ДВУМЕРНОГО МАССИВА
Рассмотрим следующий фрагмент программы.
for i:=1 to n do
for j:=1 to m do
write(a[i,j]:2,' ');
Данный пример иллюстрирует вывод двумерного массива в строку через пробел. Такой вариант вывода нарушает структуру таблицы. Поэтому обычно используют способ, когда после вывода полной строки таблицы на экран осуществляется перевод на следующую строку, с использованием процедуры writeln без параметров.
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln
end;
Пример.
program Vvod_matr2;
const n=9; m=11;
var A:array [1..n,1..m] of byte;
i,j:byte;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=sqr(i+j);
writeln;
writeln('Output matrix a(',n,'*',m,')');
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln
end;
readln;readln
end.
Решим задачу, когда матрицу необходимо получить за заданным алгоритмом.
Дано натуральное число m. Создать целочисленную матрицу А порядка m, которая на главной диагонали имеет 1, под ней 5, над ней 4.
Розв'язок
В математике матрица это прямоугольная таблица, образованная из элементов некоторого множества и составляет с m строк и n столбцов. Если таблица называется прямоугольной матрицей размера . Если матрица называется квадратной, а число m ее порядком.
Рассмотрим эту задачу на примере матрицы . Выучим условия какие присутствуют в этом примере: , , (i номер строки, j номер столбца).
Равные индексы ( ) имеют элементы главной диагонали. Если ( ), то элементы расположены над главной диагональю (i изменяется от 1 до 3, j изменяется от 2 до 4). Если ( ), то элементы расположены под главной диагональю (i изменяется от 2 до 4, j изменяется от 1 до 3).Учитывая эти соображения, запишем формулу для вычисления элемента матрицы
program N2;
const m=4;
var A : array [1..m, 1..m] of byte;
i,j:byte;
begin
//Создание матрицы по заданному правилу
for i:=1 to m do
for j:=1 to m do
if i=j then A[i,j]:=1
else
if i<j then A[i,j]:=4
else A[i,j]:=5;
//Вывод матрицы на экран
writeln(Matriza porydka, m);
for i:=1 to m do
begin
for j:=1 to m do
write(a[i,j],' ');
writeln
end;
end.
Дана прямоугольная матрица размером 3*4. Найти количество нулевых элементов в каждом столбце матрицы
program DM;
const m=3; n=4;
var a : array [1..m,1..n] of byte;
i, j, k : byte;
begin
writeln('Vvedite matrizu razmerom ',m,'*',n);
//Создание матрицы
For i:=1 to m do
For j:=1 to n do
read(a[i,j]);
For j:=1 to n do
begin
k:=0;
For i:=1 to m do
if A[i,j]=0 then k:=k+1;
writeln('v ',j, ' stolbze ',k, ' elementov');
end;
readln ;readln
end.
Результат
Поиск максимального или минимального элемента матрицы
Самостоятельно Ковалюк стр. 231