2016-10-06 9 views
0

私のプログラムは、ユーザーからの入力データを受け入れて(最大20の値)、平均を計算し、平均からの距離を求めます。数字がまだ追加されていないときにユーザーが "9999"を入力すると、エラーメッセージが表示され、値を再入力するようにユーザーに指示します。それ以外の場合は「9999」と入力すると、ユーザーが入力した内容が収集され、計算が行われます。私のプログラムは、ユーザーから20個の入力をすべて集めなければならず、値 "9999"が完全に入力されたときも無視しますが、他の計算は正しく行います。なぜ私のセンチネルの価値を認識していないのか分かりません。Javaプログラムはセンチネルの値を認識しません

package labpack; 

import java.util.Scanner; 

public class Lab4 { 

    public static void main(String[] args) { 
     int i = 0; 
     double [] numbers = new double[20]; 
     double sum = 0; 
     int sentValue = 9999; 

     java.util.Scanner input = new java.util.Scanner(System.in); 

     System.out.print("Enter the numbers you want up to 20"); 

     do { 
      for (i = 0; i < numbers.length; i++) { 
       if (numbers[0] == sentValue){ 
        System.out.println("Error: Please enter a number"); 
        break; 
       } 
       else { 
        numbers[i] = input.nextDouble(); 
        sum += numbers[i]; 
       } 
      } 

      while (i<numbers.length && numbers[i]!=sentValue); //part of do-while loop 

      //calculate average and distance from average 
      double average = (sum/i); 
      System.out.println("This is your average:" + average); 

      for (i = 0; i < numbers.length; i++) { //Display for loop 
       double diffrence = (average-numbers[i]); 
       System.out.println("This is how far number " +numbers[i] +" is from the average:" + diffrence); 
      } 
     } 
    } 
+0

は、デバッガでそれを実行してみましたか? –

+0

'main'から' return'がプログラムを終了します –

+0

ここにいくつかの設計上の欠陥があります。1)forループ内のセンチネルのテストがないので、inner forループは20個すべての数値に対して実行されます。2)inner forループ数字を上書きする[0] 3)私は外側do whileループと内側forループの両方が問題を解決する必要があるとは思わない。 – paisanco

答えて

1

これを行うには、do-whileやdo whileをせずに行うことができます。

if (numbers[0]== sentValue){ 
      System.out.println("Error: Please enter a number"); 
      break; 

ここでは、配列をユーザー入力で初期化せずに値を比較しようとしています。変数に

import java.util.Scanner; 
public class Lab4 { 

    public static void main(String[] args) { 
     int i = 0; 
     double [] numbers =new double[10]; 
     double sum =0; 
     double sentValue=9999; 
     int count = 0; 
     System.out.println(numbers.length); 
     System.out.print("Enter the numbers you want up to 20"); 
     Scanner input = new Scanner(System.in); 
     while (i<numbers.length){ 
      double temp = input.nextDouble(); 
      if (temp >= sentValue){ 
       if(i==0){ 
        System.out.println("Error Message Here"); 
       } else { 
        break; 
       } 
      }//if 
      else { 
       numbers[i] = temp; 
       sum += numbers[i]; 
       i++; 
       count++; 
      } 
     } //part of while loop*/ 

     //calculate average and distance from average 
     double average=(sum/i); 
     System.out.println("This is your average:" + average); 

     for (i=0;i < count;i++){ //Display for loop 
      double diffrence = (average-numbers[i]); 
      System.out.println("This is how far number " +numbers[i] +" is from the average:" + diffrence); 
     }//for loop 
    }//main bracket 

}//class lab4 bracket 

あなたはinput.nextDouble(の値を格納する必要があります)コンパイラはinput.nextDoubleを(読み込むため):これは非常に簡単な方法で行うことができます

と入力します。

PS。あなたはこの部分を再初期化する必要がいけない:あなたはすでにスキャナを輸入しているため

Scanner input = new Scanner(System.in); 

java.util.Scanner input = new java.util.Scanner(System.in); 

上記の行は、単にのように記述することができます。

import java.util.Scanner; 

希望はこのことができます:)

+0

こんにちは!それは役立ちますが、値9999が入力されるまで、プログラムが '数値'の配列に追加しておきたいのです。次に、入力された値の数で計算を行います。たとえ2つの値または20の値しか入力しなかったとしても。しかし、最初の値が9999と入力された場合は、「計算を行うために少なくとも1つの数値を入力する必要があります」というメッセージが表示されます – CuriousCoder97

+0

更新されたコードを確認してください。 配列に追加された値の数を保持する変数* count *を導入しました。次に、カウントまで配列を実行し、ユーザーが入力した値の差異を表示します。 –

+0

素晴らしい作品!私はカウント変数が必要だとは思わなかった。私は配列から入力された数字だけを表示する方法を知らなかった。私はいつもあなたがすべて20を使用しなければならないと思った、そうでなければ0を表示するだけだった。これは私を非常に助け、将来的にも私を助けてくれます。ありがとうございました! – CuriousCoder97

関連する問題