Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: okik en 12 Noviembre 2016, 18:12 pm



Título: [Aporte] .net problema del cajero
Publicado por: okik 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 (https://es.wikibooks.org/wiki/Programaci%C3%B3n_din%C3%A1mica/Problema_de_las_monedas_con_programaci%C3%B3n_din%C3%A1mica)