jueves, 29 de octubre de 2009

Cálculo de la Letra del DNI

Diseñar (diagrama de flujo) y codificar un programa VB.net que lea un Documento Nacional de Identidad (DNI) como una cadena de caracteres y lo valide, mostrando un mensaje “Correcto” o “Incorrecto” como resultado.

NOTA: Vamos a empezar con el ejemplo fácil, Un DNI correcto contiene 8 dígitos decimales y una letra de control. Cuando dominemos esto ya empezaremos con el tema de los DNI con una letra en la primera posición.

La letra de control se calcula de la siguiente manera:
• Obtener el resto de la división entera del número de 8 dígitos entre 23 y sumarle 1
• El valor obtenido indica la posición de la letra de control en la siguiente cadena: "TRWAGMYFPDXBNJZSQVHLCKE". Suponer que está definida como una constante llamada cad_ctrl (para no tener que andar copiándola).

Las validaciones a realizar son las siguientes:
• La longitud de la cadena de caracteres es 9
• Los ocho primeros caracteres son dígitos decimales
• El carácter noveno coincide con la letra calculada según el algoritmo propuesto

Veamos como quedaría el problema en forma de diagrama de flujo:



Creamos una aplicacion winForm y le añadimos 2 TextBox (textBox1 y textBox2) y un botón (button1)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dni As String
Dim c As String
Dim i As Integer
Dim correcto As Boolean
Dim cc As String
Dim num As Integer
Dim pos As Integer

dni = TextBox1.Text.ToUpper
If Len(dni) <> 9 Then
textBox2.text = "Error: longitud incorrecta"
Else
correcto = True
' Verificar los ocho dígitos decimales
For i = 1 To 8 Step 1
c = Mid(dni, i, 1)
If c < "0" Or c > "9" Then
correcto = False
End If
Next i 'Si los 8 primeros dígitos son numéricos devolverá: correcto=True

If correcto Then
c = Mid(dni, 9, 1) ' Tomamos la letra de control
c = UCase(c) ' La convertimos a mayúscula
num = Mid(dni, 1, 8) ' Obtenemos la cadena de los 8 dígitos
pos = num Mod 23 + 1 ' Calculamos la posición
cc = Mid("TRWAGMYFPDXBNJZSQVHLCKE", pos, 1)
If cc = c Then 'Si la letra de control introducida es igual a la que toca en "TRWA.. entonces es correcto
TextBox2.Text = "Es correcto"
Else
TextBox2.Text = "Error: letra incorrecta"
End If
Else 'Por aquí entrará cuando correcto = False
TextBox2.Text = "Error: el formato de DNI introducido no es correcto"
End If
End If

End Sub

Ejecutemos el programa y probemos estos ejemplos



A qué no es tan dificil!!!!

Pues ahora nos faltan esas cosas que nos darán un toque profesional:

1.- Agregar a nuestra validación que el dígito pueda ser una letra, ver cuadro adjunto:



Si la letra es L, K, X o M hay que substituir dicha letra por un 0, y si es Y por un 1 con lo que el resto de la validación anterior será totalmente operativa.

Al codigo que ya tenemos le copiamos este delante del comentario: ' Verificar los ocho dígitos decimales:

If Mid(dni, 1, 1) = "L" Or Mid(dni, 1, 1) = "K" Or Mid(dni, 1, 1) = "X" Or Mid(dni, 1, 1) = "M" Then
dni = "0" & Mid(dni, 2) 'Substituimos la letra inicial por un 0
End If
If Mid(dni, 1, 1) = "Y" Then
dni = "1" & Mid(dni, 2) 'Substituimos la letra inicial por un 1
End If

2.- Controlar que sólo se puedan escribir en el textbox1 las letras de la A a la Z, en mayúsculas y en minúsculas

Añadimos este sub a form1.vb

Private Sub DNI_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress
e.KeyChar = e.KeyChar.ToString.ToUpper
If ((((e.KeyChar < "0") Or (e.KeyChar > "9")) And ((e.KeyChar < "A") Or (e.KeyChar > "Z"))) And (e.KeyChar <> vbBack)) Then
e.Handled = True
End If
End Sub

No hay comentarios:

Publicar un comentario