Ago 11 2008
Aplicación para calcular la cantidad de billetes a partir del importe en VB.Net {
Esta es una aplicación muy simple, la misma calcula la cantidad de billetes/monedas de cada denominación necesarios para cubrir un importe tomando en cuenta que siempre vamos a querer completar el importe con los billetes/monedas de mayor denominación posible.
O sea que para cubrir el importe $ 150 vamos a usar un billete de $ 100 y otro de $ 50, pero no uno de $ 100 y 2 de $ 20.
Cabe destacar que como este es sólo un ejemplo, las denominaciones no son configurables, están incluidas en el código fuente y las mismas son correspondientes a la moneda de Uruguay, el Peso Uruguayo.
Para guardar las denominaciones y luego la cantidad necesaria de cada una utilizamos un objeto de tipo Generic.Dictionary(Of Decimal, Integer) en el cual guardaremos como key cada denominación:
Private Sub CargarBilletes(ByRef lista As Generic.Dictionary(Of Decimal, Integer)) lista = New Generic.Dictionary(Of Decimal, Integer) With lista .Add(2000, 0) ' Billetes .Add(1000, 0) .Add(500, 0) .Add(200, 0) .Add(100, 0) .Add(50, 0) .Add(20, 0) .Add(10, 0) ' Monedas .Add(5, 0) .Add(2, 0) .Add(1, 0) .Add(0.5, 0) End With End Sub
La función anterior es llamada cada vez que se hace el cálculo, de esa manera nos aseguramos que nuestros valores han sido reseteados, aunque en una aplicación más compleja éstos valores deberían obtenerse desde una base de datos o un archivo de configuración.
Public Sub DiscriminarBilletes(ByVal Importe As Decimal) Dim keys As Decimal() = New Decimal(Billetes.Count - 1) {} ' Creamos un array de Decimal para guardar las denominaciones Billetes.Keys.CopyTo(keys, 0) ' Copiamos las keys del objeto Generic.Dictionary(Of Decimal, Integer) For Each billete As Decimal In keys While Importe >= 0 AndAlso Importe >= billete ' Si el importe > 0 y es > la denominación actual sumamos 1 Billetes(billete) += 1 Importe -= billete ' Descontamos del importe el valor de la denominación actual End While Next Mostrar() ' Mostramos los resultados End Sub
La función anterior es la que realiza todo el cálculo, se puede ver que es muy simple. Alguien debe estar preguntándose por qué copiar las keys a otro array en lugar de recorrer el objeto Dictionary directamente, la respuesta es que Visual considera que se modificó el enumerado cada vez que se suma 1, entonces no se puede seguir recorriendo el Dictionary.
Por las dudas aclaro el uso de AndAlso: funciona como And, pero en caso de no cumplirse la primera condición no se chequea la segunda. Es una mejora que se introdujo en VB.Net ya que en VB6 se tenían los operadores And y Or. También se agregó el operador lógico OrElse.
Descargar el código fuente de la aplicación para discriminar billetes (26.01 KB)
}