Название: Алгоритмы и программы (Афанасьева Т. В.) Жанр: Информационные системы и технологии Просмотров: 1389 |
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. Основные правила использования массивов в программах. |
|