Cum să programezi fără să știi multă matematică

  

    Probabil că atunci când auzi de vectori și de matrici te gândești la lecțiile de fizică și de matematică din școală. Vectorii și matricile din programare, însă, sunt cu totul altceva.
Și anume, ele sunt doar niște modalități de organizare a datelor. Ele constituie, în esență, bazele structurilor de date utilizate în programele complexe. (Și, în particular, ele constituie fundamentul bazelor de date de care cel mai probabil ai mai auzit.)
    Hai să n-o lungim mult și să vedem ce sunt vectorii și matricile din programare.
 
    Vectori
    Dar mai întâi: de ce am avea nevoie de o modalitate de structurare a datelor? Oare variabilele simple nu sunt de ajuns?
    Dacă am de memorat o dată, folosesc o variabilă. Dacă îmi trebuiesc două date într-un program, folosesc două variabile.
    Dar dacă am nevoie de 10 date? (Să zicem că aș vrea să memorez starea tuturor celor 10 “beculețe” de pe linia cu y = 1 din ecranul virtual de 10×10 puncte utilizat în lecțiile anterioare. Aș putea să consider valoarea 1 pentru starea “aprins” și valoarea 0 pentru starea “stins”.)
    Da, pot folosi 10 variabile.
    Dar dacă apoi aș vrea să schimb starea tuturor becurilor (adică pe cele aprinse să le sting, și pe cele stinse să le aprind)?
    Ar trebui, evident, să iau fiecare dintre cele 10 variabile în parte și să scriu pentru ea un fragment de program de genul următor:
daca (variabila == 1)
{
       variabila = 0
}
altfel
{
       variabila = 1
}
    Imaginează-ți treaba asta (scrisă, desigur, cu instrucțiunea if în loc de dacă) repetată de 10 ori!
(Of, și tocmai începuse să-ți placă programarea, nu?…)
 
    Ei bine, vestea bună e că datorită vectorilor nu va trebui să 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 instrucțiuni va trebui să-l scrii o singură dată, în interiorul unei instrucțiuni cât timp (adică while) cu ajutorul căreia îl faci pe n să parcurgă toate valorile de la 1 la 10 (așa cum ai văzut în lecția anterioară).
 
    Bun, dar cum poți traduce într-un program variabila_numarul_n?
    Să zicem că variabila am denumit-o v. Atunci variabila v numărul n se va scrie v[n].
    OK. Mai rămâne doar să vedem cum se definește o astfel de variabilă.
    O poți face cu funcția Vector(numar_elemente), unde în loc de numar_elemente pui numărul de elemente dorit (deci câte variabile îți dorești să conțină variabila v). De exemplu, pentru 10 variabile în v (prima fiind v[0], și ultima v[9]) poți scrie astfel:
var v = Vector(10)
    Iată, deci, un vector!
    Așadar, un vector e doar o variabilă ce conține mai multe variabile (ce pot fi accesate prin expresii (ce pot conține numere, operatori și alte variabile) scrise între paranteze drepte după numele variabilei, așa cum am arătat în paragrafele anterioare).
    Să vedem acum cum ar arăta programul de inversare a stării celor 10 beculețe, 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 în simulatorul interactiv (așa cum te-am obișnuit în lecțiile trecute), mai trebuie să inițializăm valorile din vectorul v după ce l-am definit. Așa cum am zis anterior, pentru starea “aprins” vom folosi valoarea 1, iar pentru starea “stins” valoarea 0.
    De asemenea, mai trebuie să aprindem beculețele de pe ecran atât înainte, cât și după rularea algoritmului de inversare a beculetelor. Putem face această punând o pauză în program (cu ajutorul funcției Pauza()).
    Iată 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
}
// pauză…
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
}        


Matrici

    Acum că e clar cum stă treaba cu vectorii, să vedem ce sunt matricile și la ce sunt ele bune.
    Dacă folosind un vector am putut manipula o linie din afișaj (și la fel de simplu putem manipula o coloană), cu ajutorul unei matrici putem manipula întreg ecranul de 10×10 puncte.
    Căci matricea este (că și vectorul) o variabilă ce conține mai multe variabile (dar nu dispuse în șir (că la vector), ci într-un pătrat sau dreptunghi (pe linii și coloane)).
    Când definim o matrice trebuie să îi specificăm numărul de linii și numărul de coloane, astfel:
var m = Matrice(numar_linii, numar_coloane)
    Întreg afișajul de 10×10 becuri îl putem, deci, consideră un fel de matrice (de puncte, sau beculețe), de 10 linii și 10 coloane. Numerotarea liniilor începe, însă, de sus (deci linia cu y = 10 este linia 0, iar linia cu y = 1 este linia 9), iar a coloanelor de la stânga (deci coloana cu x = 1 este coloana 0, iar coloana cu x = 10 este coloana 9).
    Haide să definim o matrice în care să memorăm starea (aprins sau stins) tuturor celor 10×10 puncte de pe afișaj. La fel că anterior, pentru starea “aprins” vom memora în matrice valoarea 1, iar pentru starea “stins” valoarea 0. Dacă denumim această variabilă m, atunci va trebui să scriem în felul următor:
var m = Matrice(10, 10)
    Pentru accesarea elementelor matricii m vom scrie similar că la vectori, cu diferența că matricii trebuie să îi specificam doi indecși (unul pentru linie, și celălalt pentru coloana) în loc de unul singur. Astfel, de exemplu, cu m[1][2] se accesează elementul de pe linia 1 și coloana 2 (care corespunde punctului de pe afișaj situat la coordonatele x = 3 și y = 9).
(Îmi poți spune cum ai accesa elementul matricii m în care vom memora starea punctului din colțul din dreapta sus al afisajului?)
    Hai să vedem acum cum ar arată programul scris la secțiunea Vectori, dar de asta dată pentru întreg ecranul, folosind matricea m definită anterior. (Îți reamintesc că programul își propune să aprindă câteva puncte de pe ecran, să pună pauză, după care să inverseze starea tuturor punctelor.)
// Program inversare culori (cu matrice)
// definire matrice cu 10 linii și 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
}
// pauză…
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
}    
Modifică, te rog, acest program astfel încât să-și schimbe starea doar punctele aflate pe linii și coloane pare.
 
    Gata și lecția despre vectori și matrici!
    Cu această lecție libertatea ta în materie de construit programe a crescut enorm. Nici nu îți dai seama cât de aproape ești de a-ți programa propriul joc.
    Încă mai crezi că este foarte dificil să îți construiești propriul joc de calculator? Te rog să-mi spui ce crezi despre asta într-un comentariu. De asemenea, te-aș mai ruga să-mi spui ce idei de jocuri interesante ai. Constrângerea este că aceste jocuri să poată fi jucate folosind doar ecranul virtual de 10×10 puncte și tastatură (sau, eventual, mouse-ul).
Link articol: https://igotopia.ro/cum-sa-programezi-cu-vectori-si-matrici-fara-sa-fii-as-la-matematica
Mulțumim, Florin Bîrleanu



x
Acest website utilizează cookie-uri pentru a creea o experiență cât mai plăcută. Învață mai multe Acceptă