2014-10-14 7 views
0

내 작업은 얼마나 많은 숫자가 입력 될지를 먼저 묻는 자바 프로그램을 작성한 다음 입력 된 홀수와 짝수가 몇 개인 지 출력합니다. int 값은 0-100으로 제한됩니다. 내 질문은 : 코드에서 무엇이 누락 되었습니까?자바 프로그램 짝수/홀수 출력

import java.util.Scanner; 

public class Clancy_Lab_06_03 { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     int n; 
     System.out.println("How many numbers will be entered?"); 
     n = input.nextInt(); 
     while (n < 0 || n > 100) { 
      System.out.println("ERROR! Valid range 0-100. RE-Enter:"); 
      n = input.nextInt(); 
      n++; 
     } 
     int odd = 0; 
     int even = 0; 
     while (n >= 0 || n <= 100) { 
      n = input.nextInt(); 
      if (n % 2 == 0) { 
       even++; 
      } else { 
       odd++; 
      } 

     } 
     System.out.println(even + "even" + odd + "odd"); 
    } 
} 
+0

어떤 행동을 보이고 있습니까? 또한, 프로그램을 독립적으로 테스트 할 수있는 작은 덩어리 (예 : 입력을위한 프로그램, 출력을 생성하는 프로그램)로 나누는 것이 도움이 될 수 있습니다. –

+0

당신이 기대하고있는 것은/일어나지 않았습니까? 언뜻보기에 코드가 현명한 것으로 보입니다. –

+0

귀하의 설명에서, 당신은 단지 숫자의 특정 금액을 받아 들여야하지만, while 루프는 입력이 유효한 한 계속 유지하는 것 같습니다 ... –

답변

2

두 번째 while 루프는 무한합니다. 이 같은 뭔가를 Relplace :

for (int i = 0; i < n; i++) { 
    int b = input.nextInt(); 
    if (b % 2 == 0) { 
     even++; 
    } else { 
     odd++; 
    } 
} 

또한 내가 왜 당신이 먼저 루프에서 n를 증가하는 이해가 안 돼요. 예를 들어, 먼저 -5을 줄 때 번호를 다시 입력하라는 메시지가 표시됩니다. 그런 다음 -1을 입력했는데 실제로 증가하는 프로그램 프로세스는 0이고 실제로 사용자는 -1입니다. 제 의견으로는 그것이 작동하는 방법이 아니며 단지 이것을 제거해야합니다. n++. 당신이 의견에 질문으로

- 같은 사용 while 루프 :

while(n > 0) { 
    n--; 
    int b = input.nextInt(); 
    if (b % 2 == 0) { 
     even++; 
    } else { 
     odd++; 
    } 
} 

또한 더 이상 (main 메소드의 끝에서, 예를 들어)를 필요로하지 않을 때

input을 닫습니다 것이 좋습니다
input.close(); 
+0

그냥 호기심이 무엇입니까, while 루프는 for 루프와 동일합니까? – user3462263

+0

제 편집을보고, while while 루프 예제를 추가했습니다. –

0

두 가지 문제가있었습니다. 먼저 사용자가 올바른 번호를 입력하기를 기다리지 않고 첫 번째 루프에서 n을 증가 시켰습니다.

두 번째 루프에서는 사용자가 만든 번호와 만든 번호를 비교하지 않았습니다. 이전 번호를 새 번호로 덮어 썼습니다.

이 컴퓨터에는 java가 없으므로 테스트하지는 않았지만이 버전이 작동해야합니다.

우리는 이제 두 입력을 모두 기다렸다가 "입력 할 숫자의 수"(n)와 "다음에 입력 할 숫자 (num)"변수에 다른 변수 이름을 사용한다는 것에 유의하십시오. 새로운 변수 i와 함께 사용자가 입력 한 숫자를 추적합니다.

import java.util.Scanner; 
public class Clancy_Lab_06_03 
{ 
    public static void main (String[] args) 
    { 
     Scanner input = new Scanner (System.in); 
     int n; 
     System.out.println ("How many numbers will be entered?"); 
     n = input.nextInt(); 

     //Wait for a valid input 
     while (n < 0 || n > 100) 
     { 
      System.out.println ("ERROR! Valid range 0-100. RE-Enter:"); 
      n = input.nextInt();   
     } 

     //Setup variables for the loop 
     int odd = 0; 
     int even = 0; 
     int num; 

     //Keep counting up until we hit n (where n is the number of entries the user just said they want to make) 
     for(int i = 0; i < n; i++) 
     { 
      //Changed this, because you were over-writing n (remember, n is the number of entries the user wants to make) 
      //Get a new input   
      while (num < 0 || num > 100) 
      { 
       System.out.println ("ERROR! Valid range 0-100. RE-Enter:"); 
       num = input.nextInt();  
      } 

      //Check whether the user's input is even or odd 
      if (num % 2 == 0) 
      { 
       even++; 
      } 
      else 
      { 
       odd++; 
      } 
     } 
    System.out.println(even + " even. " + odd + " odd."); 
    } 
} 
0

귀하의 요구 사항을 명확히 구분 해주십시오. 을 분석 할

입력됩니다 얼마나 많은 숫자
  1. ()
  2. : 귀하의 게시물에서, 당신은 당신이 두 가지 데이터 항목에 대해 사용자에게 메시지를 표시해야 할 표시

    배우는 중 특히 변수에 대해 의미있는 이름을 사용하는 것이 좋습니다. 변수 이름에 'n'을 사용하고 실행 중에 다른 용도로 다시 사용합니다. 여러분에게 프로그램의 특정 부분에서 'n'이 무엇인지 알아내는 것이 어렵다는 것이 분명합니다.

    Scanner input = new Scanner (System.in); 
        int count; 
        System.out.println ("How many numbers will be entered?"); 
        count = input.nextInt(); 
    
        //Wait for a valid input 
        while (count < 1 || count > 100) 
        { 
         System.out.println ("ERROR! Valid range 1-100. RE-Enter:"); 
         count = input.nextInt();   
        } 
    

    또한 IMHO는 0이 아니어야합니다. 0 값을 평가하는 프로그램을 실행하는 것은 의미가 없습니다 (아무것도 수행하지 않는 프로그램을 방해하지 마십시오). 가장 낮은 숫자가 하나가되어야한다고 생각합니다.

    int odd = 0; 
        int even = 0; 
        int value; 
    
        do 
        { 
         System.out.print("Enter a number between 0 and 100: "); 
         value = input.nextInt(); 
         while (value < 0 || value > 100) 
         { 
          System.out.println ("ERROR! Valid range 0-100. RE-Enter:"); 
          value = input.nextInt();  
         } 
    
         if (value % 2 == 0) 
         { 
          even++; 
         } 
         else 
         { 
          odd++; 
         } 
    
        count--; // decrement count to escape loop 
        } while (count > 0); 
        System.out.println(even + " even. " + odd + " odd."); 
    

    이 예제에서는 do/while 루프를 사용합니다.이 경우 루프를 적어도 한 번 입력하면되므로 괜찮습니다. 이는 사용자가 프로그램의 첫 번째 부분에서 유효하지 않은 반복 횟수를 입력 할 수 없기 때문입니다. 루프 제어 (예 : 'i')를위한 다른 변수를 만드는 대신 루프에 대한 직접 count 변수를 사용합니다 (값을 0으로 감소 시킴).

    주제와 약간 다른 점은 요구 사항이 명확하지 않다는 것입니다. 값이 0에서 100 사이의 값으로 제한된다는 것을 나타 냈습니다. 그러나 평가를 반복해야하는 횟수는 명확하지 않았습니다. 대부분의 사람들은 100이 카운터 변수의 상한이라고 가정합니다. 요구 사항이 명확하지 않기 때문에 카운트가 1보다 크거나 같은 값을 검사하는 것은 유효 할 수도 있지만 매우 어려울 지 모르지만 (실제로는 백만 번 반복하지 않아도됩니다.)

    마지막으로 코드의 AND 및 OR 논리에주의해야합니다. 표시된대로 두 번째 while 루프 :

    while (n >= 0 || n <= 100) {} 
    

    무한합니다. OR 평가는 하나의 부분 만 TRUE로 평가해야하기 때문에 입력 된 모든 숫자는 루프를 계속 허용합니다. 분명히 의도는 100보다 큰 값을 허용하지 않았습니다. 그러나 150을 입력하면 150> = 0이기 때문에 루프가 계속됩니다. -90 < = 100이기 때문에 -90도 루프를 계속 허용합니다. 이것은 의사 코드가 너는 배우고있다. "lower_limit와 upper_limit 사이의 VALUE"를 표현하려고했습니다. 한계를 벗어나는 값을 평가하기 위해 로직을 역으로 수행하면 "lower_limit 이하 또는 upper_limit 위의 값"이라고 말할 수 있습니다. 이 의사 코드 표현식은 필요한 논리 연산자를 판별하는 데 매우 유용합니다.

    또한 자유를 가져 와서 사용자에게 가치를 묻는 메시지를 추가했습니다. 프로그램은 사용자가 두 개의 숫자 (개수 및 값)를 입력 할 것을 기대하지만 단 하나의 프롬프트 메시지 만 제공됩니다. 그들이 범위를 벗어난 값을 입력하지 않는 한.