2016-09-09 18 views
0

私は、ユーザーが書き込むint値の量を決定できるようにコードを記述しなければなりません。ユーザーから少なくとも2つの入力がなければなりません。プログラムは入力からの値を比較し、2つの最も高い値を出力します。これまでのところ最高の価値をプリントアウトすることができましたが、2つの数字をプリントアウトすることを選択すると出力が0になり、最初に最高のものが入力されてから何が間違っているのか分かりません。また、2番目に高い番号を追跡する方法もわかりません。助けていただければ幸いです。ユーザー入力から2つの最高値を出力する

import java.util.Scanner; 
public class ToStoersteTall{ 
    public static void main(String[] args){ 
     System.out.println("How many numbers? (minimum 2)?:"); 
     Scanner reader = new Scanner(System.in); 

     if (reader.hasNextInt()) { 
      int numbers = reader.nextInt(); 
      if (numbers >= 2) { 
       System.out.println("Enter value #1"); 
       if (reader.hasNextInt()) { 
        int num1 = reader.nextInt(); 
        System.out.println("Enter value #2"); 
        if (reader.hasNextInt()) { 
         int num2 = reader.nextInt(); 

         int biggest = 0; 
         for (int i = 3; i <= tall; i++) { 
          System.out.println("Enter value #" + i); 
          int num3 = reader.nextInt(); 
          biggest = num1; 
          if(biggest < num3){ 
           biggest = num3; 
          } 
         } 
         System.out.println(biggest); 
        } else { 
         System.out.println("Please enter an integer"); 
        }     
       } else { 
        System.out.println("Please enter an integer"); 
       } 
      } else { 
       System.out.println("Please enter an integer equal or higher than 2."); 
      } 
     } else { 
      System.out.print("Vennligst oppgi et heltall større eller lik 2."); 
     } 
    } 
} 
+0

は、コードのforループでtall' 'の値とは何ですか? –

+0

'' tall'はどこに宣言されていますか? –

+0

申し訳ありませんが、背が高いのは数字です。私はもともとノルウェー語のテキストと変数名でコードを書いていたので、そこにノルウェー語のテキストを入れて翻訳するのを忘れました –

答えて

0

あなたはすでに最大のものを把握しているので、2番目に大きいものを把握してみませんか?この問題を解決するもう1つの簡単な方法は、すべての数値をリストに保持し、リストを数値サイズでソートし、2つの最も高いエントリを取得することです。

0

私はあなたのコードを試して、問題を解決するために配列を使用しました。

import java.util.Scanner; 

public class Main { 
    static int secondHighest(int... nums) { 
     int high1 = Integer.MIN_VALUE; 
     int high2 = Integer.MIN_VALUE; 
     for (int num : nums) { 
      if (num > high1) { 
       high2 = high1; 
       high1 = num; 
      } else if (num > high2) { 
       high2 = num; 
      } 
     } 
     return high2; 
    } 
    public static void main(String[] args) { 
     System.out.println("How many numbers? (minimum 2)?:"); 
     Scanner reader = new Scanner(System.in); 
     if (reader.hasNextInt()) { 
      int numbers = reader.nextInt(); 
      int[] array = new int[numbers]; 
      if (numbers >= 2) { 
       System.out.println("Enter value #1"); 
       if (reader.hasNextInt()) { 
        int num1 = reader.nextInt(); 
        array[0] = num1; 
        System.out.println("Enter value #2"); 
        if (reader.hasNextInt()) { 
         int num2 = reader.nextInt(); 
         array[1] = num2; 
         int biggest = 0; 
         for (int i = 3; i <= numbers; i++) { 
          System.out.println("Enter value #" + i); 
          int num3 = reader.nextInt(); 
          array[i-1] = num3; 
         } 
         System.out.println("second largest number is" + secondHighest(array)); 
         int largest = 0; 
         for(int i =0;i<array.length;i++) { 
          if(array[i] > largest) { 
           largest = array[i]; 
          } 
         } 

         System.out.println("Largest number in array is : " +largest); 

        } else { 
         System.out.println("Please enter an integer"); 
        } 

       } else { 
        System.out.println("Please enter an integer"); 
       } 
      } else { 
       System.out.println("Please enter an integer equal or higher than 2."); 
      } 
     } else { 
      System.out.print("Vennligst oppgi et heltall større eller lik 2."); 
     } 
    } 
} 

テスト

How many numbers? (minimum 2)?: 
6 
Enter value #1 
3 
Enter value #2 
4 
Enter value #3 
5 
Enter value #4 
6 
Enter value #5 
7 
Enter value #6 
8 
second largest number is7 
Largest number in array is : 8 
0

プログラムの論理エラーがあります。 numbersが2の場合、forループは実行されず、更新されないため、biggestの値はゼロのままです。これまでに見つかった現在の最大値を反映するため、最大の宣言を変更します。

int biggest = num1 > num2 ? num1 : num2;

ループのために最初の2つの数の最大値になり、その後最大の実行はありません場合はその方法。

2番目に高い値を保持するために、別の変数secondBiggestを導入して、biggestと同様の方法で初期化し、その後、forループでこの値を更新するロジックを書き込むことができます。しかし、私の意見では、入力された値を配列に保持する戦略を変更する方がずっと簡単で、すべての入力が完了したら、配列から必要な値を計算します。これにより、よりクリーンなIMOソリューションが実現します。

