2015-12-08 99 views
0

所以几句话我做扩展RandomGenerator一类随机回馈PRIME,2的幂(2,4,8,16,32,64,128等),菲波纳奇和一些平方数(1 ,4,9,16,25,36等)。然后,我做了一个简单的程序来调用我的班级,并在用户定义空间(1,n)时给出随机数字。这两个程序编译得很好。我的问题是,当我运行程序时,它总是为每个值返回0。我是新来的Java。谁能帮我?Java中,构造函数不工作

import acm.util.*; 


public class RandomGeneratorImproved2 extends RandomGenerator 
{ 

private int i,j,a,c,d,e,temp,n,Pnumber,Fnumber,number2,numbersq; 

private long b; 

boolean flag,flag2,flag3,flag4,flag5; 

private double temp1; 


public RandomGeneratorImproved2 (int n) 
{ 
    this.n = n; 
} 

public void nextPrime(int n) // PRIME NUMBERS 
{ 
     Pnumber = rgen.nextInt(1, n); 
     i=2; 
     flag2 = false; 
     if (Pnumber == 1) // Check for value 1 cause it cannot check it inside the loop 
     { 
      flag2=true; 
     } 
     while ((i<n) && (flag2 == false)) 
     { 
      flag = true; 
      j=2; 
      do 
      { 
       a = i%j; 
       if ((a == 0) && (i != j)) 
       { 
        flag = false; 
       } 
       if (i!=j-1) 
       { 
        j = j+1; 
       } 

      } while (j<i); 
       if ((flag == true) && (Pnumber==i)) // 
       { 
        flag2 = true; 
       } 
       if ((i==99) && (flag2==false)) // restart if the number is not prime 
       { 
        i = 1; 
        Pnumber = rgen.nextInt(1, n); 
       } 
       i = i + 1; 
     } 
} 

public int getPrime() //POWER OF 2 NUMBERS 
{ 
    return Pnumber; 
} 

public void nextPowerof2(int n) 
{ 
     number2 = rgen.nextInt(1, n); 
     i=1; 
     b=2; 
     flag3 = false;  
     while (i<n) // n <= 31 
     { 
      if (number2 == b) 
       { 
        flag3 = true; 
       } 
      b = 2*b; 
      if ((i == n-1) && (flag3==false)) 
      { 
       i=1; 
       number2 = rgen.nextInt(1,n); 
       b=2; 
      } 
      i=i+1; 
     } 
} 

public int getPowerof2() 
{ 
    return number2; 
} 

public void nextFibonacciNumber(int n) // FIBONACCI NUMBERS 
{ 
    Fnumber = rgen.nextInt(1, n); 
    c=0; 
    d=1; 
    flag4 = false; 
    i=1; 
     while (i<n && flag4==false) 
     { 
      temp = d; 
      d = d + c; 
      c = temp; 
      i=i+1; 
      if (Fnumber == d) 
      { 
       flag4 = true; 
      } 
      if ((flag4 == false) && (i==n)) 
      { 
       i=1; 
       c=0; 
       d=1; 
       Fnumber = rgen.nextInt(1, n); 
      } 
     } 
} 

public int getFibonacciNumber() 
{ 
    return Fnumber; 
} 

public void setSquareNumber(int n) // SQUARE NUMBERS 
{ 
    numbersq = rgen.nextInt(1, n); 
    flag5 = false; 
    i=1; 
    temp1 = Math.sqrt(n); 
    while (i<temp1 && flag5 == false) 
     { 
      e = i*i; 
      i = i + 1; 
      if (numbersq == e) 
      { 
       flag5 = true; 
      } 
      if (i == 20 && flag5 == false) 
      { 
       i=1; 
       numbersq = rgen.nextInt(1, n); 
      } 
     } 
} 

public int getSquareNumber() 
{ 
    return numbersq; 
} 

public String toString() 
{ 
    return "Your Prime number is : " + Pnumber + "\nYour Power of 2 number is : " + number2 + "\nYour Fibonacci number is : " + Fnumber + "\nYour square number is : " + numbersq; 
} 
    private RandomGenerator rgen = RandomGenerator.getInstance(); 

}

import acm.program.*; 

public class caller2 extends Program 
{ 
    public void run() 
    { 
     int n = readInt("Please give me an integer to define the space that i'll look for numbers : "); 
     RandomGeneratorImproved2 r1 = new RandomGeneratorImproved2(n); 
     println(r1); 
    } 
} 
+1

你永远不会调用任何应该初始化你的字段的方法。 – resueman

+0

但我打电话给全班同学。难道它不应该让我回到这些价值吗? – GiannisMil

+0

当您创建对象时,它会调用构造函数。当你打印它时,它会调用'toString()'。除非你显式调用其他方法,他们将不会被调用。 – resueman

回答

0

如前所述你只定义了这些方法。你永远不会调用任何设置这些值的方法,因此所有的方法仍然处于初始化状态。尝试在设置n之后将以下内容添加到构造函数中;

nextPrime(n); 
nextFibonaccitNumber(n); 
nextPowerof2(n);