Java에서 디버그하는 법을 배우는 것
문제
나는 Netbeans에서 JPDA를 사용하는 법을 배우고 프라임 생성자 Sphere의 온라인 판사 문제.
나는 읽고 있었다 NetBeans.org에 대한이 튜토리얼 그는 JPDA에 대해, 그러나 많은 도움을받지 못했습니다.
이 코드는 StarBlue에서 제공 한 Eratostenes 구현의 체를 기반으로합니다. 여기, 다음과 같이 실행 중입니다.
2
1 10
//here the primes between 1 and 10 should print
3 5
//here the primes between 3 and 5 should print
package sphere;
/**
*
* @author Administrator
*/
//import java.util.ArrayList;
import java.util.BitSet;
import java.lang.Math.*;
import java.util.ArrayList;
public class Main
{
public static int ApproximateNthPrime(int nn)
{
double n = (double)nn;
double p;
if (nn >= 7022)
{
p = n * Math.log(n) + n * (Math.log(Math.log(n)) - 0.9385);
}
else if (nn >= 6)
{
p = n * Math.log(n) + n * Math.log(Math.log(n));
}
else if (nn > 0)
{
p = new int[] { 2, 3, 5, 7, 11 }[nn - 1];
}
else
{
p = 0;
}
return (int)p;
}
// Find all primes up to and including the limit
public static BitSet SieveOfEratosthenes(int limit)
{
final BitSet primes = new BitSet();
primes.set(0,false);
primes.set(1,false);
primes.set(2,limit,true);
for (int i =0; i*i<limit;i++)
{
if (primes.get(i))
{
for (int j=i*1; j<limit;j+=1)
{
primes.clear(j);// hace que el indice j sea false (no primo)
}
}
}
return primes;
}
public static ArrayList<Integer> GeneratePrimesSieveOfEratosthenes(int n)
{
int limit = ApproximateNthPrime(n);
BitSet bits = SieveOfEratosthenes(limit);
ArrayList <Integer> primes = new ArrayList<Integer>();
for (int i = 0, found = 0; i < limit && found < n; i++)
{
if (bits.get(i))
{
primes.add(i);
found++;
}
}
return primes;
}
public static void main (String[] args) throws java.lang.Exception
{
java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in));
String s;
s= r.readLine();
int test_cases = Integer.parseInt(s);
int case_counter =0;
while (case_counter<test_cases) {
// System.out.println(s);
s = r.readLine();
String [] splitted = s.split(" ");
int lower_bound = Integer.parseInt(splitted[0]);
int upper_bound = Integer.parseInt(splitted[1]);
ArrayList <Integer> primesList= GeneratePrimesSieveOfEratosthenes(upper_bound);
for (int i =0; i<primesList.size();i++){
if (primesList.get(i)<=lower_bound)System.out.println(primesList.get(i));
}
case_counter++;
System.out.println(" "); // space that separates test cases
}
}
}
ArrayList Primeslist가 초기화되지 않았고이 코드를 의심하고 있습니다. 솔직히 말하면, 나는 그것을 잘 이해하지 못합니다.
if (primes.get(i))
{
for (int j=i*1; j<limit;j+=1)
{
primes.clear(j);
}
}
조건부가있는 조건부 중단 점을 사용하는 것은 다음과 같습니다.
primes.get(j)==false
그러나 나는 이런 식으로 의미있는 정보를 얻을 수 있는지 확실하지 않습니다. 이것들은 내가 얻는 화면입니다.
Alt Text http://img525.imageshack.us/img525/6238/breakpoints.jpg
Alt Text http://img98.imageshack.us/img98/5262/watchesz.jpg
나는 이것으로 유용한 정보를 얻는 방법을 모른다.
내 질문은 다음과 같습니다.
a)이 루프를 통과 할 때 Primes Bitset을보고 싶습니다.
어떻게해야하나요?
비) 이 코드에서 정확히 무엇이 잘못 되었습니까? 디버거를 사용하여 어떻게 발견 했습니까?
단계별 프로세스를 언급하십시오.
해결책
그래서 다음 방법을 추출했습니다.
private static void printPrimes(int lower_bound, int upper_bound) {
ArrayList<Integer> primesList = GeneratePrimesSieveOfEratosthenes(upper_bound);
for (int i = 0; i < primesList.size(); i++) {
if (primesList.get(i) <= lower_bound)
System.out.println(primesList.get(i));
}
}
그리고 main()
콘솔과 디버거를 동시에 엉망으로 만들고 싶지 않았기 때문에 몇 가지 임의의 인수 (10 및 100)와 함께 호출하는 방법. 그런 다음 (Eclipse를 사용하고 있습니다)의 시작 및 끝 줄에 일반 중단 점을 넣습니다. ApproximateNthPrime()
, SieveOfEratosthenes()
그리고 GeneratePrimesSieveOfEratosthenes()
그들이 부름을 받고 있는지 확인하기 위해. (그건 그렇고, C#과 달리 Java Convention은 메소드 이름이 소문자로 시작하는 것입니다.)
코드를 이해하지 못하는 모든 것. :) 그러나 첫 번째 런 스루 후에, 문제는 BitSet
생산 SieveOfEratosthenes()
항상 비어 있습니다 (또는 오히려 항상 전적으로 false
). NetBeans Debugger를 사용하지는 않았지만 "로컬 변수"탭이 여기의 친구라고 생각합니다.
나는 당신을 위해 당신의 숙제를하지 않을 것입니다. :) 그러나 Eratosthenes의 체에 대한 아이디어는 소수를 건너 뛰고 비 프라임 만 제거하는 것입니다. 당신을 검사하십시오 SieveOfEratosthenes()
방법과 스스로에게 물어보십시오 : 언제 숫자를 건너겠습니까?