Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Problem mit einem "leeren" String (https://www.delphipraxis.net/168053-problem-mit-einem-leeren-string.html)

diavy 2. Mai 2012 16:06

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.

generic 2. Mai 2012 16:14

AW: Problem mit einem "leeren" String
 
Dein Problem wird wohl bei der While-Bedingung sein.
Delphi-Quellcode:
while a[i]<>'' do
Wenn der String a leer ist gibt es nicht das Element auf welches du mit a[i] zugreifen willst.

Daher müsstest du die Schleife nicht ausführen wenn der String leer ist.

z.B.:
Delphi-Quellcode:
while (a<>'') and (a[i]<>'') do
Setzt aber vorraus, dass die Compileroption "Complete Boolean Eval" aus ist.
Besser ist es, wenn du ein "Foreach" verwendest.
Das setzt aber ein Delphi ab Version 2007 vor raus.

Steku 2. Mai 2012 16:15

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

himitsu 2. Mai 2012 16:18

AW: Problem mit einem "leeren" String
 
Zitat:

Delphi-Quellcode:
while a[i]<>'' do

Da ein Char immer ein Zeichen ist, kann es nicht "keine Zeichen" sein.

Die Abfrage hätte also eher
Delphi-Quellcode:
while i <= Length(a) do
lauten müssen.
Oder du nimmst eine For-Schleife, bzw. die bereits erwähnte ForEach For-In-Schleife.


Die Schleife
Delphi-Quellcode:
i:=1;
while i <= Length(a) do
begin

  i:=i+1;
end;
ohne weitere Abbruchbedingenen entspricht natürlich genau einer For-Schleife.
Delphi-Quellcode:
for i := 1 to Length(a) do
begin

end;

Tipps:
Delphi-Quellcode:
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);
Und bezüglich des Themas Codevormatierung, speziell die Code-Einrückung, würde ich dir anraten dort dringend eine Verbesserung einzuführen.

DeddyH 2. Mai 2012 18:15

AW: Problem mit einem "leeren" String
 
Unter neueren Delphis geht auch eine for-in-Schleife.
Delphi-Quellcode:
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;
Wobei der Compiler da ggf. auch eine Warnung ausgibt, je nach Version.

diavy 2. Mai 2012 20:49

AW: Problem mit einem "leeren" String
 
Zu erst einmal vielen Dank für eure Antworten!

Also die Methode mit
Code:
while (a<>'') and (a[i]<>'')
hat leider nicht geklappt.

Zitat:

Code:
function countthenumbers(const a:string):integer;

- wozu dient hier das const? Ist es nötig/hilfreich?

Zitat:

Code:
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;

Dies Methode mit c verstehe ich nicht ganz. Woher weiß das Programm wo bzw was c ist? Man definiert ja bloß die art der Variable (char). Dass dieser in einem String liegen kann ist logisch, es ist mir jedoch unbekannt woher das Programm auf diese Weise wissen soll wo es die Kondition kontrollieren soll.

Zitat:

abruch der schleife
- Wie? Ich habe dies gegoogelt und den Befehl "break" gefunden. Wenn ich ihn jedoch an jener Stelle verwende lautet die Fehlermeldung: "[Error] ex53.dpr(17): BREAK or CONTINUE outside of loop"

Vielen Dank für den Tip mit:
Code:
if a[i] in ['0','1','2','3','4','5','6','7','8','9'] then
Ich hab mir schon gedacht dass das doch irgendwie kürzer gehen MUSS. :D

Die Funktion length soll ich atm noch vermeiden wurde mir gesagt. Trotzdem danke!

Zitat:

Da ein Char immer ein Zeichen ist, kann es nicht "keine Zeichen" sein.
- Aber demnach wäre meine Schleife doch eine Endlos-Schleife?

Liebe Grüße und nochmal Danke!

himitsu 2. Mai 2012 21:02

AW: Problem mit einem "leeren" String
 
Zitat:

hat leider nicht geklappt.
Wobei das nicht wirklich eine Fehlerbeschreibung ist.
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:
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;
Das Const ist für eine Codeoptimierung, da man so den Parameter als konstant deklariert und somit Delphi keine Kopie anlegen muß.
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.

diavy 4. Mai 2012 20:53

AW: Problem mit einem "leeren" String
 
Also ich hab's mal mit der for .. in-Schleife probiert und das hat nicht hingehauen.

Code:
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(16): Operator not applicable to this operand type
--> [Error] ex53.dpr(17): Incompatible types: 'Boolean' and 'procedure, untyped pointer or untyped parameter'
--> [Error] ex53.dpr(19): Expression expected but 'END' found

himitsu 4. Mai 2012 21:49

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.

Dalai 4. Mai 2012 21:52

AW: Problem mit einem "leeren" String
 
Zitat:

Zitat von himitsu (Beitrag 1164954)
For-In gibt es erst ab Delphi 2006 / Turbo Delphi.

Oder auch im Lazarus, jedenfalls kann ich seinen Code damit kompilieren (im Gegensatz zu Delphi 5).

Zitat:

Und 'ne halbwegs ordentliche Codeformatierung macht das alles bestimmt lesbarer.
Dem kann - oder besser gesagt muss - ich mich anschließen.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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