![]() |
Delphi-Version: 7
Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Hallo Delphi - Praxis,
Ich soll für die Schule die Pos - Funktion aus Delphi nachprogrammieren. Dafür soll ich nicht den Assembler benutzen(so etwas ist ja auch schon in der Code Libary). Leider funktioniert auf meinem Windows 7 die Delphihilfe auch nicht und an Sysutils oder an die Systemunit komme ich nicht dran. Mein Plan wäre jetzt über eine Schleife den String nach dem ersten Zeichen des Teilstrings durchsuchen zu lassen und dann zu prüfen ob die anderen Zeichen in der richtigen Reihenfolge dahinterstehen und nur dann die Position des ersten auszugeben. Die Frage ist nur wie ich das machen soll? Vll. fällt ja irgendwem eine Lösung dazu ein. |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
wo genau liegt jetzt dein Problem? Die Lösung hast du ja bereits beschreiben. Fertigen Code werden wir dir nicht geben. Wie sieht dein bisheriger Code aus und was funktioniert daran anders als erwartet?
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
moment da muss ich jetzt erst schaffen den code wieder von meinem Server zu ziehen
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
ist es denn wenigstens möglich mir einen Tipp zu geben welche Schleife ich am besten nehmen sollte
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Wenn wir dir jetzt sagen, dass es mit allen drei (for/repeat/while) geht, wirst du nicht wirklich glücklicher damit werden ;) Fang doch einfach mal mit einer davon an und überleg dir, wie es gehen könnte. Kommst du nicht weiter, dann poste hier und wir versuchen dir zu helfen.
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Überleg dir ja erstmal, wie du es "manuell" machen würdest.
Da könnte man sich nun Scrabble-Steine nehmen, daraus zwei "Strings" zusammenstellen und sich dann überlegen, wie man am einfachsten vorgeht. Dann schreibt man sich z.B. einen Ablauflan auf und versucht anschließend daraus einen Code zu entwickeln. Als Schleife(en) kann man sich nur für While oder For-To entscheiden. Repeat-Until ginge auch, aber es wäre hier wohl einfacher, wenn man die Schleifenbedingung erst prüft, bevor man darin was abarbeitet, aber zusammen mit einem If-Then ginge auch das Repeat. Außerdem kann man nun die Strings zeichenweise verglichen, über
Delphi-Quellcode:
, oder man geht z.B. über Copy oder Dergleichen.
s[i]
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Hier erstmal mein Quellcode:
function ipos (Const Substr : string; s : String) : integer; Var i,j : integer; begin ipos := 0; If (length(substr) = 1) then begin for i:=1 to length(s) if (s[i]= Substr) then ipos := i; end else If (length(substr) > 1) then begin for i:=1 to length(s) do if (s[i]= Substr[1]) then for j:=2 to length(substr) do if (substr[j] = s[i+1]) then ipos := i else ipos := -1; end; end; funktioniert so erstmal ganz gut, aufgrund der for-schleife gibt es nur ein Problem: es wird immer die letzte stelle geliefert an der etwas gefunden wurde. Wie kann ich denn die For - Schleife verlassen sobald der if-befehl erfüllt ist? |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Exit ?
PS: Setz dein Code mal in Delphi Tags und formatier ihn ordentlich^ |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Wohl eher
Delphi-Quellcode:
.
break
Delphi-Quellcode:
verlässt die gesamte Prozedur/Funktion
exit
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Er will doch auch die Methode verlassen wenn die if Bedingung erfüllt ist ?
Edit: hoan504, da fehlt ein "do" in deinem Code :D |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
der Index in der letzten If-Abfrage scheint auch nicht zu stimmen. mMn gehört da auf alle Fälle ein "j" mit hinein, nicht nur "i+1"
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Nach der letzten else Bedingung wäre auch Result:=0; richtig anstelle von Result:=-1;
Oder täusche ich mich ? |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Ich habe da mal einen möglichen Ablauf aufgeschrieben ...
Code:
// Beispiel-Daten
SubStr ist "test" // Länge 4 SuchStr ist "Dieses ist nur zum testen gedacht!" // Länge 34 // Das Ergebnis ist erst mal 0 Ergebnis = 0 Durchlaufen von 1 bis {Länge SuchStr=34} - {Länge SubStr=4} + 1 // also bis 31 TempStr = Hole {Länge SubStr} Zeichen von SuchStr ab der aktuellen Position Wenn TempStr = SubStr Dann Ergebnis = Aktuelle Position Durchlaufen abbrechen |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
an '187'
die -1 ist da nur anstatt 0 damit in meinem editfeld klar wird, dass sich das gesuchte ergebnis nicht im string befindet |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Und was ist dann der Unterschied zur 0 ? :D
Kein Ergebnis = 0 afaik :) Edit: Also es kommt jetzt drauf an..Wenn du die Pos Funktion nachbauen willst ist Kein Ergebnis = 0. Du dachtest wahrscheinlich das dass erste Vorkommnis = 0 ist, dem ist aber nicht so :) Oooder aber du willst dir eine Custom Pos Funktion bauen wobei das auch da kein Sinn macht :D Greetz |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
tja aber die die pos-funktion ist an mein programm angepasst, bzw. an edit felder angepasst. die 0 oder die -1 gibt nur an dass kein ergebnis gefunden wurde. Genauso gut hätte ich auch eine string ausgeben können.
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Naja das macht ja noch weniger Sinn :D
Wozu brauchst du -1 für "kein Ergebnis" wenn 0 dafür schon vorhanden ist :?: |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Code:
Gehört da nicht " 1 bis 34-4 +1" ?
Durchlaufen von 1 bis {Länge SuchStr=34} - {Länge SubStr=4} // also bis 30
Wenn man bei 30 anfängt, vergleicht man ja {30,31,32,33} es sollte jedoch mit 34 enden(wenn man bei 1 zu zählen beginnt; wäre 0 nicht sinnvoller?) |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
Und nein, bei 0 anfangen ist nicht sinnvoller, da ein String bei 1 anfängt und nicht bei 0. |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
ihr habt natürlich völlig recht, irgendwie habe ich das vorher garnicht bemerkt :wall:
allerdings versteh ich das mit dem teilstring vom ganzen string abziehen nicht so ganz |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Was genau meinst du damit :?: ?
Immer wenn ein Wort gefunden und umgedreht wurde wird der Satz Ausgangsatz natürlich verkürzt damit das nächste Wort gefunden werden kann. Sonst w+rde man immer das selbe Wort finden :) War das deine Frage? Edit: Hast du denn was eigenes geschrieben ? Zeig uns deinen Code :P |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
Wenn du von einem String nur einen Teil haben möchtest, dann nimmst du am besten die Funktion copy
Delphi-Quellcode:
// Copy( AString, APosition, ALänge ) -> liefert einen String zurück
ShowMessage( Copy( 'Hallo wie gehts?', 7, 3 ) ); // zeigt "wie" an // Der Parameter für die Länge kann auch weggelassen werden ShowMessage( Copy( 'Hallo wie gehts?', 7 ) ); // zeigt "wie gehts?" an |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
War der Meinung, ein String beginnt mit 0, ähnlich einem dyn. Array. Gut zu wissen :idea: |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Nein, Strings fangen immer bei 1 an.
Grund ist der "Urstring" aka ShotString. Dort ist bei [0] das Längenbyte und das erste Zeichen fing demnach bei 1 an. |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
ich versteh gar nicht wie wir auf einmal auf copy gekommen sind :gruebel:
eigentlich habe ich nur deinen ersten Programmartigen Code gemeint. Inzwischen funktioniert das Programm aber sowieso einwandfrei, dank der vielen Tipps. |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Zitat:
Break existiert nicht umsonst und damit kann man alle Schleifen abbrechen. |
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Aber omatas Lösung ist schöner, da man die Abbruchbedingung sofort sieht. Break ist eigentlich nur ein verstecktes goto und darüber müssen wir wohl nicht diskutieren. ;)
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Ich fand cool, daß Delphi Break und Exit auch mal als stille Exception löst, wenn es nicht anders gehn.
|
AW: Pos Routine nachprogrammieren ohne den Assembler zu benutzen?
Ja break ist hart :D Eine repeat/until bzw while/do Schleife ist aufjedenfall eleganter :)
Grade für eine Schulübung kann man das Problem mal mit jeder Schleife lösen :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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