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?