AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Erstellung einer Funktion

Ein Thema von Mo53 · begonnen am 3. Jun 2021 · letzter Beitrag vom 10. Jun 2021
Antwort Antwort
Seite 3 von 6     123 45     Letzte » 
Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Erstellung einer Funktion

  Alt 4. Jun 2021, 09:17
Kanns grad nicht testen, aber in deiner repeat - Schleife löschst Du ein Zeichen deines Strings wenn es sich um eine Ziffer handelt und verkürzt anschließend deinen Zähler (run) trotzdem noch um 1. Somit überspringst du für den Fall, dass du bereits vorher eine Ziffer gelöscht hast, ein Zeichen in deinem string.
Delphi-Quellcode:
while endNotFound do
 begin
    repeat
      case s[run] of
        '0' .. '9': delete(s,run,1);
      end;
      dec(run);
    until run = 0 ;
   endNotFound := TRUE;
   end;
Ich würde das ganze mit einer for..do - Schleife lösen
Delphi-Quellcode:
for i = length(s) downto 0 do
  begin
  //prüfe hier, ob das betreffende Zeichen eine Ziffer ist, wenn ja. lösche es
  //damit prüfst du tatsächlich alle Zeichen deines Strings und überspringst durch das löschen keines
  end
Wie gesagt, ungetestet.

Edit:
Mist, zu langsam getippt
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#22

AW: Erstellung einer Funktion

  Alt 4. Jun 2021, 09:39
Delphi-Quellcode:
while endNotFound do
 begin
  repeat
   case s[run] of
    '0' .. '9': delete(s,run,1);
   end;
   
   dec(run);
  until run = 0 ;

  endNotFound := TRUE;
 end;
Fällt dir denn da nichts auf, warum es nicht funktioniert?
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#23

AW: Erstellung einer Funktion

  Alt 4. Jun 2021, 11:35
Ich hatte vergessen zu erwähnen das das Problem eine Fehlermeldung in der Ausgabe unten ist bei
Delphi-Quellcode:
''procedure printInfos(s: string);
begin
  writeln('String: ', s, ' Ziffern: ', countDigits(s), ' Gerade: ',
    countEvenDigits(s), ' Ungerade: ', countOddDigits(s), ' Andere: ', countNonDigits(s),
    ' Längste: ',longestnumber(s),' Ohne: ',deleteDigits(s));
end;
Die Fehlermeldung wird genau bei 'deleteDigits(s) angezeigt und lautet: E2054 Ungültiger Typ in write/writeln Anweisung.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: Erstellung einer Funktion

  Alt 4. Jun 2021, 11:54
Zitat:
Die Fehlermeldung wird genau bei 'deleteDigits(s) angezeigt und lautet: E2054 Ungültiger Typ in write/writeln Anweisung.
Schau mal genau hin.
von countDigits(s) bis longestnumber(s) hast du FUNKTIONEN, die etwas zurückgeben.
Diese Rückgabe kann Writeln darstellen.
Dein deleteDigits(s) ist aber nur eine PROZEDUR, die nichts zurückgibt, also kein Result hat.
Demzufolge kann Writeln nichts damit anfangen.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.377 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Erstellung einer Funktion

  Alt 4. Jun 2021, 15:09
Debuggen ist nicht erlaubt?
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#26

AW: Erstellung einer Funktion

  Alt 5. Jun 2021, 00:06
Ok hab das mit der Fehlermeldung gelöst, ich würde jetzt gerne dafür sorgen das diese Funktion nicht mehr die Anzahl der längsten Ziffernfolge ausgibt sondern die längste Ziffernfolge selbst, anscheinend ist es schwerer als gedacht oder übersehe ich einfach etwas

Delphi-Quellcode:
function longestNumber(s: string): byte;
var
  run, number, longNum: byte;
