Cum se face o matrice în pascal abc. tablouri 2D

O matrice bidimensională în Pascal este tratată ca o matrice unidimensională, al cărei tip de elemente este și o matrice (o matrice de matrice). Poziția elementelor în matrice Pascal bidimensionale este descrisă de doi indici. Ele pot fi reprezentate ca un tabel dreptunghiular sau o matrice.

Luați în considerare o matrice Pascal bidimensională cu dimensiunile 3 * 3, adică va avea trei rânduri și fiecare rând 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 rândului și coloanei. De exemplu, un 21 este elementul din al doilea rând și din prima coloană.

Descrierea tabloului 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, în consecință, 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;
Varm: matrice;

Am declarat un tablou Pascal bidimensional m, format din 10 rânduri, fiecare cu 5 coloane. În acest caz, fiecare i-a linie poate fi accesată m [i], iar fiecare j-lea element din interiorul i-a linie - m [i, j].

Definițiile tipurilor pentru tablourile Pascal bidimensionale pot fi, de asemenea, specificate î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 obține din nou acces la un element inexistent. De exemplu, accesarea elementului M are notația corectă, dar poate provoca o eroare în program.

Operații de bază cu tablouri 2D Pascal

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ă avem două matrice de același tip descrise în program, de exemplu,

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

apoi în timpul execuției programului este posibilă alocarea matricei A valoarea matricei b(a:= b). Toate celelalte operații sunt efectuate element cu element și toate operațiunile valide care sunt definite pentru tipul de date ale elementelor matricei pot fi efectuate pe elemente. Aceasta înseamnă că dacă matricea 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 aplică operațiunile definite pentru lucrul cu caractere.

Introducerea unui tablou Pascal bidimensional.

Pentru a introduce secvențial elementele 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 cuib în celălalt.

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

Un exemplu de program pentru introducerea unui tablou Pascal bidimensional de la tastatură

tip
matrice=matrice de întreg;
var
a, : matrice;
i, j: întreg; (indexuri de matrice)
ÎNCEPE
pentru i:=1 până la 5 do (buclă prin toate rândurile)
readln(a[i,j]); (introducerea de la tastatură a elementului în linia i-a și coloana j-a)

Matricea bidimensională a lui Pascal poate fi completată la întâmplare, adică utilizați funcția aleatoare (N) și, de asemenea, atribuiți valoarea unei expresii fiecărui element al matricei. Modul de umplere a unui tablou Pascal bidimensional este ales în funcție de sarcină, dar, în orice caz, trebuie determinat fiecare element din fiecare rând și fiecare coloană.

Afișarea unui tablou Pascal bidimensional pe ecran.

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

Un exemplu de program pentru ieșirea unui tablou Pascal bidimensional

pentru i:=1 până la 5 do (buclă prin toate rândurile)
ÎNCEPE
pentru j:=1 până la 10 do (Iterează prin toate elementele unui rând după coloane)
scrie (a [i, j]:4); (imprimarea elementelor din rândul i al matricei într-o linie de ecran, în timp ce sunt alocate 4 poziții pentru ieșirea fiecărui element)
scrie ; (înainte de a schimba numărul liniei din matrice, trebuie să mutați cursorul la începutul unei noi linii de ecran)
Sfârşit ;

Observație ( este important!): de foarte multe ori în programele studenților există o eroare atunci când se încearcă introducerea de la tastatură sau ieșirea pe ecranul unui tablou, după cum urmează: readln (a), writeln (a), unde A 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 umple toate cănile deodată la comanda „turnați apă”? Indiferent cât de mult ai încerca, va trebui să turnați în fiecare cană separat. Umplerea și afișarea elementelor matricei trebuie efectuate și secvențial și element cu element, deoarece în memoria computerului, elementele matricei sunt situate în celule consecutive.

Reprezentând o matrice Pascal 2D în memorie

Elementele unui tablou abstract din memoria mașinii sunt aranjate fizic secvențial, așa cum este descris. În acest caz, fiecare element ocupă în memorie numărul de octeți corespunzător mărimii sale. De exemplu, dacă matricea constă din elemente de tip integer , 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 rânduri, iar S j este numărul de elemente din fiecare rând. De exemplu, pentru o matrice de tip

Matrice = matrice de întreg ;

Sunt necesari 12 octeți de memorie.

Cum vor fi stocate elementele acestei matrice în memorie? Luați în considerare aspectul unui tablou M de tip matrice în memorie.

Pentru fiecare element M de tip întreg sunt alocate două celule de memorie. Alocarea memoriei se face de jos în sus. Elementele sunt plasate în ordinea modificării indexului, care corespunde schemei de buclă imbricată: mai întâi este plasat primul rând, apoi al doilea, al treilea ... În interiorul rândului, elementele merg în ordine: primul, cel al doilea, și așa mai departe.

