Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zählen mit dem Alphabet (https://www.delphipraxis.net/62809-zaehlen-mit-dem-alphabet.html)

trifid 9. Feb 2006 19:19


Zählen mit dem Alphabet
 
Habe folgende Funktion

Delphi-Quellcode:
   function ErhoeheBuchstabe (sNummer : String) : String;
   begin
      if Length (sNummer) = 1 then
      begin
         if sNummer = 'Z' then
         begin
            sNummer := 'AA';
         end else begin
            sNummer := Chr(Ord(sNummer[1]) + 1);
         end;
      end;
      if Length (sNummer) = 2 then
      begin
         if sNummer[2] = 'Z' then
         begin
            if sNummer[1] = 'Z' then
            begin
               sNummer := 'AAA';
            end else begin
               sNummer := Chr(Ord(sNummer[1]) + 1) + 'A';
            end;
         end else begin
            sNummer[2] := Chr(Ord(sNummer[2]) + 1);
         end;
      end;
      ErhoeheBuchstabe := sNummer;
   end;
die über "Buchstaben" hochzählen soll.

aus A wird B
aus S wird T
aus Z wird AA
aus AS wird AT
aus AZ wird BA
aus YT wird YU
aus ZZ wird AAA

Geht das allgemeiner und elleganter ?

idontwantaname 9. Feb 2006 19:53

Re: Zählen mit dem Alphabet
 
Ja, und zwar durch eine Rekursion
Delphi-Quellcode:
function ErhoeheBuchstabe(const Str: String): String;
var
  Index: Integer;
  Temp: String;
begin
  Temp := UpperCase(Str);
  Index := Length(Temp);
  if(Succ(Ord(Temp[Index])) <= Ord('Z')) then
  begin
    Temp[Index] := Chr(Succ(Ord(Temp[Index])));
    Result := Temp;
  end else
    if(Index > 1) then
      Result := ErhoeheBuchstabe(Copy(Temp, 1, Index-1)) + 'A'
    else
      Result := 'AA';
end;

trifid 9. Feb 2006 20:02

Re: Zählen mit dem Alphabet
 
@idontwantaname
Danke.
Wenn man's weiss - ist es einfach

xaromz 9. Feb 2006 22:24

Re: Zählen mit dem Alphabet
 
Hallo,

hier noch eine Lösung ohne Rekursion:
Delphi-Quellcode:
function ErhoeheBuchstabe(const Str: String): String;
var
  L, Index: Integer;
  C: Integer;
begin
  Result := UpperCase(Str);
  L := Length(Result);
  Index := L;

  while Index > 0 do
  begin
    if Result[Index] < 'Z' then
    begin
      Inc(Result[Index]);
      for C := Index + 1 to L do
        Result[C] := 'A';
      Exit;
    end else
      if Index = 1 then
      begin
        Result := DupeString('A', L + 1);
        Exit;
      end;
    Dec(Index);
  end;
  Result := 'A';
end;
Benötigt die Unit StrUtils.

Ist ca. 1/3 schneller, da nicht jedesmal zusätzliche Strings benötigt werden. Startet bei leerem String einfach mit A.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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