Тип уроку: Лекційний з практичними прикладами.
Двовимірний масив - це масив, де кожному елементу ставиться у
відповідність два індекси.
Для початку роботи з масивом готуємо місце в пам'яті у вигляді прямокутника,
що має задану кількість рядків і стовпчиків. Для цього описуємо його в розділі
оголошень, використовуючи зарезервоване слово Аrray, після якого в квадратних
дужках вказуємо розмірність масиву, причому враховуємо, що на першому місці
вказуються індекси рядків, а на другому - стовпчиків, і обов'язково тип елементів.
Опис двовимірного масиву
<Ім'я_масиву> : array[<поч_інд_рядків>..<кін_інд_рядків>,
<поч_інд_стовп>. .<кін_інд_стовп>]
of <базовий_тип_елементів> ;
Приклад опису:
Const n:=100; m:=100; Var A:array[1..n,1..m] of real; D:array[1..10,1.100] of integer;Зверніть увагу на те, що значень у рядках або стовпчиках масиву не обов'язково буде стільки, скільки ми оголосили, але не більше.
for і:=1 to n do for j:=1 to m do begin write ('введіть А[',i,',',j,']: '); readln (А[i,j]); end;
for і:=1 to n do for j:=1 to m do А[і,j]:=i*i-10 {або будь-яка формула};
for і:=1 to n do for j:=1 to m do А[і,j]:=random(L-K)+K;Виведення двовимірного масиву на екран
for і:=1 to n do begin for j:=1 to m do write(A[i,j]:8); {виведення в рядок} writeln; {перехід на новий рядок} end;Виведення в рядку необхідно обов'язково форматувати, щоб не трапилось "злипання" елементів (дивись приклад вище).
Елементи, що стоять на головній діагоналі, мають індекси (1, 1), (2, 2), (3,
3), ... (і, і). ..., (n, n), тобто номер рядка дорівнює номеру стовпчика!
Елементи, що стоять на бічній діагоналі, мають такі індекси (1, n), (2, n-1),
(3, n-2), ..., (і, n+1-і), (n,1), тобто індекси елементів взаємозалежні за
формулою j= n+1 - i.
Далі рекомендується розглянути методи розв'язку деяких типових задач по обробці
двовимірних таблиць.
Задача №343(2).
Умова: Дано натуральні числа n, m та випадкові дійсні числа, що утворюють
таблицю A[i,j], де i = 1,2,…, n; j = 1, 2, …, m. Роздрукувати у рядок
елементи, що розташовані в першому стовпчику.
В даній задачі, хоча таблиця задана двовимірна, другий індекс у всіх елементів,
що будуть друкуватися, дорівнює 1, тому достатньо одного циклу по рядках для
виконання задачі. Зверніть увагу, що для заповнення масиву повністю необхідні
два цикли по рядках та стовпчиках.
Program Example_343_2; Uses crt; Const n = 10; m = 8; Var A: array[1..n,1..m] of real; i,j: integer; {і,j - змінні циклу} Begin Randomize; {Ця процедура запускається з метою зробити числа генератора випадкових чисел ще більш "випадковими"} Clrscr; For i:=1 to n do Begin For j:=1 to m do begin A[i,j]:=random*50-random*30; {Заповнення масиву випадковими числами} Write(A[i,j]:8:2); {Виведення масиву на екран для контролю правильності роботи програми} end; writeln; End; Writeln ('Перший стовпчик масиву:'); For i:=1 to n do begin Write (A[i,1]:8:2); end; Readkey; {Затримка зображення на екрані} End.
Задача №343(5).
Умова: Дано натуральні числа n, m та випадкові дійсні числа,
що утворюють таблицю A[i,j], де i = 1,2,…, n; j = 1, 2, …, m. Роздрукувати
у рядок елементи, що розташовані на бічній діагоналі.
Нагадуємо, що на бічній діагоналі елементи мають таку властивість: сума номера
рядка та номера стовпчика дорівнюють розмірності масиву +1, тобто номер
стовпчика обчислюється за наступною формулою: j = n-1+i.
Тоді програма для розв'язання даної задачі має наступний вигляд:
Program Example_343_5; Uses crt; Const n = 10; Var A: array[1..n,1..n] of real; i,j: integer; {і,j - змінні циклу} Begin Randomize; Clrscr; {Заповнення масиву випадковими числами та виведення його на екран} For i:=1 to n do Begin For j:=1 to m do begin A[i,j]:=random(500)/11-random*30; Write (A[i,j]:8:2); end; writeln; End; Readln; {Затримка зображення на екрані} Writeln ('Бічна діагональ масиву:'); For i:=1 to n do begin Write (A[i,n-i+1]:8:2); end; Readkey; {Затримка зображення на екрані} End.
Задача №344(2).
Умова: Дано натуральні числа n, m та матриці цілих чисел
Aij, Bij, де i = 1, 2, …, n, j = 1, 2, …,m. Обчислити значення
елементів матриці Cij, якщо Cij = Aij (I+j) - Bij(i2+j2).
Program Example_344_2; Uses crt; Const n = 8; m = 15; Var A,B,C: array[1..n,1..m] of integer; i,j:word; {і,j - змінні циклу} Begin Randomize; Clrscr; Writeln ('Масив А:'); For i:=1 to n do Begin For j:=1 to m do begin A[i,j]:=random(50)-random(20); Write (A[i,j]:5); end; writeln; End; Writeln ('Масив В:'); For i:=1 to n do Begin For j:=1 to m do begin B[i,j]:=random(120)-random(80); Write (B[i,j]:5); end; writeln; End; Writeln ('Результуючий масив С:'); For i:=1 to n do Begin For j:=1 to m do begin С[i,j]:=A[i,j]*(i+j)-B[i,j]*(i*i+j*j); Write (С[i,j]:5); end; writeln; End; Readkey; {Затримка зображення на екрані} End.Задача №345(1).
Program Example_345_1; Uses crt; Const n = 20; m = 15; Var C: array[1..n,1..m] of integer; i,j:integer; {і,j - змінні циклу} Begin Clrscr; For i:=1 to n do Begin For j:=1 to m do begin if i < j then С[i,j]:=i + j else C[i,j]:=i*i + j*j; Write (С[i,j]:5); end; writeln; End; Readkey; {Затримка зображення на екрані} End.Задача №347(2).
Program Example_347_2; Uses crt; Const n = 6; m = 8; Var A,B,C: array[1..n,1..m] of real; i,j:integer; {і,j - змінні циклу} Begin Randomize; Clrscr; Writeln ('Масив А:'); For i:=1 to n do Begin For j:=1 to m do begin A[i,j]:=random*5-random(10)/3; Write (A[i,j]:8:3); end; writeln; End; Writeln ('Масив В:'); For i:=1 to n do Begin For j:=1 to m do begin B[i,j]:=random(10)-random*8; Write (B[i,j]:8:3); end; writeln; End; Writeln ('Результуючий масив С:'); For i:=1 to n do Begin For j:=1 to m do begin if i < j then С[i,j]:=i*i + j*j + 2 else if i = j then C[i,j]:=1/(sqr(i+j)*(i+j)) else C[i,j]:=sqr(sin(A[i,j]))+sqr(sin(B[i,j])); Write(С[i,j]:8:3); end; writeln; End; Readkey; {Затримка зображення на екрані} End.
Задача №360.
Умова: Дано квадратну матрицю розмірності n. Надрукувати суму
елементів бічної діагоналі.
Розв'язок задачі являється тривіальним, якщо згадати, яку залежність мають індекси
бічної діагоналі (i+j=n+1). Перевіривши цю залежність в середині циклів,
що організовують прохід по масиву, ми знайдемо бажану суму.
Program Example_360; Uses crt; Const n = 10; Var A: array[1..n,1..n] of real; i,j:integer; {і,j - змінні циклу} Sum:real; {Sum - сума елементів бічної діагоналі} Begin Randomize; Clrscr; {Заповнення масиву та виведення його на екран} For i:=1 to n do Begin For j:=1 to n do begin A[i,j]:=random*50-random(80)/3; Write(A[i,j]:8:3); end; writeln; End; Sum:=0; {Початкове значення суми} For i:=1 to n do Begin For j:=1 to n do begin if i + j = n+1 then Sum:=Sum+A[i,j]; end; End; Writeln ('Сума елементів бічної діагоналі =',Sum:8:2); Readkey; {Затримка зображення на екрані} End.
Зверніть увагу на те, що для цієї задачі можна значно спростити цикл знаходження
суми, адже фактично ми розглядаємо тільки лінійний масив (елементи на діагоналі
дійсно складають одновимірний масив). Тому цикл знаходження суми можна зробити
таким чином (наведений фрагмент програми):
Sum:=0; {Початкове значення суми} For i:=1 to n do Begin Sum:=Sum+A[i,n+1-i]; End;