Программирование. Работа с двумерными массивами на Паскале

Паскаль

Двумерный массив в Pascal (матрица) – это таблица, которая содержит несколько одномерных массивов. Положение элементов в двумерном массиве обозначается двумя индексами.

Пример матрицы 3*3 (содержит 3 строки и 3 столбца):

Программирование. Работа с двумерными массивами на Паскале

Каждый из элементов обладает двумя индексами: первый – номер строки, где находится элемент, второй – номер столбца. Соответственно, индекс элемента определяется местом пересечением столбца и строки. К примеру, а13 – это элемент, который располагается в третьем столбце и первой строке массива.

Описание двумерного массива на Pascal

Существует несколько методов объявления двумерного массива. Приведем пример, где указан тип элемента и переменные:

Type
Vector = array [1..9] of<тип элементов>;
Matrix= array [1..4] ofvector;
Varmas: matrix;

В этом случае матрица mas включает 3 строки, в каждой из которых находится 9 столбцов. При этом через mas[ i ], а к j можем обратиться к любой i -й строке, а также к j -му элементу внутри i строки – m [ i , j ]. В последних двух способах матрица может задаваться в одну строку.

Type
Matrix= array [1..4] ofarray [1..9] of< тип элементов >;

или еще проще:

type
matrix = array [1..4, 1..9] of<тип элементов>;

Как и в предыдущем примере, двумерный массив состоит из 4 строк и 9 столбцов, обращение к любому элементу массива имеет следующий вид: mas[ i , j ]. Значит, что элемент, находится в j -м столбце и i -й строке.

Внимание! Не перепутайте строки со столбцами, в противном случае в ответе будет ошибка.

Распространенные действия с двумерными массивами Pascal

Основные действия над матрицами осуществляется поэлементно, при этом типы данных их должны быть одинаковыми. Другими словами, если двумерный массив состоит из чисел, то действия можно производить только с числами. Но для реализации операции присваивания массы должны быть одного размера. К примеру, дан следующий массив:

type
matrix= array [1..4, 1..9] ofinteger;
var
a , b : matrix ;

при выполнении такой программы матрице а можно присвоить значения двумерного массива b ( a := b ).

Ввод двумерного массива Pascal

Чтобы поочередно вывести элементы в двумерный массив нужно перебрать элементы с первого столбца первой строки до последнего столбца и последней строки. Справится с этой задачей можно с помощью двух операторов цикла for (один вложен в другой).

Пример ввода матрицы с клавиатуры:

type
matrix= array [1..4, 1..9] ofinteger;
var
a, :matrix;
i, j: integer; { индексы массива }
begin
fori :=1 to 4 do {цикл перебора всех строк}
forj :=1 to 9 do {цикл перебора элементов строки по столбцам}
readln( a [ i , j ]); {ввод с клавиатуры элемента, стоящего в i -й строке и j -м столбце}

Выбор способа заполнения двумерного массива зависит от конкретной задачи. К примеру, функцию random (N) позволяет заполнять двумерный массив случайными величинами a[i,j]:=random(25)-10. Есть задачи, которые требуют содержание выражений в матрице. Но как бы там ни было, в столбцах и строках должен быть определен каждый элемент.

Вывод двумерного массива Pascal на экран.

Элементы при выводе должны печатать по порядку индексов. Другими словами, в строках элементы должны стоять друг за другом, тогда как в столбцах один под другим. Для этого нужно выписать такие элементы кода:

fori :=1 to 4 do {цикл перебора всех строк}
begin
forj :=1 to 9 do {цикл перебора элементов строки по столбцам}
write( a [ i , j ]:3); {печать элементов, стоящих в i -й строке матрицы в одной экранной строке, при этом для вывода каждого элемента отводится 3 позиции}
writeln ;
end ;

Важно! Если вы будете использовать операторы readln ( a [ i , j ]), writeln в другом виде, компилятор не посчитает и не напечатает элемент. В таком случае ввод в программу операторов в таком виде readln (a), writeln (a) является недопустимым, поскольку представляет собой переменную типа массив.

Представление двумерного массива Pascal в памяти

Элементы матрицы располагаются в матрицы ЭВМ последовательно и весят несколько байт. К примеру, элементы массива типа integer, займут по 2 байта. При этом весь массив займет S^2 байта (S обозначает количество элементов в матрице).

В двумерном массиве для каждого элемента типа integer понадобится 2 байта памяти. Теперь приведем пример:

Matrix = array [1..4, 1..3] ofinteger ;

В таком случае потребуется 24 байта памяти.

