start     Articole     Despre mine    

cum sa programezi cu vectori si matrici fara sa fii as la matematica

Probabil ca atunci cand auzi de vectori si de matrici te gandesti la lectiile de fizica si de matematica din scoala. Vectorii si matricile din programare, insa, sunt cu totul altceva.

Si anume, ele sunt doar niste modalitati de organizare a datelor. Ele constituie, in esenta, bazele structurilor de date utilizate in programele complexe. (Si, in particular, ele constituie fundamentul bazelor de date de care cel mai probabil ai mai auzit.)

Hai sa n-o lungim mult si sa vedem ce sunt vectorii si matricile din programare.

 

Vectori

Dar mai intai: de ce am avea nevoie de o modalitate de structurare a datelor? Oare variabilele simple nu sunt de ajuns?

Daca am de memorat o data, folosesc o variabila. Daca imi trebuiesc doua date intr-un program, folosesc doua variabile.

Dar daca am nevoie de 10 date? (Sa zicem ca as vrea sa memorez starea tuturor celor 10 “beculete” de pe linia cu y = 1 din ecranul virtual de 10×10 puncte utilizat in lectiile anterioare. As putea sa consider valoarea 1 pentru starea “aprins” si valoarea 0 pentru starea “stins”.)

Da, pot folosi 10 variabile.

Dar daca apoi as vrea sa schimb starea tuturor becurilor (adica pe cele aprinse sa le sting, si pe cele stinse sa le aprind)?

Ar trebui, evident, sa iau fiecare dintre cele 10 variabile in parte si sa scriu pentru ea un fragment de program de genul urmator:

daca (variabila == 1)
{
       variabila = 0
}
altfel
{
       variabila = 1
}

Imagineaza-ti treaba asta (scrisa, desigur, cu instructiunea if in loc de daca) repetata de 10 ori!

(Of, si tocmai incepuse sa-ti placa programarea, nu?…)

 

Ei bine, vestea buna e ca datorita vectorilor nu va trebui sa dai copy&paste de 9 ori. Cu ajutorul vectorilor vei putea scrie ceva de genul:

if (variabila_numarul_n == 1)
{
       variabila_numarul_n = 0
}
else
{
       variabila_numarul_n = 1
}

Acest grup de instructiuni va trebui sa-l scrii o singura data, in interiorul unei instructiuni cat timp (adica while) cu ajutorul careia il faci pe n sa parcurga toate valorile de la 1 la 10 (asa cum ai vazut in lectia anterioara).

 

Bun, dar cum poti traduce intr-un program variabila_numarul_n?

Sa zicem ca variabila am denumit-o v. Atunci variabila v numarul n se va scrie v[n].

OK. Mai ramane doar sa vedem cum se defineste o astfel de variabila.

O poti face cu functia Vector(numar_elemente), unde in loc de numar_elemente pui numarul de elemente dorit (deci cate variabile iti doresti sa contina variabila v). De exemplu, pentru 10 variabile in v (prima fiind v[0], si ultima v[9]) poti scrie astfel:

var v = Vector(10)

Iata, deci, un vector!

Asadar, un vector e doar o variabila ce contine mai multe variabile (ce pot fi accesate prin expresii (ce pot contine numere, operatori si alte variabile) scrise intre paranteze drepte dupa numele variabilei, asa cum am aratat in paragrafele anterioare).

Sa vedem acum cum ar arata programul de inversare a starii celor 10 beculete, de care vorbeam ceva mai devreme:

var v = Vector(10)

var n = 0
while (n < 10)
{
       if (v[n] == 1)
       {
              v[n] = 0
       }
       else
       {
              v[n] = 1
       }
       n = n+1
}

Pentru a face un program simulabil in simulatorul interactiv (asa cum te-am obisnuit in lectiile trecute), mai trebuie sa initializam valorile din vectorul v dupa ce l-am definit. Asa cum am zis anterior, pentru starea “aprins” vom folosi valoarea 1, iar pentru starea “stins” valoarea 0.

De asemenea, mai trebuie sa aprindem beculetele de pe ecran atat inainte, cat si dupa rularea algoritmului de inversare a beculetelor. Putem face aceasta punand o pauza in program (cu ajutorul functiei Pauza()).

Iata programul:

// Program inversare culori (cu vector)

// definire vector cu 10 elemente
var v = Vector(10)

// initalizare elemente vector
v[0] = 0
v[1] = 0
v[2] = 1
v[3] = 1
v[4] = 1
v[5] = 1
v[6] = 1
v[7] = 0
v[8] = 1
v[9] = 1

// aprindere puncte de pe linia cu y = 1,
// conform valorilor din vectorul v
// (0 – stins; 1 – aprins)
var n = 0
while (n < 10)
{
       if (v[n] == 1)
       {
              Aprinde(n+1, 1)
       }
       else
       {
              Stinge(n+1, 1)
       }
       n = n+1
}

// pauza…
Pauza()

// inversare stare puncte
n = 0
while (n < 10)
{
       if (v[n] == 1)
       {
              v[n] = 0
       }
       else
       {
              v[n] = 1
       }
       n = n+1
}

// aprindere puncte de pe linia cu y = 1,
// conform valorilor din vectorul v
// (0 – stins; 1 – aprins)
n = 0
while (n < 10)
{
       if (v[n] == 1)
       {
              Aprinde(n+1, 1)
       }
       else
       {
              Stinge(n+1, 1)
       }
       n = n+1
}

