2016-10-26 1 views
1

Ich habe einen Standard und einen Konstruktor parametrisiert deklariert. Mit einem einzigen Objekt rufe ich sowohl den Konstruktor als auch eine Funktion auf. Wenn ich das Programm ausführe, bekomme ich die Ausgabe als 0, anstatt die Fakultät zu bekommen. Ich initialisieren haben f = 1 noch der Ausgang ist 0.Ich möchte das factorial einer Zahl mit einem Standard-Konstruktor und parametrisieren finden. Ausgabe als 0

class Factorial 
{ 
    int num, f; 

    Factorial() 
    { 
     f = 1; 
    } 

    Factorial(int n) 
    { 
     num = n; 
    } 

    public int getFactorial() 
    { 
     for(int i = 1; i <= num; i++) 
     { 
      f = f * i; 
     } 
     System.out.println("Factorial= " + f); 
     return f; 
    } 

    public static void main(int m) 
    {  
     Factorial obj = new Factorial(); 
     obj = new Factorial(m); 
     obj.getFactorial(); 
    } 
} 
+0

Hinweis: Klassennamen in Java starten UpperCase. Und kürzen Sie Variablennamen nicht ab. Stattdessen: Verwenden Sie Namen, die etwas über die Sache hinter dem Namen erzählen! – GhostCat

Antwort

3

Dies liegt daran, der Anfangswert von f Null bleibt, wenn die Klasse mit dem factorial(int n) Konstruktor initialisiert wird.

Set f-1 im initializer dieses Problem zu beheben:

int n, f = 1; 

Factorial() { 
} 

Factorial(int n) { 
    num = n; 
} 

Diese Klasse mit einem großen Problem lässt: getfactorial mehrfach Aufruf wird den Zustand der Klasse ändern, um den Wert der Fakultäts Erhöhung . Sie können dies beheben, indem Sie eine boolean Variable erstellen, die angibt, ob die Fakultät berechnet wurde oder nicht, und f nach der Berechnung zurückgibt.

Wenn Sie keine "faule" Berechnung benötigen, machen Sie f eine lokale Variable in der Methode.

+1

Nun ... noch besser: Machen Sie 'f' eine Methode lokale Variable! – Seelenvirtuose

+0

@Seelenvirtuose Das Problem mit diesem Ansatz ist, dass die Fakultät jedes Mal neu berechnet wird, wenn "getfactorial" aufgerufen wird, was die Klasse nahezu sinnlos macht. Derzeitiges Design hingegen erlaubt es OP, faktisch faktoriell zu trainieren. – dasblinkenlight

+0

@Seelenvirtuose Ich habe die Antwort bearbeitet, bevor ich meinen vorherigen Kommentar gepostet habe, um diesen Punkt zu erklären. – dasblinkenlight

0

Als eine gute Praxis sollte eine Variable den minimal möglichen Bereich haben (bevorzugt lokal, dann Instanz). Oder mit anderen Worten: Zustandsvariablen sollten nur verwendet werden, wenn Sie ein Datum zwischen mehreren Methoden derselben Klasse teilen wollen. Aber was in deinem Fall? Faktorisch ist eine Operation, die in nur einem Schritt aus einem einzigen Parameter berechnet werden kann: Keine weitere Verarbeitung erforderlich.

Also, ich empfehle Ihnen, Ihre Klasse refactorize zu:

  1. Rückgabeort die Zustandsvariablen: Wandeln sie auf lokale Variablen oder Parameter der Methode.
  2. Legen Sie die faktorielle Methode als statisch fest (genau, weil sie keine Zustandsvariablen benötigt).
  3. Ein weiteres kleines Detail: Parameter werden von der Befehlszeile an die main Methode über ein Array von Strings weitergegeben - immer.
  4. Belassen Sie alle Eingaben und Ausgaben vom Benutzer in einer einzigen Methode, vorzugsweise main.

So wird es so bleiben:

class Factorial 
{ 
    public static int getFactorial(int num) 
    { 
     int f=1; 
     for (int i = 1; i <= num; i++) 
     { 
      f = f * i; 
     } 
     return f; 
    } 

    public static void main(String[] args) 
    {  
     int m=Integer.parseInt(args[0]); 
     int factorial=Factorial.getFactorial(m); 
     System.out.printf("factorial of %d is %d\n", m, factorial); 
    } 
} 

Vielen simplier, ist es nicht?

Verwandte Themen