Паскаль – Урок 11: Двумерные массивы
Последний урок паскаль был написан аж 7 марта, тогда мы разбирали одномерные массивы. Сегодня мы узнаем, что такое двумерный массив в паскале, как он описывается и что он из себя представляет. Подробнее далее.
Итак, что же такое двумерный массив? Для лёгкого восприятия представим одномерный массив как линию, а которой все элементы идут друг за другом горизонтально, а двумерный как квадрат, в котором элементы расположены как горизонтально, так и вертикально. Двумерный массив состоит из строчек и столбцов, их также называют матрицей или матричным массивом.
Как описываются двумерные массивы? Для записи двумерных массивов есть несколько способов, я рассмотрю 2 из них.
1 способ описание массива: array [1..m, 1..n] of тип переменных в массиве (integer/real/byte);
2 способ описания массива: array [1..m] of array [1..n] of тип переменных в массиве;
Сначала описываются строки (1..m), а потом столбцы (1..n).
Во втором способе описывается как бы два одномерных массива, которые вместе образуют один двумерный.
Двумерный массив может описываться в разделе Type, для последующего обращения к нему несколько раз или же в разделе описания переменных Var, хочу обратить внимание, что вместо m и n можно подставить и числа, а можно и пользоваться константами.
Пример задания двумерного массива в разделе описания переменных:
Const
m = 100;
n = 100;
var
a: Array [1..m, 1..n] of integer;
В этом случае мы задали двумерный массив a размера 100 на 100, то есть у нас получилась квадратная матрица.
Пример задания матричного массива при помощи раздела Type:
Const
m = 100;
n = 100;
Type
Matrix = Array [1..m, 1..n] of integer;
var
a: Matrix;
b:Matrix;
Во втором примере мы задали два одинаковых матричных массива размерами 100 на 100, при описании массива b нам не пришлось снова описывать его размеры и тип данных.
Как обращаться к ячейке-переменной двумерного массива?
Чтобы обратиться к двумерному массиву, нужно указать сначала номер строки, а потом номер столбца следующим образом:
x:=a[i,j];
x-любая переменная, a – название массива, i-номер строки, j – номер столбца.
Причём i и j может быть как переменными, так и целыми числами.
Пример записи данных в массив:
For i:= 1 to n do //задание в цикле номера строки
For j:=1 to m do //задание в цикле номера столбца
a[i,j]:=random (100);
//присваивание ячейке с номером строки i и номером столбца j случайного значения
Мы заполнили массив случайными числами от 1 до 100.
Пример программы с использованием двумерного массива, в котором мы заполняем массив случайными числами и выводим его на экран:
Var //описание переменных и массива
Matrix: Array[1..10,1..10] of integer;
i, j: integer;
Begin //начало основной программы
writeln ('Двумерный массив: '); //Диалог с пользователем
for i := 1 to 10 do //заполнение массива
for j := 1 to 10 do
Matrix[i,j]:=random (100);
for i := 1 to 10 do begin //Вывод массива
for j := 1 to 10 do
write (matrix[i,j], ' ');
writeln
writeln ('ZedPost.Ru'); //При желании можно удалить
end; //Конец программы
//readln //используется в Турбо паскаль
end.
Скачать пример с использованием матрицы:zapolneniemas.pas
Двумерные массивы (матрицы) в Паскале
Одномерный массив можно представить как линейную структуру, в которой элементы следуют друг за другом. Однако бывают более сложные структуры данных. Например, двумерные массивы, которые можно описать как таблицу, в ячейках которой располагаются значения. Для обращения к данным массива указывается номера их строк и столбцов. Часто табличные массивы называют матрицами.
Обычно двумерные массивы на языке программирования Pascal описываются так:
array [1..m, 1..n] of базовый_тип
Однако можно их описывать как массив массивов:
array [1..m] of array [1..n] of базовый_тип
При этом описание может быть в разделе type и тогда создается новый тип, который можно использовать при объявлении переменных. m и n – это константы, их можно опустить и вставить конкретные значения, но лучше так не делать. Обычно подразумевают, что в интервале от 1 до m определяется количество строк, а в интервале от 1 до n – количество столбцов массива.
1 вариант – описание массива через раздел type :
const M = 10; N = 5; type matrix = array [1..M, 1..N] of integer; var a: matrix;
2 вариант – описание массива в разделе переменных:
const M = 10; N = 5; var a: array [1..M, 1..N] of integer;
При использовании третьего варианта описания лучше сначала определить некоторый тип одномерного массива (строка двухмерного массива), который затем используется при описании двухмерного массива:
type a = array[1..10] of byte; var b: array[1..100] of a;
Для обращения к элементу двухмерного массива необходимо указать имя массива и в квадратных скобках через запятую – значения двух индексов (первый указывает номер строки, а второй – номер столбца), на пересечение которых стоит элемент (например, a[i,2]:=6) . В языке программирования Pascal допустимо разделение индексов с помощью квадратных скобок (например, a[i][5]:= 7 ).
Если описывается двумерный массив как типизированная константа, то при задании значений его элементов он рассматривается как массив массивов. При этом в общих круглых скобках через запятую перечисляются заключенные в круглые скобки значения элементов строк (каждая строка в своих скобках):
type arr = array[1..4, 1..3] of integer; const cords: arr = ((1,-1,3), (0,0,0), (1,4,0), (4,-1,-1));
Рассмотрим простой пример работы с двумерным массивом. Сначала заполним его данными, а затем выведем их на экран в виде таблицы.
var matrix: array[1..3,1..5] of integer; i, j: integer; begin writeln('Введите 15 чисел: '); for i := 1 to 3 do for j := 1 to 5 do read(matrix[i,j]); for i := 1 to 3 do begin for j := 1 to 5 do write(matrix[i,j], ' '); writeln end; end.
Размерность массива (т.е. количество содержащихся в нем значений) определяется произведением количества строк на количество столбцов. В примере выше в массив помещается 15 значений.
Когда пользователь вводит очередное число, то процедура read считывает его и помещает в ячейку с текущими индексами i и j . Когда i равна единице, значение j меняется пять раз, и, значит, заполняется первая строка таблицы. Когда i равна двум, значение j снова меняется пять раз и заполняется вторая строка таблицы. Аналогично заполняется третья строка таблицы. Внутренний цикл for в общей сложности совершает 15 итераций, внешний только 3.
Как пользователь вводит значения – не важно. Он может их разделять либо пробелом, либо переходом на новую строку.
Вывод значений двумерного массива организован в виде таблицы. Выводятся 3 строки по 5 чисел в каждой. Внутри строк числа разделяются пробелом.
На самом деле, это не совсем корректно написанная программа. Мы несколько раз используем цифры 3 и 5. А что если мы захотим поменять размерность массива? Придется просмотреть всю программу (представьте, что она очень большая) и исправить значения. Это неэффективно. Поэтому в программе следует использовать константы. В случае необходимости значения можно поменять всего лишь в одном месте.
Вторая проблема – это “кривость” выводимой на экран таблицы значений матрицы, в случае если есть значения разной разрядности (однозначные, двузначные числа). Неплохо бы под каждое число отводить равное количество знаков.
Вот так может выглядеть подправленный вариант программы:
const M = 3; N = 5; var matrix: array[1..M,1..N] of integer; i, j: integer; begin writeln ('Введите 15 чисел: '); for i := 1 to M do for j := 1 to N do read (matrix[i,j]); for i := 1 to M do begin for j := 1 to N do write (matrix[i,j]:5); writeln end; end.
Двумерные массивы
Двумерный (многомерный) массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов).
Двумерный массив – это набор однотипных данных, имеющий общее имя, доступ к элементам которого осуществляется по двум индексам.
Данные двумерного массива хранятся в прямоугольной таблице – матрице.
Двумерный массив определяется именем, числом строк и столбцов и обозначается: , где А – имя массива; N – число строк, M – число столбцов. Если M=N, то матрица называется квадратной. В матрице каждый элемент определяется номером строки и номером столбца, на пере пересечении которых он расположен, и в соответствии с этим обозначается именем массива с двумя индексами: первый – номер строки, второй – номер столбца. Пример:
.
Если обозначить: i – номер строки, j – номер столбца, то элемент матрицы обозначается .
Если матрица квадратная:
– Для элементов, принадлежащих главной диагонали .
– Для элементов, принадлежащих вспомогательной диагонали , где n – размерность квадратной матрицы.
– Для элементов, лежащих выше главной диагонали .
– Для элементов, лежащих ниже главной диагонали .
Формат записи:
: array [1..N, 1..M] of
Пример описания двумерного массива на языке программирования Pascal:
Type Str = array [1..10] of integere; Matrix=array [1..5] of Str; Var M: matrix;
Мы объявили двумерный массив Паскаля M, состоящий из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i -й строке можно обращаться , а каждому j -му элементу внутри i -й строки –
.
Var A: array[1..n,1..m] of integer; const n=4, m=3 Masiv=array [1..n, 1..m] of integer;
Для того чтобы использовать элемент массива, надо указать имя массива и индекс элемента. Первый индекс соответствует номеру строки, второй – номеру столбца – . Например:
Типовые алгоритмы обработки двумерных массивов
1. Поэлементный ввод массива:
for i:=1 to N do begin for j:=1 to M do readln (A[i, j]); end.
2. Вывод массива в виде таблицы:
for i:= 1 to n do begin for j:= 1 to m do write (a[i,j]:4); writeln; end;
3. Использование генератора случайных чисел для заполнения двумерного массива и вывода его на печать:
randomize; for i:=1 to m do begin for j:=1 to n do begin a[i,j]:=random(100)-10; write(a[i,j]:4); end; writeln; end;
4. Нахождение суммы значений элементов массива:
S:=0; for i:=1 to N do begin for j:=1 to M do S:= S + A[i, j]; end;
5. Нахождение суммы двумерных массивов:
begin for j:= 1 to m do c[i, j]:=a[i, j]+ b[i, j] end;
6. Транспонирование матрицы – зеркальное отражение ее элементов относительно главной диагонали. Сделать это можно, введя новый массив:
for i:= 1 to n do for j:= 1 to n do b[i, j]= a[j, i];
Пример .
Написать программу, которая для двумерного массива размерностью 3х4 определяет среднее арифметическое его элементов и количество положительных элементов в каждой строке.
program srednee; const m=3; n=4; var a: array[1..n,1..m] of integer; i,j,pol_elem:integer; sred:real; begin for i:=1 to n do for j:=1 to m do read(a[i,j]); sred:=0; for i:=1 to n do begin pol_elem:=0; for j:=1 to m do begin sred:=sred+a[i,j]; if a[i,j] > 0 then inc(pol_elem); end; writeln('В',i,'-ой строке',' ',pol_elem,' ','положительных элементов'); end; sred:=sred/n/m; writeln('Средннее арифметическое:',sred:6:2); end.
Тест.Блок-схема
- Выберите один из вариантов в каждом из 5 вопросов;
- Нажмите на кнопку “Показать результат”;
- Скрипт не покажет результат, пока Вы не ответите на все вопросы;
- Загляните в окно рядом с номером задания. Если ответ правильный, то там (+). Если Вы ошиблись, там (-).
- За каждый правильный ответ начисляется 1 балл;
- Оценки: менее 2.5 баллов – НЕУДОВЛЕТВОРИТЕЛЬНО, от 2.5 но менее 3.75 – УДОВЛЕТВОРИТЕЛЬНО, 3.75 и менее 5 – ХОРОШО, 5 – ОТЛИЧНО;
- Чтобы сбросить результат тестирования, нажать кнопку “Сбросить ответы”;
При подготовке материала использовались источники:
https://zedpost.ru/128-paskal-urok-11-dvumernye-massivy.html
https://pas1.ru/arraymulti
https://usernameschool.github.io/blog-post13.html