2

私は自分でJavaプログラミングを学ぼうとしていますが、スタンフォード大学が提供するCS106Aコースに出くわしました。それは素晴らしい無料のオンラインコースです。講義ビデオを何本か見て、今まで楽しんでいました。私は今、割り当てをしようとしていますが、自分では解決できないこの問題があります。

この課題の5番です。基本的に、学習者はコンソールプログラムを作成して、ユーザーが入力した整数を取得し、それに応じて最大数と最小数を表示する必要があります。

次のコードは私が行ったことであり、問​​題は整数を入力しようとすると、偶数の入力をスキップすることです。たとえば、コンソールに3,12,6,15,9と入力すると、12,15を無視して、3,6,9しか取得されません。

私は何を間違えましたか?どんな助けでもいただければ幸いです。

import java.util.*;

public class Ass2_5MaxMinNumbers {
    public static void main (String args[]) {
        Scanner scanner;

        System.out.println ("This programme finds the largest and smallest numbers.");
        System.out.println ("After finished entering, enter \"End\" (without double quotes) to show the results.");

        List<Integer> list = new ArrayList<Integer>();
        int max = 0, min = 0;

        do {
            scanner = new Scanner(System.in);

            if(scanner.hasNextInt()){
                int x = scanner.nextInt();
                list.add(x);
                System.out.println("user input: " + x);
            } else if(!scanner.hasNext("End")){
                System.out.println("Please enter an integer!");
            }
        } while (!scanner.hasNext("End"));

        max = list.get(0);
        min = list.get(0);
        for(int x = 1; x < list.size(); x++){
            if(list.get(x) > max){
                max = list.get(x);
            } else if(list.get(x) < min){
                min = list.get(x);
            }
        }

        System.out.println ("Smallest number: " + min);
        System.out.println ("Biggest number: " + max);
    }
}
4

2 に答える 2

3

Scanner.nextIntメソッドは、ユーザーから渡された入力から次のトークンのみを読み取ります。linefeedしたがって、各入力の最後にあるを無視します。そして、そのラインフィードはへの次の呼び出しへの入力として使用されるScanner.nextIntため、入力は無視されます。

Scanner.nextLine各呼び出しの後にブランクを使用してScanner.nextInt、ラインフィードを使用できます。

if(scanner.hasNextInt()){
    int x = scanner.nextInt();
    scanner.nextLine();  // Add a blank nextLine
    list.add(x);
    System.out.println("user input: " + x);
}

またはscanner.nextLine()、読み取り専用に使用して、入力を使用integersに変換することもできます。integerInteger.parseInt

if(scanner.hasNextInt()) {
    int x = 0;

    try {
         x = Integer.parseInt(scanner.nextLine());
    } catch (NumberFormatException e) {
         e.printStackTrace();
    }

    list.add(x);
    System.out.println("user input: " + x);
}

実際、あなたはあなたのifで使用しているので、あなたはあなたの周りにscanner.hasNextIntそれを本当に必要としないので、あなたはそれを取り除くことができます。try-catchInteger.parseInt


アップデート : -

do-while私はあなたをaに置き換え、チェックを内側からwhile削除します。if-else

while (scanner.hasNextLine()) {
    String input = scanner.nextLine();

    if (input.equals("End")) {
        break;
    } else {
        try {
            int num = Integer.parseInt(input);
            list.add(num);

        } catch (NumberFormatException e) {
            System.out.println("Please Enter an Integer");
        }
    }
}
于 2012-11-17T10:31:26.533 に答える
2

投稿したコードの間違いは、ループを繰り返して新しいScannerオブジェクトを作成していることです。ループの前にスキャナーを初期化すると、コードが機能します。

    scanner = new Scanner(System.in);
    do {
      if(scanner.hasNextInt()){
            int x = scanner.nextInt();
            list.add(x);
            System.out.println("user input: " + x);
        }
        //and so on...

ところで-最大値と最小値は、最初に値をリストに格納しなくても、whileループ内で計算できます。

この無料のオンラインクラスをご利用いただきありがとうございます。

于 2012-11-17T10:35:19.177 に答える