2017-03-05 7 views
0

사용자가 입력 한 배열로 이동 평균을 계산하는 프로그램을 작성해야합니다. 배열의 첫 번째 요소는 창 크기이며 입력은 0으로 끝납니다. 출력 값은 소수점 두 자리 뒤에 인쇄됩니다.사용자 입력 배열을 사용하여 이동 평균

입력 예 : 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();'어쨌든 거기에 있나요? 그것을 변경하여 배열 클래스를 사용하지 않습니까? 이 과제는 초급 자바 클래스를위한 것이고 우리는 아직 그 주제를 다루지 않았다. – Lukas

-1

처음에는 프로그램의 몇 곳에서 5를 사용하고 있는데, 그 이유는 알 수 없습니다. 사용자 입력에 대한 귀하의 기대가 실제로 사용해야하는 숫자가 사용자 입력에 달려있는 경우 5를 입력하도록 유도 할 수 있습니까? 어쩌면 대신 창 크기를 사용해야합니까? 나는 여기에서 약간 추측하고있다.

다음으로 @lppEdd가 지적했듯이, 입력 한 숫자는 윈도우 크기 만 읽지 않습니다.

다음으로 크기 배열 n을 선언하고 있습니다.이 배열은 배열 크기가 아니라 창 크기라고 생각합니다. 나는이 문제에 대한 진정한 해결책이 더 잘 설명 된 변수 이름을 사용한다고 믿는다.

이동 평균을 저장하려고 시도한 배열 avg을 선언하지 않았기 때문에 코드가 컴파일되지 않습니다. 당신이 double로 평균을 할 때

다섯째, 당신은 (이 이미 스택 오버플로에 많은 질문을 생성 한 고전적인 함정입니다) 분할 전에 double로 변환해야합니다.

나는 이것이 당신에게 몇 걸음 더 나아갈 것을 희망한다.

+1

먼저 보이는 것은 배열이 아닌 단일 정수 값만 반환하는 nextInt()를 사용하고 있다는 것입니다. 기본적으로 그는 0으로 채워진 배열을 사용할 것입니다. – LppEdd

+0

그냥 호기심, 왜 downvote? –

+0

그건 내 것이 아니야.) – LppEdd