52841.fb2
Мета уроку: Дати поняття двовимірних таблиць. Навчити розв’язувати типові задачі з обробки двовимірних таблиць.
Двовимірний масив — це масив, де кожному елементу ставиться у відповідність два індекси.
Напрямок зміни другого індексу —>
1
2
3
…
I
…
m
1
2
3
…
n
Напрямок
зміни першого
індексу ↓
Для початку роботи з масивом готуємо місце в пам’яті.
Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово Array, після якого в квадратних дужках вказуємо розмірність масиву, причому враховуємо, що на першому місці вказуються індекси рядків, а на другому - стовпчиків, і обов’язково — тип елементів.
Опис двовимірного масиву:
var
<Ім’я_масиву>: array[<поч_інд_рядкiв>..<кін_інд_рядків>,
<поч_інд_ставп>. .<кін_інд_стовп>] of <базовий_тип_елементів>;
Приклад опису:
Const n:=100; m:=100; Var A:array[1..n,1..m] of real;
D:array[l..10,1.100] of integer;
Зверніть увагу на те, що значень у рядках або стовпчиках масиву не обов’язково буде стільки, скільки ми оголосили, але не більше!
Звертання до елементу двовимірного масиву: їм’я_масиву[<індекс_рядка>, <хнд_стовпчика>]
Заповнення масиву:
• з клавіатури:
for i:=1 to n do
for j:=1 to m do
begin
write (‘введіть A[‘i,’,’,j,’]: ‘) ;
readln(A[i,j])
end;
• за формулою:
for і:=1 to n do
for j:=1 to m do
A[i,j]:=i*i-10 {або будь-яка інша формула};
• випадковим чином із проміжку [K,L]:
for і:=1 to n do
for j:=1 to m do
A[і,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), ... (і, і). ..., (п, n), тобто номер рядка дорівнює номеру стовпчика. Елементи, що стоять на бічній діагоналі, мають такі індекси (1, n), (2, п -1), (З, п - 2),..., (і, п + 1 - 0, (п, 1), тобто індекси елементів взаємозалежні за формулою j- п +1 - і.
Далі рекомендується розглянути методи розв’язання деяких типових задач з обробки двовимірних таблиць.
ЗАДАЧА №345(1)
Умова: Дано натуральні числа п, т. Обчислити значення елементів матриці Сij, (і = 1, 2, ... п, j-1, 2, .... т), якщо:
Розв ‘язання:
Program Example_345_l;
Uses crt;
Const n = 20; m = 15;
Var C:array[1..n,1..m] of integer;
i,j:integer; {i,j - змінні циклу}
Begin
Clrscr;
For i:=1 to n do
Begin
For j:=1 to m do
begin
if і < j then C[i,j]:=i + j
else C[i,j]:=i*i + j*j;
Write(C[i,j]:5);
end;
writeln;
End;
Readkey; {Затримка зображення на екрані)
End.
ЗАДАЧА № 360
Умова: Дано квадратну матрицю розмірності п. Надрукувати суму елементів бічної діагоналі.
Розв ‘язання: Розв’язок задачі є тривіальним, якщо згадати, яку залежність мають індекси бічної діагоналі (і +j = п + 1). Перевіривши цю залежність у середині циклів, що організовують проходження по масиву, ми знайдемо бажану суму.
Program Example_360;
Uses crt;
Const n = 10;
Var A:array[1..n,1..n] of real;
і,j:integer; (і,j - змінні циклу}
Sum:real; {Sum - сума елементів бічної діагоналі}
Begin
Randomize;
Clrscr; {Заповнення масиву та виведення його на екран}
For і:=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;
writeIn;
End;
Sum:=0; {Початкове значення суми}
For і:=1 to n do
Begin
For j:=1 to n do
if і + j = n+1 then Sum:=Sum+A[і,j];
End;
Writeln(‘Сума елементів бічної діагоналі =’,Sum:8:2);
Readkey;
End.
Зверніть увагу на те, що для цієї задачі можна значно спростити цикл знаходження суми, адже фактично ми розглядаємо тільки лінійний масив (елементи на діагоналі насправді складають одновимірний масив). Тому цикл знаходження суми можна зобразити таким чином (наведений фрагмент програми):
Sum:=0; {Початкове значення суми}
For i:=l to n do Sum:=Sum+A[i,n+1-i];
Домашнє завдання
• Задачі № 343(3,4), № 344(3), № 345(2), №347(3), №361.