Operatoren Programm verlässt Do-While Schleife nicht - Warum?

Steen

Mitglied
Guten Tag zusammen,

leider habe ich ein kleines Problem mit dem Beenden meiner Do-While-Schleife.
Und zwar schreibe ich gerade an einem Programm, das mit Hilfe einer Funktion, die berechnet, ob eine Zahl fröhlich ist, alle fröhlichen Zahlen von 1 bis 1500 ausgibt.
Fröhliche Zahlen sind so definiert, dass sich ihre Ziffern so lange quadrieren und aufaddieren lassen, bis 1 entsteht. Alle anderen Zahlen geraten in einen Zyklus der Zahlen 20, 4, 16, 37, 58, 89, 145, 42.

Leider verlässt mein Programm die Schleife, deren Abbruchbedingung in Zeile 11 liegt, nicht, obwohl das Ergebnis eindeutig entweder 1 oder 20 wird, das hab ich per Output direkt vor dem Check der Bedingung ausprobiert und per Hand berechnet.

Java:
public class FröhlicheZahlen {
	static int Happy (int Zahl){
		int sum = Zahl;
		do{
			Zahl = sum;
			sum = 0;
			do{
				sum = sum + (Zahl%10 * Zahl%10);
				Zahl = Zahl/10;
				} while (Zahl != 0);
		}while ((sum != 1)|(sum != 20));
		return sum;
	}
	public static void main(String[] args) {
		for(int i=1; i<=1500; i++){
			if(Happy (i)==1)
				Out.println(i);
		}
	}
}

Ich hoffe, ihr könnt mir helfen.

Liebe Grüße,
Steen
 

TKausL

Top Contributor
Java:
while ((sum != 1)|(sum != 20));

Tue dies solange

summe nicht gleich 1 ist
ODER
summe nicht gleich 20 ist



Es muss also summe = 1 UND summe = 20 sein, damit die schleife beendet.
 

Bernd Hohmann

Top Contributor
Java:
(sum != 1) | (sum != 20)
ist ein bitweises OR der beiden Zwischenergebnisse, logisches OR wäre || (logisches AND wäre &&).

Macht in Deinem Fall aber keinen Unterschied weil bitweises OR/AND auch mit denn Bool-Operatoren klappt (aber nur mal für die Zukunft).

Deine Abbruchbedingung stimmt nicht so ganz mit dem Algorithmus überein. Es ist ja nicht gesagt, dass das Ergebnis irgendwann nach 1 oder 20 konvergiert. Ich habs mal ausprobiert und "Happy(66)" konvergiert sehr schnell nach 5.

Bernd
 

Steen

Mitglied
Hmm klar, danke sehr, da hätte ich auch selbst drauf kommen sollen..

Ich habe es jetzt mit
Code:
while ((sum = !1)&&(sum = !20));
ersetzt, dann müsste das ja funktionieren.

Das Programm läuft trotzdem nicht wie es sollte und mir gehen echt langsam die Ideen aus, wenn ich mein Programm per Stift und Zettel verfolge funktioniert das.. Hat jemand von euch eventuell eine Idee?

Java:
Deine Abbruchbedingung stimmt nicht so ganz mit dem Algorithmus überein. Es ist ja nicht gesagt, dass das Ergebnis irgendwann nach 1 oder 20 konvergiert. Ich habs mal ausprobiert und "Happy(66)" konvergiert sehr schnell nach 5.[/QUOTE]
Hallo Bernd, eigentlich müsste jede Zahl 1 oder 20 erreichen, wenn ich keinen Mist zusammengeschrieben habe. Danach sieht es jedoch gerade leider aus..



Danke für die Unterstützung!
Liebe Grüße,
Steen
 
Zuletzt bearbeitet:

Steen

Mitglied
Rechnen wir das ganze mal per Hand mit der 5 durch:

Java:
public class FröhlicheZahlen {
    static int Happy (int Zahl){           // Zahl = 5
        int sum = Zahl;                       // sum = 5
        do{
            Zahl = sum;
            sum = 0;                           // sum = 0
            do{
                sum = sum + (Zahl%10 * Zahl%10);  // sum = 0 + ( 5 * 5) = 25
                Zahl = Zahl/10;                             // Zahl = 0
                } while (Zahl != 0);                        // Bedingung nicht erfüllt, verlasse Schleife
        }while ((sum != 1)&&(sum != 20));            // Wieder nach oben mit sum=25
        return sum;
    }
    public static void main(String[] args) {
        for(int i=1; i<=1500; i++){
            if(Happy (i)==1)
                Out.println(i);
        }
    }
}

Mit 25:

Java:
public class FröhlicheZahlen {
    static int Happy (int Zahl){           
        int sum = Zahl;                      
        do{
            Zahl = sum;                       // Zahl = 25                                         
            sum = 0;                           // sum = 0
            do{
                sum = sum + (Zahl%10 * Zahl%10);  // sum = 0 + ( 5 * 5) = 25        2. Runde: sum = 25 + ( 2 * 2) =29
                Zahl = Zahl/10;                             // Zahl = 2                             2. Runde: Zahl = 0
                } while (Zahl != 0);                        // Bedingung erfüllt                  2. Runde Raus aus der Schleife mit sum = 29
        }while ((sum != 1)&&(sum != 20));
        return sum;
    }
    public static void main(String[] args) {
        for(int i=1; i<=1500; i++){
            if(Happy (i)==1)
                Out.println(i);
        }
    }
}


Also wenn ich das ganze selbst nachrechne, sollte das nicht bei 5 bleiben, tut es jedoch leider im Programm..

Grüße,
Steen
 

Bernd Hohmann

Top Contributor
Java:
sum = sum + (Zahl%10 * Zahl%10);  // sum = 0 + ( 5 * 5) = 25        2. Runde: sum = 25 + ( 2 * 2) =29

Das denkst auch nur Du (und ich).

In wirklichkeit ist MOD (%) niedriger angesiedelt als "*" und daher rechnet er "sum + (Zahl * 10 MOD 10 MOD 10)

Also Klammern:

Java:
sum = sum + ((Zahl % 10) * (Zahl % 10));

Bernd
 

Steen

Mitglied
Java:
sum = sum + (Zahl%10 * Zahl%10);  // sum = 0 + ( 5 * 5) = 25        2. Runde: sum = 25 + ( 2 * 2) =29

Das denkst auch nur Du (und ich).

In wirklichkeit ist MOD (%) niedriger angesiedelt als "*" und daher rechnet er "sum + (Zahl * 10 MOD 10 MOD 10)

Also Klammern:

Java:
sum = sum + ((Zahl % 10) * (Zahl % 10));

Bernd

Ach danke, du bist ein Schatz. :)
Darauf wäre ich im Leben nicht gekommen, obwohl ich gerade erst in einer Vorlesung mit so einer Operationsreihenofolge konfrontiert wurde..
Jetzt funktioniert das Programm.

Dankender Gruß,
Steen
 
T

trääät

Gast
Bernd Hohmann;969969In wirklichkeit ist MOD (%) niedriger angesiedelt als "*" und daher rechnet er "sum + (Zahl * 10 MOD 10 MOD 10) Bernd[/QUOTE hat gesagt.:
stimmt so immer noch nicht ganz :

Zahl%10 * Zahl%10 ergibt : Zahl MOD (10*Zahl) MOD 10 ... da zwar die multiplikation zu erst durchgeführt wird ... aber die reihenfolge der einzelnen terme wird beibehalten ... oder hast du in mathe was anderes gelernt ?
 

Landei

Top Contributor
Java:
(sum != 1) | (sum != 20)
ist ein bitweises OR der beiden Zwischenergebnisse, logisches OR wäre || (logisches AND wäre &&).

Macht in Deinem Fall aber keinen Unterschied weil bitweises OR/AND auch mit denn Bool-Operatoren klappt (aber nur mal für die Zukunft).

Deine Abbruchbedingung stimmt nicht so ganz mit dem Algorithmus überein. Es ist ja nicht gesagt, dass das Ergebnis irgendwann nach 1 oder 20 konvergiert. Ich habs mal ausprobiert und "Happy(66)" konvergiert sehr schnell nach 5.

Bernd

Sorry, das kann man so nicht stehen lassen. Richtig ist, dass
Code:
|
für numerische Typen das bitweise Oder ist. Für boolsche Operatoren ist es das boolsche Oder, genau wie
Code:
||
. Der Unterschied zwischen den beiden Versionen ist der, dass letzterer ein "Kurzschluss-Operator" ist, d.h. die Auswertung wird abgebrochen, wenn das Ergebnis feststeht. Vergleiche:

Java:
//der zweite Teilausdruck wird immer ausgewertet -> NPE bei null
if (s == null | s.equals("")) { ... } 

//der zweite Teilausdruck wird nicht ausgewertet, wenn der erste wahr ist -> keine NPE bei null
if (s == null || s.equals("")) { ... }

Analoges gilt für
Code:
&
und
Code:
&&
.

Java:
//der zweite Teilausdruck wird immer ausgewertet -> NPE bei null
if (s != null & s.equals("foo")) { ... } 

//der zweite Teilausdruck wird nicht ausgewertet, wenn der erste falsch ist -> keine NPE bei null
if (s != null && s.equals("foo")) { ... }


Nun fragt sich, wann
Code:
|
und
Code:
&
überhaupt für Booleans verwendet werden sollte. Die Antwort ist: So gut wie nie. Es kann sinnvoll sein, wenn der zweite Teilausdruck nicht nur boolean zurückliefert, sonder auch einen Seiteneffekt ausführt (z.B. Werte in einem Objekt verändert, eine Log-Ausgabe schreibt u.s.w.), aber gewöhnlich ist es eine schlechte Idee, so eine Methode überhaupt zu schreiben. Außerdem ist zu befürchten, dass selbst gestandene Programmierer dieses Detail nicht kennen, oder im aktuellen Code übersehen.
 
Zuletzt bearbeitet:
T

tröööt

Gast
@Landei
leider falsch ...

| und & bleiben BIT-WISE ... es macht keinen unterschied ob man damit INTs oder BOOLs bearbeitet ... denn java stellt intern auch TRUE und FALSE nur mit INTs dar ... nämlich mit 0 und 1 ... siehe dazu source von Boolean
das was du mit dem unterschied meinst ist lediglich dadurch begründed das für die BIT-WISE auswertung ALLE teil-terme aufgelöst werden müssen um das richtige ergbenis zu liefern da hier das ergebnis "berechnet" wird ... was den logischen OP angeht ist es nun mal so das entsprechend der verknüpfung bereits vorher das richtige ergebnis geliefert werden kann und so die restlichen teilterme nicht mehr notwendig sind ...
 

Bernd Hohmann

Top Contributor
Sorry, das kann man so nicht stehen lassen.

Das stimmt schon. | und & werden Binär ausgwertet (weil "boolean" ein verkapptes "int" ist), || und && hingegen werden logisch verglichen - jedenfalls ist das der aktuelle Stand der JVM.

Ich hab mal ein Beispiel gebastelt und das durch einen Decompiler geschubst (die dämlichen Zuweisungen brauch ich damit das der Compiler nicht wegoptimiert).

Java:
public class Test {
  public static void main(String str[]) {

     boolean TRUE = true;
     boolean FALSE = false;

     boolean a = TRUE | FALSE;
     boolean b = TRUE || FALSE;
     boolean c = TRUE & FALSE;
     boolean d = TRUE && FALSE;

     boolean e = blnTRUE() | blnFALSE();
     boolean f = blnTRUE() || blnFALSE();

  }

  public static boolean blnTRUE() { 
     int a=1, b=1; 
     return a==b;
  }

  public static boolean blnFALSE() {
     int a=1, b=0;
     return a==b;
  }

}

Ergebnis im Decompiler:

Java:
public class Test
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 1;
    int j = 0;

    int k = i | j;
    int m = (i != 0) || (j != 0) ? 1 : 0;
    int n = i & j;
    int i1 = (i != 0) && (j != 0) ? 1 : 0;

    boolean bool = blnTRUE() | blnFALSE();
    int i2 = (blnTRUE()) || (blnFALSE()) ? 1 : 0;
  }

  public static boolean blnTRUE()
  {
    int i = 1; int j = 1;
    return i == j;
  }

  public static boolean blnFALSE() {
    int i = 1; int j = 0;
    return i == j;
  }
}

Interessant finde ich die Ergebnisse für "blnTRUE() OR blnFALSE()": mit "|" kommt dort ein "boolean" heraus, für "||" hingegen ein "int" - ich hätte das umgekehrt erwartet.

Auch bisserl drollig: "false" ist in den mir bekannten Sprachen "0", "not false = -1". Java macht da einen Sonderweg:


Java:
     boolean FALSE = false;
     boolean dummy = !FALSE;
(decompiler)
    int j = 0;
    int k = j == 0 ? 1 : 0;

Bernd
 
Zuletzt bearbeitet:

Ark

Top Contributor
denn java stellt intern auch TRUE und FALSE nur mit INTs dar
(Hervorhebung von mir.) Jein. So verwendet z.B. die Oracle-JVM zur Speicherung von boolean-Arrays quasi byte-Arrays. Bei Berechnungen wiederum könnte (nicht sicher) dieselbe JVM dagegen gerne auch int verwenden, vor allem, wenn das schon so in der class-Datei drinstehen sollte.

Überhaupt soll es mich nicht wundern, wenn auf dem Stack (also bei den tatsächlichen Berechnungen bzw. lokalen Variablen) tendenziell int zum Einsatz kommt, während auf dem Heap (d.h. zur Speicherung von Ergebnissen bzw. bei statischen und nicht-statischen Fields) eher byte verwendet wird.

Man sollte also in solchen Fragen mindestens drei verschiedene Ebenen auseinanderhalten: Die Java-Sprachspezifikation, die JVM-Spezifikation und die konkrete Implementierung einer JVM.

Ark
 
T

tröööt

Gast
naja ... der Java-Code selbst verwendet grundsätzlich INT ...
in wie weit dies intiligent von der jeweiligen VM intern umgesetzt wird müsste man natürlich in deren implementierung nachlesen ... aber fakt ist : PRIMITIVE datentypen werden ALLE java-intern numerisch behandelt ... weshalb | und & das ergebnis "errechnen" was nun mal implizit dazu führt das vorher alle terme aufgelöst werden müssen ... das hat überhaupt nichts mit bool vs int zu tun sondern mit der arbeitsweise der bit-wise operatoren selbst ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
M Mini Jar-Programm Java Basics - Anfänger-Themen 51
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Wo hält das Programm an? Java Basics - Anfänger-Themen 11
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
Fugover Kopfrechnen-Programm Java Basics - Anfänger-Themen 6
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
A wie kann ich es in meinem Programm rein tun Java Basics - Anfänger-Themen 8
S Fehler beim Programm Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
A Lotto Programm Java Basics - Anfänger-Themen 3
S Programm erstellen Java Basics - Anfänger-Themen 3
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S MinMax Programm erstellen Java Basics - Anfänger-Themen 4
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
M JAVA Programm in Website einbinden Java Basics - Anfänger-Themen 19
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
G Programm Code Java Basics - Anfänger-Themen 5
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
A Programm Histogram Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
CT9288 Interaktion mit laufendem Programm -Fachbegriffe Java Basics - Anfänger-Themen 2
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
W Programm dass Palindrome erkennt Java Basics - Anfänger-Themen 6
K Erste Schritte Programm geht aus Schleife, warum? Java Basics - Anfänger-Themen 2
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
X Kurzes Java-Programm, das sich komisch verhält Java Basics - Anfänger-Themen 6
Zrebna Programm kann aus der Konsole nicht gestartet werden (in der IDE läuft es) Java Basics - Anfänger-Themen 2
K Error bei meinem Programm - Hilfe Java Basics - Anfänger-Themen 8
J Programm schreiben Java Basics - Anfänger-Themen 5
T Kann jemand kurz das Programm testen? Java Basics - Anfänger-Themen 13
T Programm Schleife/if Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben