Wydawanie reszty - ograniczona ilość monet

0

Na razie mam tylko dla nie ograniczonej liczby poszczególnych monet, pytanie jak powiązać ilość monet z daną wartością monety. Czy może przechowywać w tablicy dwuwymiarowej czy jak, proszę o jakieś podpowiedzi.

 
package areszta;

import java.util.InputMismatchException;
import java.util.Scanner;

public class AReszta {

    public static void main(String[] args) {

        final double[] NOMINALY = {200.0, 100.0, 50.0, 20.0, 10.0, 5.0, 2.0, 1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
        double reszta = 0;

        Scanner sc = new Scanner(System.in);
        System.out.print("Podaj reszte: ");

        try {
            reszta = sc.nextDouble();
        } catch (InputMismatchException ex) {
            System.out.println("Nieprawidlowa wartosc");
            return;
        }

        String wynik = "Reszta:\n";

        for (int i = 0; ((i < NOMINALY.length) && (reszta > 0.00)); i++) {
            if (reszta >= NOMINALY[i]) {
                int temp = (int) Math.floor(reszta / NOMINALY[i]); //Math.floor największa liczba całkowita która jest mniejsza lub równa od podanej liczby;
                wynik += NOMINALY[i] + " PLN x " + temp + "\n";
                reszta = (double) Math.round(100 * (reszta - (temp * NOMINALY[i]))) / 100;
            }
        }

        System.out.println(wynik);
    }

}

0

Możesz stworzyć klasę przechowującą rodzaj monety i ilość, a później np tablicę obiektów tej klasy.

0

Pytanie czy to jest dobrze ?
Przykładowe dane, wziąłem że 20 zł jest zero to wydaje po 10, więc wygląda chyba ok. Pytanie kiedy nie będzie można wydać reszty.

Podaj reszte: 25,50
Reszta:
10.0 PLN x 2
5.0 PLN x 1
0.5 PLN x 1
package amreszta;

import java.util.InputMismatchException;
import java.util.Scanner;

public class AMReszta {

    public static void main(String[] args) {

        Moneta[] nominaly
                = {
                    new Moneta(200, 5), //200 zł x 5
                    new Moneta(100, 1), //100 zł x 1
                    new Moneta(50, 2), //50zł x 2
                    new Moneta(20, 0), //20 zł x 0
                    new Moneta(10, 10), //10 zł x 10
                    new Moneta(5, 10), //5zł x 10
                    new Moneta(2, 4), //2 zł x 4
                    new Moneta(1, 10), //1zł x 10
                    new Moneta(0.5, 20), //50 gr x 20
                    new Moneta(0.2, 10), //20 gr x 10
                    new Moneta(0.1, 10), //10 gr x 10
                    new Moneta(0.05, 5), //5gr x 5
                    new Moneta(0.02, 3), //2gr x 3
                    new Moneta(0.01, 10) //1 gr x 10
                };

        /*System.out.println("Dostępne monety i ich ilość: ");
         for(Moneta m : nominaly){
         System.out.println("Wartość : " + m.getWartosc() + "zł ilość: " + m.getIlosc());
         }*/
        double reszta = 0;
        Scanner sc = new Scanner(System.in);
        System.out.print("Podaj reszte: ");

        try {
            reszta = sc.nextDouble();
        } catch (InputMismatchException ex) {
            System.out.println("Nieprawidlowa wartosc");
            return;
        }

        String wynik = "Reszta:\n";

        for (int i = 0; ((i < nominaly.length) && (reszta > 0.00)); i++) {
            if (reszta >= nominaly[i].getWartosc()) {
                if (nominaly[i].getIlosc() != 0) {
                    int temp = (int) Math.floor(reszta / nominaly[i].getWartosc()); //Math.floor największa liczba całkowita która jest mniejsza lub równa od podanej liczby;
                    wynik += nominaly[i].getWartosc() + " PLN x " + temp + "\n";
                    reszta = (double) Math.round(100 * (reszta - (temp * nominaly[i].getWartosc()))) / 100;
                }
            }
        }

        System.out.println(wynik);
    }

}

Moneta.java

package amreszta;

public class Moneta {
    
    private double wartosc;
    private int ilosc;
    
    public Moneta(double wartosc, int ilosc){
        this.wartosc = wartosc;
        this.ilosc = ilosc;
    }

    public double getWartosc() {
        return wartosc;
    }

    public void setWartosc(double wartosc) {
        this.wartosc = wartosc;
    }

    public int getIlosc() {
        return ilosc;
    }

    public void setIlosc(int ilosc) {
        this.ilosc = ilosc;
    }
    
    
    
}

0
gcmarcin napisał(a):

Pytanie czy to jest dobrze ?
Przykładowe dane, wziąłem że 20 zł jest zero to wydaje po 10, więc wygląda chyba ok. Pytanie kiedy nie będzie można wydać reszty.

Zrobiłem szybki teścik i wartości z tego co widzę wypisuje okej. W pierwszym poście pisałeś, że zrobiłeś dla nieograniczonej liczby monet, nie wiem jak jest teraz ale bierze ile chce :) Tzn widzę, że tworzysz monety o odpowiednich wartościach i ich ilości ale nie bardzo jest to przestrzegane. :)

0

Trzymaj w pamięci wartości monet/banknotów oraz wydawaną resztę wyrażone w groszach i trzymaj je jako int.

1 użytkowników online, w tym zalogowanych: 0, gości: 1