viernes, febrero 03, 2006

Cajero Automático

' 3 de Febrero de 2006


Module Module1

Sub Main()
'Este programa simulara el cambio dado por un cajero automatico.
'Las denominaciones serán las siguientes:
'$500 pesos
'$200 pesos
'$100 pesos
'$50 pesos
'$20 pesos
'$10 pesos
'$5 pesos
'$2 pesos
'$1 peso
'El programa nos lanzara los multiplos de cada denominacion.

Dim Retiro As Integer, Total As Integer
Dim m_500 As Double, m_200 As Double, m_100 As Double, m_50 As Double, m_20 As Double, m_10 As Double

'm_500, m_200 etc... son los multiplos de cada billete
Dim m_5 As Double, m_2 As Double, m_1 As Double
Dim Txt_Retiro As String

Console.WriteLine("¿Cuánto quieres retirar?")
Retiro = Console.ReadLine()
Total = Retiro
' En esta seccion preguntamos por la primer Denominacion
If Retiro >= 500 Then
m_500 = Retiro / 500
'Seccion de comentarios:
'Dividimos entre 500 para sacar los multiplos de 500
'Pero el resultado de m_500 puede tener fraccion por ser flotante.
'Entonces es necesario quitarle el punto y sus fracciones.
'En clase vimos como ejemplo que el usuario quisiera retirar $925.00 pesos
'Entonces los multiplos de 500 serian solo 1
'925/500 = 1.85
'Lo que queremos es que m_500 sea: 1 y no (1.85)
'Si Hubiesemos declarado m_500 como Entero (Integer) el programa redondea el resultado
'Es como si le hubieramos aplicado un m_500 Math.Round (Retiro/500)
'El valor de m_500 seria: 2 en lugar de 1.85
'Como no es lo que queremos entonces tenemos que convertir el valor de m_500 a
'Cadena para poderle eliminar las fracciones y su punto.
'Es lo que se realizara a continuacion con la funcion (Convierte)
m_500 = Convierte(m_500)
Retiro = Retiro - m_500 * 500
Txt_Retiro = "$500X" + m_500.ToString()
End If
'Hasta aqui ya identificamos si el total a retirar es mayor a 500
'Si sí lo es entonces sacamos los multiplos, la fraccion la enviamos
'una función para que nos regrese un valor entero (no fraccional).
'En la variable tipo cadena (Txt_Retiro) la inicializamos con el texto: "$500X"
'y le concatenamos m_500.ToString para que la variable contega lo siguiente:
' $500X1

'Volvemos a preguntar si el resto (despues de restarle los 500 ó multiplos de 500)
'es mayor a 200 (similar a los 500)
If Retiro >= 200 Then
m_200 = Retiro / 200
m_200 = Convierte(m_200)
Retiro = Retiro - m_200 * 200
Txt_Retiro = Txt_Retiro + " $200X" + m_200.ToString()
'Aqui estamos Acumulando y concatenando el valor de la cadena Txt_Retiro
'El valor Anterior + el valor nuevo
'el contenido hasta aquí de Txt_Retiro seria el siguiente:
'$500X1 $200X2
End If

'La lógica se repite para cada una de las Condiciones...
If Retiro >= 100 Then
m_100 = Retiro / 100
m_100 = Convierte(m_100)
Retiro = Retiro - m_100 * 100
Txt_Retiro = Txt_Retiro + " $100X" + m_100.ToString()
End If

If Retiro >= 50 Then
m_50 = Retiro / 50
m_50 = Convierte(m_50)
Retiro = Retiro - m_50 * 50
Txt_Retiro = Txt_Retiro + " $50X" + m_50.ToString()
End If

If Retiro >= 20 Then
m_20 = Retiro / 20
m_20 = Convierte(m_20)
Retiro = Retiro - m_20 * 20
Txt_Retiro = Txt_Retiro + " $20X" + m_20.ToString()
End If

If Retiro >= 10 Then
m_10 = Retiro / 10
m_10 = Convierte(m_10)
Retiro = Retiro - m_10 * 10
Txt_Retiro = Txt_Retiro + " $10X" + m_10.ToString()
End If

If Retiro >= 5 Then
m_5 = Retiro / 5
m_5 = Convierte(m_5)
Retiro = Retiro - m_5 * 5
Txt_Retiro = Txt_Retiro + " $5X" + m_5.ToString()
End If
If Retiro >= 2 Then
m_2 = Retiro / 2
m_2 = Convierte(m_2)
Retiro = Retiro - m_2 * 2
Txt_Retiro = Txt_Retiro + " $2X" + m_2.ToString()
End If
If Retiro >= 1 Then
m_1 = Retiro / 1
'm_1 = Convierte(m_1)
Retiro = Retiro - m_1 * 1
Txt_Retiro = Txt_Retiro + " $1X" + m_1.ToString()
End If

Console.WriteLine("Los multiplos son los siguientes:")
Console.WriteLine("(500)({0}) (200)({1}) (100)({2}) (50)({3}) (20)({4}) (10)({5}) (5)({6}) (2)({7}) (1)({8}) ", m_500, m_200, m_100, m_50, m_20, m_10, m_5, m_2, m_1)
Console.WriteLine(Txt_Retiro & " = " & Total.ToString())
Console.ReadLine()
End Sub

Function Convierte(ByVal puntoF As Double) As Double
Dim Cadena As String
Dim pos As Integer
Cadena = CStr(puntoF)
pos = InStr(Cadena, ".")
If pos > 0 Then
Cadena = Left(Cadena, pos - 1)
End If
Return CDbl(Cadena)
End Function
'Comentarios:
'Esta funcion recibe un valor Double y regresa un valor Double
' Cadena = CStr(puntoF)
'Convierte el valor flotante que se le envia a la funcion y la convierte a Cadena
'pos = InStr(Cadena, ".")
'pos almacena la posicion donde localice el punto dentro de la cadena
'Por ejemplo:
'Si nuestra cadena fuera la siguiente: Cadena = "Estamos en el mes de febrero"
'pos = InStr(Cadena, "febrero")
'pos seria igual a: 22
'la posicion donde localizó el inicio de la palabra febrero fue en 22
'Cadena = Left(Cadena, pos - 1)
'En esta linea de código cargamos a la variable Cadena de (izq a der) un determinado
'numero de caracteres, el resto de la cadena se pierde.
'Si al ejemplo de: Cadena = "Estamos en el mes de febrero"
'le aplicamos el siguiente código obtendriamos el siguiente resultado:
' "Estamos en el mes de "

'Al final de la funcion convertimos el valor de la cadena a Double y se lo regresamos
'en forma Double.

End Module