Jako v Pascalu si uvědomte matici. Dvourozměrné Pascal Arrays - matice

Poslední lekce Pascal byl napsán 7. března, pak jsme rozebráni. Dnes se naučíme co dvourozměrné pole v PascaluJak je popsáno a to, co reprezentuje. Čtěte dále.

Co je to dvourozměrné pole?Pro světelné vnímání si představíme jednorozměrné pole jako linie a které všechny prvky jdou vodorovně, a dvourozměrné jako čtverec, ve kterých jsou prvky umístěny jak horizontálně, tak vertikálně. Dvourozměrné pole se skládá z čar a sloupců, které se také nazývají matrix nebo matrix pole.

Jak popisují dvojrozměrná pole? Chcete-li psát dvourozměrná pole Existuje několik způsobů, zvážím 2 z nich.

1 Způsob popis pole: Pole typu proměnných v poli (celé číslo / reálné / bajt);

2 Způsob popisování pole: Pole pole typu proměnných v poli;

Nejprve popsat řádky (1..M) a pak sloupce (1..N).

Ve druhé metodě je popsán, jako by byly dva jednorozměrné pole, které společně tvoří jeden dvourozměrný.

Dvourozměrné pole lze popsat v sekci typu pro následné odvolání na něj několikrát nebo v proměnných popisech variable vari, chci věnovat pozornost tomu namísto m a n, můžete nahradit čísla a můžete použít konstanty .

Příklad dvourozměrné úlohy pole v sekci Popis proměnných:

CONST.
m \u003d 100;
n \u003d 100;
var.
A: Pole celého čísla;

V tomto případě jsme nastavili dvourozměrnou řadu velikosti 100 na 100, tj. Máme čtvercovou matici.

Příkladem úkolu matice pomocí sekce typu:

CONST.
m \u003d 100;
n \u003d 100;
Typ
Matice \u003d pole celého čísla;
var.
A: MATRIX;
B: Matice;

Ve druhém příkladu stanovujeme dva identické matrixové pole s rozměry 100 na 100, při popisu pole B, jsme nemuseli znovu popsat jeho velikost a datový typ znovu.

Jak přistupovat k buněčné proměnné dvojrozměrnému poli?

Chcete-li se obrátit na dvojrozměrné pole, musíte nejprve zadat číslo čísla a pak číslo sloupce takto:

x-libovolná proměnná, název pole, řádek I-číslo, číslo j - číslo sloupce.

Navíc I a J mohou být oba proměnné a celá čísla.

Příklad zápisu dat do pole:

Pro I: \u003d 1 až n do // úkol v řádkové smyčce
Pro J: \u003d 1 až M do // úkol v cyklu čísla sloupce
A: \u003d náhodný (100); // přiřazení čísla buněk i a náhodné číslo sloupce

Vyplní jsme pole náhodnými čísly od 1 do 100.

Příklad programu pomocí dvourozměrné pole, ve kterém vyplníme pole náhodných čísel a zobrazí se na obrazovce:

Var // popis proměnných a pole
MATRIX: Pole celého čísla;
Já, J: Integer;

Začněte / / Hlavní program
Writeln ("dvojrozměrné pole:"); // dialog s uživatelem

Pro I: \u003d 1 až 10 do // vyplnění pole
Pro j: \u003d 1 až 10 dělat
Matice: \u003d náhodné (100);

Pro I: \u003d 1 až 10 do začátek // výstup pole
Pro j: \u003d 1 až 10 dělat
Zápis (matrice, ");
Writeln.
Writeln ("místo"); // Pokud chcete, můžete smazat
konec; // konec programu

// readln // slouží k turbo pascal

Dvourozměrné pole v Pascalu je interpretováno jako jednorozměrné pole, typ prvků je také pole (pole pole). Poloha prvků v dvourozměrných pascalových polích je popsána dvěma indexy. Mohou být reprezentovány jako obdélníkový stůl nebo matrice.

Zvažte dvojrozměrné pole Pascalu s rozměrem 3 * 3, to znamená, že to bude tři řádky a v každém řádku tři položky:

Každý prvek má své vlastní číslo, jako jednorozměrné pole, ale nyní se číslo již skládá ze dvou čísel - čísla čar, ve kterých je prvek umístěn, a číslo sloupce. Číslo prvku je tedy určeno křížením řetězce a sloupce. Například, 21 je prvek stojící ve druhém řádku a v prvním sloupci.

Popis dvourozměrného masivu Pascal.

Existuje několik způsobů, jak vyhlásit dvourozměrný masiv Pascal.

Již víme, jak popsat jednorozměrné pole, jejichž prvky mohou mít jakýkoliv typ, a proto mohou být prvky samotné pole. Zvažte následující popis typů a proměnných:

Příklad popisu dvourozměrného masivu Pascal

Typ
Vector \u003d Array of<тип_элементов>;
Matrix \u003d pole vektor;
Var m: matrice;

Prohlásili jsme dvourozměrnou řadu Pascal M, skládající se z 10 řádků, v každém z nich 5 sloupců. V tomto případě, m [i] lze přistupovat k každému i (i], a každý j je prvek uvnitř i-tého řádku - m [i, j].

Definice typů pro dvojrozměrné Pascal Arrays lze také nastavit v jednom řádku:

Typ
Matrix \u003d pole řady< тип элементов >;
nebo dokonce jednodušší:
Typ
Matrix \u003d pole<тип элементов>;

Odvolání na prvky dvourozměrné pole má formu: m [i, j]. To znamená, že chceme získat prvek umístěný v řadě I-R a J1. Zde hlavní věc není zaměňovat řádky s sloupy, jinak můžeme opět získat odvolání na neexistující prvek. Například odvolání na prvek M má správný vstupní formulář, ale může způsobit chybu v programu.

Základní akce s dvojrozměrnými masožkami Pascalu

Vše, co bylo řečeno o základních opatřeních s jednorozměrnými policemi, je spravedlivé jak pro matice. Jediná akce, která může být prováděna přes stejné matrice typu, je přiřazení. Ti, pokud máme dvě matrice jednoho typu v programu, například

typ
Matice \u003d pole celého čísla;
var.
A, B: MATRIX;

pak během provádění programu můžete přiřadit matici a. Hodnota matice b. (A: \u003d b). Všechny ostatní akce jsou prováděny střídavě se všemi přípustnými operacemi, které jsou definovány pro datový typ prvků pole. To znamená, že pokud se pole skládá z celých čísel, operace definované pro celá čísla lze provádět nad jeho prvky, pokud se pole skládá z znaků, operace definované pro práci se symboly jsou pro ně použitelné.

Zadejte dvourozměrný masiv Pascal.

Pro sekvenční vstup prvků jednorozměrné pole jsme použili cyklus pro cyklus, který změnil hodnotu indexu od 1. k druhé. Poloha prvku v dvourozměrném masivu Pascalu je však určena dvěma indexy: číslo řádku a číslo sloupce. To znamená, že budeme muset důsledně změnit počet řádků od 1. do posledního a v každém řádku, abyste vyřešili prvky sloupců od 1. do druhé. Takže budeme potřebovat dva pro cykly a jeden z nich bude investován do jiného.

Zvažte příklad zadávání dvourozměrného masivu Pascal z klávesnice:

Příklad vstupního programu dvourozměrného masivu Pascal z klávesnice

typ
Matice \u003d pole celého čísla;
var.
A:: matice;
Já, J: Integer; (Indexy pole)
Začít.
Pro I: \u003d 1 až 5 do (cyklus pro busta všech řádků)
readln (a [i, j]); (vstup z prvku klávesnice v řádku I-R a J1.

Dvourozměrný Pascal Array lze naplnit náhodně, tj. Použijte náhodnou (n) funkci, stejně jako přiřadit hodnotu určitého výrazu každému prvku matice. Metoda vyplnění dvourozměrnému Pascal Array je vybrána v závislosti na sadě úloh, ale v každém případě by měl být každý prvek definován v každém řádku a každém sloupci.

Výstup dvourozměrných masivů Pascal na obrazovce.

Výstup prvků dvourozměrného masivu Pascal se provádí také v sérii, je nutné tisknout položky každého řádku a každý sloupec. Současně bych chtěl prvky, které stojí v jednom řádku, tištěné v blízkosti, tj. V řetězci a prvky sloupu byly umístěny pod druhým. Chcete-li to provést, musíte provést následující posloupnost akcí (zvažte fragment programu pro pole popsané v předchozím příkladu):

Příklad výstupního programu dvourozměrného masivu Pascal

pro I: \u003d 1 až 5 do (cyklus pro busta všech řádků)
Začít.
Pro j: \u003d 1 až 10 do (poprsí všechny prvky řetězce na sloupcích)
Psát (a [i, j]: 4); (Tiskové prvky v I-th řadě matice v jednom řádku na obrazovce a 4 poloh jsou uvedeny výstupu každého prvku)
Writeln; (Před změnou počtu řádku v matici musíte přeložit kurzor na začátek nového řádku obrazovky)
konec;

Komentář ( to je důležité!): Velmi často v programech studentů se vyskytují chybu při zadávání klávesnice nebo výstupu na obrazovku pole se pokouší následovně: Readln (A), Writeln (A), kde ale - tohle je typová proměnná pole. Zároveň jsou překvapeni zprávou kompilátoru, že proměnná tohoto typu nelze zvážit nebo vytisknout. Možná pochopíte, proč to nemůže být provedeno, pokud budete prezentovat N hrnky stojící v řadě, a ve vašich rukou, například konvice s vodou. Můžete na tým "voda" naplnit všechny kruhy najednou? Bez ohledu na to, jak těžké se snažíte, ale v každém hrnku budete muset nalít odděleně. Plnění a výstup na obrazovku prvků pole musí být také prováděno postupně a elementálně, protože V paměti počítače jsou prvky pole umístěny v po sobě jdoucích buňkách.

Prezentace dvourozměrného masivu Pascal v paměti

Prvky abstraktního pole v paměti stroje jsou fyzicky umístěny postupně podle popisu. V tomto případě každý prvek vezme paměť počet bytů odpovídajících jeho velikosti. Pokud například pole sestává z celočíselných prvků, pak každý prvek zabírá dva bajty. A celá pole bude trvat S ^ 2 bajty, kde s je počet prvků v poli.

A kolik místa nastane pole, skládající se z polí, tj. matrice? Samozřejmě: S i ^ s J, kde je počet řádků, a s J je počet položek v každém řádku. Například pro řadu typu

Matice \u003d pole celého čísla;

bude trvat 12 paměťových bajtů.

Jak budou prvky tohoto pole umístěny v paměti? Zvažte matrix matrix pole v paměti.

Pod každým prvkem M typu Type jsou zvýrazněny dvě paměťové buňky. Ubytování v paměti se provádí "zdola nahoru". Prvky jsou umístěny v pořadí změny indexu, což odpovídá schématu připojených cyklů: Za prvé, první řádek je umístěn, pak druhá, třetí ... uvnitř čáry jsou prvky: první, druhý , atd.

Jak víme, přístup k libovolné proměnné je možné pouze v případě, že adresa paměťové buňky je známa, ve které je proměnná uložena. Zvláštní paměť je přidělena pro proměnnou při načítání programu, tj. Sada vzájemná korespondence mezi proměnnou a adresou buněk je nastavena. Pokud však deklarovali proměnnou jako pole, program "ví" Adresa začátku pole, to znamená, že jeho první prvek. Jak se koná přístup ke všem ostatním prvkům pole? S reálným přístupem k paměťové buňce, ve kterém je uložen prvek dvourozměrné pole, systém vypočítá svou adresu podle vzorce:

Addr + sizelem * cols * (i -1) + sizelem * (j -1),

kde addr je skutečná počáteční adresa, pomocí které je pole umístěno v paměti; I, J - indexy prvků v dvourozměrném poli; SizeLem - velikost prvku pole (například dva bajty pro celočíselné prvky); Cols - počet položek v řadě.

Výraz SizeLem * Cols * (I -1) + SizeLem * (J -1) se nazývá posunutí vzhledem k začátku pole.

Kolik paměti je přiděleno pro pole?

Zvažte ne tak moc otázka, kolik paměti je přiděleno pro pole (demontované v předchozí části), ale o tom, co je maximální přípustná velikost pole, vzhledem k omezenému množství paměti.

Chcete-li pracovat program, paměť je přidělena segmenty 64 kb, alespoň jeden z nich je definován jako datový segment. Zde v tomto segmentu a existují data, která bude program zpracovat. Žádný variabilní program může být umístěn ve více než jednom segmentu. Proto, i když pouze jedna proměnná popsaná jako pole je umístěna v segmentu, nebude moci získat více než 65536 bajtů. Ale téměř jistě, kromě pole v datovém segmentu, některé další proměnné budou popsány, takže skutečné množství paměti, které lze vybrat pro pole, je ve vzorci: 65536- s, kde je množství paměti, která je již vybrána pro jiné proměnné.

Proč to potřebujeme vědět? Aby nedošlo k překvapení, pokud překladatel poskytne chybové hlášení pro prohlášení o příliš dlouhém poli, když program přijde do programu (správný z hlediska syntaxe):

Zadejte myarray \u003d pole celého čísla;

Už víte, že vzhledem k dvoubajtovému reprezentaci celých čísel je realistické vyhlásit pole s počtem prvků rovných 65536/2 -1 \u003d 32767. A pak pouze v případě, že nejsou žádné jiné proměnné. Dvourozměrná pole by měla mít ještě menší mezní hranice indexu.

Příklady řešení problémů s dvojrozměrnými policemi Pascal

Úkol: Najít produkt nenulových prvků matrice.

Rozhodnutí:

  • Pro vyřešení tohoto úkolu budeme potřebovat proměnné: matrici, skládající se například z celočíselných prvků; P je produkt prvků než 0; I, J - indexy Array; N, m - počet řádků a sloupců v matrici.
  • Vstupní data jsou n, m - jejich hodnoty zadávají z klávesnice; Matrix - vstup do matice pro vydání ve formě procedury, vyplnění matice náhodně, tj. Pomocí funkce náhodné ().
  • Výstup bude hodnota proměnné P (práce).
  • Chcete-li zkontrolovat správnost programu, je nutné provést matici na obrazovku, pro tento problém výstupní postup matice.
  • Problém Řešení Postup:

nejprve budeme diskutovat o plnění hlavního programu, budeme o málo později diskutovat o realizaci postupů:

  • zavedeme hodnoty n a m;
  • Představujeme dvourozměrný masiv Pascal, pro to apelovat na postup Vvod (A), kde A - matice;
  • Vytisknout výslednou matici, pro to apelovat na tiskový postup (A);
  • Počáteční hodnotu proměnné P \u003d 1 přiřadíme;
  • Budeme postupně vyřešit všechny řady I od 1. do n., V každém řádku se vyřešíme všechny sloupy J od 1. do M -to, pro každý prvek matice zkontrolujeme stav: pokud iJ? 0, pak se produkt p je sloučit do prvku IJ (P \u003d P * IJ);
  • Stáhnout hodnotu produktu nenulových prvků matrice - p;

A teď se promluvme o postupech.

Komentář (to je důležité!) Parametr postupu může být jakákoliv proměnná předem určeného typu, což znamená, že pro přenos do postupu pole jako parametr musí být popsán předem. Například:

Typ
Matice \u003d pole celého čísla;
Postup Primer (A: Matice);
..............................

Vraťme se nyní na naše postupy.

Postup vstupu matrice se nazývá VVOD, parametr postupu je matrice, a mělo by být v důsledku toho převeden do základního programu, musí být parametr přenášen odkazem. Pak bude vypadat název našeho řízení:

POSTUP VVOD (VAR M: MATRIX);

Chcete-li implementovat vnořené cykly v postupu, potřebujeme lokální proměnné, například k a h. Algoritmus plnění matrice již bylo diskutováno, takže to nebudeme opakovat.

Postup pro výstup matice na obrazovce se nazývá tisk, parametr postupu je matrice, ale v tomto případě je to vstupní parametr, je tedy přenášen hodnotou. Název tohoto postupu bude vypadat takto:

Postup vytisknutí (M matice);

A znovu, pro implementaci vnořených cyklů v rámci postupu budeme potřebovat čítače, nechte je odkazovat na stejný - k a h. Algoritmus pro výstup matice na obrazovce byl popsán výše, používáme tento popis.

Příklad programu dvourozměrných řady Pascalu

Program Proizvedenie;
Typ
Matice \u003d pole celého čísla;
Var.
A: MATRIX;
N, m, i, j: bajt;
P: celé číslo;
POSTUP VVOD (VAR M: MATRIX);
Var k, h: bajt;
Začít.
Pro I: \u003d 1 až n Do (proměnná n pro postup je globální, a proto "známý")
Pro j: \u003d 1 až m do (m proměnná pro postup je globální, a proto "známá")
M: \u003d náhodný (10);
Konec;
Postup vytisknutí (M matice);
Var k, h: bajt;
Začít.
Pro I: \u003d 1 až n
Začít.
Pro j: \u003d 1 až m doo
Zápis (m: 4);
Writeln;
konec;
Konec;
Začněte (hlavní programový program)
Writeln ("Zadejte rozměr matice:");
Readln (n, m);
Vvod (a);
Tisk (a);
P: \u003d 1;
Pro I: \u003d 1 až n
Pro j: \u003d 1 až m doo
POKUD.<>0 pak p: \u003d p * a;
Writeln (p);
Konec.

Dvourozměrné pole Datová struktura Uložení obdélníkové matice formy:

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. ... ... ... ... ... ... ... ... n1. A. n2. A. n3. A. n4. A. n5. ... A. nm.

  • V matrici je každý prvek určen číslem čáry a počtem sloupce, na křižovatce, jehož je to
  • V Pascalu se dvojrozměrné pole zkoumá jako pole, jejichž prvky jsou lineární pole (pole polí). Následující dva popisy dvourozměrných polí jsou identické vAR MASS: Pole řady reálných; Var hmot: řada skutečných;
  • Matice, ve které se počet řádků rovná počtu sloupců, se nazývá Čtvercová matice.
  • Chcete-li se obrátit na prvek MATRIX, musíte použít dva indexy označující číslo řádku a číslo sloupce. například Myarrr1. V tento případ Prvek pole (myarr1) je ve čtvrtém řádku a pátém sloupci.
  • Vše, co bylo řečeno o základních opatřeních s jednorozměrnými policemi, je spravedlivé jak pro matice. S razítkem Masiva v cyklu, proměnné celočíselného typu působí jako indexy. Tradičně se identifikátor "používá k označení indexu linky. i. I. "A sloupec -" j. “.
  • Zpracování matice je, že prvky prvního řádku (sloupce) jsou poprvé považovány za první, pak druhý atd. Dokud takto.
  • Pokud se řadový řádek prvku shoduje s číslem sloupce ( i \u003d j.) To znamená, že prvek leží hlavní diagonála Matice.
  • Pokud je prvek spočívá na úhlopříčce boku, indexy jsou spojeny s počtem prvků ( n.) Následující rovnost: i + J \u003d n + 1

Popis dvourozměrných polí

Existuje několik způsobů, jak reklamy (popisy) dvourozměrných polí v Pascalu.

Předchozí popis typu pole

Typ matrix \u003d pole celého čísla; (Masiv celých čísel) varu varu: matrice;

Definice proměnné jako pole bez předběžného popisu typu pole

Var Mass: Pole celého čísla;

Inicializace dvourozměrných polí

Při inicializaci dvourozměrných polích je každý řetězec další dvojici kulatých závorek:

CONST hmota: pole \u003d ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Vstup / výstup hodnot prvků dvourozměrných polí

Velmi často jsou hodnoty prvků pole zadány z klávesnice. Tento způsob nastavení informací je příliš časově náročný při práci s poli. velké velikosti. Chcete-li ladit širokou třídu algoritmů, by měl být takový informační záznam nahrazen tvorbou prvků řady náhodně. Chcete-li to provést, použijte postup randomize. a funkce náhodný. Při práci s dvojrozměrnými policemi se používají vnořené cykly (obvykle cyklu s parametrem pro).

Vyplnění pole náhodná čísla

const n \u003d 5; m \u003d 10; VAR I, J: Integer; MATRIX: Pole celého čísla; Začít randomizovat; Pro I: \u003d 1 až N Do (řádky pole) pro J: \u003d 1 až M Do (přidání prvku do sloupců) Matice: \u003d náhodné (100); (Umístíme v aktuálním prvku náhodné číslo z intervalu: 4); Writeln (přepnutí na nový řádek na výstup z vnitřního cyklu) konec;

Příklady řešení problémů

Příklad 1.

Formulace problému. Jsou uvedeny průměrné kladná čísla m a n. Pro vytvoření celočíselné matrice velikosti m × n, ve které mají všechny prvky sloupce J-th hodnotu 5 · J (J \u003d 1, ..., n).

CONST M \u003d 7; n \u003d 10; Var i, j: bajt; MATRIX: Pole celého čísla; Začněte pro I: \u003d 1 až M DO pro J: \u003d 1 až n Matice: \u003d 5 * J; ... (výstup pole)

Příklad 2.

Formulace problému. Průměrná kladná čísla m, n a sada čísel M jsou uvedeny. Pro vytvoření matice velikosti m × n, ve které každý sloupec obsahuje všechna čísla ze zdrojové vytáčení (ve stejném pořadí).

CONST M \u003d 5; n \u003d 7; Vektor: Pole celého čísla \u003d (3, 5, 2, 7, 4); Var i, j: bajt; MATRIX: Pole celého čísla; Začněte pro J: \u003d 1 až n Do (vezmeme jth sloupec) pro i: \u003d 1 až m do (řeší prvky j-tého sloupce na řetězcích) matrice: \u003d vektor [i]; (implementace) (s výstupem výsledného dvourozměrného pole)

Domácí práce

  1. Jsou uvedeny průměrné kladná čísla m a n. Pro vytvoření celočíselné matrice velikosti m × n, které všechny prvky Hodil jsem Mají hodnotu 10 · i (i \u003d 1, ..., m).
  2. Průměrná kladná čísla m, n a sada n číslů jsou uvedeny. Pro vytvoření matice velikosti m × n, ve které každý řádek obsahuje všechna čísla ze zdrojové vytáčení (ve stejném pořadí).
  3. Dodatečně.Průměrná kladná čísla m, n, číslo D a sada čísel M jsou uvedeny. Pro vytvoření matice velikosti m × n, ve které se první sloupec shoduje se zdrojovou sadou čísel a prvky každého dalšího sloupce se rovnou součtem odpovídajícího prvku předchozího sloupce a číslem D (jako Výsledkem, každý řádek matice bude obsahovat prvky aritmetického progrese).
  4. Dodatečně.Matice velikosti m × n je uvedena. Zobrazení jeho prvků umístěných v řádcích s rovnoměrnými čísly (2, 4, ...). Výstup prvků je vyroben liniemi, podmíněný provozovatel nepoužívá.