Java while循环行为

时间:2011-12-02 22:42:27

标签: java

我遇到的问题是我编写的Java课程,我无法弄清楚它为什么会以某种方式运行。这是本书的问题,A部分和B部分:

A)创建一个名为Purchase的类。每次购买都包含发票编号,销售金额和销售税金额。包括发票编号和销售金额的设置方法。在销售金额的set()方法中,将销售税计算为销售金额的5%。还包括显示购买详细信息的显示方法。将文件另存为Purchase.java

B)创建一个声明Purchase对象的应用程序,并提示用户购买详细信息。当您提示发票编号时,请不要让用户继续操作,直到输入介于1000和8000之间的数字。当您提示销售金额时,请勿在用户输入非负数,销售金额和销售税之前继续。将文件另存为CreatePurchase.java。

以下是问题第一部分的代码:

public class Purchase
{

    int invoiceNumber = 1234;
    double salePrice = 10.00;
    double SalesTax;

    public void setInvoiceNumber(int invoice)
    {
        invoiceNumber = invoice;
    }

    public void setSalePrice(double saleAmount)
    {
        salePrice = saleAmount;
        SalesTax = (saleAmount * .05);
    }

    public void displaySalePrice()
    {
        System.out.println("Your invoice number is:" + invoiceNumber + ".");
        System.out.println("Your sale amount is: " + salePrice + ".");
        System.out.println("Your sales tax is: " + SalesTax + ".");
    }

 }

以下是问题第二部分的代码:

import java.util.Scanner;

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

        int invoice;
        double saleAmount;
        invoice = 0;
        saleAmount = 0.0;
        Purchase completedPurchase = new Purchase();

        Scanner input = new Scanner(System.in);
        System.out.println("Please enter the invoice number: ");
        invoice = input.nextInt();
        System.out.println("Please enter the sale amount: ");
        saleAmount = input.nextDouble();

        do
        {
            System.out.println("You entered an invalid number.");
            System.out.println("Please enter a number between 1000 and 8000.");
            invoice = input.nextInt();
        }   
        while (invoice < 1000 || invoice > 8000);

        do
        {
            System.out.println("You entered an invalid number."); 
            System.out.println("Please enter a number greater than 0.");
            saleAmount = input.nextDouble();
        }
        while (saleAmount < 0);

        completedPurchase.setInvoiceNumber(invoice);
        completedPurchase.setSalePrice(saleAmount);

        completedPurchase.displaySalePrice();
    }
}

当我编译CreatePurchase.java并运行它时,它可以工作,但必须在它工作之前先循环遍历循环。例如,我会在7000中输入发票金额,输入100作为销售金额。这两个值应自动调用completePurchase.displaySalePrice();方法,因为发票号码大于1000且小于8000,且销售金额大于0。既然如此,它在调用该方法之前仍会循环执行do while循环。

我不能为我的生活弄清楚这一点。这可能是我想念的非常简单的事情。任何帮助将不胜感激。

在下面的每个人的大力指导下,我将循环的代码更改为以下内容:

while (invoice < 1000 || invoice > 8000)
        {
            System.out.println("You entered an invalid number.");
            System.out.println("Please enter a number between 1000 and 8000.");
            invoice = input.nextInt();
        }   

        while (saleAmount < 0)
        {
             System.out.println("You entered an invalid number."); 
             System.out.println("Please enter a number greater than 0.");
             saleAmount = input.nextDouble();
        }

它仍然无法正常工作。将循环更改为while循环肯定有效,但是现在当我输入一个数字表示发票号码在正确的范围内并且salesAmount的编号不正确时,程序完成并且不执行saleAmount的while循环?我似乎在这里错过了一个概念。

此外,任何人都可以推荐比JGrasp更好的IDE。这就是我们被告知使用的东西,但它很麻烦。我有VisualStudio和Eclipse,但我觉得在这两个IDE中做java作业可能有些过分。我将学习更多的java课程和c ++课程,所以也许值得学习VS或Eclipse的基础知识。任何建议将不胜感激。

9 个答案:

答案 0 :(得分:2)

这是因为do阻止总是至少执行一次 。您应该使用while循环代替:

while (invoice < 1000 || invoice > 8000)
{
  System.out.println("You entered an invalid number.");
  System.out.println("Please enter a number between 1000 and 8000.");
  invoice = input.nextInt();
} 

这样,您只需要另一个号码,如果 invoice号码不在您定义的范围之内。

答案 1 :(得分:0)

这是怎么做的... while循环工作:正文执行一次,然后检查条件。改为使用普通的while循环。

答案 2 :(得分:0)

这是因为您使用的是do{ } while(...)而不是while(...) { }

do do保证至少运行一次,然后继续循环。

如果初始条件为假,则永远不会运行。

答案 3 :(得分:0)

do-while循环中,在测试条件之前执行正文。您可能希望使用while循环,在测试条件后执行主体。

我强烈建议您阅读与Sun while and do-while tutorial的区别。

答案 4 :(得分:0)

将您的循环更改为while s

while (invoice < 1000 || invoice > 8000)
{
    ...
}

答案 5 :(得分:0)

  

当我编译CreatPurchase.java并运行它时,它可以正常工作,但必须在它工作之前先循环遍历循环。

那是因为你正在使用do...while循环。 do...while循环执行至少一次,并在执行循环体之后检查条件

在这种情况下,您想要的是一个简单的while循环,以便在执行循环体之前检查条件。即:

while (invoice < 1000 || invoice > 8000)
{
    ...
}   

答案 6 :(得分:0)

Java中有几个循环函数,一个是do-while-loop,它总是执行一次,然后如果while-part为true则再次循环。

另一个,在这种情况下更好的是,while循环的工作方式相同但在第一个循环之前检查while-part。

查看tutorial

答案 7 :(得分:0)

您需要while (condition) {…}循环。这样,只有条件为真时才会执行循环中的代码。在您的代码中,您有一个do … while(condition)循环,循环内部将始终至少执行一次。

答案 8 :(得分:0)

import java.util.Scanner;

public class CreatePurchase {

public static void main(String[] args) {

    int invoice;
    double amount;

    Purchase sale1 = new Purchase();
    System.out.println("Enter invoice number between 1000 and 8000 >>");
    Scanner input = new Scanner(System.in);
    invoice = input.nextInt();

    while (invoice < 1000 || invoice > 8000) {
        System.out.println("You entered a wrong invoice number");
        System.out.println("Enter invoice number between 1000 and 8000 >>");
        invoice = input.nextInt();
    }

    System.out.println("Enter sales amount >>");
    amount = input.nextDouble();

    while (amount < 0) {
        System.out.println("Enter number greater than 0 ");
        System.out.println("Enter sales amount >>");
        amount = input.nextDouble();
    }

    sale1.setInvoiceNumber(invoice);
    sale1.setAmount(amount);
    sale1.display();
}
}