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).





190 comments
Ruben2016
Ruben2016

Mi-am propus sa fac un dreptunghi din matrice si nu reusesc, cine ma ajuta,va rog?

//program de desenat dreptunghi

//defonom matirce cu 10 lini si colne

var m =Matrice(5,10)

//initializare stare puncte


var l=0

var c

while (l<5)

{

  c=0

  while (c>2 && c<8)

  { 

   Aprinde (c+1,10-l)

   c=c+1

  }

  l=l+1

}

//aprindere puncte dupa valorilor din matricea m 


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

}


MihaiAnton
MihaiAnton

Eu nu am inteles lectia asta deloc....Ma poti ajuta sa inteleg mai bine faza cu vectori si matrici?

DeaconuMihai
DeaconuMihai

Inversarea doar a linillor si coloanelor pare

DanielPatrascu
DanielPatrascu

// Program inversare culori (cu vector)


// definire vector cu 10 elemente

var v = Vector(10)


// initalizare elemente vector

v[1] = 0

v[2] = 0

v[3] = 1

v[4] = 1

v[5] = 1

v[6] = 1

v[7] = 1

v[8] = 0

v[9] = 1

v[10] = 1


// aprindere puncte de pe linia cu y = 1,

// conform valorilor din vectorul v

// (0 – stins; 1 – aprins)

var n = 1

while (n < 11)

{

     if (v[n] == 1)

       {

              Aprinde(n, 1)

       }

       else

       {

              Stinge(n, 1)

       }

       n = n+1

}

n=1

while (n<11)

{

  if ((n % 2) == 0)

  {

    if (v[n] == 1)

    {

      Stinge(n,1)

    }

    else

    {

      Aprinde(n,1)

    }

  }

  n=n+1

}


Tase
Tase

Am reusit sa desenez piramida cu matrice. Explicatia cu angajatul care face exact ceea ce ii spui, nici mai mult, nici mai putin, a fost de mare ajutor. 

Tin sa ii multumesc lui Florin pentru aceasta abordare, care din punctul meu de vedere te indeamna sa intelegi lucrurile in profunzime si stimuleaza creativitatea in general, nu numai in programare. 

var m = Matrice (5,10);

var z;

var l;

var c;

z=0;

while (z<9)

{

l=0;

  while (l<5)

  {

  c=0;

    while (c<10)

    {

      if ((l+c)>=z && (l+c)<=9)

      {

        m[l][c]=1;

      }

      else

      {

        m[l][c]=0;

      }

      c=c+1;

    }

    z=z+2;

    l=l+1;

  }

}

z=0;

while (z<9)

{

  l=0;

  while (l<5)

  {

    c=0;

    while (c<10)

    {

      if (m[l][c]==1)

      {

        Aprinde (c+1,l+1);

      }

      else

      {

        Stinge (c+1,l+1);

      }

      c=c+1;

    }

    l=l+1;

    z=z+2;

  }

}

Micinr1
Micinr1

Salut.Sunt incepatoare in programare si uitându-ma la ce ai facut am rămas plăcut surprinsă .Cum de ti-ai dat seama ce trebuie sa scrii in program ( e vreun algoritm? )si cit timp ti-a luat ?esti debutant ?Eu inteleg cum funcționează programul dar nu reușesc sa inteleg de ce folosești adunarea in (( if(l+c)>=z&&(l+c)<=9) , cum ai dedus ca anume ea trebuia amplasată in condiție ?

Tase
Tase

@Micinr1 Salut.

Cred ca sunt importante urmatoarele:

1) sa stabilesti ceea ce vrei sa faci (piramida, triunghi, dreptunghi, etc.);

2) sa crezi ca poti face ceea ce ti-ai propus;

3)  sa ai in vedere esentialul, in acest caz aprinderea unor puncte;

4) gandeste-te ca in fata ta este acel angajat care face exact ceea ce ii spui (ce ii spui si in ce ordine ii spui) si nimic altceva, si pe masura ce scrii programul exprima-l in cuvinte in mintea ta si urmareste pe ecran derularea operatiunilor ca si cum ar fi un film;

