Двумерни масиви. Формиране на матрици и извеждане на нейните елементи

Двуизмерният масив в Pascal се третира като едномерен масив, чийто тип елемент също е масив (масив от масиви). Позицията на елементите в двумерните Pascal масиви се описва с два индекса. Те могат да бъдат представени като правоъгълна таблица или матрица.

Помислете за двуизмерен Pascal масив с размери 3 * 3, тоест той ще има три реда и всеки ред има три елемента:

Всеки елемент има свой собствен номер, като в едномерните масиви, но сега числото вече се състои от две числа - номерът на реда, в който се намира елементът, и номерът на колоната. По този начин номерът на елемента се определя от пресечната точка на реда и колоната. Например, 21 е елементът във втория ред и първата колона.

Описание на двуизмерен масив Pascal.

Има няколко начина за деклариране на двуизмерен Pascal масив.

Вече знаем как да опишем едномерни масиви, чиито елементи могат да бъдат от всякакъв тип и следователно самите елементи могат да бъдат масиви. Помислете за следното описание на типове и променливи:

Пример за описание на двуизмерен масив Pascal

Тип
Вектор = масив от<тип_элементов>;
Матрица = масив от вектор;
Var m: матрица;

Декларирахме двуизмерен Pascal масив m, състоящ се от 10 реда, всеки с 5 колони. В този случай всеки i-ти ред може да бъде достъпен m [i], а всеки j-ти елемент вътре в i-тия ред - m [i, j].

Дефиницията на типовете за двуизмерни масиви Pascal може да се посочи в един ред:

Тип
Матрица = масив от масив от< тип элементов >;
или още по-просто:
Тип
матрица = масив от<тип элементов>;

Препратката към елементите на двуизмерен масив изглежда така: M [i, j]. Това означава, че искаме да получим елемента, разположен в i-ти ред и j-та колона. Основното тук е да не бъркаме редове с колони, в противен случай отново можем да получим извикване на несъществуващ елемент. Например, извикване на елемент M има правилна нотация, но може да причини грешка в програмата.

Основни операции с двумерни Pascal масиви

Всичко, което беше казано за основните операции с едномерни масиви, важи и за матриците. Единственото действие, което може да се извърши върху матрици от същия тип като цяло, е присвояването. Тоест, ако нашата програма описва две матрици от един и същи тип, например,

Тип
матрица = масив от цяло число;
вар
a, b: матрица;

след това по време на изпълнението на програмата можете да зададете матрицата астойност на матрицата б(а: = б). Всички други действия се извършват елемент по елемент, докато върху елементите можете да извършите всички разрешени операции, които са дефинирани за типа данни на елементите на масива. Това означава, че ако масивът се състои от цели числа, тогава операциите, дефинирани за цели числа, могат да се извършват върху неговите елементи, но ако масивът се състои от символи, тогава операциите, дефинирани за работа със знаци, са приложими за тях.

Въвеждане на двуизмерен масив Pascal.

За последователно въвеждане на елементите на едномерен масив използвахме цикъл for, в който променихме стойността на индекса от 1-вия на последния. Но позицията на елемент в двуизмерен масив Pascal се определя от два индекса: номера на реда и номера на колоната. Това означава, че ще трябва последователно да променим номера на реда от 1-вия до последния и във всеки ред да преглеждаме елементите на колоните от 1-вия до последния. Това означава, че имаме нужда от два for цикъла и единият от тях ще бъде вложен в другия.

Помислете за пример за въвеждане на двуизмерен масив Pascal от клавиатурата:

Пример за програма за въвеждане на двуизмерен масив Pascal от клавиатурата

Тип
матрица = масив от цяло число;
вар
a ,: матрица;
i, j: цяло число; (индекси на масива)
започнете
for i: = 1 до 5 do (цикл за повторение по всички редове)
readln (a [i, j]); (клавиатурно въвеждане на елемента в i-ти ред и j-та колона)

Двуизмерен Pascal масив може да се попълни произволно, т.е. използвайте произволната (N) функция и също така присвоете стойността на някакъв израз на всеки елемент от матрицата. Начинът за попълване на двуизмерния Pascal масив се избира в зависимост от задачата, която се изпълнява, но във всеки случай всеки елемент във всеки ред и всяка колона трябва да бъде дефиниран.

Показва двуизмерен масив Pascal на екрана.

Изходът на елементите на двуизмерен масив Pascal също се извършва последователно; необходимо е да се отпечатат елементите на всеки ред и всяка колона. В същото време бих желал елементите на един и същи ред да бъдат отпечатани един до друг, т.е. в ред, а елементите на колоната бяха разположени един под друг. За да направите това, трябва да извършите следната последователност от действия (помислете за програмния фрагмент за масива, описан в предишния пример):

Пример за програма за извеждане на двуизмерен масив Pascal

за i: = 1 до 5 do (цикъл за повторение по всички редове)
започнете
за j: = 1 до 10 do (преглеждайте всички елементи от ред по колона)
напишете (a [i, j]: 4); (отпечатване на елементите в i-тия ред на матрицата в един ред на екрана, докато за изхода на всеки елемент са разпределени 4 позиции)
записване; (преди да промените номера на реда в матрицата, трябва да преместите курсора в началото на нов ред на екрана)
край;

Забележка ( важно е!): много често в студентските програми възниква грешка, когато се прави опит за въвеждане на клавиатура или извеждане на масив, както следва: readln (a), writeln (a), където аЕ променлива от тип масив. Те обаче са изненадани от съобщението на компилатора, че променлива от този тип не може да бъде прочетена или отпечатана. Може би ще разберете защо това не може да се направи, ако си представите N чаши, стоящи в редица, и имате, например, чайник с вода в ръцете си. Можете ли да напълните всички халби наведнъж с командата „налейте вода“? Колкото и да се стараете, ще трябва да наливате във всяка чаша поотделно. Попълването и показването на елементи на масива също трябва да се извършват последователно и елемент по елемент, т.к в паметта на компютъра елементите на масива са разположени в последователни клетки.

Представяне на двуизмерен Pascal масив в паметта

Елементите на абстрактен масив в паметта на машината са физически разположени последователно, според описанието. Освен това всеки елемент заема в паметта броя на байтовете, съответстващи на неговия размер. Например, ако масивът се състои от елементи от тип цяло число, тогава всеки елемент ще отнеме два байта. И целият масив ще отнеме S ^ 2 байта, където S е броят на елементите в масива.

И колко място ще заеме масив, състоящ се от масиви, т.е. матрица? Очевидно: S i ^ S j, където S i е броят на редовете, а S j е броят на елементите във всеки ред. Например за масив като

Матрица = масив от цяло число;

ще отнеме 12 байта памет.

Как елементите на този масив ще бъдат разположени в паметта? Помислете за оформлението на масив M от тип матрица в паметта.

Две клетки на паметта се разпределят за всеки елемент M от тип цяло число. Поставянето в паметта се извършва „отдолу нагоре“. Елементите се поставят в реда на промяна на индекса, който съответства на схемата на вложените цикли: първо се поставя първият ред, след това вторият, третият ... Вътре в реда елементите вървят в ред: първи, втори, и т.н.

Както знаем, достъпът до всяка променлива е възможен само ако е известен адресът на клетката на паметта, в която се съхранява променливата. При зареждане на програмата за променлива се разпределя специфична памет, тоест се установява взаимно съответствие между променливата и адреса на клетката. Но ако сме декларирали променливата като масив, тогава програмата "зна" адреса на началото на масива, тоест първия му елемент. Как да получите достъп до всички останали елементи на масива? С реален достъп до клетка на паметта, която съхранява елемент от двуизмерен масив, системата изчислява неговия адрес по формулата:

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

където Addr е действителният начален адрес, на който се намира масивът в паметта; I, J - индекси на елементи в двуизмерен масив; SizeElem - размерът на елемента на масива (например два байта за целочислени елементи); Cols - броят на елементите в реда.

Изразът SizeElem * Cols * (I -1) + SizeElem * (J -1) се нарича отместване от началото на масива.

Колко памет е разпределена за масива?

Нека да разгледаме не толкова въпроса за това колко памет е разпределена за масива (обсъждахме това в предишния раздел), а колко е максималният допустим размер на масива, като се има предвид ограниченото количество памет.

