П`ятниця, 19.04.2024, 16:51
Головна Реєстрація RSS
Вітаю Вас, Гість
Наше опитування
Оцініть мій сайт
Всього відповідей: 68
http://hozki-school.ucoz.ua/index/31-162-0-1-2

 « попередня

ЗМIСТ

наступна » 

Урок 33

Тема уроку: "Алгоритми і програми роботи з двовимірними таблицями"

    Мета уроку: Дати поняття двовимірних таблиць. Навчити розв'язувати типові задачі по обробці двовимірних таблиць..
    Тип уроку: Лекційний з практичними прикладами.

Двовимірний масив - це масив, де кожному елементу ставиться у відповідність два індекси.

Для початку роботи з масивом готуємо місце в пам'яті у вигляді прямокутника, що має задану кількість рядків і стовпчиків. Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово А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 {або будь-яка формула}; 
    
  • випадковим чином із проміжку [K,L]:
  • 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).
    Умова: Дано натуральні числа n, m. Обчислити значення елементів матриці Cij, (i = 1,2,…n, j=1,2,…,m), якщо:

    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).
    Умова: Дано натуральні числа n, m та матриці дійсних чисел Aij, Bij, де i = 1, 2, …, n, j = 1, 2, …,m. Обчислити значення елементів матриці Cij, якщо:

    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; 
    

      Домашнє завдання:

    • Задачі №343(3,4), №344(3), №345(2), №347(3), №361.

     « попередня

    ЗМIСТ

    наступна » 

    Наверх