Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Prelucrari asupra tablourilor bidimensionale

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 LA TASTATURA

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

biologie

botanica






Upload!

Trimite cercetarea ta!
Trimite si tu un document!
NU trimiteti referate, proiecte sau alte forme de lucrari stiintifice, lucrari pentru examenele de evaluare pe parcursul anilor de studiu, precum si lucrari de finalizare a studiilor universitare de licenta, masterat si/sau de doctorat. Aceste documente nu vor fi publicate.