Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6.doc
Скачиваний:
9
Добавлен:
01.05.2025
Размер:
220 Кб
Скачать
☆

6.1.2. Многомерные массивы

В Паскале можно определять массивы различной размерности.

В зависимости от того, как мы будем трактовать реальный объект – матрицу, мы будем использовать различные формы описания двумерного массива.

  1. Матрица рассматривается как двумерная таблица.

Пусть t1 – тип индекса 1, t2 – тип индекса 2, t3 – тип компонента.

Формат записи двумерного массива (матрицы).

a) type

<имя типа> = array [t1, t2] of t3;

var

<имя массива> : <имя типа>;

b) var

<имя массива> : array [t1, t2] of t3;

  1. Матрица рассматривается как вектор, элементы которого – векторы.

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. Дана матрица mn целых чисел. В каждой строке обязательно есть отрицательные и неотрицательные числа. Получить новую матрицу, состоящую из трех столбцов: 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. Дана квадратная матрица целых чисел. Удалить все столбцы матрицы, в которых есть хотя бы одна единица.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]