TURBO PASCAL
Двумерные массивы
Массивы, положение элементов в которых описывается двумя индексами, называются двумерными. Их можно представить в виде прямоугольной таблицы или матрицы.
Рассмотрим матрицу А размерностью 2*3, то есть в ней будет две строки, а в каждой строке по три элемента:
Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел — номера строки, в которой находится элемент, и номера столбца. Таким образом, номер элемента определяется пересечением строки и столбца. Например, a12 — это элемент, стоящий в первой строке и во втором столбце.
Существуют несколько способов объявления двумерного массива.
Способ 1. В Паскале двумерный массив можно описать как одномерный, элементами которого являются одномерные массивы. Например, для матрицы А, приведённой выше:
Const n = 2; m = 3;
Type omyarray = Array[1..m] Of ;
dmyarray = Array[1..n] Of omyarray;
Var v : omyarray;
a : dmyarray;
В данном случае переменная v объявлена как одномерный массив из трёх элементов вещественного типа. Переменная а описана как двумерный массив из двух строк, каждую из которых включено по три элемента.
Способ 2. Описание массива А можно сократить, исключив определение типа omyarray в определении типа dmyarray:
Const n = 2; m = 3;
Type dmyarray = Array[1..n, 1..m] Of ;
Var a : dmyarray.
Способ 3. Ещё более краткое описание массива А можно получить, указывая имя массива и диапазоны изменения индексов для каждой размерности массива:
Const n = 2; m = 3;
Type dmyarray = Array[1..n, 1..m] Of ;
Var a : dmyarray.
Если указанный тип используется для определения одного массива в программе, то удобно объявление массива в разделе описания переменных:
Var a: Array [1..n, 1..m] Of .
Рассмотренные выше методы решения задач обработки одномерных массивов могут применяться для обработки двумерных массивов. Поскольку положение элемента в двумерном массиве описывается двумя индексами [первый — номер строки, второй — номер столбца], программы большинства матричных задач строятся на основе вложенных циклов. Обычно внешний цикл работает по строкам матрицы, то есть с его помощью выбирается требуемая строка матрицы, а внутренний цикл — по столбцам матрицы, то есть здесь выбирается нужный элемент из выбранной уже строки. Для задания значений элементам массива могут быть использованы операторы присваивания и операторы ввода данных.
Пример 1
В приведённом ниже примере осуществляется ввод и вывод двумерного массива А размерностью 10*15. Формирование и вывод массива описаны в виде двух процедур, которые вызываются последовательно из основной программы. Надо заметить, что формирование двумерного массива можно осуществлять всеми тремя способами, описанными для одномерных массивов, то есть: ввод с клавиатуры, через генератор случайных чисел или с помощью файла. Пусть в нашем примере элементы задаются генератором случайных чисел.
Program Example_45;
Const n = 2; m = 15;
Type dmyarray = Array[1..n., 1..m] Of Integer;
Var A : dmyarray;
Procedure Init(Var x: dmyarray); <процедура формирования массива>
Var i, j : Integer;
Begin
For i:=1 To n Do
For j:=1 To m Do
x[i,j]:=-25+Random(51);
End;
Procedure Print(x: dmyarray); <процедура вывода массива на экран>
Var i, j : Integer;
Begin
For i:=1 To n Do
Begin <ввод i-ой строки массива>
For j:=1 To n Do Write(x[i,j]:5);
Writeln; <переход на начало следующей строки>
End;
При решении задач с двумерными массивами можно выделить несколько видов задач.
Найти сумму элементов
Можно найти сумму всех элементов, можно только некоторых, которые удовлетворяют данному условию. Но мы рассмотрим более сложный пример.
Пример 2
Сформировать одномерный массив, каждый элемент которого равен сумме отрицательных элементов соответствующей строки заданной целочисленной матрицы.
Опишем одномерный массив, размерность которого равна количеству строк в двумерном массиве.
Const n = 10; m = 15;
Type omyarray = Array[1..n] Of Integer;
dmyarray = Array[1..n, 1..m] Of Integer
Var B : omyarray;
A : dmyarray;
Формирование одномерного массива по заданному правилу опишем в виде процедуры. Ей будем передавать два параметра — двумерный массив и одномерный, который является результатом. В теле процедуры будут использоваться вложенные циклы. Внешний цикл в ней определяет номер строки, который совпадает с номером элемента одномерного массива. Здесь же задаются начальные значения элементов одномерного массива, равные 0. Во внутреннем цикле анализируется каждый элемент выбранной строки, и если он отрицательный, то добавляется к сумме всех предыдущих отрицательных элементов выбранной строки матрицы.
Procedure Sum(x: dmyarray; Var y: omyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
Begin
y[i]:=0; <задание начальных значений элементов массива суммы>
For j:=1 To m Do<накопление суммы отрицательных>
If x[i,j]
В основной программе обращаемся к процедуре Sum(A,B) и остается только вывести на экран одномерный массив В, в котором записаны суммы отрицательных элементов каждой строки.
Нахождение количества элементов с данным свойством
Задачи на нахождение номеров элементов с заданными свойствами и на нахождение количества таких элементов во всём массиве останутся практически такими же. В них только добавится второй цикл или вывод двух индексов вместо одного.
Пример 3
Найти максимальный элемент массива и его индексы.
Так как элементы могут повторяться, то договоримся, что будем запоминать только индексы первого максимального элемента. Опишем процедуру, которой передаётся массив, и её результатом является значение максимального элемента и индексы первой встречи такого значения.
Procedure Maximum(x: dmyarray; Var max, maxi, maxj: Integer);
Var i,j: Integer;
Begin <начальные значения>
max:=x[1,1]; maxi:=1;maxj:=1;
For i:=1 To n Do
For j:=1 To m Do
If x[i,j]>max Then <присвоение новых значений>
Begin
max:=x[i,j];
maxi:=i;maxj:=j;
End;
End;
Пример 4
Найти количество отрицательных элементов в каждой строке.
Рассмотрим несколько способов решения этой задачи.
Способ 1 — количество элементов каждой строки хранить в одномерном массиве соответствующей размерности. Тогда можно описать такую процедуру:
Procedure Q_1(x: dmyarray; Var y: omyarray);
Var i, j : Integer;
Begin
For i:=1 To n Do
Begin
y[i]:=0
For j:=1 To m Do
If x[i,j]
Способ 2 — использовать счётчик, находить количество элементов строки и выводить значение на экран. Тогда:
Procedure Q_2(x: dmyarray);
Var i, j, k : Integer;
Begin
For i:=1 To n Do
Begin
k:=0
For j:=1 To m Do
If x[i,j]
Работа с несколькими массивами
Пример 5
Составить программу вычисления произведения двух квадратных целочисленных матриц А и В размером 5*5 соответственно. Элементы результирующей, также целочисленной, матрицы С (размером 5*5) определяются по формуле
c[i, j] = | |
где n — размерность матриц А и В.
Формирование матриц будем производить с помощью генератора случайных чисел, вычисление элементов результирующей матрицы С — с помощью вложенных циклов, где во внутреннем цикле (по параметру k) будет накапливаться сумма, определяющая элемент с[i,j].
Program Exampl_46;
Const n = 5;
Type dmyarray = Array[1..n, 1..n] Of Integer;
Var A, B, C : dmarray;
Procedure Init(Var x: dmyarray);
Procedure Print(x: dmyarray);
Procedure Mult(x,y: dmyarray; Var z: dmyarray);
Var k, i, j : Integer;
Begin
For i:=1 To n Do
For j:=1 To m Do
Begin
z[i,j]:=0;
For k:=1 To n Do z[i,j]:=z[i,j]+x[i,j]*y[k,j];
End;
End;
Begin <основная программа>
Writeln(‘массив А:’); Init(A); Print(A);
Writeln(‘массив В:’); Init(B); Print(B);
Mult(A, B, C);
Writeln(‘массив С:’); Print(c);
Readln;
End.
Определить, отвечает ли заданный массив некоторым требованиям
Пример 6
Определить, есть ли в данном массиве элемент, равный 0.
Опишем логическую функцию, значение которой равно истине, если такой элемент есть, и ложь — в противном случае. Самый простой способ — это просматривать элементы, и если найден искомый, то присвоить функции значение True, иначе — False.
Пример 7
Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали.
Если он является симметричным, то для него выполняется равенство a[i, j] = a[i, j] для всех i = 1. n и j = 1. n при условии, что i>j. Поэтому можно составить следующую функцию:
Function Check2(x: dmyarray): Boolean;
Var i, j : Integer;
t : Boolean;
Begin
t:= True; <предположим, что матрица симметрична>
i:=2;
While t And (i
Таким образом, если встретится хотя бы одна такая пара, что соответствующие элементы не будут равны, то значение функции будет ложь(false)
На главную страницу
(с)Все права защищены
По всем интересующим вопросам прошу писать на электронный адрес
Источник
Двумерные массивы
Одномерный массив можно представить как линейную структуру, в которой элементы следуют друг за другом. Однако бывают более сложные структуры данных. Например, двумерные массивы, которые можно описать как таблицу, в ячейках которой располагаются значения. Для обращения к данным массива указывается номера их строк и столбцов. Часто табличные массивы называют матрицами.
Обычно двумерные массивы на языке программирования Pascal описываются так:
Однако можно их описывать и по-другому:
При этом описание может быть в разделе type и тогда создается новый тип, который можно использовать при объявлении переменных. Или массив может быть описан непосредственно в разделе переменных. m и n – это константы, их можно опустить и вставить конкретные значения, но лучше так не делать. Обычно подразумевают, что в интервале от 1 до m определяется количество строк, а в интервале от 1 до n – количество столбцов массива.
1 вариант – описание массива через раздел type:
2 вариант – описание массива в разделе переменных:
При использовании третьего варианта описания лучше сначала определить некоторый тип одномерного массива (строка двухмерного массива), который затем используется при описании двухмерного массива:
Для обращения к элементу двухмерного массива необходимо указать имя массива и в квадратных скобках через запятую – значения двух индексов (первый указывает номер строки, а второй – номер столбца), на пересечение которых стоит элемент (например, a[i,2]:=6). В языке программирования Pascal допустимо разделение индексов с помощью квадратных скобок (например, a[i][5]:= 7).
Если описывается двумерный массив как типизированная константа, то при задании значений его элементов он рассматривается как массив массивов. При этом в общих круглых скобках через запятую перечисляются заключенные в круглые скобки значения элементов строк (каждая строка в своих скобках):
Рассмотрим простой пример работы с двумерным массивом. Сначала заполним его данными, а затем выведем их на экран в виде таблицы.
Размерность массива (т.е. количество содержащихся в нем значений) определяется произведением количества строк на количество столбцов. В примере выше в массив помещается 15 значений.
Когда пользователь вводит очередное число, то процедура read считывает его и помещает в ячейку с текущими индексами i и j. Когда i равна единице, значение j меняется пять раз, и, значит, заполняется первая строка таблицы. Когда i равна двум, значение j снова меняется пять раз и заполняется вторая строка таблицы. Аналогично заполняется третья строка таблицы. Внутренний цикл for в общей сложности совершает 15 итераций, внешний только 3.
Как пользователь вводит значения – не важно. Он может их разделять либо пробелом, либо переходом на новую строку.
Вывод значений двумерного массива организован в виде таблицы. Выводятся 3 строки по 5 чисел в каждой. Внутри строк числа разделяются пробелом.
На самом деле, это не совсем корректно написанная программа. Мы несколько раз используем цифры 3 и 5. А что если мы захотим поменять размерность массива? Придется просмотреть всю программу (представьте, что она очень большая) и исправить значения. Это неэффективно. Поэтому в программе следует использовать константы. В случае чего их значения можно поменять всего лишь в одном месте.
Вторая проблема – это «кривость» выводимой на экран таблицы значений матрицы, в случае если есть значения разной разрядности (однозначное, двузначное и т.д. числа). Неплохо бы под каждое число отводить равное количество знаков.
Вот так может выглядеть подправленный вариант программы:
Источник
Двумерные массивы. Cпособы описания и заполнения двумерных массивов
Ключевые слова:
Двумерный массив— массив, у которого 2 индекса, например: А(3,3); В( 2, 5) и т. п.
Матрица – в математике – аналог двумерного массива – квадратная или прямоугольная таблица, состоящая из строк и столбцов:
Размер двумерного массива — количество элементов в массиве M*N,
где М – число строк, N – число столбцов (натураль – ные числа).
Квадратная матрица – матрица с равным числом строк и столбцов.
Порядок матрицы – число строк (столбцов) квадратной матрицы.
1. Описание двумерного массива
Двумерный массив – это массив массивов, т. е. двумерная таблица. Оперировать можно как с отдельными элементами массива, так и с массивом в целом.
В языке Pascal индексы заключаются в квадратные скобки:
Возможны 2 способа описания 2-мерного массива:
1 Описание массива в разделе переменных VAR:
iнач..iкон, jнач..jкон – диапазоны индексов (строк, столбцов);
t – тип элементов.
VAR y: [1..5, 1..5] of integer ;
VAR F: array [1..30] of array [1..20] of real;
VAR mb: array [1..100, 1..5] of real ;
VAR C: array [1..Max, 1..Max] OF string[10] ;
VAR A: array [1..M, 1..N] OF integer ;
2 Описание массива в разделе описания типов TYPE:
TYPE mas = array[1..20, 1..5] of integer;
TYPE t = ARRAY[1..M, 1..N] OF REAL;
2. Заполнение 2-мерных массивов
Заполнение двумерного массива возможно по строкам и столбцам, каждый из элементов можно вводить:
2 с помощью генератора случайных чисел;
3 объявление массива как CONST;
Заполнение по строкам:
А[1,1] | А[1,2] | А[1,3] | А[1,4] | А[1,5] |
А[2,1] | … | … | … | … |
… | … | … | … | … |
Для заполнения матрицы организуется наружный цикл по i, внутренний – по j (при условии, что i – строки, j –столбцы). При этом индекс строки i меняется медленнее индекса столбца j за счет того, что происходит постепенный перебор всех элементов строки, т. е. столбцов i-й строки.
Заполнение по столбцам:
А[1,1] | А[1,2] | … | … | … |
А[2,1] | … | … | … | … |
А[3,1] | … | … | … | … |
A[4,1] | … | … | … | … |
Упражнения на заполнение 2-мерных массивов
Упражнение mas1: Заполнить матрицу А( 5, 10) по строкам методом генерирования случайных чисел.
A: array [1..5, 1..10] of INTEGER;
FOR i:= 1 to 5 DO
FOR j:=1 TO 10 DO
A[i, j]:= random(10);
end;
Упражнение mas2: Заполнить матрицу А(3, 4) по столбцам методом ввода чисел с клавиатуры.
Var A: array [1..N, 1..M] of INTEGER;
FOR j:= 1 to M DO
FOR i:=1 TO N DO
write(‘Введите элемент A[‘,i,’,’,j,’]=’);
readLn(A[i, j]);
writeLn(‘Результирующая матрица A:’);
Упражнение mas3: Дана матрица A( N? M), состоящая из натуральных чисел. Определить ее максимальный элемент и его индексы.
A: array [1..t, 1..r] of INTEGER;
n, m, Max, iMax, jMax, k: integer;
write(‘Введите число строк N=’); readLn(N);
write(‘Введите число столбцов M=’); readLn(M);
FOR i:= 1 to N DO
Max:= A[1,1]; iMax:=1; jMax:=1; k:=0;
IF A[i, j] > Max then
Max:= A[i, j]; iMax:=i; jMax:=j; k:=1
WriteLn(‘Max= ’ ,Max,’ в строке: ‘,imax, ‘ столбце :’, jmax);
Источник