簡體   English   中英

初學者Java程序員算術錯誤

[英]Beginner Java programmer arithmetic error

我最近開始從事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");
    }
}
}

對於最后的else語句,似乎與其余的語句有點不同。 您使用“保留”存儲原始的checkAmount值,然后將checkAmount修改為前三個語句的費用。 您應該像最后一個一樣建模最后一個。 checkAmount應該是checkAmount = (checkAmount * .01) + 40 ,然后hold - checkAmount應該返回您要查找的值。 通過使checkAmount = checkAmount - 40 ,最后一行將返回hold (checkAmount) - (checkAmount - 40) ,該值將始終返回40

            System.out.println("$40 processing fee plus 1 percent");
            fee = ((checkAmount - 40) * .01);

那不是40美元的費用+ 1%。 那是略低於1%的費用; 好像您是免費兌現前40美元,然后對其余部分收取1%的費用。

假設對整張支票收取1%的費用,而不是減去40美元后剩下的費用,則費用的正確表達式為

            fee = 40 + 0.01*checkAmount;

實際上,您只想根據原始表達只收取支票金額的1%費用減去40美元的固定費用,因此表達應為:

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

您的代碼中有很多重復項,這使得查看正在發生的事情變得更加困難,並且如果您決定更改(例如)要顯示給用戶的消息,則現在需要在4個位置進行更改,發生了很大的變化,您忘記了在某個地方做,或者您打錯了字。

良好編程的目標之一是盡可能避免重復。

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");
        }
    }
}

您可能要研究的下一步是將程序從功能上分解為功能。 例如,索要金額的部分,進行計算的部分和顯示結果的部分是三個截然不同的部分。 您可能希望分別更改這三個選項中的每一個-您可能希望從文件或Web請求中獲取輸入,並且可能希望將使用結果存儲在另一計算中,而不是向用戶顯示。

因此,這些可以進入單獨的功能。

然后您可以考慮對象分解-也許我們在這里談論的是CheckCashAction對象,該對象具有checkAmountfeefeeStructurepayoutAmount

等等。

令人高興的是,您可以分別查看每個步驟並單獨進行測試,這使查明錯誤和維護代碼變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM