(Java Anfänger) Finde meinen fehler nicht.

Cano65

Lieutenant
Registriert
Jan. 2007
Beiträge
598
Hy,
inzwischen sitze ich schon stunden drann und habe immernoch nicht den Fehler gefunden.

Die Aufgabe lautet: Ein junges Paar beschließt so lange Kinder zu haben, bis sie mindestens einen Jungen und ein Mädchen haben. Schätzen Sie die Anzahl der Kinder die das Paar haben wird mittels einer Simulation.

Bei meiner ersten Lösung gibt er als Ergebnis immer die 0 an.
Bei meinem 2 Ergebnis gibt er als Wert 1 und 0 an (auf den Bildern zu sehen)

Egal wie ich die Klammern setze es kommt entweder als Ergebnis 1 und 0 oder 0 und 0 raus.

Mfg
 

Anhänge

  • Ansatz 1.jpg
    Ansatz 1.jpg
    114,8 KB · Aufrufe: 369
  • Ansatz 2.jpg
    Ansatz 2.jpg
    141,9 KB · Aufrufe: 293
Die Überprüfung in der While-Schleife stimmt auch nicht. So kommt das Programm gar nicht erst in die schleife, da muss stehen:

While( boy<1 && girl<1){...}

MfG Tim

Edit: zu langsam :D
 
@ Traube: das mit dem "&&" hab ich auch schon probiert, das Ergebnis ist das selbe
@herr_andy: auch nur das ">" macht kein Unterschied
@Joiner: Wie meinst du das??
 
Nicht > sondern < !

Kopier es mal so rein wie ich oben geschrieben hab. Ins erste programm.

MfG Tim
 
@D4l4!L4m4: danke für den Ansatz :) habe ">=" Statt "<=" benutzt. Mit deinem Ansatz durchläuft er die schleife nur einmal
 
Dazu kann man nur sagen: Programmieren lernt man NICHT über eine Programmiersprache, sondern indem man sich mit Algorithmierung befasst. Wenn man es nicht im Kopf kann, dann ist der erste Schritt nicht, sich an den PC zu setzen, sondern der erste Schritt sind Bleistift+Papier.
Zeichne dir für deinen Ablauf einen Programmablaufplan. Wenn dein PAP korrekt ist, kannst du das Problem in den meisten Programmiersprachen innerhalb von Minuten implementieren. Den Anfang macht trotzdem immer ein PAP.
 
Neues Problem. Ich habe schon paar mal auf den Simulator geklickt aber er zeitgt mit nur ergebnisse mit Maximal 2 zu 1 an oder 2 zu 0 was eigendlich falsch ist... -.-
 

Anhänge

  • hub 2.jpg
    hub 2.jpg
    102,3 KB · Aufrufe: 212
  • hub.jpg
    hub.jpg
    131,1 KB · Aufrufe: 171
Zuletzt bearbeitet:
Mit "&&"? Das dürfte aber eigentlich nicht sein, da die Schleife mit meinem Ansatz so lange läuft wie mindestens eine der variablen <1 (also =0) ist.

Mit <= müsstest du eigentlich dann z.b. Immer x Söhne und 2 töchter (oder anders herum) als Ergebnis haben.

Das neue Problem liegt am <= ;)

Statt <1 kannst du auch !=0 als abbruchbedingung nehmen.

Btw, da mir die aufgabe sehr bekannt vorkommt: welche Uni? ;)


MfG Tim
 
Zuletzt bearbeitet:
&& ist ein logischer Operator. Er schaut nach, ob beide Ausdrücke true sind. Ein einfaches & hingegen ist ein bitweiser Operator. 0011 & 0101 ist 0001, also Bit ist nur 1, wenn beide Stellen 1 sind. Da du logisch vergleichen willst, wirst du eher && nehmen.

Bei der While-Schleife wird die Schleife solange ausgewertet, wie der Inhalt der Klammer true ergibt. while (true) wäre als Beispiel eine Endlosschleife. Damit die Schleife terminiert, muss der Wert in der Klammer false ergeben. Da du die Variablen boy & girl als 0 initiierst und in der Schleife die voraussetzung steht, das diese größer/gleich 1 sein müssen, damit die Schleife durchlaufen wird, springt java direkt weiter.

Als kleine Frage zu deinem Code. Was willst du damit genau bezwecken ? Du möchtest eine Zufallsfunktion mit einer Wahrscheinlichkeit von 50%, das boy um 1 erhöht wird, ansonsten girl und mit der while-Schleife bezwecken, das diese terminiert sobald bei beiden mindestens 1 da ist ?
 
In Anlehnung an Daaron:

Überleg es dir nochmal von Grund auf und schreib es einfach so in der Syntax wie du es mit Worten ausdrücken würdest.


Das Paar hat keine Tochter und keinen Sohn.
Solange es weniger als eine Tochter und weniger als einen Sohn hat, bekommt das Paar weiter Kinder.
Es wird (zufällig) ein Sohn, ansonsten wird es eine Tochter.

FYI: "weniger als" und "weniger als oder gleich" sind unterschiedliche Dinge und sollten situationsbedingt ausgewählt werden. Überleg was hier eher Sinn macht.
 
