CELLA0 |
CELLA1 |
CELLA2 |
CELLA3 |
CELLA4 |
CELLA5 |
CELLA6 |
CELLA7 |
Mentre si può immaginare quanto segue come una matrice di 5x4 celle:
CELLA0,0 |
CELLA0,1 |
CELLA0,2 |
CELLA0,3 |
CELLA0,4 |
CELLA1,0 |
CELLA1,1 |
CELLA1,2 |
CELLA1,3 |
CELLA1,4 |
CELLA2,0 |
CELLA2,1 |
CELLA2,2 |
CELLA2,3 |
CELLA2,4 |
CELLA3,0 |
CELLA3,1 |
CELLA3,2 |
CELLA3,3 |
CELLA4,4 |
Le matrici infatti si possono chiamare anche array multidimensionali. Gli scopi di una matrice sono molteplici, immaginiamo ad esempio il gioco degli scacchi, la scacchiera può essere rappresentata semplicemente con una matrice. La dichiarazione di una matrice si definisce così: nomevariabile: array[Altezza,Larghezza] of tipodivariabile; vediamo un esempio, se volessimo dichiarare la matrice sopra riportata di 5x4 celle dovremmo procedere così: Matrice1: array[0..4,0..3] of integer;. Anche l'uso non è dissimile dai vettori monodimensionali, prendiamo come esempio la matrice di prima e vediamo di riempirla con dei numeri consecutivi.
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
Matrice: array[0..4,0..3] of integer;
i,j, contatore: integer;
begin
{ add your program here }
contatore:=0;
for i:=0 to 4 do
begin
for j:=0 to 3 do
begin
Matrice[i,j]:=contatore;
contatore:=contatore+1;
end;
end;
for i:=0 to 4 do
begin
write('|');
for j:=0 to 3 do
begin
if (Matrice[i,j]<=9) then
begin
write('0',Matrice[i,j],'|');
end
else
write(Matrice[i,j],'|');
end;
writeln();
end;
// stop program loop
Terminate;
end;
var
Application: TMyApplication;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Se provate a compilare e ad eseguire il codice appena scritto vedrete il risultato del vostro lavoro.
Esattamente come per i vettori anche le matrici possono essere statiche o dinamiche, quelle appena dichiarate sono statiche, ora vediamo le dinamiche. Sostanzialmente cambia in fase di dichiarazione della variabile, ipotizziamo di voler rifare l'esempio di poco fa sulla matrice statica con una dinamica la dichiarazione della variabile di nome matrice verrebbe così modificata: Matrice: array of array of integer;. Dopodichè dobbiamo definire quanto è grossa la matrice, ma lo facciamo nella fase esecutiva in questa maniera SetLength(Matrice,5,4). Insomma se dovessimo riscrivere il programma con una matrice dinamica il codice sarebbe il seguente:
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
Matrice: array of array of integer;
i,j, contatore: integer;
begin
{ add your program here }
SetLength(Matrice,5,4);
contatore:=0;
for i:=0 to 4 do
begin
for j:=0 to 3 do
begin
Matrice[i,j]:=contatore;
contatore:=contatore+1;
end;
end;
for i:=0 to 4 do
begin
write('|');
for j:=0 to 3 do
begin
if (Matrice[i,j]<=9) then
begin
write('0',Matrice[i,j],'|');
end
else
write(Matrice[i,j],'|');
end;
writeln();
end;
// stop program loop
Terminate;
end;
var
Application: TMyApplication;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Provate a compilare e ad eseguire il programma e capirete cosa abbiamo/avete fatto.