# Denkfehler- aber wo?



## __LiLLi__ (1. Apr 2010)

hey hey

ich brauch mal eure hilfe!
ich hab da ein java-programm mit einem denkfehler, aber ich finde ihn nicht.
also das programm kompiliert und es tut auch das was es tun sollte, aber es ist trotzdem ein fehler drin.
ich bin jetzt schon zwei tage dran gesessen, aber ich finde ihn nicht :noe: :bahnhof:

hoffe ihr könnt mir helfen.

lg
LiLLi


----------



## The_S (1. Apr 2010)

Also zum Einen:

Warum hängst du ein Bild von deinem Code an?

Zum Anderen: 

Woher weißt du dann, dass es ein Fehler ist? Und wie äußert sich dieser?


----------



## eRaaaa (1. Apr 2010)

__LiLLi__ hat gesagt.:


> also das programm kompiliert und es tut auch das was es tun sollte, aber es ist trotzdem ein fehler drin.



HÄ? *confused* - vllt magst du uns auch sagen was nun der Fehler ist, der trotzdem, obwohl es eig. tut was es soll, da ist ?
Und wieso hängst du den Code als Grafik an, anstelle ihn hier in java-Tags zu posten? :autsch:


----------



## faetzminator (1. Apr 2010)

Du erstellst in der [c]main()[/c] jedes Mal eine neue Instanz des [c]int[][/c]. In [c]neuerTip()[/c] füllst du alle Werte im Array ab, statt nur den aktuellen (da müsstest du noch den index kennen oder einfach den Tip returnen und in [c]main()[/c] ins Array schreiben).


----------



## __LiLLi__ (1. Apr 2010)

wir haben dieses blatt auf da uni von unserm prof bekommen.
mit der aufgabe sucht den fehler! 
und ich war einfach nur zu faul um ihn nochmal einzutippen......


----------



## __LiLLi__ (1. Apr 2010)

@ faetzminator

also nehm ich nicht alle werte von da main?
oder hab ich da jetzt was ganz falsch verstanden?


----------



## faetzminator (1. Apr 2010)

__LiLLi__ hat gesagt.:


> wir haben dieses blatt auf da uni von unserm prof bekommen.
> mit der aufgabe sucht den fehler!
> und ich war einfach nur zu faul um ihn nochmal einzutippen......



Ah so, das ist gar nicht dein Code, sondern eine Hausaufgabe? Ich finde das eine Frechheit, der Thread sieht aus als wäre es der unerwünschte Fehler eines Anfängers und nicht eine HA.


----------



## agentone (1. Apr 2010)

> und ich war einfach nur zu faul um ihn nochmal einzutippen......



Vielleicht solltest du aber genau das tun! Mit einem vernünftigen Debugger kannst du dann ganz schnell die Fehler finden.
Oder du lässt das Programm laufen und rechnest nebenbei alles auf dem Papier nach.


----------



## __LiLLi__ (1. Apr 2010)

ich schreibe eh programme, nur hab ich heute schon 3 geschrieben und dann war mir das eintippen von diesem programm dann zu viel 

aba wenn ich doch weiß, dass das programm funkt.

und ist es echt ein so offensichtlicher anfängerfehler?


----------



## SlaterB (1. Apr 2010)

was ist denn jetzt die Frage?
bist du immer noch auf der Suche nach irgendeinem Fehler?
dann tippe das Program als aller erstes ab und lasse es laufen, das dauert 10 min statt 2 Tage und du findest Fehler eher, falls sie dir nicht gleich ins Auge springen,
alles andere wäre höchstens 'wer findet für mich die Fehler?' und da wird hier kaum einer mitmachen, wenn du dir selbst die Tipparbeit sparst


----------



## __LiLLi__ (1. Apr 2010)

das programm funktioniert und es tut das was es tun soll
es ist aber ein denkfehler drin!
und den find ich einfach nicht!
da kanns is jetzt noch 10x abschreiben!


----------



## SlaterB (1. Apr 2010)

du kannst es ausführen und dir die Ergebnisse anschauen und das vergleichen mit dem was das Programm wohl dem Anschein nach tun soll,
das gibt Hinweise auf ein evtl. vorhandenes Fehlverhalten,
dann kann man das im Programm näher untersuchen, z.B. an mehr Stellen den Inhalt von Variablen ausgeben

> das programm funktioniert und es tut das was es tun soll
> es ist aber ein denkfehler drin!

wie lautet denn die genaue Aufgabenstellung,
hast du überhaupt keine Ahnung wonach zu suchen ist?
auch für andere wäre es leichter, wenn das Programm als Programm vorliegen würde

wie soll ein funktionierendes Programm einen Fehler enthalten?
vielleicht funktioniert es in bestimmten Bereichen, nicht aber für alle denkbaren Eingaben..


----------



## __LiLLi__ (1. Apr 2010)

genau das geht ja nicht, weil das programm ja das tut was es tun soll!
es kompiliert und "rechnet" das aus was es soll und das auch richtig.

deswegen ist ja ein denkfehler drin, der sich aba anscheinend in diesem zusammenhang nicht bemerkbar macht.
und den find ich nicht!

ich frag euch ja nicht, weil ich zu faul bin zum suchen, sondern weil ich echt nicht mehr weiter weiß!


----------



## SlaterB (1. Apr 2010)

siehe auch die letzten Sätze im meinen vorherigen Posting, etwas später dazugeschrieben, besonders den letzten Satz

edit: doch nich unbedingt


----------



## __LiLLi__ (1. Apr 2010)

[Java]
import javax.swing.JOptionPane;

class Lotto {

  public static void main(String[] args) {
    int TIPLAENGE = 6;

    String eingabe = JOptionPane.showInputDialog("Wie viele Tips sollen " +
                                                 "gespielt werden?", "1");
    int tipanzahl = Integer.parseInt(eingabe);

    int[] tips; // int tips[]; ist auch moeglich, aber!
    for (int i = 0; i < tipanzahl; i++) {
      tips = new int[TIPLAENGE];
      neuerTip(tips);
      tipAusgabe(tips);
    }
  }

  public static void neuerTip(int[] tips) {
    int MINTIP = 1;
    int MAXTIP = 45;

    for (int i = 0; i < tips.length; i++) {
      int tip;
      do {
        tip = (int) (Math.random() * MAXTIP) + MINTIP;
      } while (istTipZwischenTips(tip, tips));
      tips_ = tip;
    }
  }

  public static boolean istTipZwischenTips(int tip, int[] tips)
  {
    for (int i = 0; i < tips.length; i++) {
      if (tips == tip) {
        return true;
      }
    }
    return false;
  }

  public static void tipAusgabe(int[] tips) {
    for (int i = 0; i < tips.length; i++) {
      System.out.print(tips + "\t");
    }
    System.out.print("\n");
  }

}

[/Java]_


----------



## SlaterB (1. Apr 2010)

ok, auch wenn es dich kaum trösten wird:
ich zumindest kann dort keine Art von Fehler erkennen,
die Zufallszahlen sind in Ordnung, gleichverteilt, keine Index-Überläufe, Endlosschleifen oder ähnliches

dass man am Anfang einen Text statt einer Zahl eintippen kann und dann eine Exception bekommt, fällt wohl nicht unter die Kategorie 'Denkfehler'


----------



## __LiLLi__ (1. Apr 2010)

tja... dann is es doch wohl noch schwerer als ich gedacht habe.
ich habe auch leider keine ahnung in welchem zusammenhang der denkfehler mit dem programm steht.
:noe:


----------



## eRaaaa (1. Apr 2010)

Ich hole noch einmal folgenden Fragen hoch:



SlaterB hat gesagt.:


> wie lautet denn die genaue Aufgabenstellung,
> hast du überhaupt keine Ahnung wonach zu suchen ist?



also das einzige was man noch zusätzlich zu dem bisher schon angesprochenen sagen kann ist, dass hier Zufallszahlen von [1..45] gezogen werden, Lotto ist ja aber normal 1 aus 49...aber das wird ja wohl auch nicht *der* Fehler sein?! :noe:
(ich tendiere zu faetzminators new int[] ;> )
/Edit: vllt ist es ja auch ein Aprilscherz ^^


----------



## faetzminator (1. Apr 2010)

Kann vieles sein  z.B. sollte zumindest stilmässig [c]MAXTIP[/c] als final deklariert werden, würde ich sagen.


----------



## __LiLLi__ (1. Apr 2010)

@eRaaaa
ne ne, ich bin aus österreich und bei uns ist lotte 6 aus 45! 

@faetzminator
und was ändert es, wenn ich es als final deklarier?


----------



## eRaaaa (1. Apr 2010)

__LiLLi__ hat gesagt.:


> @eRaaaa
> ne ne, ich bin aus österreich und bei uns ist lotte 6 aus 45!



Achso, interessant 

Aber wieso postest du denn nicht endlich mal die exakte Aufgabenstellung? 


```
int[] tips; // int tips[]; ist auch moeglich, aber!
```

vllt sollst du ja wirklich nur auf diesen Kommentar eingehen? 

-----------------
_Aber..._so stehen immer nur die letzten gezogenen Zahlen im Array und man kommt an die zuvor gezogenen Zahlen nicht mehr ran(und das new int[] wäre auch unnötig), besser wäre wohl ein 2D-Array 

```
int[][] tips = new int[tipanzahl][];
	for (int i = 0; i < tipanzahl; i++) {
	    tips[i] = new int[TIPLAENGE];
	    neuerTip(tips[i]);
	    tipAusgabe(tips[i]);
	}
```
oder sogar eine Liste...
----------------

???:L


----------



## __LiLLi__ (2. Apr 2010)

exacte aufgabenstellung:
(zitat von unsem prof): findest den denkfehler! ich verrat euch nur soviel, mir ist er erst vor 5 minuten aufgefallen. also das programm funtioniert aba es ist ein denkfehler drin.
Wer ihn mir bis nach ostern gefunden hat bekommt 10 extrapunkte.

sorry leute, aba ich weiß auch nicht mehr, als ich euch bis jetzt geschrieben hab! :noe:


----------



## __LiLLi__ (2. Apr 2010)

@ eRaaaa
danke für deinen vorschlag, aber das wird es wohl nicht sein, da wir das noch nicht durchgemacht haben.(zumindest hab steht davon nichts in den unterlagen)


----------



## faetzminator (2. Apr 2010)

Die Variable wäre dann "eine Konstante" (nein, es gibt keine Konstanten!), auf alle Fälle würde ich eine nicht finale Variable nie gross schreiben. Aber das ist eigentlich eine Unschönheit, und kein Denkfehler, genau auch wie [c]System.out.print("\n")[/c] --> [c]System.out.println()[/c].


----------



## __LiLLi__ (2. Apr 2010)

ja das sind nur "Schönheitsfehler".....


----------



## agentone (7. Apr 2010)

Also anscheinend ist es ja kein 1.-April-Scherz.

Ich hab das Proramm mal folgendermaßen verändert:
- Die 3 wichigen Variablen sind final und stehen außerhalb der Methoden
- Die Ausgabe-Zeile mit \n ist in System.out.println() verändert.


```
import javax.swing.*;

public class Lotto {

  private static final int TIPLAENGE = 6;
  private static final int MINTIP = 1;
  private static final int MAXTIP = 45;

  public static void main(String[] args) {
    String eingabe = JOptionPane.showInputDialog("Wie viele Tips sollen gespielt werden?", "1");
    
    int tipanzahl = Integer.parseInt(eingabe);  // parseInt kann Exception werfen
      
    for (int i = 0; i < tipanzahl; i++) {
      int[] tips = new int[TIPLAENGE]; // int tips[]...; ist auch moeglich, aber!
      neuerTip(tips);
      tipAusgabe(tips);
    }
  }

  public static void neuerTip(int[] tips) {
    for (int i = 0; i < tips.length; i++) {
      int tip;
      do
      {
        tip = (int) (Math.random() * MAXTIP) + MINTIP;
      } while (istTipZwischenTips(tip, tips));
      tips[i] = tip;
    }
  }

  public static boolean istTipZwischenTips(int tip, int[] tips)
  {
    for (int i = 0; i < tips.length; i++) {
      if (tips[i] == tip) {
        return true;
      }
    }
    return false;
  }

  public static void tipAusgabe(int[] tips) {
    for (int i = 0; i < tips.length; i++) {
      System.out.print(tips[i] + "\t");
    }
    System.out.println();
  }
}
```

Also meine Idee sieht jetz so aus:
Die Method neuerTip erstellt für jedes int im array zufallszahlen, solange, bis
eine gefunden ist, die noch nicht drin ist. So versteh ich das zumindest, oder so soll sie arbeiten...
Wenn dummerweise aus irgendwelchen gründen fast immer dieselben zahlen generiert werden, arbeitet die Methde seeeehr laaange, denn es sollen ja nur verschiedene zahlen im array vorkommen. Darin könnte ein problem liegen.
Das Array ist nach seiner Erschafung mit Nullen gefüllt. Praktischerweise können bloß Zufallszahlen größer als 1 generiert werden, sonst hätten wir hier auch ein problem, denn istTipZwischenTips prüft ja immer das ganze array, obwohl es ja erst am ende voll ist...
Es wird nirgends überprüft, ob Maxtip größer als mintip ist, aber die sind ja konstant. also kein problem.
Vielleicht liegt es auch an der Zufallszahlengenerierung. Aber das sieht tatsächlich relativ zufällig aus. 
Interessant ist, das der einzige Kommentar im ganzen Code an einer uninteressanten Stelle ist. Keine Ahnung warum?!


----------



## ttplayer (8. Apr 2010)

__LiLLi__ hat gesagt.:


> @faetzminator
> und was ändert es, wenn ich es als final deklarier?


Wenn du es als final deklarierst, meckert der Compiler, wenn du versuchst, die Variable später zu ändern (also eine Schutzmaßnahme, wie gesagt nur Stil, hat keine Auswirkungen auf die Ausführung)


----------

