Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports System.Text
- Module Module1
- ' E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri.
- ' I primi 15 sono relativi ai dati personali (nome, cognome, sesso, data di nascita e luogo di nascita)
- ' mentre l'ultimo è un carattere di controllo che viene calcolato con delle formule applicate ai precedenti
- ' 15 caratteri.
- Structure DatiPersonali
- Dim nome As String
- Dim cognome As String
- Dim sesso As String
- Dim datanascita As DateTime
- Dim luogonascita As String
- End Structure
- Structure ConsonantiVocali
- Dim consonanti As String
- Dim vocali As String
- End Structure
- Function SeparaLettere(testo As String) As ConsonantiVocali
- Dim risultato As ConsonantiVocali
- risultato.vocali = ""
- risultato.consonanti = ""
- ' scorro il testo mettendolo in maiuscolo carattere per carattere
- 'For i As Integer = 1 To testo.Length - 1
- ' Dim ch As Char = testo.Chars(i)
- For Each ch As Char In testo.ToUpper
- ' If ch >= "A" And ch <= "Z" Then
- If "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Contains(ch) Then ' si tratta di un carattere alfabetico
- ' IF ch = "A" Or ch = "E" Or ch = "I" Or ch = "O" Or ch = "U" then
- If "AEIOU".Contains(ch) Then ' si tratta di una vocale
- risultato.vocali &= ch
- Else ' si tratta di una consonante
- risultato.consonanti &= ch
- End If
- End If
- Next
- Return risultato
- End Function
- Function GestisciCognome(cognome As String) As String
- ' separo le lettere che compongono il nome
- Dim cv As ConsonantiVocali = SeparaLettere(cognome)
- ' Sono necessari 3 caratteri per rappresentare il cognome,
- ' e sono la prima la seconda e la terza consonante del cognome.
- Dim risultato As String = cv.consonanti
- ' E' possibile che le consonanti siano meno di tre,
- ' in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
- If risultato.Length < 3 Then
- risultato &= cv.vocali
- End If
- ' Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
- If risultato.Length < 3 Then
- risultato &= "X"
- Else
- ' Substring prende una sottostringa: in questo caso 3 caratteri a partire da quello in posizione 0
- risultato = risultato.Substring(0, 3) ' mi devo preoccupare se eventualmente ho aggiunto troppe vocali
- End If
- ' Chiaramente se ci sono cognomi con più parti, è necessario rimuovere
- ' gli spazi e considerare tutto come un cognome unico.
- Return risultato
- End Function
- Function GestisciNome(nome As String) As String
- ' separo le lettere che compongono il nome
- Dim cv As ConsonantiVocali = SeparaLettere(nome)
- ' Per il nome il discorso è analogo con la particolarità che se il nome è composto
- ' da 4 o più consonanti vengono prese nell'ordine la prima, la terza e la quarta.
- Dim risultato As String = cv.consonanti
- If risultato.Length > 3 Then
- risultato = risultato.Chars(0) & risultato.Substring(2, 2)
- ' risultato = risultato.Remove(1)
- End If
- ' Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3
- ' e allo stesso modo si aggiungo le vocali.
- If risultato.Length < 3 Then
- risultato &= cv.vocali
- End If
- ' Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire
- ' i caratteri mancanti con delle X.
- If risultato.Length < 3 Then
- risultato &= "X"
- Else
- risultato = risultato.Substring(0, 3) ' mi devo preoccupare se eventualmente ho aggiunto troppe vocali
- End If
- ' Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
- Return risultato
- End Function
- ' un po' di alternative... :D
- Function SeparaLettere2(testo As String) As ConsonantiVocali
- Dim vocali As New StringBuilder
- Dim consonanti As New StringBuilder
- Dim risultato As ConsonantiVocali
- ' scorro il testo mettendolo in maiuscolo carattere per carattere
- For Each ch As Char In testo.ToUpper
- If Char.IsLetter(ch) Then ' si tratta di un carattere alfabetico
- If "AEIOU".Contains(ch) Then ' si tratta di una vocale
- vocali.Append(ch)
- Else ' si tratta di una consonante
- consonanti.Append(ch)
- End If
- End If
- Next
- risultato.vocali = vocali.ToString
- risultato.consonanti = consonanti.ToString
- Return risultato
- End Function
- Function GestisciCognome2(cognome As String) As String
- Dim cv As ConsonantiVocali = SeparaLettere(cognome)
- Return String.Format("{0}{1}", cv.consonanti, cv.vocali).PadRight(3, "X").Substring(0, 3)
- End Function
- Function GestisciNome2(nome As String) As String
- Dim cv As ConsonantiVocali = SeparaLettere(nome)
- If cv.consonanti.Length > 3 Then cv.consonanti = cv.consonanti.Remove(1, 1)
- Return String.Format("{0}{1}", cv.consonanti, cv.vocali).PadRight(3, "X").Substring(0, 3)
- End Function
- Function CalcolaCodiceFiscale(dati As DatiPersonali) As String
- Dim risultato As String = ""
- ' è composto dai seguenti blocchi:
- '- 3 lettere per il cognome
- risultato &= GestisciCognome(dati.cognome)
- '- 3 lettere per il nome
- risultato &= GestisciNome(dati.nome)
- '- l'anno di nascita (numero)
- '- il mese della data di nascita (lettera)
- '- il giorno della data di nascita (numero)
- risultato &= "00X00"
- '- il codice del comune di nascita
- risultato &= "X000"
- '- il carattere di controllo
- risultato &= "X"
- Return risultato
- End Function
- Sub Main()
- Dim p As DatiPersonali
- p.nome = "Paperon"
- p.cognome = "De' Paperoni"
- p.sesso = "m"
- p.datanascita = "1/1/1900"
- p.luogonascita = "Paperopoli"
- Dim cf As String = CalcolaCodiceFiscale(p)
- Console.WriteLine("Il codice fiscale è: {0}", cf)
- End Sub
- End Module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement