Fakultät, warum Endlosschleife?

Wang

Bekanntes Mitglied
Hallo! 🙂

Ich habe folgendes Beispiel aus der Vorlesung vergebens versucht zum Laufen zu bringen:

Java:
public static int fakultaet02 (int n)
{
    int erg = 1;
    while (n > 0)
    {
        erg = erg * n;
        n--;
    }
    return erg;
}


So sieht das bei mir aus:

Java:
public class Fakultaet
{
   public static int fakultaet02 (int n)
   {
      int erg = 1;
      while (n > 0);
      {
         erg = erg * n;
         n--;
      }
      return erg;
    }

   public static void main (String[] args)
   {
      Fakultaet fak = new Fakultaet();
      int n = 10;
      System.out.println ("Ergebnis: " + fak.fakultaet02(n));
   }
}

Das Problem:
Das Programm verfängt sich anscheinend in einer Endlosschleife und ich finde den Grund nicht.
Kann mir bitte jemand sagen, woran das liegt?

Vielen Dank.
 
Lass das ; hinter dem while weg.
Das ; ist sozusagen ein leerer Block, und der wird durch die while-Schleife unendlich oft wiederholt. Das n verändert sich nicht, da der Programmfluss nie über Zeile 6 hinauskommt. Das Abbruchkriterium wird nie erfüllt -> Endlosschleife.
 
Vielen Dank soweit.

Als kleine Übung für mich persönlich, um das Programmieren mit Java besser zu lernen, möchte ich das Programm so erweitern, dass ich es über die Kommandozeile starte und dann die Fakultät einer beliebigen Zahl ausrechnen lasse, die ich in die Kommandozeile eingebe.

Bisher haben wir nämlich immer die zu berechnenden Zahlen im Quellcode festgelegt.

Wie wäre der obige Gedanke umzusetzen?

Vielen Dank für Euren starken Support soweit! :toll:

Gruß
Wang
 
Klar geht das. Am einfachsten ist es, wenn du die zu berechnende Zahl dem Programm gleich als Parameter übergibst. Der Befehl würde dann lauten: [c]java MyFakultaet 12[/c] um 12! zu berechnen.
Im Programm kannst hast du das übergebene Argument dann im String Array args[], das du ja im Methodenkopf der Main definierst. Einen String kannst du mit Integer.parseInt in einen int verwandeln.

Wenn du die Zahlen im Nachinein eingeben willst, musst du mit System.in arbeiten. Gibt dazu viele Tutorials, einfach mal googeln.
 
Danke.
Ich will die Zahlen im Nachhinein eingeben. Aus den Tutorials werde ich nicht wirklich schlau...
Aber ich habe soviel erfahren, dass ich das Package java.io benötige.

Nur:
Wir haben noch nie mit Packages und ihren Klassen gearbeitet, deshalb habe ich keinen blassen Schimmer, wie ich vorgehen soll. ???:L

Ich bin für jeden Tipp sehr dankbar. 😉
 
Strings einlesen kannst du so:
Java:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
	System.out.print("Bitte eine Zahl eingeben: ");
	String input = in.readLine();
	int number = Integer.parseInt(input);
	
	System.out.println("Zahl: "+number);
} catch (Exception e) {
	e.printStackTrace();
}

Importieren musst du dazu:
Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
Hallo,

Du kannst es aber auch mit Hilfe vom Scanner einlesen. So hab ich dasgelernt auf der Uni. Ich denk das ist die etwsa leichtere Variante. Sry wenn das mit dem leichter ned stimmt bin noch ein Anfänger, aber ich kanns halt mit dem Scanner 🙂

Link zur API - Scanner
Scanner (Java Platform SE 6)

mfg,
R4xx4r
 
Danke für Eure Hilfe.
Ich muss ehrlich sagen, dass mir das im Moment noch alles zu hoch ist und ich nicht weiß, wie ich das mit meinem Fakultäts-Programm sinnvoll verknüpfen kann. 😳

Vielleicht ist es doch besser, wenn ich warte, bis wir das Thema Packages in der Vorlesung durchnehmen...
 
Die import-Anweisungen gehören nach ganz oben. Dann kannst du meinen Code an den Anfang deiner main-Methode stellen.

Vielen Dank, javimka.

Ich muss sagen, dass ich meinen Gedanken niemals hätte alleine umsetzen können. :-(

Deshalb die Frage, wie schaffe ich es, Klassen aus Packages sinnvoll zu nutzen?

Mir kommt das im Moment unendlich groß und unübersichtlich vor...

EDIT:
Leider wird nur die Fakultät von 10 berechnet, egal welche Zahl ich eingebe. Woran liegt das?

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Fakultaet
{
   public static int fakultaet02 (int n)
   {
      int erg = 1;
      while (n > 0)
      {
         erg = erg * n;
         n--;
      }
      return erg;
    }

   public static void main (String[] args)
   {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      try {
         System.out.print("Bitte eine Zahl eingeben: ");
         String input = in.readLine();
         int number = Integer.parseInt(input);
    
         System.out.println("Zahl: "+number);
      } catch (Exception e) {
         e.printStackTrace();
      }
      Fakultaet fak = new Fakultaet();
      int n = 10;
      System.out.println ("Ergebnis: " + fak.fakultaet02(n));
   }
}
 
Zuletzt bearbeitet:
Das liegt an deiner Zeile 30:[c]int n = 10;[/c] 😀

Schau mal, in meinem Code, wird ein int number verwendet. In dieser Variable number, ist die eingegebene Zahl gespeichert. Du willst natürlich die Fakultät von dieser Zahl wissen. Jetzt ist es aber so, dass number nur innerhalb der try-catch Anweisung sichtbar ist. Deswegen ist es am einfachsten, wenn du deinen Code (Zeile 29 und 31) einfach auf die Zeile hinter [c]int number = ...;[/c] verschiebst.
Java:
   public static void main (String[] args)
   {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      try {
         System.out.print("Bitte eine Zahl eingeben: ");
         String input = in.readLine();
         int number = Integer.parseInt(input);

         Fakultaet fak = new Fakultaet();
         System.out.println ("Ergebnis: " + fak.fakultaet02(number));
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

Mach dir nicht zu viele Sorgen wegen den Packages. Es gibt nicht so viele, die du oft benötigst. java.io und java.util wirst du wahrscheinlich öfters verwenden. Wenn du mit GUIs arbeitest auch noch java.awt und javax.swing.
Tipp: Wenn du viele Klassen aus einem Packet, z.B. java.io brauchst, kannst du auch schreiben [c]import java.io.*;[/c] um alle Klassen in java.io zu importieren.
Achtung: Wenn du z.B. java.awt.* importierst, hast du nicht auch automatisch java.awt.event.* importiert. Die musst du dann doch noch separat angeben.
 
Vielen Dank, javimka, jetzt funktioniert natürlich alles. :toll:

Ist es eigentlich normal, dass ich, nachdem ich die Fakultät einer Zahl ausgerechnet habe, das Programm über den Befehl
Code:
java Fakultaet
erneut starten muss, um die Fakultät einer weiteren Zahl zu berechnen?

Gruß
Wang
 
Irgendwann, wirst du das selber einprogrammieren können 😉
Java:
   public static void main (String[] args)
   {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      try {
         while(true) {
         System.out.print("Bitte eine Zahl eingeben: ");
         String input = in.readLine();
         int number = Integer.parseInt(input);
 
         Fakultaet fak = new Fakultaet();
         System.out.println ("Ergebnis: " + fak.fakultaet02(number));
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
 
Vielen Dank, javimka. 😉

Ich muss sagen, dass sich bei mir wirklich Enttäuschung breit macht.
Einfache Sachen wie "HelloWorld" bekomme ich hin, aber wenn es darum geht, einen beliebigen Gedanken umzusetzen, bin ich mit meinem Java schnell am Ende.

Ich werde mir auf jeden Fall die heutigen Beispiele verinnerlichen, in der Hoffnung, mein Java-Wissen erweitert zu haben.

Nochmals vielen Dank für Deinen starken Support! 😉
 

Neue Themen


Zurück
Oben