Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#45

AW: Erstellung einer Funktion

  Alt 6. Jun 2021, 15:50
Zitat:
''function longestNumber(s : string) : word;
Sucht die längste Ziffernfolge (aus Ziffern von '0' bis '9') im String s. Gibt es mehrere gleich lange, wird davon die erste zurückgegeben. Sind keine Ziffern enthalten, gibt die Funktion den Wert 0 zurück.
Hinweis: Die längste Ziffernfolge muß nicht unbedingt die größte Zahl in s sein! Eine so gefundene Ziffernfolge darf auch mit einer oder mehreren '0' beginnen.''
Das verstehe ich nicht:

Eine Ziffernfolge darf mit Nullen beginnen, gut und schön.

Wenn ich als Rückgabewert Word verwende, so gehen führende Nullen verloren. Es kann somit als Word also nur der nummerische Wert der längsten Ziffernfolge zurückgegeben werden. Dabei muss es sich dann aber nicht zwingend um den größten Wert aus allen Ziffernfolgen handeln. a00000000001b65535c4812 gäbe dann 1 zurück, auch wenn die zweite Ziffernfolge einen größeren Wert repräsentiert.

Wenn der Rückgabewert 0 sein soll, sofern keine Ziffernfolge im String enthalten ist, wäre das Ergebnis der Funktion bei dem String a00000000000b0000c00 aber nicht mehr eindeutig, da hier ja die Ziffernfolgen alle (als numerische Werte dargestellt) 0 ergeben. Eine Unterscheidung zwischen "Keine Ziffernfolge im String enthalten." und "Die längste Ziffernfolge besteht nur aus Nullen.", wäre nicht mehr möglich.

Da der Rückgabewert der Funktion Word sein soll, würde die Routine bei der Zeichenfolge a1b99999 scheitern, da 99999 mehr ist, als mit dem Datentyp Word dargestellt werden kann.

Irgendwie ist mir die Aufgabenstellung zu unpräzise, bzw. fehlt zuviel Wissen über den Umfang des bisher vermittelten Stoffes.

Eine Möglichkeit als Ergebnis ein Word zu liefern und gleichzeitig die längste Ziffernfolge zu liefern ginge über Var-Parameter (aber da weiß ich nun garnichtmehr, ob Ihr das schon hattet und ich mit dem folgendem Lösungsvorschlag nunmehr für absolute Verwirrung sorge):
Delphi-Quellcode:
function longestNumber(s : string; var longNumStr : String) : word;
var
  run, number, longNum : Word;
  NumberStr : String;
  begin
    // Zu Beginn alle Variabeln initialisieren, um definierte Ausgangswerte zu haben.
    longNum := 0;
    longNumStr := '';
    number := 0;
    NumberStr := '';
    for run := 1 to length(s) do
    begin
      case s[run] of
       '0'..'9' : begin
                    inc(number);
                    NumberStr := NumberStr + s[run]; // Zusätzlich die Ziffer an den String anfügen.
                  end;
      else
        begin
          if number > longNum then
          begin
            longNum := number;
            LongNumStr := NumberStr; // den bisher längsten String speichern.
          end;
          number := 0;
          NumberStr := ''; // den String leeren.
        end;
      end;
    end;
    if number > longNum then
    begin
      longNum := number;
      LongNumStr := NumberStr; // den bisher längsten String speichern.
    end;
    longestNumber := longNum; // Länge der längsten Ziffernfolge zurückgeben.
  end;
Die Funktion benötigt beim Aufruf also zwei Parameter vom Typ String. Eine Ausgabe des Funktionsergebnisses über WriteLn wäre damit dann aber nichtmehr zielführend.
Delphi-Quellcode:
procedure printInfos(s: string);
var
  LongNum : Word;
  LongNumStr : String;
begin
  LongNum := longestnumber(s, LongNumStr);
  writeln('String: ', s, ' Ziffern: ', countDigits(s), ' Gerade: ',
    countEvenDigits(s), ' Ungerade: ', countOddDigits(s), ' Andere: ', countNonDigits(s),
    ' Längste: ',LongNumStr,' ist ',LongNum, ' Zeichen lang, Ohne: ',deleteDigits(s));
end;
Aber ist das jetzt wirklich noch im Umfang des bisher vermittelten Stoffes?
Und ist es überhaupt noch eine akzeptable Lösung?
  Mit Zitat antworten Zitat