Двумерным массивом называется совокупность данных, каждое значение которых зависит от двух чисел, которые можно рассматривать как индекс строки и индекс столбца в матрице.
Формат записи Двумерного массива в языке Паскаль:
<имя>: array [<н_индекс_1>..<в_индекс_1>,
<н_индекс_2>..<в_индекс_2>]
of <тип>;
Для того чтобы использовать элемент массива, надо указать имя массива и индексы элемента. Первый индекс соответствует номеру строки, второй — номеру столбца. Например:
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(100);
Для ввода многомерных массивов, так же как и одномерных, можно использовать генератор случайных чисел, константы и файлы. При описании массивов удобно использовать именованные константы в качестве значений верхних индексов массивов.
Аналогом массивов языка Паскаль в математике являются матрицы. Матрицы, у которых число строк равно числу столбцов, называются квадратными. A(n, n) — квадратная матрица.
Перечислим основные свойства квадратных матриц.
1. Квадратные матрицы имеют главную и побочную диагонали.
Например, для матрицы А на главной диагонали лежат элементы 1, 5 и 9, а на побочной — 3, 5 и 7.
Если:
l i = j — элементы расположены на главное диагонали;
l i > j — элементы расположены ниже главное диагонали;
l i < j — элементы расположены выше главной диагонали;
l i ≥ j — элементы расположены на главной диагонали и ниже;
l i ≤ j — элементы расположены на главной диагонали и выше;
l i + j = n + 1 — элементы расположены на побочной диагонали;
l i + j < n + 1 — элементы расположены над побочной диагональю;
l i + j > n + 1 — элементы расположены под побочной диагональю.
2. Квадратная матрица, у которой все элементы, исключая элементы главной диагонали, равны нулю, называется диагональной матрицей:
3. Диагональная матрица, у которой все элементы, стоящие на главной диагонали равны 1, называется единичной матрицей:
4. Если в матрице А(m, n) поменять местами строки и столбцы, то получится матрица AT(m, n), которая называется транспонированной матрицей:
Над матрицами можно выполнять следующие действия.
l Суммой однотипных матриц A(aij) и B(bij) называют матрицу C(aij + bij) = C(cij), каждый элемент которой равен сумме соответствующих элементов матриц А и В, С = А + В, cij = aij + bij.
l Разностью матриц A(aij) и B(bij) называют матрицу C(aij – bij), каждый элемент которой равен разности соответствующих элементов матриц А и В: C = A – B, cij = aij – bij.
l Произведением матрицы A на некоторое число α называют матрицу А · α, у которой каждый элемент равен Аij · α.
l Произведением двух матриц A(aij) и B(bij) называется такая матрица (число столбцов матрицы А должно равняться числу строк матрицы В), у которой элементы определяются по формуле , где , . То есть нужно перемножить соответствующие элементы i-й строки матрицы А на элементы j-го столбца матрицы В и полученные произведения сложить: .
Приведем типовые алгоритмы обработки матриц на языке Паскаль.
Вывод матрицы в виде таблицы:
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:4);
writeln
end;
Еще один способ:
for i:=1 to n do
for j:=1 to m do
if j<m then write(a[i,j]:4)
else writeln (a[i,j]:4);
Суммирование матриц:
for i:=1 to n do
begin
for j:=1 to m do
c[i,j]:=a[i,j]+b[i,j]
end;
Умножение матриц:
for i:=1 to n do
for j:=1 to n do
begin
s:=0;
for k:=1 to n do
s:=s+a[i,k]*b[k,j];
c[i,j]:=s
end;
При транспонировании матрицы элементы, расположенные на главной диагонали исходной и транспонированной матриц, одни и те же. Иными словами, транспонировать матрицу — значит зеркально отразить ее элементы относительно главной диагонали. Сделать это можно, введя новый массив, например, следующим образом:
for i:=1 to n do
for j:=1 to n do
b[i,j]:=a[j,i];
Очень часто встречаются задачи на повороты матриц. Рассмотрим метод их решения.
Пусть дана квадратная матрица Аnn, состоящая из целых чисел. Повернем ее на 90по часовой стрелке.
Для наглядности используем матрицу А3,3:
Матрица после поворота:
Установим соответствие между элементами матриц A и A'.
Элементу а11 матрицы А соответствует элемент a'31 матрицы A'; элементу а12 матрицы А соответствует элемент a'21 матрицы A'; элементу а13 матрицы А соответствует элемент a'11 матрицы A' и т. д.
Значит отношение матриц A(i, j) и A'(i', j') следующее: i = j', j + i' = n + 1 A'(i', j') = A(n + 1 – j, i).
Теперь можно написать программу для заданной матрицы А33:
const n=3;
var a,b: array [1..n,1..n] of integer;
i,j: integer;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20);
write(a[i,j]:4)
end;
writeln
end;
writeln;
for i:=1 to n do
begin
for j:=1 to n do
begin
b[i,j]:=a[n+1-j,i];
write(b[i,j]:4)
end;
writeln
end;
END.
Приведем другие соотношения матриц при поворотах.
При повороте на 90° против часовой стрелки: j' = i', i + j' = n + 1 A'(i', j') = A(j', n + 1 – i).
При повороте на 180° по часовой стрелке: j + j' = n + 1, i + i' = n + 1 A'(i', j') = A(n + 1 – i, n + 1 – j).
Отобразим элементы матрицы относительно горизонтальной оси симметрии (принцип решения тот же): j = j', i + i' = n + 1 A'(i', j') = A(n + 1 – i, j).
Теперь то же самое, но относительно вертикальной оси симметрии: j + j' = n + 1, i = i' A'(i', j') = A(i, n + 1 – j).
Зеркально отобразим элементы матрицы относительно побочной диагонали: i + j' = n + 1, j + i' = n + 1 A'(i', j') = A(n + 1 – j, n + 1 – i).
Примеры
Пример 6.1. Составить программу, которая осуществляет перестановку одномерного массива без использования дополнительного массива.
Листинг 6.1.
const n=20;
var a: array [1..n] of integer;
i,c: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(30)-4;
write(a[i]:4)
end;
for i:=1 to n div 2 do
begin
c:=a[i];
a[i]:=a[n-i+1];
a[n-i+1]:=c
end;
writeln;
for i:=1 to n do
write(a[i]:4);
writeln
END.
Пример 6.2. Найти сумму всех элементов массива A, больших заданного числа.
Листинг 6.2.
var a: array [1..100] of integer;
i,ch,n,s: integer;
BEGIN
randomize;
write('Введите размер массива -> ');
readln(n);
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4)
end;
writeln;
write('Введите число -> ');
readln(ch);
s:=0;
for i:=1 to n do
if a[i]>ch then s:=s+a[i];
writeln('Сумма элементов, больших числа ',ch,' равна ',s)
END.
Пример 6.3. Заполнить массив, применив для его заполнения следующее значение: .
Листинг 6.3.
const n=10;
var a: array [1..n] of real;
i: integer;
x: real;
BEGIN
write('Введите значение х -> ');
readln(x);
for i:=1 to n do
begin
a[i]:=x*sqr(i)/(i+x);
write(a[i]:8:4)
end;
END.
Пример 6.4. В одномерном массиве целых чисел заменить все элементы, меньшие среднего арифметического, значением среднего арифметического, округленного до целого. Массив заполняется случайным образом.
Листинг 6.4.
const n=10;
var a: array [1..n] of integer;
i,s: integer;
sred: real;
BEGIN
randomize;
s:=0;
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4);
s:=s+a[i];
end;
writeln;
sred:=s/n;
for i:=1 to n do
begin
if a[i]<sred then a[i]:=round(sred);
write(a[i]:4)
end;
writeln
END.
Пример 5. В одномерном массиве целых чисел удалить k-й элемент массива.
Листинг 6.5.
const n=10;
var a: array [1..n] of integer;
i,k: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4)
end;
writeln;
write('Введите номер элемента для удаления
(k < ',n,')->');
readln(k);
for i:=k to n-1 do
a[i]:=a[i+1];
for i:=1 to n-1 do
write(a[i]:4);
writeln
END.
Пример 6.6. В одномерном массиве целых чисел удалить элемент, равный заданному числу, если он есть. Если таких элементов несколько, то удалить последний из найденных.
Листинг 6.6.
const n=10;
var a: array [1..n] of integer;
i,k,kk: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4)
end;
writeln;
write('Введите число ->');
readln(kk);
for i:=1 to n do
if a[i]=kk then k:=i;
for i:=k to n-1 do
a[i]:=a[i+1];
for i:=1 to n-1 do
write(a[i]:4);
writeln
END.
Пример 6.7. Вставить на k-е место массива целых чисел элемент, равный наименьшему элементу массива.
Листинг 6.7.
const n=10;
var a: array [1..n+1] of integer;
i,k,min: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4)
end;
writeln;
min:=a[1];
for i:=2 to n do
if a[i]<a[min] then min:=a[i];
write('Введите значение k (k < ',n,') ->');
readln(k);
for i:=n+1 downto k do
a[i]:=a[i-1];
a[k]:=min;
for i:=1 to n+1 do
write(a[i]:4);
writeln
END.
Пример 6.8. Имеются два одномерных массива целых чисел размера n. Создать из них один одномерный массив, в котором сначала идут отрицательные элементы, затем нулевые и затем положительные.
Решим задачу следующим образом. Соединим два массива в один, а затем упорядочим полученный массив, используя «пузырьковый» метод сортировки.
Листинг 6.8.
const n=10;
var a,b: array [1..n] of integer;
c: array [1..2*n] of integer;
i,j,k: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20)-5;
b[i]:=random(12)
end;
writeln('Массив А');
for i:=1 to n do
write(a[i]:4);
writeln;
writeln('Массив B');
for i:=1 to n do
write(b[i]:4);
writeln;
for i:=1 to n do
c[i]:=a[i];
k:=1;
for i:=n+1 to 2*n do
begin
c[i]:=b[k];
inc(k)
end;
for i:=1 to 2*n-1 do
for j:=1 to 2*n-1 do
if c[j]>c[j+1] then
begin
k:=c[j];
c[j]:=c[j+1];
c[j+1]:=k
end;
writeln('Массив С');
for i:=1 to 2*n do
write(c[i]:4);
writeln
END.
Пример 6.9. Дан массив чисел. Найти, сколько в нем пары одинаковых соседних элементов [6].
Листинг 6.9.
const n=10;
var a: array [1..n] of integer;
i,k: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20)-5;
write(a[i]:4)
end;
writeln;
k:=0;
for i:=1 to n-1 do
if a[i] = a[i+1] then k:=k+1;
writeln('Одинаковых пар соседних элементов
в массиве ',k)
END.
Пример 6.10. Даны три одномерных числовых массива A, B, C. Сформировать массив K такой же длины, элементы которого вычисляются по формуле: [15].
Листинг 6.10.
const n=10;
var a,b,c: array [1..n] of integer;
k: array [1..n] of real;
i: integer;
BEGIN
randomize;
writeln;
writeln('МАССИВ А');
for i:=1 to n do
begin
a[i]:=random(20)-5;
b[i]:=random(30)-2;
c[i]:=random(40);
write(a[i]:4)
end;
writeln;
writeln('МАССИВ В');
for i:=1 to n do
write(b[i]:4);
writeln;
writeln('МАССИВ C');
for i:=1 to n do
write(c[i]:4);
writeln;
writeln('МАССИВ K');
for i:=1 to n do
begin
k[i]:=(a[i]-b[i])/(1+c[i]);
write(k[i]:8:4)
end
END.
Пример 6.11. Даны натуральные числа A1, A2, …, AN (N = 10). Не создавая дополнительные массивы, определить, какой из элементов повторяется в последовательности A1, A2, …, AN наибольшее число раз, и найти его порядковый номер, ближайший к началу последовательности [32].
Листинг 6.11.
const n=10;
var a: array [1..n] of integer;
i,j,max,k,q: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20);
write(a[i]:4)
end;
writeln;
max:=0;
for i:=1 to n-1 do
begin
k:=1;
for j:=i+1 to n do
if a[i]=a[j] then inc(k);
if k>max then
begin
max:=k;
q:=i
end
end;
write(a[q]:6,q:6,max:6);
writeln
END.
Пример 6.12. В заполненном наполовину массиве, не создавая дополнительный массив, продублировать все элементы с сохранением порядка их следования. Например, из массива А (1, 2, 3, …) необходимо получить массив (1, 1, 2, 2, 3, 3) [32].
Листинг 6.12.
const n=5;
var a: array [1..2*n] of integer;
i: integer;
BEGIN
randomize;
for i:=1 to n do
begin
a[i]:=random(20);
write(a[i]:4)
end;
writeln;
i:=2*n;
while (i<=2*n) and (i>=2) do
begin
a[i]:=a[i div 2];
a[i-1]:=a[i];
dec(i,2);
end;
for i:=1 to 2*n do
write(a[i]:4);
writeln
END.
Пример 6.13. Заданы два одномерных массива различных размеров M и N и число K (K < M). Не создавая дополнительный массив, включить второй массив в первый между K-м и (К+1)-м его элементами [32].
Листинг 6.13.
const m=5; n=5;
var a: array [1..m+n] of integer;
b: array [1..n] of integer;
i,k: integer;
BEGIN
randomize;
write('Введите значение k -> ');
readln(k);
for i:=1 to m do
begin
a[i]:=random(20)-2;
write(a[i]:4)
end;
writeln;
for i:=1 to n do
begin
b[i]:=random(15)+4;
write(b[i]:4)
end;
writeln;
for i:=m+n downto (m+n)-(m-k)+1 do
a[i]:=a[i-n];
for i:=1 to n do
a[k+i]:=b[i];
for i:=1 to m+n do
write(a[i]:4);
writeln
END.
Пример 6.14. Сообщество роботов живет по следующим законам: один раз в год они объединяются в группы по 3 или 5 роботов; за год группа из 3 роботов собирает 5, а группа из 5 — 9 новых собратьев; каждый робот живет 3 года после сборки. Известно начальное количество роботов (K > 7), все они только что собраны. Определить, сколько роботов будет через N лет. [13]
Листинг 6.14.
var k,n,i,r: byte;
new: LongInt;
d,q: array [-2..100] of LongInt;
BEGIN
write('Введите начальное кол-во роботов и кол-во лет -> ');
readln(k,n);
write('Всего роботов: ');
if k<3 then
if n in [0,1,2] then write(k) else write ('0')
else
begin
d[-2]:=0; d[-1]:=0; d[0]:=k; q[0]:=k;
for i:=1 to n do
begin
r:=q[i-1] mod 5;
new:=q[i-1] div 5*9+r;
if r in [3,4] then inc(new,5-r);
d[i]:=new;
q[i]:=q[i-1]+new-d[i-3]
end;
write(q[n])
end;
END.
Пример 6.15. Даны натуральные числа А1, …, А10. Предположим, что имеется 10 видов монет достоинством А1, …, А10. Обозначим через N число способов, которыми можно выплатить сумму K этими монетами, то есть N — это число решений уравнения A1X1 + … + A10X10 = K, где Xi может принимать целые неотрицательные значения. Требуется найти N [32].
Листинг 6.15.
label 1;
var a,b,c: array [1..10] of integer;
i,j,n,s,k: integer;
BEGIN
write('Введите сумму -> ');
readln(k);
for i:=1 to 10 do
begin
write('a[',i,'] = ');
readln(a[i])
end;
for i:=1 to 10 do
b[i]:=k div a[i];
n:=0;
for i:=1 to 10 do
c[i]:=0;
1: s:=0;
for i:=1 to 10 do
s:=s+a[i]*c[i];
if s=k then inc(n);
for i:=10 downto 1 do
begin
if c[i]=b[i] then
for j:=i to 10 do
c[j]:=0 else
begin
c[i]:=c[i]+1;
goto 1
end;
end;
writeln('N = ',n);
END.
Пример 6.16. Составить программу для вычисления полинома y = 2x8 – x6 – 4x5 – 5x2 + 6x + 1, используя формулу Горнера [5].
Формула Горнера для полинома n-й степени y = a1xn + a2xn–1 + … + anx + an+1 выглядит следующим образом:
y = (…((a1x + a2)x + a3)x + … + an)x + an+1
Листинг 6.16.
var a: array [1..10] of real;
md,i: integer;
x,y: real;
BEGIN
write('Введите старшую степень полинома
(она не должна быть больше 9) -> ');
readln(md);
writeln('Введите коэффициенты полинома
(начиная с коэффициента при
свободном члене) ');
for i:=1 to md do
read(a[i]);
y:=a[1];
for i:=2 to md do
begin
x:=i;
y:=y*x+a[i]
end;
writeln(y:8:6);
END.
Пример 6.17. Заданный массив А сдвинуть циклически на m элементов вправо [7].
При циклическом сдвиге вправо выталкиваемые элементы с конца массива заполняют освобождающиеся места в начале массива. Например, при сдвиге вправо на 3 разряда массива А (1, 2, 3, 4, 5, 6, 7) получаем массив А (5, 6, 7, 1, 2, 3, 4).
Рассмотрим два варианта. В первом варианте используется дополнительный массив того же размера, что и исходный. Во втором варианте используется дополнительная память только для одного элемента массива.
Листинг 6.17.1.
const n=5;
var a,b: array [1..n] of integer;
i,c,k: integer;
BEGIN
write('На сколько элементов сдвигать вправо? -> ');
readln(c);
for i:=1 to n do
begin
a[i]:=random(20)-3;
write(a[i]:4)
end;
writeln;
for i:=1 to n do
begin
k:=(i+c-1) mod n+1;
b[k]:=a[i]
end;
for i:=1 to n do
write(b[i]:4)
END.
Листинг 6.17.2.
const n=5;
var a: array [1..n] of integer;
i,c,k,j: integer;
BEGIN
write('На сколько сдвигать вправо -> ');
readln(c);
for i:=1 to n do
begin
a[i]:=random(20)-3;
write(a[i]:4)
end;
writeln;
for i:=1 to c do
begin
k:=a[n];
for j:=n downto 2 do
a[j]:=a[j-1];
a[1]:=k
end;
for i:=1 to n do
write(a[i]:4);
END.
Пример 6.18. Билет с шестизначным цифровым номером считается «счастливым», если сумма трех старших цифр совпадает с сумой трех младших цифр. В предположении, что в билетной кассе находится миллион билетов с номерами от 000000 до 999999, надо определить количество потенциально осчастливленных пассажиров [18].
Можно организовать шесть вложенных циклов, в каждом из которых перебирается очередная цифра номера. В самом внутреннем цикле можно проверять суммы старших и младших цифр номера и вести подсчет счастливых билетов, но такая проверка нерациональна. Гораздо меньше операций можно проделать, если подсчитать, сколько раз сумма трех цифр равна 0, 1, 2, …, 27.
Листинг 6.18.
const m=9;
var b: array [0..3*m] of integer;
a1,a2,a3,k: integer;
n: longint;
BEGIN
for a1:=0 to m do
for a2:=0 to m do
for a3:=0 to m do
inc(b[a1+a2+a3]);
for k:=0 to 3*m do
n:=n+b[k]*b[k];
writeln('Количество счастливых билетов = ',n);
END.
В результате получим ответ: 55 252 билета.
Пример 6.19. Дана матрица А5,5, содержащая случайные элементы. Найти сумму всех элементов матрицы [11].
Листинг 6.19.
const n=5;
var a: array [1..n,1..n] of integer;
i,j,s: integer;
BEGIN
randomize;
s:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20);
write(a[i,j]:4);
s:=s+a[i,j]
end;
writeln
end;
writeln('Сумма элементов матрицы = ',s);
END.
Пример 6.20. Дана матрица А5,5, состоящая из случайных чисел. Составить одномерный массив S, в котором будут содержаться значения суммы элементов каждого столбца матрицы [11].
Листинг 6.20.
const n=5;
var a: array [1..n,1..n] of integer;
s: array [1..n] of integer;
i,j,ss: integer;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20);
write(a[i,j]:4);
end;
writeln
end;
for i:=1 to n do
begin
ss:=0;
for j:=1 to n do
ss:=ss+a[j,i];
s[i]:=ss
end;
writeln;
for i:=1 to n do
write(s[i]:4);
writeln;
END.
Пример 6.21. Вывести на экран таблицу Пифагора.
Листинг 6.21.
const n=9;
var a: array[1..n,1..n] of integer;
i,j: integer;
BEGIN
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=i*j;
write(a[i,j]:4)
end;
writeln
end;
END.
Пример 6.22. Найти сумму положительных элементов указанного столбца матрицы А5,5 целых чисел.
Листинг 6.22.
const n=5;
var a: array [1..n,1..n] of integer;
i,j,num,s: integer;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20);
write(a[i,j]:4);
end;
writeln
end;
write('Введите номер столбца для
суммирования -> ');
readln(num);
s:=0;
for i:=1 to n do
if a[i,num]>0 then s:=s+a[i,num];
writeln;
writeln('Сумма элементов в ',i,' столбце = ',s);
writeln
END.
Пример 6.23. Заменить все элементы Двумерного массива А целых чисел, которые меньше среднего арифметического первого столбца, квадратами этих элементов.
Листинг 6.23.
const n=5;
var a: array [1..n,1..n] of integer;
i,j,s: integer;
sr: real;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20);
write(a[i,j]:4);
end;
writeln
end;
s:=0;
for i:=1 to n do
s:=s+a[i,1];
sr:=s/n;
for i:=1 to n do
for j:=1 to n do
if a[i,j]<sr then a[i,j]:=sqr(a[i,j]);
writeln;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:4);
writeln
end;
writeln
END.
Пример 6.24. Дана матрица А5,5, состоящая из латинских букв. Отсортировать каждую строку в алфавитном порядке [6].
Листинг 6.24.
const n=5;
var a: array [1..n,1..n] of char;
i,j,k: integer;
buf: char;
BEGIN
writeln('Введите ',n*n,' букв:');
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
for i:=1 to n do
begin
for k:=1 to n-1 do
for j:= k to n do
if a[i,k]>a[i,j] then
begin
buf:=a[i,k];
a[i,k]:=a[i,j];
a[i,j]:=buf
end;
end;
writeln;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:4);
writeln
end;
writeln
END.
Пример 6.25. Дана матрица А5,5, состоящая из целых чисел. Вывести значения элементов на печать, выполнив обход матрицы по «спирали»:
Листинг 6.25.
const n=5;
var a: array [1..n,1..n] of integer;
i,j,k: integer;
BEGIN
writeln ('ИСХОДНАЯ МАТРИЦА:');
k:=1;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=k;
write(a[i,j]:4);
inc(k)
end;
writeln
end;
writeln;
for k:=1 to (n+1) div 2 do
begin
for j:=k to n-k+1 do
write(a[k,j]:4);
for i:=k+1 to n-k+1 do
write(a[i,n-k+1]:4);
for j:=n-k downto k do
write(a[n-k+1,j]:4);
for i:=n-k downto k+1 do
write(a[i,k]:4);
end;
writeln
END.
Пример 6.26. Даны вещественные числа а1, …, аn и вещественная квадратная матрица порядка n ≥ 6. Получить вещественную матрицу размера n × (n + 1), вставив в исходную матрицу между пятым и шестым столбцами новый столбец с элементами а1, …, аn [13].
Листинг 6.26.
const n=10;
a: array [1..n] of real = (1,2,3,4,5,6,7,8,9,10);
var x: array [1..n,1..n+1] of real;
i: 1..n;
j: 1..n+1;
BEGIN
for i:=1 to n do
begin
for j:=1 to n do
begin
x[i,j]:=i/j;
write(x[i,j]:6:2)
end;
writeln
end;
writeln;
for i:=1 to n do
begin
for j:=n downto 6 do
x[i,j+1]:=x[i,j];
x[i,6]:=a[i]
end;
for i:=1 to n do
begin
for j:=1 to n+1 do
write(x[i,j]:6:2);
writeln
end;
END.
Пример 6.27. Дано вещественное число x. Получить вещественную квадратную матрицу А из 10 строк и 10 столбцов, формируя элементы матрицы Аij по приведенной схеме (середина матрицы заполняется нулями) [32]:
Листинг 6.27.
const n=10;
var a: array [1..n,1..n] of real;
i,j: integer;
x: real;
BEGIN
for i:=2 to n-1 do
for j:=2 to n-1 do
a[i,j]:=0;
write('Введите значение x -> ');
readln(x);
a[1,1]:=1;
a[n,n]:=1;
for i:=2 to n do
begin
a[i,1]:=a[i-1,1]*x;
a[1,i]:=a[i,1];
a[11-i,10]:=a[i,1];
a[10,11-i]:=a[i,1]
end;
writeln('Полученная матрица:');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:6:2);
writeln
end;
END.
Пример 6.28. Дана целочисленная квадратная матрица А размером 8 × 8. Получить целочисленную одномерную последовательность В1, В2, …, В64, элементами которой являются числа, полученные из квадратной матрицы по схеме: В1 = А11, В2 = А21, …, В64 = А18 [32].
Листинг 6.28.
const n=8;
var a: array [1..n,1..n] of integer;
b: array [1..n*n] of integer;
i,j,k: integer;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20)-3;
write(a[i,j]:4)
end;
writeln
end;
k:=0;
for j:=1 to n do
if j div 2 = j/2 then
for i:= n downto 1 do
begin
inc(k);
b[k]:=a[i,j]
end;
else
for i:=1 to n do
begin
inc(k);
b[k]:=a[i,j]
end;
writeln('Полученный одномерный массив');
for i:=1 to n*n do
write(b[i]:4);
END.
Пример 6.29. Элемент матрицы называется седловой точкой, если он является одновременно наименьшим в своей строке и наибольшим в своем столбце. Дана матрица целых чисел размером N × M (N и M заданы). Выяснить, имеются ли седловые точки в этой матрице и, если имеются, указать индекс одной из них [32].
Листинг 6.29.
const n=10; m=10;
var a: array [1..n,1..m] of integer;
i,j,l,k: integer;
min,max,c,p: real;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(30)-3;
write(a[i,j]:3)
end;
writeln
end;
for i:=1 to n do
begin
min:=a[i,1];
for j:=1 to m do
if a[i,j] <= min then
begin
min:=a[i,j];
k:=j
end;
max:=a[1,k];
for l:=1 to n do
if a[l,k]>=max then max:=a[l,k];
if max=min then
begin
writeln('Строка — ',i,' Столбец — ',k);
break;
goto 1
end
end;
writeln('Таких точек не существует!');
1: END.
Пример 6.30. Образовать два одномерных массива путем перезаписи в них элементов из заданного целочисленного Двумерного массива размером N × N, при этом в один из формируемых массивов переписать все элементы, стоящие выше главной диагонали, а другой — ниже главной диагонали, в порядке.
Решение задачи заключается в нахождении алгоритма считывания элементов по указанным на рисунке направлениям. Весь процесс «прохождения» матрицы реализован в 3-х циклах.
Листинг 6.30.
label 1,2;
const n=10;
var a: array [1..n,1..n] of integer;
b,c: array [1..28] of integer;
i,j,d,l,w: integer;
k: real;
BEGIN
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(20)-3;
write(a[i,j]:3)
end;
writeln
end;
k:=(n*n-n)/2; w:=1; i:=1;
1: for j:=w to n-2*w+1 do
begin
b[i]:=a[j,j+w];
c[i]:=a[j+w,j];
if i=k then
begin
break;
goto 2
end;
inc(i)
end;
for d:=n-2*w downto w do
begin
b[i]:=a[d,n-w+1];
c[i]:=a[n-w+1,d];
if i=k then
begin
break;
goto 2
end;
inc(i)
end;
for l:=n-w downto 2*w+1 do
begin
b[i]:=a[w,l];
c[i]:=a[l,w];
if i=k then
begin
break;
goto 2
end;
inc(i)
end;
inc(w);
goto 1;
2: writeln('Массив В:');
for i:=1 to trunc(k) do
write(b[i]:4);
writeln;
writeln('Массив C:');
for i:=1 to trunc(k) do
write(c[i]:4)
END.
Пример 6.31. На квадратном клетчатом листе бумаги размером 100 × 100 клеток нарисовано несколько прямоугольников. Каждый прямоугольник состоит из целых клеток, различные прямоугольники не накладываются друг на друга и не соприкасаются. Надо сосчитать число нарисованных прямоугольников.
Для решения используем массив размером 100 на 100, в котором А[i, j] = 1, если клетка [i, j] принадлежит какому-либо прямоугольнику, и А[i, j] = 0 — в противном случае.