Small Basic: Proceduri


Mergem mai departe? Desigur! Vom vedea astăzi probabil penultima mare cărămidă legată de Small Basic, de partea de programare. E vorba de proceduri (urmând că mâine să vedem şirurile). Dar ca să putem ajunge la ele, să simţim raţiunea existenţei lor, să ne imaginăm o nouă problemă. Ce să fie, ce să fie? Să zicem că avem un număr de patru cifre şi dorim să aflăm suma cifrelor lui. Ultima cifră este restul împărţirii respectivului număr la 10. Penultima cifră o aflăm similar, scăpând de ultima cifră (cu împărţire la 10 rotunjită în jos). Similar a doua cifră. Iar prima, ei bine, este rezultatul împărţirii la 1000 (tot cu rotunjire în jos). Sau direct codul:

nr=Math.GetRandomNumber(9000)+999
c4=Math.Remainder(nr,10)
c3=Math.Remainder(Math.Floor(nr/10),10)
c2=Math.Remainder(Math.Floor(nr/100),10)
c1=Math.Floor(nr/1000)
TextWindow.WriteLine(c1+"+"+c2+"+"+c3+"+"+c4+"="+(c1+c2+c3+c4))

După cum observaţi, în prima linie am generat un număr între 1000 şi 9999 (de fapt între 1 şi 9000, dar i-am adăugat 999, deci avem intervalul dorit). Apoi am luat de la ultima cifră (c4) până la prima (c1), memorându-le în cele patru variabile. La final am afişat suma cifrelor. Exemple de rezultate ale acestui cod: 1+8+5+6=20 sau 9+3+8+2=22. Acum să ducem mai sus nivelul de dificultate. Să zicem că generăm trei numere, le afişăm pe ecran şi spunem care are cea mai mare sumă a cifrelor. Ei bine, deja ne vedem copiind codul de mai sus de trei ori, plus comparaţiile şi afişările. Of… Ei bine, putem scurta puţin codul folosind proceduri. Acestea sunt secvenţe de cod care primesc un nume – acesta apelat, cu parantezele pe care le ştim de la operaţiile claselor, se execută secvenţa. Iată structura generică.

Sub NumeleProcedurii
   ...
EndSub

Dacă procedurile din Small Basic ar fi suportat atât parametrii, cât şi returnarea de valori (cum se poate în PHP, de exemplu, dar mai în orice limbaj de programare), lucrurile ar fi fost muuult mai simple şi codul mai scurt. Dar, am mai spus-o, Small Basic merge pe un minim de instrucţiuni, şi acelea simplificate. Asta e… Deci! Cum facem problema de mai sus? Cu codul de mai jos:

SumaCifrelor()
suma1 = suma
nr1 = nr
SumaCifrelor()
suma2 = suma
nr2 = nr
SumaCifrelor()
suma3 = suma
nr3 = nr
max = Math.Max(suma1,Math.Max(suma2,suma3))
TextWindow.WriteLine("Cele trei numere aleatoare sunt: "+nr1+", "+nr2+" si "+nr3+".")
'TextWindow.WriteLine("Cele trei numere aleatoare sunt: "+nr1+" ("+suma1+"), "+nr2+" ("+suma2+") si "+nr3+" ("+suma3+").")
If max=suma1 Then
  TextWindow.WriteLine("Primul numar are suma cifrelor cea mai mare!")
Else
  If max=suma2 Then
    TextWindow.WriteLine("Al doiea numar are suma cifrelor cea mai mare!")
  Else
    TextWindow.WriteLine("Al treilea numar are suma cifrelor cea mai mare!")
  EndIf
EndIf

Sub SumaCifrelor
  nr=Math.GetRandomNumber(9000)+999
  c4=Math.Remainder(nr,10)
  c3=Math.Remainder(Math.Floor(nr/10),10)
  c2=Math.Remainder(Math.Floor(nr/100),10)
  c1=Math.Floor(nr/1000)
  suma=c1+c2+c3+c4
EndSub

Observaţi procedura SumaCifrelor. Ea se execută pe numărul nr şi dă rezultatul în suma. Luăm aceste valori după fiecare apel. Chiar şi aşa am redus codul, iar în linia 9 avem deja şi numerele aleatoare şi sumele. Calculăm maximul dintr-un şut în linia 10, afişăm numerele, iar apoi testăm care a dat suma maximă a cifrelor. Vedem în execuţie codul mai jos: deşi primul număr e al doilea ca mărime, are cea mai mare sumă a cifrelor (17, faţă de 16 al doilea şi tot 16 al treilea).

imagine

Cam atât despre proceduri. Dau aripi dacă acum aflaţi prima oară de ele. Tai aripile dacă ştiţi puterea funcţiilor din alte limbaje de programare. De exemplu poate unii se gândesc la funcţii recursive… înţeleg că sunt posibile, simulând parametrii pentru o procedură cu clasa Stack.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (1 evaluări, media: 5,00 din 5)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *