2017-02-22 1 views
0

나는 자바가 처음이다. 프로젝트에 대해 몇 가지 시도를하고 있지만 이것이 작동하지 않는 이유는 없습니다. 여기에 목표는 공백으로 구분 된 숫자를 입력하고 문자로 끝내는 것입니다. 그런 다음 프로그램은 짝수 및 홀수 색인 번호를 계산하여 합이 더 큰 값을 출력해야합니다.입력이 공백으로 구분되고 문자로 끝나면 숫자의 양을 어떻게 계산합니까?

주어진 숫자가 상수 일 때 이미 성공적으로 만들었지 만 지금은 사용자 입력에 맞게 만들고 싶습니다. 숫자를 배열에 넣고 싶기 때문에이 배열의 길이를 알아야합니다. 이것을 얻으려면 사용자가 넣는 숫자를 계산하여 적절한 길이의 배열을 만들 수 있습니다.

어떤 이유로 while 루프가 종료되지 않고 계속 실행됩니다. 입력 한 금액을 어떻게 계산합니까?

편집

나는) (in.next 추가했습니다; 첫 번째 while 루프에서는 첫 번째 입력 요소에서 멈추지 않습니다. 그러나 이것은 두 개의 while 루프가 동일한 입력을 통해 반복하려고하는 문제를 일으 킵니다. 두 번째 스캐너를 만들고 첫 번째 스캐너를 재설정하려고 시도했지만 첫 번째 요소에서 두 번째 루프가 시작되지 않습니다. 이전 답변은 이것이 가능하지 않다는 것을 보여줍니다. 배열을 사용하여 값을 저장하는 동안 루프에 넣는 방법이 있습니까?

P. 입력 값은 양 또는 음의 정수 여야합니다. 여기

내 전체 코드입니다 :

import java.util.Scanner; 

public class LargerArraySum { 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int length = 0; 
    System.out.println("Enter your numbers seperated by spaces, end with a letter"); 

    while(in.hasNextInt()) { 
     length++; 
     in.next(); 
    } 
    System.out.println(length); 

    int arra[] = new int[length]; 

    while(in.hasNextInt()) { 
     for(int i=0;i<length;i++) { 
      int x = in.nextInt(); 
      arra[i] = x; 
     } 
    } 
    int evenSum = EvenArraySum(arra); 
    int oddSum = OddArraySum(arra); 

    if(evenSum<oddSum) { 
     System.out.println("The sum of the odd indexed elements is bigger"); 
    } else if(oddSum<evenSum) { 
     System.out.println("The sum of the even indexed elements is bigger"); 
    } else { 
     System.out.println("The sum of the odd and even indexed elements is equal"); 
    } 

} 
public static int EvenArraySum(int[] a) { 
    int sum = 0; 
    for(int i=1;i<a.length;i+=2) { 
     sum += a[i]; 
    } 
    System.out.println("The sum of the even indexed elements is: " + sum); 
    return sum; 
} 
public static int OddArraySum(int[] a) { 
    int sum = 0; 
    for(int i=0;i<a.length;i+=2) { 
     sum += a[i]; 
    } 
    System.out.println("The sum of the odd indexed elements is: " + sum); 
    return sum; 
} 
} 
+0

어떤 while 루프가 계속 실행됩니까? 2가 있습니다. – Eabryt

+1

while 루프는 끝나지 않습니다. 다음 int를 사용하지 않기 때문에 항상 동일한 수를 확인합니다. 나는 당신의 케이스 대신 ArrayList를 사용하여 길이가 고정 된 배열을 사용할 것을 제안한다. – IQV

+0

길이를 올리는 곳 – Fiosaurus

답변

0

추가 in.next(); 루프. 사실 배열을 필요로하지 않습니다. 짝수 및 홀수 색인 번호를 저장하지 않고 읽을 수 있습니다.

+0

하지만 그는 다른 계산을 한 것처럼 숫자를 유지하려고합니다. EvenArraySum과 OddArraySum을 살펴보십시오. 따라서'in.next()'는 그의 문제를 해결하지 못합니다. – IQV

+0

그는 두 가지 방법 모두에서 입력 색인을 확인하고 홀수와 짝수의 합을 만듭니다. 그는 첫 번째 while 루프 (콘크리트 입력 번호를 저장하지 않고)에서이 모든 것을 함께 수행 할 수 있습니다. – SWoeste

0

1) 반복자가 항상 동일한 위치에서 추가 숫자를 확인하기 때문에 첫 번째 while 루프가 작동하지 않습니다.

예 :

Position  0 1 2 3 4 5 
Value  1 3 5 7 9 0 

에서 당신이 위치 1을 사용할 수있는 경우가이 경우에 해당 할 것입니다, 확인합니다 hasNextInt()를 호출 할 경우 0의 위치를 ​​반복자 포인트를 시작합니다. 이 순간에 인터레이터는 여전히 위치 0을 가리 킵니다. 따라서 length을 다시 증가시키고 똑같은 일을 반복하면 무한 루프가 생깁니다.

이터레이터를 다음 위치로 이동하려면 nextInt()으로 전화해야합니다.

2) 같은 방법으로 두 번째 while 루프를 사용하여 동일한 Scanner을 반복 할 수 없습니다. while 루프를 먼저 수정하면 이터레이터는 위치 5 (스캐너의 끝까지 도달 함)를 가리 킵니다. 따라서 hasNextInt()에 대한 검사는 false가되고 두 ​​번째 while 루프는 입력되지 않습니다.

3) 의견은 이미과 같이이 사용 사례에 대한 ArrayList을 사용할 수 있습니다, 그것을 언급 :

final ArrayList<Integer> input = new ArrayList<>(); 
    while (in.hasNextInt()) { 
     input.add(in.nextInt()); 
    } 
    System.out.println(input.size()); 

(또는 그의 대답에 언급 kitxuli, 그냥 그들을 계산, 심지어 값을 저장 해달라고 같은 첫 번째 while-loop)

+0

답장을 보내 주셔서 감사합니다. nextInt는 작동했지만 두 번째 지점으로 안내했습니다. 스캐너를 첫 번째 위치에서 시작하는 방법이 있습니까? 다시 설정하거나 새 스캐너를 만들려고했지만 작동하지 않았습니다. 나는 아직 ArrayLists로 일한 적이 없으며, 먼저 이것을 저장하기 위해 배열을 사용하여 해결할 수 있는지 알고 싶다.하지만 ArrayLists는 논리적으로 다음 단계 인 것처럼 보인다. – Fiosaurus

+0

당시 스캐너는 위치 0에서 시작하도록 재설정 할 수 있는지 여부는 확실하지 않았습니다. 이제 나는 당신에게 말할 수 있습니다, 그것은 불가능합니다. 새 스캐너를 만들면 사용자가 값을 다시 입력해야합니다. 나에게 해결책이 아닌 것 같습니다.) – SWoeste

+0

그래서 같은 날짜에 두 개의 while 루프를 사용하면 기간이 작동하지 않습니다? 빈 문자열을 사용하는 Omar의 솔루션을 사용해 보았습니다.하지만 한 자리 양수를 사용할 때만 유용합니다. 배열을 사용하여 숫자를 저장하는 동안 루프에 넣을 방법이 없습니까? – Fiosaurus

0

코드에 2 가지 주요 문제점이 있습니다. 첫 번째 및 두 번째 while 루프는 첫 번째 루프를 살펴볼 수 있습니다.

while(in.hasNextInt()) { 
    length++; 
} 

당신의 상태 in.hasNextInt() 어떤 변수가 in.nextInt로 초기화되지 않았기 때문에 당신이 입력을 삽입했다뿐만 아니라 반환하거나 [참] 또는 [거짓]를만큼 진정한는 삽입 메시지를 표시하지 않고 길이 변수에 추가합니다 [새로운 입력] .so 코드는 다음과 같이 보일 것입니다.

Int length = 0; 
int k ; 
    while(in.hasNextInt()) { 
     length++ ; 
     k = in.nextInt(); 
    } 

