![]() |
Zahlen zusammenfassen
Moin DP.
Ich möchte euch nun mit einem kleinen Problem belästigen, welches auf den ersten Blick trivial erscheint und dies vieleicht auch ist, ich aber schon etliche Stunden erfolglos darüber gebrütet hab. :wall: Also: Ich habe einen String mit Jahreszahlen, chronologisch sortiert, aber nicht unbedingt aufeinanderfolgend. z.B. 1982, 1985, 1986, 1987, 1990, 1992, 1993, 1995, 1996, 1997 nun möchte ich diese Zahlen welche aufeinanderfolgen, zusammenfassen so das die Sache hinterher so aussieht. 1982, 1985-1987, 1990, 1992-1993, 1995-1997 Irgendwie schaff ich es aber nicht die Sache in eine Schleife reinzupacken. :stupid: |
Re: Zahlen zusammenfassen
Delphi-Quellcode:
sollte klappen ungetestet
var
I,L,Start: Integer; B: Boolean; begin B := False; L := A[Low(A)]; //das erste Jahr for I := Low(A)+1 to High (A) do begin if A[I]=L+1 then begin B := True; Start := L end else begin if B then //von Start bis L else // nur L B := False; end; L := A[I] end; end; |
Re: Zahlen zusammenfassen
@Koroko1999: Glaube nicht, daß das funzt.
Das ist getestet:
Delphi-Quellcode:
function Zusammenfassen(st:String):String;
var sl:TStringlist; i,j:Integer; begin Result:=''; sl:=TStringlist.Create; sl.CommaText:=st; if sl.Count>0 then begin i:=0; Result:=sl.Strings[0]; for j:=1 to sl.Count-1 do if StrToInt(sl.Strings[j])<>StrToInt(sl.Strings[j-1])+1 then begin if (j-i)>1 then Result:=Result+'-'+sl.Strings[j-1]+', '+sl.Strings[j] else Result:=Result+', ' +sl.Strings[j]; i:=j; end; if (j-i)>1 then Result:=Result+'-'+sl.Strings[j-1] end; sl.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text:=Zusammenfassen(Edit1.Text); end; |
Re: Zahlen zusammenfassen
Stimmt, klappt nicht ganz, aber so
Delphi-Quellcode:
var
A: array[0..9] of Word; I,L,Start: Integer; B: Boolean; procedure _Entry; begin if B then Result := Result+IntToStr(Start)+'-'+IntToStr (L)+', ' else Result := Result+IntToStr(L)+', '; B := False; end; begin Result := ''; a[0] := 1982; a[1] := 1985; a[2] := 1986; a[3] := 1987; a[4] := 1990; a[5] := 1992; a[6] := 1993; a[7] := 1995; a[8] := 1996; a[9] := 1998; B := False; L := A[Low(A)]; //das erste Jahr for I := Low(A)+1 to High (A) do begin if A[I]=L+1 then begin if not B then Start := L; B := True; end else _Entry; L := A[I] end; _Entry; end; |
Re: Zahlen zusammenfassen
Hi, Du solltest Deine Aufgabenstellung erstmal richtig definieren.
Du fasst 85 und 87 zusammen, aber woher soll das Programm bitteschön wissen, dass Du 1990-1992 gerade NICHT zusammenfassen willst. Du solltest Dir erstmal Deine Regeln definieren und überlegen, was Du überhaupt machen willst. |
Re: Zahlen zusammenfassen
Na ja, einen Bereich bildet man ab drei aufeinander folgenden Zahlen - das Beispiel scheint da keine Ausnahme zu machen. Aber grundsätzlich begrüße auch ich explizite Anforderungen.
Grüße vom marabu |
Re: Zahlen zusammenfassen
ah, dann hab ich das falsch verstanden :-) alles klar .. sorry
sollte ja kein problem sein, irgendein geposteter Algorithmus sollte schon funktionieren ;-) |
Re: Zahlen zusammenfassen
Delphi-Quellcode:
function Zusammenfassen(st:String):String;
var sl:TStringlist; i,j:Integer; begin Result:=''; sl:=TStringlist.Create; sl.CommaText:=st; if sl.Count> 1 then // 0 durch 1 ersetzt begin i:=0; Result:=sl.Strings[0]; for j:=1 to sl.Count-1 do if StrToInt(sl.Strings[j])<>StrToInt(sl.Strings[j-1])+1 then begin if (j-i)>1 then Result:=Result+'-'+sl.Strings[j-1]+', '+sl.Strings[j] else Result:=Result+', ' +sl.Strings[j]; i:=j; end; if (j-i)>1 then Result:=Result+'-'+sl.Strings[j-1] end; sl.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text:=Zusammenfassen(Edit1.Text); end; jetzt funktioniert es wunderbar, Frage Beantwortet, Patient sehr glücklich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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