За да работи програмата, паметта се разпределя в сегменти от по 64 KB всеки, като поне един от тях е дефиниран като сегмент от данни... Именно в този сегмент се намират данните, които програмата ще обработва. Никоя програмна променлива не може да бъде разположена в повече от един сегмент. Следователно, дори ако има само една променлива в сегмента, описана като масив, тя не може да получи повече от 65536 байта. Но почти сигурно, в допълнение към масива, в сегмента от данни ще бъдат описани още някои променливи, така че реалното количество памет, което може да бъде разпределено за масива, се намира по формулата: 65536-S, където S е количеството на памет, която вече е разпределена за други променливи.

Защо трябва да знаем това? За да не се изненадате, ако по време на компилацията преводачът генерира съобщение за грешка относно декларацията на масив, който е твърде дълъг, когато срещне описание в програмата (правилно по отношение на синтаксиса):

Въведете myArray = масив от цяло число;

Вече знаете, че като се има предвид двубайтното представяне на цели числа, всъщност можете да декларирате масив с броя на елементите, равен на 65536/2 -1 = 32767. И тогава само ако няма други променливи. 2D масивите трябва да имат още по -малки граници на индекса.

Примери за решаване на задачи с двумерни Pascal масиви

задача:Намерете произведението на ненулеви елементи на матрицата.

Решение:

  • За да решим този проблем, се нуждаем от променливи: матрица, състояща се например от целочислени елементи; P е произведението на елементи, различни от 0; I, J - индекси на масива; N, M - броят на редовете и колоните в матрицата.
  • Входните данни са N, M - въведете техните стойности от клавиатурата; матрица - ще подредим входа на матрицата под формата на процедура, ще попълним матрицата по случаен начин, т.е. използвайки функцията random ().
  • Резултатът ще бъде стойността на променливата P (продукт).
  • За да проверите правилността на изпълнението на програмата, е необходимо да изведете матрицата на екрана, за това ще формулираме процедурата за показване на матрицата.
  • Напредък в решаването на проблема:

първо ще обсъдим изпълнението на основната програма, ще обсъдим изпълнението на процедурите малко по-късно:

  • въведете стойностите на N и M;
  • Нека представим двуизмерен Pascal масив, за това се обръщаме към процедурата vvod (a), където a е матрица;
  • Нека отпечатаме получената матрица, за това се позоваваме на процедурата за печат (а);
  • Нека присвоим началната стойност на променливата P = 1;
  • Ще итерираме последователно всички редове на I от 1-ви до N-ти, във всеки ред ще итерираме през всички колони на J от 1-ви до M-ти, за всеки елемент от матрицата ще проверяваме условието: ако a ij ? 0, тогава продуктът P ще се умножи по елемента a ij (P = P * a ij);
  • Нека покажем стойността на произведението на ненулеви матрични елементи - P;

Сега нека поговорим за процедурите.

Коментирайте (важно е!) Параметърът на процедурата може да бъде всяка променлива от предварително дефиниран тип, което означава, че за да се предаде масив като параметър на процедурата, неговият тип трябва да бъде описан предварително. Например:

Тип
Матрица = масив от цяло число;
грунд за процедура (a: матрица);
..............................

Нека се върнем към нашите процедури сега.

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

Процедура vvod (var m: матрица);

За да внедрим вложени цикли в процедура, се нуждаем от локални броячи на променливи, например k и h. Алгоритъмът за запълване на матрица вече беше обсъден, така че няма да го повтаряме.

Процедурата за показване на матрица на екрана се нарича печат, параметърът на процедурата е матрица, но в този случай това е входен параметър, следователно се предава по стойност. Заглавието на тази процедура ще изглежда така:

Процедурен печат (m: матрица);

И отново, за да реализираме вложени цикли в рамките на процедура, се нуждаем от броячи, нека се наричат ​​по същия начин - k и h. Алгоритъмът за показване на матрицата на екрана е описан по -горе, ще използваме това описание.

Примерна програма за двуизмерен Pascal масив

Програмно произведение;
Тип
Матрица = масив от цяло число;
Вар
A: матрица;
N, m, i, j: байт;
P: цяло число;
Процедура vvod (var m: матрица);
Var k, h: байт;
Започнете
За i: = 1 до n do (променливата n за процедурата е глобална, което означава "известен")
За j: = 1 до m do (променливата m за процедурата е глобална, което означава „известен“)
M: = произволен (10);
Край;
Отпечатване на процедурата (m: матрица);
Var k, h: байт;
Започнете
За i: = 1 до n направи
започнете
За j: = 1 до m направи
Пишете (М: 4);
Writeln;
край;
Край;
Започнете (началото на основната програма)
Writeln ("Въведете размерността на матрицата:");
Readln (N, M);
Vvod (а);
Печат (а);
P: = 1;
За i: = 1 до N do
За j: = 1 до M направи
Ако<>0 тогава p: = p * a;
Writeln (p);
Край.

Двуизмерен масивструктура от данни, която съхранява правоъгълна матрица от формата:

А 11 а 12 а 13 а 14 а 15 ... а а 21 а 22 а 23 а 24 а 25 ... а а 31 а 32 а 33 а 34 а 35 ... а а 41 а 42 а 43 а 44 а 45 ... а а 51 а 52 а 53 а 54 а 55 ... а ... ... ... ... ... ... ... а n1а n2а n3а n4а n5... а nm

  • В матрицата всеки елемент се определя от номера на реда и номера на колоната, в пресечната точка на която се намира
  • В Pascal двумерният масив се разглежда като масив, чиито елементи са линейни масиви (масив от масиви). Следващите две описания на двумерни масиви са идентични var mass: масив от масив от реални; var маса: масив от реални;
  • Извиква се матрица, в която броят на редовете е равен на броя на колоните квадратна матрица.
  • За да се обърнете към елемент от матрицата, трябва да използвате два индекса, обозначаващи номера на реда и номера на колоната. Например MyArr1... В този случай елементът на масива (MyArr1) е в четвъртия ред и петата колона.
  • Всичко, което е казано за основните операции с едномерни масиви, важи и за матриците. При итерация над масив в цикъл, променливите от целочисления тип действат като индекси. Традиционно идентификаторът “ i „И колоната е“ й “.
  • Матричната обработка се състои във факта, че първо елементите на първия ред (колона) се разглеждат един по един, след това на втория и така до последния.
  • Ако номерът на реда на елемента е същият като номера на колоната ( i = j), това означава, че елементът лежи върху основен диагонал матрици.
  • Ако елемент лежи на страничния диагонал, тогава индексите са свързани с броя на елементите ( н) чрез следното равенство: i + j = n + 1

Описание на двуизмерен масив

Има няколко начина за деклариране (описание) на двуизмерен масив в Pascal.

Тип масив Предварително описание

тип матрица = масив от цяло число; (масив от цели числа) var mass: matrix;

Дефиниране на променлива като масив без първо да се описва типа на масива

var mass: масив от цяло число;

Инициализация на двуизмерен масив

Когато инициализирате двуизмерни масиви, всеки ред е затворен в допълнителна двойка скоби:

Постоянна маса: масив = ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Въвеждане / извеждане на стойности на елементи от двуизмерен масив

Много често стойностите на елементите на масива се въвеждат от клавиатурата. Този начин на уточняване на информация е твърде трудоемък при работа с големи масиви. За да се отстранят грешки в широк клас алгоритми, такова въвеждане на информация трябва да бъде заменено от произволно генериране на елементи на масива. За да направите това, използвайте процедурата произволнои функция произволен... При работа с двуизмерни масиви се използват вложени цикли (обикновено цикъл с параметъра за).

Попълване на масив с произволни числа

const n = 5; m = 10; var i, j: цяло число; матрица: масив от цяло число; започнете рандомизиране; за i: = 1 до n do (достъп до редовете на масив) за j: = 1 до m do (достъп до поелементни колони) матрица: = произволен (100); (поставяме случайно число от интервала: 4 в текущия елемент); writeln (преход към нов ред при излизане от вътрешния цикъл) край;

Примери за решаване на проблеми

Пример 1

Формулиране на проблема. Дадени са цели положителни числа M и N. Създайте матрица за цяла M × N, в която всички елементи на J-та колона имат стойност 5 · J (J = 1,…, N).

Const m = 7; n = 10; var i, j: байт; матрица: масив от цяло число; start for i: = 1 to m do for j: = 1 to n do матрица: = 5 * j; ... (Изходен масив)

Пример 2

Формулиране на проблема. Дадени са ви положителни цели числа M, N и набор от M числа. Създайте M × N матрица, всяка колона съдържа всички числа от оригиналния набор (в същия ред).

Const m = 5; n = 7; вектор: масив от цяло число = (3, 5, 2, 7, 4); var i, j: байт; матрица: масив от цяло число; begin for j: = 1 to n do (вземете j-тата колона) for i: = 1 to m do (вижте елементите на j-тата колона по редове) матрица: = vector [i]; (изпълнение) ... (Извеждане на получения двуизмерен масив)

Домашна работа

  1. Дадени са положителни числа M и N. Формирайте целочислена матрица с размер M × N, в която всички елементи от I-тия ред имат стойност 10 · I (I = 1, ..., M).
  2. Дадени са ви положителни цели числа M, N и набор от N числа. Създайте матрица M × N, като всеки ред съдържа всички числа от оригиналния набор (в същия ред).
  3. Освен това.Дават ви се цели положителни числа M, N, число D и набор от M числа. Формирайте матрица M × N, в която първата колона съвпада с оригиналния набор от числа, а елементите на всяка следваща колона са равни на сумата от съответния елемент от предишната колона и числото D (в резултат на това всеки ред на матрицата ще съдържа елементи от аритметичната прогресия).
  4. Освен това.Дадена е матрица M × N. Отпечатайте нейните елементи, разположени в редове с четни числа (2, 4,…). Извеждайте елементи ред по ред, не използвайте условния оператор.

Последният урок Pascal беше написан още на 7 март, след което го анализирахме. Днес ще разберем какво представлява двуизмерен масив в паскал, как е описано и какво представлява. Повече подробности по-долу.

И така, какво точно е двуизмерен масив?За по-лесно възприемане, нека си представим едномерен масив като линия, в който всички елементи вървят хоризонтално един след друг, и двуизмерен като квадрат, в който елементите са разположени както хоризонтално, така и вертикално. Двуизмерният масив се състои от редове и колони, наричани още матрица или матричен масив.

Как се описват двумерните масиви?Има няколко начина за писане на двумерни масиви, ще разгледам 2 от тях.

1 начин за описване на масив: масив от типа променливи в масива (цяло число / реално / байт);

2 начин за описване на масив: масив от масив от типа на променливите в масива;

Първо се описват редове (1..m), а след това колони (1..n).

Във втория метод се описва като два едномерни масива, които заедно образуват един двумерен.

Двуизмерен масив може да бъде описан в секцията Тип, за последваща справка с него няколко пъти, или в раздела за описание на променливата Var, искам да обърна вниманието ви върху факта, че вместо m и n, можете да замените числа, или можете да използвате константи.

Пример за дефиниране на двуизмерен масив в секцията за обявяване на променливата:

Съст
m = 100;
n = 100;
вар
a: масив от цяло число;

В този случай посочихме двуизмерен масив a с размери 100 на 100, тоест получихме квадратна матрица.

Пример за дефиниране на матричен масив с помощта на секцията Тип:

Съст
m = 100;
n = 100;
Тип
Матрица = Масив от цяло число;
вар
а: Матрица;
b: Матрица;

Във втория пример посочихме два еднакви матрични масива с размери 100 на 100, докато описвайки b масива, не трябваше да описваме отново неговите размери и тип данни.

Как да получа достъп до променлива клетка на двуизмерен масив?

За да се обърнете към двуизмерен масив, първо трябва да посочите номера на ред и след това номера на колоната, както следва:

x е произволна променлива, a е името на масива, i е номерът на реда, j е номерът на колоната.

Освен това, i и j могат да бъдат както променливи, така и цели числа.

Пример за запис на данни в масив:

За i: = 1 до n do // задайте номера на реда в цикъла
За j: = 1 до m do // присвояване на номера на колоната в цикъла
a: = произволен (100); // присвояване на произволна стойност на клетката с номер на ред i и номер на колона j

Напълнихме масива с произволни числа от 1 до 100.

Примерна програма, използваща двуизмерен масив, в която запълваме масива с произволни числа и го показваме на екрана:

Var // описание на променливи и масив
Матрица: масив от цяло число;
i, j: цяло число;

Започнете // старт на основната програма
writeln ("Двуизмерен масив:"); // Диалог с потребителя

За i: = 1 до 10 направи // запълване на масива
за j: = 1 до 10 do
Матрица: = случаен (100);

За i: = 1 до 10 започвам // Извеждане на масива
за j: = 1 до 10 do
запис (матрица, "");
пишете
writeln ("сайт"); // Ако желаете, можете да изтриете
край; // Край на програмата

// readln // Използва се в Turbo Pascal



Свързани статии: