Progamma su visual basic
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!!!
Grazie a tutti!!!
Risposte
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
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
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.
Spero continui a funzionare e risulti comprensibile
Ciao!
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!
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...
il tuo programma funziona solo che la maggior parte delle cose che tu hai messo io non le ho ancora studiate...
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.
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.
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....
Come ti avevo accennato, si può riempire il vettore VetNumInLett, dichiarato String, con una serie di assegnazioni.
L'istruzione:
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!
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!