Вивчення Turbo Pascal

Вивчення Turbo Pascal у школі - це просто,
якщо користуватися цим сайтом

  

   
  Головна
  Вступ до програмування
  Основи програмування мовою Паскаль
  Алгоритмічні структури
  Підпрограми
  Структуровані типи даних
  Графіка
  Автор сайту
  Карта сайту
   
 
 

Алгоритми і програми роботи з двовимірними таблицями

 

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

Для початку роботи з масивом готуємо місце в пам'яті у вигляді прямокутника, що має задану кількість рядків і стовпчиків. Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово А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;