2016-10-06 7 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) 내부 for 루프 숫자를 덮어 씁니다. [3] 나는 바깥 쪽 do while loop와 inner for loop가 문제를 해결할 필요가 있다고 생각하지 않습니다. – paisanco

답변

1

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을 읽을 때 때문에()을 입력 할 때마다 사용자에게 입력을 요청합니다.

추신. 당신은이 부분을 다시 초기화 할 필요가없는 : 이미 스캐너를 수입하기 때문에

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를 입력하면 "계산을 수행하려면 먼저 하나 이상의 숫자를 입력해야합니다"라고 표시됩니다. – CuriousCoder97

+0

지금 업데이트 된 코드를 확인하십시오. 어레이에 추가 된 값 수를 유지하는 변수 * 카운트 *가 도입되었습니다. 그런 다음 개수까지 배열을 실행하고 사용자가 입력 한 값의 차이점을 표시합니다. –

+0

훌륭한 작품! 나는 count 변수가 필요 없다고 생각했다. 배열에서 입력 된 숫자 만 표시하는 방법을 알지 못했습니다. 나는 항상 당신이 20 개 모두를 써야한다고 생각했거나 그렇지 않으면 단지 0을 표시 할 것입니다. 이것은 나에게 많은 도움이되었으며 미래에도 분명 도움이 될 것입니다. 고맙습니다! – CuriousCoder97