![]() |
Problem mit einem "leeren" String
Hallo zusammen.
Ich habe für die Schule ein Programm zu schreiben das die Anzahl der Ziffern eines Strings angibt. Es funktionniert auch soweit, jedoch schlägt es fehl wenn der Benutzer nichts eingibt, sprich gleich Enter drückt anstelle einen String einzugeben, obwohl das Programm dann 0 als Antwort geben sollte. Wäre sehr nett wenn mir wer meinen Fehler aufzeigen könnte. :) Grüße diavy
Code:
program ex53;
{$APPTYPE CONSOLE} uses SysUtils; var a:string; function countthenumbers(a:string):integer; var x,i:integer; begin x:=0; i:=1; while a[i]<>'' do begin if ((a[i]='0') or (a[i]='1') or (a[i]='2') or (a[i]='3') or (a[i]='4') or (a[i]='5') or (a[i]='6') or (a[i]='7') or (a[i]='8') or (a[i]='9')) then x:=x+1; i:=i+1; end; result:=x; end; begin { TODO -oUser -cConsole Main : Insert code here } writeln('Please enter a string:'); readln(a); writeln('The amount of numbers in your string is:',countthenumbers(a)); readln; end. |
AW: Problem mit einem "leeren" String
Dein Problem wird wohl bei der While-Bedingung sein.
Delphi-Quellcode:
Wenn der String a leer ist gibt es nicht das Element auf welches du mit a[i] zugreifen willst.
while a[i]<>'' do
Daher müsstest du die Schleife nicht ausführen wenn der String leer ist. z.B.:
Delphi-Quellcode:
Setzt aber vorraus, dass die Compileroption "Complete Boolean Eval" aus ist.
while (a<>'') and (a[i]<>'') do
Besser ist es, wenn du ein "Foreach" verwendest. Das setzt aber ein Delphi ab Version 2007 vor raus. |
AW: Problem mit einem "leeren" String
Prüfe in deiner Funktion countthenumbers ob deine variable a
etwas enthält oder nicht. dafür wäre dann eine abfrage mit if-then-else nicht schlecht... also ungefähr so:
Delphi-Quellcode:
if a = leer then
begin result := 0; abruch der schleife end else begin dein normaler code... end; Gruß Steku |
AW: Problem mit einem "leeren" String
Zitat:
Die Abfrage hätte also eher
Delphi-Quellcode:
lauten müssen.
while i <= Length(a) do
Oder du nimmst eine For-Schleife, bzw. die bereits erwähnte ForEach For-In-Schleife. Die Schleife
Delphi-Quellcode:
ohne weitere Abbruchbedingenen entspricht natürlich genau einer For-Schleife.
i:=1;
while i <= Length(a) do begin i:=i+1; end;
Delphi-Quellcode:
for i := 1 to Length(a) do
begin end; Tipps:
Delphi-Quellcode:
Und bezüglich des Themas Codevormatierung, speziell die Code-Einrückung, würde ich dir anraten dort dringend eine Verbesserung einzuführen.
if ((a[i]='0') or (a[i]='1') or (a[i]='2') or (a[i]='3') or (a[i]='4') or (a[i]='5') or (a[i]='6') or (a[i]='7') or (a[i]='8') or (a[i]='9')) then x:=x+1;
// verkürzt if a[i] in ['0'..'9'] then Inc(x); |
AW: Problem mit einem "leeren" String
Unter neueren Delphis geht auch eine for-in-Schleife.
Delphi-Quellcode:
Wobei der Compiler da ggf. auch eine Warnung ausgibt, je nach Version.
function countthenumbers(const a:string):integer;
var c: char; begin Result := 0; for c in a do if c in ['0'..'9'] then inc(Result); end; |
AW: Problem mit einem "leeren" String
Zu erst einmal vielen Dank für eure Antworten!
Also die Methode mit
Code:
hat leider nicht geklappt.
while (a<>'') and (a[i]<>'')
Zitat:
Zitat:
Zitat:
Vielen Dank für den Tip mit:
Code:
Ich hab mir schon gedacht dass das doch irgendwie kürzer gehen MUSS. :D
if a[i] in ['0','1','2','3','4','5','6','7','8','9'] then
Die Funktion length soll ich atm noch vermeiden wurde mir gesagt. Trotzdem danke! Zitat:
Liebe Grüße und nochmal Danke! |
AW: Problem mit einem "leeren" String
Zitat:
Wie lautet denn der Felher? (PS: man kann unten in den Meldungen und auch bei Messageboxen das Strg+C benutzen) Das for-in geht intern alle Felder des Arrays oder einer Liste durch (alles was einen Enumerator implementiert hat) und schreibt jeweils das aktuelle Feld in die Schleifenvariable.
Delphi-Quellcode:
Das Const ist für eine Codeoptimierung, da man so den Parameter als konstant deklariert und somit Delphi keine Kopie anlegen muß.
var
s: string; c: char; i: Integer; begin for c in s do begin if c ... then end; for i := 1 to Length(s) do begin c := s[i]; if c ... then end; Praktisch das Gegenteil von einem Var-Parameter, welcher als veränderlich definiert wird und wo man auch noch sagt, daß die beim Aufruf an diesen Parameter übergebene Variable verändert wird. |
AW: Problem mit einem "leeren" String
Also ich hab's mal mit der for .. in-Schleife probiert und das hat nicht hingehauen.
Code:
--> [Error] ex53.dpr(16): Operator not applicable to this operand type
program ex53;
{$APPTYPE CONSOLE} uses SysUtils; var a:string; function countthenumbers(a:string):integer; var x:integer; c:char; begin x:=0; for c in a do if c in ['0','1','2','3','4','5','6','7','8','9'] then x:=x+1; result:=x; end; begin { TODO -oUser -cConsole Main : Insert code here } writeln('Please enter a string:'); readln(a); writeln('The amount of numbers in your string is:',countthenumbers(a)); readln; end. --> [Error] ex53.dpr(17): Incompatible types: 'Boolean' and 'procedure, untyped pointer or untyped parameter' --> [Error] ex53.dpr(19): Expression expected but 'END' found |
AW: Problem mit einem "leeren" String
For-In gibt es erst ab Delphi 2006 / Turbo Delphi.
PS: Es gibt auch einen [delphi]-Tag, für die Codes. Und 'ne halbwegs ordentliche Codeformatierung macht das alles bestimmt lesbarer. |
AW: Problem mit einem "leeren" String
Zitat:
Zitat:
MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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 by Thomas Breitkreuz