Progamma su visual basic

Superlilu1
Salve a tutti!!!ho bisogno del vostro aiuto spero che qualcuno possa aiutarmi...ho bisogno di un programma fatto su visual basic che dato in input un numero lo dia in output in lettere....ovvero 2150 --->duemilacentocinquanta
Grazie a tutti!!!

Risposte
U|isse
il programma è fatibile solo che è macchinoso, devi assegnare a ogni numero il corrispettivo in parole es
1 uno
2 due etc.
poi fai
10 dieci
20 venti

sopratutto devi assegnare quelli che variano tipo
11 undici
12 dodici

poi quando dai l'input per la conversione li fai leggere quanti caratteri ha, così richiami la funzione giusta che comprende i tuoi caratteri
es 23 richiama la funzione a due caratteri
quindi se il primo n° nella funzione 2 caratteri è 2 allora scrivi Venti & l'ultimo carattere che lo puoi rilevare con la funzione left, che è tre quindi
text.text = "Venti" & "tre"

è molto macchino e ci perderesti molto tempo

lorven
Il problema proposto è un classico dell'informatica gestionale (si pensi come esempio alla scrittura automatica degli assegni) e trova varie soluzioni, tutte comunque rifacentesi alla logica accennatta da Ulisse: in rete se ne trovano molto facilmente.
Io stesso, in passato, ne avevo scritto un algoritmo in Pascal, Cobol, ma non in Visual Basic.
Pescando nella rete, ho trovato un buon algoritmo, che, notevolmente modificato e semplificato (faceva molte altre cose), è diventato quello che segue, valido per la conversione di interi positivi tra 0 e 2.147.483.647 e che pare funzionare regolarmente.

Option Explicit

Private Function ConvNumInLett(Num As Long) As String
    
    Const LMax = 12
    Dim ValIn As String
    Dim ValStr As String
    Dim StrFin As String
    Dim cent As Integer
    Dim dec As Integer
    Dim unit As Integer
    Dim i As Integer

    Dim VetNumInLett As Variant
            
    VetNumInLett = Array("Zero", "Uno", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove", _
                         "Dieci", "Undici", "Dodici", "Tredici", "Quattordici", "Quindici", _
                         "Sedici", "Diciassette", "Diciotto", "Diciannove", _
                         "Venti", "Trenta", "Quaranta", "Cinquanta", _
                         "Sessanta", "Settanta", "Ottanta", "Novanta", _
                         "Cento", "Mille", "Mila", "UnMilione", "Milioni", "UnMiliardo", "Miliardi", "overflow!")
     
    If Num = 0 Then
        StrFin = VetNumInLett(0)
        ConvNumInLett = StrFin
        Exit Function
    End If
    ValIn = Format(Num, String(LMax, "0"))
    StrFin = ""
    
    For i = 1 To (LMax \ 3)
        ValStr = Mid(ValIn, i * 3 - 2, 3)
        cent = Val(Mid(ValStr, 1, 1))
        dec = Val(Mid(ValStr, 2, 1))
        unit = Val(Mid(ValStr, 3, 1))
        If (cent = 1) Then
            StrFin = StrFin & VetNumInLett(28)
            ElseIf (cent > 1) Then StrFin = StrFin & VetNumInLett(cent) & VetNumInLett(28)
        End If
        If (dec = 0) Then
           If (unit > 0) Then StrFin = StrFin & VetNumInLett(unit)
               ElseIf (dec = 1) Then
                       StrFin = StrFin & VetNumInLett(10 + unit)
                       Else
                            StrFin = StrFin & VetNumInLett(dec + 18)
                            If ((unit = 1) Or (unit = 8)) Then StrFin = Left(StrFin, Len(StrFin) - 1)
                            If ((unit > 0) And (dec <> 1)) Then StrFin = StrFin & VetNumInLett(unit)
           End If
        If (i < 4) Then
            If (ValStr = "001") Then
                StrFin = Left(StrFin, Len(StrFin) - Len(VetNumInLett(1)))
                StrFin = StrFin & VetNumInLett(36 - (i * 2) - 1)
                ElseIf (ValStr <> "000") Then
                    StrFin = StrFin & VetNumInLett(36 - (i * 2))
            End If
        End If
    Next

ConvNumInLett = StrFin
End Function

Private Sub Form_Load()
Dim NumInCifre As Long
Dim x As Long
Dim NumInLett As String
Dim Finito As Boolean

On Error GoTo fine
Finito = False
While Not Finito
   NumInCifre = InputBox("immetti numero (Esc=fine):")
   If NumInCifre < 0 Then
      Finito = True
      Else
           NumInLett = ConvNumInLett(NumInCifre)
           MsgBox Str(NumInCifre) + "=" + NumInLett
   End If
Wend

fine: MsgBox "fine conversione"
End
End Sub


Spero continui a funzionare e risulti comprensibile
Ciao! :D

Superlilu1
il concetto l'avevo già capito solo che non sapevo come applicare tutto questo....
il tuo programma funziona solo che la maggior parte delle cose che tu hai messo io non le ho ancora studiate...

lorven
Non so cosa ti risulta ostico in questo programma...
Se ti è stato assegnato questo esercizio, sicuramente hai studiato la gestione delle stringhe, con le relative funzioni, e sicuramente conoscerai anche i vettori, i cicli FOR e WHILE, le FUNCTION...
Forse potresti non conoscere il tipo VARIANT, utilizzato per inizializzare il vettore, cosa peraltro fattibile con una serie di assegnazioni, o qualche altro dettaglio...
Specifica i punti poco chiari, oppure, se ti è chiaro il ragionamento da seguire, prova ad impostare una tua soluzione e vediamo di correggerne gli eventuali errori. :-)

Superlilu1
Option Explicit

Private Function ConvNumInLett(Num As Long) As String
    
    Const LMax = 12
    Dim ValIn As String
    Dim ValStr As String
    Dim StrFin As String
    Dim cent As Integer
    Dim dec As Integer
    Dim unit As Integer
    Dim i As Integer

    Dim VetNumInLett As Variant
            
    VetNumInLett = Array("Zero", "Uno", "Due", "Tre", "Quattro", "Cinque", "Sei", "Sette", "Otto", "Nove", _
                         "Dieci", "Undici", "Dodici", "Tredici", "Quattordici", "Quindici", _
                         "Sedici", "Diciassette", "Diciotto", "Diciannove", _
                         "Venti", "Trenta", "Quaranta", "Cinquanta", _
                         "Sessanta", "Settanta", "Ottanta", "Novanta", _
                         "Cento", "Mille", "Mila", "UnMilione", "Milioni", "UnMiliardo", "Miliardi", "overflow!")
     
    If Num = 0 Then
        StrFin = VetNumInLett(0)
        ConvNumInLett = StrFin
        Exit Function
    End If
 ----->   ValIn = Format(Num, String(LMax, "0")) <-----
    StrFin = ""
    
    For i = 1 To (LMax \ 3)
        ValStr = Mid(ValIn, i * 3 - 2, 3)
        cent = Val(Mid(ValStr, 1, 1))
        dec = Val(Mid(ValStr, 2, 1))
        unit = Val(Mid(ValStr, 3, 1))
        If (cent = 1) Then
            StrFin = StrFin & VetNumInLett(28)
            ElseIf (cent > 1) Then StrFin = StrFin & VetNumInLett(cent) & VetNumInLett(28)
        End If
        If (dec = 0) Then
           If (unit > 0) Then StrFin = StrFin & VetNumInLett(unit)
               ElseIf (dec = 1) Then
                       StrFin = StrFin & VetNumInLett(10 + unit)
                       Else
                            StrFin = StrFin & VetNumInLett(dec + 18)
                            If ((unit = 1) Or (unit = 8)) Then StrFin = Left(StrFin, Len(StrFin) - 1)
                            If ((unit > 0) And (dec <> 1)) Then StrFin = StrFin & VetNumInLett(unit)
           End If
        If (i < 4) Then
            If (ValStr = "001") Then
                StrFin = Left(StrFin, Len(StrFin) - Len(VetNumInLett(1)))
                StrFin = StrFin & VetNumInLett(36 - (i * 2) - 1)
                ElseIf (ValStr <> "000") Then
                    StrFin = StrFin & VetNumInLett(36 - (i * 2))
            End If
        End If
    Next

ConvNumInLett = StrFin
End Function

Private Sub Form_Load()
Dim NumInCifre As Long
Dim x As Long
Dim NumInLett As String
Dim Finito As Boolean

On Error GoTo fine
Finito = False
While Not Finito
   NumInCifre = InputBox("immetti numero (Esc=fine):")
   If NumInCifre < 0 Then
      Finito = True
      Else
           NumInLett = ConvNumInLett(NumInCifre)
           MsgBox Str(NumInCifre) + "=" + NumInLett
   End If
Wend

fine: MsgBox "fine conversione"
End
End Sub


si i vettori, i cicli ,le function e le funzioni delle stringhe che tu hai usato io le ho già studiate, però questo programma mi confonde un pò anche perchè quello che ho indicato non capisco a cosa serve....e il tipo variant non l'ho mai studiato...ti chiedo scusa bisogna avere molta pazienza com me...x me poter capire questo esercizio e poterlo modificare in modo da farlo mio è molto importante perchè il prof lo ha assegnato solo a quelli più bravi e se riesco a farlo anche se non perfetto e con qualche errore potrebbe aiutarmi molto a prendere 10....

lorven
Come ti avevo accennato, si può riempire il vettore VetNumInLett, dichiarato String, con una serie di assegnazioni.

    Dim VetNumInLett(36) As String
    VetNumInLett(0) = "Zero"
    VetNumInLett(1) = "Uno"
    VetNumInLett(2) = "Due"
    VetNumInLett(3) = "Tre"
    VetNumInLett(4) = "Quattro"
    VetNumInLett(5) = "Cinque"
    VetNumInLett(6) = "Sei"
    VetNumInLett(7) = "Sette"
    VetNumInLett(8) = "Otto"
    VetNumInLett(9) = "Nove"
    VetNumInLett(10) = "Dieci"
    VetNumInLett(11) = "Undici"
    VetNumInLett(12) = "Dodici"
    VetNumInLett(13) = "Tredici"
    VetNumInLett(14) = "Quattordici"
    VetNumInLett(15) = "Quindici"
    VetNumInLett(16) = "Sedici"
    VetNumInLett(17) = "Diciassette"
    VetNumInLett(18) = "Diciotto"
    VetNumInLett(19) = "Diciannove"
    VetNumInLett(20) = "Venti"
    VetNumInLett(21) = "Trenta"
    VetNumInLett(22) = "Quaranta"
    VetNumInLett(23) = "Cinquanta"
    VetNumInLett(24) = "Sessanta"
    VetNumInLett(25) = "Settanta"
    VetNumInLett(26) = "Ottanta"
    VetNumInLett(27) = "Novanta"
    VetNumInLett(28) = "Cento"
    VetNumInLett(29) = "Mille"
    VetNumInLett(30) = "Mila"
    VetNumInLett(31) = "UnMilione"
    VetNumInLett(32) = "Milioni"
    VetNumInLett(33) = "UnMiliardo"
    VetNumInLett(34) = "Miliardi"
    VetNumInLett(35) = "overflow!"
            

L'istruzione:
ValIn = Format(Num, String(LMax, "0"))

effettua una conversione e normalizzazione del dato numerico in stringa, allineandolo a destra e riempiendo gli spazi mancanti a sinistra con degli zeri, fino alla lunghezza LMax.
Si può ottenere lo stesso risultato con le funzioni stringa che già conosci.
Prova!
:)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.