Ako vytvoriť maticu v pascal abc. 2D polia

Dvojrozmerné pole v jazyku Pascal sa považuje za jednorozmerné pole, ktorého typom prvkov je tiež pole (pole polí). Pozícia prvkov v dvojrozmerných Pascalových poliach je opísaná dvoma indexmi. Môžu byť reprezentované ako obdĺžniková tabuľka alebo matica.

Zvážte dvojrozmerné pole Pascal s rozmermi 3 * 3, to znamená, že bude mať tri riadky a každý riadok bude mať tri prvky:

Každý prvok má svoje vlastné číslo, ako jednorozmerné polia, ale teraz už toto číslo pozostáva z dvoch čísel - čísla riadku, v ktorom sa prvok nachádza, a čísla stĺpca. Číslo prvku je teda určené priesečníkom riadku a stĺpca. Napríklad 21 je prvok v druhom riadku a v prvom stĺpci.

Popis dvojrozmerného poľa Pascal.

Existuje niekoľko spôsobov, ako deklarovať dvojrozmerné pole Pascal.

Už vieme, ako opísať jednorozmerné polia, ktorých prvky môžu byť ľubovoľného typu a následne aj samotné prvky môžu byť poliami. Zvážte nasledujúci popis typov a premenných:

Príklad popisu dvojrozmerného poľa Pascal

typu
Vektor = pole<тип_элементов>;
Matica=pole vektora;
Varm: matrica;

Deklarovali sme dvojrozmerné Pascalovo pole m, pozostávajúce z 10 riadkov, každý s 5 stĺpcami. V tomto prípade je možné pristupovať ku každému i-tému riadku m [i] a každému j-tému prvku vnútri i-tého riadku - m [i, j].

Definície typov pre dvojrozmerné polia Pascal možno zadať aj v jednom riadku:

typu
Matrix = pole poľa< тип элементов >;
alebo ešte jednoduchšie:
typu
matica = pole<тип элементов>;

Prístup k prvkom dvojrozmerného poľa má tvar: M [ i , j ]. To znamená, že chceme získať prvok umiestnený v i -tom riadku a j -tom stĺpci. Hlavnou vecou nie je zamieňať riadky so stĺpcami, inak môžeme opäť získať prístup k neexistujúcemu prvku. Napríklad prístup k prvku M má správny zápis, ale môže spôsobiť chybu v programe.

Základné operácie s 2D poľami Pascal

Všetko, čo bolo povedané o základných operáciách s jednorozmernými poľami, platí aj pre matice. Jedinou akciou, ktorú možno vykonať na celých maticách rovnakého typu, je priradenie. To znamená, že ak máme v programe popísané dve matice rovnakého typu, napr.

typu
matica=pole integer;
var
a, b: matica;

potom počas vykonávania programu je možné priradiť k matici a maticová hodnota b(a:= b). Všetky ostatné operácie sa vykonávajú prvok po prvku a všetky platné operácie, ktoré sú definované pre dátový typ prvkov poľa, možno vykonať s prvkami. To znamená, že ak pole pozostáva z celých čísel, potom s jeho prvkami možno vykonávať operácie definované pre celé čísla, ale ak pole pozostáva zo znakov, potom sú na ne aplikovateľné operácie definované pre prácu so znakmi.

Vstup dvojrozmerného poľa Pascal.

Na sekvenčné zadávanie prvkov jednorozmerného poľa sme použili cyklus for, v ktorom sme menili hodnotu indexu z 1. na poslednú. Ale pozícia prvku v dvojrozmernom Pascalovom poli je určená dvoma indexmi: číslom riadku a číslom stĺpca. To znamená, že budeme musieť postupne meniť číslo riadku od 1. po posledný a v každom riadku iterovať cez prvky stĺpca od 1. po posledný. Potrebujeme teda dve pre slučku a jeden z nich bude vnorený do druhého.

Zvážte príklad zadávania dvojrozmerného poľa Pascal z klávesnice:

Príklad programu na zadávanie dvojrozmerného poľa Pascal z klávesnice

