0

この問題についてウェブサイトにすでに多くの質問があることは知っていますが、プログラムではまだコツをつかむことができません。

import java.util.Scanner;
public class time {
public static void main (String[] args) {
    int a, sec, min, hour;

    System.out.println ("Please enter the number of seconds");
    Scanner user_input = new Scanner (System.in);
    a = user_input.nextInt();

    while (!user_input.hasNextInt()) {
        System.out.println ("Error: INVALID INPUT, please try again");
        System.out.println("Please enter the number of seconds");
        a = user_input.nextInt();
    }

    hour = a/3600;
    min = ((a%3600)/60);
    sec = ((a%3600)%60);

    System.out.println(hour + " hours "+ min+ " minutes " + sec + " seconds");

}
}

上記は私のプログラムです。私はJAVAを学び始めたばかりなので、最善を尽くしましたが、このプログラムを実行するたびに何も得られません。

数字を入力しても何も表示されませんが、プログラムはまだ実行中です。

奇妙なことは..私が

!user_input.hasNextInt() 

a<0 の場合は機能しますが、二重入力や空の入力をチェックできないため、十分ではありません。

4

5 に答える 5

1

代わりに試してください:

import java.util.Scanner;

public class time {
    public static void main(String[] args) {
            long sec, min, hour;

            System.out.println("Please enter the number of seconds");
            Scanner user_input = new Scanner(System.in);

            sec = -1;

            while (user_input.hasNextLong() && (sec = user_input.nextLong()) < 0) {
                    System.out.println("Error: INVALID INPUT, please try again");
                    System.out.println("Please enter the number of seconds");
            }

            if (sec > 0) {
                    hour = sec / 3600;
                    min = ((sec % 3600) / 60);
                    sec = ((sec % 3600) % 60);

                    System.out.println(hour + " hours " + min + " minutes " + sec + " seconds");
            }

    }
}
于 2013-10-05T19:15:59.753 に答える
0

代わりにこれを試してください。nextInt() の代わりに nextLine() を呼び出して結果を解析しようとすることで、不正な入力を排除し、どのような入力ケースでもプログラムを実行し続けます。

import java.util.*;
public class time
{
    public static void main (String[] args) 
    {
        int time, sec, min, hour;
        String inputString;
        System.out.println ("Please enter the number of seconds");
        Scanner user_input = new Scanner (System.in);
        time = -1;
        inputString = user_input.nextLine();

        try
        {
            time = Integer.parseInt(inputString);
        }
        catch(NumberFormatException e)
        {
            time = -1;
        }

        while (time < 0)
        {
            System.out.println ("Error: INVALID INPUT, please try again");
            System.out.println("Please enter the number of seconds");
            inputString = user_input.next();

            try
            {
                time = Integer.parseInt(inputString);
            }
            catch(InputMismatchException e)
            {
                time = -1;
            }
       }


      hour = time/3600;
      min = ((time%3600)/60);
      sec = ((time%3600)%60);

      System.out.println(hour + " hours "+ min+ " minutes " + sec + " seconds");

  }
}

編集: IsEmpty() は正しく機能しませんでしたが、それを削除して時間を -1 として初期化するだけで修正されました。

于 2013-10-05T20:00:03.823 に答える
0

多くの場合、「分割統治」アプローチを使用すると、物事を単純化できます。この場合、関数を使用してユーザー入力を適切に読み取ると、タスクが大幅に簡素化されます。

  static int getSecondsFromUser() {
    final Scanner userInput = new Scanner(System.in);

    while (true) {
      System.out.println("Please enter the number of seconds:");
      try {
        return userInput.nextInt();            
      } catch (InputMismatchException e) {
        userInput.skip(".+");
      }
    }
  }

  public static void main(String[] args) {
    final int a = getSecondsFromUser();

    final int hour = a / 3600;
    final int min = ((a % 3600) / 60);
    final int sec = ((a % 3600) % 60);

    System.out.println(hour + " hours " + min + " minutes " + sec + " seconds");
  }

表現は「すべて」を意味userInput.skip(".+");する正規表現を使用しています。.+

関数との「契約」は、適切な int 値を返すことです。したがって、メイン関数はそれについて心配する必要はありません。値を使用して、それが正しいと想定することができます。必要に応じて >0 などのチェックをさらに追加することもできますが、簡単にするためにこれらをスキップしました。スキャンは関数内で行われるため、正しい値を取得したらすぐに return を使用して「飛び出す」ことができ、多くの複雑さが解決されます。

さらに、これにより、コードの読み取り、修正、および再利用がより簡単になります。

于 2013-10-05T19:26:03.953 に答える