Pascal: ist es eine Zahl?

Hai, Ihr alten Programmierhasen,

ich versuch mich gerade durch Pascal zu quälen und find was nicht.
Problem: ein klitzekleines Programm soll was ausrechnen, dazu soll der Anwender 'ne Zahl eingeben - jetzt schreibt der Hirsch aber ‚vier‘ hin…

Wie lautet die Formulierung in Pascal, die ich brauche, um den daraus resultierenden Fehler abzufangen?

Ich hatte auf ‚in‘ getippt, lieg da aber offenbar falsch:

if eingegebeneZahl in real then… else writeln (‚Spinner‘);

Wie geht’s richtig? Oder hat jemand 'n Link, wo nur die nackten Anweisungen drinstehen? (über Google find ich nur Kurzkurse, Sprachenvergleiche, den Lebenslauf von Pascal, lange Kurse…)

menno

fragend in die Runde grüßend
Sibylle

Hi Sibylle,

Problem: ein klitzekleines Programm soll was ausrechnen, dazu
soll der Anwender 'ne Zahl eingeben - jetzt schreibt der
Hirsch aber ‚vier‘ hin…

Verwende dazu die Prozedur val, sie versucht den String in einen Longint zu konvertieren und setzt im Fehlerfall eine übergebene Variable mit dem Fehlercode.

Beispiel:

uses crt;

function isInt(value: string):boolean;
var intval, error: integer;
begin
 Val(value, intval, error);
 if error 0 then
 isInt:=false
 else
 isInt:=true;
end;

var a:string;
begin
readln(a);
if (isInt(a)) then
 Writeln('Das ist eine Zahl.')
else
 Writeln('Das ist keine Zahl.');
Readln;
end.

Schönen Gruß,
Rudy

Hai, Rudy,

ääähhh ich glaube, soweit bin ich noch nicht Du hast da 'ne Bibliothek genutzt, oder? Gehört die Funktion zu Standard-Pascal?

Aber eigentlich ist das (noch) egal - ich bin da mit meinen Überlegungen sowieso weit übers Ziel hinausgeschossen…*gg*

Danke, trotzdem

Gruß
Sibylle

Hi Sibylle,

ääähhh ich glaube, soweit bin ich noch nicht Du
hast da 'ne Bibliothek genutzt, oder?

Wenn Du das ‚uses crt;‘ meinst, dann ist das eine Pascal-Standard Unit. Sie habe ich eingebunden, damit man mit ‚Writeln‘ auf den Bildschirm schreiben kann.

Gehört die Funktion zu Standard-Pascal?

Die Prozedur ‚Val‘ ist Standard-Pascal. Die Funktion ‚isInt‘ habe ich gemacht, damit man die Prozedur direkt in eine if-Abfrage integrieren kann. Eine Prozedur hat keinen Rückgabewert, das kann man nur mit einer Funktion machen. Die Funktion isInt kannst Du auch in deinen Programmen nutzen, indem Du sie einfach oberhalb des Hauptblocks kopierst. Dass Dir Funktionen nicht geläufig sind wusste ich nicht, sonst hätte ich keine gemacht.

Ohne Funktion ginge das auch so (allereinfachstes Beispiel):

uses crt;

var eingabe:string;
 zahl, fehler:integer;

begin
 writeln('Geben Sie eine Zahl ein.');
 readln(eingabe);
 val(eingabe, zahl, fehler);
 if fehler = 0 then
 Writeln('Ja, das ist eine Zahl.')
 else
 Writeln('Nein, das ist keine Zahl.');
 Readln;
end.

Aber eigentlich ist das (noch) egal - ich bin da mit meinen
Überlegungen sowieso weit übers Ziel hinausgeschossen…*gg*

Finde ich nicht - ein Programm, welches Benutzereingaben erlaubt, sollte Idioten- oder (in deinem Fall) Hirsch-sicher sein. Vertippt sich mal wer und das Prog stürzt ab ist das nicht sehr angenehm.

Schönen Gruß,
Rudy

1 Like

Hai, Rudi,

Wenn Du das ‚uses crt;‘ meinst, dann ist das eine
Pascal-Standard Unit. Sie habe ich eingebunden, damit man mit
‚Writeln‘ auf den Bildschirm schreiben kann.

ist ja ulkig - ich hab bei noch keinem meiner Pascal-Experimente ‚crt geused‘ *g* und trotzdem funktioniert writeln anstandslos…

Die Prozedur ‚Val‘ ist Standard-Pascal. Die Funktion ‚isInt‘
habe ich gemacht, damit man die Prozedur direkt in eine
if-Abfrage integrieren kann.

Ahh ha…

Eine Prozedur hat keinen
Rückgabewert, das kann man nur mit einer Funktion machen. Die
Funktion isInt kannst Du auch in deinen Programmen nutzen,
indem Du sie einfach oberhalb des Hauptblocks kopierst. Dass
Dir Funktionen nicht geläufig sind wusste ich nicht, sonst
hätte ich keine gemacht.