După cum știm, accesul la orice variabilă este posibil numai dacă se cunoaște adresa locației de memorie în care este stocată variabila. O memorie specifică este alocată variabilei atunci când programul este încărcat, adică se stabilește o corespondență reciprocă între variabilă și adresa celulei. Dar dacă am declarat variabila ca matrice, atunci programul „știe” adresa începutului matricei, adică primul său element. Cum este accesul la toate celelalte elemente ale matricei? În timpul unui acces real la o celulă de memorie care stochează 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ă unde se află matricea în memorie; I , J – indici ai unui element dintr-un tablou bidimensional; SizeElem – dimensiunea elementului de matrice (de exemplu, doi octeți pentru elemente întregi); Cols este numărul de elemente dintr-un rând.

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

Câtă memorie este alocată unei matrice?

Luați în considerare nu atât întrebarea cât de multă memorie este alocată pentru o matrice (am discutat acest lucru în secțiunea anterioară), ci care este dimensiunea maximă admisă a unei matrice, având în vedere cantitatea limitată de memorie.

Memoria este alocată pentru funcționarea programului în segmente de 64 KB fiecare, cu cel puțin unul dintre ele 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 poate primi mai mult de 65536 de octeți. Dar aproape sigur, pe lângă matrice, vor fi descrise mai multe variabile în segmentul de date, astfel încât cantitatea reală de memorie care poate fi alocată matricei se găsește 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, compilatorul dă un mesaj de eroare despre declararea unui tablou care este prea lung atunci când întâlnește o descriere (corectă din punct de vedere al sintaxei) în program:

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 nenule.

Soluţie:

  • Pentru a rezolva această problemă avem nevoie de variabile: o matrice formată, de exemplu, din elemente întregi; P este produsul altor elemente decât 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 aranja intrarea matricei sub forma unei proceduri, vom completa matricea aleatoriu, i.e. folosind funcția random().
  • Ieșirea va fi valoarea variabilei P (produs).
  • Pentru a verifica corectitudinea executării programului este necesară afișarea matricei pe ecran, pentru aceasta vom emite procedura de afișare a matricei.
  • Progresul rezolvării problemei:

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

  • introducem valorile lui N și M;
  • Introducem un tablou Pascal bidimensional, pentru aceasta apelam la procedura vvod (a), unde a este o matrice;
  • Să tipărim matricea rezultată, pentru aceasta ne întoarcem la procedura de tipărire (a);
  • Atribuiți valoarea inițială variabilei P =1;
  • Vom parcurge secvenţial toate rândurile I de la 1 la N-a, în fiecare rând vom parcurge 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ă afișăm valoarea produsului elementelor nenule ale matricei - P ;

Acum să vorbim despre proceduri.

cometariu (este important!) Orice variabilă de tip predefinit poate fi un parametru de procedură, ceea ce înseamnă că pentru a trece o matrice ca parametru procedurii, tipul acesteia trebuie declarat în prealabil. De exemplu:

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

Să revenim acum la procedurile noastre.

Procedura de introducere a matricei se numește vvod , parametrul procedurii este o matrice și, ca 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, cum ar fi k și h . Algoritmul de umplere a 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 de procedură este o matrice, dar în acest caz este un parametru de intrare, prin urmare, este transmis prin valoare. Antetul acestei proceduri va arăta astfel:

Procedura de tipărire (m:matrice);

Și din nou, pentru a implementa bucle imbricate în cadrul procedurii, 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.

Un exemplu de program matrice Pascal bidimensional

producerea programelor;
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ă, ceea ce înseamnă „cunoscut”)
M:= aleatoriu(10);
Sfârşit;
Procedura de tipărire (m:matrice);
Vark, 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);
intrare(a);
print(a);
P:=1;
Pentru i:=1 la N do
Pentru j:=1 la M faceți
În cazul în care o<>0 atunci p:=p*a;
Writeln(p);
Sfârşit.

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

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... ... ... ... ... ... ... A n1 A n2 A n3 A n4 A n5...A 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 tablouri liniare(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 face referire la 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 tipul întreg. În mod tradițional, identificatorul „ i „, și coloane - „ j “.
  • Prelucrarea matricei constă în faptul că la început sunt luate în considerare pe rând elementele primului rând (coloană), apoi al doilea, și așa mai departe până la ultimul.
  • Dacă numărul rândului elementului se potrivește cu numărul coloanei ( i = j), ceea ce înseamnă că elementul se află pe diagonala principală matrici.
  • Dacă un element se află pe diagonala laterală, atunci indicii sunt relaționați cu 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.

Descrierea preliminară a tipului de matrice

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 închisă î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ă. Acest mod de specificare a informațiilor necesită prea mult timp atunci când lucrați cu matrice de dimensiuni mari. Pentru a depana o clasă largă de algoritmi, o astfel de intrare de informații ar trebui înlocuită cu formarea de elemente ale matricei într-un mod aleatoriu. 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 rânduri matrice) pentru j:= 1 la m do (acces element cu element la coloane) matrice := aleator(100); (introduceți un număr aleatoriu din intervalul :4 în elementul curent); scrie (sări la linie nouă la ieșirea din bucla interioară) capăt;

