Программа PiggyBank с конструкторами, мутаторами и аксессорами

Мне нужна помощь в двух вещах. Одна проблема связана с округлением на выходе, а другая — просто найти лучший способ написать мою программу, которая при необходимости выводит те же результаты.

Как наиболее эффективно написать эту программу? Несмотря на то, что он работает так, как должен, я знаю, что он разработан не лучшим образом.

package program2;

import java.util.*;

class PiggyBank
{
    Scanner console = new Scanner( System.in );

    private int numPennies, numNickles, numDimes, numQuarters;
    private float total;

    public PiggyBank( int pennies, int nickles, int dimes, int quarters )
    {
        numPennies = pennies;
        numNickles = nickles;
        numDimes = dimes;
        numQuarters = quarters;
        total = (float) 0.00;
    }

    public void addPennies( int pennies )
    {
        System.out.println( "Have entered " + pennies + " pennies" );

        if ( pennies < 0 )
        {
            System.out.println( "No Pennies Added" );
        }
        else
        {
            numPennies = numPennies + pennies;
            total = (float) ( total + pennies * 0.01 );
        }
    }

    public void addNickles( int nickles )
    {
        System.out.println( "Have entered " + nickles + " nickles" );

        if ( nickles < 0 )
        {
            System.out.println( "No Nickles Added" );
        }
        else
        {
            numNickles = numNickles + nickles;
            total = (float) ( total + nickles * 0.05 );
        }
        System.out.println( "Bank has $" + total + " in it" );
        System.out.println();
    }

    public void addDimes( int dimes )
    {
        System.out.println( "Have entered " + dimes + " dimes" );

        if ( dimes < 0 )
        {
            System.out.println( "No Dimes Added" );
        }
        else
        {
            numDimes = numDimes + dimes;
            total = (float) ( total + dimes * 0.10 );
        }
        System.out.println( "Bank has $" + total + " in it" );
        System.out.println();
    }

    public void addQuarters( int quarters )
    {
        System.out.println( "Have entered " + quarters + " quarters" );

        if ( quarters < 0 )
        {
            System.out.println( "No Quarters Added" );
        }
        else
        {
            numQuarters = numQuarters + quarters;
            total = (float) ( total + quarters * 0.25 );
        }
    }

    public float getContents()
    {
        return total;
    }

    public final int breakTheBank()
    {
        if ( total >= 0 )
        {
            total = 0;
        }

        return (int) total;
    }

}

public class PiggyBankTester
{

    public static void main( String[] args )
    {
        Scanner console = new Scanner( System.in );

        System.out.print( "Program By " );
        String name = console.next();
        System.out.println();

        test();
    }

    public static void test()
    {
        PiggyBank bank = new PiggyBank( 0, 0, 0, 0 );

        bank.addNickles( 3 );

        bank.addPennies( 4 );
        System.out.println( "Bank has $" + bank.getContents() + " in it \n" );

        bank.addPennies( -18 );
        System.out.println( "Bank has $" + bank.getContents() + " in it \n" );

        bank.addDimes( 2 );
        bank.addQuarters( 3 );
        System.out.println( "Bank has $" + bank.getContents() + " in it \n" );

        bank.addQuarters( -3 );
        System.out.println( "Bank has $" + bank.getContents() + " in it \n" );

        System.out.println( "Broke the bank and got $" + bank.getContents() + " from it \nBank has $" + bank.breakTheBank() + " in it" );
    }
}

Вот пример моего вывода. Общее число с плавающей запятой округлило некоторые результаты, но я не уверен, как заставить его округлить все результаты.

Program By JakeBrono46

Have entered 3 nickles
Bank has $0.15 in it

Have entered 4 pennies
Bank has $0.19000001 in it 

Have entered -18 pennies
No Pennies Added
Bank has $0.19000001 in it 

Have entered 2 dimes
Bank has $0.39000002 in it

Have entered 3 quarters
Bank has $1.14 in it 

Have entered -3 quarters
No Quarters Added
Bank has $1.14 in it 

Broke the bank and got $1.14 from it 
Bank has $0 in it

Я использовал другой сайт, чтобы найти структуры для аксессоров и мутаторов. Я не думаю, что упускаю что-то слишком важное, но я просто не могу придумать, что еще мне нужно сделать в данный момент.


person JakeBrono46    schedule 08.05.2017    source источник
comment
Убрано форматирование кода. В основном это было там, просто пропустил пару }. Мелкая орфография. Добавлена ​​пунктуация. Удалена строка о том, что вопрос понятен, а не актуален.   -  person mateuscb    schedule 09.05.2017


Ответы (3)


найти лучший способ написать мою программу, которая выводит те же результаты

import java.util.*;
import java.text;

class PiggyBank
{
 Scanner console = new Scanner(System.in);
 NumberFormat formatter = NumberFormat.getCurrencyInstance();

 private int numPennies, numNickles, numDimes, numQuarters;
 private float total;

 public PiggyBank(int pennies, int nickles, int dimes, int quarters)
{
   numPennies = pennies;
   numNickles = nickles;
   numDimes = dimes;
   numQuarters = quarters;     
   total = 0.00;
}

Я бы использовал класс NumberFormat в пакете Text. Таким образом, вы можете отформатировать числа в валюте по умолчанию (в данном случае в долларах). Вам также не нужно приводить float к переменной total, поскольку вы объявили ее как переменную экземпляра float.

bank.addPennies(4);     
System.out.println("Bank has" + formatter.format(bank.getContents()) + " in it    \n");

Вы используете модуль форматирования для печати отформатированного $#.##, что позволяет избежать явного добавления знака доллара.

person Jeremy    schedule 09.05.2017
comment
Спасибо за помощь! - person JakeBrono46; 09.05.2017

public final int breakTheBank()`
{
if(total >= 0)
{
    total = 0;
}

return (int) total;
}

Я бы просто изменил оператор if на if(total == 0), потому что вам не нужно проверять, равен ли он 0, если вы все равно собираетесь изменить его на 0. Кроме этого есть не так много изменений, которые вы можете сделать.

person chris.acampos    schedule 08.05.2017
comment
Спасибо за помощь! - person JakeBrono46; 09.05.2017

Одна проблема с округлением на выходе

Вот метод, который я обычно использую при округлении десятичных чисел, поэтому, когда вы выводите итог, просто вызывайте его. Дополнительную информацию об округлении чисел можно найти здесь: Округлить двойное число до 2 знаков после запятой< /а>

public static double round(double value, int places) {
  if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

найти лучший способ написать мою программу, которая выводит те же результаты

Если бы мне поручили это сделать, я бы использовал перечисления, где вы можете просто создать значение перечисления для каждой монеты. Если вы не знаете, как использовать перечисления, ознакомьтесь с дополнительной информацией здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Что вы хотели бы сделать в вашем случае, так это создать перечисление под названием Coins, где принимает поплавок стоимости этой монеты. Затем создайте другой метод, например, addCoin, где он будет принимать перечисление монет и сумму, которую нужно добавить. Затем просто вычислите результат, получив доступ к стоимости монеты в перечислении и умножив ее на добавленную сумму.

person Jordan    schedule 09.05.2017
comment
Спасибо за помощь - person JakeBrono46; 09.05.2017