3

クラスで料金を請求するメソッドを使用しようとしています。メソッドは次のとおりです。

  public double chargeFee()
  {
    balance -= 10;
    return balance;
  }

ただし、20 が減算されます。再コンパイルを試みましたが、問題の原因がわかりません。

完全なコード:

public class ManageAccounts
{
    public static void main(String[] args)
    {
     Account acct1, acct2; 


    //create account1 for Sally with $1000
    acct1 = new Account(1000, "Sally", 1111);
    acct2 = new Account(500, "Joe", 2222);//create account2 for Joe with $500

    System.out.println("Depositing $100 into Account 2222...");
    acct2.deposit(100.00);//deposit $100 to Joe's account
    System.out.println("New Balance for Account 2222: $" + acct2.getBalance());//print Joe's new balance (use getBalance())
    System.out.println();
    System.out.println("Withdrawing $50 from Account 1111...");
    acct1.withdraw(50);//withdraw $50 from Sally's account

    System.out.println("New Balance for Account 1111: $" + acct1.getBalance());//print Sally's new balance (use getBalance())
    System.out.println();
    acct1.chargeFee();
    acct2.chargeFee();//charge fees to both accounts
    System.out.println("Charging usage Fees...");
    System.out.println("Account balance after fees:");
    System.out.println("Account 1111: $" + acct1.chargeFee());
    System.out.println("Account 2222: $" + acct2.chargeFee());
    System.out.println();
    System.out.println("Changing name on Account 2222...");
    acct2.changeName("Joseph");//change the name on Joe's account to Joseph
    System.out.println();
    System.out.println("Printing account summaries...");
    System.out.println(acct1.toString());
    System.out.println(acct2.toString());//print summary for both accounts

    }
}



import java.text.NumberFormat;

public class Account
{
  private double balance;
  private String name;
  private long acctNum;
    NumberFormat money = NumberFormat.getCurrencyInstance();
  //----------------------------------------------
  //Constructor -- initializes balance, owner, and account number
  //----------------------------------------------
  public Account(double initBal, String owner, long number)
  {
    balance = initBal;
    name = owner;
    acctNum = number;
  }

  //----------------------------------------------
  // Checks to see if balance is sufficient for withdrawal.
  // If so, decrements balance by amount; if not, prints message.
  //----------------------------------------------
  public void withdraw(double amount)
  {
    if (balance >= amount)
       balance -= amount;
    else
       System.out.println("Insufficient funds");
  }

  //----------------------------------------------
  // Adds deposit amount to balance.
  //----------------------------------------------
  public void deposit(double amount)
  {
    balance += amount;
  }

  //----------------------------------------------
  // Returns balance.
  //----------------------------------------------
  public double getBalance()
  {
    return balance;
  }


  //----------------------------------------------
  // Returns a string containing the name, account number, and balance.
  //----------------------------------------------
  public String toString()
  {
    return ("Name: " + name + "\tAccount Number: " + acctNum + "\tBalance: " + money.format(balance));
  }

  //----------------------------------------------
  // Deducts $10 service fee
  //----------------------------------------------
  public double chargeFee()
  {
    balance -= 10;
     return balance;
  }

  //----------------------------------------------
  // Changes the name on the account 
  //----------------------------------------------
  public void changeName(String newName)                          
  {
    name = newName;
  }

}

出力例:

Depositing $100 into Account 2222...
New Balance for Account 2222: $600.0

Withdrawing $50 from Account 1111...
New Balance for Account 1111: $950.0

Charging usage Fees...

Account balance after fees:

Account 1111: $930.0
Account 2222: $580.0

Changing name on Account 2222...

Printing account summaries...
Name: Sally Account Number: 1111    Balance: $930.00
Name: Joseph    Account Number: 2222    Balance: $580.00
4

5 に答える 5

7

両方のアカウントで 2 回呼び出します。1chargeFee回目は実際の料金を請求するとき、もう 1 回は結果を印刷するときです。

今後の参考のために、 「コマンドとクエリを分離する」または CQSと呼ばれるガイドラインがあります。あなたはそれについて読みたいと思うかもしれません。あなたの状況を明らかにするには:

  • をクエリとして使用しchargeFeeています (つまり、残高を返します)。
  • コマンドとして使用chargeFeeし、お金を差し引きます。

chargeFeea を返すように変更するとvoid(またはthisメソッド チェーンが必要な場合)、誤ってクエリとして使用することはありません。

http://en.wikipedia.org/wiki/Command-query_separation

于 2012-11-30T03:20:37.170 に答える
3

アカウントごとに2つの手数料が差し引かれます。

acct1.chargeFee();
acct2.chargeFee();//charge fees to both accounts
System.out.println("Charging usage Fees...");
System.out.println("Account balance after fees:");
System.out.println("Account 1111: $" + acct1.chargeFee());
System.out.println("Account 2222: $" + acct2.chargeFee());

おそらく、chargeFee()残高を返すのではなく、orvoidのようにする必要があります。また、金銭的な問題は、通常、数値ではなく扱われることに注意してください。deposit()withdraw()intdouble

于 2012-11-30T03:20:53.797 に答える
2
System.out.println("New Balance for Account 1111: $" + acct1.getBalance());//print Sally's   new balance (use getBalance())
System.out.println();
acct1.chargeFee();------------------------//First time
acct2.chargeFee();//charge fees to both accounts
System.out.println("Charging usage Fees...");
System.out.println("Account balance after fees:");
System.out.println("Account 1111: $" + acct1.chargeFee());------------------------//second time
System.out.println("Account 2222: $" + acct2.chargeFee());
于 2012-11-30T03:22:12.913 に答える
2
1) 
acct1.chargeFee();
acct2.chargeFee();//charge fees to both accounts

2)
System.out.println("Account 1111: $" + acct1.chargeFee());
System.out.println("Account 2222: $" + acct2.chargeFee());

chargeFee()2 回呼び出す方法に注意してください。それがあなたにめちゃくちゃな結果を与えているものです。呼び出しは 1 回だけで、2 回目は各口座の残高を出力するだけです (パート 2)。

System.out.println("Account 1111: $" + Account 1111's balance);
System.out.println("Account 2222: $" + Account 2222's balance);

それが役立つことを願っています!

于 2012-11-30T03:23:36.003 に答える
1

プログラムの問題を指摘するいくつかの正しい答えが既にあります。これは実際には答えではありませんが、この問題を自分でどのように発見できたかについての拡張コメントです。

メソッド chargeFee が 20 を引いているという理論を考えると、次のステップはブレークポイントまたはプリントアウトを追加して、それが実際に何をするかを確認することです。

public double chargeFee() {
  System.out.println("Before subtract: " + balance + " Account: " + acctNum);
  balance -= 10;
  System.out.println("After subtract: " + balance + " Account: " + acctNum);
  return balance;
}

追加の出力を含むプログラムからの出力から、chargeFee の呼び出しごとに 10 しか減算されないことが明らかですが、アカウントごとに 2 回呼び出されます。

于 2012-11-30T03:31:57.403 に答える