start     Articole     Despre mine    

Invata sa aduni ca un programator

Mai tii minte cum se aduna doua numere? Da, le scrii pe hartie unul sub celalalt si apoi le aduni cifra cu cifra, incepand cu cifra cel mai din dreapta (adica cifra unitatilor). Exact asta vom face in acest articol. Doar ca in loc de foaie de hartie vom folosi ecranul igotopic si in loc de creier vom scrie un program cu ajutorul caruia calculatorul va efectua adunarea celor doua numere.

Dar pentru asta ne trebuie o modalitate de a afisa numere (si alte simboluri) in simulatorul nostru igotopic. Am introdus in acest scop functia Afiseaza, care are trei parametri obligatorii si un parametru optional:

text <– poate fi un numar intre 0 si 9 sau un caracter afisabil (scris intre apostrofuri).

xx <– este coordonata pe axa x a casutei in care se va face afisarea lui text.

yy <– este coordonata pe axa y a casutei in care se va face afisarea lui text.

– (optional) cc <– este fie un cod de culoare (dintre ALB, NEGRU, ROSU, VERDE, ALBASTRU, GRI, GALBEN, TURCOAZ), fie un numar intre 0 si 7 care identifica una dintre cele 8 culori mentionate (in aceeasi ordine). (Daca acest parametru lipseste in apelul functiei, culoarea standard este NEGRU.)

 

Gata cu introducerea. Hai sa vedem programul de adunare la treaba. Apasa butonul “Reseteaza…” si in caseta din stanga va aparea codul sursa (pe care il poti rula apasand butonul “Executa…”).

(Browserul tau nu suporta Canvas!…)

 

Dupa cum ai putut vedea daca ai analizat codul sursa al programului, cele doua numere de adunat sunt stocate ca vectori (nr1, respectiv nr2) in care fiecare element este o cifra din numar, iar adunarea lor se face cifra cu cifra, rezultatul fiind pus in vectorul rez. Un rol important il are si variabila transport (care “tine minte 1” atunci cand suma a doua cifre depaseste valoarea 9).

Nu e greu, nu-i asa? Te provoc sa modifici programul astfel incat in loc de adunare sa faca scaderea celor doua numere. Te bagi? ūüôā

 

Alatura-te celor peste 1000 de oameni din armata noastra de creiere cu muschi si vei primi testul care iti va spune daca ai sau nu minte de programator:

(nu trimit spam; te tin la curent cu noutatile)


 

Cu drag,

Florin





14 comments
SimionRadu
SimionRadu

am incercat mai multe numere, daca am gresit undeva va rog sa ma corectati 


// Program de adunare a doua numere:

// --------------------------------

// primul numar:


var nr1 = Vector(5);

nr1[0] = 3;

nr1[1] = 0;

nr1[2] = 0;

nr1[3] = 0;

nr1[4] = 0;


// al doilea numar:


var nr2 = Vector(5);

nr2[0] = 2;

nr2[1] = 9;

nr2[2] = 9;

nr2[3] = 9;

nr2[4] = 9;


// rezultatul:


var rez = Vector(6);

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;


Afiseaza('-', 9, 7, NEGRU);

var i = 4;

while (i>=0)

{

    Afiseaza(nr1[i], 8-(4-i), 7, ALBASTRU);

    Afiseaza(nr2[i], 8-(4-i), 6, ALBASTRU);

    Afiseaza('=', 8-(4-i), 5, NEGRU);

    i = i-1;


}


i = 0;

while (i < 5)

{

   rez[4-i] = nr1[4-i] - nr2[4-i];

   if (rez[4-i]<0)

   {

     var k=i+1

     while (k<5)

    {

      if(nr1[4-k]>0)

      {

        nr1[4-k]=nr1[4-k]-1;

        k=5;

      }

    else

    {

      nr1[4-k] = 9;

      k=k+1;


     }


    }


   rez[4-i] = rez[4-i] + 10;

  }

  i = i+1;


}

i = 4;

while (i>=0)

{

  if (rez[i]>0)

  Afiseaza(rez[i], 8-(4-i), 4, ROSU);

  i = i-1;

}

geocislariu
geocislariu

La scadere marea problema aparea daca primul numar este mai mic decat al doilea dar cred ca am rezolvat aceasta problema.

 // Program de adunare a doua numere:

// --------------------------------

// primul numar:

var nr1 = Vector(5);
nr1[0] = 1;
nr1[1] = 1;
nr1[2] = 9;
nr1[3] = 9;
nr1[4] = 6;

// al doilea numar:

var nr2 = Vector(5);
nr2[0] = 2;
nr2[1] = 9;
nr2[2] = 8;
nr2[3] = 7;
nr2[4] = 5;

// rezultatul:

