Работа с элементами массива
Принципы работы с двумерными массивами Для обработки двумерных массивов могут применяться методы решения задач, рассмотренные в теме "Одномерные массивы". Поскольку положение элемента в двумерном массиве описывается двумя индексами (первый - номер строки, второй - номер столбца), программы большинства задач строятся на основе вложенных циклов.
Найти максимальный элемент массива и его индексы Procedure Maximum(X : MyArray; n, m : integer; 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;
Найти количество отрицательных элементов в каждой строке (вариант 1) Procedure KolOtr1(X : MyArray2; n, m : integer; Var Y : MyArray1); 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] < 0 {если отрицательный элемент найден} then Inc(Y[i]); {то увеличиваем текущее значение на единицу} end; End;
Найти количество отрицательных элементов в каждой строке (вариант 2) Procedure KolOtr2(X : MyArray2; n, m : integer); 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] < 0 then Inc(k); writeln(i,' - ', k); end; End;
Определить, есть ли в заданном массиве элемент, равный 0 (логика) Function Check1(X : MyArray; n, m : integer) : Boolean; Var i, j : integer; Flag : Boolean; Begin Flag := False; {Предполагаем, что искомого элемента в массиве нет} i := 1; while not(Flag) and (i 0) do {перебираем все элементы текущей строки, пропуская ненулевые элементы} Inc(j); Flag := not(j=m+1);{если искомый элемент найден, то переменной Flag присваиваем значение True} Inc(i); end; Check1 := Flag; End;
Решение задач Найти сумму и количество элементов с заданным условием (хранить эти значения в массивах): элементы каждого столбца, кратные k1 или k2; максимальные элементы каждой строки; отрицательные элементы каждой строки;
Определить, является ли данный квадратный массив симметричным относительно своей главной диагонали. В задачах подобного типа необходимо увидеть зависимость между индексами элементов массива. Для этого удобно представить массив в виде таблицы, обозначив элементы, например, буквой а и написав рядом их индексы.
Заметим, что если массив является симметричным, то для него выполняется равенство A[i, j]=A[j, i] для всех i=1,..., n и j=1,..., n. Поэтому можно составить следующую функцию Function Check2(X : MyArray; n, m : integer) : Boolean; Var i, j : integer; Flag : Boolean; Begin Flag := True; {Предполагаем, что матрица симметрична} i := 2; while Flag and (i<n) do begin j := 1; while (j<i) and (X[i, j]=X[j, i]) do Inc(j); Flag := (j=i); Inc(i); end; Check2 := Flag; End;
В массиве размерностью NxM к элементам четных столбцов прибавить элемент первого столбца соответствующей строки Procedure Izmenenie1(Var X : MyArray2; n, m : integer); Var i, j : integer; Begin for i := 1 to n do for j := 1 to m div 2 do Inc(X[i, 2*j], X[i, 1]); End;
Заменить все отрицательные элементы на противоположные Procedure Izmenenie2(Var X : MyArray2; n, m : integer); Var i, j : integer; Begin for i := 1 to n do for j := 1 to m do X[i, j] := Abs(X[i, j]); End;
Заполнение массива по правилу Заполнить массив А размером NxM "змейкой" следующим образом: Для того, чтобы заполнить, надо вывести правило заполнения, а оно в данном случае будет таким: если ряд нечетный, то A[i, j]=(i-1)*m+j; если ряд четный, то A[i, j]=i*m-j+1.
Процедура заполнения Procedure FillArray(Var X : MyArray2; n, m : integer); Var i, j : integer; Begin for i := 1 to n do for j := 1 to m do if i mod 2 =1 then A[i, j]=(i-1)*m+j else X[i, j]=i*m-j+1; End;