Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eingaben prüfen (Pascal) (https://www.delphipraxis.net/20825-eingaben-pruefen-pascal.html)

chris_82 23. Apr 2004 23:50


Eingaben prüfen (Pascal)
 
Guten Abend,

ich darf mal wieder ein gutes altes Pascalprogramm schreiben.

Nun muss ich noch meine Eingaben abfangen, sprich ich habe ein Menü in dem verschieden Werde eingegeben werden, eigentlich alles Gleitkommazahlen. Bräuchte ich eine Funktion die prüft ob die eingabe in real liegt oder nicht. so nach dem Motto ist 0.00001 ein Teilmenge von Real, gibt es da ein Funktion?

Hansa 23. Apr 2004 23:59

Re: Eingaben prüfen (Pascal)
 
Zitat:

Zitat von chris_82
...ich darf mal wieder ein gutes altes Pascalprogramm schreiben...

Aber das hat mit Pascal nichts zu tun. 8) Die Eingabe muß halt im Fehlerfalle abgefangen werden. 8)

dizzy 24. Apr 2004 00:31

Re: Eingaben prüfen (Pascal)
 
Na, es muss ja nicht sofort eine Falscheingabe sein. Man könnte sich auch Eingaben denken, die zwar syntaktisch völlig okay sind, aber die der Datentyp nicht mehr in all ihrer Genauigkeit erfassen kann.

IMHO wäre es eine Variante, wenn du die Eingabe zunächst in den Zieldatentyp (hier wohl Real) konvertierst, und dann wieder zurück zu String. Wenn jetzt der gelesene, und der 2x konvertierte String noch gleich sind, so kann der eingegebene Wert ohne Rundungsfehler in ausreichender Genauigkeit in Real gespeichert werden.

(Auf fehlerhafte Eingaben muss natürlich im Vorfeld gesondert reagiert werden!)

mfg,
dizzy

glkgereon 1. Mai 2004 00:04

Re: Eingaben prüfen (Pascal)
 
das problem hatte ich auch schon oft: gibt es in pascal sowat in der art:

Code:
if try readln(InEinenInteger)=error
then machsnochmal;
//also wenn der benutzer KEINEN integer eingibt, muss ers nochmal machen, solang bis ers hinkriegt
gibts das?

alcaeus 1. Mai 2004 03:09

Re: Eingaben prüfen (Pascal)
 
Zitat:

Zitat von glkbkk
das problem hatte ich auch schon oft: gibt es in pascal sowat in der art:

Code:
if try readln(InEinenInteger)=error
then machsnochmal;
//also wenn der benutzer KEINEN integer eingibt, muss ers nochmal machen, solang bis ers hinkriegt
gibts das?

Nein, aber das gibts in Pascal:
Delphi-Quellcode:
function SichereEingabe(Text: String): Integer;
var
  Wert, Code: Integer;
  WertEin: String;
begin
  repeat
    Write(Text+' ');
    Readln(WertEin);
    Val(WertEin,Wert,Code);
    if Code <> 0 then
      Writeln('Ungültige Eingabe');
  until Code=0;
  SichereEingabe := Wert;
end;

glkgereon 2. Mai 2004 14:43

Re: Eingaben prüfen (Pascal)
 
soweit ich sehe prüft das nur, ob das eingegebene <>'' ist, oder?
was ist, wenn ich zb 'vierzehn' eingebe?

devnull 2. Mai 2004 15:43

Re: Eingaben prüfen (Pascal)
 
Nein, wenn du 'vierzehn' eingibst, dann ist in der Variable WertEin (String) 'vierzehn' gespeichert.
Wenn du nun mit der Funktion val probierst, Zeichen (d.h. Buchstaben) umzuwandeln, dann wird in der
Variable Code (integer) der Fehlertyp zurückgegeben!
Du wirst solange 'gezwungen', eine korrekte, gültige Eingabe einzugeben, bis Code=0 ist!


Delphi-Quellcode:
function SichereEingabe(Text: String): Integer;
var
  Wert, Code: Integer;
  WertEin: String;
begin
  repeat
    Write(Text+' ');
    Readln(WertEin);
    Val(WertEin,Wert,Code);   //Wenn Code <> 0, dann war in der Eingabe ein ungültiges Zeichen
    if Code <> 0 then
      Writeln('Ungültige Eingabe');
  until Code=0;
  SichereEingabe := Wert;
end;
mfg
devnull

glkgereon 2. Mai 2004 15:49

Re: Eingaben prüfen (Pascal)
 
aso, mir war die bedeutung von val nit so ganz klar...

devnull 2. Mai 2004 15:57

Re: Eingaben prüfen (Pascal)
 
Findet man alles in der Hilfe:
> Hilfe->Index->Suchen

Code:
 Auszug aus der Hilfe
Val (Prozedur)
Interpretiert einen String als numerischen Wert.

Deklaration
procedure Val(S; var V; var Code: Integer);
Es gilt:
S   ist eine Variable des Typs String, die eine Zeichenfolge speichert, die einen numerischen Wert (mit Vorzeichen) ergibt.
V   ist eine Variable mit einem Integer- oder Real-Typ.
Code   ist eine Variable des Typs Integer.

Zielsystem
>Windows, Real, Protected

alcaeus 2. Mai 2004 15:58

Re: Eingaben prüfen (Pascal)
 
Zitat:

Zitat von dizzy
IMHO wäre es eine Variante, wenn du die Eingabe zunächst in den Zieldatentyp (hier wohl Real) konvertierst, und dann wieder zurück zu String. Wenn jetzt der gelesene, und der 2x konvertierte String noch gleich sind, so kann der eingegebene Wert ohne Rundungsfehler in ausreichender Genauigkeit in Real gespeichert werden.

Wenn du auch das berücksichtigen willst, dann würde der Code so aussehen:
Delphi-Quellcode:
function SichereEingabe(Text: String): Integer;
var
  Wert, Code: Integer;
  WertEin, WertNeu: String;
begin
  repeat
    Write(Text+' ');
    Readln(WertEin);
    Val(WertEin,Wert,Code);   //Wenn Code <> 0, dann war in der Eingabe ein ungültiges Zeichen
    if Code <> 0 then
      Writeln('Ungültige Eingabe')
    else
    begin
      Str(Wert,WertNeu);
      if WertNeu <> WertEin then
        Code := 1;
    end;
  until Code=0;
  SichereEingabe := Wert;
end;


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