Hier wird’s wieder merkwürdig: ich kenne Funktionen, hab schon damit gearbeitet (nur noch nicht unter Pascal) und weiß auch um den Unterschied von Funktionen und Prozeduren (endlich - dank w-w-w), aber es geht mir ja gerade darum, die obskuren Lücken in meinem Wissen zu schließen.

Ohne Funktion ginge das auch so (allereinfachstes Beispiel):

Dankeschön - ist gespeichert…

Finde ich nicht - ein Programm, welches Benutzereingaben
erlaubt, sollte Idioten- oder (in deinem Fall) Hirsch-sicher
sein. Vertippt sich mal wer und das Prog stürzt ab ist das
nicht sehr angenehm.

Find ich auch nicht - aber das Aufgaben-überprüf-Programm findet das (ich finde es unglaublich schwierig, die Angewohnheiten des Eingabe-Überprüfens und Schön-formatierte-Ausgaben-Erzeugens vorübergehend wegzulassen - ich schreib dauernd Monsterprogramme, von denen ich dann dreiviertel wieder lösche…)

Gruß
Sibylle

Hi Sibylle,

ist ja ulkig - ich hab bei noch keinem meiner
Pascal-Experimente ‚crt geused‘ *g* und trotzdem funktioniert
writeln anstandslos…

So ulkig ist das gar nicht, du hast nämlich vollkommen Recht - da ist mir ein Denkfehler unterlaufen. Readkey war die Prozedur, weswegen ich crt immer eingebunden habe, so wurde es zur Gewohnheit (Readkey wird bei jedem Tastendruck ausgelöst, nicht nur bei Enter - bei Readln kann man am Programmende immer noch irgendwas hinschreiben). Write(ln) und Read(ln) sind Standard-Pascal und erfordern keine Unit.

Hier wird’s wieder merkwürdig: ich kenne Funktionen, hab schon
damit gearbeitet (nur noch nicht unter Pascal) und weiß auch
um den Unterschied von Funktionen und Prozeduren (endlich -
dank w-w-w), aber es geht mir ja gerade darum, die obskuren
Lücken in meinem Wissen zu schließen.

Wenn es um Val geht, dann ist der Grund, weshalb es eine Prozedur ist und keine Funktion recht einfach - es ist eben so implementiert worden. Eigentlich ginge das auch mittels einer Funktion, wie das Beispiel unterhalb zeigt. Es sollte auch klarmachen, wozu die Fehler-Variable da ist: sie gibt die Position des ersten nicht-numerischen Zeichens in der gelesenen Zeichenfolge zurück.

function myval(input:string; var error:integer):integer;
 var result:integer;
begin
 val(input, result, error);
 myval:=result;


end;

var eingabe:string;
 zahl, fehler:integer;

begin
 writeln('Geben Sie eine Zahl ein.');
 readln(eingabe);
 {Eigene-Funktion: }
 zahl:=myval(eingabe, fehler); 
 {oder Standard-Prozedur: }
 {val(eingabe, zahl, fehler);}
 if fehler 0 then begin
 write('Dies ist keine Zahl. Der Fehler trat im ');
 write(fehler);
 write('. Zeichen von "');
 write(eingabe);
 writeln('" auf ('+eingabe[fehler]+')');
 end
 else begin
 Write('Wert der Zahl: ');
 Writeln(zahl);
 Write('Fehler: ');
 Writeln(fehler);
 end;
 Readln;
end.

Zum Test kannst Du die Zeile mit ‚zahl:=myval…‘ auskommentieren und dafür die Zeile mit ‚val(…‘ verwenden - das Ergebnis ist dasselbe, nur der Aufruf und die Parameteranzahl unterscheiden sich.
Gute Infos zu Funktionen und Prozeduren findest Du hier:
http://www.lernnetz-sh.de/kmlinux/doc/Pascal-Tutoria…

Find ich auch nicht - aber das Aufgaben-überprüf-Programm
findet das (ich finde es unglaublich schwierig, die
Angewohnheiten des Eingabe-Überprüfens und
Schön-formatierte-Ausgaben-Erzeugens vorübergehend wegzulassen

  • ich schreib dauernd Monsterprogramme, von denen ich dann
    dreiviertel wieder lösche…)

Genau dafür bietet sich eine Funktion an, so bleibt der Code kurz und du kannst die Überprüfung überall problemlos einfügen. Wenn Du Prozeduren und Funktionen beherrschst werden auch deine Programme kürzer.

Schönen Gruß,
Rudy

Hallo Rudy,

> if error 0 then  
> isInt:=false  
> else  
> isInt:=true;

oder kurz und knackig:

 isInt := (error=0)

Gruß
Martin