Просмотр содержимого документа
«Двумерные массивы»
ДВУМЕРНЫЕ МАССИВЫ
Массивы, положение элементов в которых описывается двумя индексами, называются двумерными.
Их можно представить в виде прямоугольной таблицы или матрицы.
Рассмотрим матрицу Аразмером 2х3,то есть в ней будет две строки,а в каждой строке по три элемента:
Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца.
Таким образом, номер элемента определяется пересечением строки и столбца.
Например, а 12 – это элемент, стоящий в первой строке и во втором столбце.
Существует несколько способов объявления двумерного массива.
Способ 1. Двумерный массив можно описать как одномерный, элементами которого являются одномерные массивы. Например, для матрицы А, приведенной выше:
Const n=2; m=3;
type mas1=array[1..m] of ;
mas2=array[1..n] of mas1;
var v: mas1; a: mas2;
В данном случае переменная v объявлена как одномерный массив из 3-х элементов вещественного типа. Переменная а описана как двумерный массив из 2-х строк, в каждую из которых включено по три элемента.
Способ 2.
Описание массива А можно сократить, исключив определение типа mas1 в определении типа mas2 :
const n=2; m=3;
type massiv=array[1..n] of [1..m] of ;
var a: massiv;
Способ3.
Еще более краткое описание массива А можно получить, указывая имя массива и диапазоны изменения индексов для каждой размерности массива:
const n=2; m=3;
type massiv=array[1..n,1..m] of ;
var a: massiv;
Если указанный тип используется для определения одного массива в программе, то удобно объявление массива в разделе описания переменных:
var a: array[1..n,1..m] of
Формирование двумерного массива можно осуществлять всеми тремя способами, описанными для одномерных массивов, то есть
ввод с клавиатуры,
через генератор случайных чисел или
с помощью файла.
Предположим, нам нужно пробежать всю матрицу.
Вот фрагмент программы, выводящий матрицу на экран:
{печатаем сумму всех эл-тов каждой строки и обнуляем значение суммы}
writeln(‘summa stroki =‘,s); s:=0;
writeln;
end;
writeln (‘summa vsech elem. s1=‘, s1);
readln;
end.
Задача 3:
Найти минимальный элемент матрицы и его порядковый номер.
Задача 4:
Найти максимальный элемент каждой строки массива и его индексы.
Найти максимальный элемент всего массива и его индекс(самостоятельно)
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." width="640"
Program 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.
Задача 5:
Найти количество элементов, больших некоторого заданного числа Х в каждой строке массива (во всем массиве).
x then k:=k+1; end; { Если находим для всего массива, то следующую строку надо убрать, а начальное значение k:=0 перенести выше на одну строку } writeln(‘k=‘,k); end; { Печатаем число элементов, удовлетворяющих условию задачи во всем массиве } write(‘k=‘,k); readln; End." width="640"
{ Если находим для всего массива, то следующую строку надо убрать, а начальное значение k:=0 перенести выше на одну строку }
writeln(‘k=‘,k);
end;
{ Печатаем число элементов, удовлетворяющих условию задачи во всем массиве }
write(‘k=‘,k);
readln;
End.
Задача 6:
Решение:
Если массив является симметричным, то для него выполняется равенство a[i,j]=a[j,i] для всех i =1,… n , j =1,…, n при условии, что ij . Но если встретится хотя бы одна такая пара, что соответствующие элементы не будут равны, то массив будет несимметричным.
j) and (a[i,j]a[j,i]) then begin writeln (‘no’); exit; end; writeln (‘jes’); readln; End." width="640"
Program 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 ( ij) and (a[i,j]a[j,i]) then
begin
writeln (‘no’);
exit;
end;
writeln (‘jes’);
readln;
End.
Задача 7:
Вставить строку из нулей на место строки с номером k .
Решение:
Для решения этой задачи необходимо:
Первые k -1 строк оставить без изменения.
Все строки после k -й сдвинуть на одну назад, это лучше начать с последней строки и идти до k -й.
Элементам строки k присвоить заданное значение.
Кроме того, необходимо изменить размер массива. Так как мы вставляем строку, то число строк будет на одну больше.
Program 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.
Задача 8:
Удалить строку с номером k .
Решение:
Для того, чтобы удалить строку с номеромk, необходимо:
Сдвинуть все строки, начиная с данной, на одну вверх.
Последнюю строку «обнулить», то есть всем элементам последней строки присвоить нулевое значение.
Необходимо выводить на экран сначала все строки, а второй раз, после удаления, на одну меньше.
Program 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.
Задача 9:
Поменять местами строки с номерами k 1 и k 2.
Program 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);
{ Меняем значения k 1 и k 2 строк между собой }
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.
Задача 10 (самостоятельно):
В массиве размером n*n к элементам четных столбцов прибавить элемент первого столбца соответствующей строки.
Идея решения:
В данной задаче необходимо проверять четность столбцов.
Основная часть программы будет выглядеть так:
For i:=1 to n do begin
For j:=1 to n do
Проверяем номер столбца на четность. В случае четности прибавляем к значениям проверяемого столбца соответствующие значения первого столбца.
if j mod 2=0 then a[i,j]:=a[i,j]+a[i,1];
end;
Далее распечатываем измененный массив.
Иногда массив необходимо заполнять не случайными числами, а по некоторому закону. Рассмотрим такой пример.
Задача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
Решение:
Для того, чтобы заполнить, надо вывести правило заполнения, а оно в данном случае будет таким:
Если ряд нечетный (то есть номер строки – нечетное число), то
a[i,j]=(i-1)*m+j,
Иначе (то есть когда строка четная)
a[i,j]=i*m-j+1.
По этому правилу и составляем процедуру заполнения. Тем более, что проверка на четность производилась в предыдущей задаче (только со столбцами).
Program 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.
Задача12:
Латинским квадратомназывается массив, в строках и столбцах которого нет одинаковых элементов. Вывести на экран латинский квадрат размеромNxN.
Пример латинского квадрата:
1
5
2
4
3
1
3
5
2
4
3
2
4
1
5
2
4
5
3
3
1
4
2
5
1
Идея решения:
Заполнить 1-ю строку квадратного массива (NxN) числами от 1 до N .
Вторая строка массива получается путем циклического сдвига элементов первой строки, и т.д.
Циклический сдвиг можно реализовать, используя типовой алгоритм вставки-удаления (в зависимости от циклического сдвига).