2017-03-05 6 views
0

ユーザーが入力した配列で移動平均を計算するプログラムを書く必要があります。配列の最初の要素はウィンドウサイズで、入力は0で終了します。出力値は小数点以下2桁で表示されます。ユーザー入力配列を使った移動平均

例入力:3 2 4 7 7 8 11 12 0

対応する出力:4.33 6.00 7.33 8.67 10.33

がここに私のコードです(4.33は2,4,7及び6の平均値であるが、4,7,7等の平均です)これまで:

package movingaverage; 

import java.util.Scanner; 

public class MovingAverage { 

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int n = sc.nextInt(); 
    int[] arr = new int[n]; 
    int sum = 0; 
    for (int i = 0; i < n; i++) { 
     sum += arr[i]; 
    } 
    avg[0] = sum/5; 

    int j = 1; 
    for (int i = 5; i < arr.length; i++) { 
     sum = sum + arr[i] - arr[i - 5]; 
     avg[j++] = sum/5; 
    } 

    } 

} 

私はループ権利を持っていると思うが、私は、配列は0

012で終了するために取得するかどうかはわかりません

答えて

1

これは可能な解決策です。

public class Test 
{ 
    private static final Scanner SCANNER; 

    static { 
     SCANNER = new Scanner(System.in); 
    } 

    public static final void main(final String... args) { 
     final String[] numbers = SCANNER.nextLine().trim().split(" "); 
     final int consideredElements = Integer.parseInt(numbers[0]); 
     float sum = 0; 
     int value = 0; 

     for (int i = 1; i < numbers.length; i++) { 
     sum = 0; 

     for (int k = 0; k < consideredElements; k++) { 
      value = Integer.parseInt(numbers[i + k]); 

      if (value == 0) { 
       return; 
      } 

      sum += value; 
     } 

     System.out.println(new BigDecimal(sum/consideredElements).setScale(2, RoundingMode.HALF_EVEN)); 
     } 
    } 
} 
+0

これは機能しますが、私はユーザー入力の配列で動作する必要があります。 – Lukas

+0

更新された回答を参照してください。これは、スペースで区切られた数字のリストを受け入れます。 – LppEdd

+0

この行のために 'final int [] numbers = Arrays.stream(SCANNER.nextLine()。trim()。split(" "))。mapToInt(Integer :: parseInt).toArray();'とにかく私は配列クラスを使用していないので、それを変更しますか?この割り当ては初心者のJavaクラスのためのものですが、まだそのトピックについては触れていません。 – Lukas

-1

まず、プログラムのいくつかの場所で5を使用していますが、それは正当化されていません。あなたが本当に使用すべき数字がユーザの入力に依存するところで、あなたのユーザ入力があなたの期待を5にすることができるのでしょうか?たぶんあなたは代わりにウィンドウのサイズを使用する必要がありますか?私はここで少しを推測しています。

次に、@ lppEddが指摘しているように、あなたは入力から数値を読み取っているわけではなく、ウィンドウサイズのみを読み取っています。

次に、サイズがの配列を宣言しています。これは、配列サイズではなくウィンドウサイズであると考えられます。私は、この問題の本当の解決策はより良い説明変数名を使用していると信じています。

移動平均を格納しようとする配列avgを宣言していないため、コードはコンパイルされません。あなたがdoubleとしてあなたの平均をするとき

第五には、あなたは(これはすでにスタックオーバーフロー上の多くの質問を生成した古典的な落とし穴です)分割前doubleに変換する必要があります。

これはあなたにさらにいくつかのステップを願っています。

+1

最初に表示されるのは、nextInt()を使用していることです。nextInt()は、配列ではなく単一の整数値だけを返します。基本的に彼は0で満たされた配列を使用しています。 – LppEdd

+0

ちょうど好奇心、なぜdownvoteですか? –

+0

これは私のものではありません=) – LppEdd