Si iata si simulatorul in care poti testa programul.

(Browserul tau nu suporta Canvas!…)

A mers, da? Acum urmeaza partea cea mai frumoasa (si care te va ajuta cel mai mult in a deveni un bun programator) — partea de creatie si experimentare. Modifica, te rog, programul anterior astfel incat doar starea punctelor de pe coloanele pare (coloanele 2, 4, 6, 8, 10) sa se modifice (iar punctele de pe coloanele cu numar impar sa ramana nemodificate).

Poti sa-mi lasi rezultatele (ca si alte idei de programe interesante cu vectori) in sectiunea de comentarii de mai jos.

 

Matrici

Acum ca e clar cum sta treaba cu vectorii, sa vedem ce sunt matricile si la ce sunt ele bune.

Daca folosind un vector am putut manipula o linie din afisaj (si la fel de simplu putem manipula o coloana), cu ajutorul unei matrici putem manipula intreg ecranul de 10×10 puncte.

Caci matricea este (ca si vectorul) o variabila ce contine mai multe variabile (dar nu dispuse in sir (ca la vector), ci intr-un patrat sau dreptunghi (pe linii si coloane)).

Cand definim o matrice trebuie sa ii specificam numarul de linii si numarul de coloane, astfel:

var m = Matrice(numar_linii, numar_coloane)

Intreg afisajul de 10×10 becuri il putem, deci, considera un fel de matrice (de puncte, sau beculete), de 10 linii si 10 coloane. Numerotarea liniilor incepe, insa, de sus (deci linia cu y = 10 este linia 0, iar linia cu y = 1 este linia 9), iar a coloanelor de la stanga (deci coloana cu x = 1 este coloana 0, iar coloana cu x = 10 este coloana 9).

Haide sa definim o matrice in care sa memoram starea (aprins sau stins) tuturor celor 10×10 puncte de pe afisaj. La fel ca anterior, pentru starea “aprins” vom memora in matrice valoarea 1, iar pentru starea “stins” valoarea 0. Daca denumim aceasta variabila m, atunci va trebui sa scriem in felul urmator:

var m = Matrice(10, 10)

Pentru accesarea elementelor matricii m vom scrie similar ca la vectori, cu diferenta ca matricii trebuie sa ii specificam doi indecsi (unul pentru linie, si celalalt pentru coloana) in loc de unul singur. Astfel, de exemplu, cu m[1][2] se acceseaza elementul de pe linia 1 si coloana 2 (care corespunde punctului de pe afisaj situat la coordonatele x = 3 si y = 9).

(Imi poti spune cum ai accesa elementul matricii m in care vom memora starea punctului din coltul din dreapta sus al afisajului?)

Hai sa vedem acum cum ar arata programul scris la sectiunea Vectori, dar de asta data pentru intreg ecranul, folosind matricea m definita anterior. (Iti reamintesc ca programul isi propune sa aprinda cateva puncte de pe ecran, sa puna pauza, dupa care sa inverseze starea tuturor punctelor.)

// Program inversare culori (cu matrice)

// definire matrice cu 10 linii si 10 coloane
var m = Matrice(10, 10)

// initalizare elemente matrice
var l = 0
var c
while (l < 10)
{
       c = 0
       while (c < 10)
       {
              if ( ((l+c)%2) == 0 )
              {
                     m[l][c] = 1
              }
              else
              {
                     m[l][c] = 0
              }
              c = c+1
       }
       l = l+1
}

// aprindere puncte de pe ecran,
// conform valorilor din matricea m
// (0 – stins; 1 – aprins)
l = 0
while (l < 10)
{
       c = 0
       while (c < 10)
       {
              if (m[l][c] == 1)
              {
                     Aprinde(c+1, 10-l)
              }
              else
              {
                     Stinge(c+1, 10-l)
              }
              c = c+1
       }
       l = l+1
}

// pauza…
Pauza()

// inversare stare puncte
l = 0
while (l < 10)
{
       c = 0
       while (c < 10)
       {
              if (m[l][c] == 1)
              {
                     m[l][c] = 0
              }
              else
              {
                     m[l][c] = 1
              }
              c = c+1
       }
       l = l+1
}

// aprindere puncte de pe ecran,
// conform valorilor din matricea m
// (0 – stins; 1 – aprins)
l = 0
while (l < 10)
{
       c = 0
       while (c < 10)
       {
              if (m[l][c] == 1)
              {
                     Aprinde(c+1, 10-l)
              }
              else
              {
                     Stinge(c+1, 10-l)
              }
              c = c+1
       }
       l = l+1
}

(Pentru a testa codul, revino la caseta de simulare de la finalul sectiunii despre vectori.)

Modifica, te rog, acest program astfel incat sa-si schimbe starea doar punctele aflate pe linii si coloane pare.

 

Gata si lectia despre vectori si matrici!

Cu aceasta lectie libertatea ta in materie de construit programe a crescut enorm. Nici nu iti dai seama cat de aproape esti de a-ti programa propriul joc.

Inca mai crezi ca este foarte dificil sa iti construiesti propriul joc de calculator? Te rog sa-mi spui ce crezi despre asta intr-un comentariu. De asemenea, te-as mai ruga sa-mi spui ce idei de jocuri interesante ai. Constrangerea este ca aceste jocuri sa poata fi jucate folosind doar ecranul virtual de 10×10 puncte si tastatura (sau, eventual, mouse-ul).





Loading Facebook Comments ...

No Trackbacks.