Двумерные массивы паскаль

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

Рассмотрим матрицу 3*3, то есть она будет состоять из 3 строк и 3 столбцов:

двухмерный массив paskal

Каждый элемент обладает 2-мя индексами. Первый —  номер строки, в котором располагается элемент, а второй – номер столбца. Следовательно, индекс элемента определяется местом пересечением столбца и строки . Например, a13 – это элемент, стоящий в первой строке и в третьем столбце массива.

Описание двумерного массива Паскаля.

Имеется ряд методов объявления двумерного массива.

Рассмотри способ, в котором указывается тип элемента и переменные.

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

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

Во втором и третьем способе матрицу можно задать в одну строку.

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

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

Основные действия с двумерными массивами Паскаля

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

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

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

Ввод двумерного массива Паскаля.

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

Проанализируем образец ввода двумерного массива Паскаля с клавиатуры:

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

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

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

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

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

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

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

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

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

Matrix = array [1..4, 1..3] of integer ;

В данном случае необходимо 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 – размер памяти, ранее отведенные под другие переменные.

Рассмотрим пример, в котором:

Type myArray= array [1..50000] of integer;

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

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

Решим задачу с двумерным массивом Паскаля.

Задача: Вычислить  произведение ненулевых элементов матрицы.

Решение:

  • Для начала нужно установить переменные: матрицу, состоящую из целочисленных элементов; P – произведение элементов, не равное 0; I , J – индексы массива; N , M – количество строк и столбцов в матрице.
  • Входные данные N , M пусть вводятся с клавиатуры, а матрица зададим с помощью функции random ().
  • Выходными параметром получим P (произведение).
  • Выведем матрицу на экран, для проверки работы программы.

А теперь поговорим о процедурах.

Примечание! Тип массива должен быть определен заранее. Например:

Type
Matrix=array [1..10, 1..10] of integer;
..............................
procedure primer (a: matrix);
..............................

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

Procedure vvod ( var m : matrix );

Print – процедуры вывода на экран матрицы, которая передается по значению.

Procedure print ( m : matrix );

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

Итак, опишем ход выполнения программы.

  • Ввод значений N и M ;
  • Обращаемся к процедурам vvod ( a ) и print ( a ) для ввода и вывода матрицы соответственно, где а – матрица;
  • Переменной, которая отвечает за произведение P, присвоим значение 1;
  • Поочередно перебираем элементы матрицы с индексом 11 до элемента с индексом Каждый элемент матрицы должен удовлетворять условию: если a ij ? 0, то произведение P умножаем на элемент a ij ( P = P * a ij );
  • Выводим на экран результат произведения ненулевых элементов матрицы – P
Program proizvedenie;
Type
   Matrix=array [1..10, 1..10] of integer;
Var
   a: matrix;
   n, m, i, j: byte;
   P: integer;
Procedure vvod (var m: matrix);
Var k , h : byte ;
Begin
   For i :=1 to n do 
      For j :=1 to m do 
         M[i,j]:= random(10);
End;
Procedure print (m: matrix);
Var k, h: byte;
Begin
   For i:=1 to n do
   begin
      For j:=1 to m do
         Write (M[i, j]: 4);
      Writeln;
   end ;
End ;
Begin {начало основной программы}
   Writeln ('Введите размерность матрицы:');
   Readln(N, M);
   Vvod(a);
   Print(a);
   P:=1;
   For i:=1 to N do
      For j:=1 to M do
         If a[i, j]<>0 then p:=p*a[i, j];
   Writeln ( p );
End .

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *