0

私は最近 Java プログラミングに乗り出し、自分自身をプログラミング初心者だと考えています。ソース コードの演算に問題があるようです。ネストされたすべての if-else ステートメントを検証しましたが、それらはすべて最後の else ステートメントの演算まで機能します。上記の if-else ステートメントと同じように計算を設定しましたが、正しく計算されません。

else ステートメントは、金額から 40 を引いてから 1 パーセントの料金を適用することを想定しています。私はelseステートメントを試しましたがfee = ((checkAmount - 40) * .01)fee = ((checkAmount * .01) - 40)

これは本の練習問題です

  import java.util.Scanner;
public class ServiceCharge {
public static void main(String[] args)
{
    double checkAmount;
    double fee;
    Scanner kb = new Scanner(System.in);
    System.out.println("I will calulate the service charge to cash your check");
    System.out.print("Enter amount of check: $");
    checkAmount = kb.nextDouble();

    if (checkAmount > 0)
    {
        if (checkAmount <= 10)
        {
            fee = -1;
            System.out.println("$1 service charge");
            checkAmount = checkAmount + fee;
            System.err.println("You have " + checkAmount + " left after service charge.");
        }
        else if ((checkAmount > 10) && (checkAmount <= 100))
        {
            System.out.println("There will be a 10 percent charge.");
            fee = (checkAmount * .10);
            checkAmount = checkAmount - fee;
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n" , checkAmount);
        }
        else if ((checkAmount > 100) && (checkAmount <= 1000))
        {
            System.out.println("There will be a $5 charge plus 5 percent");
            fee = ((checkAmount - 5) * .05);
            checkAmount = (checkAmount - fee);
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n", checkAmount);
        }
        else
        {
            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);
            checkAmount = (checkAmount - fee);
            System.out.printf("Processing fee: $%.2f\n" , fee);
            System.out.printf("Check amount: $%.2f\n" , checkAmount);
        }
        System.out.println("Thanks for using Service Charger." + "\nGood bye");
    }
}
}
4

3 に答える 3

0

実際には、元の式に従って、小切手金額から 40 ドルの固定料金を差し引いた 1% の手数料のみを請求したかったので、式は次のようになります。

fee = 40 + (checkAmount - 40) * .01;

コードに多くの重複があり、何が起こっているのかを確認するのが難しくなります。たとえば、ユーザーに表示するメッセージを変更する場合は、4 つの場所で変更する必要があります。どこかでやり忘れたり、タイプミスしたりする大きな変更があります。

優れたプログラミングの目標の 1 つは、可能な限り重複を避けることです。

public class ServiceCharge {
    public static void main(String[] args) {

        Scanner kb = new Scanner(System.in);
        System.out.println("I will calulate the service charge to cash your check");
        System.out.print("Enter amount of check: $");
        double checkAmount = kb.nextDouble();

        if (checkAmount > 0) {
            double fee;
            String feeMessage;
            if (checkAmount <= 10) {
                fee = 1;
                feeMessage = "$1 service charge";
            } else if ((checkAmount > 10) && (checkAmount <= 100)) {
                feeMessage = "10 percent charge.";
                fee = (checkAmount * .10);
            } else if ((checkAmount > 100) && (checkAmount <= 1000)) {
                feeMessage = "$5 charge plus 5 percent";
                fee = 5 + ((checkAmount - 5) * .05);
            } else {
                feeMessage = "$40 processing fee plus 1 percent";
                fee = 40 + ((checkAmount - 40) * .01);
            }
            checkAmount = checkAmount - fee;

            System.out.printf("Fee structure: " + feeMessage);
            System.out.printf("Processing fee: $%.2f\n", fee);
            System.out.printf("Check amount: $%.2f\n", checkAmount);
            System.out.println("Thanks for using Service Charger.\nGood bye");
        }
    }
}

次のステップは、プログラムを機能的に関数に分解することです。たとえば、金額を求める部分、計算を行う部分、結果を示す部分は、大きく異なる 3 つの部分です。これら 3 つのそれぞれを個別に変更したい場合があります。ファイルまたは Web 要求から入力を取得したい場合や、結果をユーザーに表示するのではなく、別の計算で使用したい場合があります。

したがって、これらは別々の機能に入る可能性があります。

次に、オブジェクトの分解について考えることができます。おそらく、ここでは、、およびCheckCashActionのプロパティを持つオブジェクトについて話しているのでしょう。checkAmountfeefeeStructurepayoutAmount

等。

良い点は、各ステップを個別に見て、それらを個別にテストできることです。これにより、バグの特定とコードの保守が容易になります。

于 2014-02-08T06:40:07.007 に答える
0
            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);

それは 40 ドルの手数料 + 1 パーセントではありません。これは 1% 弱の手数料です。これは、最初の 40 ドルを無料でキャッシュアウトし、残りに 1% の料金を適用するようなものです。

40 ドルを引いた後の残額ではなく、小切手全体に 1% の料金が適用されると仮定すると、料金の正しい式は次のようになります。

            fee = 40 + 0.01*checkAmount;
于 2014-02-08T05:56:40.507 に答える