Exemple de rezolvare a problemelor

Exemplul 1

Formularea problemei. Dați numere întregi pozitive M și N. Generaț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; 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

Formularea problemei. Vi se dau numere întregi pozitive M, N și o mulțime de M numere. Formați o matrice M × N cu fiecare coloană care conține toate numerele din setul original (în aceeași ordine).

Const m = 5; n = 7; vector:matrice de întreg = (3, 5, 2, 7, 4); var i, j:byte; matrice:matrice de întreg; începe pentru j:= 1 la n do (luați j-a coloană) pentru i:= 1 la m do (accesați elementele coloanei j-a rând cu rând) matrice := vector[i]; (implementare) ... (Ieșirea matricei bidimensionale rezultate)

Teme pentru acasă

  1. Dați numere întregi pozitive M și N. Formați o matrice M × N întregă cu toate elementele prima linie au valoarea 10 I (I = 1, …, M).
  2. Vi se dau numere întregi pozitive M, N și o mulțime de N numere. Formați o matrice M × N cu fiecare rând care conține toate numerele din setul original (în aceeași ordine).
  3. În plus. Vi se dau numere întregi pozitive M, N, un număr D și un set de M numere. Generați o matrice M × N, în care prima coloană coincide cu setul original de numere, iar elementele fiecărei coloane următoare sunt egale cu suma elementului corespunzător din coloana anterioară și numărul D (ca urmare, fiecare rândul matricei va conține elemente ale unei progresii aritmetice).
  4. În plus. Dată o matrice M × N. Tipăriți elementele acesteia situate în rânduri cu numere pare (2, 4, ...). Afișați elementele linie cu linie, nu utilizați un operator condiționat.

Ultima lecție de Pascal a fost scrisă deja pe 7 martie, apoi am analizat . Astăzi vom afla ce este matrice bidimensională în pascal cum este descris și ce este. Mai multe detalii mai jos.

Deci, ce este o matrice bidimensională? Pentru o percepție ușoară, să ne imaginăm o matrice unidimensională ca o linie, și în care toate elementele se succed pe orizontală, iar 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, ele fiind 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.

Primul mod de a descrie un tablou: matrice de tip de variabile dintr-o matrice (intger/real/octet);

2 mod de a descrie o matrice: matrice de matrice de tip de variabile dintr-o matrice;

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

În a doua metodă, sunt descrise două rețele unidimensionale, parcă, care formează împreună o matrice bidimensională.

O matrice bidimensională poate fi descrisă în secțiunea Tip, pentru accesul ulterioar la ea de mai multe ori, sau în secțiunea de declarare a variabilei Var, vreau să remarc că puteți înlocui numere în loc de m și n, sau puteți utiliza constante.

Un exemplu de specificare a unui tablou bidimensional în secțiunea de declarare a variabilelor:

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

În acest caz, am dat 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 al doilea exemplu, am specificat două matrice identice cu dimensiuni de 100 pe 100; atunci când descriem tabloul b, nu a fost nevoie să descriem din nou dimensiunile și tipul de date ale acesteia.

Cum se accesează o celulă-variabilă a unui tablou bidimensional?

Pentru a face referire la o matrice bidimensională, trebuie să specificați mai întâi numărul rândului, 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 atât variabile, cât și 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ți //setarea numărului coloanei în buclă
a:=aleatoriu(100); //atribuirea unei valori aleatorii unei celule cu numărul rând i și numărul coloanei j

Am umplut matricea cu 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 imprimă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 do //fill array
pentru j:= 1 la 10 do
Matrice:=aleatoriu(100);

Pentru i:= 1 până la 10, începe //Matrice de ieșire
pentru j:= 1 la 10 do
scrie (matrice, " ");
scrieln
writeln("site-ul"); // Puteți șterge dacă doriți
Sfârşit; // Sfârșitul programului

//readln //utilizat în Turbo Pascal



Se încarcă...
Top