Название: Алгоритмы и программы (Афанасьева Т. В.)

Жанр: Информационные системы и технологии

Просмотров: 1339


7.2. двумерный массив

 

Описание двумерных массивов осуществляется одним из  следую-

щих cпособов:

 

a) с помощью типизированной переменной:

type

mar=array[1..5] of byte;

var

a:array[1..6] of mar;

 

б) в разделе объявления переменных:

var

m:array[1..5] of array [1..8] of string;

a:array[1..5,1..4] of integer;

 

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

 

1) С клавиатуры. for i:=1 to n do

for j:=1 to m do read(a[i,j]);

 

2) С помощью типизированной константы. const

c:array[1..3,1..5] of byte = ((0,1,2,3,4), (5,6,7,8,9), (2,1,0,3,4));

 

3) С помощью датчика случайных чисел.

randomize;        { запуск генератора случайных чисел}

for i:=1 to 5 do for j:=1 to 7 do a[i,j]:=random(20);

В этом случае элементами массива будут числа от 0–19.

4) Ввод элементов из файла. var f:file of integer;

a:array[1..5,1..7] of integer;

begin

assign(f,'srsdf.txt');

reset(f);

for i:=1 to 5 do for j:=1 to 7 do read(f,a[i,j]); close(f);

 

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

1) В строку. for i:=1 to 5 do

for j:=1 to 7 do write(a[i,j],’ ‘);

2) В матричной форме. for i:=1 to 5 do

begin

for j:=1 to 7 do write(a[i,j]:3);

writeln;

end;

 

3) В файл.

 

var

 

 

f:file of integer;

a:array[1..5,1..7] of integer;

begin assign(f,'sdfg.txt'); rewrite(f);

for i:=1 to 5 do for j:=1 to 7 do write(f,a[i,j]); close(f);

 

7.2.3. Основные алгоритмы работы с двумерными массивами

 

В нижеприведенных задачах примем условные обозначения:

<read> –          ввод    элементов      массива          одним из        вышеприведенных способов;

<write>  –  вывод  элементов  массива  одним  из  вышеприведенных способов.

 

 

 

var

Пример 7.17. Подсчитать сумму положительных элементов.

a:array[1..5,1..7] of integer;

i,j:byte; k:integer; begin

<read>;

k:=0;

for i:=1 to 5 do for j:=1 to 7 do k:=k+a[i,j]; writeln(k);

end.

 

 

 

var

Пример 7.18. Определить произведение элементов в каждой строке.

a:array[1..4,1..4] of real;

i,j:byte;

p:real;

begin

for i:=1 to 4 do begin

p:=1; { начальное значение произведения }

for j:=1 to 4 do begin read(a[i,j]);

p:=p*a[i,j];       { вычисление произведения}

end; write(p); end;

end.

 

Пример 7.19. В двумерном массиве подсчитать сумму элементов в каждом столбце.

рrogram lupa7;

const n=3; m=3;

type arr=array[1..n,1..m] of integer;

var

a:arr; i,j,p:integer; begin

writeln('Задание:          в двумерном массиве подсчитать');

writeln('            сумму элементов в каждом'); writeln('                      столбце.          '); writeln('исходный массив 3*3');

for i:=1 to n do for j:=1 to m do read(a[i,j]);

writeln (' Результат:');

for j:=1 to n do begin

p:=0;

for i:=1 to n do p:=p+a[i,j];

writeln (j,' стобец: сумма=', p);

end; readln; end.

 

Рассмотрим задачи, в которых требуется выполнить поэлементную обработку некоторых компонент массива, удовлетворяющих опреде- ленному условию:

a) только положительных, отрицательных, кратных заданному числу;

б) в четных или нечетных столбцах или строках.

Для проверки условий можно использовать следующие условные операторы:

if (i mod 2=0) and (j mod 2=0) then ...{четность}

if (i=j)....           на главной диагонали

if (i<j)....           выше главной диагонали

if (i>j)....           ниже главной диагонали

if (i+j=N+1)...  на побочной диагонали

if (i+j<N+1)...  выше побочной диагонали

if (i+j>N+1)...  ниже побочной диагонали

 

Пример 7.20. Дана квадратная матрица. Подсчитать количество положительных элементов, лежащих выше главной диагонали.

program mas2;

var

a:array[1..5,1..5] of integer;

i,j:byte;

k:integer;

f:text; begin assign(f,'fmas2.txt'); reset(f);

