|
PRELUCRARI ASUPRA TABLOURILOR BIDIMENSIONALE
1. Incarcarea cu valori a elementelor tabloului
a) Prin operatia de atribuire
Ca si la tabloul unidimensional, acest lucru se face prin calculul individual element cu element :
a[i, j] := expresie ;
Aplicatie: Se considera un tablou patratic de n linii si n coloane, unde n max.=20.Se doreste completarea tabloului cu numerele naturale de la 1 la n
Fie n=4.Continutul tabloului va fi cel din careul de mai jos :
REZOLVARE : Se va considera o variabila, k, in care se vor genera, pe rand, numerele sirului natural 1, 2, , nValoarea generata in k va fi inregistrata in elementul curent, de coordonate i si j, din cadrul tabloului. Pentru a nu se depasi spatiul alocat tabloului, programul repeta citirea valorii pentru n pana cand valoarea este 1 < n < 21.
var v : array[1..20, 1..20] of byte ;
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
n, i, j: byte;
k: Word;
begin
k:=1;
repeat
write ('Dati numarul de linii');
readln (n) until (n>2) end (n<=20);
for i:=1 to n do
for j:=1 to n do
begin
v[i, j]:=k;
k:=k+1;
end;
end.
b) Prin citire din mediul extern
Incarcarea valorilor din mediul extern se face folosind fluxul de intrare de date :
- standard(din fisierul text creat de la tastatura) ;
- desemnat de utilizator, prin fisierul text propriu.
. INTRAREA DE
Fisierul standard de intrare este gestionat de procedurile rad sau readln. In primul rand trebuie ca programului sa i se dea numarul de linii si numarul de coloane pentru care va primi apoi datele. Aceste numere, fie m, respectiv n, trebuie sa fie numere naturale, cu valori mai mari sau egale cu 2 (pentru a exista structura bidimensionala) si mai mici sau egale cu valorile determinate din limitele date la declararea tabloului.
De exemplu, pentru tabloul declarat direct ca variabila x in
Var x :array[-3..1, 0..4] of char ;
limita lui m este de 5 linii (cu indici de la -3 la 1) si limita lui n este de 5 coloane (cu indici de la 0 la 4).
Deoarece pentru un tablou cu m linii si n coloane trebuie introduse m × n date, este necesar ca utilizatorul sa fie anuntat care element al matricei este la rand pentru a primi valoare.
Aplicatie:Se citeste de la tastatura o matrice a cu n linii * n coloane si elemente numere intregi. Realizati interschimbarile de linii/coloane necesare, astfel incat elementele de pe diagonala principala, citite de sus in jos, sa fie sortate crescator.
program mat_3;
type mat=array [1..25,1..25] of integer;
var a:mat;
nla:integer;
procedure cit_mat (var a:mat; var nl:integer;nume:string);
var i,j:integer;
begin
writeln('Se citeste matricea ',nume,' : ');
write('Dati numarul de linii/coloane al matricii ',nume,' : '); readln(nl);
for i:=1 to nl do
for j:=1 to nl do
begin
write(nume,'[',i,',',j,']=');
readln(a[i,j]);
end
end
procedure af_mat (a:mat;nl:integer;nume:string);
var i,j:integer;
begin
writeln('Se afiseaza matricea ',nume,' : ');
for i:=1 to nl do
begin
for j:=1 to nl do
write(a[i,j]:3);
writeln;
end;
end
procedure sch_lin (var a:mat;n,l1,l2:integer);
var i,aux:integer;
begin
for i:=1 to n do
begin
aux:=a[l1,i];
a[l1,i]:=a[l2,i];
a[l2,i]:=aux;
end;
end
procedure sch_col (var a:mat;n,c1,c2:integer);
var i,aux:integer;
begin
for i:=1 to n do
begin
aux:=a[i,c1];
a[i,c1]:=a[i,c2];
a[i,c2]:=aux;
end;
end
procedure sort (var a:mat; n:integer);
var i,j:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i,i]>a[j,j] then
begin
sch_lin(a,n,i,j);
sch_col(a,n,i,j);
end;
end
begin
writeln('Se sorteaza crescator elementele de pe diagonala principala : ');
cit_mat(a,nla,'a');
af_mat(a,nla,'a');
sort(a,nla);
af_mat(a,nla,'a cu diagonala sortata');
end
. INTRAREA DIN FISIERUL UTILIZATORULUI
De regula, fisierul utilizatorului este alcatuit astfel :
pe prima linie sunt valorile pentru m si n, separate printr-un spatiu ;
pe urmatoarele m linii sunt cate n valori, de asemenea separate printr-un spatiu intre ele.
In aceasta situatie se presupune ca sunt corecte valorile pentru m si n si nu mai trebuie desfasurat dialogul cu utilizatorul.
1.1. Declararea unei constante de tip tablou bidimensional
In limbajul Pascal se poate declara o constanta de tip tablou bidimensional in sectiunea const. De exemplu, declararea unei matrice constante cu doua linii si trei coloane, ale carei elemente sunt numerele naturale de la 1 la 6, se pot scrie astfel :
const m :array [1..2, 1..3] of byte=((1, 2, 3), (4, 5, 6)) ;
sau
const m:array [1..2, 1..3] of byte=(1, 2, 3, 4, 5, 6);
2.1.2 Generarea, afisare si scrierea valorilor tabloului
Generarea si afisarea valorilor tabloului
Ca si la tabloul unidimensional, generarea se poate face prin declarare de constanta, atribuiri ( calculul individual per element sau atribuire globala pentru tablouri de acelasi tip) sau prin citire din medii externe.
Aplicatie : Sa se afiseze urmatorul tablou:
Obs: pentru un i si un j curent, numitorul corespunzator se obtine din expresia i+j-1
In Pascal programul arata astfel:
Program tablou;
Uses crt;
Var a:array[1..10, 1..10] of byte;
I, j: byte;
Begin
Clrscr;
For i:=1 to 10 do
For j:=1 to 10 do
A[I, j]:=i+j/1;
Writeln(' careul generat este: ');
For i:=1 to 10 do begin
Write( ' 1/ ' , a[I,j], ' '); End; End.
Afisarea
Afisarea tabloului se face element cu element. Este de dorit ca afisarea sa produca pe ecran asezarea tabloului in forma dreptunghiulara. Acest lucru revine la lista cate o linie din tablou pe cate o linie de ecran.
Secventa pentru afisare, pastrand notatiile folosite la citire, este :
for i :=1 to m do
begin
for j :=1 to n do
write (V[i, j],' ') ;
writeln ;
end ;
Iesirea in fisierul utilizatorului
Fisierul utilizatorului va fi alcatuit astfel :
- pe prima linie se vor trece valorile pentru m si n, separate printr-un spatiu ;
- pe urmatoarele m linii se vor scrie cate n valori, de asemenea separate printru-un spatiu intre ele.
Secventa de mai jos scrie valorile elementelor intr-un fisier numit matrice.out. Fisierul se afla in directorul de lucru al programului.
assign (f,' matrice.out') ;rewrite(f0 ;
writeln (f, m, ' ', n);
for i:=1 to m do
begin
for j:=1 to n do
write (f, V[i,j],' ');
writeln (f);
end;
close(f);
Scrierea valorilor tabloului pe mediul extern
Scrierea valorilor pe mediul extern se face folosind procedurile de iesire de date write si writeln.
- scrierea in fisierul standard (in fisierul text creat pe ecran);
- scrierea in fisierul desemnat de utilizator, prin fisierul text propriu
2.2 Prelucrari ce necesita reguli de parcurgere a elementelor
Ordinea de parcurgere a elementelor tabloului devine acum, la tabloul bidimensional un lucru esential, de multe ori mai important decat calculele in care intra elementele lui.
Necesitatea stabilirii unui tip de parcurgere este legata de modul in care sunt memorate in spatiul afectat tabloul si de prelucrarea in care sunt folosite elementele tabloului. Din aceste puncte de vedere exista mai multe tipuri de parcurgere:
1. Parcurgere standard, matematica, care consta in trecerea prin elementele fiecarei linii in ordinea liniilor si reprezinta parcurgerea matriceala. Acest tip de parcurgere a fost folosit anterior in operatiile de citire si scriere.
2. Parcurgerea transpusa consta in trecerea prin elementele fiecarei coloane, in ordinea coloanelor. Asociind numele parcurgerii cu proprietatea matematica de transpunere a matricelor. In acest mod de trecere prin tablou se va obtine matricea directa, iar cea data ca sursa de valori va fi matricea transpusa.
3. Parcurgere geometrica se constituie intr-un traseu ce imagineaza un desen: trecere pe patrate concentrice, trecere in spirala, trecere pe diagonale si papalele la diagonale si altele.
Aplicatie: Sa se determine cate elemente prime se afla deasupra diagonalei principale a unei matrice cu n linii si n coloane elemente numere naturale.
program matrice;
type matrice=array[1..10,1..10] of integer;
var a:matrice;
n,i,nr,j:integer;
function prim(n:integer):boolean;
var p:boolean;
i:integer;
begin
p:=true;
for i:=2 to n div 2 do
if n mod i=0 then p:=false;
prim:=p;
end;
procedure citire(var n:integer; var a:matrice);
var i,j:integer;
begin
write('n='); readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');readln(a[i,j]);
end;
end;
procedure afisare(n:integer; var a:matrice);
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],'');
writeln;
end; end;
begin
citire(n,a);
afisare(n,a);
nr:=0;
for i:=1 to n do
for j:=i+1 to n do
if (prim(a[i,j])) then inc(nr);
write('nr elementelor este:',nr);
readln;
end.
2.3 Obtinerea unor elemente cu anumite proprietati.
Ca si in cazul tablourilor unidimensionale si aici se pune problema localizarii unor elemente sau grupuri de elemente cu anumite proprietati(valori maxime sau minime, linii sau coloane cu toate elementele nule etc.)
Aplicatie:
Sa se genereze o matrice cu n linii si n coloane care sa fie completate pe linii cu primele n2 nr prime.
program matrix ;
type matrice=array[1..10,1..10] of integer;
vector=array[1..100] of integer;
var a:matrice;
b:vector;
n,i,j,k,nr:integer;
function prim(n:integer):boolean;
var p:boolean;
begin
p:=true;
for i:=2 to n div 2 do
if n mod i=0 then p:=false;
prim:=p;
end;
begin
write('n='); readln(n);
b[1]:=1; b[2]:=2;
k:=3; nr:=2;
repeat
if prim(k) then begin
inc(nr);
b[nr]:=k;
end;
k:=k+2;
until (nr=n*n);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=b[n*(i-1)+j];
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5,' ');
writeln;
end;
readln;
end.
2.4 Prelucrari de tip ordonare
Se pune problema pregatirii tabloului unidimensional, in vederea unor prelucrari ulterioare, prin actiuni de ordonare dupa anumite criterii. Ne-am obisnuit sa intelegem prin ordonare o sortare, adica o reasezare a elementelor in ordine crescatoare sau descrescatoare.
Aplicatie:Se citeste de la tastatura o matrice a cu n linii * n coloane si elemente numere intregi. Realizati interschimbarile de linii/coloane necesare, astefel incat elementele de pe diagonala principala, citite de sus in jos, sa fie sortate crescator.}
program mat_3;
type mat=array [1..25,1..25] of integer;
var a:mat;
nla:integer;
procedure cit_mat (var a:mat; var nl:integer;nume:string);
var i,j:integer;
begin
writeln('Se citeste matricea ',nume,' : ');
write('Dati numarul de linii/coloane al matricii ',nume,' : '); readln(nl);
for i:=1 to nl do
for j:=1 to nl do
begin
write(nume,'[',i,',',j,']=');
readln(a[i,j]);
end
end
procedure af_mat (a:mat;nl:integer;nume:string);
var i,j:integer;
begin
writeln('Se afiseaza matricea ',nume,' : ');
for i:=1 to nl do
begin
for j:=1 to nl do
write(a[i,j]:3);
writeln;
end;
end
procedure sch_lin (var a:mat;n,l1,l2:integer);
var i,aux:integer;
begin
for i:=1 to n do
begin
aux:=a[l1,i];
a[l1,i]:=a[l2,i];
a[l2,i]:=aux;
end;
end
procedure sch_col (var a:mat;n,c1,c2:integer);
var i,aux:integer;
begin
for i:=1 to n do
begin
aux:=a[i,c1];
a[i,c1]:=a[i,c2];
a[i,c2]:=aux;
end;
end
procedure sort (var a:mat; n:integer);
var i,j:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i,i]>a[j,j] then
begin
sch_lin(a,n,i,j);
sch_col(a,n,i,j);
end; end;
begin
writeln('Se sorteaza crescator elementele de pe diagonala principala : ');
cit_mat(a,nla,'a');
af_mat(a,nla,'a');
sort(a,nla);
af_mat(a,nla,'a cu diagonala sortata');
end