typu
matica=pole integer;
var
a, : matica;
i, j: celé číslo; (indexy poľa)
začať
for i:=1 až 5 urobte (v slučke cez všetky riadky)
readln(a[ i, j]); (zadanie prvku pomocou klávesnice v i-tom riadku a j-tom stĺpci)

Pascalovo dvojrozmerné pole je možné vyplniť náhodne, t.j. použiť náhodnú (N) funkciu a tiež priradiť hodnotu nejakého výrazu každému prvku matice. Spôsob vyplnenia dvojrozmerného poľa Pascal sa volí v závislosti od úlohy, ale v každom prípade musí byť určený každý prvok v každom riadku a každom stĺpci.

Zobrazenie dvojrozmerného poľa Pascal na obrazovke.

Výstup prvkov dvojrozmerného poľa Pascal sa tiež vykonáva postupne, je potrebné vytlačiť prvky každého riadku a každého stĺpca. Zároveň by som chcel, aby sa prvky na rovnakom riadku tlačili vedľa seba, t.j. v rade a prvky stĺpca boli umiestnené pod sebou. Ak to chcete urobiť, vykonajte nasledujúcu postupnosť akcií (vezmite do úvahy fragment programu pre pole opísaný v predchádzajúcom príklade):

Príklad programu na výstup dvojrozmerného poľa Pascal

for i:=1 až 5 urobte (v slučke cez všetky riadky)
začať
for j:=1 až 10 do (Iterácia cez všetky prvky riadka po stĺpcoch)
písať (a [ i , j ]:4); (tlač prvkov v i-tom riadku matice v jednom riadku obrazovky, pričom pre výstup každého prvku sú pridelené 4 pozície)
writeln ; (pred zmenou čísla riadku v matici musíte presunúť kurzor na začiatok nového riadku obrazovky)
koniec ;

Poznámka ( to je dôležité!): veľmi často sa v študentských programoch vyskytne chyba, keď sa o vstup z klávesnice alebo o výstup na obrazovku poľa pokúša takto: readln (a), writeln (a), kde A je premenná poľa. Zároveň sú prekvapení správou zostavovateľa, že premennú tohto typu nemožno prečítať ani vytlačiť. Možno pochopíte, prečo sa to nedá, ak si predstavíte N hrnčekov stojacich v rade a vo vašich rukách napríklad kanvicu s vodou. Dokážete naplniť všetky hrnčeky naraz na príkaz „nalejte vodu“? Bez ohľadu na to, ako veľmi sa snažíte, budete musieť naliať do každého hrnčeka zvlášť. Vypĺňanie a zobrazovanie prvkov poľa musí byť tiež vykonávané postupne a prvok po prvku, pretože v pamäti počítača sú prvky poľa umiestnené v po sebe nasledujúcich bunkách.

Predstavuje 2D Pascal Array v pamäti

Prvky abstraktného poľa v pamäti stroja sú fyzicky usporiadané postupne, ako je opísané. V tomto prípade každý prvok zaberá v pamäti počet bajtov zodpovedajúci jeho veľkosti. Napríklad, ak pole pozostáva z prvkov typu integer , potom každý prvok zaberie dva bajty. A celé pole zaberie S^2 bajtov, kde S je počet prvkov v poli.

A koľko miesta zaberie pole pozostávajúce z polí, t.j. matice? Je zrejmé: S i^Sj, kde Si je počet riadkov a Sj je počet prvkov v každom riadku. Napríklad pre pole typu

Matica = pole integer ;

Vyžaduje sa 12 bajtov pamäte.

Ako budú prvky tohto poľa uložené v pamäti? Zvážte rozloženie poľa M maticového typu v pamäti.

Pre každý prvok M typu integer sú pridelené dve pamäťové bunky. Prideľovanie pamäte sa vykonáva zdola nahor. Prvky sú umiestnené v poradí zmeny indexu, čo zodpovedá schéme vnorenej slučky: najprv sa umiestni prvý riadok, potom druhý, tretí... Vo vnútri riadku idú prvky v poradí: prvý, druhý a tak ďalej.

Ako vieme, prístup k akejkoľvek premennej je možný len vtedy, ak je známa adresa pamäťového miesta, kde je premenná uložená. Špecifická pamäť je pridelená premennej pri načítaní programu, to znamená, že medzi premennou a adresou bunky sa vytvorí vzájomná korešpondencia. Ak by sme ale premennú deklarovali ako pole, tak program „pozná“ adresu začiatku poľa, teda jeho prvého prvku. Aký je prístup ku všetkým ostatným prvkom poľa? Počas reálneho prístupu k pamäťovej bunke, v ktorej je uložený prvok dvojrozmerného poľa, systém vypočítava jeho adresu pomocou vzorca:

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

kde Addr je skutočná počiatočná adresa, na ktorej sa pole nachádza v pamäti; I , J – indexy prvku v dvojrozmernom poli; SizeElem – veľkosť prvku poľa (napríklad dva bajty pre celočíselné prvky); Cols je počet prvkov v rade.

Výraz SizeElem * Cols *(I -1)+ SizeElem *(J -1) sa nazýva posun od začiatku poľa.

Koľko pamäte je alokované pre pole?

Zvážte ani nie tak otázku, koľko pamäte je alokované pre pole (o tom sme hovorili v predchádzajúcej časti), ale aká je maximálna povolená veľkosť poľa vzhľadom na obmedzené množstvo pamäte.

Pamäť je alokovaná na obsluhu programu v segmentoch po 64 KB, pričom aspoň jeden z nich je definovaný ako dátový segment. Práve v tomto segmente sa nachádzajú dáta, ktoré bude program spracovávať. Žiadna premenná programu nemôže byť umiestnená vo viac ako jednom segmente. Preto, aj keď je v segmente len jedna premenná, opísaná ako pole, nemôže prijať viac ako 65536 bajtov. Ale takmer určite, okrem poľa, budú v dátovom segmente popísané aj niektoré ďalšie premenné, takže skutočné množstvo pamäte, ktoré je možné poliu prideliť, sa zistí podľa vzorca: 65536- S , kde S je množstvo pamäť už pridelená pre iné premenné.

Prečo to potrebujeme vedieť? Aby ste neboli prekvapení, ak kompilátor počas kompilácie zobrazí chybové hlásenie o deklarovaní poľa, ktoré je príliš dlhé, keď v programe narazí na popis (správny z hľadiska syntaxe):

Typ myArray= pole integer;

Už viete, že vzhľadom na dvojbajtovú reprezentáciu celých čísel je skutočne možné deklarovať pole s počtom prvkov rovným 65536/2 -1=32767. A potom len vtedy, ak neexistujú žiadne ďalšie premenné. Dvojrozmerné polia musia mať ešte menšie hranice indexu.

Príklady riešenia problémov s dvojrozmernými poľami Pascal

Úloha: Nájdite súčin prvkov nenulovej matice.

Riešenie:

  • Na vyriešenie tohto problému potrebujeme premenné: maticu pozostávajúcu napríklad z celočíselných prvkov; P je súčin prvkov iných ako 0; I , J – indexy poľa; N , M - počet riadkov a stĺpcov v matici.
  • Vstupné údaje sú N, M - ich hodnoty zadáme z klávesnice; matica – zadanie matice usporiadame formou procedúry, maticu vyplníme náhodne, t.j. pomocou funkcie random().
  • Výstupom bude hodnota premennej P (produkt).
  • Na kontrolu správnosti vykonávania programu je potrebné zobraziť maticu na obrazovke, preto vydáme postup na zobrazenie matice.
  • Priebeh riešenia problému:

Poďme najprv diskutovať o vykonaní hlavného programu, o implementácii postupov sa bude diskutovať o niečo neskôr:

  • zavádzame hodnoty N a M ;
  • Zavedieme dvojrozmerné Pascalovo pole, preto sa obrátime na procedúru vvod (a), kde a je matica;
  • Vytlačíme výslednú maticu, obrátime sa na postup tlače (a);
  • Priraďte počiatočnú hodnotu premennej P =1;
  • Postupne prejdeme všetky riadky I od 1. po N-tý, v každom riadku prejdeme všetky stĺpce J od 1. po M-tý, pre každý prvok matice skontrolujeme podmienku: ak a ij ? 0, potom sa súčin P vynásobí prvkom a ij (P = P * a ij);
  • Zobrazme hodnotu súčinu nenulových prvkov matice - P ;

Teraz si povedzme o postupoch.

Komentujte (to je dôležité!) Akákoľvek premenná preddefinovaného typu môže byť parametrom procedúry, čo znamená, že na odovzdanie poľa ako parametra procedúre musí byť jej typ vopred deklarovaný. Napríklad:

typu
Matica=pole integer;
postup primer(a:matrix);
..............................

Vráťme sa teraz k našim postupom.

Vstupná procedúra matice sa nazýva vvod , parameter procedúry je matica a v dôsledku toho musí byť odovzdaný hlavnému programu, preto musí byť parameter odovzdaný odkazom. Potom bude hlavička nášho postupu vyzerať takto:

Postup vvod(var m: matica);

Na implementáciu vnorených slučiek v procedúre potrebujeme lokálne premenné počítadla, ako napríklad k a h . Algoritmus plnenia matice už bol diskutovaný, takže ho nebudeme opakovať.

Procedúra na zobrazenie matice na obrazovke sa nazýva print , parameter procedúry je matica, ale v tomto prípade ide o vstupný parameter, preto sa odovzdáva hodnotou. Hlavička tohto postupu bude vyzerať takto:

print Postup(m:matrix);

A opäť, na implementáciu vnorených slučiek vo vnútri procedúry potrebujeme čítače, nech sa nazývajú rovnako - k a h . Algoritmus na zobrazenie matice na obrazovke bol popísaný vyššie, my použijeme tento popis.

Príklad programu dvojrozmerného poľa Pascal

výroba programov;
typu
Matica=pole integer;
Var
A: matrica;
N, m, i, j: bajt;
P: celé číslo
Postup vvod(var m: matica);
Var k , h: byte ;
Začať
Pre i:=1 až n urobte (premenná n pre procedúru je globálna, a preto „známa“)
Pre j:=1 až m do (premenná m pre procedúru je globálna, čo znamená "známy")
M:= náhodný(10);
koniec;
print Postup(m:matrix);
Vark, h: byte;
Začať
Pre i:=1 až n urobte
začať
Pre j:=1 až m urobte
Napíšte(M:4);
Writeln;
koniec ;
Koniec ;
Začiatok (začiatok hlavného programu)
Writeln ("Zadajte rozmer matice:");
readln(N, M);
vstup(a);
tlačiť(a);
P:=1;
Pre i:=1 až N do
Pre j:=1 až M urobte
Ak<>0 potom p:=p*a;
Writeln(p);
koniec.

Dvojrozmerné pole dátová štruktúra, ktorá ukladá obdĺžnikovú maticu formulára:

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

  • V matici je každý prvok určený číslom riadku a číslom stĺpca, na priesečníku ktorých sa nachádza.
  • V Pascale sa dvojrozmerné pole považuje za pole, ktorého prvky sú lineárne polia(pole polí). Nasledujúce dva opisy dvojrozmerných polí sú identické var mass:array of array of real; var mass:array of real;
  • Zavolá sa matica, v ktorej sa počet riadkov rovná počtu stĺpcov štvorcovú maticu.
  • Ak chcete odkazovať na prvok matice, musíte použiť dva indexy označujúce číslo riadku a číslo stĺpca. Napríklad MyArr1. V tomto prípade je prvok poľa (MyArr1) vo štvrtom riadku a piatom stĺpci.
  • Všetko, čo bolo povedané o základných operáciách s jednorozmernými poľami, platí aj pre matice. Pri iterácii cez pole prvok po prvku v slučke fungujú premenné ako indexy celočíselný typ. Tradične identifikátor „ i “, a stĺpce – “ j “.
  • Spracovanie matice spočíva v tom, že najprv sa postupne zvažujú prvky prvého riadku (stĺpca), potom druhého a tak ďalej až do posledného.
  • Ak sa číslo riadka prvku zhoduje s číslom stĺpca ( i = j), čo znamená, že prvok leží na hlavná uhlopriečka matice.
  • Ak prvok leží na bočnej diagonále, potom indexy súvisia s počtom prvkov ( n) podľa nasledujúcej rovnosti: i + j = n + 1

Popis dvojrozmerného poľa

Existuje niekoľko spôsobov, ako deklarovať (opísať) dvojrozmerné pole v jazyku Pascal.

Predbežný popis typu poľa

typ matica = pole integer; (pole celých čísel) var mass:matrix;

Definovanie premennej ako poľa bez predchádzajúcej deklarácie typu poľa

var mass:array of integer;

Inicializácia dvojrozmerného poľa

Pri inicializácii dvojrozmerných polí je každý riadok uzavretý v ďalšom páre zátvoriek:

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

Vstup/výstup hodnôt prvkov dvojrozmerného poľa

Hodnoty prvkov poľa sa veľmi často zadávajú z klávesnice. Tento spôsob zadávania informácií je príliš časovo náročný pri práci s poľami veľkých rozmerov. Na ladenie širokej triedy algoritmov by sa takéto zadávanie informácií malo nahradiť vytváraním prvkov poľa náhodným spôsobom. Ak to chcete urobiť, použite postup randomizovať a funkciu náhodný. Pri práci s dvojrozmernými poľami sa používajú vnorené slučky (zvyčajne slučka s parametrom pre).

Vyplnenie poľa náhodnými číslami

const n = 5; m = 10; var i, j: celé číslo; matica:pole integer; začať randomizovať; for i:= 1 to n do (prístup k riadkom poľa) for j:= 1 to m do (prvok po prvku prístup k stĺpcom) matica := random(100); (do aktuálneho prvku vložte náhodné číslo z intervalu :4); writeln (skočiť na Nový riadok pri výstupe z vnútornej slučky) koniec;

Príklady riešenia problémov

Príklad 1

Formulácia problému. Dané kladné celé čísla M a N. Vygenerujte celočíselnú maticu veľkosti M × N, v ktorej majú všetky prvky J-tého stĺpca hodnotu 5·J (J = 1, …, N).

Const m = 7; n = 10; var i, j:byte; matica:pole integer; begin for i:= 1 to m do for j:= 1 to n do matrix := 5 * j; ... (výstup poľa)

Príklad 2

Formulácia problému. Dostanete kladné celé čísla M, N a množinu M čísel. Vytvorte maticu M × N, pričom každý stĺpec obsahuje všetky čísla z pôvodnej množiny (v rovnakom poradí).

Const m = 5; n = 7; vector:array of integer = (3, 5, 2, 7, 4); var i, j:byte; matica:pole integer; begin for j:= 1 to n do (vezmite j-tý stĺpec) for i:= 1 to m do (pristupujte k prvkom j-tého stĺpca riadok po riadku) matica := vector[i]; (implementácia) ... (Výstup výsledného dvojrozmerného poľa)

Domáca úloha

  1. Dané kladné celé čísla M a N. Vytvorte celočíselnú maticu M × N so všetkými prvkami 1. riadok majú hodnotu 10 I (I = 1, …, M).
  2. Dostanete kladné celé čísla M, N a množinu N čísel. Vytvorte maticu M × N tak, aby každý riadok obsahoval všetky čísla z pôvodnej množiny (v rovnakom poradí).
  3. Okrem toho. Dostanete kladné celé čísla M, N, číslo D a množinu M čísel. Vytvorte maticu M × N, v ktorej sa prvý stĺpec zhoduje s pôvodnou množinou čísel a prvky každého ďalšieho stĺpca sa rovnajú súčtu zodpovedajúceho prvku predchádzajúceho stĺpca a čísla D (v dôsledku toho každý riadok matice bude obsahovať prvky aritmetickej progresie).
  4. Okrem toho. Daná je matica M × N. Vytlačte jej prvky umiestnené v riadkoch s párnymi číslami (2, 4, ...). Zobrazujte prvky riadok po riadku, nepoužívajte podmienený operátor.