Пример модель размещения массива M типа matrix в памяти

Программирование. Работа с двумерными массивами на Паскале

Для каждого элемента предлагается две ячейки памяти: размещение проходит от первой строки до нижней, в порядке изменения индекса.

Между адресом ячейки и переменной устанавливается соответствие, но при объявлении двумерного массива программе известно лишь адрес начала массива, к другим элементам адрес вычисляется по следующей формуле:

Addres + SizeElemt * sum*( I -1)+ SizeElem *( J -1),

Где Addres – расположение первого элемента, выделенного для матрицы; I , J – индексы элемента в массиве; SizeElemt – размер элемента матрицы (к примеру, 2 байта для элементов типа integer ); sum – количество элементов в строке.

SizeElemt * sum*( I -1)+ SizeElemt *( J -1) — смещение относительно начала массива.

Сколько памяти выделяется для массива?

Для нормальной работы программы, компьютер выделяет память, разбивая на сегменты по 64 Кбайт. Один из сегментов идет для данных, обрабатываемых программой. Для каждой переменной используется свой сегмент. К примеру, если переменная состоит из массива, то он не займет больше чем 65536 байт.

Безусловно, в сегменте кроме массива могут быть и другие переменные, поэтому для вычисления объема памяти используется следующая формула:

65536- S , где S – размер памяти, отведенной под другие переменные.

Приведем пример:

TypemyArray= array [1..50000] ofinteger;

Если рассматривать с точки зрения синтаксиса, то данная запись верна, но компилятор выдаст ошибку по причине слишком длинного массива.

Можно легко рассчитать количество элементов, допустимых по формуле: 65536/2 –1=32767. При этом других переменных быть не должно. Матрицы имеют еще меньшие пределы индексов.

Рассмотрим задачу с двумерным массивом Pascal

Цель: Вычислить произведение ненулевых элементов двумерного массива.
Решение: В первую очередь необходимо установить переменные: матрицу из целочисленных элементов: P – произведение элементов, не равное 0; N , M – количество строк и столбцов в массиве, I , J – индексы массива.

  • Входные данные N , M вводятся с клавиатуры, а матрица зададим с random ().
  • Выходными параметром получим P.
  • Выведем матрицу на экран, чтобы проверить работоспособность программы.

Рассмотрим процедуры.

Внимание! Тип массива должен определяться заранее. Например:

Type
Matrix=array [1..10, 1..10] ofinteger;
…………………………
procedureprimer (a: matrix);
…………………………

Чтобы вводимая матрица передалась в программу как результат, стоит прибегнуть к процедуре vvod. В этом случае матрица передастся по ссылке. Процедура будет выглядеть следующим образом:

Procedurevvod( var m : matrix );
Print – процедуры вывода на экран матрицы, которая передается по значению.
Procedureprint( m : matrix );

Чтобы реализовать вложенные циклы внутри процедуры необходимо указать счетчики k и h. Используйте вышеприведенное описание для вывода матрицы на экран.

Ход выполнения программы будет следующим:

  • Ввод значений N и M ;
  • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы, где а – матрица;
  • Переменной, отвечающей за произведение P, присвоим значение 1;
  • Поочередно перебираем элементы двумерного массива с индексом 11 до элемента с индексом Каждый элемент должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij( P = P * a ij );
  • Результат произведения нулевых элементов матрицы – Р выводим на экран.

Programproizvedenie;
Type
Matrix=array [1..10, 1..10] ofinteger;
Var
a: matrix;
n, m, i, j: byte;
P: integer;
Procedurevvod (var m: matrix);
Vark , h : byte ;
Begin
Fori :=1 to n do
Forj :=1 to m do
M[i,j]:= random(10);
End;
Procedureprint (m: matrix);
Var k, h: byte;
Begin
Fori:=1 to n do
begin
Forj:=1 to m do
Write (M[i, j]: 4);
Writeln;
end ;
End ;
Begin {начало основной программы}
Writeln (‘Введите размерность матрицы:’);
Readln(N, M);
Vvod(a);
Print(a);
P:=1;
Fori:=1 to N do
Forj:=1 to M do
Ifa[i, j]<>0 then p:=p*a[i, j];
Writeln( p );
End .

Удалось ли вам освоить двумерные массивы Паскаль? Оставьте комментарий, чтобы поделиться своим опытом.

Оцените статью
Образовательный портал WELCOME4U.RU
Добавить комментарий

  1. Иван

    Спасибо за подробное объяснение темы по работе с массивами.

    Ответить
Adblock
detector