- •Глава 6. Структурированные типы данных
- •6.1. Массивы
- •6.1.1. Одномерные массивы
- •6.1.2. Многомерные массивы
- •6.2. Сортировка массивов
- •6.2.1. Алгоритм сортировки выбором элемента
- •6.2.2. Алгоритм сортировки обменами (алгоритм “пузырька”)
- •6.2.3. Усовершенствованная "пузырьковая" сортировка
- •6.2.5. Алгоритм сортировки вставками
- •6.2.4. «Шейкер» - сортировка
6.1.2. Многомерные массивы
В Паскале можно определять массивы различной размерности.
В зависимости от того, как мы будем трактовать реальный объект – матрицу, мы будем использовать различные формы описания двумерного массива.
Матрица рассматривается как двумерная таблица.
Пусть t1 – тип индекса 1, t2 – тип индекса 2, t3 – тип компонента.
Формат записи двумерного массива (матрицы).
a) type
<имя типа> = array [t1, t2] of t3;
var
<имя массива> : <имя типа>;
b) var
<имя массива> : array [t1, t2] of t3;
Матрица рассматривается как вектор, элементы которого – векторы.
A=((a11, a12, ..., a1m), (a21, a22, ..., a2m), ..., (an1, an2, ..., anm))
Для удобства введем обозначения: М и М1 – имена типов, А – имя двумерного массива, В – имя одномерного массива.
Формат записи двумерного массива (как вектора).
1) type
M = array [t1] of array [t2] of t3;
var A : M;
или
var A : array [t1] of array [t2] of t3;
2) type
M1 = array [t2] of t3;
M = array [t1] of M1;
var A : M; B : М1;
Последнее описание дает большое удобство в работе. Мы можем обрабатывать матрицу, вызывая ее строки.
Второй вариант:
type
M1 = array [t2] of t3;
var
A : array [t1] of М1;
В : M1;
Пример. Опишем матрицу, состоящую из трех строк и четырех столбцов. Элементами матрицы являются целые числа.
1 способ:
type
mas = array [1..3, 1..4] of integer;
var M1 : mas;
2 способ:
1) type
mas = array [1..3] of array [1..4] of integer;
var M1 : mas;
2) type
mas = array [1..4] of integer;
matr = array [1..3] of mas;
var M1 : matr;
Пример. Описать матрицу, строки которой имеют названия: red, black, green, white, а столбцы – номера 1, 2, 3. Элементами матрицы являются целые числа.
type
color = (red, black, green, white);
massiv = array [color, 1..3] of integer;
var
M2 : massiv;
Каждый элемент двумерного массива обозначается именем массива, а в квадратных скобках указывается список индексов через запятую. Например, M1[1, 2], M1[2, 4], M1[3, 3], M2[red, 1], M2[green, 2].
При задании двумерных типизированных констант типа массив компоненты каждой строки заключаются в дополнительные круглые скобки, строки отделяются запятыми, например:
const
matr : array [1..3, 1..4] of byte = ((1,0,1,4), (2,0,3,23), (12,213,200,14));
Задача 1. Сформировать матрицу X(5 х 5), вычисляя ее элементы по формуле X(i, j) = 100i + j.
program MATRICA_1;
type mas = array [1..5, 1..5] of integer;
var X : mas; i, j : integer;
begin
for i :=1 to 5 do
begin
for j :=1 to 5 do
begin X[i, j]:= 100*i + j;
Write(X[i, j]:6)
end;
Writeln
end
end.
Задача 2. Дан двумерный массив размерностью n*n целых чисел. Сформировать двумерный массив, каждый элемент первой строки которого равен количеству отрицательных чисел, а каждый элемент второй строки равен количеству положительных чисел в соответствующем столбце.
Program matrica_2;
uses crt;
const n=8;
var a:array[1..n,1..n] of integer;
b:array[1..2,1..n] of byte;
i,j,k,l:byte;
begin
clrscr;
randomize;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(50)-20;
for j:=1 to n do
begin k:=0; l:=0;
for i:=1 to n do
begin
if a[i,j]<0 then k:=k+1;
if a[i,j]>0 then l:=l+1;
end;
b[1,j]:=k; b[2,j]:=l;
end;
writeln(' ':10,'matrica A');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;writeln;
writeln(' ':10,'matrica b');writeln;
for i:=1 to 2 do
begin
for j:=1 to n do
write(b[i,j]:5);
writeln;
end;
end.
Задача 3. Дана матрица mn целых чисел. В каждой строке обязательно есть отрицательные и неотрицательные числа. Получить новую матрицу, состоящую из трех столбцов: 1-й столбец состоит из первых отрицательных чисел каждой строки; 2-й столбец - из первых неотрицательных чисел каждой строки; 3-й столбец - из суммы элементов первых двух столбцов.
program MATRICA_3;
uses crt;
const m=4; n=3;
type mas=array[1..m,1..n] of integer;
var i,j:integer; A,B:mas;
begin clrscr;
Writeln('Vvedite elem matr');
for i:=1 to m do
begin Write(i,' stroka:');
for j:=1 to n do
Read(A[i,j]);
Writeln
end;
for i:=1 to m do
begin j:=1;
while A[i,j]>=0 do j:=j+1; {ищем первое отрицательное число}
B[i,1]:=A[i,j]; j:=1;
while A[i,j]<0 do j:=j+1; {ищем первое неотрицательное число}
B[i,2]:=A[i,j];
B[i,3]:=B[i,1]+B[i,2];
end;
for i:=1 to m do
begin for j:=1 to n do
Write(B[i,j],'':3);
Writeln
end
end.
Задача 4. Заполнить массив А размерностью n*n следующим образом:
1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9
0 0 1 2 3 4 5 6 7 8
0 0 0 1 2 3 4 5 6 7
0 0 0 0 1 2 3 4 5 6
0 0 0 0 0 1 2 3 4 5
0 0 0 0 0 0 1 2 3 4
0 0 0 0 0 0 0 1 2 3
0 0 0 0 0 0 0 0 1 2
0 0 0 0 0 0 0 0 0 1
Program matrica_4;
uses crt;
const n=10;
type matr=array[1..n,1..n] of integer;
var a:matr;
i,j,k:byte;
begin
clrscr;
for i:=1 to n do
begin k:=1;
for j:=1 to n do
if j<i then a[i,j]:=0
else begin a[i,j]:=k;k:=k+1 end;
end;
writeln(' ':10,'matrice A');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln;
end;
end.
Задача 5. Заполнить массив А размерностью n*n следующим образом:
1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
17 18 19 20 21 22 23 24
32 31 30 29 28 27 26 25
33 34 35 36 37 38 39 40
48 47 46 45 44 43 42 41 (змейкой).
Program matrica_5;
uses crt;
const n=10;m=8;
type matr=array[1..n,1..m] of integer;
var a:matr;
i,j:byte;
begin
clrscr;
for i:=1 to n do
for j:=1 to m do
if i mod 2=1 then a[i,j]:=(i-1)*m+j
else a[i,j]:=i*m-j+1;
Writeln(' Полученная матрица');writeln;
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln;
end;
end.
Задача 6. Дан двумерный массив А размерностью n*m. Подсчитать количество столбцов массива А, содержащих хотя бы один нуль.
Program matrica_6;
uses crt;
const n=4;m=7;
type matr=array[1..n,1..m] of integer;
var
a:matr;
i,j,k:byte;
bol:boolean;
begin
clrscr;
{ Ввод матрицы А}
randomize;
for i:=1 to n do
begin writeln('Введите ',m,' элементов ', i,' –ой строки ');
for j:=1 to m do
Read(a[i,j]);
end;
clrscr;
writeln(' Данная матрица А');writeln;
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:4);
writeln;
end;
k:=0;
for j:=1 to m do
begin
bol:=true; i:=1;
while (i<=n) and (bol) do
begin
if a[i,j]=0 then begin k:=k+1; bol:=false end;
i:=i+1;
end;
end;
writeln;
writeln('Количество столбцов, содержащих хотя бы один нуль k=',k)
end.
Задача 7. Матрица А, симметричная относительно побочной диагонали, задана верхним треугольником. Восстановить исходную квадратную матрицу и напечатать ее по строкам.
Program matrica_7;
uses crt;
const n=8;
type matr=array[1..n,1..n] of integer;
var a:matr;
i,j,k:byte;
begin
clrscr;
randomize;
for i:=1 to n do
for j:=1 to n-i+1 do
a[i,j]:=random(50)-20;
writeln;
writeln(' Матрица А (верхний треугольник)');
for i:=1 to n do
begin
for j:=1 to n-i+1 do
write(a[i,j]:4);
writeln;
end;
for i:=1 to n do
for j:=n downto n-i+2 do
a[i,j]:=a[n-j+1,n-i+1];
writeln;writeln(' Полученная Матрица А');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
end.
Задача 8. Дан двумерный массив А размерностью n*m.Удалить столбец и строку, на пересечении которых находится первый максимальный элемент матрицы А.
Program matrica_8;
uses crt;
const n=6;m=7;
type matr=array[1..n,1..m] of integer;
var a:matr;
i,j,k,d:byte;
{процедура нахождения максимального элемента}
procedure max_element (var b:matr; var k1,d1: byte);
var max:integer;
i,j:byte;
begin
max:=b[1,1]; k1:=1; d1:=1;
for i:=1 to n do
for j:=1 to m do
if max<b[i,j] then begin max:=b[i,j]; k1:=i; d1:=j; end;
end;
begin {основная программа}
clrscr;
randomize;
for i:=1 to n do
for j:=1 to m do
a[i,j]:=random(50)-20;
writeln('Матрица А');
writeln;
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:5);
writeln;
end; writeln;
max_element(a,k,d);
writeln('k=',k,' d=',d);
writeln('max=',max);
writeln;
for j:=d to m do
for i:=1 to n do
a[i,j]:=a[i,j+1];
for i:= k to n do
for j:=1 to m do
a[i,j]:=a[i+1,j];
end;
writeln;
writeln('Преобразованная матрица А');
for i:=1 to n-1 do
begin
for j:=1 to m-1 do
write(a[i,j]:5);
writeln;
end;
end.
Задача 9. Дан двумерный массив А размерностью n*m.Вставить в матрицу А строку состоящую из 1 перед первой строкой, содержащей хотя бы один нуль.
Program matrica_9;
uses crt;
const n=8;
type matr=array[1..n+1,1..n] of integer;
var a:matr;
i,j,k:byte;
bol:boolean;
procedure insert(k1:integer;var b:matr);
var i,j:byte;
begin
for i:=n downto k1 do
for j:=1 to n do
b[i+1,j]:=b[i,j];
for j:=1 to n do
b[k1,j]:=1;
end;
begin
clrscr;
randomize;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(50)-30;
bol:=true;i:=1;k:=0;
while (i<=n) and (bol) do
begin
j:=1;
while (j<=n) and (bol) do
if a[i,j]=0 then begin bol:=false; k:=i; end else j:=j+1;
i:=i+1;
end;
writeln('k=',k);
writeln(' ':10,'matrica A');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;writeln;
insert(k,a);
writeln(' ':10,'matrica A');
for i:=1 to n+1 do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;writeln;
end.
Задачи для самостоятельного решения
1. Заполнить двухмерный массив размером 9 9 результатами таблицы умножения (в первой строке должны быть записаны произведения каждого из чисел от1 до 9 на 1, во второй – на 2, …, в последней – на 9).
2. Заполнить двухмерный массив размером n n единицами и нулями таким образом, чтобы единицы размещались так, как размещаются на шахматной доске черные поля, а нули – как белые поля. Левое нижнее поле на шахматной доске всегда черное. Задачу решить при четном и нечетном значении n.
3. Заполнить элементы квадратной матрицы так, что все элементы на главной диагонали равны единице. Все другие элементы – нули.
4. По заданному n постройте матрицы размером (n,n) вида
а) 1 0 ... 0 0 1 ... 0 . . . . 0 0 ... 1 |
б) n n-1 n-2 ... 1 0 n n-1 ... 2 . . . . . 0 0 0 ... n |
в) 0 0 ... 0 1 0 0 ... 1 2 . . . . . 1 2 ... n-1 n |
5. Дана квадратная матрица целых чисел. Определить количество:
а) положительных элементов матрицы;
б) отрицательных элементов матрицы;
в) нулевых элементов матрицы;
г) максимальный элемент матрицы;
д) минимальный элемент матрицы;
6. Дан двухмерный массив целых чисел. Выяснить, имеется ли в нем положительный элемент.
7. Определить, имеются ли в двухмерном массиве два одинаковых элемента.
8. Дана матрица A(N, M). Найдите её наибольший элемент и номера строки и столбца, на пересечении которых он находится.
9. Дана квадратная матрица целых чисел. Найти максимальное отрицательное значение среди элементов, которые находятся над главной диагональю матрицы.
10. Для заданной целочисленной матрицы A(N, M) определите, является ли сумма её элементов чётным числом, и выведите на печать соответствующий текст.
11. Дана матрица A(N, M). Найдите количество элементов этой матрицы, больших среднего арифметического всех её элементов.
12. Дана целочисленная матрица A(N, M). Вычислите сумму и произведение тех её элементов, которые при делении на два дают нечётное число.
13. В заданной матрице A(N, M) поменяйте местами столбцы с номерами P и Q.
14. Дана матрица A(N, M). Вычислите вектор X(M), где значение Xj равно сумме положительных элементов j-го столбца матрицы A.
15. Дана матрица A(N, M). Получите вектор X(M), равный P-й строке матрицы, и вектор Y(N), равный Q-му столбцу матрицы.
16. Дана матрица A(N, M). Поменяйте местами её наибольший и наименьший элементы.
17. Из заданной матрицы A(N, M) удалите строку с номером K и столбцы с номерами P и Q.
18. В заданном массиве A(N, N) вычислите две суммы элементов, расположенных выше и ниже побочной диагонали.
19. Проверить, является ли заданная целочисленная матрица A(N, N) "магическим квадратом" (это значит, что суммы чисел во всех её строках, всех столбцах и двух диагоналях одинаковы).
20. Дано натуральное число i. Дана прямоугольная матрица целых чисел. Размер матрицы M*N. Удалить из матрицы строку (M-i) и столбец (N-i).
21. Дана квадратная матрица целых чисел. Удалить каждую вторую строку матрицы (все строки с четными номерами).
22. Дана квадратная матрица целых чисел. Удалить все строки матрицы, которые состоят из одних нулей.
23. Дана квадратная матрица целых чисел. Удалить все строки матрицы, в которых сумма элементов меньше нуля.
24. Дана квадратная матрица целых чисел. Удалить все столбцы матрицы, в которых все элементы равны нулю.
25. Дана квадратная матрица целых чисел. Удалить все столбцы матрицы, в которых есть хотя бы одна единица.