당신이 다음에 추가 한 후 K에 입력을 촉진 할 수있는 사용자에게 메시지를 전 대한 초기화 변수 k에 입력을 삽입 [길이] 다음 루프가 입력을 사용자에게 메시지를 표시하지 않고 당신의 상태를 확인합니다.

두 번째 while 루프를 살펴 봅니다. 나는 그것이 c를 호출 in.NextInt()에서

while(in.hasNextInt()) { 
    for(int i=0;i<length;i++) { 
     int x = in.nextInt(); 
     arra[i] = x; 
    } 
} 

당신은이 예에서 새로운 스캐너를 선언해야 .However 당신이 INT의 x.Not도 while 루프를 필요가 없습니다 다시 한번 새로운 입력을 입력하도록 사용자에게 메시지를 표시하고 있습니다 코드는 이렇게 보일 것입니다. 당신은 int 배열에 알파벳을받을 경우 예외 오류 국지적 인 배열이 [i]를 사용자에게 메시지를 표시하지 않을 수 있기 때문에

int [] a = new int [length]; 
Scanner c = new Scanner (System.in); 
for(int i=0;i<length;i++) { 
if (c.hasNextInt()){ 
a[i] = c.nextInt();   
} else 
break; 
    } 

당신은 if 문을 추가해야합니다.

물론 사용자가 값을 두 번 입력하도록하는 것은 실용적이지 않으므로 ArrayList 클래스를 사용하지 않고 구현하는 더 좋은 코드는 빈 문자열을 사용하는 것이 좋습니다.

새로운 코드는 : -

String g = ""; 
String j =""; 
int y ; 
int q=0; 
int w = 0; 
while (in.hasNextInt()) 
    { 
    y = in.nextInt(); 
    g =g+y+","; 
    q++; 

} 
int arra [] = new int [q]; 

    for(int r =0;r<g.length();r++) { 

     if(g.charAt(r)==(',')){ 
      arra[w]=Integer.parseInt(j); 
      System.out.println(arra[w]); 
      w++; 
      j=""; 
     }else{ 
    j=j+g.charAt(r); 
     } 

} 

또 다른 더 나은 코드 : - 당신은 그냥 편지 쓰기없이 공백으로 구분하여 숫자를 삽입 Enter 키를 누르와 배열이 채워집니다.

Scanner in = new Scanner (System.in); 
String g = ""; 
String j =""; 
int y ; 
int q=0; 
int i=0; 
int w = 0; 

System.out.println("inset your input separated by spaces"); 
    g = in.nextLine(); 

while(i<g.length()){ 
    if((g.charAt(i))==(' ')){ 
    q++; 
} 
i++; 
} 
int a [] = new int [q+1]; 

    for(int r =0;r<g.length();r++) { 

     if(g.charAt(r)==(' ')){ 
      a[w]=Integer.parseInt(j); 
      System.out.println(a[w]); 
     w++; 
      j=""; 
     }else{ 
    j=j+g.charAt(r); 
     } 


    } 
    a[w]=Integer.parseInt(j); 
System.out.println(a[w]); 
+0

답변 해 주셔서 감사합니다. 사용자가 숫자를 두 번 입력하도록하지 않으려는 것이 맞습니다. 그래서 나는 마지막으로 코드 부분에 관심이 있습니다. 이것은 단 한자리 숫자 만 입력하면 작동하지만, 21 또는 -4와 같은 숫자를 입력하면 문자열에서 배열로 변환하면 원하는 결과가 나오지 않습니다. – Fiosaurus

+0

당신은 내 코드가 현실적이지 않은 것이 맞습니다. 대신 당신을 위해 더 좋은 코드를 만들었습니다. 값을 삽입 한 후 문자를 삽입하면 배열이 인쇄됩니다. 쉼표 [ ',']가 입력 문자열 [g]에 추가됩니다. 배열 길이는 숫자를 삽입 한 인스턴스의 양과 같습니다. for 루프에서 쉼표로 끝나고 첫 번째 셀을 채 웁니다. 다른 빈 문자열 j 등을 통해 귀하의 배열. –

관련 문제