Слайд 2Массивы, положение элементов в которых описывается двумя индексами, называются двумерными.
Их можно представить в виде прямоугольной таблицы или матрицы.
Слайд 3Рассмотрим матрицу А
размером 2х3,
то есть в ней будет
две строки,
а в каждой строке по три элемента:
Слайд 4Каждый элемент имеет свой номер, как у одномерных массивов, но
сейчас номер уже состоит из двух чисел – номера строки,
в которой находится элемент, и номера столбца.
Таким образом, номер элемента определяется пересечением строки и столбца.
Например, а12 – это элемент, стоящий в первой строке и во втором столбце.
Слайд 5Существует несколько способов объявления двумерного массива.
Способ 1. Двумерный массив можно
описать как одномерный, элементами которого являются одномерные массивы. Например, для
матрицы А, приведенной выше:
Const n=2; m=3;
type mas1=array[1..m] of <тип эл-тов, напр-р, real>;
mas2=array[1..n] of mas1;
var v: mas1; a: mas2;
В данном случае переменная v объявлена как одномерный массив из 3-х элементов вещественного типа. Переменная а описана как двумерный массив из 2-х строк, в каждую из которых включено по три элемента.
Слайд 6Способ 2.
Описание массива А можно сократить, исключив определение типа mas1
в определении типа mas2:
const n=2; m=3;
type massiv=array[1..n] of [1..m] of
<тип эл-тов>;
var a: massiv;
Слайд 7Способ 3.
Еще более краткое описание массива А можно получить, указывая
имя массива и диапазоны изменения индексов для каждой размерности массива:
const
n=2; m=3;
type massiv=array[1..n,1..m] of <тип эл-тов>;
var a: massiv;
Слайд 8Если указанный тип используется для определения одного массива в программе,
то удобно объявление массива в разделе описания переменных:
var a: array[1..n,1..m]
of <тип эл-тов>
Слайд 9Поскольку положение элемента в двумерном массиве описывается двумя индексами (первый
– номер строки, второй – номер столбца), программы большинства матричных
задач строятся на основе вложенных циклов.
Обычно внешний цикл работает по строкам матрицы, то есть с его помощью выбирается требуемая строка матрицы, а внутренний цикл – по столбцам матрицы, то есть здесь выбирается нужный элемент из выбранной уже строки.
Слайд 10Формирование двумерного массива можно осуществлять всеми тремя способами, описанными для
одномерных массивов, то есть
ввод с клавиатуры,
через генератор случайных
чисел или
с помощью файла.
Слайд 11Предположим, нам нужно пробежать всю матрицу.
Вот фрагмент программы, выводящий матрицу
на экран:
for i:=1 to n do
begin
for j:=1 to
m do
write (a[i,j]:4);
writeln
end;
Слайд 12Задача 1.
Найти сумму всех элементов двумерного массива.
Слайд 13Program prim1;
uses crt;
type mas=array[1..100,1..100] of integer;
var a:mas;
i,j,n,m,s:integer;
begin
clrscr;
randomize;
write (‘n=‘); readln (n); write
(‘m=‘); readln (m);
for i:=1 to n do
begin
for j:=1 to m do
begin
{получаем случайные значения элементов матрицы}
a[i,j]:=random(45)-22; write (a[i,j]:4);
{находим сумму элементов}
s:=s+a[i,j];
end;
writeln;
end;
{печатаем сумму всех эл-тов}
writeln (‘summa vsech elem. =‘, s);
readln;
end.
Слайд 14Задача 2.
В предыдущей задаче найти не только сумму всех элементов,
но и сумму элементов каждой строки.
Слайд 15Program prim1;
uses crt;
type mas=array[1..100,1..100] of integer;
var a:mas;
i,j,n,m,s,s1:integer;
begin
clrscr;
randomize;
write (‘n=‘); readln (n); write
(‘m=‘); readln (m);
for i:=1 to n do begin
for j:=1 to m do begin
{получаем случайные значения элементов матрицы}
a[i,j]:=random(45)-22; write (a[i,j]:4);
{находим сумму элементов}
s:=s+a[i,j]; s1:=s1+a[i,j];
end;
{печатаем сумму всех эл-тов каждой строки и обнуляем значение суммы}
writeln(‘summa stroki =‘,s); s:=0;
writeln;
end;
writeln (‘summa vsech elem. s1=‘, s1);
readln;
end.
Слайд 16Задача 3:
Найти минимальный элемент матрицы и его порядковый номер.
Слайд 17Задача 4:
Найти максимальный элемент каждой строки массива и его индексы.
Найти
максимальный элемент всего массива и его индекс (самостоятельно)
Слайд 18Program prim4;
uses crt;
type mas=array[1..100,1..100] of integer;
var a: mas;
i,j,n,max,i1,j1: integer;
begin
clrscr; randomize;
write (‘n=‘); readln (n);
for
i:=1 to n do begin
{Так как тип массива integer, то за начальное значение max возьмем}
max:=-32768;
for j:=1 to do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
if a[i,j]>max then
begin
max:=a[i,j]; i1:=i; j1:=j;
end;
end;
write (‘max=‘, max, ‘N stroki=‘, i1, ‘N stolbza=‘, j1);
writeln;
end;
readln;
End.
Слайд 19Задача 5:
Найти количество элементов, больших некоторого заданного числа Х в
каждой строке массива (во всем массиве).
Слайд 20Program prim5;
uses crt;
var a:=array[1..100,1..100] of integer;
i,j,n,k,x:
integer;
Begin
clrscr; randomize;
write (‘n=‘); readln (n); write (‘x=‘); readln
(x);
for i:=1 to n do begin
k:=0;
for j:=1 to n do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
if a[i,j]>x then k:=k+1;
end;
{Если находим для всего массива, то следующую строку надо убрать, а начальное значение k:=0 перенести выше на одну строку}
writeln(‘k=‘,k);
end;
{Печатаем число элементов, удовлетворяющих условию задачи во всем массиве}
write(‘k=‘,k);
readln;
End.
Слайд 21Задача 6:
Определить, является ли данный квадратный массив симметричным относительно своей
главной диагонали.
Слайд 22Решение:
Если массив является симметричным, то для него выполняется равенство a[i,j]=a[j,i]
для всех i=1,…n, j=1,…,n при условии, что i>j. Но если
встретится хотя бы одна такая пара, что соответствующие элементы не будут равны, то массив будет несимметричным.
Слайд 23Program prim6;
uses crt;
var a: array[1..100,1..100] of integer;
i,j,n: integer;
begin
clrscr;
randomize;
write (‘n=’); readln
(n);
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
end;
writeln;
end;
readln;
for i:=1 to n do
for j:=1 to n do
if (i>j) and (a[i,j]<>a[j,i]) then
begin
writeln (‘no’);
exit;
end;
writeln (‘jes’);
readln;
End.
Слайд 24Задача 7:
Вставить строку из нулей на место строки с номером
Слайд 25Решение:
Для решения этой задачи необходимо:
Первые k-1 строк оставить без изменения.
Все
строки после k-й сдвинуть на одну назад, это лучше начать
с последней строки и идти до k-й.
Элементам строки k присвоить заданное значение.
Кроме того, необходимо изменить размер массива. Так как мы вставляем строку, то число строк будет на одну больше.
Слайд 26Program prim7;
uses crt;
type mas=array [1..100,1..100] of integer;
var a:mas; i,j,k,n: integer;
begin
clrscr; randomize;
write (‘n=‘); readln (n);
{Создаем и распечатываем двумерный массив}
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
end;
writeln;
end;
{Вводим номер вставляемой строки}
write (‘k=‘); readln (k);
{Сдвигаем строки назад до k-й строки, начиная с последней}
for i:=n downto k do
for j:=1 to n do a[i+1,j]:=a[i,j];
{Обнуляем элементы k-й строки}
for j:=1 to n do a[k,j]:=0;
{Распечатываем новый массив, который на одну строку больше исходного}
for i:=1 to n+1 do begin
for j:=1 to n do begin
write (a[i,j]:4);
end;
writeln;
end;
readln;
end.
Слайд 27Задача 8:
Удалить строку с номером k.
Слайд 28Решение:
Для того, чтобы удалить строку с номером k, необходимо:
Сдвинуть все
строки, начиная с данной, на одну вверх.
Последнюю строку «обнулить», то
есть всем элементам последней строки присвоить нулевое значение.
Необходимо выводить на экран сначала все строки, а второй раз, после удаления, на одну меньше.
Слайд 29Program prim8;
uses crt;
type mas=array[1..100,1..100] of integer;
var a:mas; i,j,k,n: integer;
begin
clrscr;
randomize;
write (‘n=‘); readln (n);
{Создаем и распечатываем двумерный массив}
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
end;
writeln;
end;
{Вводим номер удаляемой строки}
write (‘k=‘); readln (k);
{Сдвигаем строки на одну вверх, начиная с данной}
for i:=k to n-1 do
for j:=1 to n do a[i,j]:=a[i+1;j];
{Обнуляем последнюю строку}
for j:=1 to n do a[n,j]:=0;
{Печатаем новый массив, в котором на одну строку меньше}
for i:=1 to n-1 do begin
for j:=1 to n do begin
write (a[i,j]:4);
end;
writeln;
end;
readln;
End.
Слайд 30Задача 9:
Поменять местами строки с номерами k1 и k2.
Слайд 31Program prim9;
uses crt;
type mas=array[1..100,1..100] of integer;
var a:mas; i,j,n,k1,k2,r: integer;
begin
clrscr;
randomize;
write (‘n=‘); readln (n);
{Создаем и распечатываем двумерный массив}
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=random(45)-22;
write (a[i,j]:4);
end;
writeln;
end;
{Вводим номера строк ,которые будем менять местами}
write (‘k1=,k2=‘); readln (k1,k2);
{Меняем значения k1 и k2 строк между собой}
for j:=1 to n do begin
r:=a[k1,j]; a[k1,j]:=a[k2,j]; a[k2,j]:=r;
end;
{Распечатаем измененный массив}
for i:=1 to n do begin
for j:=1 to n do begin
write (a[i,j]:4);
end;
writeln;
end; readln;
End.
Слайд 32Задача 10 (самостоятельно):
В массиве размером n*n к элементам четных столбцов
прибавить элемент первого столбца соответствующей строки.
Слайд 33Идея решения:
В данной задаче необходимо проверять четность столбцов.
Основная часть
программы будет выглядеть так:
For i:=1 to n do begin
For j:=1 to n do
Слайд 34Проверяем номер столбца на четность. В случае четности прибавляем к
значениям проверяемого столбца соответствующие значения первого столбца.
if j mod 2=0
then a[i,j]:=a[i,j]+a[i,1];
end;
Далее распечатываем измененный массив.
Слайд 35Иногда массив необходимо заполнять не случайными числами, а по некоторому
закону. Рассмотрим такой пример.
Слайд 36Задача 11:
Заполнить массив А размером n*m следующим образом, например, n=5
m=5:
То есть заполняется в виде «змейки».
1 2
3 4 5
9 8 7 6
12 13 14 15
19 18 17 16
22 23 24 25
Слайд 37Решение:
Для того, чтобы заполнить, надо вывести правило заполнения, а оно
в данном случае будет таким:
Если ряд нечетный (то есть номер
строки – нечетное число), то
a[i,j]=(i-1)*m+j,
Иначе (то есть когда строка четная)
a[i,j]=i*m-j+1.
По этому правилу и составляем процедуру заполнения. Тем более, что проверка на четность производилась в предыдущей задаче (только со столбцами).
Слайд 38Program prim11;
uses crt;
type mas=array[1..100,1..100] of integer;
var a: mas;
i, j,
n, m: integer;
begin
clrscr;
write (‘n=, m=‘); readln (n,m);
for i:=1 to n do begin
for j:=1 to m do begin
{Заполняем массив по выведенному правилу заполнения
и выводим его на экран}
if imod2=1 then a[i,j]:=(i-1)*m+j else a[i,j]:=i*m-j+1;
write (a[i,j]:4);
end;
writeln;
end;
readln;
end.
Слайд 39Задача 12:
Латинским квадратом называется массив, в строках и столбцах которого
нет одинаковых элементов. Вывести на экран латинский квадрат размером NxN.
Пример
латинского квадрата:
Слайд 40Идея решения:
Заполнить 1-ю строку квадратного массива (NxN) числами от 1
до N.
Вторая строка массива получается путем циклического сдвига элементов первой
строки, и т.д.
Циклический сдвиг можно реализовать, используя типовой алгоритм вставки-удаления (в зависимости от циклического сдвига).
Слайд 41Program prim12;
var a: array[1..10,1..10] of integer;
n,
i, j, x: integer;
begin
writeln (‘razmernost=‘);
readln (n);
for j:=1 to n do
a[1,j]:=j;
{сдвиг}
for i:=2 to n do
begin
for j:=1 to n do
a[i,j]:=a[i-1,j];
x:=a[i,n];
for j:=n downto 2 do
a[i,j]:=a[i,j-1];
a[i,1]:=x;
{вывод}
for i:=1 to n do
begin
for j:=1 to n do
write (a[i,j]);
writeln;
end;
readln;
End.