AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem mit einem "leeren" String

Ein Thema von diavy · begonnen am 2. Mai 2012 · letzter Beitrag vom 4. Mai 2012
Antwort Antwort
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#1

Problem mit einem "leeren" String

  Alt 2. Mai 2012, 17:06
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.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.405 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 17:14
Dein Problem wird wohl bei der While-Bedingung sein.
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.:
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/channel/UCUG...aXLclwO9qA-lzA
  Mit Zitat antworten Zitat
Steku

Registriert seit: 12. Mai 2008
177 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 17:15
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.509 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 17:18
Zitat:
while a[i]<>'do
Da ein Char immer ein Zeichen ist, kann es nicht "keine Zeichen" sein.

Die Abfrage hätte also eher 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu ( 2. Mai 2012 um 19:44 Uhr) Grund: edit, jetzt laß ich mich von ForEach ablenken ... meine For-In
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.463 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 19:15
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#6

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 21:49
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.

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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.509 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Problem mit einem "leeren" String

  Alt 2. Mai 2012, 22:02
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#8

AW: Problem mit einem "leeren" String

  Alt 4. Mai 2012, 21:53
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.509 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Problem mit einem "leeren" String

  Alt 4. Mai 2012, 22:49
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.637 Beiträge
 
Delphi 5 Professional
 
#10

AW: Problem mit einem "leeren" String

  Alt 4. Mai 2012, 22:52
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
  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 10:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf