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

4

对于最后一个 else 语句,它似乎与您的其余语句有点不同。您使用“hold”来存储原始checkAmount值,然后修改checkAmount为前三个语句的费用。您应该像之前的一样对最后一个进行建模。checkAmount应该是checkAmount = (checkAmount * .01) + 40,然后应该hold - checkAmount返回您正在寻找的值。通过拥有checkAmount = checkAmount - 40,最后一行返回保持(checkAmount) - (checkAmount - 40),它将始终返回40

于 2014-02-08T04:52:24.107 回答
0
            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;
于 2014-02-08T05:56:40.507 回答
0

实际上,根据您的原始表达式,您只想收取支票金额的 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

等等。

好消息是您可以分别查看每个步骤并单独测试它们,这样可以更轻松地查明错误并维护代码。

于 2014-02-08T06:40:07.007 回答