var rez = Vector(6);
rez[0] = 0;
rez[0] = 0;
rez[0] = 0;
rez[0] = 0;
rez[0] = 0;

// --------------------------------

//calculul diferentei (rez=nr1-nr.2):
var transport=0;
var dif=0;
var i=0;
while (i<5)
{if (nr1[0]>nr2[0] )
{ var diferenta=nr1[4-i]-dif-nr2[4-i];
if (diferenta<0)
{transport=10;
dif=1;
diferenta=diferenta+transport}
else
{transport=0;
dif=0;}
rez[5-i]=diferenta;
i=i+1;}
 else
{ var diferenta=nr2[4-i]-dif-nr1[4-i];
if (diferenta<0)
{transport=10;
dif=1;
diferenta=diferenta+transport}
else
{transport=0;
dif=0;}
rez[5-i]=diferenta;
i=i+1;}
}


// --------------------------------

// afisarea numerelor si a rezultatului:

Afiseaza('-', 9, 7, NEGRU);
i = 4;
while (i>=0)
{
  Afiseaza(nr1[i], 8-(4-i), 7, ALBASTRU);
  Afiseaza(nr2[i], 8-(4-i), 6, ALBASTRU);
  Afiseaza('=', 8-(4-i), 5, NEGRU);
  Afiseaza(rez[i+1], 8-(4-i), 4, ROSU);
  if (nr1[0]>nr2[0] )
   {Afiseaza('+', 3, 4, ROSU);}
  else
     {Afiseaza('-', 3, 4, ROSU);}   
  i = i-1;
}
if (rez[i+1] > 0)
{
  Afiseaza('=', 8-(4-i), 5, NEGRU);
  Afiseaza(rez[i+1], 8-(4-i), 4, ROSU);
}

cos_take
cos_take

Multumim  mult pentru solutie.

Recunosc ca chiar nu imi trecea prin cap introducerea variabilei cif.

Simteam ca mai trebuie ceva... dar ...dar ceva  era variabila cif.

(cif vine de la cifra?)

Florin Birleanu
Florin Birleanu moderator

@cos_take Da, numele variabilei "cif" vine de la "cifra" :-). Scopul ei e sa ma ajute sa parcurg la stanga de la pozitia curenta cifrele descazutului si sa transform toate eventualele cifre de 0 in cifre de noua, iar apoi din prima cifra nenula intalnita sa scad 1 (adica exact cum fac atunci cand fac scaderea a doua numere scriindu-le unul sub altul pe hartie).

cos_take
cos_take

Vad ca nu a mai indraznit nimeni sa dea o solutie.

Florine poate ne mai dai cateva  indicatii .



Florin Birleanu
Florin Birleanu moderator

@cos_take In mod normal nu dau solutii de-a gata, dar avand in vedere ca solutia aceasta are o complexitate mai ridicata, cred ca e un exercitiu suficient de bun intelegerea ei:


// Program de scadere a doua numere:


// --------------------------------


// primul numar:


var nr1 = Vector(5);

nr1[0] = 7;

nr1[1] = 1;

nr1[2] = 0;

nr1[3] = 0;

nr1[4] = 6;


// al doilea numar:


var nr2 = Vector(5);

nr2[0] = 2;

nr2[1] = 9;

nr2[2] = 8;

nr2[3] = 7;

nr2[4] = 9;


// rezultatul:


var rez = Vector(5);

rez[0] = 0;

rez[1] = 0;

rez[2] = 0;

rez[3] = 0;

rez[4] = 0;


// --------------------------------


// afisarea numerelor:


Afiseaza('-', 9, 7, NEGRU);

var i = 4;

while (i>=0)

{

Afiseaza(nr1[i], 8-(4-i), 7, ALBASTRU);

  Afiseaza(nr2[i], 8-(4-i), 6, ALBASTRU);

  Afiseaza('=', 8-(4-i), 5, NEGRU);

  i = i-1;

}


// --------------------------------


// calculul diferentei (rez = nr1-nr2):


i = 0;

while (i < 5)

{

  var diferenta = nr1[4-i] - nr2[4-i];

  if (diferenta < 0)

  {

    // e necesar sa fac imprumut

    var cif = i+1;

    while (cif < 5)

    {

      if (nr1[4-cif] > 0)

      {

        nr1[4-cif] = nr1[4-cif] - 1;

        cif = 5;

      }

      else //if (cif == 0)

      {

        nr1[4-cif] = 9;

   cif = cif + 1;

      }

    }

    // si abia apoi fac diferenta

    diferenta = diferenta + 10;

  }

  rez[4-i] = diferenta;

  i = i+1;

}


// --------------------------------


// afisarea rezultatului:


i = 4;

while (i>=0)

{

  Afiseaza(rez[i], 8-(4-i), 4, ROSU);

  i = i-1;

}


cos_take
cos_take

Nu cred ca asta este solutia corecta pentru scaderea celor numere ,dar rezultatul pare bun.

Mai mult am incercat sa pacalesc... programul !

Te rugam sa  ne dai si solutia corecta!

Merge oare si la inmultire sau impartire?!

// Program de adunare a doua numere: 


// --------------------------------


// primul numar:


var nr1 = Vector(5);

nr1[0] = 7;

nr1[1] = 1;

nr1[2] = 9;

nr1[3] = 9;

nr1[4] = 6;


// al doilea numar:


var nr2 = Vector(5);

nr2[0] = 2;

nr2[1] = 9;

nr2[2] = 8;

nr2[3] = 7;

nr2[4] = 5;


// rezultatul:


var rez = Vector(5);

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;

rez[0] = 0;


// --------------------------------


// calculul diferentei (rez = nr1-nr2):


var imprumut = 0;

var i = 0;

while (i < 4)

{

var diferenta = nr1[4-i] - nr2[4-i] + imprumut;

if (diferenta < 0)

{

    imprumut = 10;

    diferenta = diferenta + 10;

  }

  else

  {

    imprumut = 0;

  }

  rez[5-i] = diferenta;

  i = i+1;

}


rez[5-i] = 4;

i=5

// --------------------------------


// afisarea numerelor si a rezultatului:


Afiseaza('-', 9, 7, NEGRU);

i = 4;

while (i>=0)

{

  Afiseaza(nr1[i], 8-(4-i), 7, ALBASTRU);

  Afiseaza(nr2[i], 8-(4-i), 6, ALBASTRU);

  Afiseaza('=', 8-(4-i), 5, NEGRU);

  Afiseaza(rez[i+1], 8-(4-i), 4, ROSU);

  i = i-1;

}

if (rez[i+1] > 0)

{

  Afiseaza('=', 8-(4-i), 5, NEGRU);

  Afiseaza(rez[i+1], 8-(4-i), 4, ROSU);

}


Florin Birleanu
Florin Birleanu moderator

@cos_take Nu dau solutia, dar dau indicatii pentru a ajunge la ea :-). O prima indicatie ar fi sa faci programul sa functioneze corect pentru cazul in care cele doua numere sunt 30000 si 10001.

MihaiRobert
MihaiRobert

as putea sa stiu ce reprezinta acel "i" si de ce e mai mic ca 5?


Florin Birleanu
Florin Birleanu moderator

@MihaiRobert Articolul acesta se bazeaza pe "lectiile" deja "predate" pe site. Daca doresti sa te apuci de treaba, punctul de start este aici: http://igotopia.ro/vreau-sa-invat-programare-cum-sa-fac-4-pasi/ Mult spor! :-)


(Voi incerca, totusi, si sa raspund la intrebarea ta: Acel "i" este o variabila pe care o folosesc pe post de contor pentru a numara cele 5 cifre ale numerelor care se aduna. Valoarea initiala a lui "i" este 0, si apoi il cresc atata timp cat este mai mic decat 5. Deci ultima valoare a lui va fi 4. In total, 5 valori. Deci toti pasii din "while" se vor repeta de 5 ori -- adica pentru fiecare cifra in parte, incepand de la cifra unitatilor.)

CyCode
CyCode

BunńÉ seara,

Va rog, folosi»õi Clean Code. :)

CyCode
CyCode

@Florin Birleanu

Buna ziua,

Conceptul "Clean Code" sustinte o scriere mai clara a diferitelor concepte utilizate in program. Indiferent de ce se foloseste, variabile, constante, functii, nume de fisiere, conteaza si cum sunt denumite ele (spre exemplu, cu scopul de a reduce timpul si spatiul de clarificari prin comentarii). 

De exemplu, in loc de "xx", variabila pentru retinerea coordonatei pe axa X a casutei in care se retine textul, o denumire mai clara, desi mai lunga (in zilele noastre, cam fiecare mediu de programare are autocompletarea codului), ar fi "coordonataX"; alt exemplu, poate mai concludent, ar fi ca in loc de "cc", pentru cod de culoare, sa se scrie chiar "codCuloare". In acest fel, comentariile pentru ce reprezinta variabila, sunt de prisos.


Am dat doar cateva exemple, asa cum am fost rugat.

Este mult mai mult de discutat. Nu incape intr-un comentariu. Iar unul lung, ar putea plictisi lumea.

Florin Birleanu
Florin Birleanu moderator

@CyCode @Florin Birleanu Multumesc mult pentru raspuns! :-)


(Imi place conceptul, dar nu 100%. Consider ca un oarecare efort de abstractizare e necesar pentru un viitor programator. (Poate asta e si din cauza electronicii, care m-a invatat sa programez nu doar in limbaje de nivel inalt, ci si in asamblare si chiar in cod masina.))