Dark Binary Converter



Quando facevo pagine ASP per lavoro mi tocco' imparare un po' di VB. Tanto quanto basta x fare 2 cassate (c'ho la "z" sifula...), tra cui il Dark Binary che ora vi illustro.
Per utilizzarlo dovete farvi una form con 2 textfield e un button:

Bottone -> il button
numTxt  -> il textfield dove si inserisce il numero da convertire
resTxt  -> il textfield dove visualizzare il risultato


Il simpatico programmillo converte numeri decimali in binario. Veramente un programmone... lo so!
Ma lo metto lo stesso perche' trovo interessante la funzione Sub Calcola(n) in quanto fa uso della ricorsione, che per i coders alle prime armi puo' essere un passaggio un po' ostico...

 


 

'variabile in cui verra' scritto il risultato
Dim result

'funzione che calcola il log in base 2 del numero passato
Static Function Log2(X)
   Log2 = Log(X) / Log(2#)
End Function

'funzione che indica se il numero passato e' una potenza di 2
Static Function Ridurre(X)
  Dim a, b As Integer

  a = Log2(X)
  b = Int(a)
  If a = b Then 'se "a" e' intero, allora "X" e' una                    potenza di 2 e non va ridotta....
   Ridurre = 0
  Else
   Ridurre = 1
  End If
End Function

Static Function LogInt(X)
  LogInt = Int(Log2(X))
End Function

'la funzione Calcola() e' il cuore del proggo. Grazie alla ricorsione scompongo il numero passato in potenze di 2. Ad esempio: il numero inserito dall'utente e' 45. il proggo chiama Calcola(45), la funzione Calcola() trova la maggiore potenza di 2 minore o uguale a 45, che e' 32, ovvero 2^5. Fa la differenza tra 45 e 32 e trova 13. A questo punto si controlla se 13 sia uguale a 0 oppure no. Se 13 fosse uguale a 0 signigicherebbe che 32 e' il numero inserito dall'utente e il numero inserito, in binario, sarebbe 10^5. Ma 13 non e' uguale a 0, quindi storiamo 10^5 in una variable e richiamiamo Calcola() passandogli 13. E siamo al secondo giro. La maggiore potenza di 2 minore o oguale a 13 e' 8, cioe' 2^3. 13 - 8 = 5. Alla variabile storata prima, che vale 10^5, aggiungiungiamo 2^3. Ovvero: 10^5 + 10^3 = 101000 e sovrascriviamo la variabile col nuovo risultato. Richiamiamo Calcola() passandogli 5... e si ricomincia!! Ovviamente Calcola(5) e' il terzo passaggio, in quanto io ho spiegato i primi due giri. Cmq, per dovere di cronaca, il numero finale, ovvero 45 espresso in binario, e' 101101 !

Sub Calcola(n As Double)
  Dim a As Integer
  a = Ridurre(n) 'restituisce la maggiore potenza di 2 di n
  If a = 0 Then
   result = result + 10 ^ Log2(n)
  Else
   par = 10 ^ (LogInt(n))
   result = result + par
   Calcola (n - 2 ^ (LogInt(n))) 'la ricorsione !!
 End If
End Sub

 

'-->>-->>-->> Tutto inizia qui!! <<--<<--<<--
Private Sub Bottone()

 num = numTxt.Text   'prendi il numero dal form
 result = 0
 For a = 1 To Len(num)
 Dim test
 test = 0

'controllo se il numero immesso e' un numero
 For b = 0 To 9    
  lett = Mid(num, a, 1)
  ret = StrComp(lett, b)
  If ret = 0 Then
   test = 1
   Exit For
  End If
  If b = 9 And test = 0 Then
   MsgBox ("Inserire un numero valido!")
   numTxt.Text = ""
   Exit Sub
  End If
  Next b
 Next a
 r = InStr(num, a)
 If num = "" Then
  MsgBox ("Inserire un numero valido !")
 Else
  Calcola (num)
  resTxt.Text = result
 End If
End Sub