@ Daaron: das habe ich ja und mMn ist das auch richtig. Ich sitze schon seit Stunden drann. Habe mir mehrmals die while, do while und die for schleife sowie andere Datentypen etc nochmal angeguckt.

@sxc: Der Befehl sagt doch aus, das die Schleife solange laufen soll, bis das Paar mindestens einen Jungen und mindestens ein Mädchen bekommen. Sie hört dann auf, bis boy und girl mind. 1 groß sind.

Daran ist eigendlich nichts falsch, ihr könnt mir glauben ich sitze schon Stunden drann. Habe 4 struckturen wovon ich 2 realisiert habe.
 
Zuletzt bearbeitet:
Hast du es jetzt so implementiert wie ich oben geschrieben hab?

Und nebenbei fällt mir noch ein, um der Aufgabenstellung gerecht zu werden solltest du das ganze 100-1000 mal laufen lassen und gleichzeitig einem Mittelwert ermitteln.

MfG Tim
 
Da es nicht funktioniert, scheint es aber wohl nicht zu stimmen oder?

Du musst dir klar werden, was Dinge wie "mindestens" heißen und wie man sie in einer Programmiersprache ausdrückt.
Dir stehen zur Verfügung:

< "kleiner als"
<= "kleiner als oder gleich groß"
> "größer als"
>= "größer als oder gleich groß"

Und jetzt soll das Paar weiter Kinder kriegen SOLANGE Anzahl_Jungen ... 1 UND Anzahl_Mädchen ... 1
Was muss dann für die Punkte eingesetzt werden?

Es ist wichtig, dass die WHILE-Schleife nicht bedeutet "Das Paar kriegt solange Kinder BIS (Bedingung =wahr)", sondern eben "Das Paar kriegt Kinder SOLANGE (Bedingung = wahr)"!







EDIT / Lösung:
Wir sind alle zu doof ... peinlich das zugeben zu müssen.
Die Überprüfung mit && ergibt SOLANGE BEIDE GLEICHZEITIG KLEINER ALS 1 SIND = WAHR und wird also nur dann ausgeführt.
Eine Überprüfung mit || (Oder) stattdessen führt zur Lösung. Denn hierbei reicht es, wenn ein Teil der Bedingung erfüllt ist, also SOLANGE Anzahl_Jungen kleiner als 1 ODER SOLANGE Anzahl_Mädchen kleiner als 1 werden weiter Kinder gemacht.

while(boy<1 || girl<1) {...}

Sorry für die Fehlinfos vorher ... ich lass sie drin, weil ich zugeben kann, mich geirrt zu haben ^^
 
Zuletzt bearbeitet:
Erstmal danke ich euch, das ihr zum einen sehr nett seit:) und zum zweiten sehr hilfreich seit.


@ D4L4!L4M4: ja hab ich auch gemacht, klappt aber torzdem nicht. Hab ein Bild reingestellt davon.
Das mit dem mehrfachen durchlaufen ist der nächste Schritt aber erstmal muss die Schleife funktionieren.
@sxc: Das Paar soll ja solange Kinder kriegen bis sie mindestens 1 jungen und mindestens 1 Mädchen haben. Also kann das Verhältniss 10 zu 1 sein aber niemals 10 zu 0 wenn ich das kleiner als Zeischen benutzen würde statt das kleiner gleich Zeischen, würde das Programm auch weiterlaufen, wenn das Paar 1 Mädchen und 1 Jungen hat und das soll es eben nicht. Es soll ja aufhören wenn das Paar mindestens einen Jungen und mindestens ein Mädchen bekommen hat.
 
Die Bedingung war doch ganz anders:

Solange ... bis ein Junge UND ein Mädchen.

D.h. die WHILE muss so lauten:

WHILE(boy < 1 || girl < 1)


Erklärung:
Mit "||", also dem "oder". Die Schleife soll ja erst abbrechen wenn boy >= 1 && girl >= 1
Wenn man jetzt mathematisch davon die negation nimmt, kommt man bei "boy < 1 || girl < 1" raus ;-)
 
Zuletzt bearbeitet von einem Moderator:
Genscher hat recht. Da hatte ich ein Brett vorm Kopf ^^.

Probier es mal mit oder, das sollte (aber nun wirklich) funktionieren ;)

MfG Tim
 
Cano65:
Du benutzt aber eine SOLANGE (Bedingung = wahr) Schleife und nicht eine BIS (Bedingung = wahr) Schleife. Das ist ein Unterschied!

Ansonsten, mein Edit:

Lösung:
Wir sind alle zu doof ... peinlich das zugeben zu müssen.
Die Überprüfung mit && ergibt SOLANGE BEIDE GLEICHZEITIG KLEINER ALS 1 SIND = WAHR und wird also nur dann ausgeführt.
Eine Überprüfung mit || (Oder) stattdessen führt zur Lösung. Denn hierbei reicht es, wenn ein Teil der Bedingung erfüllt ist, also SOLANGE Anzahl_Jungen kleiner als 1 ODER SOLANGE Anzahl_Mädchen kleiner als 1 werden weiter Kinder gemacht.

while(boy<1 || girl<1) {...}

Sorry für die Fehlinfos vorher ... ich lass sie drin, weil ich zugeben kann, mich geirrt zu haben ^^
 
Zurück
Oben