2016-10-22 3 views
0

Java Java 교과서의 질문 중 하나는 "사용자가 유효한 값을 입력하지 않고 즉시 센티넬 값을 처리 할 때 런타임 오류를 방지하는 Average 프로그램의 새 버전을 만듭니다 (목록 3.6)." 3.6 목록자바에서 센티널 값을 올바른 값으로 만드는 방법은 무엇입니까?

은 다음과 같습니다 :

import java.text.DecimalFormat; 
import java.util.Scanner; 

public class Average 
{ 
public static void main (String[] args) 
{ 
    Scanner scan = new Scanner (System.in); 
    int sum = 0, value, count = 0; 
    double average; 

    System.out.println ("Enter an integer (0 to quit): "); 
    value = scan.nextInt(); 


    while (value != 0) // sentinel value of 0 to terminate the loop 
    { 
     count++; 
     sum += value; 
     System.out.println ("The sum far is " + sum); 

     System.out.print ("Enter an integer (0 to quit): "); 
     value = scan.nextInt(); 
    } 

    System.out.println(); 
    System.out.println ("Number of values entered: " + count); 

    average = (double)sum/count; 

    DecimalFormat fmt = new DecimalFormat ("0.###"); 

System.out.println ("The average is " + fmt.format(average)); 


} 
} 

내가 어떤 질문을 요구하고있다 것은 0의 감시 값이 계산 될 수 있도록하는 것입니다 생각합니다. 센티넬 값을 입력 할 때 Listing 3.6의 결과를 보자.

출력 :

Enter an integer (0 to quit): 
0 

Number of values entered: 0 
The average is � 

는 또한, 내가 대신이 Number of values entered: 0 말에, 나는 Number of values entered: 1 말을 생각 생각 생각합니다. 질문에서 무엇을 묻고 있는지 알고 있다고 생각되면 알려주십시오. 대단히 감사드립니다.

+0

첫 번째 입력이 0이면 코드가 예외를 throw하지 않기 때문에 Yor 작업과 모순됩니다. 그러나 줄 _ "average = (double) sum/count;"_ was _ "average = sum/count ; "_. 그래서 나는 그 일이 잘못되었거나 이미 해결책을 가지고 있다고 제안한다. 그러나 당신이이 임무를 준 사람에게 질문하는 것이 항상 낫습니다. – Bogdan

답변

1

count이 0이 아닌지 확인하려면 가드가 필요합니다.

average = (double)sum/(count == 0 ? 1 : count); 
2

사용자의 입력을 확인한 후에야 count가 증가하기 때문에 오류가 발생합니다. 첫 번째 숫자가 0 일 때 while 루프는 입력되지 않고 결국 0으로 나뉩니다. 문제는 코드를 수정하여 0으로 나누는 것을 피하고 예외가 발생하지 않도록하는 것입니다.