5) presupunand ca ai studiat fiecare lectie prin rezolvarea unor exercitii, pentru a intelege notiunile in profunzime (pentru aceasta sunt necesare concentrarea si rabdarea; cand simti ca ai obosit, opreste-te si relaxeaza-te, dupa care te poti intoarce la treaba; este recomandat sa te incadrezi intr-un numar maxim de ore pe zi, cele doua ore propuse de Florin fiind o idee foarte buna dupa parerea mea; cand ti se pare ca nu intrevezi o solutie, intreaba-te cum ai putea sa obtii ceea ce vrei si opreste-te, urmand sa revii asupra chestiunii fie in aceeasi zi dupa o pauza, in cadrul celor doua ore, fie in alta zi).

6) Referitor la conditia (( if(l+c)>=z&&(l+c)<=9), avem in vedere angajatul care aprinde puncte pe ecran, respectand intocmai instructiunile tale. Aprinderea punctelor incepe cu un singur punct aflat la anumite coordonate (coloana, linie). Pentru a aprinde cel de-al doilea punct, trebuie sa ne deplasam fie pe o anumita linie (pe masura ce ne deplasam pe linie, schimbam coloanele - instructiunea while (linie, pentru care folosim ca simbol litera y, mai mica sau mai mare decat ...)), fie pe o anumita coloana (pe masura ce ne deplasam pe o anumita coloana, schimbam liniile - instructiunea while (coloana, pentru care folosim ca simbol litera x, mai mica sau mai mare decat ...)). In functie de alegerea noastra (incepem cu deplasarea pe linie - while x inclus in while y sau pe coloana - while y inclus in while x), priveste ecranul final folosind imaginatia ori un instrument de scris si o foaie sau un fisier excel si concentreaza-te cautand sa observi tipare, un numitor comun (intre aprinderea a doua puncte, intre schimbarea a doua linii sau coloane etc.). Eu am folosit atat o foaie si un pix, cat si un fisier excel si am observat ca prin adunarea coordonatelor (x+y) aflate la marginile liniilor care compun piramida exista un tipar si anume: la marginea din dreapta suma coordonatelor este 9, iar la cea din stanga suma coordonatelor variaza (prin urmare, am folosit o variabila). Astfel ca angajatul se deplaseaza pe linii, schimband coloanele si respectand conditia ca suma coordonatelor sa se incadreze in intervalul cuprins intre z si 9. Inainte de a trece la o alta linie, schimba valoarea lui z. Apoi parcurge coloanele de pe acea linie si asa mai departe.


Concentrare si rabdare. Parcurge lectiile si apoi exerseaza. Cat timp? Atat timp cat este necesar. O ora, o zi, doua zile, O saptamana. Pe masura ce exersezi, intelegi lucrurile si mai profund, ceea ce te ajuta sa intelegi lucrurile mai rapid la urmatorul/urmatoarele exercitiu/exercitii din cadrul aceleiasi lectii sau al unei alte lectii. Gandeste-te doar la ceea ce faci acum, concentrandu-te. Ignora orice altceva.


"Things live by moving and gain strength as they go"

Bruce Lee

Succes!      


Tase
Tase

Va rog sa ma ajutati. Scopul meu este construirea unei piramide. Iata ceea ce am reusit sa fac pana acum:


var m = Matrice (5,10);

var l = 9;

var c;

while (l>4)

{

var z=19;

  while (z>8)

  {

  c=0;

    while (c<10)

    {

      if ((l+c)>8 && (l+c)<19)

      {

        m[l][c]=1;

      }

      else

      {

        m[l][c]=0;

      }

      c=c+1;

    }

    z=z-2;

  }

  l=l-1;

}

var l = 9;

var c;

while (l>4)

{

  var z=19;

  while (z>8)

  {

    c=0;

    while (c<10)

    {

      if (m[l][c]==1)

      {

        Aprinde (c+1,l);

      }

      else

      {

        Stinge (c+1,l);

      }

      c=c+1;

    }

    z=z-2;

  }

  l=l-1;

}


Multumesc.

Nicu1
Nicu1

Cu vectori am intelesa sa primit ceva... dar cu matricea nu stiu nu se primeste...

Tase
Tase

Buburuzescu replied

Tase Poti sa ma ajuti si cu urmatoarele instructiuni?Iti multumesc
if (m[l][c] == 1)
          {
                     Aprinde(c+1, 10-l)-ce reprezinta c+1 si 10-l?Nu reusesc sa le calculez nicicum
Iit multumesc pentru ajutor :)


La matrice lucram cu doi indecsi ( l - linie si c - coloana, avand in vedere dispunerea pe linii si coloane, intr-un patrat sau dreptunghi), spre deosebire de vectori, in cazul carora avem unul singur, respectiv n. La vector ne-am pus intrebarea de ce scriem Aprinde (n+1,1). La matrice intrebarea este: De ce "Aprinde (c+1, 10-l)".  Raspunsul este acelasi, respectiv numerotarea in vectori si matrici incepe de la 0, iar in ecran incepe de la 1. Folosim instructiunea "Aprinde" pentru a aprinde un punct pe ecran, punct ce se afla la intersectia a doua coordonate (la intersectia unei linii cu o coloana). Vectorul este dispus fie pe linie, fie pe coloana si prin urmare una dintre coordonate ramane fixa. Stim care este motivul pentru care scriem n+1, c+1. De ce 10-l? Putem alege sa folosim "l+1". Avem insa un rezultat partial diferit. Incearca, experimenteaza. Tot ceea ce se poate intampla este sa se blocheze programul dupa apasarea butonului "Executa programul".

Tase
Tase

Conexiunea intre elementele din vector si cele din ecran este realizata prin folosirea variabilei n. Valoarea initiala a variabilei n este 0 (v[0] ... v[9]). Numerotarea liniilor si a coloanelor in ecran incepe de la 1. Acesta trebuie sa fie motivul pentru care scriem Aprinde (n+1,1) si nu Aprinde (n,1). In ecran nu exista nici linia 0, nici coloana 0. De ce numerotarea elementelor din vector incepe de la 0 si nu de la 1? Acest lucru nu il stiu, insa mi-ar placea sa il aflu. M-am intrebat care este utilitatea folosirii numerotarii de la 0 si iata ce am aflat:


Zero-based arrays are zero-based because of math-related reasons. Not for hardware-related reasons.


Why one?

why 1 would be a better starting index than zero? Why not 2, or 10? The answer itself is interesting because it shows a lot about the though process of the people defending the idea.
The first argument is that it's more natural, because the 1st is usually the one before all others, at least, for the majority of people...
The number-one argument is that the last index is also the size of the array...
I'm still impressed by the "quality" of the reasons I usually hear for this kind of arguments... And even more when I'm reminded that...

Why not zero?

... "One-based" notations are left-overs from the western culture that ignored the existence of zero for centuries, if not more.
Believe it or not, the original gregorian calendar goes from -3, -2, -1, 1, 2, 3... Try to imagine the problem it contributed to western science (for example, how many years from 1st January -2 to 1st January 2 to see than the original gregorian calendar conflicts with something as simple as substraction...).
Keeping to one-based arrays is like keeping to miles and yards in the 21th century...
Why Zero? Because it's math!
First (OOops... Sorry... I'll try again)
Zero, Zero is nothing, one is something. And some religious texts hold that "At the beginning, there was nothing". Some computer-related discussion can be as burning as religious debates, so this point is not so out of topics as it seems... ^_^

First, It's easier to work with a zero-based array and ignore its zero-th value than work with one-based array and hack around to find its zero-th value. This reason as almost as stupid as the previous, but then, the original argument in favor of one-based arrays was quite a fallacy, too.

Second, Let's remember that when dealing with numbers, chances are high you'll deal with math one moment or another, and when you deal with math, chances are good you are not in the mood for stupid hacks to get around obsolete conventions. The One-based notation plagued maths and dates for centuries, too, and by learning from our mistakes, we should strive to avoid it in future oriented sciences (including computer languages).

Third, As for computer language arrays being tied to hardware, allocate a C array of 21 integers, and move the pointer 10 indices to the right, and you'll have a natural [-10 to 10] array. This is not natural for hardware. But it is for maths. Of course, math could be obsolete, but the last time I checked, most people in the world believed it was not.

Four, As already pointed elsewhere, even for discrete position (or distances reduced to discrete values), the first index would be zero, like the floor in a building (starting at zero), the decreasing countdown (3, 2, 1, ZERO!), the ground altitude, the first pixel of an image, the temperature (zero Kelvin, for the absolute zero, or zero centigrade degrees, as water freezing temperature of 273 K). In fact, the only thing that really starts with one is the traditional way of "firstsecondthird, etc." iteration notation, which leads me naturally to the next point...

Five the next point (which naturally follows the previous) is that high-level containers should be accessed, not by index, but by iterators, unless the indices themselves have an intrinsic value. I'm surprised your "higher-level-language" advocate did not mention that. In the case the index itself is important, you can bet half the time you have a math-related question in mind. And thus, you'd like your container to be math-friendly, and not math-disabled like "thy olde gregorian calendar" starting at 1, and needing regurgitated hacks to make it work.


Conclusion

The argument given by your fellow programmer is a fallacy because it needlessly ties spoken/written language habits, which are, by nature, blurry, to computer languages (where you don't want your instruction blurred), and because by attributing wrongly an hardware reason to this problem, he.she hopes to convince you, as languages go higher and higher in abstraction, that the zero-based array is a thing of the past.
Zero-based arrays are zero-based because of math-related reasons. Not for hardware-related reasons.


SURSA: https://www.quora.com/Why-do-array-indexes-start-with-0-zero-in-many-programming-languages


Multumesc pentru intrebare.

Buburuzescu
Buburuzescu

Iti multumesc mult...cred ca nu m-am exprimat destul de bine in legatura cu nelamurirea mea.Privind lectia care a fost cu instructiunea "while",acolo se folosea instructiunea Aprinde (n,1),si aici se foloseste Aprinde (n+1,1)...Asta nu inteleg....de ce" +1"?Instructiunea n=n+1 din While o inteleg,doar Aprinde(n+1, 1) nu inteleg cum actioneaza.....

Iti multumesc pentru rabdare si pentru intelegere!

Florin Birleanu
Florin Birleanu moderator

@Buburuzescu In lectia cu "while" n mergea de la 1 la 10, nu? 

In schimb, in lectia asta n merge de la 0 la 9. (Dar coloanele x de pe ecran merg de la 1 (coloana cel mai din stanga grilajului) la 10 (coloana cel mai din dreapta grilajului de 10x10 puncte).) :-)

Tase
Tase

Va cer scuze pentru forma textului si greselile de punctuatie si ortografie. Multitasking-ul.

Tase
Tase

Sa ne amintim povestea cu angajatul caruia trebuie sa ii spui ce sa faca pana in cele mai mici detalii. In acest caz, cred ca ar fi "CAT TIMP (instructiunea while) e valabil lucrul asta, REPETA (n+1,1 ne indica faptul ca ne aflam pe linia 1; vectorul este linia, deplasarea pe linie insemnand modificarea coloanei; sa ne imaginam ca in coltul din stanga jos ar fi un punct care porneste si se deplaseaza de la stanga la dreapta, fara sa stearga urmele pe care le lasa; punctul parcurge fiecare casuta, strabatand astfel coloanele; insa cum "stie" punctul ca trebuie sa se deplaseze? Ii "spunem" acest lucru introducand variabila n, a carei valoare initiala este 0 si cerandu-i sa mareasca valoarea acesteia cu 1, dupa fiecare pas) treaba asta".

Richard Feynman, the late Nobel Laureate in physics, was once asked by a Caltech faculty member to explain why spin one-half particles obey Fermi Dirac statistics. Rising to the challenge, he said, "I'll prepare a freshman lecture on it." But a few days later he told the faculty member, "You know, I couldn't do it. I couldn't reduce it to the freshman level. That means we really don't understand it."

Sursa: https://en.wikiquote.org/wiki/Talk:Richard_Feynman


"Logic will get you from A to B. Imagination will take you everywhere." - Albert Einstein 

Sursa: BrainyQuote.com.


Indemnul domnului profesor Florin Birleanu: experimenteaza, incearca, incearca din nou, pune-mi intrebari acolo unde nu intelegi si intra pana in panzele albe. 

Tin sa ii multumesc lui Florin pentru acest site minunat si tie pentru intrebare. Efortul de a oferi raspunsuri la astfel de intrebari ajuta la insusirea mai buna a notiunilor.

"Seek to understand the root. — It is futile to argue as to which single leaf, which design of branch, or which attractive flower you like; when you understand the root, you understand all its blossoming".

Sursa: https://en.wikiquote.org/wiki/Bruce_Lee


 Multumesc Florin pentru "litere", "cuvinte", "fraze".

Buburuzescu
Buburuzescu

Salut...Poti te rog sa imi explici de ce la programul pentru vectori se foloseste INSTRUCTIUNEA : Aprinde(n+1,1).De ce (n+1)?

Va multumesc anticipat!

Florin Birleanu
Florin Birleanu moderator

@Buburuzescu E "n+1" fiindca numerotarea coloanelor pe de ecran incepe de la 1, in vreme ce numerotarea elementelor din vector incepe de la 0. :-)

Tase
Tase

Am operat o singura modificare, respectiv am inclus instructiunea WHILE prin care se inverseaza valorile vectorilor intr-o instructiune IF (n%2).


// 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;

if (n%2)

{

  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;

}

Florin Birleanu
Florin Birleanu moderator

@Florea Calin E bine, doar ca ai modificat starea punctelor nu de pe coloanele pare, ci de pe coloanele impare. :-)

Florea Calin
Florea Calin

@Florin Birleanu @Florea Calin // 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((n%2)==1)

  {

       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

}

cercelusa
cercelusa

De ce ai pus aceasta conditie if(((l+c)%2)==0)?

Florin Birleanu
Florin Birleanu moderator

@cercelusa Am pus aceasta conditie ca sa nu pun valoarea 1 in toate elementele matricii, ci doar in acele elemente situate pe linia l si coloana c cu proprietatea ca suma l+c este numar par. (Sau, altfel spus, l si c sunt ambele numere pare sau ambele numere impare. (Doar in aceste conditii suma lor este para.))

Hei
Hei

As avea o mică întrebare: cum s-ar traduce expresia if (m[l][c] == 1) din această situație? "Dacă matricea este egal cu 1"?


if (m[l][c] == 1)

          {

                     Aprinde(c+1, 10-l)

              }

              else

              {

                     Stinge(c+1, 10-l)

              }

              c = c+1

Florin Birleanu
Florin Birleanu moderator

@Hei "if (m[l][c] == 1)" s-ar traduce prin "Daca elementul din matricea m situat pe linia cu numarul l si pe coloana cu numarul c este egal cu 1." sau "Daca in matricea m pe linia cu numarul l si pe coloana cu numarul c se gaseste valoarea 1.". (Reamintesc faptul ca la matrici exista conventia ca numerotarea liniilor sa se faca de sus in jos, iar numerotarea coloanelor sa se faca de la stanga la dreapta. (In plus, in majoritatea limbajelor de programare actuale aceasta numerotare nu incepe de la 1, ci de la 0. Deci prima linie/coloana nu este linia/coloana 1, ci linia/coloana 0.))

culi1602
culi1602

In cazul cu matrice am modificat dupa "pauza"  in doar initializarea lui c si l de la 0 la 1 si pasul de la 1 la 2 ( sa fie doar liniile si coloanele pare)


codul final:


// 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 = 1    //aici era l=0

while (l < 10)

{

       c = 1   // aici era c=0

       while (c < 10)

       {

              if (m[l][c] == 1)

              {

                     m[l][c] = 0

              }

              else

              {

                     m[l][c] = 1

              }

              c = c+2   //aici era c+1

       }

       l = l+2   //aici era 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

}




culi1602
culi1602

La partea cu vector dupa pauza am modificat n=0 in n=1


"Pauza()


// inversare stare puncte

n = 1

while (n < 10)"


si la finalul buclei while de mai sus inainte de aprinde puncte.....

am modificat n=n+1 in n=n+2 

"              v[n] = 1

     }

       n = n+2

}


// aprindere puncte de pe linia"


si codul final este:


// 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 = 1

while (n < 10)

{

       if (v[n] == 1)

       {

              v[n] = 0

       }

       else

       {

              v[n] = 1

       }

       n = n+2

}


// 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

}




VictorManea
VictorManea

// 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 ((l%2)==1)
          {
            if ((c%2)==1)
            {
               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
 }


Am exclus din cod partea cu "stinge" punctele imediat dupa initializarea elementelor matricii

VictorManea
VictorManea

// 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 - doar pozitiile pare
 n = 0
 while (n < 10)
 {
   if ((n%2==1))
       {
        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
 }

AlexandruIonutPascu
AlexandruIonutPascu

Uite aici ceva ce am incercat(mie imi iese):

// 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(l%2==1)

         {

           if(c%2==1)

           {

         if (m[l][c] == 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

}

AncaDitiu
AncaDitiu

Pt programul cu vectori: singura modificare e la ultimul while, am pus doua if-uri. Dar nu sunt sigura ca satisface cerinta, nu sunt sigura ca am inteles bine ce ati cerut.

// 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, coloane pare

// conform valorilor din vectorul v

// (0 – stins; 1 – aprins)

n = 0;

while (n < 10)

{

       if (v[n] == 1)

       {

         if((n+1)%2 == 0)

         {

           Aprinde(n+1, 1);

         }              

       }

       else

       {

         if((n+1)%2 == 0)

         {

              Stinge(n+1, 1);

         }

       }

       n = n+1;

}

Florin Birleanu
Florin Birleanu moderator

@AncaDitiu Da, cerinta mea a fost un pic neclara. Dar daca as fi cerut ca in vectorul v sa inversezi doar elementele corespunzatoare punctelor de pe coloanele pare de pe ecran, cum ai fi facut? :-)

AncaDitiu
AncaDitiu

@Florin Birleanu Modific doar in while-ul pentru inversarea starilor punctelor si pun acolo conditia de paritate la elementele vectorului.

MurguCristi
MurguCristi

@Florin Birleanu @AncaDitiu

''in vectorul v sa inversezi doar elementele'' :)

Daca as avea probleama  Ancai as modifica doar elementele,sper sa nu ma insel.

v[0]=1;
v[1]=0;
v[2]=1;
v[3]=0;

v[4]=1;
v[5]=0;
v[6]=1;
v[7]=0;
v[8]=1;
v[9]=0;

Domnule Florin Birleanu ,tin sa va multumesc ,pentru munca daumneavoastra !

Florin Birleanu
Florin Birleanu moderator

@MurguCristi Pentru acest caz concret evident ca ar merge asa, dar eu am cerut o solutie care sa mearga in general, si nu doar pentru un caz particular. :-)

Catalin
Catalin

Salut,

De asemenea, nu inteleg de ce este nevoie de urmatoarele substituiri. Ce este diferit acum?


"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)."

Florin Birleanu
Florin Birleanu moderator

@Catalin Liniile si coloanele unei matrici reprezentate pe ecran se numara incepand din coltul stanga-sus (catre in jos (liniile) si catre la dreapta (coloanele)), in vreme ce liniile si coloanele din ecranul de 10x10 puncte se numara incepand din coltul stanga-jos (catre la dreapta (coloanele, sau coordonata x) si catre in sus (liniile, sau coordonata y)). In plus, numerotarea liniilor si coloanelor la matrice incepe de la 0, in vreme ce coordonatele x si y incep de la 1.


E nevoie, deci, de acele substituiri pentru a putea afisa elementele unei matrici de 10x10 elemente in punctele corespunzatoare de pe ecranul nostru virtual de 10x10 puncte. In lipsa oricarei substituiri matricea ar fi afisata pe ecran ca si cum ar fi rotita cu 90 de grade la stanga si deplasata cu -1 atat pe orizontala cat si pe verticala.

Catalin
Catalin

Salut,

Te rog frumos sa ma ajuti putin, nu imi dau seama de ce nu merge. Am incercat sa memorez valoarea fiecarei pozitii din matrice cu 1sau 0 (pt o tabla de sah). Ar trebui sa imi aprinda coordonatele x,y atunci cand m[x][y]=1.

Multumesc mult!


var m = Matrice(10, 10);

var x=1;

//initializam elementele matricii

while(x<=10)

{

var y=1;

  while(y<=10)

  {

    if((x%2==1)&&(y%2==1))

       m[x][y]=1;

     else

       m[x][y]=0;

    if((x%2==0)&&(y%2==0))

       m[x][y]=1;

     else

       m[x][y]=0;

    y=y+1;

  }

  x=x+1;

}

x =1;

while(x<=10)

{

  y =1;

  while(y<=10)

  {

    if(m[x][y]==1)

      Aprinde(x,y);

    else

      Stinge(x,y);

    y=y+1;

  }

x=x+1;

}

Florin Birleanu
Florin Birleanu moderator

@Catalin Esti aproape :-). Daca:

1) faci matricea m de 11x11 elemente

2) si elimini ramura de "else" din cel de-al doilea "if"

programul tau va face ceea ce iti doresti.


Gandeste-te putin si daca totusi e neclar spune-mi si voi reveni cu explicatii.

Catalin
Catalin

@Florin Birleanu Am facut ce mi-ai recomandat si intr-adevar a mers.

Totusi, as fi recunoscator pentru mai multe detalii legate de recomandarile facute.


De asemenea, vreau sa te felicit pentru initiativa de a sustine aceste cursuri online, cred ca este cea mai buna modalitate de a invata programarea de la 0, chiar oricine poate sa invete daca parcurge cu atentie fiecare pas. (Recunosc, imi este putin mai usor datorita cunostintelor acumultate in liceu/facultate).


Tot respectul,


Catalin

Cristian
Cristian

// 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
                       if (m[l][c] == 1)
                 {
                      Aprinde(c, 10-l)
                 }
               }
               else
               {
                      m[l][c] = 0
                    if (m[l][c] == 0)
                    {
                      Stinge (c, l)
                    } 
               }
               c = c+1
        }
        l = l+1
 }
  Pauza()
  l = 0
  while (l < 10)
 {
        c = 0
        while (c < 10)
        {
               if ( ((l+c)%2) == 0 )
               {
                      m[l][c] = 1
                       if (m[l][c] == 1)
                 {
                      Stinge(c, 10-l)
                 }
               }
               else
               {
                      m[l][c] = 0
                    if (m[l][c] == 0)
                    {
                      Aprinde(c, l)
                    } 
               }
               c = c+1
        }
        l = l+1
 }
 

//la final imi da o eroare pe ultima linie, ma puteti ajuta de ce?Multumesc

Florin Birleanu
Florin Birleanu moderator

@Cristian Nu vad nicio eroare. Doar faptul ca ai iesit din ecran cu desenul :-). A se revedea parametrii transmisi functiei Aprinde(...)...

Trackbacks

  1. […] te rog, la lectia anterioara si reia ultimul program pe care ti l-am oferit ca exemplu. Dupa cum ai vazut, programul mai intai […]

  2. […] Invata apoi cum sa iti grupezi zeci sau chiar sute de variabile in vectori si matrici si cum sa lucrezi simplu cu ele in lectia asta. […]