Zitat von
-lx-:
Welche Bedingung meinst du ?
Diese ? If Erbe > ErbHaelfte
Ja, die war so verschachtelt, dass du erst prüfst ob die Summe < Erbhaelfte ist und nur wenn das nicht der Fall ist, dann prüfst du diese Bedingung zusätzlich ab. Wenn ein Fall keine Behandlung hat (wie bei dir), dann solltest du den einfach weglassen
Zitat von
-lx-:
Delphi-Quellcode:
...
For j:= i To length(Feld) Do
begin
If (TErbe + Feld[j]) = Erbhaelfte Then
begin
Edit1.Text:= 'Gefunden _ ' + IntToStr(TErbe+Feld[j]) ;
end
Else If (TErbe + Feld[j]) < Erbhaelfte Then
begin
SucheLoesung(i+1, Erbhaelfte, TErbe+Feld[j]) ;
end
Ja, hier hast du dir einen hübschen Fehler eingebaut, den man leicht übersehen kann. An sich ist der Lerneffekt am größten, wenn du einfach noch mal von vorne anfängst (mit der gleichen Idee!) und schaust was du machen wolltest und was hier gemacht wird.
An sich kannst du (da ich die Stelle schon stark eingegrenzt habe) natürlich leicht alles durchraten und mal schauen, aber davon hast du ehrlich gesagt nichts.
Aber mal kurz zum Ablauf zurück, du schaust erst mal nach, ob die aktuelle Partitionierung des Erbes der Erbhaelfte entspricht. Soweit, so gut. Ist dem so gibst du es aus, auch klar. Aber davor ist ja noch eine Zeile, du machst das wie oft? Na ja, von i bis length(Feld) mal, wenn also das erste Element schon die Erbhaelfte ist, dann gibst du wohl length(Feld) - 1 mal aus, wie groß das Element ist.
Aber das ist nicht weiter schlimm, nicht ganz das was man erwartet und bei großen Feldern vielleicht lästig, aber eben nicht falsch.
Als nächstes betrachtest du den Fall, dass die aktuelle Partitionierung noch kleiner ist als das Erbe. Ist dies der Fall, möchtest du das nächste mögliche Element (ebend das Element Feld[j]) hinzuaddieren und wenn auch diese Summe immer noch kleiner ist als die Erbhaelfte (impliziert ja, dass TErbe kleiner ist), dann möchtest du rekursiv weiter machen. Um weiter zu machen sind ein paar Dinge nötig, die du als Parameter übergibst:
- Der Index des nächsten Elements das hinzugefügt werden kann
- Die Erbhaelfte (konst. für ein Feld)
- Der Wert der aktuellen Partionierung
Ok, überleg dir einfach mal ein wenig ob du hier die richtigen Argumente übergibst. Das ich behaupte, dass es noch einen Fehler gibt, heißt ja nicht dass es wirklich einen geben muss. Gut, da das Programm nicht macht was du erwartest gibt es recht sicher einen, aber der muss wiederum nicht hier liegen.
Schau dir einfach erstmal diese Stellen an, vielleicht siehst du dann ja gleich, was du hier falsch gemacht hast. Hier ist es allerdings so eine Stelle, an der man leicht einen solchen Fehler machen kann.
Es gibt allerdings Möglichkeiten solche Fehler zu minimieren. Viele lernst du (hoffentlich) schon in der Schule kennen, allerdings muss ich auch sagen, dass ich damals als Schüler keine wirkliche Motivation hatte solche Dinge umzusetzen. Trotzdem seien sie hier nochmal erwähnt, ein gutes Programm beginnt immer mit Einfachheit und Lesbarkeit. Alles sollte sich so gut wie es geht selbst erklären. Variablennamen sollten immer selbstsprechend sein (tmp oder i sind es nicht). Dann ist es ganz schlimm, dass hier TErbe als Variablenname verwendet wird. Das T steht in Delphi (per Konvention) für Type, zeigt also einen Datentypen an. Wenn du z.B. TFeld verwendest, dann weiß man so, dass dies ein Datentyp ist, während (auch per Konvention) PFeld ein Zeiger (p = Pointer) auf ein TFeld wäre.
Die Konventionen zum Codestil sind eigentlich nur Richtlinien, keiner muss sich dran halten, aber man sollte es doch immer tun. Immerhin möchtest du ja auch Code den du bekommst verstehen, halten sich alle an die gleichen Konventionen, sollte das immer leicht möglich sein.
Ja, ansonsten bleibt noch die Einrückung. Hier hast du ja immer konsequent eingerückt und auch immer ein begin end - Block in jeder Kontrollstruktur drin, dass ist sehr gut! Wirklich! Viele dumme Fehler passieren hier schnell, weil jmd. eine Zeile noch der Kontrollstruktur (schleifen, Bedingungen und Case) zuordnet, weil die Zeile falsch eingerückt wurde, während eben ohne begin end nur die erste Zeile wirklich zur Struktur gehört.
Egal wie einfach ein Code ist, an sich tut auch immer ein Kommentar gut. Du solltest allerdings auch wirklich nur sinnvolle Kommentare verwenden. Ein Kommentar muss nicht das ganze Programm in jeder Einzelheit beschreiben, aber es sollte einfach kurz gesagt werden, was die Idee ist und warum es so gemacht wird. Wenn du größere Programme schreibst oder mit mehr als einer Person an einem arbeitest, dann gibt es einfache Teile im Code, die siehst du nach Monaten wieder und weißt sonst nicht, warum du da was gemacht hast.
Ok, dann such mal deinen Fehler (bist ja auf dem richtigen Weg!)
Gruß Der Unwissende