-2

Scanner を使用してデータを読み込むクラスの割り当てがあります。

import java.util.Scanner;

public class Project23
{
    public static void main(String[] args)
    {
        // Declarations and instantiations.
        Scanner scan = new Scanner(System.in);
        String any = "";
        boolean more = false;
        double purchase = 0.0;

        // Ask if user would like to run program?
        System.out.print("Do you have any purchases? Y/N?: ");

        // Ready value into string.
        any = scan.nextLine();
        System.out.println();

        // If any is equal to y or Y it will set the value of more to true
        // this runs the while statement below.
        more = any.toUpperCase().equals("Y");

        // While more is still true continue to run the code within the brackets.
        while (more)
        {
            System.out.print("Please input purchase amount: ");
            purchase += scan.nextDouble();
            System.out.println();

            System.out.print("Do you have any more purchases Y/N?: ");
            any = scan.nextLine();
            System.out.println();

            more = any.toUpperCase().equals("Y");
        }

        if (purchase >= 2500)
            System.out.println("Purchase >= 2500");
        else
            System.out.println("Purchase < 2500");
    }
}

下部は、すべてが正常に実行されているかどうかを確認するためのテストとして表示されています。ただし、私がセットアップしたwhileループは、複数回実行し続けたくないようです。1 つの値を取り、はいと言った場合は、さらに値 (y または Y) があります。終了して、いずれかのブービーを出力します。

4

4 に答える 4

7

基本的に何が起こっているかは、scan.nextDouble() として double を読み取っている間、double のみを読み取っていますが、scan.nextDouble() によって読み取られないストリームで Enter キーを押すと、ENDLINE 文字が表示されます。したがって、any1=scan.nextLine() に到達すると、Y または y に等しくない最終行文字が読み取られます。その結果、while ループを終了します。次のようにコードを修正します。 dobel を読んでいる 1 行を変更するだけです。

while(more){

    System.out.print("Please input purchase amount: ");
    purchase+=Double.parseDouble(scan.nextLine());
    System.out.println();
    System.out.print("Do you have any more purchases Y/N?: ");
    // scan.nextLine();
    String any1=scan.nextLine();
    System.out.println();       
    more = any1.equals("y") || any1.equals("Y");//Shortened :)
}
于 2012-10-03T02:07:21.850 に答える
2

デバッガーの下でアプリケーションを実行するか、診断トレースの出力を追加することで、これを自分で理解できるはずです。たとえば、適切なポイントでこのようなもの。

    System.out.println("any is ==>'" + any + "'<==");

any(これは、あなたが期待するものが含まれていないことを示しているに違いありません...)

他の人に助けを求めるよりも、自分のコードをデバッグする方法を学ぶことを強くお勧めします。これは、プロのソフトウェア エンジニアにとって重要なスキルです。

于 2012-10-03T02:07:44.300 に答える
1

これは私にとってはうまくいくようです...

boolean more = true;
while (more) {

    System.out.print("Do you have any more purchases Y/N?: ");
    String any1 = scan.nextLine();
    System.out.println();
    if (any1.equalsIgnoreCase("y")) {
        more = true;
    } else {
        more = false;
    }

    System.out.println(more);

}

それほど大きな違いはないと確信しているので、どちらが私を驚かせますか

while(more==true)は必要ありませんwhile(more)が、同じことを言います。

if(any1.equals("y") || any1.equals("Y"))必須でif (any1.equalsIgnoreCase("y"))はありません。同じことを行います

于 2012-10-03T02:00:18.050 に答える
1

よりクリーンで読みやすいコードを得るには、変数do..whileが不要になるため、この場合はブロックを使用することをお勧めします。more

public static void main(String[] args) {
    double purchase = 0.0;
    Scanner scan = new Scanner(System.in);
    System.out.print("Do you have any more purchases Y/N?: ");
    if (!scan.nextLine().equalsIgnoreCase("y")) {
        return;
    }
    do {
        System.out.print("Please input purchase amount: ");
        purchase += Double.parseDouble(scan.nextLine());
        System.out.print("Do you have any more purchases Y/N?: ");
    }
    while (scan.nextLine().equalsIgnoreCase("y"));
    System.out.println("Your purchase amount is: " + purchase + " and so is " + (purchase >= 2500 ? ">= 2500" : "< 2500"));
}

宿題としては、かなりいいと思います。プロジェクトの実際の作業では、意味のある多くの小さなメソッドをリファクタリングし、冗長性のほとんどを回避する必要があります。それはあなたの二次的な宿題かもしれません:それを最適化してください:)

于 2012-10-03T02:16:22.787 に答える