import java.util.Scanner; 

public class Foo{ 

    public static void main(String[] args){ 

     System.out.println("How many numbers? (minimum 2)?:"); 
    Scanner reader = new Scanner(System.in); 

     if(reader.hasNextInt()){ 

      int numbers = reader.nextInt(); 
      if(numbers >= 2){ 

      int[] list = new int[numbers]; 

       for(int i = 0; i < numbers; i++){ 
        System.out.println("Enter value #" + (i + 1)); 
        if(reader.hasNextInt()) 
         list[i] = reader.nextInt(); 
       }//for 

       int biggest = 0; 
       int secondBiggest = 0; 

       // find the values you want 
       for(int i = 0; i < numbers; i++){ 
        if(list[i] > biggest){ 
         secondBiggest = biggest; 
         biggest = list[i]; 
        }//if 
        else if(list[i] > secondBiggest) 
         secondBiggest = list[i]; 
       }//for 

       // print your results 
       System.out.println("The biggest integer is: " + biggest); 
       System.out.println("The second biggest integer is: " + secondBiggest); 

      }//if 
     }//if 
    }//main 
}//class 
0

私はユーザーが決めることができますコードを記述する必要が割り当てられています(私は... forループ内tallが実際にnumbersであることを意味することを想定しています)書き込まれるint値の量を計算し、次にこれらの値を決定します。ユーザーから少なくとも2つの入力がなければなりません。プログラムは入力からの値を比較し、2つの最も高い値を出力します。これまでのところ最高の価値をプリントアウトすることができましたが、2つの数字をプリントアウトすることを選択すると出力が0になり、最初に最高のものが入力されてから何が間違っているのか分かりません。また、2番目に高い番号を追跡する方法もわかりません。助けていただければ幸いです。

カップルの事:ブロックは読みやすくするために膨らまif文

  • 良い練習は

  • 減少スキャナを閉じて(と一般的にリソースをIO関連)する

  • 2つの保証された番号を指定するので、ループする前にそれらを解析してください。

  • はにSystem.exitの呼び出しを削除するかにSystem.exitを交換し、バックOPに元々状態のような大きなのif-elseブロックへのコードの大部分を移動する(しかし、私は読みやすさのために戻って参照してください)

  • はチェックを追加することができます第1および第2の数字は、high1が最高値であり、high2が2番目に高い値であることを確認するために入力される。

  • 数値が新しい高値であれば、値をループしてチェックしながら(ハイライト1を置き換えてhigh1の値をハイ2に移動するか、またはその数が新しい、high2を交換してください。値が等しい場合、このロジックが除外され、あなたがあなた自身の制約に基づいて指定することもできます

    import java.io.IOException; 
    import java.util.Scanner; 
    public class ToStoersteTall { 
        public static void main(String[] args) throws IOException { 
        System.out.println("How many numbers? (minimum 2)?:"); 
        Scanner reader = new Scanner(System.in); 
        int n = 0; 
        if (reader.hasNextInt()) { 
         n = reader.nextInt(); 
        } else { 
         System.out.println("Vennligst oppgi et heltall større eller lik 2."); 
         System.exit(-1); // quits execution 
        } 
    
        if (n < 2) { 
         System.out.println("Please enter an integer equal or higher than 2."); 
         System.exit(-2); 
        } 
    
        // Since guaranteed 2 numbers, parse and assign now 
        int high1 = 0, high2 = 0; 
        System.out.println("Enter value # 1"); 
        if (reader.hasNextInt()) 
         high1 = reader.nextInt(); 
        System.out.println("Enter value # 2"); 
        if (reader.hasNextInt()) 
         high2 = reader.nextInt(); 
    
        // check to see if a switch to keep correct highest order, swap values if so 
        if (high1 < high2) { 
         int t = high2; 
         high2 = high1; 
         high1 = t; 
        } 
    
        // loop won't execute if only 2 numbers input, but will if 3 or more specified at start 
        for (int i = 2; i < n; ++i) { 
         System.out.println("Enter value #" + (i + 1)); 
         if (reader.hasNextInt()) { 
          int t = reader.nextInt(); 
          if (t > high1) { 
           high2 = high1; // throw away high2 value and replace with high1 
           high1 = t; // replace high1 value with new highest value      
          } else if (t > high2) { 
           high2 = t; 
          } 
         } else { 
          System.out.println("Please enter an interger"); 
         } 
        } 
    
        reader.close(); 
    
        System.out.println("The two highest numbers are: " + high1 + ", " + high2); 
    } 
    

    }

+0

入力1 <入力2なら1番目と2番目の入力を切り替えた部分は良い考えでした。それに気づくだろう。私は "import java.io.IOException;"しかし、私は私のコースでそれについて学んだことはありません。 –

+0

私は助けてくれると嬉しいです。また、IOExceptionのインポートは、私がreader.close()に追加したためです。メソッドの呼び出しは、main()メソッドの終わり近くで行います。例外についてまだ学習していない場合は、単にreader.close()メソッド呼び出しを削除し、メインのmethod()シグネチャの "throws IOException"部分を削除し、 "java.io.IOExceptionのインポート"行を削除します。 –

関連する問題