Von Thomas Grasel In diesem Teil des Pascal-Kurses möchte ich mit der Einführung der 'case' Funktion beginnen. Man kann sie mit der 'on X gosub' Funktion des Basics ver- gleichen. Für 'X' war in Basic nur eine ganze positive Zahl erlaubt. Nicht so in Pascal. Hier sieht die Funktion folgendermaßen aus: case x of 'a': begin ... end 'b': begin ... end end In Pascal darf 'x' eine Integer, char oder ein boolean sein. Mit ihr kann man mehrere if-Abfragen der selben Variablen hintereinanderen zu einer Abfrage zusammenfassen. Zum Beispiel die Eingabe im Menü des DOS 2.0 oder 2.5, das ja bekanntlich einen Buchstaben zur Anwahl einer Option verlangt, könnte mit diesem Befehl realisiert werden. Zu beachten ist das hinter 'case x of' kein 'begin' steht aber am Ende der Funktion ein 'end'. Als nächstes möchte ich noch einen wichtigen Bestandteil von Pascal vor- stellen, das 'array' (Feld). var feld: array(+0..5)+ of real entspricht zum Beispiel dem Basic- Befehl DIM FELD(5). var feld: array(+0..5)+ of char entspricht DIM FELD$(5). Hierbei ist zu beachten das jede Kom- ponete einzeln beschrieben und gelesen werden muß. D.h. zum Beispiel feld:='Hallo' ist nicht erlaubt! Richtig wäre feld(+0)+:='H' usw. Felder können natürlich analog auch mehrdimensional definiert werden. Z.B. var feld: array(+1..6,1..6)+ of integer definiert 2x6 Komponenten großes Feld von integer-Zahlen. Dabei wie bei 'array(+0..5)+ of real' 32 Bytes belegt !!! Die Felder können also aus char, real, integer, boolean-Werten oder Verbunden (records) bestehen (Zum letzteren in einer der nächsten Ausgaben mehr). Nun aber genug der Theorie. Das folgende Demoprogramm wandelt Hexa- dezimalzahlen in Dezimalzahlen um. program hexdez var zahl : real wandlung: boolean anzahl, i, wert : integer eingabe : array (+1..40)+ of char begin writeln(chr(125)) writeln ('Hexadezimal --> Dezimal') writeln writeln repeat (* Eingabe *) write ('Hexadezimal (0=Ende):$') anzahl:=0 repeat anzahl:=anzahl+1 read (eingabe(+anzahl)+) until eoln(input) readln (*Tastaturpuffer loeschen*) (*Und nun zur Wandlung*) if anzahl <=8 then begin i:=1 zahl:=0 wandlung:=true while (i<=anzahl) and wandlung do begin wert:=-1 case eingabe(+i)+ of '0' : wert:=0 '1' : wert:=1 '2' : wert:=2 '3' : wert:=3 '4' : wert:=4 '5' : wert:=5 '6' : wert:=6 '7' : wert:=7 '8' : wert:=8 '9' : wert:=9 'a','A': wert:=10 'b','B': wert:=11 'c','C': wert:=12 'd','D': wert:=13 'e','E': wert:=14 'f','F': wert:=15 end if wert=-1 then wandlung:=false zahl:=zahl*16+wert i:=i+1 end if wandlung then begin write ('$') for i:=1 to anzahl do write (eingabe(+i)+) writeln (' =', zahl:10:0) writeln writeln end else writeln ('Eingabefehler') end else writeln ('Zahl zu gross!') until zahl=0 end. Als erstes einmal zur Variablen- deklaration: 'zahl' ist die zu berechnende Dezimal- zahl. Sie ist vom Typ real obwohl nur ganze Zahlen auftreten können. Dies liegt daran das Integerzahl nur im Bereich vom -32768 und 32767 liegen dürfen. 'anzahl' beinhaltet die Stellenanzahl der Hexadezimalzahl. In 'eingabe' sind die Hexadezimalen Zeichen (vom Typ char) gespeichert. Im ersten Programmteil wird die Hexadezimale Zahl nach dem in der letzten Ausgabe beschriebenen System eingelesen. Beim ersten Aufruf von 'read(eingabe(+anzahl)+)' kann der User seine Eingabe 'loswerden'. Die Daten werden in den Tastaturpuffer!!! ge- schrieben. Und nur das erste Zeichen landet in 'eingabe(+anzahl)+'. Dies geschieht solange bis 'eoln(input)' den Wert 'true' annimmt und somit anzeigt das sich keine Zeichen mehr im Tastaturpuffer befinden. Aber wozu dann das 'readln' in der nächsten Zeile??? Die Frage ist berechtigt! Kyan-Pascal speichert leidet das 'RETURN' mit ab so das sich eigentlich noch ein Zeichen im Puffer befindet. Da wir dieses Zeichen aber nicht benötigen löschen wir den Tastaturpuffer mit dem Befehl 'readln'. Ansonsten würde bei der nächsten Eingabe noch das 'RETURN' im Puffer stehen und die neu eingegebenen Zeichen würden daran angehängt werden. Also 'readln' löscht den Puffer !!! Die Variable 'wandlung' wird benötigt um festzustellen ob die Wandlung erfolgreich war. Da Standart-Pascal in der case-Schleife leider kein 'else' zuläßt muß dies extern abgefangen werden! Der Rest des Programmes müßte so weit klar sein. Zum Schluß will ich noch ein einfaches Programm zur Sinus-Berechnung anfügen. Keine Angst den Sinus-Befehl gibt es natürlich auch in Pascal. Wie einige vielleicht wissen kann man Sinus auch als Reihe ausdrücken. Das heißt man kann den Sinus auch durch Summation errechnen. Dies ist sehr nützlich wenn man viele Sinus-Werte berechnen muß an die Genauigkeit dagegen nicht so große Ansprüche gestellt werden. Vom Pascal her kommt nur ein neuer Befehl vor, der aber von Basic her bekannt sein dürfte. 'abs' ermittelt den Absolutwert einer Zahl, also seinen Betrag ohne Vorzeichen. (abs(5)=5 und abs(-7)=7) Da sonst keine neuen Befehle hinzukommen erübrigt sich eine Beschreibung des Programmes. program sinus var n, i, k : integer x, zw, si: real begin writeln(chr(125)) writeln('Programm zur Berechnung von') writeln('Sinus-Werten mit Hilfe von Summation!') writeln write('Wieviel Summierungen : ') readln(n) write('Welches Argument : ') readln(x) writeln si:=x zw:=x for k:=1 to n do begin zw:=-zw*sqr(x)/((2*k+1)*2*k) si:=si+zw end writeln('Sinus(', x:6:5, ') = ', sin(x):6:5) writeln writeln('Summenwert :',si:6:5) writeln('Differenz : ', abs(si-sin(x)):6:5) end. Beim nächsten Mal werde ich mit der Programmierung von Proceduren und Funktionen beginnen. Also viel Spaß bis zum nächsten Mal.