writeln;

writeln('Дана квадратная матрица.Подсчитать кол–во положительных');

writeln('элементов,лежащих выше главной диагонали.');

writeln('Данная матрица');

for i:=1 to 5 do for j:=1 to 5 do

read(f,a[i,j]); {считывание массива из файла} for i:=1 to 5 do         { вывод на экран матрицы } begin

for j:=1 to 5 do write(a[i,j]:3);

writeln;

end;

k:=0;

for i:=1 to 5 do begin

for j:=1 to 5 do

if (i<j) and (a[i,j]>0) then {поиск количества элементов по условию}

k:=k+1; end; writeln('Результат');

writeln(k);         {вывод результата}

end.

 

Пример 7.21. Найти сумму четных элементов, расположенных ниже побочной диагонали

program mas3;

const    a:array[1..5,1..5] of integer=((0,1,2,3,4), (5,6,7,8,9), (0,1,2,3,4), (5,6,7,8,9), (0,1,2,3,4));

var i,j:byte; k:integer; begin

writeln('Дана матрица:');

for i:=1 to 5 do begin

for j:=1 to 5 do begin

if (i+j>6) and (a[i,j] mod 2=0) then k:=k+a[i,j];

write(a[i,j]:3);

end; writeln; end;

write('Результат '); writeln(k);

readln;

end.

 

Рассмотрим задачи, в которых требуется в качестве обработки изменить порядок следования элементов в исходном   массиве, например удалить или переставить местами один или несколько элементов в двумерном массиве.

При написании программы  в этом случае можно записать элементы двумерного массива размерностью NxM в одномерный массив с количеством  элементов N*M. Затем выполнить требуемые действия сог- ласно алгоритму для одномерного массива. Завершающей операцией будет обратная запись одномерного массива на место двумерного.

 

Пример 7.22. Удаление в двумерном массиве элемента c номером X. program ud_el;

const n=5;

m=10;

var a:array [1..N,1..M] of integer; b:array[1..N*M] of integer; x,i,j,k:byte;

begin k:=1;

for i:=1 to n do for j:=1 to m do begin

read(a[i,j]);

b[k]:=a[i,j];       { заполнение двумерного массива и запись }

k:=k+1;            { его в одномерный }

end;

{ Удаление некоторого элемента с номером x}

for i:=x to n*m–1 do b[i]:=b[i+1];

b[n*m]:=0;

k:=1;

for i:=1 to n do

begin

for j:=1 to m do begin a[i,j]:=b[k];

k:=k+1;{обратная запись одномерного массива в двумерный}

write(a[i,j]:5);

end; writeln; end;

end.

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

Пример:

исходный массив      результат a11 a12 a13            a11 a12 a13 a21 a22 a23        a31 a32 a33 a31 a32 a33           0            0          0

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

 

Пример 7.23. Удалить строку с номером k. program mas6;

type

t=array[1..5] of integer;

var

a:array[1..5] of t;

i,j,k:byte;

begin

writeln('Дана матрица:');

randomize;

for i:=1 to 5 do for j:=1 to 5 do

a[i,j]:=random(10);       {заполнение и вывод массива}

for i:=1 to 5 do begin

for j:=1 to 5 do write(a[i,j]:3);

writeln;

end;

writeln;

writeln('Задание : удалить строку');

writeln;

repeat

writeln('введите номер строки');

readln(k);         { считывание номера строки }

{ с последующей проверкой }

if k>5 then

writeln('Массив 5x5.Введите число < 5');

until (0<k) and (k<5) ;

 

for i:=k to 4 do a[i]:=a[i+1];

for j:=1 to 5 do a[5,j]:=0;

writeln; writeln('Результат'); for i:=1 to 4 do

begin

for j:=1 to 5 do

write(a[i,j]:3);   {вывод измененной матрицы}

writeln;

end;

end.

 

Рассмотрим обработку двумерных массивов, представляющих собой числовые матрицы.

 

1) Суммирование матриц.

 

Фрагмент программы, реализующий суммирование:

for i:=1 to n do for j:=1 to m do c[i,j]:=a[i,j]+b[i,j];

{Можно          a[i,j]:=a[i,j]+b[i,j]}

 

2) Умножение вектора на матрицу. Результатом будет одномерный массив.

program mm;

{ аналогично предыдущей }

begin

for i:=1 to N do read(b[i]);

for j:=1 to M do

 

 

end.

begin s:=0;

for i:=1 to N do begin read(a[i,j]);

s:=s+b[i]*a[i,j]; {выполнение умножения}

end; c[j]:=s; end;

<write>;

 

 

3) Умножение матрицы на матрицу.

Умножаться могут только согласованные матрицы.

 

Фрагмент программы, реализующий умножение:

 

for i:=1 to n do

for j:=1 to m do            {n,m,k–размерность соответствующих параметров}

begin s:=0;

for e:=1 to k do s:=s+a[i,e]*b[e,j];

c[i,j]:=s;

end;

 

Примеры задач с двумерными массивами

 

Пример 7.24. В двумерном массиве вычислить произведение всех элементов массива.

program lupa3;

const

a:array[1..4,1..4] of integer =((4,2,–3,–6),

(1,8,3,2),          {Ввод с помощью}

(1,4,98,3), {типизированной константы} (3,1,1,1));

var p,i,j:integer;

begin

writeln('            В двумерном массиве вычислить произведение');

writeln('            всех элементов массива.');

writeln(' == Дана матрица ==');

for i:=1 to 4 do

begin

for j:=1 to 4 do write(' ',a[i,j]:3);

writeln;

end;

p:=1;

for i:=1 to 4 do for j:=1 to 4 do

begin p:=p*a[i,j];

end;

writeln('            *Результат*');

write('   ***', p,'***');

end.

 

Пример 7.25. Получить единичную матрицу путем замены элементов на главной диагонали на 1, а остальные – на 0.

program mas4;

var

a:array[1..5,1..5] of integer;

i,j:byte;

begin

writeln('Дана матрица:5*5 ');

for i:=1 to 5 do

for j:=1 to 5 do {заполнение и вывод массива}

a[i,j]:=random(100); {датчик случайных чисел }

for i:=1 to 5 do begin

for j:=1 to 5 do write(a[i,j]:3);

writeln;

end;

writeln;

writeln('Задание: получить единичную матрицу'); writeln('путем замены элементов на главной '); writeln('диагонали на 1, а остальные – на 0');

for i:=1 to 5 do for j:=1 to 5 do

if i=j then          {замена элементов массива в соответствии }

{ с определением единичной матрицы }

a[i,j]:=1 else a[i,j]:=0;

writeln; writeln('Результат'); for i:=1 to 5 do

begin

for j:=1 to 5 do {вывод результата}

write(a[i,j]:3);

writeln;

end;

end.

 

Пример 7.26. Поменять местами два элемента в двумерном массиве. program mas5;

type

t=array[1..5] of integer;

var

b:boolean; a:array[1..5]of t; i,j,f,e,g,s:byte; k:integer;

begin

writeln('Дана матрица:');

randomize;

for i:=1 to 5 do begin

for j:=1 to 5 do

begin    {заполнение и вывод массива}

a[i,j]:=random(10);

write(a[i,j]:3);

end; writeln; end;

writeln('Задание : поменять местами любые два элемента');

repeat

writeln('введите номера строк');

b:=false;

readln(f);

readln(e);          {считывание номеров строк и столбцов}

writeln('введите номера столбцов');

readln(g);

readln(s);

if (f<=5)and (e<=5) and (g<=5) and (s<=5 ) then b:=true

else

 

 

writeln; until b=true; k:=a[e,s];

writeln('Массив 5x5.Введите числа <5.');

a[e,s]:=a[f,g];    {перестановка элементов}

a[f,g]:=k;

writeln('измененная матрица');

for i:=1 to 5 do begin

for j:=1 to 5 do

write(a[i,j]:3);   {вывод результата}

 

 

end.

writeln;

end;

 

 

Пример 7.27. В двумерном массиве найти сумму максимального и минимального элементов. Если она меньше 0, тогда все отрицательные элементы матрицы, лежащие выше главной диагонали, заменить на нули.

 

program konst1;

var

a:array[1..6,1..6] of integer; f:text;         { текстовый файл } max,min,i,j,p:integer;

begin assign(f,'fmas2.txt'); reset(f);

writeln('В двумерном массиве найти сумму макс. и мин. элемента,'); writeln('если она меньше 0, тогда все отрицательные элементы матрицы,'); writeln(' лежащие выше главной диагонали, заменить на нули.');

writeln(' Исходная матрица');

for i:=1 to 6 do for j:=1 to 6 do

read (f,a[i,j]);    {считывание массива из файла}

for i:=1 to 6 do begin

for j:=1 to 6 do

write(a[i,j]:3);   {вывод массива в матричной форме}

writeln; end; writeln;

max:=a[1,1];

for i:=1 to 6 do

for j:=1 to 6 do {поиск и вывод максимального элемента}

if max<a[i,j] then max:=a[i,j];

writeln('максимальный элемент ', max);

min:=a[1,1];

for i:=1 to 6 do for j:=1 to 6 do

if min>a[i,j] then

min:=a[i,j];        {поиск и вывод минимального элемента}

writeln ('минимальный элемент', min);

p:=min+max;    {поиск и вывод суммы}

writeln ('сумма макс. и мин. элемента ',p);

if p<0 then begin

for i:=1 to 6 do for j:=1 to 6 do

if (i<j) and (a[i,j]<0) then a[i,j]:=0;        {замена элементов по условию}

end;

writeln('измененная матрица ');

for i:=1 to 6 do begin

for j:=1 to 6 do {вывод измененного массива в матричной форме}

write(a[i,j]:3);

writeln; end; close(f); readln;

end.

 

Пример 7.28. Найти произведение двух матриц а (2,3) и b (3,2). program mas8;

uses crt;

var

a,b,c:array[1..5,1..5] of integer;

i,j,f,s:byte;

begin

writeln('Даны две матрицы');

randomize;

for i:=1 to 2 do for j:=1 to 3 do a[i,j]:=random(10); for i:=1 to 2 do begin

for j:=1 to 3 do write(a[i,j]:3);

writeln;

end;      {заполнение и вывод матриц}

writeln;

for j:=1 to 3 do for f:=1 to 2 do

b[j,f]:=random(10);

for j:=1 to 3 do begin

for f:=1 to 2 do write(b[j,f]:3);

writeln; end; writeln;

writeln('Задание : найти произведение этих матриц');

writeln('Результат:');

writeln;

for i:=1 to 2 do for f:=1 to 2 do begin

s:=0;

for j:=1 to 3 do {поиск произведения}

s:=s+a[i,j]*b[j,f];

c[i,f]:=s;

end;

for i:=1 to 2 do begin

for f:=1 to 2 do {вывод результата}

write(c[i,f]:5);

writeln; end; readln; readln;

end.

 

Задания для самостоятельного выполнения

1. Дана вещественная матрица А(3,4). Составить программу подсчета количества элементов матрицы, удовлетворяющих условию р1<=a(i,j)<=p2. Значения р1 и р2 задаются самостоятельно.

2. Дана вещественная матрица А(4,4). Составить программу вычисления суммы элементов, расположенных выше главной диагонали.

3. Дана квадратная матрица А(N.N). Составить программу вычисления суммы элементов, расположенных ниже главной диагонали.

4. Дана целая матрица А(N,N). Составить программу подсчета количества четных элементов, расположенных ниже побочной диагонали.

5. Дана квадратная матрица А(N,N). Составить программу подсчета коли- чества отрицательных элементов, расположенных ниже главной и ниже побочной диагонали.

6. Дана квадратная матрица А(N,N). Составить программу подсчета коли- чества положительных элементов, расположенных выше главной и выше побочной диагонали.

7. Дана вещественная матрица А(N,M). Cоставить программу нахождения минимального положительного элемента матрицы и нахождения его местоположения.

8. Дана вещественная матрица А(N,M). Составить программу нахождения максимального отрицательного элемента матрицы и нахождения его мес- тоположения.

9. Дана вещественная матрица А(N,M). Составить программу замены всех нулевых элементов матрицы на минимальный элемент.

10. Дана целая матрица А(N,N). Составить программу подсчета среднего арифметического значения матрицы. Найти отклонение от среднего у элементов первой строки.

11. Дана целая матрица А(N,N). Составить программу подсчета среднего арифметического значения матрицы. Вычислить отклонение от среднего для всех элементов матрицы.

12. Дана целая матрица А(N,N). Составить программу замены всех отрицательных элементов матрицы на среднее арифметическое значение элементов матрицы.

13. Дана вещественная матрица А(N,M). Составить программу замены всех положительных элементов матрицы на элемент, имеющий мини-мальное значение.

14. Дана вещественная матрица А(N.M). Составить программу замены всех отрицательных элементов матрицы на элемент, имеющий макси-мальное значение.

15. Составить программу замены всех отрицательных элементов матрицы А(6,6) на 0, если сумма минимального и максимального элементов этой матрицы окажется меньше Р.

16. Составить программу замены всех отрицательных элементов матрицы А(N,N) на элемент этой матрицы, имеющий минимальное значение. Скорректированную матрицу напечатать.

17. Составить программу нахождения числа строк матрицы А(N,N), сумма элементов у которых отрицательна.

18.  Составить  программу  нахождения  числа  строк  матрицы  А(N,N),

количество отрицательных элементов в которых больше Р.

19. Составить программу формирования и выдачи на печать вектора (b1...b6),   если   bi–сумма   минимального   и   максимального   элементов i–строки матрицы А(6*4).

20.   Составить  программу  нахождения  числа   строк   матрицы   А(6,6),

максимальный элемент которых больше Р.

21.   Составить  программу  нахождения  числа   строк   матрицы   А(6,6),

минимальный элемент которых меньше Р.

22. Составить программу замены всех четных элементов матрицы A(N,N) на элемент  этой  матрицы,  имеющий  максимальное  значение,  распо- ложенный выше главной диагонали.

23.       Составить  программу  нахождения  минимального  положительного элемента в каждом столбце матрицы А(N,N).

24. Дана вещественная матрица размером 7*4. Найти наибольший элемент матрицы. Удалить строку с максимальным элементом.

25. Дана вещественная матрица размером 7*4. Поменять столбец с макси-

мальным элементом с первым столбцом матрицы.

26. Дана вещественная матрица размером 7*7. Найти максимальный элемент матрицы, расположенный ниже побочной диагонали.

27. Дана вещественная матрица размером 7*4. Найти наименьший элемент матрицы. Перенести строку, содержащую этот элемент, в конец.

28. Дана вещественная матрица размером 7*4. Найти максимальный элемент матрицы. Поменять столбец, содержащий этот элемент с последним столбцом матрицы.

29.       Дана  вещественная  матрица  размером  6*4.  Найти  минимальный элемент матрицы. Переставляя ее строки и столбцы, добиться того, чтобы он оказался в правом нижнем углу.

30. Составить программу удаления в матрице А(6,6) максимального элемента.

31. Составить программу удаления строк матрицы А(6,6),   минимальный элемент которых отрицательный.

32.  В  матрице  А(6,6)  перенести в  строке  все  отрицательные элементы в начало.

33.       Дан  массив  С(6,6).  Определить  количество  «особых»  элементов массива, считая элемент   «особым», если он больше суммы остальных элементов своего столбца. Напечатать индексы «особых» элементов.

34.  Дан  массив  С(6,6).  Определить  количество  «особых»  элементов массива, считая элемент «особым», если в его строке слева от него находятся элементы меньшие его, а справа – большие.

35. По массиву A(5,6) получить массив В(6), присвоив его j–элементу значение true, если все элементы j–столбца массива А нулевые, и значение false, если иначе.

36. По массиву А(5,6) получить массив В(5), присвоив его i–элементу значение  true,  если  все  элементы  i–строки  положительны,  и  значение false, если иначе.

37. Дана вещественная матрица А(5,4). Строку, содержащую макси- мальный элемент, поменять местами со строкой, содержащей мини- мальный элемент.

38. Дана вещественная матрица А(5,4). Столбец, содержащий максималь- ный элемент, поменять местами со столбцом, содержащим минимальный элемент.

39. Составить программу замены всех отрицательных элементов матрицы

А(4,5) на минимальный элемент.

40. Дан массив А(6,6). Сформировать массив В(6), где Вi – количество элементов в i–строке матрицы А, удовлетворяющих условию а[i–1,j]<a[i,j]<a[i+1,j].

41. Дан массив А(6,6). Сформировать массив В(6), где Вj – количество элементов в j–столбце матрицы А, удовлетворяющих условию a[i,j]<=a[i,j+1]/2.

42. Дана вещественная матрица С(4,6). Найти минимальный элемент в каждой строке матрицы. Если все полученные минимальные элементы положительны, то выдать сообщение об этом.

43. Дана вещественная матрица С(5,4). Найти максимальный элемент в каждом столбце матрицы. Выдать на печать сообщение, если все эти максимальные элементы положительны.

 

Контрольные вопросы

 

1. Что такое массив?

2. Какие способы объявления массивов применяются в ТР?

3. Основные функции для работы с массивами.

4. Основные правила использования массивов в программах.