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!