Posledná lekcia Pascalu bola napísaná už 7. marca, potom sme analyzovali . Dnes zistíme, čo je dvojrozmerné pole v pascale ako sa to opisuje a čo to je. Viac podrobností nižšie.

Čo je teda dvojrozmerné pole? Pre ľahké vnímanie si predstavme jednorozmerné pole ako čiaru, v ktorej všetky prvky nasledujú za sebou horizontálne, a dvojrozmerné pole ako štvorec, v ktorom sú prvky umiestnené horizontálne aj vertikálne. Dvojrozmerné pole pozostáva z riadkov a stĺpcov, nazývajú sa tiež maticové alebo maticové pole.

Ako sú opísané dvojrozmerné polia? Existuje niekoľko spôsobov, ako napísať dvojrozmerné polia, zvážim 2 z nich.

1. spôsob opisu poľa: pole typu premenných v poli (celé číslo/skutočný/bajt);

2 spôsob, ako opísať pole: pole poľa typu premenných v poli;

Najprv sú opísané riadky (1..m) a potom stĺpce (1..n).

V druhej metóde sú opísané dve jednorozmerné polia, ktoré spolu tvoria jedno dvojrozmerné pole.

Dvojrozmerné pole môže byť popísané v časti Typ, pre následný prístup k nemu niekoľkokrát, alebo v časti deklarácie premennej Var chcem poznamenať, že namiesto m a n môžete nahradiť čísla alebo môžete použiť konštanty.

Príklad zadania dvojrozmerného poľa v sekcii deklarácie premennej:

Konšt
m = 100;
n = 100;
var
a: Pole celých čísel;

V tomto prípade sme dali dvojrozmerné pole a veľkosti 100 x 100, to znamená, že máme štvorcovú maticu.

Príklad zadania maticového poľa pomocou sekcie Typ:

Konšt
m = 100;
n = 100;
typu
Matica = Pole celých čísel;
var
a:Matrix;
b: Matrix;

V druhom príklade sme zadali dve identické maticové polia s rozmermi 100 x 100, pri popise poľa b sme nemuseli znovu popisovať jeho rozmery a dátový typ.

Ako získať prístup k bunkovej premennej dvojrozmerného poľa?

Ak chcete odkazovať na dvojrozmerné pole, musíte najskôr zadať číslo riadku a potom číslo stĺpca, a to nasledovne:

x je ľubovoľná premenná, a je názov poľa, i je číslo riadku, j je číslo stĺpca.

Okrem toho i a j môžu byť premenné aj celé čísla.

Príklad zápisu údajov do poľa:

Pre i:= 1 až n do //nastavte číslo riadku v slučke
Pre j:=1 až m urobte //nastavenie čísla stĺpca v slučke
a:=random(100); //priradenie náhodnej hodnoty bunke s číslom riadku i a číslom stĺpca j

Pole sme vyplnili náhodnými číslami od 1 do 100.

Príklad programu využívajúci dvojrozmerné pole, v ktorom vyplníme pole náhodnými číslami a vytlačíme ho na obrazovku:

Var // popis premenných a poľa
Matica: Pole celých čísel;
i, j: celé číslo;

Začiatok //začiatok hlavného programu
writeln("dvojrozmerne pole: "); //Dialóg s používateľom

Pre i:= 1 až 10 urob //vyplňte pole
pre j:= 1 až 10 do
Matica:=random(100);

Pre i:= 1 až 10 začnite //Výstupné pole
pre j:= 1 až 10 do
write(matica, " ");
písaťln
writeln("stránka"); // Môžete odstrániť, ak chcete
koniec; // Koniec programu

//readln //používa sa v Turbo Pascal



Načítava...
Hore