Funciones y procedimientos en Visual Basic 2005 para calcular el valor en letras de un monto y el detalle del vuelto correspondiente (página 2)
Enviado por jaimemontoya
MONTO DE $82.00
MONTO DE $96.00
MONTO DE $100.0
CLICK AL BOTÓN LIMPIAR
CLICK AL BOTÓN SALIR
CÓDIGO DEL PROGRAMA
Los TextBox tienen los siguientes nombres de arriba hacia abajo:
montoapagar
montoenletras
efectivo
vuelto
billetes20
billetes10
billetes5
billetes1
Los tres botones tienen los siguientes nombres de izquierda a derecha:
calcular
limpiar
salir
CÓDIGO DEL FORMULARIO Y SUS CORRESPONDIENTES PROCEDIMIENTOS
Public Class Form1
Private Sub calcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles calcular.Click
If (montoapagar.Text = "") Then
MsgBox("Escriba el valor del monto.", MsgBoxStyle.Exclamation, "Cálculo de Montos")
montoapagar.Focus()
Else
If (montoapagar.Text > 100) Then
MsgBox("El monto no puede ser mayor que $100.00.", MsgBoxStyle.Exclamation, "Cálculo de Montos")
montoapagar.Text = ""
montoenletras.Text = ""
efectivo.Text = "$100.00"
vuelto.Text = ""
billetes20.Text = ""
billetes10.Text = ""
billetes5.Text = ""
billetes1.Text = ""
montoapagar.Focus()
Else
montoenletras.Text = montoenletras1(montoapagar.Text)
vuelto.Text = vuelto1(montoapagar.Text)
vueltoendetalle(vuelto.Text, billetes20.Text, billetes10.Text, billetes5.Text, billetes1.Text)
End If
End If
End Sub
Private Sub montoapagar_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles montoapagar.KeyPress
If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar) = 8) Then 'Los únicos caracteres que se permitirá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57).
'No se hace nada porque el caracter presionado es válido.
Else
'Beep() 'Emite sonido cuando se presiona una tecla que no está permitida o que es inválida.
e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos.
End If
End Sub
Private Sub salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles salir.Click
Dim mensaje As String
mensaje = MsgBox("¿Desea realmente salir del programa?", vbYesNo, "Cálculo de Montos")
If mensaje = 6 Then
End
End If
End Sub
Private Sub limpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles limpiar.Click
montoapagar.Text = ""
montoenletras.Text = ""
efectivo.Text = "$100.00"
vuelto.Text = ""
billetes20.Text = ""
billetes10.Text = ""
billetes5.Text = ""
billetes1.Text = ""
End Sub
End Class
CÓDIGO DEL MÓDULO Y SUS CORRESPONDIENTES FUNCIONES Y PROCEDIMIENTOS
Module Module1
Public Function unidades(ByVal montoapagar As Integer) As Integer
unidades = Val(Strings.Right(Str(montoapagar), 1)) 'A partir de la derecha, toma un valor, de modo que devuelve las unidades.
End Function
Public Function decenas(ByVal montoapagar As Integer) As Integer
decenas = Val(Strings.Left(Strings.Right(Str(montoapagar), 2), 1)) 'A partir de la derecha, toma dos valores. Luego de ese resultado, a partir de la izquierda toma un valor, de modo que devuelve las decenas.
End Function
Public Function montoenletras1(ByVal montoapagar As Integer) As String
Dim unidades1, decenas1 As Integer
unidades1 = unidades(montoapagar)
decenas1 = decenas(montoapagar)
montoenletras1 = ""
If (montoapagar >= 30) Then
Select Case decenas1
Case 3
montoenletras1 += "Treinta"
Case 4
montoenletras1 += "Cuarenta"
Case 5
montoenletras1 += "Cincuenta"
Case 6
montoenletras1 += "Sesenta"
Case 7
montoenletras1 += "Setenta"
Case 8
montoenletras1 += "Ochenta"
Case 9
montoenletras1 += "Noventa"
Case 0 'Si El valor es "100", el segundo digito de derecha a izquierda (el valor de las decenas) es "0".
montoenletras1 += "Cien"
End Select
Select Case unidades1
Case 1
montoenletras1 += " y uno"
Case 2
montoenletras1 += " y dos"
Case 3
montoenletras1 += " y tres"
Case 4
montoenletras1 += " y cuatro"
Case 5
montoenletras1 += " y cinco"
Case 6
montoenletras1 += " y seis"
Case 7
montoenletras1 += " y siete"
Case 8
montoenletras1 += " y ocho"
Case 9
montoenletras1 += " y nueve"
End Select
Return montoenletras1
Else
Select Case montoapagar
Case 0
Return "Cero"
Case 1
Return "Uno"
Case 2
Return "Dos"
Case 3
Return "Tres"
Case 4
Return "Cuatro"
Case 5
Return "Cinco"
Case 6
Return "Seis"
Case 7
Return "Siete"
Case 8
Return "Ocho"
Case 9
Return "Nueve"
Case 10
Return "Diez"
Case 11
Return "Once"
Case 12
Return "Doce"
Case 13
Return "Trece"
Case 14
Return "Catorce"
Case 15
Return "Quince"
Case 16
Return "Dieciséis"
Case 17
Return "Diecisiete"
Case 18
Return "Dieciocho"
Case 19
Return "Diecinueve"
Case 20
Return "Veinte"
Case 21
Return "Veintiuno"
Case 22
Return "Veintidos"
Case 23
Return "Veintitres"
Case 24
Return "Veinticuatro"
Case 25
Return "Veinticinco"
Case 26
Return "Veintiséis"
Case 27
Return "Veintisiete"
Case 28
Return "Veintiocho"
Case 29
Return "Veintinueve"
End Select
End If
End Function
Public Function vuelto1(ByVal montoapagar As Integer) As String
vuelto1 = (100 – montoapagar)
vuelto1 = "$" + vuelto1 'Concatenando "$" para la respuesta.
End Function
Public Sub vueltoendetalle(ByVal vuelto As String, ByRef billetes20 As String, ByRef billetes10 As String, ByRef billetes5 As String, ByRef billetes1 As String) 'Este es un procedimiento, no una funcion. Notese que el primer parametro es por valor y los demas por referencia. Es porque el primer parametro es para darle datos con que trabajar al procedimiento y los demas son donde se hacen los intercambios u operaciones. Los ultimos 4 parametros tienen que ser "ByRef", pues de lo contrario el programa no da error pero no funcionaria correctamente, pues esperaria parametros por valor provenientes de los TextBox. Lo que se pretende es que el procedimiento realice las respectivas operaciones y modifique las variables correspondientes que se le dan como parametro, de modo que imprimira los resultados en los TextBox correspondientes cuando estos se pasen correctamente como parametros del procedimientos cuando este sea llamado por el programa.
Dim residuo As Integer 'Ira almacenando los residuos
billetes20 = Str(Int(vuelto / 20)) 'Cuantos billetes de $20 se necesitan para dar el vuelto.
'billetes20 = Str(vuelto Mod 20) '"Str()" porque los parametros del procedimiento son tipo String, entonces se requiere la conversion.
residuo = vuelto Mod 20 'Residuo luego de dar los billetes de $20.00
billetes10 = Str(Int(residuo / 10)) 'Cuantos billetes de $10 se necesitan para dar el vuelto.
residuo = residuo Mod 10 'Residuo luego de dar los billetes de $10.00.
billetes5 = Str(Int(residuo / 5)) 'Cuantos billetes de $5 se necesitan para dar el vuelto.
residuo = residuo Mod 5 'Residuo luego de dar los billetes de $5.00.
billetes1 = Str(Int(residuo / 1)) 'Cuantos billetes de $1 se necesitan para dar el vuelto.
residuo = residuo Mod 1 'Residuo luego de dar los billetes de $1.00. Esta linea realmente no tiene sentido, pues dividir entre 1 no dara residuo diferente de cero, entonces se sabe que el residuo es cero.
End Sub
End Module
CONCLUSIÓN
Este sencillo programa permite comprender el uso y utilidad de funciones y procedimientos, así como percibir la diferencia entre la una y la otra. Básicamente la diferencia es que una función devuelve uno y sólo un valor, mientras que un procedimiento puede devolver varios valores o incluso no devolver ninguno.
Las funciones y procedimientos son fundamentales en la programación orientada a objetos, por lo cual es necesario comprender y utilizar adecuadamente estas poderosas herramientas. Analizar este programa y comprenderlo en su totalidad será de gran ayuda para aprender el uso y utilidad de las funciones y procedimientos.
Jaime Montoya
Santa Ana, 29 de enero de 2008
El Salvador
Página anterior | Volver al principio del trabajo | Página siguiente |