Як зробити матрицю в pascal abc. Двовимірні масиви

Двовимірний масив у Паскалі трактується як одномірний масив, тип елементів якого також є масивом (масив масивів). Положення елементів двомірних масивах Паскаля описується двома індексами. Їх можна подати у вигляді прямокутної таблиці або матриці.

Розглянемо двовимірний масив Паскаля розмірністю 3*3, тобто в ній буде три рядки, а в кожному рядку по три елементи:

Кожен елемент має свій номер, як у одновимірних масивів, але зараз номер вже складається з двох чисел – номера рядка, в якому знаходиться елемент, та номери стовпця. Таким чином, номер елемента визначається перетином рядка та стовпця. Наприклад, a 21 – це елемент, що стоїть у другому рядку та у першому стовпці.

Опис двовимірного масиву Паскаля.

Існує кілька способів оголошення двовимірного масиву Паскаля.

Ми вже вміємо описувати одновимірні масиви, елементи яких може мати будь-який тип, отже, і самі елементи може бути масивами. Розглянемо наступний опис типів та змінних:

Приклад опису двовимірного масиву Паскаля

Type
Vector = array of<тип_элементов>;
Matrix = array of vector;
Var m: matrix;

Ми оголосили двовимірний масив Паскаля m, що складається з 10 рядків, у кожному з яких 5 стовпців. При цьому до кожного i-го рядка можна звертатися m [i], а кожному j-му елементу всередині i-го рядка – m [i, j].

Визначення типів для двовимірних масивів Паскаля можна задавати і в одному рядку:

Type
Matrix = array of array of< тип элементов >;
або ще простіше:
type
matrix = array of<тип элементов>;

Звернення до елементів двовимірного масиву має вигляд: M [i, j]. Це означає, що ми хочемо отримати елемент, розташований в i-му рядку і j-му стовпці. Тут головне не переплутати рядки зі стовпцями, бо ми можемо знову отримати звернення до неіснуючого елементу. Наприклад, звернення до елемента M має правильну форму запису, але може викликати помилку у роботі програми.

Основні дії із двовимірними масивами Паскаля

Все, що було сказано про основні дії з одновимірними масивами, справедливо і для матриць. Єдина дія, яку можна здійснити над однотипними матрицями цілком – це привласнення. Тобто, якщо в програмі ми описані дві матриці одного типу, наприклад,

type
matrix = array of integer;
var
a, b: matrix;

то в ході виконання програми можна присвоїти матриці aзначення матриці b(a:= b). Всі інші дії виконуються поелементно, причому над елементами можна виконувати всі допустимі операції, визначені для типу даних елементів масиву. Це означає, що якщо масив складається з цілих чисел, то над його елементами можна виконувати операції, визначені для цілих чисел, якщо масив складається з символів, то до них застосовні операції, визначені для роботи з символами.

Введення двовимірного масиву Паскаля.

Для послідовного введення елементів одномірного масиву ми використовували цикл for, в якому змінювали значення індексу з 1 до останнього. Але положення елемента у двовимірному масиві Паскаля визначається двома індексами: номером рядка та номером стовпця. Це означає, що нам потрібно буде послідовно змінювати номер рядка з 1 до останнього і в кожному рядку перебирати елементи стовпців з 1 до останнього. Значить, нам знадобиться два циклу for, причому один із них буде вкладено в інший.

Розглянемо приклад введення двовимірного масиву Паскаля з клавіатури:

Приклад програми введення двовимірного масиву Паскаля з клавіатури

type
matrix = array of integer;
var
a: matrix;
i, j: integer; (Індекси масиву)
begin
for i:=1 to 5 do (цикл для перебору всіх рядків)
readln (a [i, j]); (введення з клавіатури елемента, що стоїть в i-му рядку і j-му стовпці)

Двовимірний масив Паскаля можна заповнити випадковим чином, тобто. використовувати функцію random (N), а також надати кожному елементу матриці значення деякого виразу. Спосіб заповнення двовимірного масиву Паскаля вибирається в залежності від поставленого завдання, але в будь-якому випадку повинен бути визначений кожен елемент у кожному рядку та кожному стовпці.

Виведення двовимірного масиву Паскаля на екран.

Виведення елементів двомірного масиву Паскаля також здійснюється послідовно, необхідно надрукувати елементи кожного рядка та кожного стовпця. У цьому хотілося б, щоб елементи, які у одному рядку, друкувалися поруч, тобто. в рядок, а елементи шпальти розташовувалися один під одним. Для цього необхідно виконати наступну послідовність дій (розглянемо фрагмент програми масиву, описаного в попередньому прикладі):

Приклад програми виведення двовимірного масиву Паскаля

for i:=1 to 5 do (цикл для перебору всіх рядків)
begin
for j:=1 to 10 do (перебір всіх елементів рядка по стовпцях)
write (a [i, j]: 4); (друк елементів, що стоять в i-му рядку матриці в одному екранному рядку, при цьому для виведення кожного елемента відводиться 4 позиції)
writeln; (Перш ніж змінити номер рядка в матриці, потрібно перевести курсор на початок нового екранного рядка)
end;

Зауваження ( це важливо!): дуже часто у програмах студентів зустрічається помилка, коли введення з клавіатури або виведення на екран масиву намагаються здійснити наступним чином: readln(a), writeln(a), де а- Це змінна типу масив. При цьому їх дивує повідомлення компілятора, що зміну цього типу неможливо рахувати чи надрукувати. Може бути, ви зрозумієте, чому цього зробити не можна, якщо уявите N кухлів, що стоять у ряд, а у вас у руках, наприклад, чайник із водою. Можете ви по команді «нали воду» наповнити відразу всі гуртки? Як би ви не намагалися, але в кожен кухоль доведеться наливати окремо. Заповнення та виведення на екран елементів масиву також має здійснюватися послідовно та поелементно, т.к. у пам'яті ЕОМ елементи масиву розташовуються у послідовних осередках.

Подання двовимірного масиву Паскаля в пам'яті

Елементи абстрактного масиву в пам'яті машини фізично розташовуються послідовно згідно з описом. У цьому кожен елемент займає у пам'яті кількість байт, відповідне його розміру. Наприклад, якщо масив складається з елементів типу integer, то кожен елемент займатиме по два байти. А весь масив займе S^2 байта, де S – кількість елементів у масиві.

А скільки місця займе масив, що з масивів, тобто. матриця? Вочевидь: S i^S j , де S i - кількість рядків, а S j – кількість елементів у кожному рядку. Наприклад, для масиву типу

Matrix = array of integer;

потрібно 12 байт пам'яті.

Як розташовуватимуться в пам'яті елементи цього масиву? Розглянемо схему розміщення масиву M типу matrix у пам'яті.

Під кожен елемент M типу integer виділяється два осередки пам'яті. Розміщення пам'яті здійснюється «знизу нагору». Елементи розміщуються у порядку зміни індексу, що відповідає схемі вкладених циклів: спочатку розміщується перший рядок, потім другий, третій... Усередині рядка по порядку йдуть елементи: перший, другий тощо.

Як ми знаємо, доступ до будь-якої змінної можливий тільки якщо відома адреса осередку пам'яті, в якій зберігається змінна. Конкретна пам'ять виділяється для змінної під час завантаження програми, тобто встановлюється взаємна відповідність між змінною та адресою комірки. Але якщо ми оголосили змінну як масив, то програма знає адресу початку масиву, тобто першого його елемента. Як же доступ до всіх інших елементів масиву? При реальному доступі до осередку пам'яті, в якій зберігається елемент двовимірного масиву, система обчислює її адресу за формулою:

Addr + SizeElem * Cols * (I -1) + SizeElem * (J -1),

де Addr – фактичний початковий адресу, яким масив міститься у пам'яті; I, J – індекси елемента у двовимірному масиві; SizeElem – розмір елемента масиву (наприклад, два байти для елементів типу integer); Cols – кількість елементів у рядку.

Вираз SizeElem * Cols * (I -1) + SizeElem * (J -1) називають зміщенням щодо початку масиву.

Скільки пам'яті виділяється для масиву?

Розглянемо не так питання про те, скільки пам'яті виділяється під масив (це ми розібрали в попередньому розділі), а про те, який максимально допустимий розмір масиву, враховуючи обмежений обсяг пам'яті.

Для роботи програми пам'ять виділяється сегментами по 64 Кбайт кожен, причому як мінімум один з них визначається як сегмент даних. Ось у цьому сегменті і розташовуються ті дані, які оброблятиме програма. Жодна змінна програми не може розташовуватись більш ніж в одному сегменті. Тому, навіть якщо в сегменті знаходиться тільки одна змінна, описана як масив, вона не зможе отримати більш ніж 65536 байт. Але майже напевно, крім масиву в сегменті даних будуть описані ще деякі змінні, тому реальний обсяг пам'яті, який може бути виділений під масив, знаходиться за формулою: 65536 S, де S - обсяг пам'яті, вже виділений під інші змінні.

Навіщо це нам знати? Для того щоб не дивуватися, якщо при компіляції транслятор видасть повідомлення про помилку оголошення надто довгого масиву, коли в програмі зустріне опис (правильний з погляду синтаксису):

Type myArray = array of integer;

Ви знаєте, що, враховуючи двобайтове уявлення цілих чисел, реально можна оголосити масив із кількістю елементів рівним 65536/2 –1=32767. І лише в тому випадку, якщо інших змінних не буде. Двовимірні масиви повинні мати ще менші межі індексів.

Приклади вирішення задач із двовимірними масивами Паскаля

Завдання:Знайти добуток ненульових елементів матриці.

Рішення:

  • Для вирішення цього завдання нам знадобляться змінні: матриця, що складається, наприклад, з цілих елементів; P – добуток елементів, відмінних від 0; I, J – індекси масиву; N, M – кількість рядків та стовпців у матриці.
  • Вхідними даними є N, M - їх значення введемо з клавіатури; матриця – введення матриці оформимо як процедури, заповнення матриці здійснимо випадковим чином, тобто. за допомогою функції random().
  • Вихідними даними буде значення змінної P (твір).
  • Щоб перевірити правильність виконання програми, потрібно вивести матрицю на екран, для цього оформимо процедуру виведення матриці.
  • Хід розв'язання задачі:

обговоримо спочатку виконання основної програми, реалізацію процедур обговоримо трохи згодом:

  • введемо значення N і M;
  • Введемо двовимірний масив Паскаля, для цього звертаємось до процедури vvod(a), де а – матриця;
  • Надрукуємо отриману матрицю, для цього звертаємось до процедури print(a);
  • Надамо початкове значення змінної P =1;
  • Будемо послідовно перебирати всі рядки I від 1-го до N-го, у кожному рядку перебиратимемо всі стовпці J від 1-го до M-го, для кожного елемента матриці перевірятимемо умову: якщо a ij ? 0, то добуток P будемо множити на елемент a ij (P = P * a ij);
  • Виведемо на екран значення добутку ненульових елементів матриці - P;

А тепер поговоримо про процедури.

Зауваження (це важливо!) Параметром процедури може бути будь-яка змінна визначеного типу, це означає, що для передачі в процедуру масиву як параметр, його тип повинен бути описаний заздалегідь. Наприклад:

Type
Matrix=array of integer;
procedure primer (a: matrix);
..............................

Повернемося тепер до наших процедур.

Процедура введення матриці називається vvod параметром процедури є матриця, причому вона повинна бути, як результат, передана в основну програму, отже, параметр повинен передаватися за посиланням. Тоді заголовок нашої процедури виглядатиме так:

Procedure ввод (var m: matrix);

Для реалізації вкладених циклів у процедурі нам знадобляться локальні змінні-лічильники, наприклад, k і h. Алгоритм заповнення матриці вже обговорювався, тому не будемо його повторювати.

Процедура виведення матриці на екран називається print параметром процедури є матриця, але в цьому випадку вона є вхідним параметром, отже, передається за значенням. Заголовок цієї процедури буде виглядати так:

Procedure print (m: matrix);

І знову для реалізації вкладених циклів усередині процедури нам знадобляться лічильники, нехай вони називаються так само - k і h. Алгоритм виведення матриці на екран було описано вище, скористаємося цим описом.

Приклад програми двовимірного масиву Паскаля

Program proizvedení;
Type
Matrix=array of integer;
Var
A: matrix;
N, m, i, j: byte;
P: integer;
Procedure ввод (var m: matrix);
Var k, h: byte;
Begin
For i:=1 to n do (змінна n для процедури є глобальною, а значить відомою)
For j:=1 to m do (змінна m для процедури є глобальною, а значить відомою)
M:= random(10);
End;
Procedure print (m: matrix);
Var k, h: byte;
Begin
For i:=1 to n do
begin
For j:=1 to m do
Write (M: 4);
Writeln;
end;
End;
Begin (початок основної програми)
Writeln ("Введіть розмірність матриці:");
Readln(N, M);
Vvod(a);
Print(a);
P:=1;
For i:=1 to N do
For j:=1 to M do
If a<>0 then p:=p*a;
Writeln (p);
End.

Двовимірний масивструктура даних, що зберігає прямокутну матрицю виду:

A 11 a 12 a 13 a 14 a 15 ... a 1m a 21 a 22 a 23 a 24 a 25 ... a 2m a 31 a 32 a 33 a 34 a 35 ... a 3m a 41 a 42 a 43 a 44 a 45 ... a 4m a 51 a 52 a 53 a 54 a 55 ... a 5m... ... ... ... ... ... ... a n1 a n2 a n3 a n4 a n5... a nm

  • У матриці кожен елемент визначається номером рядка та номером стовпця, на перетині яких він знаходиться
  • У Паскалі двомірний масив розглядається як масив, елементи якого є лінійні масиви(Масив масивів). Два наступні описи двовимірних масивів тотожні var mass:array of array of real; var mass:array of real;
  • Матриця, в якій число рядків дорівнює числу стовпців, називається квадратною матрицею.
  • Для звернення до елемента матриці необхідно використовувати два індекси, що позначають номер рядка і номер стовпця. Наприклад MyArr1. В даному випадку елемент масиву (MyArr1) знаходиться в четвертому рядку та п'ятому стовпці.
  • Все, що було сказано про основні дії з одновимірними масивами, справедливо і для матриць. При поелементному переборі масиву в циклі, як індекси виступають змінні цілісного типу. Традиційно для позначення індексу рядка використовують ідентифікатор “ i ", а стовпця - " j “.
  • Обробка матриці полягає в тому, що спочатку почергово розглядаються елементи першого рядка (стовпця), потім другий і т. д. до останнього.
  • Якщо номер рядка елемента збігається з номером стовпця ( i = j), це означає, що елемент лежить на головної діагоналі матриці.
  • Якщо елемент лежить на побічну діагоналі, то індекси пов'язані з числом елементів ( n) наступною рівністю: i + j = n + 1

Опис двовимірного масиву

Існує кілька способів оголошення (опису) двовимірного масиву Pascal.

Попередній опис типу масиву

type matrix = array of integer; (масив цілих чисел) var mass: matrix;

Визначення змінної як масив без попереднього опису типу масиву

var mass:array of integer;

Ініціалізація двовимірного масиву

При ініціалізації двомірних масивів кожен рядок полягає в додаткову пару круглих дужок:

Const mass:array = ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Введення/виведення значень елементів двовимірного масиву

Найчастіше значення елементів масиву вводяться з клавіатури. Цей спосіб завдання інформації дуже трудомісткий під час роботи з масивами великих розмірів. Для налагодження широкого класу алгоритмів таке введення інформації має бути замінене формуванням елементів масиву випадковим чином. Для цього використовують процедуру randomizeта функцію random. При роботі з двовимірними масивами використовуються вкладені цикли (зазвичай цикл із параметром for).

Заповнення масиву випадковими числами

const n = 5; m = 10; var i, j:integer; matrix:array of integer; begin randomize; for i:= 1 to n do (звернення до рядків масиву) for j:= 1 to m do (звернення поелементно до стовпців) matrix := random(100); (поміщаємо до поточного елемента випадкове число з інтервалу :4); writeln (перехід на новий рядокпо виходу із внутрішнього циклу) end;

Приклади розв'язання задач

Приклад 1

Постановка задачі. Дані цілі позитивні числа M і N. Сформувати цілу матрицю розміру M × N, у якої всі елементи J-го стовпця мають значення 5J (J = 1, …, N).

Const m = 7; n = 10; var i, j:byte; matrix:array of integer; begin for i:= 1 to m do for j:= 1 to n do matrix := 5 * j; ... (Виведення масиву)

Приклад 2

Постановка задачі. Дано цілі позитивні числа M, N та набір з M чисел. Сформувати матрицю розміру M N, у якій у кожному стовпці містяться всі числа з вихідного набору (в тому ж порядку).

Const m = 5; n = 7; vector:array of integer = (3, 5, 2, 7, 4); var i, j:byte; matrix:array of integer; begin for j:= 1 to n do (беремо j-ий стовпець) for i:= 1 to m do (звертаємось до елементів j-го стовпця за рядками) matrix := vector[i]; (реалізація) ... (Виведення отриманого двовимірного масиву)

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

  1. Дані цілі позитивні числа M і N. Сформувати цілу матрицю розміру M × N, у якої всі елементи Першого рядкамають значення 10·I (I = 1, …, M).
  2. Дано цілі позитивні числа M, N і набір з N чисел. Сформувати матрицю розміру M × N, яка в кожному рядку містить усі числа з вихідного набору (у тому самому порядку).
  3. Додатково.Дано цілі позитивні числа M, N, число D і набір M чисел. Сформувати матрицю розміру M × N, у якої перший стовпець збігається з вихідним набором чисел, а елементи кожного наступного стовпця дорівнюють сумі відповідного елемента попереднього стовпця та числа D (в результаті кожен рядок матриці міститиме елементи арифметичної прогресії).
  4. Додатково.Дано матрицю розміру M × N. Вивести її елементи, розташовані в рядках з парними номерами (2, 4, …). Виведення елементів проводити по рядках, умовний оператор не використовувати.

Останній урок паскаль був написаний аж 7 березня, тоді ми розбирали. Сьогодні ми дізнаємося, що таке двомірний масив у паскалі, як він описується і що він являє собою. Докладніше.

Отже, що таке двомірний масив?Для легкого сприйняття представимо одновимірний масив як лінію, а якою всі елементи йдуть один за одним горизонтально, а двомірний як квадрат, в якому елементи розташовані як горизонтально, так і вертикально. Двовимірний масив складається з рядків і стовпців, їх називають матрицею або матричним масивом.

Як описуються двовимірні масиви?Для запису двовимірних масивів є кілька способів, я розгляну два з них.

1 спосіб опису масиву: array of тип змінних в масиві (integer/real/byte);

2 спосіб опису масиву: array of array of тип змінних у масиві;

Спочатку описуються рядки (1..m), та був стовпці (1..n).

У другому способі описується як би два одномірні масиви, які разом утворюють один двовимірний.

Двовимірний масив може описуватися в розділі Type, для подальшого звернення до нього кілька разів або в розділі опису змінних Var, хочу звернути увагу, що замість m і n можна підставити і числа, а можна й користуватися константами.

Приклад завдання двовимірного масиву розділ розділу опису змінних:

Const
m = 100;
n = 100;
var
a: Array of integer;

У цьому випадку ми задали двомірний масив розміру 100 на 100, тобто у нас вийшла квадратна матриця.

Приклад завдання матричного масиву за допомогою розділу Type:

Const
m = 100;
n = 100;
Type
Matrix = Array of integer;
var
a: Matrix;
b:Matrix;

У другому прикладі ми задали два однакові матричні масиви розмірами 100 на 100, при описі масиву b нам не довелося знову описувати його розміри та тип даних.

Як звертатися до осередку-змінного двовимірного масиву?

Щоб звернутися до двомірного масиву, потрібно вказати спочатку номер рядка, а потім номер стовпця наступним чином:

x-будь-яка змінна, a - назва масиву, i-номер рядка, j - номер стовпця.

Причому і і може бути як змінними, і цілими числами.

Приклад запису даних масив:

For i:= 1 to n do //завдання у циклі номера рядка
For j:=1 to m do //Завдання в циклі номера стовпця
a:=random (100); //привласнення осередку з номером рядка i та номером стовпця j випадкового значення

Ми заповнили масив довільними числами від 1 до 100.

Приклад програми з використанням двовимірного масиву, в якому ми заповнюємо масив випадковими числами та виводимо його на екран:

Var //опис змінних та масиву
Matrix: Array of integer;
i, j: integer;

Begin // Початок основної програми
writeln ("Двовимірний масив:"); //Діалог з користувачем

For i:= 1 to 10 do //заповнення масиву
for j:= 1 to 10 do
Matrix:=random (100);

For i:= 1 to 10 do begin //Виведення масиву
for j:= 1 to 10 do
write (matrix, "");
writeln
writeln ("сайт"); //При бажанні можна видалити
end; //Кінець програми

//readln //використовується в Турбо паскаль



Завантаження...
Top