Транспонированной матрицей называется матрица, у которой столбцы соответствуют строкам исходной квадратной матрицы. При этом элементы главной диагонали исходной и транспонированной матриц, одни и те же.
Операция транспонирования сводится к обмену элементов матрицы, расположенных симметрично главной диагонали.
Исходная матрица
Транспонированная матрица
Фрагмент программы транспонирования матрицы:
for i:=1 to n do {Просмотр всех строк матрицы}
for j:=i+1 to n do {Просмотр всех элементов в строке, расположенных выше главной диагонали}
begin
k:=a[i,j];
a[i,j]:= a[j,i];
a[j,i]:= k;
end;
Контрольные вопросы:
1. Какие из приведенных описаний одномерных массивов являются неправильными и почему:
а) var dim:array[-1..1] of real;
б) type mas=array[char] of char;
var beta:mas;
в) type massiv=array['A'..'D'];
var a,b:massiv;
г) var vector:array[integer] of char;
д) var mm:array[false..true] of char;
е) type ss=array[-20..0] of integer;
var mas=ss;
ж) type tr=array[1..n,1..m] of real;
var x,y,z:tr;
з) var k:integer;
pak:array[1..k] of integer;
2. Может ли типом индекса массива быть тип integer или real?
3. Дано:
const n=101;
var a:array[1..n] of real;
a) напишите операторы для ввода элементов в массив а;
б) напишите операторы для заполнения массива а случайными числами в интервале от -16 до 73;
в) напишите операторы для вывода элементов массива а в строку, разделяя их двумя пробелами;
г) напишите операторы для вывода элементов массива а в строку, разделяя их таким количеством пробелов, каков порядковый номер выводимого элемента;
д) напишите операторы вывода элементов массива в обратном порядке по n чисел в строке.
4. Чем одномерный массив отличается от двумерного?
5. Почему массивы называются структурами данных с прямым доступом?
6. Приведите примеры программ, где прямой доступ необходим.
7. Установите, какая задача решается в предложенном фрагменте программы. Назовите все операторы и типы данных, использованные в нем, расскажите как они работают:
const n=10;
var u,v,w:array [1..n] of integer;
j,k,t:integer;
begin k:=0;
for j:=n downto 1 do
begin t:=u[j]-v[j]+k;
w[j]:=t mod 10;
k:=t div 10;
end;
end.
8. Задан массив . Установите, каким будет значение С после выполнения операторов:
for i:=1 to 3 do
for j:=1 to 3 do
C[i,j] := A[A[i,j],A[j,i]].
Существенен ли порядок, в котором выбираются значения индексов i и j?
9. Установите, какая задача решается в предложенном фрагменте программы. Назовите все операторы и типы данных, использованные в нем, расскажите как они работают:
for i:=p to q-(p-q+1) div 2 do
begin r:=a[i];
a[i]:=a[q-i+p];
a[q-i+p]:=r
end.
10. Установите, какая задача решается в предложенном фрагменте программы. Назовите все операторы и типы данных, использованные в нем, расскажите как они работают:
for i:=1 to n do
for j:=1 to n do
a[i,j]:=(i div j) * (j div i).
11. Установите, какая задача решается в предложенном фрагменте программы. Назовите все операторы и типы данных, использованные в нем, расскажите как они работают:
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j]
then begin r:=a[i];
a[i]:=a[j];
a[j]:=r
end.
12. Какую задачу решает предложенный фрагмент алгоритма? Определите значение массива А после выполнения следующих операторов при N=3 и :
for i:=1 to n-1 do
for j:=i+1 to n do
begin r:=a[i,j];
a[i,j]:=a[j,i];
a[j,i]:=r
end.
13. Какую задачу решает предложенный фрагмент программы? Определите значение массива C после выполнения следующих операторов при N=3, M=2 и :
for j:=1 to m do
begin s:=0;
for i:=1 to n do s:=s+a[i,j];
c[j]:=s
end.
14. Какую задачу решает предложенный фрагмент программы? Определите значение массива C после выполнения следующих операторов для заданных массивов и :
for i:=1 to n do
for j:=1 to n do
if a[i,j]=b[i,j]
then c[i,j]:=1
else c[i,j]:=0.
15. Какую задачу решает предложенный фрагмент программы? Определите значение массива A после выполнения следующих операторов при N=8, K=2 и А=(4, -3, 5, -2, 3, 10, 9, 0):
n:=n-1;
for i:=k to n do a[i]:=a[i+1].
16. Какую задачу решает предложенный фрагмент программы? Определите значение массива A после выполнения следующих операторов при M=3, N=5, D=6 и А=(5, 2, -8, 1, -3):
i:=m;
while i<=n-1 do
begin a[i]:=a[i+1];
i:=i+1
end;
a[n]:=d.
17. Какую задачу решает предложенный фрагмент программы? Определите значение массива B после выполнения следующих операторов при N=7 и А=(1, 6, 7, 3, -2, 8, 9):
for i:=1 to n do b[i]:=a[n-i+1].
18. Какую задачу решает предложенный фрагмент программы? Определите значение массива P после выполнения следующих операторов при M=3, N=3 и :
for i:=1 to n do
begin p[i]:=0;
for j:=1 to m do
if a[i,j]=5
then p[i]:=p[i]+1
end.
19. Какую задачу решает предложенный фрагмент программы? Определите значение массива C после выполнения следующих операторов при M=9 и C=(4, 5, 3, 2, 2, 3, 5, 8, 7):
k:=trunc(m/2);
for i:=1 to k do
begin q:=c[i];
c[i]:=c[m-i+1];
c[m-i+1]:=q
end.
20. Какую задачу решает предложенный фрагмент программы? Определите значение массива A после выполнения следующих операторов при N=8, K=3 и А=(3, -1, 9, -3, 4, 12, 3, 7):
n:=n-1;
for i:=k to n do a[i]:=a[i+1].
21. Какую задачу решает предложенный фрагмент программы? Определите значение массива S после выполнения следующих операторов при N=5 и :
for i:=1 to n do s[i]:=a[i,i].
22. Какую задачу решает предложенный фрагмент программы? Определите значение переменной S после выполнения следующих операторов при N=6, T=5 и А=(-4, 0, 3, 9, 5, 2):
s:=0;
k:=0;
for i:=1 to n do
if a[i]>t
then begin s:=s+a[i];
k:=k+1
end;
if k>0 then s:=s/k.
23. Какую задачу решает предложенный фрагмент программы? Определите значение массива C после выполнения следующих операторов для заданных массивов N=3, и :
for i:=1 to n do
for j:=1 to n do
if a[i,j]>b[i,j]
then c[i,j]:=a[i,j]-b[i,j]
else c[i,j]:=b[i,j]-a[i,j].
24. Сформулируйте задачу, решаемую в предложенном фрагменте программы, где a[i,j] – элемент массива размерности . Определите значение массива А при N=4, M=5, K=3, :
for i:=1 to n do
for j:=k to m-1 do a[i,j]:=a[i,j+1].
25. Задан одномерный массив А=(7, 5, 4, 6, 3, 2, 1). Какое значение будет выведено в результате выполнения программы:
var a:array[1..7] of integer;
i,j,k,c:integer;
begin write('Введите семь элементов массива ');
for k:=1 to 7 do read(a[k]);
i:=3; c:=0;
for k:=1 to 100 do
begin j:=a[i]; a[i]:=i; i:=j; c:=c+i end;
write(c)
end.
26. Какое значение будет выведено в результате выполнения программы:
var i,k,k1,c : longint;
begin k:=3; k1:=1; c:=80;
for i:=64 to 174 do
begin k1:=-k1; k:=k+k1; c:=c+k*i end;
write(c)
end.
Задачи
1. Найти сумму всех элементов некоторого двумерного массива и сравнить их с произведением элементов некоторой строки.
program zadacha_1;
uses crt;
var
a: array[1..50,1..50] of integer; {массив}
i,j: integer; {переменные счетчики}
n,m: integer; {количество строк и столбцов массива}
s: integer; {сумма элементов массива}
p: integer; {произведение элементов некоторой строки}
q: integer; {некоторая строка}
begin
clrscr;
write('Введите количество строк: ');
readln(n);
write('Введите количество столбцов: ');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Матрица:');
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:3);
end;
readln;
end;
for i:=1 to n do
for j:=1 to m do
begin
s:=s+a[i,j];
end;
write('Введите номер строки для работы: ');
readln(q);
p:=1;
for j:=1 to m do
begin
p:=p*a[q,j];
end;
writeln('Сумма элементов матрицы: ',s);
writeln('Произведение элементов строки ',q,' равна ',p);
if s>p then
begin
writeln('Сумма больше произведения');
end
else
begin
writeln('Произведение больше произведения');
end;
readln;
end.
2. Поменять второй столбец матрицы с предпоследним.
program zadacha_2;
uses crt;
var
a: array [1..50,1..50] of integer;
b: array [1..50,1..50] of integer;
m,n,i,j: integer;
begin
clrscr;
writeln('Количество строк');
readln(n);
writeln('Количество столбцов');
readln(m);
for i:= 1 to n do
for j:= 1 to m do
begin
write ('a[',i,',',j,']=');
readln (a[i,j]);
end;
writeln('Исходная матрица:');
for i:=1 to n do begin
for j:=1 to m do
write (a[i,j]);
writeln;
end;
for i:=1 to n do begin
for j:=1 to m do
b[i,j]:=a[i,j];
end;
for i:=1 to n do begin
a[i,2]:=b[i,m-1];
end;
for i:=1 to n do begin
a[i,m-1]:=b[i,2];
end;
writeln('Полученная матрица:');
for i:=1 to n do begin
for j:=1 to m do
write (a[i,j]);
writeln;
end;
readln;
end.
3. Дана матрица размерности m*n. Расположить элементы последнего столбца по убыванию.
program zadacha_3;
uses crt;
var
a:array [1..50] of integer;
b:array [1..50] of integer;
k,i,m,j,n,r,l:integer;
begin
clrscr;
write('Введите количество строк');
readln(n);
write('Введите количество столбцов');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,']={b[',j,']=}');
readln(a[i]);
end;
for i:=1 to n-1 do
for k:=i+1 to n do
{for j:=1 to m do}
if a[k]>a[i] then
begin
r:=a[i];
a[i]:=a[k];
a[k]:=r;
end;
writeln('Отсортированый массив:');
for i:=1 to n do
writeln(a[i]:4);
readln;
end.
Дана квадратная матрица. Транспонировать её. Посчитать сумму всех нечётных элементов транспонированной матрицы.
program zadacha_4;
uses crt;
var
a:array [1..5,1..5] of integer;
S,i,j,n,c:integer;
begin
clrscr;
write ('введите кол-во строк и столбцов ');
readln (n);
for i:=1 to n do
for j:=1 to n do
begin
write ('a[',i,',',j,']=');
readln (a[i,j]);
end;
for i:=1 to n do
for j:=i+1 to n do
begin
c:=a[i,j];
a[i,j]:=a[j,i];
a[j,i]:=c;
end;
S:=0;
for j:=1 to n do
for i:=1 to n do
begin
if a[j,i] mod 2 <>0 then
begin
S:=S+a[j,i];
end;
end;
writeln ('S=',S);
readln;
end.
4. Дан двумерный массив. Посчитать сумму его двух столбцов, вывести большую сумму.
program zadacha_5
uses crt;
var
a:array[1..3,1..3] of integer;
i,j,m,n,s,s1,p,p1,max,p3:integer;
begin
clrscr;
write('введите количество строк');
readln(n);
write('введите количество столбцов');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
begin
write('введите номер столбца');
readln(p);
for i:=1 to n do
for j:=1 to m do
if j=p then s:=s+a[i,p];
write('s=',s);
readln;
end;
s1:=0;
begin
write('введите номер другого столбца');
readln(p1);
for i:=1 to n do
for j:=1 to m do
if j=p1 then s1:=s1+a[i,p1];
write ('s1=', s1);
readln;
end;
begin
max:=s;
if s < s1 then
begin
max:=s1;
write('максимальная сумма',max);
readln;
write('вывести на экран номер столбца большей суммы', p3);
readln(p3);
end;
end;
end.
end.
5. Дана вещественная матрица размерности n*m. Удалить k столбец матрицы.
program zadacha_5;
uses crt;
var
a: array [1..100,1..100] of real;
b: array [1..100,1..100] of real;
i,j: integer; {переменные счётчики}
n,m: integer; {количество строк и столбцов в массиве}
k: integer; {№ строки которую необходимо удалить}
begin
clrscr;
write ('Введите количество строк в массиве');
readln (n);
write ('введите количество столбцов в массиве');
readln (m);
write ('Введите № строки которую надо удалить');
readln (k);
randomize; {ввод массива случайных чисел}
for i:=1 to n do
for j:=1 to m do
begin
a[i,j]:=random(100);
end;
for i:=1 to n do
for j:=1 to m do
begin
writeln ('a[',i,',',j,']=',a[i,j]);
end;
writeln ('Новый массив');
for i:=1 to n do
for j:=1 to m do
begin
if j<>k then
{Проверка условия № столбца
неравен № столбца,
который необходимоудалить}
begin
b[i,j]:=a[i,j];
{если да, то новому массиву
присваиваем проверяемый элемент }
end;
end;
for i:=1 to n do {вывод нового массива}
for j:=1 to m do
writeln ('b[',i,',',j,']=',b[i,j]);
readln;
end.
6. Дана вещественная матрица размерности n*m. Вывести номера столбцов, содержащих только отрицательные элементы.
program zadacha_10;
uses crt;
var
a: array[1..50,1..50] of real;
i,j: integer;
n,m: integer;
begin
clrscr;
write('введите кол-во строк ');
readln(n);
write('введите кол-во столбцов ');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']= ');
readln(a[i,j]);
end;
for j:=1 to m do
begin
if a[i,j]<0 then
begin
writeln('номер столбца, в котором все элементы отрицательные= ',J);
readln;
end
else
begin
writeln ('в столбце ',J,' нет отрицательных или не
все отрицательные элементы ');
end;
end;
readln;
end.
11.В двумерном массиве найти минимальное число и определить в какой строке и каком столбце он находится.
program zadacha_11;
uses crt;
var
a:array [1..50,1..50] of integer; {описание масива}
элементу предпоследний, предпоследнему второй и тд.}
end;
writeln ('Матрица развёрнута на 90?.');
for i:=1 to n do
for j:=1 to n do
begin
c[i,j]:=b[j,i]; {третьей матрице присваиваем
элементы промежуточной по закону: первая строка
становится первым столбцом и тд. }
writeln ('c[',i,',',j,']=',c[i,j]); {печать массива развёрнутого на 90?}
readln;
end;
end.
13.Заменить положительные элементы прямоугольной вещественной таблицы их целыми частями, а отрицательные - их модулями.
program zadacha_13;
uses crt;
var
a:array[1..50,1..100] of real;
i,j,n,m:integer;
begin
clrscr;
write('Введите кол-во строк');
readln(n);
write('Введите кол-во столбцов');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
for j:=1 to m do
begin
if a[i,j]>0 then a[i,j]:=int(a[i,j]);
if a[i,j]<0 then a[i,j]:=abs(a[i,j]);
writeln ('a[',i,j,']=',a[i,j]:3:2);
readln;
end;
end.
14.Дана вещественная квадратная матрица размерности n. Поменять местами элементы главной и побочной диагоналей матрицы по столбца
program zadacha_14;
uses crt;
var
a:array [1..50,1..100] of integer;
i,j,n,t,k:integer;
begin
clrscr;
write('введите кол-во строк и столбцов');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for i:=1 to n do
for j:=1 to n do
begin
if i=j then
begin
k:=a[i,j];
a[i,j]:=a[i,n+1-j];
a[i,n+1-j]:=k;
end;
end;
for i:=1 to n do
begin
for j:=1 to n do
writeln(a[i,j]:4);
writeln;
end;
readln;
end.
15.Дана вещественная матрица размерности m*n. Определить индексы первого нулевого элемента матрицы. Обход делать по столбцам.
program zadacha_15;
uses crt;
var
a: array [1..50,1..50] of real;
m,n: integer; {количество строк и столбцов}
i,j: integer; {переменные счётчики}
k: integer; {переменная счётчик }
begin
clrscr;
write ('Введите количество строк в массиве ');
readln (n);
write ('введите количество столбцов в массиве');
readln (m);
for i:=1 to n do {ввод массива}
for j:=1 to m do
begin
write ('a[',i,',',j,']=');
readln (a[i,j]);
end;
for j:=1 to m do
for i:=1 to n do
begin
if a[i,j]=0 then{проверка условия равен ли проверяемый элемент 0}
begin
k:=k+1; {если да, то увеличиваем переменную k на1}
if k=1 then {проверка условия k=1}
begin
writeln ('i=',i,',j=',j); {если да, то печатать № строки и № столбца }
end;
end;
end;
readln;
end.
16.Заполните квадратную матрицу по образцу:
program zadacha_16;
uses crt;
var
a: array [1..30,1..30] of integer;
i,j,n,p,s,k: integer;
begin
clrscr;
write ('Введите количество строк и столбцов в матрице.');
readln (n);
k:=n*n;
for i:=1 to n do
begin
if (i mod 2)<>0 then
begin
for j:=1 to n do
begin
a[i,j]:=k;
k:=k-1;
end;
end
else
begin
for j:=n downto 1 do
begin
a[i,j]:=k;
k:=k-1;
end;
end;
end;
for i:=1 to n do
begin
for j:=1 to n do
writeln (a[i,j]:5);
readln;
end;
end.
17.Сформировать матрицу по образцу:
program zadacha_17;
var n,i,j:integer; a:array [1..100,1..100] of integer;
begin write('введите n:'); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
a[i,j]:=j-i+1;
if a[i,j]<=0 then a[i,j]:=abs(a[i,j]-2);
end;
for i:=1 to n do
begin for j:=1 to n do
write(a[i,j]:3);
writeln
end
end.
18.Сформировать матрицу по образцу:
program zadacha_18;
var a:array[1..100,1..100] of integer;
i,j,n:integer;
begin write('Введите количество строк и столбцов');
readln(n);
for i:=1 to n div 2 do
for j:=i to n do
begin a[i,j]:=0;
if ((j>=i) and (j<=(n-i+1))) and (i<=(n div 2)+1)
then begin a[i,j]:=1;
a[n-i+1,j]:=1;
end;
end;
if n mod 2=1 then a[n div 2+1,j div 2+1]:=1;
for i:=1 to n do
begin for j:=1 to n do write(a[i,j]:2);
writeln
end;
readln
end.
19.Дана матрица размеренности m*n, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.
program zadacha_19;
uses crt;
var
a:array[1..100,1..100] of integer; {исходная матрица}
b:array[1..100,1..100] of single; {конечная матрица}
i:integer; {номер строки}
j:integer; {номер столбца}
n:integer; {количество строк}
m:integer; {количество столбцов}
max:integer;{наибольший по модулю элемент}
begin
clrscr;
writeln ('Количество строк');
readln(n);
writeln ('Количество столбцов');
readln(m);
for i:=1 to n do {ввод элементов исходной матрицы}
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Исходная матрица:');
for i:=1 to n do {вывод элементов матрицы}
begin
for j:=1 to m do
begin
write(a[i,j]);
end;
writeln;
end;
max:=abs(a[1,1]); {нахождение наиб. элемента по модулю}
for i:=1 to n do
for j:=1 to m do
begin
if abs(a[i,j])>max then
max:=abs(a[i,j]);
end;
writeln('Наибольший по модулю элемент: ',max);
for i:=1 to n do {деление каждого эл. нового массива на max}
for j:=1 to m do
begin
b[i,j]:=a[i,j]/max;
end;
writeln('Конечная матрица:');
for i:=1 to n do {вывод элементов конечной матрицы}
begin
for j:=1 to m do
begin
write(b[i,j]);
end;
writeln;
end;
readln;
end.
20.Дана квадратная вещественная матрица размерности n. Является ли матрица симметричной относительно главной диагонали
program zadacha_20;
uses crt;
var
a:array[1..50,1..50]of integer;{описываю массив и данные}
n:integer;
i,j:integer;
begin
clrscr;
writeln('введите кол-во строк и столбцов'); {ввожу кол-во строк и столбцов}
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');{ввожу числа}
readln(a[i,j]);
end;
begin
for i:=1 to n-1 do {транспонирую матрицу}
for j:=i+1 to n do
end;
if a[i,j]=a[j,i] then {проверяю условие}
writeln('матрица симетричная'){вывожу ответ на экран}
else
writeln('матрица не симетричная');
readln;
end.
21.Дана действительная квадратная матрица порядка n. Вычислить сумму тех из m элемен-тов, расположенных по главной диагонали и выше неё, которые превосходят по величине все элементы, расположенные ниже главной диагонали. Если элементов с указанным свойством нет, то вывести соответствующее сообщение.
program zadacha_21;
uses crt;
var
a: array[1..50,1..50] of real;
i,j: integer;
n: integer;
max: real;
s: real;
begin
clrscr;
writeln ('введите кол-во строк и столбцов');
readln (n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
s:=0;
max:=0;
for i:=1 to n do
for j:=1 to n do
begin
if i>j then
begin
if a[i,j]>max then
begin
max:=a[i,j];
end;
end;
end;
for i:=1 to n do
for j:=1 to n do
begin
if (i<=j) then
begin
if a[i,j]>max then
begin
s:=s+a[i,j];
end;
end;
end;
if s<>0 then
begin
write ('s=',s:5:2);
end
else
begin
writeln ('Элементов с указанным свойством нет');
end;
readln;
end
22.Имеется квадратная матрица. Повернуть её на 180 градусов