![]() |
AW: Erstellung einer Funktion
Kann man das denn so regeln das die längste Ziffernfolge auf Basis des Strings bestimmt wird aber ein word-Wert zurückgegeben wird also z.B. wenn die längste Ziffernfolge 012 ist wird eine 12 zurückgegeben ?
|
AW: Erstellung einer Funktion
Ja, aber die hier genannten führenden Nullen gehen dabei verloren:
Zitat:
Nur: Soll die längste Ziffernfolge zurückgegeben werden oder ihr nummericher Wert? Die Frage ist also: Was ist jetzt bitteschön die Aufgabenstellung und welche Syntaxelemente wurden bisher im Lehrstoff vermittelt und welche Syntaxelemente dürfen für die Lösung der Aufgabe verwendet werden? Soll das Problem mit while, for, repeat, if und / oder case gelöst werden, dürfen Arrays genutzt werden, ist die Nutzung von Zeigern erlaubt? Dürfen alle delphiseitig möglichen Datentypen genutzt werden oder nur die bisher im Lehrstoff vermittelten? Sind Typkonvertierungen (beliebiger Form) Teil des Unterrichtsstoffes, ...? Sprich: Darf alles genutzt werden, was mit Delphi möglich ist oder gibt es irgendwelche klar definierten Vorgaben?
Delphi-Quellcode:
Und ja: Unter Performanzgesichtspunkten mag das eventuell (messbar?) langsamer sein. Und mit PChar und Zeigern geht es eventuell auch eleganter, ...
// function longestNumber(s : string) : byte;
// Rückgabetype der Funktion ändern, da ja eine Zeichenfolge zurückgegeben werden soll. function longestNumber(s : string) : String; var run, number, longNum : byte; NumberStr, longNumStr : String; // zwei zusätzliche Variabeln. 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; // zusätzlich den bisher längsten String speichern. end; number := 0; NumberStr := ''; // zusätzlich den String leeren. end; end; end; if number > longNum then begin longNum := number; LongNumStr := NumberStr; // zusätzlich den bisher längsten String speichern. end; // longestNumber := longNum; // Da eine Zeichenfolge zurückgegeben werden soll und der Typ der Funktion // entsprechend geändert wurde, geben wir hier die Zeichenfolge zurück. longestNumber := longNumStr; end; Frage ist nur: Was bitte wurde bisher im Unterricht vermittelt und kann von daher für die Lösungssuche zur Anwendung kommen? |
AW: Erstellung einer Funktion
Zitat:
Beachtet bei der Entwicklung die vorgesehene Reihenfolge (s.u.): Erstellt ERST die Testfälle und DANN die eigentlichen Funktionen und Prozeduren! Somit macht Ihr Euch rechtzeitig vorab Gedanken, was genau eine Funktion/Prozedur können soll und schreibt nicht unnötig viel Quellcode. Zusätzlich zum Hauptprogramm sind mehrere Prozeduren und Funktionen zu erstellen Eine davon ist ''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.'' bei der ich Probleme habe, das restliche Programm und die restlichen sechs Funktionen/Prozeduren sind fertig. Arrays dürfen nicht verwendet werden und die vorgegebene Funktion ''function longestNumber(s : string) : word'' darf nicht verändert werden also der Datentyp word muss word bleiben. Ansonsten ist es uns überlassen was wir verwenden. :) |
AW: Erstellung einer Funktion
Zitat:
Zitat:
Zur Performance: Deine Lösung hängt v.a. wegen NumberStr := NumberStr + s[run]; erheblich vom Eingabewert ab und ist v.a. wegen dieser Zeile etwas komplexer: Wenn in den 1000 x "1Mio-Strings Aufrufen" die Eingabe gar keine Ziffern enthält liegt meine bei 990ms und deine bei 4400ms. Bei 60% Ziffern 4,3sec, deine 31sec. Wenn nur Ziffern vorkommen, dann liegt meine bei 1.6sec und deine bei (erwartet hohen) 40sec. NumberStr := NumberStr + s[run]; ist unnötig und langsam. mo soll sich nur Start und Länge des jeweiligen Maximums merken. Das reicht um am Ende der Suche die längste Ziffernfolge zu "berechnen" (entweder mit Copy oder wenn Copy nicht erlaubt ist mit for i:= start to ...) und auszugeben. Nebenbei: Wegen run: Byte kann deine Routine nur kurze Strings verarbeiten. Zitat:
![]() Ich bin hier raus. Viel Spass bei den weiteren Hausaufgaben. Ich freue mich bereits aufs nächste Wochenende. |
AW: Erstellung einer Funktion
Zitat:
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.
Delphi-Quellcode:
gäbe dann 1 zurück, auch wenn die zweite Ziffernfolge einen größeren Wert repräsentiert.
a00000000001b65535c4812
Wenn der Rückgabewert 0 sein soll, sofern keine Ziffernfolge im String enthalten ist, wäre das Ergebnis der Funktion bei dem String
Delphi-Quellcode:
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.
a00000000000b0000c00
Da der Rückgabewert der Funktion Word sein soll, würde die Routine bei der Zeichenfolge
Delphi-Quellcode:
scheitern, da 99999 mehr ist, als mit dem Datentyp Word dargestellt werden kann.
a1b99999
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:
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.
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;
Delphi-Quellcode:
Aber ist das jetzt wirklich noch im Umfang des bisher vermittelten Stoffes?
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; Und ist es überhaupt noch eine akzeptable Lösung? |
AW: Erstellung einer Funktion
var parameter hatten wir, dürfen wir auch verwenden, wir hatten so gut wie alles außer arrays.
Nur das Problem ist das wir die Funktion nicht verändern dürfen, also auch keinen neuen Parameter rein. |
AW: Erstellung einer Funktion
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zu "#37 liefert wie in #26 verlangt den String, #38 die Position" Nee, #28 liefert die Länge der Ziffernfolge Um die Ziffernfolge selbst zu liefern, bedarf es einiger kleiner Änderungen. Hier die Funktion, die die Ziffernfolge liefert
Delphi-Quellcode:
Zu "muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss"
FUNCTION LongestCipherSequence(const S:String):String;
var MaxLen:Integer; P,PS,PSMax,PStart:PChar; begin MaxLen:=0; PStart:=PChar(S); P:=PStart; if P<>Nil then repeat case P^ of #0 : Break; '0'..'9' : begin PS:=P; Inc(P); while P^ in ['0'..'9'] do Inc(P); if P-PS>MaxLen then begin MaxLen:=P-PS; PSMax:=PS; end; end; else Inc(P); end; until False; if MaxLen=0 then Result:='' else Result:=Copy(S,PSMax-PStart+1,MaxLen); end; Nee, stimmt nicht. Beim While wird ebenfalls bei jedem Zeichen geprüft, ob I >= len_s ist. Vom Zeitaufwand her macht das keinen Unterschied. Ich habe mal kurz das Zeitverhalten getestet. Gleiche Größenordung bei beiden Funktionen. Ergebnis siehe Anhang: Man könnte das Zeitverhalten noch optimieren: Wenn bereits eine Ziffernfolge gefunden wurde, kann man beim Finden der nächsten Ziffer prüfen, ob das Zeichen an P+Maxlen eine Ziffer ist. Wenn nicht, kann die Ziffernfolge nicht länger sein, als die bisher längste. Dann kann man P = P+MaxLen setzen, muss also nicht jedes Zeichen separat prüfen. Das lohnt sich aber nur, wenn wirklich lange Strings mit vielen Ziffern geprüft werden sollen, ansonsten wird das eher zu einem höheren Zeitbedarf führen.
Delphi-Quellcode:
PROCEDURE TMain.Test;
const Lines=10000; MaxLen=200; Rnd=12; Count=1000; var I,J,Len:Integer; T0,T1,T2:Cardinal; S:String; List:TStrings; begin List:=TStringList.Create; for I:=1 to Lines do begin Len:=Random(MaxLen); SetLength(S,Len); for J:=1 to Len do S[J]:=Char(Random(Rnd)+Ord('0')); List.Add(S) end; T0:=GetTickCount; for I:=1 to Count do for J:=0 to List.Count-1 do LongestCipherSequence(List[J]); T1:=GetTickCount; for I:=1 to Count do for J:=0 to List.Count-1 do LaengsteZiffernFolgeDerWelt(List[J]); T2:=GetTickCount; ShowMessage(IntToStr(T1-T0)+' LongestCipherSequence'#13+ IntToStr(T2-T1)+' LaengsteZiffernFolgeDerWelt'); List.Free; end; |
AW: Erstellung einer Funktion
Dann fällt mir nurnoch dashier ein:
Delphi-Quellcode:
function longestNumber(s : string) : word;
var run, number, longNum : Word; NumberStr : String; longNumStr : 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 LongNumStr := NumberStr; // den bisher längsten String speichern. end; longestNumber := StrToInt(longNumStr); // längste Ziffernfolge als Zahl zurückgeben. end; |
AW: Erstellung einer Funktion
Zitat:
Also nimm eine der beiden Funktionen (besser die untere), ändere den Namen auf "longestNumber", beim Parameter entferne das "const" und ändere das Funktionsergebnis auf "Word". Stellt sich mir die Frage, was passiert, wenn du einen String übergibst, bei dem die längste Ziffernfolge mehr als 65535 Ziffern hat. Und so etwas im Fach Informatik. |
AW: Erstellung einer Funktion
Noch eine Variante zur Denksportaufgabe:
Delphi-Quellcode:
function longestNumber(s : string) : word;
var L1, L2, N: Word; c: Char; i: Integer; begin Result := 0; L1 := 0; L2 := 0; N := 0; for c in s do begin {Zeichen in Ziffern-Wert umwandeln} i := Ord(c) - Ord('0'); if (i >= 0) and (i <= 9) then begin {c enthält eine Ziffer, an dieser Stelle eventuell Ergenisüberlauf prüfen} N := N * 10 + i; L2 := L2 + 1; {Länge des Zwischenergebnis vergleichen und eventuell als Endergebnis übernehmen} if L2 > L1 then begin Result := N; L1 := L2; end; end else begin {c enthält keine Ziffer} N := 0; L2 := 0; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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