Pascal-Tutorial Kapitel 4
Aus Wirthi's Wiki
| Pascal-Tutorial | |
|---|---|
| Allgemeines Kapitel 1 (Einleitung) Kapitel 2 (Daten) Kapitel 3 (Anweisungen) Kapitel 4 (Ein- und Ausgabe) Kapitel 5 (Unterprogramme) Kapitel 6 (Felder und Strukturen) Kapitel 7 (Dateien) | |
|
Im Kapitel 4 des Pascal-Tutorials behandeln wir die Ausgabe von Text auf dem Bildschirm und dem Drucker, sowie die Eingabe von Zeichen über die Tastatur.
[bearbeiten] Bildschirm-Ausgabe
Bisher konnten Sie die Ergebnisse ihrer Programme nicht überprüfen; damit ist jetzt Schluss. In diesem Kapitel lernen Sie, wie Sie etwas am Bildschirm ausgeben können.
Der dazu notwendige Befehl ist write. Er gibt die ihm übergebenen Parameter auf dem Bildschirm aus (außer, Sie haben unter DOS die Standard-Ausgabe auf ein anderes Gerät, z.B. den Drucker eingestellt). write kann beliebig viele Parameter übernehmen. Der Datentyp ist dabei egal, solange er nicht von Ihnen definiert wurde (Siehe Kapitel "Type und Record").
PROGRAM Hello_world;
VAR Zahl1;
BEGIN
Zahl1:=1234;
write('Das ist ein Test');
write('Der Wert der Variable Zahl1 ist: ',Zahl1);
END.
Nach der Ausführung sollten Sie am Bildschirm jedoch nur mit viel Phantasie erkennen können, was Sie sehen möchten (wenn überhaupt nicht, eine Erinnerung: mit [ALT]-[F5] sehen Sie die Bildschirmausgabe). Erstens sind noch Reste anderer Programme am Bildschirm, außerdem schreibt das Programm beide Ausgaben in eine Zeile.
Wenden wir uns zuerst dem zweiten Fehler zu. write gibt die Parameter dort aus, wo der Bildschirmcursor steht (und setzt diesen nach der Ausgabe ans Ende der Ausgabe). Wollen Sie, dass der Cursor in eine neue Zeile gesetzt wird, müssen Sie den Befehl writeln (abgeleitet von "write" + "line", line bedeutet "Zeile") benutzen. Dieser funktioniert genau so wie write, nur wird am Ende der Ausgabe eine neue Zeile begonnen (Für Profis: unter DOS werden die beiden Ascii-Zeichen 13 und 10 angehängt; dies sind die Zeichen für Wagenrücklauf und Line Feed)
writeln('Dies ist eine Zeile.');
write('Dies steht in der nächsten Zeile!');
Nun zum zweiten Fehler, den "Programm-Rückständen" am Bildschirm. Um das zu verhindern, muss der Bildschirm gelöscht werden. Das geschieht mit dem Befehl clrscr ("clear screen", "lösche Bildschirm"). Um diesen benutzen zu können, müssen Sie jedoch erst mit "USES Crt;" die Unit crt "einbinden", da der Befehl clrscr nicht direkt in Pascal integriert ist, sondern in der Unit CRT definiert wird. Die Erklärung liefert das folgende Beispiel:
PROGRAM Bildschirm_loeschen;
USES crt;
BEGIN
clrscr;
writeln('Das steht ganz links oben auf einem gelöschten Bildschirm');
END.
[bearbeiten] Farbe
Um Ihre Programme attraktiver gestalten zu können, muss Farbe ins Spiel. Das funktioniert ziemlich einfach. Mit dem Befehl textcolor, der als Parameter eine Zahl zwischen 0 und 15 erwartet, können Sie die Textfarbe einstellen. Ab der nachfolgenden Ausgabe werden alle Zeichen in der Farbe des Parameters dargestellt. Gleiches gilt für den Befehl textbackground, nur diesmal für die Farbe des Zeichen-Hintergrundes. Beide benötigen eine eingebundene crt-Unit! Die Werte für die Farben können Sie mit Hilfe des Nachfolgenden Beispieles ermittel:
textcolor(7);
textbackground(1);
writeln('Dieser Text wird in Weiß (7) auf blauem (1) Hintergrund ausgegeben.');
textbackground(0);
FOR farbe := 0 TO 15 DO
BEGIN
textcolor(farbe);
writeln('Das ist die Farbe Nummer ',farbe);
END;
[bearbeiten] Drucker
Vorausgesetzt, Sie haben einen Drucker installiert, können Sie unter TURBO ganz einfach auf diesen zugreifen (im Textmodus, Grafik ist deutlich komplizierter).
Sie müssen lediglich die Unit printer einbinden. Anschließend können Sie mit den bekannten Befehlen write oder writeln auf dem Drucker ausgeben, wenn Sie als ersten Parameter "lst" (LST) angeben:
PROGRAM Drucker; USES printer; BEGIN WRITELN(lst,'1. Zeile auf dem Drucker.'); WRITELN(lst); WRITE(lst,'3. Zeile.'); END.
[bearbeiten] Tastatur-Eingabe
Damit der Benutzer mit dem Computer kommunizieren kann, muss er über die Tastatur Befehle und Zeichen eingeben können. Auch dafür stellt Pascal Befehle zur Verfügung: read, readln, readkey. Diese werden im folgenden Abschnitt vorgestellt.
read und readln funktionieren gleich wie write(ln) (nur das halt Zeichen eingelesen werden anstelle sie auszugeben). Sie müssen lediglich read(ln) und in Klammer die Variablenliste angeben:
WRITE('Bitte geben Sie eine Zahl ein: ');
READLN(integerVariable);
WRITE('Geben Sie einen String ein: ');
READLN(stringVariable);
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, dass er eine Zahl eingibt, die mit ENTER bestätigt werden muss. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines Strings. Diesen kann man nun eingeben und ebenfalls mit ENTER bestätigen.
Dabei kann allerdings ein Problem auftreten. Auch wenn Sie definiert haben, dass ein integer eingelesen werden soll, kann der Benutzer einen String eingeben (er könnte etwa, absichtlich oder unabsichtlich, "1e" eintippen). Da das Programm mit dieser Eingabe nichts anzufangen weiß (es hat ja eine Zahl erwartet, und das ist eindeutig keine), liefert es eine Fehlermeldung. Wenn Sie dieses Problem umgehen möchten, ein kleiner Hinweis: lesen Sie immer einen String ein, und konvertieren Sie diesen in einen integer. Dadurch kann das Programm fehler erkennen und dem Benutzer mitteilen, er soll doch einen integer (oder was auch immer als Eingabe gewünscht ist) eingeben. readkey readkey ist eine Funktion (Siehe Kapitel Unterprogramme), die ein char-Zeichen von der Tastatur einliest. Dazu geben Sie im Programm einfach folgende Zeile an:
charVariable:=readkey;
Diese Zeile erwartet die Eingabe eines char-Zeichens. Im Gegensatz zu read(ln) muss man nach der Eingabe des Zeichens jedoch nicht [ENTER] drücken, um die Eingabe zu bestätigen. In der Variable charVariable wird das erste Zeichen gespeichert, das auf der Tastatur eingegeben wird.
Eine weiter Möglichkeit der Anwendung von readkey ist es, wenn Sie einfach "readkey;" als Befehl eingeben. Dann wartet der Computer, bis Sie eine Taste drücken, speichert diese aber nicht ab (siehe auch nächster Abschnitt (Probleme mit Eingabe)). ACHTUNG: readkey benötigt die Unit crt!
[bearbeiten] keypressed
Dies ist ebenfalls eine Funktion, die eine boolean-Variable zurückliefert. Sie gibt Bescheid darüber, ob eine Taste gedrückt wurde, die mit read(ln) oder readkey abgerufen werden kann (zum Verständnis: auf der Tastatur eingegebene Zeichen werden meist nicht direkt vom Programm verarbeitet, sondern erst vom Betriebssystem bzw. dem BIOS des Computers zwischengespeichert. Erst wenn das Programm eingegebene Zeichen "anfordert" (etwa mittels read), werden die gespeicherten Zeichen an das Programm übergeben. Dies lauft jedoch so schnell ab, dass der Benutzer davon nichts merkt).
Ist der Rückgabewert von keypressed true, dann ist ein Zeichen abfragebereit, sonst nicht:
WHILE NOT keypressed DO BEGIN Zahl1:=Zahl1+1; writeln(Zahl1); END;
Dieser Programmcode erhöht solange die Variable Zahl1 und gibt diese aus, bis der Benutzer eine Taste drückt.
[bearbeiten] Probleme mit Eingabe
Wenn Sie mit Ein- und Ausgaben experimentieren, werden Sie rasch feststellen, dass oft ein Problem auftritt: Sie haben zwei mal hintereinander die Funktion readkey stehen, aber das Zweite der beiden wird einfach übersprungen.
Dies kommt daher, das Sie einfach zu langsam sind. Ohne Scherz: Wenn Sie eine Taste drücken, bleiben Sie mit dem Finger eine kurze Zeit auf der Taste. Da der Computer aber ziemlich schnell ist, arbeitet er möglicherweise schon den nächsten readkey-Befehl ab, während Sie noch immer den Finger auf der Taste haben. Das ist besonders störend, wenn Sie den Befehl als "Haltepunkt" geplant hätten: der Computer stoppt einfach nicht:
write('Bitte geben Sie ein Zeichen ein: ');
charVariable:=readkey;
writeln(' Danke. Sie haben das Zeichen ',charVariable,' eingeben');
readkey;
Anstatt beim zweiten readkey zu warten bis Sie eine Taste drücken, wird das Programm einfach fortgesetzt.
Nun zur Lösung des Probleme: geben Sie den Code "REPEAT readkey; UNTIL keypressed=FALSE;" zwischen den beiden readkey's an, und der Computer wird schön brav auf Sie warten:
VAR taste: char;
BEGIN
write('Bitte geben Sie ein Zeichen ein: ');
taste:=readkey;
writeln(' Danke. Sie haben das Zeichen ',charVariable,' eingeben');
REPEAT readkey; UNTIL Keypressed=FALSE;
readkey;
END.
Was macht dieser Code-Teil? Die REPEAT-Schleife wird solange ausgeführt, bis keypressed den Wert FALSE zurückliefert, d.h. bis keine Taste mehr gedrückt wird. In der Schleife werden eventuell (unnötigerweise) eingegebene Zeichen abgefragt, ansonsten aber ignoriert.
| Pascal-Tutorial: Allgemeines - Kapitel 1 - Kapitel 2 - Kapitel 3 - Kapitel 4 - Kapitel 5 - Kapitel 6 - Kapitel 7 |
