Matrice Pascal bidimensionale - matrici. Matrice bidimensionale. Formarea matricelor și ieșirea elementelor sale Cum se face o matrice în pascal abc

Matrice bidimensională o structură de date care stochează o matrice dreptunghiulară de forma:

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

  • Într-o matrice, fiecare element este determinat de numărul rândului și numărul coloanei la intersecția cărora se află
  • În Pascal, o matrice bidimensională este tratată ca o matrice ale cărei elemente sunt matrice liniare (o matrice de matrice). Următoarele două descrieri ale tablourilor bidimensionale sunt identice var masa:matrice de matrice de real; var masa:matrice de real;
  • Se numește o matrice în care numărul de rânduri este egal cu numărul de coloane matrice pătrată.
  • Pentru a accesa un element de matrice, trebuie să utilizați doi indici care indică numărul rândului și numărul coloanei. De exemplu MyArr1. În acest caz, elementul de matrice (MyArr1) se află în al patrulea rând și a cincea coloană.
  • Tot ceea ce s-a spus despre operațiile de bază cu tablouri unidimensionale este valabil și pentru matrice. Când iterează printr-o matrice element cu element într-o buclă, variabilele acționează ca indici tip întreg. În mod tradițional, identificatorul „ este folosit pentru a indica indexul rândului i „, iar coloana – „ j “.
  • Prelucrarea matriceală constă în luarea în considerare mai întâi a elementelor primului rând (coloană), apoi a celui de-al doilea etc. până la ultimul.
  • Dacă numărul rândului unui element se potrivește cu numărul coloanei ( i = j), aceasta înseamnă că elementul se află pe diagonala principală matrici.
  • Dacă un element se află pe o diagonală secundară, atunci indicii sunt legați de numărul de elemente ( n) prin următoarea egalitate: i + j = n + 1

Descrierea unui tablou bidimensional

Există mai multe moduri de a declara (descrie) o matrice bidimensională în Pascal.

Tip de matrice Descriere preliminară

tip matrice = matrice de întreg; (matrice de numere întregi) var masa:matrice;

Definirea unei variabile ca matrice fără a declara mai întâi tipul matricei

var masa:matrice de întreg;

Inițializarea unui tablou bidimensional

La inițializarea tablourilor bidimensionale, fiecare linie este inclusă într-o pereche suplimentară de paranteze:

Masa const:matrice = ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Intrarea/ieșirea valorilor elementelor unui tablou bidimensional

Foarte des, valorile elementelor matricei sunt introduse de la tastatură. Această metodă de specificare a informațiilor necesită prea multă muncă atunci când lucrați cu matrice mari. Pentru a depana o clasă largă de algoritmi, o astfel de introducere de informații trebuie înlocuită cu formarea aleatorie de elemente de matrice. Pentru a face acest lucru, utilizați procedura randomizareși funcția aleatoriu. Când lucrați cu tablouri bidimensionale, sunt utilizate bucle imbricate (de obicei, o buclă cu un parametru pentru).

Umplerea unei matrice cu numere aleatorii

const n = 5; m = 10; var i, j:întreg; matrice:matrice de întreg; începe randomizarea; pentru i:= 1 la n do (acces la rândurile matricei) pentru j:= 1 la m do (acces element cu element la coloane) matrice := random(100); (asezam un numar aleator din intervalul :4 in elementul curent);

scrie (mergi la

linie nouă

la ieșirea din bucla interioară) capăt;

Exemple de rezolvare a problemelor

Exemplul 1

Enunțarea problemei. Dați numere întregi pozitive M și N. Formați o matrice întregă de dimensiunea M × N, în care toate elementele coloanei J-a au valoarea 5·J (J = 1, …, N).

Const m = 7;

n = 10; var i, j:byte;

  1. matrice:matrice de întreg; start for i:= 1 to m do for j:= 1 to n do matrice := 5 * j; ... (Ieșire matrice) Exemplul 2 Enunțarea problemei. Având în vedere numere întregi pozitive M, N și o mulțime de M numere. Formați o matrice M × N în care fiecare coloană conține toate numerele din mulțimea inițială (în aceeași ordine).
  2. Const m = 5;
  3. n = 7; vector:matrice de întreg = (3, 5, 2, 7, 4); var i, j:byte;
  4. n = 7; Având în vedere o matrice de dimensiunea M × N. Tipăriți elementele acesteia situate în rânduri cu numere pare (2, 4, ...). Afișați elementele linie cu linie, operator condițional nu folosi.

O matrice bidimensională în Pascal este tratată ca o matrice unidimensională al cărei tip de element este, de asemenea, o matrice (array of arrays). Poziția elementelor în matrice Pascal bidimensionale este descrisă de doi indici. Ele pot fi prezentate sub forma unui tabel dreptunghiular sau a unei matrice.

Să considerăm o matrice Pascal bidimensională cu o dimensiune de 3*3, adică va avea trei linii și fiecare linie va avea trei elemente:

Fiecare element are propriul său număr, ca și tablourile unidimensionale, dar acum numărul constă deja din două numere - numărul rândului în care se află elementul și numărul coloanei. Astfel, numărul elementului este determinat de intersecția unui rând și a unei coloane. De exemplu, un 21 este elementul care apare în al doilea rând și prima coloană.

Descrierea unui tablou Pascal bidimensional.

Există mai multe moduri de a declara o matrice Pascal bidimensională.

Știm deja cum să descriem tablouri unidimensionale, ale căror elemente pot fi de orice tip și, prin urmare, elementele în sine pot fi matrice. Luați în considerare următoarea descriere a tipurilor și variabilelor:

Un exemplu de descriere a unui tablou Pascal bidimensional

Tip
Vector = matrice de<тип_элементов>;
Matrice= matrice de vector;
Var m: matrice;

Am declarat o matrice Pascal m bidimensională, constând din 10 rânduri, fiecare având 5 coloane. În acest caz, fiecare i-lea rând poate fi accesat cu m[i], iar fiecare j-lea element din interiorul i-lea rând poate fi accesat cu m[i, j].

Definiția tipurilor pentru tablourile Pascal bidimensionale poate fi specificată și într-o singură linie:

Tip
Matrice= matrice de matrice de< тип элементов >;
sau chiar mai simplu:
tip
matrice = matrice de<тип элементов>;

Accesarea elementelor unui tablou bidimensional are forma: M [i, j]. Aceasta înseamnă că dorim să obținem elementul situat în rândul i și coloana j. Principalul lucru aici este să nu confundăm rândurile cu coloanele, altfel putem ajunge din nou să accesăm un element inexistent. De exemplu, accesarea unui element M are forma corectaînregistrare, dar poate provoca o eroare în program.

Operații de bază cu tablouri Pascal bidimensionale

Tot ceea ce s-a spus despre operațiile de bază cu tablouri unidimensionale este valabil și pentru matrice. Singura acțiune care poate fi efectuată pe matrice întregi de același tip este atribuirea. Adică, dacă programul nostru descrie două matrice de același tip, de exemplu,

tip
matrice= matrice de întreg;
var
a, b: matrice;

apoi în timpul execuției programului puteți aloca matricea o valoarea matricei b(a:= b). Toate celelalte acțiuni sunt efectuate element cu element și toate operațiile valide care sunt definite pentru tipul de date ale elementelor matricei pot fi efectuate asupra elementelor.

Aceasta înseamnă că, dacă o matrice este formată din numere întregi, atunci operațiunile definite pentru numerele întregi pot fi efectuate asupra elementelor sale, dar dacă matricea este formată din caractere, atunci li se pot aplica operațiunile definite pentru lucrul cu caractere.

Introducerea unui tablou Pascal bidimensional. Pentru a introduce secvențial elemente ale unui tablou unidimensional, am folosit o buclă for în care am schimbat valoarea indexului de la prima la ultima. Dar poziția unui element într-o matrice Pascal bidimensională este determinată de doi indici: numărul rândului și numărul coloanei. Aceasta înseamnă că va trebui să schimbăm secvenţial numărul rândului de la primul la ultimul şi, în fiecare rând, să repetăm ​​elementele coloanei de la primul la ultimul. Deci avem nevoie de două pentru buclă

, iar unul dintre ele va fi imbricat în celălalt.

Să ne uităm la un exemplu de introducere a unui tablou Pascal bidimensional de la tastatură:

tip
Un exemplu de program pentru introducerea unui tablou Pascal bidimensional de la tastatură
var
matrice= matrice de întreg;
a, : matrice;
i, j: întreg; (indexuri de matrice)
ÎNCEPE
pentru i:=1 până la 5 do (buclă pentru a repeta prin toate rândurile)

readln(a[i,j]); (introducerea de la tastatură a unui element din al-lea rând și j-a coloană)

O matrice Pascal bidimensională poate fi completată aleatoriu, de exemplu. utilizați funcția aleatoare (N) și, de asemenea, atribuiți valoarea unei expresii fiecărui element al matricei. Metoda de completare a unui tablou Pascal bidimensional depinde de sarcina la îndemână, dar în orice caz, fiecare element din fiecare rând și fiecare coloană trebuie definit.

Imprimarea unui tablou Pascal bidimensional pe ecran.

Imprimarea elementelor unui tablou Pascal bidimensional se efectuează, de asemenea, secvențial, este necesar să se imprime elementele fiecărui rând și fiecare coloană. În același timp, aș dori ca elementele care se află pe aceeași linie să fie imprimate una lângă alta, adică. într-un rând, iar elementele coloanei erau amplasate unul sub celălalt. Pentru a face acest lucru, trebuie să efectuați următoarea secvență de acțiuni (luați în considerare un fragment de program pentru matricea descrisă în exemplul anterior):

Un exemplu de program pentru a imprima o matrice Pascal bidimensională
i, j: întreg; (indexuri de matrice)
pentru i:=1 până la 5 do (buclă pentru a repeta prin toate rândurile)
pentru j:=1 până la 10 do (iterarea tuturor elementelor unui rând pe coloane)
scrie ; (înainte de a schimba numărul rândului din matrice, trebuie să mutați cursorul la începutul unei noi linii de ecran)
Sfârşit ;

Notă ( asta este important!): foarte des în programele studenților apare o eroare când încearcă să intre de la tastatură sau să afișeze o matrice după cum urmează: readln(a), writeln(a), unde O este o variabilă matrice. În același timp, ei sunt surprinși de mesajul compilatorului că o variabilă de acest tip nu poate fi citită sau tipărită. Poate veți înțelege de ce nu se poate face acest lucru dacă vă imaginați N căni stând la rând și în mâinile voastre, de exemplu, un ibric cu apă. Puteți folosi comanda „turnați apă” pentru a umple toate cănile deodată? Indiferent cât de mult ai încerca, va trebui să turnați în fiecare cană separat. Umplerea și afișarea elementelor de matrice ar trebui, de asemenea, făcute secvenţial și element cu element, deoarece În memoria computerului, elementele matricei sunt situate în celule consecutive.

Reprezentarea unui tablou Pascal bidimensional în memorie

Elementele unui tablou abstract din memoria mașinii sunt localizate fizic secvențial, conform descrierii. În acest caz, fiecare element ocupă numărul de octeți din memorie corespunzător mărimii sale. De exemplu, dacă o matrice constă din elemente de tipul întreg, atunci fiecare element va ocupa doi octeți. Și întreaga matrice va lua S^2 octeți, unde S este numărul de elemente din matrice.

Și cât spațiu va ocupa o matrice formată din matrice, adică matrice? Evident: S i^S j, unde S i este numărul de linii, iar S j este numărul de elemente din fiecare linie. De exemplu, pentru o matrice ca

Matrice = matrice de întreg ;

Vor fi necesari 12 octeți de memorie.

Cum vor fi localizate elementele acestei matrice în memorie? Să luăm în considerare aspectul unui tablou M de tip matrice în memorie.

Pentru fiecare element M de tip întreg sunt alocate două celule de memorie. Plasarea memoriei se face de jos în sus. Elementele sunt plasate în ordinea modificărilor de index, care corespunde modelului de buclă imbricată: primul rând este plasat primul, apoi al doilea, al treilea... În cadrul rândului, elementele merg în ordine: primul, al doilea etc.

După cum știm, accesul la orice variabilă este posibil numai dacă se cunoaște adresa celulei de memorie în care este stocată variabila. Memoria specifică este alocată unei variabile atunci când programul este încărcat, adică se stabilește o corespondență reciprocă între variabilă și adresa celulei. Dar dacă declarăm o variabilă ca matrice, atunci programul „știe” adresa începutului matricei, adică primul său element. Cum accesezi toate celelalte elemente ale matricei? Când accesează efectiv o celulă de memorie în care este stocat un element dintr-o matrice bidimensională, sistemul își calculează adresa folosind formula:

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

unde Adr este adresa de pornire reală la care se află matricea în memorie; I, J – indici de elemente într-un tablou bidimensional; SizeElem – dimensiunea elementului de matrice (de exemplu, doi octeți pentru elemente de tipul întreg); Cols – numărul de elemente din linie.

Expresia SizeElem * Cols *(I -1)+ SizeElem *(J -1) se numește offset relativ la începutul matricei.

Câtă memorie este alocată pentru matrice?

Să luăm în considerare nu atât întrebarea cât de multă memorie este alocată matricei (am discutat acest lucru în secțiunea anterioară), ci care este dimensiunea maximă admisă a matricei, având în vedere cantitatea limitată de memorie.

Pentru funcționarea programului, memoria este alocată în segmente de 64 KB fiecare și cel puțin unul dintre ele este definit ca segment de date. În acest segment se află datele pe care programul le va procesa. Nicio variabilă de program nu poate fi localizată în mai mult de un segment. Prin urmare, chiar dacă există o singură variabilă în segment, descrisă ca o matrice, aceasta nu va putea primi mai mult de 65536 de octeți. Dar aproape sigur, pe lângă matrice, vor fi descrise și alte variabile în segmentul de date, astfel încât cantitatea reală de memorie care poate fi alocată matricei este găsită prin formula: 65536-S, unde S este cantitatea de memorie deja alocată pentru alte variabile.

De ce trebuie să știm asta? Pentru a nu fi surprins dacă, în timpul compilării, traducătorul afișează un mesaj de eroare despre declararea unui tablou prea lung, atunci când programul întâlnește o descriere (corectă din punct de vedere al sintaxei):

Tastați myArray= matrice de întreg;

Știți deja că, având în vedere reprezentarea pe doi octeți a numerelor întregi, este de fapt posibil să declarați o matrice cu un număr de elemente egal cu 65536/2 –1=32767. Și atunci numai dacă nu există alte variabile. Matricele bidimensionale trebuie să aibă limite de index și mai mici.

Exemple de rezolvare a problemelor cu tablouri Pascal bidimensionale

Sarcină: Găsiți produsul elementelor matriceale diferite de zero.

Soluţie:

  • Pentru a rezolva această problemă avem nevoie de variabile: o matrice formată, de exemplu, din elemente întregi; P – produsul elementelor diferite de 0; I, J – indici de matrice; N, M – numărul de rânduri și coloane din matrice.
  • Datele de intrare sunt N, M - le vom introduce valorile de la tastatură; matrice – vom introduce matricea sub forma unei proceduri vom completa matricea aleatoriu, i.e. folosind funcția random().
  • Datele de ieșire vor fi valoarea variabilei P (produs).
  • Pentru a verifica execuția corectă a programului, este necesară afișarea matricei pe ecran pentru aceasta vom formaliza procedura de afișare a matricei.
  • Progresul rezolvării problemei:

Să discutăm mai întâi despre execuția programului principal, vom discuta despre implementarea procedurilor puțin mai târziu:

  • să introducem valorile N și M;
  • Să introducem o matrice Pascal bidimensională, pentru aceasta ne întoarcem la procedura vvod (a), unde a este o matrice;
  • Să tipărim matricea rezultată pentru a face acest lucru, folosiți procedura de tipărire (a);
  • Să ne potrivim valoarea initiala variabila P =1;
  • Vom itera secvenţial prin toate rândurile I de la 1 la N-a, în fiecare rând vom itera toate coloanele J de la 1 la Mth, pentru fiecare element al matricei vom verifica condiţia: dacă a ij ? 0, atunci produsul P va fi înmulțit cu elementul a ij (P = P * a ij);
  • Să arătăm valoarea produsului elementelor matricei nenule – P;

Acum să vorbim despre proceduri.

Comentariu (acest lucru este important!) Un parametru de procedură poate fi orice variabilă de tip predefinit, ceea ce înseamnă că pentru a transmite o matrice ca parametru unei proceduri, tipul acesteia trebuie descris în prealabil. De exemplu:

Tip
Matrice=matrice de întreg;
primer de procedură(a: matrice);
..............................

Să revenim acum la procedurile noastre.

Procedura de introducere a unei matrice se numește vvod, parametrul procedurii este matricea și, prin urmare, trebuie să fie transmisă programului principal, prin urmare, parametrul trebuie transmis prin referință. Apoi, antetul procedurii noastre va arăta astfel:

Procedura vvod (var m: matrice);

Pentru a implementa bucle imbricate într-o procedură, avem nevoie de variabile de contor local, de exemplu, k și h. Algoritmul pentru umplerea matricei a fost deja discutat, așa că nu îl vom repeta.

Procedura de afișare a unei matrice pe ecran se numește print , parametrul procedurii este matricea, dar în acest caz este un parametru de intrare, prin urmare, trecut prin valoare. Antetul acestei proceduri va arăta astfel:

Imprimare procedura (m: matrice);

Și din nou, pentru a implementa bucle imbricate în interiorul unei proceduri, avem nevoie de contoare, să fie numite la fel - k și h. Algoritmul pentru afișarea matricei pe ecran a fost descris mai sus, vom folosi această descriere.

Exemplu de program matrice bidimensional Pascal

Productie de programe;
Tip
Matrice=matrice de întreg;
Var
A: matrice;
N, m, i, j: octet;
P: întreg;
Procedura vvod (var m: matrice);
Var k, h: octet;
ÎNCEPE
Pentru i:=1 la n do (variabila n pentru procedură este globală și, prin urmare, „cunoscută”)
Pentru j:=1 la m do (variabila m pentru procedură este globală și, prin urmare, „cunoscută”)
M:= aleatoriu(10);
Sfârşit;
Imprimare procedura (m: matrice);
Var k, h: octet;
ÎNCEPE
Pentru i:=1 la n face
ÎNCEPE
Pentru j:=1 la m face
Scrie (M:4);
Writeln;
Sfârşit ;
Sfârşit ;
Început (începutul programului principal)
Writeln("Introduceți dimensiunea matricei:");
Readln(N, M);
Vvod(a);
Print(a);
P:=1;
Pentru i:=1 la N do
Pentru j:=1 la M faceți
Dacă a<>0 atunci p:=p*a;
Writeln(p);
Sfârşit.

Ultima lecție de Pascal a fost scrisă pe 7 martie, când studiam. Astăzi vom afla despre ce este vorba matrice bidimensională în pascal cum este descris și ce este. Mai multe detalii mai jos.

Deci, ce este o matrice bidimensională? Pentru o înțelegere ușoară, să ne imaginăm o matrice unidimensională ca o linie, în care toate elementele se succed pe orizontală și una bidimensională ca un pătrat, în care elementele sunt situate atât pe orizontală, cât și pe verticală. O matrice bidimensională este formată din rânduri și coloane, numite și matrice sau matrice matrice.

Cum sunt descrise matricele bidimensionale? Există mai multe moduri de a scrie tablouri bidimensionale, voi lua în considerare 2 dintre ele.

1 mod de a descrie o matrice: matrice de tip de variabile din matrice (intger/real/octet);

A doua modalitate de a descrie un tablou: matrice de matrice de tip de variabile din matrice;

Mai întâi sunt descrise rândurile (1..m), apoi coloanele (1..n).

A doua metodă descrie modul în care sunt descrise două tablouri unidimensionale, care împreună formează una bidimensională.

O matrice bidimensională poate fi descrisă în secțiunea Tip, pentru accesul ulterior la acesta de mai multe ori, sau în secțiunea de descriere a variabilei Var, aș dori să subliniez că în loc de m și n, puteți înlocui numerele, sau puteți utilizați constante.

Un exemplu de specificare a unui tablou bidimensional în secțiunea de descriere a variabilei:

Const
m = 100;
n = 100;
var
a: Matrice de întreg;

În acest caz, am specificat o matrice bidimensională a de dimensiunea 100 cu 100, adică avem o matrice pătrată.

Un exemplu de specificare a unei matrice matrice folosind secțiunea Tip:

Const
m = 100;
n = 100;
Tip
Matrice = Matrice de întreg;
var
a: Matrice;
b:Matrice;

În cel de-al doilea exemplu, am specificat două matrice identice de dimensiune 100 cu 100 atunci când descriem tabloul b, nu a fost nevoie să descriem din nou dimensiunile și tipul de date;

Cum se accesează o variabilă de celulă într-o matrice bidimensională?

Pentru a accesa o matrice bidimensională, trebuie mai întâi să specificați numărul rândului și apoi numărul coloanei după cum urmează:

x este orice variabilă, a este numele matricei, i este numărul rândului, j este numărul coloanei.

Mai mult, i și j pot fi fie variabile, fie numere întregi.

Un exemplu de scriere a datelor într-o matrice:

Pentru i:= 1 la n do //setează numărul liniei în buclă
Pentru j:=1 la m face //setează numărul coloanei în buclă
a:=aleatoriu(100);

//atribuirea unei valori aleatorii celulei cu numărul rând i și numărul coloanei j Am umplut matricea numere aleatorii

de la 1 la 100.

Un exemplu de program care utilizează o matrice bidimensională, în care umplem matricea cu numere aleatorii și o afișăm pe ecran:
Var //descrierea variabilelor și a matricei
Matrice: Matrice de întreg;

i, j: întreg;
Începutul //începutul programului principal

writeln("Matrice bidimensională: "); //Dialog cu utilizatorul
Pentru i:= 1 până la 10 faceți //completarea matricei
pentru j:= 1 până la 10 do

Matrice:=aleatoriu(100);
Pentru i:= 1 până la 10 faceți //completarea matricei
Pentru i:= 1 până la 10, începe //Ieșiți matricea
scrie (matrice, " ");
scrieln
writeln("site-ul"); //Dacă doriți, puteți șterge

Sfârşit; //Sfârșitul programului