elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [Aporte] .net problema del cajero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] .net problema del cajero  (Leído 1,369 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
[Aporte] .net problema del cajero
« en: 12 Noviembre 2016, 18:12 pm »

problema del cajero, con entregar cambio dividido en diferentes cantidades

Código
  1. FunCambio(Precio: 10.28m, Paga: 50m);

Hay que poner la cantidad a abonar (precio) y el cantidad abonada(paga)

El algoritmo es este:

Código
  1.  decimal Precio = 12.28m;
  2.            decimal Paga = 50m;
  3.            int[] Euros = {
  4. 2,
  5. 1
  6. };
  7.            decimal[] Centimos = {
  8. 0.5m,
  9. 0.2m,
  10. 0.1m,
  11. 0.05m,
  12. 0.02m,
  13. 0.01m
  14. };
  15.  
  16.            if (Precio <= Paga)
  17.            {
  18.  
  19.                decimal Devolver = Paga - Precio;
  20.  
  21.              List<decimal> Cambio = new List<decimal>();
  22.  
  23.  
  24.  
  25.                while (Devolver >= 1)
  26.                {
  27.                    foreach (int Moneda in Euros)
  28.                    {
  29.                        if (Devolver >= Moneda)
  30.                        {
  31.                            Devolver -= Moneda;
  32.                            Cambio.Add(Moneda);
  33.                            break;
  34.                        }
  35.                    }
  36.                }
  37.                while (Devolver > 0)
  38.                {
  39.                    foreach (decimal Moneda in Centimos)
  40.                    {
  41.                        if (Devolver >= Moneda)
  42.                        {
  43.                            Devolver -= Moneda;
  44.                            Cambio.Add(Moneda);
  45.                            break;
  46.                        }
  47.                    }
  48.                }

'Cambio' es un array lista que devuelve una lista ´tipo "2, 2, 2, 2, 1 ,0.5, 0.02" que son lo tipos de moneda a devolver ya optimizado.



EJEMPLO


Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace WindowsFormsApplication1
  12. {
  13.    public partial class Form1 : Form
  14.    {
  15.  
  16.        public Form1()
  17.        {
  18.            InitializeComponent();
  19.        }
  20.  
  21.        private void button1_Click(object sender, EventArgs e)
  22.        {
  23.            FunCambio(Precio: 10.28m, Paga: 50m);
  24.        }
  25.        private void Form1_Load(object sender, EventArgs e)
  26.        {
  27.  
  28.        }
  29.  
  30.        /// <summary>
  31.        /// Calcula el número óptimo de monedas a devolver
  32.        /// </summary>
  33.        /// <param name="Precio">Total a abonar</param>
  34.        /// <param name="Paga">Total abonado</param>
  35.        public void FunCambio(decimal Precio, decimal Paga)
  36.        {
  37.  
  38.           // decimal Precio = 12.28m;
  39.           // decimal Paga = 50m;
  40.            int[] Euros = {
  41. 2,
  42. 1
  43. };
  44.            decimal[] Centimos = {
  45. 0.5m,
  46. 0.2m,
  47. 0.1m,
  48. 0.05m,
  49. 0.02m,
  50. 0.01m
  51. };
  52.  
  53.            if (Precio <= Paga)
  54.            {
  55.  
  56.                decimal Devolver = Paga - Precio;
  57.  
  58.              List<decimal> Cambio = new List<decimal>();
  59.  
  60.  
  61.  
  62.                while (Devolver >= 1)
  63.                {
  64.                    foreach (int Moneda in Euros)
  65.                    {
  66.                        if (Devolver >= Moneda)
  67.                        {
  68.                            Devolver -= Moneda;
  69.                            Cambio.Add(Moneda);
  70.                            break;
  71.                        }
  72.                    }
  73.                }
  74.                while (Devolver > 0)
  75.                {
  76.                    foreach (decimal Moneda in Centimos)
  77.                    {
  78.                        if (Devolver >= Moneda)
  79.                        {
  80.                            Devolver -= Moneda;
  81.                            Cambio.Add(Moneda);
  82.                            break;
  83.                        }
  84.                    }
  85.                }
  86.  
  87.                //MUESTRA EL RESULTADO
  88.                string Resultado = null;
  89.                int n2E = 0;
  90.                int n1E = 0;
  91.                int n50c = 0;
  92.                int n20c = 0;
  93.                int n10c = 0;
  94.                int n5c = 0;
  95.                int n2c = 0;
  96.                int n1c = 0;
  97.                decimal TotalADevolver = Paga - Precio;
  98.  
  99.                foreach (decimal Mda in Cambio)
  100.                {
  101.                switch (Convert.ToString(Mda))
  102.                    {
  103.                        case "2": n2E += 1; break;
  104.                        case "1": n1E += 1; break;
  105.                        case "0,5": n50c += 1; break;
  106.                        case "0,2": n20c += 1; break;
  107.                        case "0,1": n10c += 1;break;
  108.                        case "0,05":n5c += 1;break;
  109.                        case "0,02":n2c += 1;break;
  110.                        case "0,01":n1c += 1;break;
  111.                    }
  112.                }
  113.  
  114.                Resultado = string.Format("Precio: {1:0.00}€{0}" +
  115.                    "Cantidad abonada: {2:0.00}€{0}" +
  116.                    "Total a devolver: {3:0.00}€{0}{0}" +
  117.                    "CAMBIO{0}" + "2€: {4}{0}" +
  118.                    "1€: {5}{0}" + "50 céntimos: {6}{0}" +
  119.                    "20 céntimos: {7}{0}" +
  120.                    "10 céntimos: {8}{0}" +
  121.                    "5 céntimos: {9}{0}" +
  122.                    "2 céntimos: {10}{0}" +
  123.                    "1 céntimos: {11}{0}",
  124.                    Environment.NewLine,
  125.                    Precio,
  126.                    Paga,
  127.                    TotalADevolver, n2E, n1E, n50c, n20c, n10c,
  128.                n5c, n2c, n1c);
  129.  
  130.                MessageBox.Show(Resultado);
  131.            }
  132.            else
  133.            {
  134.                MessageBox.Show("El valor abonado es inferior al total a pagar");
  135.            }
  136.        }
  137.  
  138.    }
  139. }
  140.  

Se mostrará un mensaje con el resultado de las monedas a devolver como cambio.



VB.NET

Código
  1. Imports System.Text
  2.  
  3. Public Class Form1
  4.    Friend WithEvents Button2 As New Button
  5.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  6.        FunCambio(Precio:=5.2, Paga:=50)
  7.  
  8.    End Sub
  9.    Public Sub FunCambio(ByVal Precio As Decimal, ByVal Paga As Decimal)
  10.        Dim Euros() As Integer = {2, 1}
  11.        Dim Centimos() As Decimal = {0.5, 0.2, 0.1, 0.05, 0.02, 0.01}
  12.        If Precio <= Paga Then
  13.  
  14.  
  15.            Dim Devolver As Decimal = Paga - Precio     'Total a devolver
  16.            Dim Cambio As New List(Of Decimal)          'Lista de cambio recibido
  17.  
  18.            While Devolver >= 1
  19.                For Each Moneda As Integer In Euros
  20.                    If Devolver >= Moneda Then
  21.                        Devolver -= Moneda
  22.                        Cambio.Add(Moneda)
  23.                        Exit For
  24.                    End If
  25.                Next
  26.            End While
  27.            While Devolver > 0
  28.                For Each Moneda As Decimal In Centimos
  29.                    If Devolver >= Moneda Then
  30.                        Devolver -= Moneda
  31.                        Cambio.Add(Moneda)
  32.                        Exit For
  33.                    End If
  34.                Next
  35.            End While
  36.  
  37.            'Muestra el resultado
  38.            Dim Resultado As String
  39.            Dim n2E, n1E, n50c, n20c, n10c, n5c, n2c, n1c As Integer
  40.            Dim TotalADevolver As Decimal = Paga - Precio
  41.            For Each N As Decimal In Cambio.ToList
  42.                Select Case N
  43.                    Case 2D : n2E += 1
  44.                    Case 1D : n1E += 1
  45.                    Case 0.5D : n50c += 1
  46.                    Case 0.2D : n20c += 1
  47.                    Case 0.1D : n10c += 1
  48.                    Case 0.05D : n5c += 1
  49.                    Case 0.02D : n2c += 1
  50.                    Case 0.01D : n1c += 1
  51.                End Select
  52.            Next
  53.  
  54.            Resultado = String.Format("Precio: {1:0.00}€{0}" &
  55.                                      "Cantidad abonada: {2:0.00}€{0}" &
  56.                                      "Total a devolver: {3:0.00}€{0}{0}" &
  57.                                      "CAMBIO{0}" &
  58.                                      "2€: {4}{0}" &
  59.                                      "1€: {5}{0}" &
  60.                                      "50 céntimos: {6}{0}" &
  61.                                       "20 céntimos: {7}{0}" &
  62.                                          "10 céntimos: {8}{0}" &
  63.                                            "5 céntimos: {9}{0}" &
  64.                                            "2 céntimos: {10}{0}" &
  65.                                             "1 céntimos: {11}{0}",
  66.                                      Environment.NewLine, Precio, Paga, TotalADevolver, n2E, n1E, n50c, n20c, n10c, n5c, n2c, n1c)
  67.  
  68.            MessageBox.Show(Resultado)
  69.        Else
  70.            MessageBox.Show("El valor abonado es inferior al total a pagar", "Atención", Nothing, MessageBoxIcon.Exclamation)
  71.        End If
  72.    End Sub
  73.  
  74. End Class



Más info:
https://es.wikibooks.org/wiki/Programaci%C3%B3n_din%C3%A1mica/Problema_de_las_monedas_con_programaci%C3%B3n_din%C3%A1mica


« Última modificación: 13 Noviembre 2016, 19:25 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pequeño aporte(proxy),pero aporte al fin.:D
Programación Visual Basic
Tengu 0 2,394 Último mensaje 22 Julio 2007, 17:33 pm
por Tengu
Cooler de Cajero Automatico.
Hardware
Elemental Code 3 5,087 Último mensaje 21 Octubre 2010, 13:34 pm
por APOKLIPTICO
Ayuda cajero con el do while!!!
Programación C/C++
DrKuja 3 3,314 Último mensaje 29 Noviembre 2011, 14:30 pm
por Ferno
Cajero automatico
Programación Visual Basic
ellandax 2 4,037 Último mensaje 5 Noviembre 2013, 21:04 pm
por dainodaibouken
cajero con JOptionPane
Java
daniloops 0 2,877 Último mensaje 23 Junio 2014, 22:12 pm
por daniloops
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines