Ca și în Pascal, realizați matricea. Rețea pascală bidimensională - Matrice

Ultima lecție Pascal a fost scrisă pe 7 martie, apoi am dezasamblat. Astăzi aflăm ce array bidimensională în PascalCum este descris și ceea ce reprezintă el. Citiți mai mult.

Deci, ce este o matrice bidimensională?Pentru percepția luminii, ne vom imagina o matrice unidimensională ca o linie și care toate elementele merg orizontal și bidimensionale ca un pătrat, în care elementele sunt situate atât orizontal, cât și vertical. Matricea bidimensională constă din linii și coloane, ele sunt numite și matrice sau matrice.

Cum descriu matricele bidimensionale? Pentru a scrie o matrice bidimensionale există mai multe moduri, voi lua în considerare 2 dintre ele.

1 Descrierea metodei matricei: Gama de tipuri de variabile din matrice (Integer / Real / Byte);

2 Metodă pentru descrierea matricei: gama de matrice de tip de variabile din matrice;

Mai întâi descriu liniile (1..m), și apoi coloane (1..n).

În cea de-a doua metodă, este descrisă ca două mastere unidimensionale, care împreună formează una bidimensională.

O matrice bidimensională poate fi descrisă în secțiunea de tip pentru recursul ulterior la acesta de mai multe ori sau în descrierile variabile ale variatului, vreau să fiu atenția la acest lucru în loc de M și N, puteți înlocui numerele și puteți utiliza constantele .

Un exemplu de loc de muncă bidimensional în secțiunea Descrieri variabile:

Const.
m \u003d 100;
n \u003d 100;
var.
A: Gama de integrați;

În acest caz, am stabilit o gamă bidimensională de dimensiune de 100 la 100, adică avem o matrice pătrată.

Un exemplu de sarcină a matricei matrice utilizând secțiunea de tip:

Const.
m \u003d 100;
n \u003d 100;
Tip
Matrix \u003d matrice de integer;
var.
R: Matrix;
B: matrice;

În cel de-al doilea exemplu, am stabilit două matrice identice cu dimensiuni 100 la 100, când descriem arrayul B, nu trebuia să descriem din nou dimensiunea și tipul de date.

Cum să accesați matricea cu două dimensiuni variabile de celule?

Pentru a se referi la o matrice bidimensională, trebuie să specificați mai întâi numărul numărului și apoi numărul coloanei după cum urmează:

x-orice variabilă, nume de matrice, numărul I-I, J - numărul coloanei.

Mai mult, I și J pot fi ambele variabile și numere întregi.

Un exemplu de scriere a datelor către o matrice:

Pentru i: \u003d 1 la n do / // sarcină în bucla de linie
Pentru J: \u003d 1 până la MO // sarcină în ciclul numărului de coloane
A: \u003d Random (100); // atribuirea unui număr de celule I și un număr ale lumii aleatorie

Am umplut cu o matrice de numere aleatorii de la 1 la 100.

Un exemplu de program care utilizează o matrice bidimensională în care completăm o serie de numere aleatorii și afișați-o pe ecran:

Var // descrierea variabilelor și matricei
Matrix: Gama de integrați;
I, J: Integer;

Începe // Programul Home
Writeln ("matrice bidimensionale:"); // dialog cu utilizatorul

Pentru i: \u003d 1 până la 10 do // umple o matrice
Pentru J: \u003d 1 până la 10 face
Matrix: \u003d Random (100);

Pentru i: \u003d 1 până la 10 începe // ieșirea matricei
Pentru J: \u003d 1 până la 10 face
Scrieți (Matrix, "");
Writeln.
Scrieln ("Site"); // Dacă doriți, puteți șterge
Sfârșit; // sfârșitul programului

// readln // folosit pentru turbo pascal

O matrice bidimensională din Pascal este interpretată ca o matrice unidimensională, tipul elementelor este, de asemenea, o matrice (matrice de matrice). Poziția elementelor din matricele pascale bidimensionale este descrisă de doi indici. Ele pot fi reprezentate ca o masă dreptunghiulară sau matrice.

Luați în considerare o gamă bidimensională de Pascal cu o dimensiune de 3 * 3, adică va fi trei linii și în fiecare linie trei elemente:

Fiecare element are un număr propriu, ca o matrice unic dimensionale, dar acum numărul este deja format din două numere - numerele de linie în care elementul este localizat și numărul coloanei. Astfel, numărul elementului este determinat de trecerea șirului și a coloanei. De exemplu, un 21 este un element care stă în a doua linie și în prima coloană.

Descrierea masivului bidimensional din Pascal.

Există mai multe modalități de a decide masivul bidimensional al lui Pascal.

Știm deja cum să descriem matricele unic dimensionale, elementele care pot avea orice tip și, prin urmare, elementele în sine pot fi matrice. Luați în considerare următoarea descriere a tipurilor și a variabilelor:

Un exemplu de descriere a masivului bidimensional al Pascalului

Tip
Vector \u003d matrice de<тип_элементов>;
Matrix \u003d Gama de vector;
Var m: matrice;

Am declarat o gamă bidimensională de Pascal M, constând din 10 linii, în fiecare dintre care 5 coloane. În acest caz, m [i] poate fi accesat la fiecare i (i], iar fiecare J este elementul din rândul I - M [I, J].

Definiția tipurilor pentru matricele tridimensionale Pascal poate fi, de asemenea, setată într-o singură linie:

Tip
Matrix \u003d Array de matrice de< тип элементов >;
sau chiar mai ușor:
Tip
Matrix \u003d Array of<тип элементов>;

Apelul la elementele matricei bidimensionale are forma: M [I, J]. Aceasta înseamnă că dorim să obținem un element situat în rândul I-R și în coloana J. Aici, principalul lucru nu este de a confunda rândurile cu coloanele, altfel putem obține din nou un apel la un element inexistent. De exemplu, un apel la elementul M are forma corectă de intrare, dar poate provoca o eroare în program.

Acțiuni de bază cu masifice bidimensionale din Pascal

Tot ceea ce sa spus despre acțiunile de bază cu matrice unidimensionale este corect atât pentru matrice. Singura acțiune care poate fi efectuată peste aceleași matrici de tip este cesiunea. Aceștia, dacă avem două matrice de un tip în program, de exemplu,

tip
Matrix \u003d matrice de integer;
Var.
A, B: Matrix;

apoi, în timpul executării programului, puteți atribui o matrice a. Valoarea matricei b. (A: \u003d B). Toate celelalte acțiuni sunt efectuate alternativ, cu toate operațiile admise, care sunt definite pentru tipul de date al elementelor de matrice. Aceasta înseamnă că, dacă o matrice constă din numere întregi, operațiile definite pentru numere întregi pot fi efectuate deasupra elementelor sale, în cazul în care matricea constă din caractere, operațiunile definite să funcționeze cu simboluri sunt aplicabile acestora.

Introduceți Massif Pascal bidimensional.

Pentru introducerea secvențială a elementelor de matrice unic, am folosit ciclul, ceea ce a schimbat valoarea indicelui de la 1 la acesta din urmă. Dar poziția elementului în massivul bidimensional din Pascal este determinată de doi indici: numărul liniei și numărul coloanei. Aceasta înseamnă că va trebui să schimbăm în mod constant numărul liniei de la 1 la ultima și în fiecare linie pentru a rezolva elementele coloanelor de la 1 la acesta din urmă. Deci, vom avea nevoie de două pentru cicluri, iar unul dintre ei va fi investit în altul.

Luați în considerare un exemplu de introducere a unui masiv bidimensional Pascal de la tastatură:

Exemplu de program de intrare al masivului bidimensional al Pascalului din tastatură

tip
Matrix \u003d matrice de integer;
Var.
A, Matrix;
I, J: Integer; (indexuri de matrice)
Începe.
Pentru i: \u003d 1 până la 5 fac (ciclu pentru bustul tuturor liniilor)
READLN (A [I, J]); (Introduceți din elementul de tastatură din rândul I-R și J-coloana)

O matrice tridimensională Pascal poate fi umplută la întâmplare, adică Utilizați funcția Random (N), precum și atribuiți o valoare a unei anumite expresii fiecărui element de matrice. Metoda de completare a unei matrice pascale bidimensionale este selectată în funcție de setul de sarcini, dar în orice caz, fiecare element trebuie definit în fiecare rând și fiecare coloană.

Ieșirea unui masiv tridimensional Pascal pe ecran.

Ieșirea elementelor masivului bidimensional din Pascal este de asemenea efectuată în serie, este necesară imprimarea elementelor fiecărui rând și a fiecărei coloane. În același timp, aș dori elementele care stau într-o singură linie, tipărite în apropiere, adică. În șir, și elementele coloanei au fost localizate de sub cealaltă. Pentru a face acest lucru, trebuie să efectuați următoarea secvență de acțiuni (luați în considerare un fragment al programului pentru matricea descrisă în exemplul anterior):

Exemplu de program de ieșire al masivului bidimensional al lui Pascal

pentru i: \u003d 1 până la 5 fac (ciclu pentru bustul tuturor liniilor)
Începe.
Pentru J: \u003d 1 până la 10 face (bust toate elementele de șir pe coloane)
Scrieți (A [I, J]: 4); (Elemente de imprimare în rândul I al matricei într-un rând pe ecran și 4 poziții sunt date la ieșirea fiecărui element)
Writeln; (Înainte de a schimba numărul liniei din matrice, trebuie să traduceți cursorul la începutul noului rând de ecran)
Sfârșit;

Cometariu ( este important!): Foarte adesea în programele studenților se întâlnesc cu o eroare la introducerea tastaturii sau ieșirea pe ecranul de matrice încearcă după cum urmează: Readln (A), Scrideln (A), unde dar - aceasta este tip variabilă Array. În același timp, ele sunt surprinse de mesajul compilator că variabila de acest tip nu poate fi luată în considerare sau tipărită. Poate veți înțelege de ce nu se poate face acest lucru dacă prezentați cani n stâlpi într-un rând și în mâinile voastre, de exemplu, un fierbător cu apă. Puteți să vă aflați în echipă "Apa" umpleți toate cercurile simultan? Indiferent cât de greu încerci, dar în fiecare cană va trebui să se toarnă separat. Umplerea și ieșirea pe ecranul elementelor matricei trebuie, de asemenea, efectuate secvențial și elemental, deoarece În memoria calculatorului, elementele matricei sunt situate în celule consecutive.

Prezentarea unui masiv bidimensional de Pascal în memorie

Elementele matricei abstracte în memoria mașinii sunt localizate fizic secvențial, conform descrierii. În acest caz, fiecare element ia în memorie numărul de octeți care corespund dimensiunii sale. De exemplu, dacă o matrice constă din elemente întregi, atunci fiecare element va ocupa doi octeți. Iar întreaga matrice va lua bytes S ^ 2, unde este numărul de elemente din matrice.

Și cât de mult spațiu va avea loc matrice, constând din matrice, adică. Matricea? Evident,: S i ^ s j, unde sunt numărul de rânduri și s j este numărul de articole din fiecare rând. De exemplu, pentru o gamă de tipuri

Matrix \u003d matrice de integer;

va dura 12 octeți de memorie.

Cum vor fi localizați elementele acestei mastere în memorie? Luați în considerare matricea matricei în memorie.

Sub fiecare element M tip Integer, sunt evidențiate două celule de memorie. Cazarea în memorie se efectuează "partea de jos în sus". Elementele sunt plasate în ordinea schimbării indicelui, care corespunde schemei ciclurilor atașate: În primul rând, prima linie este plasată, apoi a doua, a treia ... în interiorul liniei sunt elementele: primul, al doilea , etc.

După cum știm, accesul la orice variabilă este posibilă numai dacă se cunoaște adresa celulei de memorie în care variabila este stocată. Memoria specifică este alocată pentru o variabilă la încărcarea unui program, adică o corespondență reciprocă între variabila și adresa celulară. Dar dacă am declarat o variabilă ca o matrice, programul "știe" adresa începutului matricei, adică primul său element. Cum are loc accesul la toate celelalte elemente ale matricei? Cu acces real la celula de memorie, în care este stocat elementul matricei bidimensionale, sistemul calculează adresa acestuia prin formula:

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

unde AddR este adresa inițială reală prin care matricea este localizată în memorie; I, indicii J - elemente într-o matrice bidimensională; SizeLeLem - dimensiunea unui element de matrice (de exemplu, doi octeți pentru elemente întregi); Cols - numărul de articole din rând.

Dimensiunea expresiei * cols * (I -1) + SizeLelem * (J -1) se numește deplasarea în raport cu începutul matricei.

Cât de multă memorie este alocată pentru o matrice?

Luați în considerare faptul că nu este atât de mult problema cât de multă memorie este alocată pentru o matrice (dezasamblată în secțiunea anterioară), dar despre ceea ce este dimensiunea maximă admisă a matricei, având în vedere cantitatea limitată de memorie.

Pentru a lucra programul, memoria este alocată segmente de 64 kb fiecare, cel puțin una dintre ele este definită ca segment de date.. Aici, în acest segment și există acele date pe care programul le va procesa. Nici un program variabil nu poate fi localizat în mai multe segmente. Prin urmare, chiar dacă o singură variabilă descrisă ca o matrice este situată în segment, nu va putea obține mai mult de 65536 octeți. Dar, în plus, în plus față de matricea din segmentul de date, vor fi descrise mai multe variabile, astfel încât cantitatea reală de memorie, care poate fi selectată pentru o matrice, este în formula: 65536-, unde S este suma de memorie deja selectată pentru alte variabile.

De ce trebuie să știm asta? Pentru a nu fi surprins dacă traducătorul va da un mesaj de eroare declarației de prea lungă matrice atunci când programul vine în program (corect din punctul de vedere al sintaxei):

Type MyArray \u003d Gama de Integer;

Știți deja că, având în vedere reprezentarea pe două octeți a numerelor numere, este realistă să declarați o matrice cu numărul de elemente egale cu 65536/2 -1 \u003d 32767. Și apoi numai dacă nu există alte variabile. Arrasele bidimensionale ar trebui să aibă limite de index și mai mici.

Exemple de rezolvare a problemelor cu arrays bidimensional din Pascal

O sarcină: Găsiți un produs de elemente non-zero ale matricei.

Decizie:

  • Pentru a rezolva această sarcină, vom avea nevoie de variabile: o matrice, constând, de exemplu, de la elemente întregi; P este produsul altor elemente decât 0; I, Indicii J - Array; N, M - numărul de rânduri și coloane din matrice.
  • Datele de intrare sunt n, m - valorile lor introduc de la tastatură; Matrix - Introducerea matricei pentru a emite sub forma unei proceduri, umplerea matricei se va întâmpla la întâmplare, adică Utilizând funcția Random ().
  • Ieșirea va fi valoarea variabilei P (locul de muncă).
  • Pentru a verifica corectitudinea programului, este necesar să ieșiți matricea pe ecran, pentru această problemă procedura de ieșire a matricei.
  • Procedura de rezolvare a problemelor:

vom discuta mai întâi îndeplinirea programului principal, vom discuta despre punerea în aplicare a procedurilor puțin mai târziu:

  • introducem valorile N și M;
  • Introducem un masiv bidimensional de Pascal, pentru aceasta, facem apel la procedura vvod (a), unde a-matrice;
  • Imprimați matricea rezultată, pentru aceasta, facem apel la procedura de tipărire (A);
  • Atribuim valoarea inițială a variabilei p \u003d 1;
  • Vom rezolva succesiv toate rândurile de la 1 la n., În fiecare linie vom sorta toate coloanele J de la 1 la M -To, pentru fiecare element al matricei Vom verifica starea: dacă un IJ? 0, atunci produsul p este de a fuziona în elementul A IJ (P \u003d P * A IJ);
  • Retrage valoarea produsului elementelor nonzero ale matricei - P;

Și acum să vorbim despre proceduri.

cometariu (este important!) Parametrul procedurii poate fi orice variabilă a unui tip predeterminat, ceea ce înseamnă că pentru transmiterea la procedura de matrice ca parametru, acesta trebuie să fie descris în avans. De exemplu:

Tip
Matrix \u003d matrice de integer;
Procedură grund (A: Matrix);
..............................

Să ne întoarcem acum la procedurile noastre.

Procedura de introducere a matricei este numită vvod, parametrul procedurii este matricea și ar trebui să fie, ca rezultat, transferat în programul de bază, prin urmare, parametrul trebuie transmis prin referință. Apoi titlul procedurii noastre va arăta astfel:

Procedură vvod (var m: matrice);

Pentru a implementa ciclurile imbricate în procedură, avem nevoie de variabile locale, de exemplu, k și h. Algoritmul de umplere a matricei a fost deja discutat, așa că nu îl vom repeta.

Procedura de ieșire a matricei de pe ecran este numită Imprimare, parametrul procedurii este matricea, dar în acest caz este parametrul de intrare, prin urmare, este transmis prin valoare. Titlul acestei proceduri va arăta astfel:

Procedură Imprimare (M: Matrix);

Și din nou, pentru implementarea ciclurilor imbricate în cadrul procedurii, vom avea nevoie de contoare, să le referați la același - K și H. Algoritmul pentru ieșirea matricei de pe ecran a fost descris mai sus, folosim această descriere.

Exemplu de program al gamei bidimensionale din Pascal

Program Proizvedentie;
Tip
Matrix \u003d matrice de integer;
Var.
R: Matrix;
N, M, I, J: Byte;
P: Integer;
Procedură vvod (var m: matrice);
Var K, H: Byte;
Începe.
Pentru i: \u003d 1 la n (variabila n pentru procedură este globală și, prin urmare, "cunoscută")
Pentru J: \u003d 1 până la M (variabila M pentru procedură este globală și, prin urmare, "cunoscută")
M: \u003d aleatoriu (10);
Sfârșit;
Procedură Imprimare (M: Matrix);
Var K, H: Byte;
Începe.
Pentru i: \u003d 1 la n
Începe.
Pentru J: \u003d 1 până la m doo
Scrie (M: 4);
Writeln;
Sfârșit;
Sfârșit;
Începe (pornirea principală a programului)
Scrie ("Introduceți dimensiunea matricei:");
Readln (N, M);
Vvod (A);
Imprimare (A);
P: \u003d 1;
Pentru i: \u003d 1 la n
Pentru J: \u003d 1 până la m doo
ÎN CAZUL ÎN CARE UN.<>0 apoi p: \u003d p * a;
Writeln (P);
Sfârșit.

Array bidimensională Structura datelor stocând o matrice dreptunghiulară a formei:

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.

  • În matrice, fiecare element este determinat de numărul liniei și numărul coloanei, pe intersecția căreia este
  • În Pascal, matricea bidimensională este examinată ca o matrice, elementele care sunt matrice liniare (matrice de matrice). Următoarele două descrieri ale matricelor bidimensionale sunt identice vAR MASS: Gama de matrice de realitate; VAR MASS: GARANȚĂ REAL;
  • Matricea în care se numește numărul de rânduri este egal cu numărul de coloane matrice pătrat.
  • Pentru a se referi la elementul matricei, trebuie să utilizați două indici care indică numărul liniei și numărul coloanei. de exemplu Myarr1.. ÎN acest caz Elementul matricei (MYARR1) se află în linia a patra și cea de-a cincea coloană.
  • Tot ceea ce sa spus despre acțiunile de bază cu matrice unidimensionale este corect atât pentru matrice. Cu o timbru Masiva în ciclu, variabilele de tip integer acționează ca indici. În mod tradițional, identificatorul "este folosit pentru a indica indicele liniei. i. ", Și coloana -" j. “.
  • Prelucrarea matricei este că elementele primei linii (coloană) sunt primite mai întâi, apoi al doilea, etc. până la acesta din urmă.
  • Dacă numărul rândului elementului coincide cu numărul coloanei ( i \u003d j.), aceasta înseamnă că elementul se află pe diagonala principală Matrice.
  • Dacă elementul se află pe diagonală laterală, indicii sunt asociați cu numărul de elemente ( n.) Următoarea egalitate: i + j \u003d n + 1

Descrierea matricei bidimensionale

Există mai multe modalități de a (descrieri) de o matrice bidimensională în Pascal.

Descrierea prealabilă a tipului de matrice

Type Matrix \u003d Gama de Integer; (Masiv de numere întregi) Matrix;

Definiția unei variabile ca o matrice fără o descriere preliminară a tipului de matrice

VAR Mass: Gama de Integer;

Inițializarea matricei bidimensionale

La inițializarea matricelor bidimensionale, fiecare șir este o pereche suplimentară de paranteze rotunde:

Const masa: Array \u003d ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Intrare / ieșire a valorilor elementelor matricei bidimensionale

Foarte des, valorile elementelor matricei sunt introduse din tastatură. Acest mod de stabilire a informațiilor este prea consumator de timp atunci când lucrați cu matrice. dimensiuni mari. Pentru a depana o clasă largă de algoritmi, o astfel de intrare de informații trebuie înlocuită cu formarea unui element de matrice aleatoriu. Pentru a face acest lucru, utilizați procedura randomize. și funcția. aleatoriu. Când lucrați cu matrice bidimensionale, sunt utilizate cicluri imbricate (de obicei ciclu cu un parametru pentru).

Umplerea numerelor aleatoare ale ARRAY

const n \u003d 5; m \u003d 10; Var I, J: Integer; Matrix: Gama de integrați; Începeți randomiza; Pentru i: \u003d 1 la n (rânduri de matrice) pentru J: \u003d 1 până la M (adăugând element la coloane) Matrix: \u003d aleatoriu (100); (Punem în elementul curent numărul aleatoriu din intervalul: 4); Writeln (trecerea la o nouă linie la ieșirea din ciclul intern);

Exemple de rezolvare a problemelor

Exemplul 1.

Formularea problemei. Numerele medii pozitive M și N sunt date. Pentru a forma o matrice întregi de dimensiune m × N, în care toate elementele coloanei J. au o valoare de 5 · J (J \u003d 1, ..., n).

Const m \u003d 7; n \u003d 10; Var I, J: Byte; Matrix: Gama de integrați; Începeți pentru i: \u003d 1 la m pentru J: \u003d 1 până la n Matrix: \u003d 5 * J; ... (ieșirea matricei)

Exemplul 2.

Formularea problemei. Sunt date numerele medii pozitive M, N și un set de numere M. Pentru a forma o matrice de dimensiune m × n, în care fiecare coloană conține toate numerele din apelul sursă (în aceeași ordine).

Const m \u003d 5; n \u003d 7; Vector: Gama de Integer \u003d (3, 5, 2, 7, 4); Var I, J: Byte; Matrix: Gama de integrați; Începeți pentru J: \u003d 1 până la n (luăm o coloană JTH) pentru i: \u003d 1 până la m (adresează elementele coloanei J-TH pe șiruri de caractere: \u003d vector [i]; (Implementare) ... (cu ieșirea matricei bidimensionale rezultate)

Teme pentru acasă

  1. Numerele medii pozitive M și N sunt date. Pentru a forma o matrice întregi de dimensiune M × N, care toate elementele Arunc Ei au o valoare de 10 · i (i \u003d 1, ..., m).
  2. Sunt date numerele medii pozitive M, N și un set de numere N. Pentru a forma o matrice de dimensiune m × n, în care fiecare linie conține toate numerele din apele ulterioare (în aceeași ordine).
  3. În plus.Numerele pozitive medii M, N, numărul D și un set de numere M. Pentru a forma o matrice de dimensiune M × N, în care prima coloană coincide cu setul sursă de numere și elementele din fiecare coloană următoare sunt egale cu suma elementului corespunzător al coloanei anterioare și numărul D (ca Un rezultat, fiecare linie a matricei va conține elemente de progresie aritmetică).
  4. În plus.Matricea de dimensiune m × n este dată. Afișați elementele sale situate în linii cu numere chiar (2, 4, ...). Ieșirea elementelor este realizată prin linii, operatorul condițional nu utilizează.