begin
  longNum := 0;
  number := 0;
  for run := 1 to length(s) do
  begin
    case s[run] of

      '0' .. '9':
        inc(number)

    else
      begin
        if number > longNum then
          longNum := number;
        number := 0;
      end;
    end;
  end;
  if number > longNum then
  begin
    longNum := number;
    longestNumber := longNum;
  end;
end;
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Erstellung einer Funktion

  Alt 5. Jun 2021, 09:26
Naja, momentan speicherst Du halt die Länge der längsten Nummer und gibst dann eine Zahl (Byte) zurück.

An der Stelle, an der Du Dir die längste Nummer merkst, musst Du Dir dann wohl "einfach" nur diese Nummer merken und diese dann zurückgeben. Da es sich bei den Nummern um Zeichenfolgen handelt, wird der Rückgabewert wohl besser ein String sein, damit auch (wie oben gefordert) führende Nullen erhalten bleiben.

Die grundsätzliche Logik ist aber identisch.

Achso: Bei Deiner derzeitigen Variante wird das Ergebnis nicht immer richtig sein. Es dürfte nur dann stimmen, wenn zufällig die letzte Ziffernfolge länger als die zuvor gemerkten Länge ist und die Zeichenfolge auf jeden Fall mit einer Ziffer endet.

Mein grober Test ergab:
Code:
a -> 00000
a1a -> 00000
a22aa333aa -> 00000
a22a333a22aa -> 00000
123 -> 00003
a11111a -> 00000
a1 -> 00001
a1aa22aaa333 -> 00003
aaaa4444aaaaa55555aaaaaa -> 00000
1234567890aaaaaaaaaa -> 00000
Von 10 Testfällen sind weniger als 50% richtig. Da ist noch Luft nach oben
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#28

AW: Erstellung einer Funktion

  Alt 5. Jun 2021, 11:58
@Delphi.Narium es soll die längste Ziffernfolge (Zahlenfolge) ausgegeben werden, irrelevant ist dabei die Größe der einzelnen Zahlen.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.400 Beiträge
 
Delphi 7 Professional
 
#29

AW: Erstellung einer Funktion

  Alt 5. Jun 2021, 12:13
@Delphi.Narium es soll die längste Ziffernfolge (Zahlenfolge) ausgegeben werden, irrelevant ist dabei die Größe der einzelnen Zahlen.
Ja, das ist klar.

Und wie lang ist bei 1234567890aaaaaaaaaa -> 00000 die längste Ziffernfolge?

Deine Routine sagt: Die Länge der längsten Ziffernfolge ist 0. Das ist wohl kaum richtig.

Bei Deiner Routine wäre auch bei 0000000000aaaaaaaaaa die Länge der längsten Ziffernfolge = 0, ebenso bei 9999999999aaaaaaaaaa und selbst bei 0 (hier bitte eine unendliche Anzahl von Nullen einfügen) 0a wäre die Länge = 0.

Oder anders: Das Ergebnis Deiner Rouitne entspricht nicht der von Dir genannten Vorgabe:
Zitat:
es soll die längste Ziffernfolge (Zahlenfolge) ausgegeben werden, irrelevant ist dabei die Größe der einzelnen Zahlen.
Das Ergebnis der jetzigen Routine zur Längenermittlung ist schlicht und einfach falsch. Wird diese Routine nun so geändert, dass statt der Länge der längsten Ziffernfolge die längste Ziffernfolge zurückgegeben wird, bleibt das Ergebnis trotzdem falsch. Deine Logik enthält einen grundsätzlichen Fehler.

Der Fehler war übrigens in Deinem Post https://www.delphipraxis.net/1490636-post18.html noch nicht enthalten.
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#30

AW: Erstellung einer Funktion

  Alt 5. Jun 2021, 12:24
Der Fehler war übrigens in Deinem Post https://www.delphipraxis.net/1490636-post18.html noch nicht enthalten.
Achso Danke für den Hinweis, dann war der Fehler wohl das Begin und End, ich weiß ehrlich gesagt auch nicht mehr wie es den Weg dahin gefunden hat
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz