Faire un programme de tirelire en JAVA [fermé]


Je suis loin de Java depuis un certain temps et j'essaie de me souvenir et d'apprendre beaucoup encore. J'ai un projet en cours qui est une tirelire à laquelle vous ajoutez des pièces et qui peut obtenir diverses sorties. Je suis actuellement chargé de 5 méthodes plus une méthode d'aide pour les constructeurs. Je sais ce que je veux faire, mais je ne peux pas réfléchir au code pour le faire. Je veux utiliser la méthode helper pour obtenir les montants pour les deux autres constructeurs, mais je ne peux pas me faire la tête, je ne peux que regarder à travers mon livre si longtemps. Toute entrée est appréciée. La description de chaque méthode est la suivante:

PS Le code que j'ai peut ne pas être correct.

Constructeur par défaut PublicChangeJar() qui définit toutes les variables d'instance à zéro

PublicChangeJar(int trimestres, int dimes, int nickels, int pennies) Un constructeur qui initialise les variables d'instance avec les valeurs converties trimestres, dimes, nickels et pennies.

Public ChangeJar(montant final double) Constructeur qui initialise les variables d'instance avec la valeur fournie convertie en quarters, dimes, nickels et pennies. Par exemple, si le montant était de 1,34, vous auriez 5 trimestres, 1 nickel, 4 pennies

Public ChangeJar(final String amount)Un constructeur qui accepte une chaîne en tant que paramètre avec la valeur fournie convertie en nombre approprié de quarts, de sous, de nickels et de sous. Par exemple, si le montant était "1.34" alors vous auriez 5 trimestres, 1 nickel, 4 penny.

Public ChangeJar(final ChangeJar other)Un constructeur qui initialise les variables d'instance de "cet" objet ChangeJar avec l'autre objet.

public class ChangeJar {
private int pennies;
private int nickels;
private int dimes;
private int quarters;

static boolean globalLock = false;

public ChangeJar(){
    this(0,0,0,0);
}

public ChangeJar(int pennies, int nickels, int dimes, int quarters)throws IllegalArgumentException {
if (pennies < 0 || nickels < 0 || dimes < 0 || quarters < 0)
    throw new IllegalArgumentException("You cannot have negative coins in the jar");
else this.pennies = this.pennies + pennies; 
    this.nickels = this.nickels + nickels;
    this.dimes = this.dimes + dimes; 
    this.quarters = this.quarters + quarters;

}

public ChangeJar(double amount){

}
public ChangeJar(final String amount){

}
private double amountHelper(double amount){
    amount = pennies*.01 + nickels*.05 + dimes*.10 + quarters*0.25;
    return amount;
}

public ChangeJar(final ChangeJar other){

}

}

EDIT: Mon problème ici est de savoir comment écrire la méthode d'aide pour fonctionner dans les deux constructeurs.

Author: FunTK, 2015-01-14

1 answers

Constructeur ChangeJar(double)

Pour votre constructeur avec un montant, vous souhaitez utiliser le nombre maximum de trimestres, puis le nombre maximum de centimes, etc.

Disons que j'ai 2,87$.

  • Tout d'abord, je vais prendre 11 trimestres. Nous avons encore $0.12 gauche.
  • Alors, je prendrai 1 centime. Nous avons encore de 0,02 $à gauche.
  • Alors, je prendrai 0 nickel. Nous avons encore de 0,02 $à gauche.
  • Alors, je prendrai 2 sous. Nous avons terminé.

Comment mettre cela en œuvre? Disons que le montant est 2.87.

public ChangeJar(double amount) {
    // How many quarters?
    int quarters = (int) (amount / .25); // The division gives 9.48 and we cast the result to int so we get 9
    amount = amount - quarters * .25;
    System.out.println(quarters + " quarters. Remains: " + amount);

    // How many dimes?
    int dimes = (int) (amount / .10);
    amount = amount - dimes * .10;
    System.out.println(dimes + " dimes. Remains: " + amount);

    // How many nickels?
    int nickels = (int) (amount / .05);
    amount = amount - nickels * .05;
    System.out.println(nickels + " nickels. Remains: " + amount);

    // How many pennies?
    int pennies = (int) (amount / .01);
    amount = amount - pennies * .01;
    System.out.println(pennies + " pennies. Remains: " + amount);

    // Prints:
    // 11 quarters. Remains: 0.1200000000000001
    // 1 dimes. Remains: 0.0200000000000001
    // 0 nickels. Remains: 0.0200000000000001
    // 2 pennies. Remains: 1.0061396160665481E-16

    // Now we just set this in our properties:
    this.quarters = quartes;
    this.dimes = dimes;
    this.nickels = nickels;
    this.pennies = pennies;
}

Comme vous pouvez le voir, le problème est que les restes sont étranges valeurs. Le constructeur fonctionne mais ce n'est pas vraiment cool. Pourquoi? Parce que Java se rapproche des doubles.

Je suggère de travailler avec int s. Par exemple, vous pouvez changer votre unité de $ à $/100. Notre même exemple avec des valeurs entières (l'entrée n'est pas 2.87, mais 287):

public ChangeJar(int amount) {
    // How many quarters?
    int quarters = amount / 25;
    amount = amount - quarters * 25;
    System.out.println(quarters + " quarters. Remains: " + amount);

    // How many dimes?
    int dimes = amount / 10;
    amount = amount - dimes * 10;
    System.out.println(dimes + " dimes. Remains: " + amount);

    // How many nickels?
    int nickels = amount / 5;
    amount = amount - nickels * 5;
    System.out.println(nickels + " nickels. Remains: " + amount);

    // How many pennies?
    int pennies = amount;
    amount = amount - pennies;
    System.out.println(pennies + " pennies. Remains: " + amount);

    // Prints:
    // 11 quarters. Remains: 12
    // 1 dimes. Remains: 2
    // 0 nickels. Remains: 2
    // 2 pennies. Remains: 0

    // Now we just set this in our properties:
    this.quarters = quartes;
    this.dimes = dimes;
    this.nickels = nickels;
    this.pennies = pennies;
}

C'est déjà mieux!

Mais il y a un beaucoup de copier / coller dans mon code...
Comment peut-on faire mieux?

Nous pouvons voir que pour chaque pièce, j'obtiens le nombre de pièces puis je soustrais la valeur du montant.

int amount = 287;

int[] values = new int[]{25, 20, 5, 1}; // The values of my coins
int[] results = new int[values.length];

for (int i = 0; i < values.length; i++) {
    int valueOfCoin = values[i];
    int numberOfCoins = amount / valueOfCoin; // Division gives the integer part of the result
    results[i] = numberOfCoins;

    amount = amount % valueOfCoin; // Modulo gives the remainder part of the result
    // Or you could simply write: amount %= valueOfCoin;
}

System.out.println("RESULTS=" + Arrays.toString(results));

// Prints:
// RESULTS=[9, 1, 0, 2]

Constructeur ChangeJar(String)

Je suppose que la Chaîne est une somme si nous allons simplement convertir le String pour un Double et appeler l'autre constructeur (ChangeJar(double)).

public ChangeJar(String amount) {
    this(Double.valueOf(amount)); // Double.valueOf() will try to convert the String => Double
}

Constructeur ChangeJar(ChangeJar)

, L'idée est juste de copier les valeurs de l'autre ChangeJar:

public ChangeJar(ChangeJar other) {
    this(other.quarters, other.dimes, other.nickels, other.pennies);
}
 1
Author: Vincent Durmont, 2017-05-23 10:25:21