Двумерный массив. Матрицы 1
В математике таблицы чисел, состоящие из строк и столбцов называются матрицами и записываются в круглых скобках.
Двумерный массив. Применение. 2
Использование двумерных массивов для построения поверхностей.
Двумерный массив. Определение. 3
Массив — это пронумерованная последовательность величин одинакового типа, обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (или элементом массива).
Способ организации данных, при котором каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен, называется двумерным массивом
Двумерный массив. Определение 4
В математике :
A i ;j
1 2 3 4 5 6
7
4
4
1
2
1
5
3
7
5
8
0
9
4
6
9
0
0
1
2
3
В Pascal :
A[ i ,j ]
A[ 2 , 4 ]
A[ 1 , 2 ]
A[ 3 , 5 ]
Двумерный массив. Описание 5
Самый простой способ описания массива
a : array [ 1..10, 1..20 ] of real;
Количество строк
Имя массива
Тип данных в массиве
Описание как массив массивов:
Количество столбцов
a: array [ 1..10 ] of array [ 1.. 20 ] of real;
Каждый элемент которого в свою очередь является одномерным массивом
Одномерный массив
Двумерный массив. Описание 6
Количество строк и столбцов через константу.
Const m=10; n =20; Var a : array [ 1.. m, 1.. n ] of integer;
В разделе констант указываем число строк и столбцов
Определяем пользовательский тип , двумерный массив
Определением нового типа данных.
type t =array[ 1..m,1..n ] of integer;
var a : t;
Двумерный массив. Описание 7
Массив констант.
const
a : array[ 1..3,1..5 ] of integer =
((3,-2,1,4,3),
(-5,-9,0,3,7),
(-1,2,1,-4,0));
Непосредственно в программе указываем значения элементов массива.
Двумерный массив. Заполнение 8
Цикл отвечающий за перебор строк. Берем первую, вторую и так далее строки
Заполнение массива с клавиатуры:
For i := 1 to 3 do begin
For j := 1 to 4 do
begin
write(' A[ ', i, ' , ' ,j, ' ]= ');
readln(a[i, j])
end ;
Цикл отвечающий за перебор ячеек в каждой строке.
end ;
Двумерный массив. Заполнение 9
Блок-схема заполнения с клавиатуры:
Цикл отвечающий за перебор строк. (Внешний цикл)
i , 1, N
j , 1, N
Ввод a i , j
Цикл отвечающий за перебор ячеек в каждой строке. (Внутренний цикл)
Двумерный массив. Заполнение 10
Заполнение массива случайными числами:
For i := 1 to 3 do begin
For j := 1 to 4 do begin
a[i, j] := random(2 1 ) - 10;
write(a[i, j]:6) ;
end ;
writeln ;
end ;
Когда i -я строка закончилась, пишем пустой WriteLN для перехода на новую строку
Write без LN выводит элементы массива в строку
Двумерный массив. Заполнение 11
i , 1, N
Цикл отвечающий за перебор строк. (Внешний цикл)
j , 1, N
a i , j =
случайное [ -10 ;10]
Вывод a i , j
Цикл отвечающий за перебор ячеек в каждой строке. (Внутренний цикл)
Двумерный массив. Заполнение 12
Заполнение массива по правилу:
ClrScr;
Write('ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=i;
write(a[i,j] :4 );
end ;
writeln ;
end ;
For i := 1 to 3 do begin
For j := 1 to 4 do begin
a[i, j] := ФОРМУЛА;
write(a[i, j]:6) ;
end ;
writeln ;
end ;
Заполнить произвольный массив размером N x N (N
11111
22222
33333
44444
55555
Значение элемента в каждой ячейке строки равно номеру строки.
Двумерный массив. Заполнение 13
ClrScr;
Write(' ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
if (i+j = n+1) then a[i,j]:=1
else a[i,j]:=0;
write(a[i,j]);
end;
writeln;
end;
1 2 3 4
Главная диагональ:
I=J
a 14
a 11
1
2
3
4
a 23
a 22
Побочная диагональ:
I + J = N+1
a 32
a 33
a 44
a 41
Заполнить произвольный массив размером
N x N (N
00001
00010
00100
01000
10000
Если побочная диагональ то заполнить ячейку 1 во всех остальных случаях 0
Двумерный массив. Заполнение 14
Ввод N
i , 1, N
j , 1, N
Фрагмент блок-схемы задачи заполнения побочной диагонали единицами
i+j=N+1
Да
Нет
a i , j = 1
a i , j = 0
Вывод a i , j
j " width="640"
Двумерный массив. Заполнение 15
1 2 3 4 5
Удовлетворяет неравенству
i
a 11
1
2
3
4
5
a 22
a 33
a 44
a 55
Удовлетворяет неравенству
i j
n+1 " width="640"
Двумерный массив. Заполнение 16
1 2 3 4 5
a 15
1
2
3
4
5
Удовлетворяет неравенству
i +j n+1
a 24
a 33
a 42
a 5 1
Удовлетворяет неравенству
i +jn+1
j ) a 15 ( i+jn+1 ) And ( i ) a 11 1 2 3 4 5 a 22 a 24 a 33 a 42 a 44 a 5 1 a 55 ( i+jn+1 ) And ( ij ) " width="640"
Двумерный массив. Заполнение 17
Системы неравенств
(i+j And ( i )
1 2 3 4 5
( i+j n+1 ) And ( i j )
a 15
( i+jn+1 ) And ( i )
a 11
1
2
3
4
5
a 22
a 24
a 33
a 42
a 44
a 5 1
a 55
( i+jn+1 ) And ( ij )
=n+1) and (i else a[i,j]:=0; write(a[i,j]:2); end; writeln; end; Заполнить произвольный массив размером N x N (N 0000 1 000 11 00 111 000 11 0000 1 Это пересечение двух множеств. Элементы лежащие на и ниже побочной диагонали и элементы лежащие на и выше главной диагонали Проверяем условие принадлежности данному множеству " width="640"
Двумерный массив. Заполнение 18
Write( ' ВВеди N = '); Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
if (i+j=n+1) and (i
else a[i,j]:=0;
write(a[i,j]:2);
end;
writeln;
end;
Заполнить произвольный массив размером N x N (N
0000 1
000 11
00 111
000 11
0000 1
Это пересечение двух множеств. Элементы лежащие на и ниже побочной диагонали и элементы лежащие на и выше главной диагонали
Проверяем условие принадлежности данному множеству
Двумерный массив. Сумма элементов 19
Второй способ. Два прохода по массиву
Write(' ВВеди N = ');Readln(n);
s:=0;
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
end;
writeln;
end;
For i:=1 to n do
For j:=1 to n do
if (i=j) then s:=s+ a[i,j];
writeln('Сумма элементов =',s:5);
Один или два прохода по массиву?
Первый способ. Один проход по массиву
ClrScr;
Write(' ВВеди N = ');Readln(n);
s:=0;
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(20)-10;
write(a[i,j]:4);
if (i=j) then s:=s+ a[i,j];
end;
writeln;
end;
writeln('Сумма элементов =',s:5);
Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти сумму элементов массива лежащих на главной диагонали.
Замечание.
Если нужно что то сделать только
с главной диагональю,
то можно обойтись без вложенных циклов
For i :=1 to n do s:=s+ a[i, i ];
Первый проход. Заполняем массив и выводим его на экран
Заполняем случайными числами и выводим на экран
Второй проход. Находим сумму.
И сразу же находим сумму элементов лежащих на главной диагонали
Двумерный массив. Сумма элементов 20
Нахождение суммы элементов на главной диагонали за один проход по массиву
Ввод N
S = 0
i , 1, N
j , 1, N
a i , j =
случайное [ -10 ;10]
Вывод a i , j
i = j
Да
S =S + a i , j
Нет
Вывод S
Двумерный массив. Сумма элементов 21
Нахождение суммы элементов на главной диагонали за два прохода
Ввод N
S = 0
1
i , 1, N
i , 1, N
j , 1, N
j , 1, N
i = j
Нет
a i , j =
случайное [ -10 ;10]
Да
Вывод a i , j
S =S + a i , j
1
Вывод S
Двумерный массив. Сумма элементов 22
Нахождение суммы элементов на главной диагонали за два прохода (в случае когда речь идет только о главной диагонали и остальной массив не нужен)
Ввод N
S = 0
i , 1, N
i , 1, N
j , 1, N
a i , j =
случайное [ -10 ;10]
S =S + a i , i
Вывод a i , j
Вывод S
1
Двумерный массив. Минимальный элемент 23
Один или два прохода по массиву? Рассуждение второе.
Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти минимальный элемент лежащий на главной диагонали.
Двумерный массив. Минимальный элемент 24
Стандартный способ без анализа задачи
Write(' ВВеди N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(2 1 )-10;
write(a[i,j]:4);
end;
Writeln;
end;
m:=a[1,1];
For i:=1 to n do
For j:=1 to n do
if (a[i,j]
writeln(' Минимальный элемент =',m:5);
Заполняем массив случайными числами
Замечание .
В данном случае можно не бегать по всему
массиву а пройти только по главной диагонали, обойдясь без вложенных циклов.
m:=a[1,1];
For i:=2 to n do
if (a[i,i]
Если встречается элемент меньше m, и он лежит на главной диагонали, то он становится минимальным
Предполагаем, что минимальный элемент стоит в левом верхнем углу
Двумерный массив. Минимальный элемент 25
С анализом исходных данных задачи
Write('ВВеди N = ');Readln(n);
m:=10;
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(21)-10;
write(a[i,j]:4);
if (a[i,j]
end;
Writeln;
end;
writeln(' Минимальный элемент лежащий на главной диагонали =',m:5);
Если немного по рассуждать, можно увидеть, что самое «маленькое» число, которое может выдать генератор случайных чисел это 10. Все остальные числа будут меньше его. Т.к. в условии задачи нам точно задан интервал
[-10 ; 10] .
Предполагаем, что самое маленькое число 10, правая граница исходного интервала.
Заполняем, выводим на экран и сразу проверяем на минимальность в главной диагонали.
Двумерный массив . Максимальный элемент в строке 26
Заполнить двумерный массив N x N случайными числами из интервала [-10 ; 10] и найти максимальный элемент в каждой строке.
max) then max:= a[i,j]; end; write(' MAx = ',max:5); writeln; end; Решение в один проход, с анализом задачи Перебираем строки Предполагаем, что самое большое число - 10, левая граница исходного интервала. Заполняем элемент массива и выводим его на экран Если в строке встречается элемент больше максимального, то он становится максимальным Выводим наибольший элемент в строке " width="640"
Двумерный массив. Максимальный элемент в строке 27
Write(' ВВеди N = ');Readln(n);
For i:=1 to n do begin
max:=-10;
For j:=1 to n do begin
a[i,j]:=random(2 1 )-10;
write(a[i,j]:4);
if (a[i,j]max) then max:= a[i,j];
end;
write(' MAx = ',max:5);
writeln;
end;
Решение в один проход,
с анализом задачи
Перебираем строки
Предполагаем, что самое большое число - 10, левая граница исходного интервала.
Заполняем элемент массива и выводим его на экран
Если в строке встречается элемент больше максимального, то он становится максимальным
Выводим наибольший элемент в строке
Max Max = a i , j Нет Вывод Max Конец " width="640"
Двумерный массив. Максимальный элемент в строке 28
Нахождение максимального элемента в каждой строке в один проход
Ввод N
i , 1, N
Мах = - 1 0
j , 1, N
a i , j =
случайное [ -10 ;10]
Вывод a i , j
Да
a i , j Max
Max = a i , j
Нет
Вывод Max
Конец
max) then max:= a[i,j]; writeln('В ',i,' строке max = ',max:5); end; Стандартным способом, первый проход – заполнение, второй проход – поиск максимального в строках Идем по строке и если находим элемент больший чем максимальный, то он становится максимальным Заполняем массив и выводим его на экран Вывод наибольшего элемента в строке " width="640"
Двумерный массив. Максимальный элемент в строке 29
Предполагаем, что наибольший элемент в каждой строке стоит на первом месте
Перебираем строки
ClrScr;
Write(‘ Введи N = ');Readln(n);
For i:=1 to n do begin
For j:=1 to n do begin
a[i,j]:=random(2 1 )-10;
write(a[i,j]:4);
end;
writeln;
end;
For i:=1 to n do begin
max:=a[i,1];
For j:=2 to n do if (a[i,j]max) then
max:= a[i,j];
writeln('В ',i,' строке max = ',max:5);
end;
Стандартным способом,
первый проход – заполнение,
второй проход – поиск
максимального в строках
Идем по строке и если находим элемент больший чем максимальный, то он становится максимальным
Заполняем массив и выводим его на экран
Вывод наибольшего элемента в строке
Max Нет a i , j = случайное [ -10 ;10] Да Вывод a i , j Max = a i , j 1 Вывод Max Нахождение максимального элемента в каждой строке в два прохода Конец " width="640"
Двумерный массив. Максимальный элемент в строке 30
Начало
1
Ввод N
i , 1, N
Мах = a i , 1
i , 1, N
j , 2, N
j , 1, N
a i , j Max
Нет
a i , j =
случайное [ -10 ;10]
Да
Вывод a i , j
Max = a i , j
1
Вывод Max
Нахождение максимального элемента в каждой строке в два прохода
Конец