Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahlen zusammenfassen (https://www.delphipraxis.net/61023-zahlen-zusammenfassen.html)

HariboHunter 16. Jan 2006 07:29


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:

Kroko1999 16. Jan 2006 07:50

Re: Zahlen zusammenfassen
 
Delphi-Quellcode:
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;
sollte klappen ungetestet

Ferber 16. Jan 2006 10:22

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;

Kroko1999 16. Jan 2006 12:56

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;

stoxx 16. Jan 2006 13:26

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.

marabu 16. Jan 2006 13:42

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

stoxx 16. Jan 2006 14:05

Re: Zahlen zusammenfassen
 
ah, dann hab ich das falsch verstanden :-) alles klar .. sorry
sollte ja kein problem sein, irgendein geposteter Algorithmus sollte schon funktionieren ;-)

HariboHunter 17. Jan 2006 12:37

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