Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

1. Двумерные массивы

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

Например, матрицу можно использовать для хранения средних температур по месяцам в течение нескольких лет (см. таблицу 4).

Таблица 4. Пример таблицы, состоящей из нескольких строк.

год

1

2

3

4

5

6

7

8

9

10

11

12

1991

-19

-15

-10

1992

-21

2000

-23

1) Двумерный массив можно описать как одномерный, элементами которого являются одномерные массивы:

Type Month=Array[1..12] Of Real; {одномерный массив из 12 элементов}

Year=Array[1991..2000] Of Month;

Var T:Year; {двумерный массив из 10 строк, в каждой - 12 элементов}

2) Описание массива T можно сократить:

Type Year=Array[1991..2000] Of Array[1..12] Of Real;

Var T:Year; {двумерный массив из 10 строк, в каждой - 12 элементов}

3) Еще более краткий способ описания массива из 10 строк и 12 столбцов:

Var T: Аrray[1991..2000,1..12] Of Real;

4) При инициализации двумерных массивов в разделе констант каждая строка заключается в дополнительную пару круглых скобок:

Сonst mas:Array[1..3,1..4] Of Integer =((2,3,1,0), (1,9,1,3), (3,5,7,0));

Описание mas задает матрицу, состоящую из трех строк и четырех столбцов:

Положение элемента в двумерном массиве описывается двумя индексами: первый – номер строки, второй – номер столбца.

Для обращения к отдельному элементу двумерного массива потребуется два индекса: номер строки и номер столбца: T[1992,3] или T[1992][3].

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

НЕ нашли? Не то? Что вы ищете?

Пример 2.1. Ввод и вывод матрицы.

For i:=1991 To 2000 Do

{Внешний цикл (цикл по i) определяет изменение индекса строк}

For j:=1 To 12 Do

Read(t[i, j]);

{Внутренний цикл (цикл по j) определяет изменение номера элемента в строке – индекс столбцов}

For i:=1991 To 2000 Do {Вывод матрицы}

Begin

For j:=1 To 12 Do

Write(t[i, j]:8:2,’ ‘);

WriteLn

End;

Пример 2.2. Заполнить матрицу порядка n по следующему образцу:

1

2

3

...

n-2

n-1

n

2

1

2

...

n-3

n-2

n-1

3

2

1

...

n-4

n-3

n-2

...

...

...

...

...

...

...

n-1

n-2

n-3

...

2

1

2

n

n-1

n-2

...

3

2

1

Программа:

Program Matrica;

Var I, J, K, N : Integer; A : Array [1..10, 1..10] Of Integer;

Begin

Write('Введите размерность матрицы: '); ReadLn(N);

For I := 1 To N Do {заполнение матрицы}

For J := I To N Do

Begin

A[I, J] := J - I + 1;

A[J, I] := A[I, J];

End;

For I := 1 To N Do {вывод матрицы}

Begin

WriteLn;

For J := 1 To N Do Write(A[I, J]:4);

End

End.

Если количество строк и столбцов в двумерном массиве одинаковое, то такой массив называется квадратным. Например, при n=3:

a11 a12 a13 

a21 a22 a23 

a31 a32 a33 

1. Квадратные матрицы имеют главную и побочные диагонали. Например, для матрицы А на главной диагонали лежат элементы 1, 5 и 9, а на побочной – 3, 5 и 7.

Если:

i=j – элементы расположены на главной диагонали;

i>j – элементы расположены ниже главной диагонали;

i<j – элементы расположены выше главной диагонали;

i+j-1=n – элементы расположены на побочной диагонали. Элемент матрицы на побочной диагонали в общем виде будет иметь адрес A[i,N+1–i];

i+j-1<n – элементы расположены над побочной диагональю;

i+j-1>n – элементы расположены под побочной диагональю.

2. Квадратная матрица, у которой все элементы, исключая элементы главной диагонали, равны нулю, называется диагональной матрицей:

.

3. Диагональная матрица, у которой все элементы, стоящие на главной диагонали, равны 1, называется единичной матрицей.

4. Если в матрице A(n,m) поменять местами строки и столбцы, то получится матрица AT(n,m), которая называется транспонированной матрицей:

.

Программы большинства матричных задач строятся на основе вложенных циклов. Обычно внешний цикл работает по строкам матрицы, а внутренний цикл – по столбцам матрицы.

Задачи, использующие двумерные массивы:

1) сумма элементов (всех или удовлетворяющих заданному условию);

2) нахождение количества элементов с заданными свойствами;

3) определить, отвечает ли заданный массив некоторым требованиям (существует ли элемент, равный 0);

Основные действия, которые можно выполнять над матрицами

1) суммировать;

2) находить разность;

3) произведение матрицы на некоторое число;

4) произведение двух матриц.

Пример 2.3. Ввести целочисленный массив размерности NхN из файла и вывести на экран сам массив и сумму всех его элементов.

Program summa;

Const Nmax=50;

Type mas=Array[1..Nmax,1..Nmax] Of Integer;

Var a:mas; i,j,sum,N:Integer; f:text;

Begin

assign(f,’f. dat’);

reset(f);

ReadLn(N); {Ввод размерности массива}

{Ввод элементов и суммирование}

sum:=0;

For i:=1 To N Do

For j:=1 To N Do

Begin

Read(f, a[i, j]);

sum:=sum+a[i, j];

End;

Close(f)

{Вывод элементов массива}

WriteLn(‘Массив’);

For i:=1 To N Do

Begin

For j:=1 To N Do

Write(a[i, j]);

WriteLn

End;

{Вывод суммы элементов массива}

Writeln(‘Сумма=’,sum);

End.

Пример 2.4. В матрице размерностью 10х10 поменять местами столбцы с номерами k и n. Значения элементов массива вводятся из файла f.dat.

Program replace_matr;

Type mas=Array[1..10,1..10] Of Integer;

Var a:mas;

k, n,j, i,b:Integer;

f:Text;

Begin

ReadLn(k); {ввод номеров столбцов}

ReadLn(n);

{Ввод элементов из файла}

Assign(f,’f. dat’);

Reset(f);

for i:=1 to 10 do

for j:=1 to 10 do

Read(f, a[i, j]);

Close(f)

{Столбцы с номерами k и n меняются местами}

for i:=1 to 10 do

begin

b:=a[i, k];

a[i, k]:=a[i, n];

a[i, n]:=b

end;

{Вывод элементов матрицы}

For i:=1 to 10 do

Begin

For j:=1 to 10 do

Write(a[i, j]);

WriteLn

End;

End.

Пример 2.5. В матрице размерностью NхN (N вводится с клавиатуры) найти сумму элементов, стоящих выше главной диагонали. Матрица заполняется случайными числами в диапазоне от 1 до 100..

Const NMax=10;

Var A : Array[1..NMax,1..NMax] Of Integer;

I, K : Byte; S : Integer;

Begin

Write(‘N=’); ReadLn(N);

Randomize;

S:=0;

{заполнение и вывод матрицы; вычисление суммы элементов выше главной диагонали}

For I:=1 To N Do

Begin

For K:=1 To N Do

Begin

A[I, K]:=Random(101)+1;

Write(A[I, K]:6);

If K>I Then S:=S+A[I, K]

End;

Writeln

End;

Writeln('Сумма элементов выше главной диагонали равна ',S)

End.

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

...

S:=0;

For I:=1 To N Do

For K:=I+1 To N Do

S:=S+A[I, K];

...

Пример 2.6. Дана целочисленная квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали.

Program Obmen;

Var N, I, J, Max, Ind, Vsp : Integer;A : Array [1..15, 1..15] Of Integer;

Begin

WRITE('Введите количество элементов в массиве: ');

READLN(N);

FOR I := 1 TO N DO

FOR J := 1 TO N DO

Begin

WRITE('A[', I, ',', J, '] '); READLN(A[I, J])

End;

FOR I := 1 TO N DO Begin

Max := A[I, 1]; Ind := 1;

FOR J := 2 TO N DO

IF A[I, J] > Max THEN

Begin

Max := A[I, J]; Ind := J

End;

Vsp := A[I, I]; A[I, I] := A[I, Ind]; A[I, Ind] := Vsp

End;

FOR I := 1 TO N DO Begin

FOR J := 1 TO N Do Write(A[I, J] : 6);

WriteLn;

End;

End.

Для работы с двумерными массивами желательно подготовить программу-шаблон, которая включает ввод данных из файла и вывод элементов двумерного массива на экран (можно в файл). Размеры двумерного массива можно также вводить из файла.

2. Вставка и удаление элементов двумерного массива

Задача 1. Из двумерного массива размерностью NxM удалить строку с номером K.

Алгоритм удаления:

- сдвинуть все строки, начиная с K+1 на одну строку вверх,

- вывести первые N-1строку.

Program udal_dv;

Var mas=array[1..20,1..20] of integer;

k, N,M, i,j:byte;

f:text;

Begin

ReadLn(N); ReadLn(M); ReadLn(k);

Assign(f,’f. dat’);

Reset(f);

For i:=1 to N do

Begin

For j:=1 to M do

Read(f, mas[i]);

ReadLn(f)

End;

for i:=k to N-1 do

for j:=1 to M do

a[i, j]:=a[i+1,j];

For i:=k to N-1 do

Begin

For j:=1 to M do

write(mas[i]:6)

Writelnl;

End;

End.

Задача 2. В двумерный массив размерностью NxM вставить вектор B[M] после строки с номером K.

Алгоритм удаления:

- сдвинуть все строки массива, начиная последней и до K+1 на одну строку вниз,

- на место K+1 строки записать вектор B[M],

- вывести матрицу размерностью N+1 на M.

Program vst_dv;

Type mas=array[1..10] of integer;

mas1=array[1..10] of mas;

Var a:mas1;

b:mas;

k, N,M, i,j:byte;

Begin

ReadLn(N); ReadLn(M); ReadLn(k);

For i:=1 to N do

For j:=1 to M do

Read(a[i, j]);

For i:=1 to M do

Read(b[i]);

For i:=N to k+1 downto

For j:=1 to M do

a[i+1,j]:=a[i, j];

For i:=1 to M do

a[k+1,i]:=b[i];

For i:=1 to N+1 do

Begin

For j:=1 to M do

Write(a[i, j]);

Writeln;

End;

End.

При необходимости вставки или удаления нескольких строк или столбцов необходимо вести подсчёт количества вставленных или удалённых строк или столбцов для корректного вывода результирующего массива.

3. Действия над массивами как единым целым

Единственное действие, которое можно выполнять над массивами целиком, но только при условии, что массивы описание массивов полностью совпадает, – это присваивание.

Пример 3.11. Выполнение операции присваивания массивов.

1) Var p, q:Array[1..15,1..10] Of Real;

...

p:=q;

...

В этом случае все элементы массива p станут равными элементам массива q.

2) Type vec=Array[1..10] Of real;

Var p:Array[1..15] Of vec;

q:Array [1..15,1..10] Of real;

...

p:=q;

...

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