![]() |
Re: Problem der Erbteilung ?
So... nun hier die finale Version samt Ausgabe der Stellen der benutzen Zahlen.
Delphi-Quellcode:
[...] type TFeld = Array[1..5] of Integer ; TFeldBoolean = Array[1..5] of Boolean ; [...] var Form1: TForm1; Feld: TFeld = (1,9,5,3,8) ; Selectiert: TFeldBoolean = (False, False, False, False, False) ; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); procedure ShowSelection ; var i: Integer ; begin For i:= 1 To length(Selectiert) Do begin If Selectiert[i] Then begin Memo1.Lines.Add('An Feldposition ' + IntToStr(i) + ' --> ' + IntToStr(Feld[i])) ; Selectiert[i]:= False ; end; end; Memo1.Lines.Add('---------------------------') ; Memo1.Lines.Add(' ') ; end; function Summieren(): Integer ; var i, tmp: Integer ; begin tmp:= 0 ; For i:= 1 To length(Feld) Do begin tmp:= tmp + Feld[i] ; end; result:= tmp ; end; procedure SucheLoesung(i, Erbhaelfte, TErbe: Integer) ; var j: Integer ; begin { Memo1.Lines.Add('i: ' + IntToStr(i)) ; Memo1.Lines.Add('Erbhaelfte: ' + IntToStr(Erbhaelfte)) ; Memo1.Lines.Add('TErbe: ' + IntToStr(TErbe)) ; Memo1.Lines.Add('__________') ; } For j:= i To length(Feld) Do begin If (TErbe + Feld[j]) = Erbhaelfte Then begin Selectiert[j]:= True ; Memo1.Lines.Add('Erbe teilbar!') ; Memo1.Lines.Add('Erbe pro Person: ' + IntToStr(TErbe+Feld[j]) + ' €') ; Memo1.Lines.Add(' ') ; Memo1.Lines.Add(' ') ; Showselection; end Else If (TErbe + Feld[j]) < Erbhaelfte Then begin If j < length(Feld) Then begin Selectiert[j]:= True ; SucheLoesung(j+1, Erbhaelfte, TErbe+Feld[j]) ; Selectiert[j]:= False ; end; end; end; end; begin If (Summieren mod 2) = 0 Then SucheLoesung(1, Summieren div 2, 0) Else Memo1.Lines.Add('Erbe nicht teilbar!') ; end; end. |
Re: Problem der Erbteilung ?
Der Code sieht gut aus. Ich denke, Zeile 34 (Selektiert[I] := False) könntest du dir sogar noch sparen, denn beim Auflösen der Inkarnationen geschieht dies sowieso.
|
Re: Problem der Erbteilung ?
Was mir noch aufgefallen ist:
Wenn eine Lösung gefunden wurde, wird die For-Schleife von j nicht abgebrochen. Selbst, wenn man nach 'ShowSelection' (Z. 72) Break oder Exit aufrufen würde, würde aber nur die aktuelle Inkarnation abgebrochen. In den unteren Inkarnationen wird die Schleife auf jeden Fall zuende (bis j = Length(Feld)) durchlaufen. Wie ließe sich das denn lösen? |
Re: Problem der Erbteilung ?
Zitat:
Der andere Punkt ist, bei so einem Problem kann man z.B. einer Funktion einen Rückgabewert geben, der anzeigt ob die Lösung gefunden wurde (auch ein globales Flag wäre denkbar), dann sollte man prüfen ob das Ergebnis eines Aufrufs gültig war und ggf. die weitere Ausführung des Aufrufs abbrechen. Noch wahrscheinlicher würde man aber aus dem Grund die Rekursion gerade vermeiden und sich für eine Iteration entscheiden Gruß Der Unwissende |
Re: Problem der Erbteilung ?
Also ist es richtig ? Bzw. könnt ihr den Code bestätigen ? =)
|
Re: Problem der Erbteilung ?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz