Informatika_1 / 1pr opr / конспект лекцій 1 паск / Лекція 8
.docЛекція №8. Двувимірний масив.
Особливості опису n-мірних масивів. Розв’язання задач на двовимірні масиви.
Двовимірний масив можна розглядати як єдиний об’єкт, який має свої характеристики, та як масив окремих рядків чи стовпчиків. Тому розглянемо декілька типів задач з використанням двовимірних масивів. Звертаємо вашу увагу на використання процедур введення та виведення двовимірних масивів.
Приклад 4.11. Заданий двовимірний масив. Визначити суму його елементів, кількість від’ємних елементів, максимальний елемент та його індекси.
type dmas = array [1..10,1..10] of real;
procedure vvdmas(kr, kst: integer; var x: dmas);
{ формальні параметри: kr- кількість рядків, kst – кількість стовпчиків, x - масив}
var i, j: integer;
begin
writeln(‘введіть елементи масиву по рядкам’);
for i:=1 to kr do
begin
for j:=1 to ks do
read(x[i,j]);
writeln;
end;
end;
procedure vuvdmas(kr, kst: integer; var x: dmas);
{виведення матриці по рядкам}
var i, j: integer;
begin
writeln(‘масив ’);
for i:=1 to kr do
begin
for j:=1 to kst do
write(x[i,j]:5:2);
writeln;
end;
end;
var a:dmas;
i, j, m, n: integer; k, l, z: integer;
s, max: real;
begin
writeln('m<=4,n<=3'); {введем розмір матриці та елементи матриці }
readln(m,n);
vvdmas(m,n);
vuvdmas(m,n);
s:=0; k:=0; {знаходження суми елементів, кількості від’ємних елементів }
for i:=1 to m do
for j:=1 to n do
begin
s:=s+a[i,j];
if a[i,j]<0 then k:=k+1;
end;
writeln('s=',s:6:1,'k=',k:4);
max:=a[1,1]; l:=1; z:=1; {знаходження максимального елемента та його індексів}
for i:=1 to m do
for j:=1 to n do
if a[i,j]>max then
begin
max:=a[i,j];
l:=i; z:=1;
end;
writeln('max=',max:4:1, 'z=',z:4, 'l=',l:4);
readln;
end.
Іноді студенти запитують: „Навіщо виводити на екран тількі що введений масив?”. А доцільність цієї дії дуже проста. Адже при введені не завжди витримується форма запису масиву, до якої всі звикли. А для аналізу результатів роботи програми вихідний масив обовязково повинен бути зображений на моніторі.
Окремо розглядають двомірні масиви, які мають однакову кількість рядків та стовпчиків. Такі масиви називають квадратними матрицями.
В таких матрицях можна провести дві уявні діагоналі – головну та побічну. Головна проходить від елемента a11 до елемента ann. Побічна проходить від елемента an1 до елемента a1n. Якщо уважно придивитися до індексів елементів такої матриці, то можна записати їх властивості відносно розташування елементів до головної та побічної діагоналі. Надалі можна використовувати ці властивості для розвязку задач з використанням матриць. Особливо це цікаво при розвязання задач лінійного програмування та вищої алгебри. Запамятати ці властивості дуже легко. Головна діагональ це різниця індексів, побічна –сума індексів. Причому під діагоналями і різниця і сума повязані з знаком >, над ними – знак <.
Для всіх елементів, які розташовані на головній діагоналі, виконується властивість i-j=0;
Для всіх елементів, які розташовані під головною діагоналлю, виконується властивість i-j>0;
Для всіх елементів, які розташовані над головною діагоналлю, виконується властивість i-j<0;
Властивості елементів, які розташовані відносно побічної діагоналлю (від a1n до a n1):
Для всіх елементів, які розташовані на побічній діагоналі, виконується властивість i+j=n+1;
Для всіх елементів, які розташовані під побічною діагоналлю, виконується властивість i+j>n+1;
Для всіх елементів, які розташовані над побічною діагоналлю, виконується властивість i+j<n+1;
Приклад 4.13. Знайти суму елементів, які розташовані на головній діагоналі квадратної матриці.
const n=4; {розміри матриці об’являються як стала величина}
var a: array [1..n,1..n] of real;
i,j:integer;
s:real;
begin
for i:=1 to n do {введення матриці по рядкам}
begin
for j:=1 to n do
read(a[i,j]);
end;
s:=0;
for i:=1 to n do
s:=s+a[i,i];
writeln('s=',s:5:0);
end.
Приклад 4.14. Визначити суму елементів, які утворюють верхній трикутник відносно головної діагоналі.
const n=4;
var a: array [1..n,1..n] of real;
i,j:integer;
s:real;
begin
{двовимірний масив можна вводити в оперативну пам’ять по рядкам, коли зразу}
{ набираються через пробіл всі елементи рядка і після цього за допомогою клавіші }
{Enter переводиться курсор на початок нового рядка. Таким чином можна не}
{ виводити матрицю знову на екран для подальшого аналізу результату.}
for i:=1 to n do
begin
for j:=1 to n do
read(a[i,j]);
end;
s:=0;
for i:=1 to n do
for j:=1 to n do
if i-j<0 then s:=s+a[i,j];
writeln('s=',s:5:0);
end;
Якщо задача відноситься до кожного рядка чи кожного стовпчика, розв’язок переноситься в середину першого циклу, коли визначено індекс рядка чи стовпчика.
Приклад 4.14. Визначити мінімальний елемент кожного стовпчика та вивести на екран максимальний з них.
const n=4;m=3;
var a: array [1..m,1..n] of real;
i,j:integer;
max,min:real;
begin
for i:=1 to m do
begin
for j:=1 to n do
read(a[i,j]);
end;
max:=-maxint;
for j:=1 to n do {визначення індексу стовпчика}
begin
min:=a[1,j]; {визначення мінімального елементу стовпчика}
for i:=1 to m do
if a[i,j]<min then min:=a[i,j];
writeln('j=',j,' min=',min:5:2);
{визначення максимального з мінімальних елементів стовпчиків}
if min>max then max:=min;
end;
writeln('max=',max:5:0);
end.
Приклад 4.16. Виконати транспонування заданої матриці.
Транспонованою матрицею є така, в якій елементи стовпчиків міняються місцями з елементами рядків.
var a:array [1..4,1..4] of integer;
i,j,x:integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=i;
for i:=1 to 3 do
begin
for j:=1 to 3 do
write(a[i,j]);
writeln;
end;
for i:=1 to 3 div 2+1 do
for j:=i+1 to 3 do
if i<>j then begin
x:=a[i,j];
a[i,j]:=a[j,i];
a[j,i]:=x;
end;
for i:=1 to 3 do
begin
for j:=1 to 3 do
write(a[i,j]);
writeln;
end;
end.
Для двомірних масивів допустима така операція: a[k]:=a[l]; В цьому випадку всі елементи рядка за номером k приймають значення відповідних елементів рядка за номером l.
Тести для підсумкового контролю.
-
Які з приведених описів двомірних масивів не можна використовувати:
а) var a: array [1..5,1..7] of real;
б) type mas= array [‘A’..’D’,-2..3] of integer;
var a: mas;
в) type mas= array [1..10] of char;
var a: array [2..7] of mas;
г) var a: array [5,7] of integer;
д) type maska=(‘vovk’, ‘lisicja’, ‘vedmid’);
var a: array [maska] of array of char;
е) var mas: array [1..5],[1..7] of real;
-
Скільки елементів має заданий масив:
type ww=(m1,m2,m3,m4);
var z: array [ww] of array [ww] of boolean;
-
Для описаного масиву визначити, які звертання до елементів є правильними:
var m: array [‘a’..’c’, 2..5] of real;
а) m[‘b’,3] б) m[‘b’][3] в) m[‘b’, 7] г)m[‘d’, ‘d’]
-
Які з вказаних операцій можна виконувати з заданими масивами в мові Pascal:
var a,b : array [1..3,0..3] of real;
t: boolean;
а) a:=b;
б) a:=a+b;
в) t:=a<>b;
г) read(a);
д) a[1]:=a[3];
е) a[2,3]:=b[1,4]+b[1,1];
-
Які з вказаних операцій не можна виконувати з заданими масивами в мові Pascal:
type v=array[1..10] of real;
t1= array [1..8] of v;
t2=array [1..8,1..10] of real;
var x:v; a:t1; b:t2;
а)a:=b;
б)a[1]:=a[8];
в)b[1,3]:=a[3];
г)b[1]:=b[8];
д)x:=a[5];
е)b[8,5]:=x;
-
Що буде виведено на екран після виконання наступних операторів:
var a:array [1..2,1..3] of integer;
s:integer;
begin
s:=0;
for i:=1 to 2 do
for j:=1 to 3 do
a[i,j]:=i;
s:=s+a[i,j];
writeln(s);
end.
-
Який фрагмент програми виконує задачу: знайти найбільший елемент масиву.
а)max := a[1];
for i:=1 to 2 do
for j:=1 to 3 do
if a[i,j]> max then max:= a[i,j];
б) for i:=1 to 2 do
for j:=1 to 3 do
if a[i,j]> max then
max:= a[i,j];
в) max := 0;
for i:=1 to 2 do
for j:=1 to 3 do
if a[i,j]> max then max:= a[i,j];
г) max := a[1,1];
for i:=1 to 2 do
for j:=1 to 3 do
if a[i,j]> max then max:= a[i,j];
-
Який фрагмент програми виконує задачу: знайти найбільший елемент кожного рядка масиву.
а)max := a[1,1];
for i:=1 to 2 do
for j:=1 to 3 do
if a[i,j]> max then
max:= a[i,j];
writeln(max);
б) for i:=1 to 2 do
begin
for j:=1 to 3 do
if a[i,j]> max then
max:= a[i,j];
writeln(max);
end;
в) for i:=1 to 2 do
begin max := 0;
for j:=1 to 3 do
if a[i,j]> max then max:= a[i,j];
end;
writeln(max);
г) for i:=1 to 2 do
begin
max := a[1,1];
for j:=1 to 3 do
if a[i,j]> max then max:= a[i,j];
writeln(max);
end;
-
Які з перелічених виразів є властивостями елементів квадратних матриць, що належать головній діагоналі:
а) a[i,j]=a[j,i]
б) i=j
в) i-j=0
г) i-j>0
д) i+j>0
е) i-j>m+1
10. Що буде виведено на екран в результаті виконання наступної програми:
const a:array [1..2,1..2] of integer=((1,2),(3,4));
var i,j:integer;
begin
s:=0;
for i:=1 to 2 do
for j:=1 to 2 do
s:=s+a[i,j];
writeln(s,’,’,a[i,j]);
end.