Pascal-Tutorial (Vorwort, Installation, Kapitel 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

Kommentare, Cursor, Operatoren

4.1. Kommentare definieren

Was denken Sie, ist schwerer: Quellcodes lesen oder selber welche schreiben? Was ist leichter, Bücher lesen oder diese zu schreiben? Bei letzterem werden Sie wohl sagen, es sei leichter sie zu lesen. Aber bei Quellcodes? Erfahrungsgemäß kann ich sagen, dass ich nach spätestens einem halben Jahr fast nicht mehr weiß, wozu mein eigener Quellcode gut ist. Ganz so schlimm ist es nicht, aber ich brauche dann wieder Einarbeitungszeit, trotz selbstgeschriebenem Code.

Das Endergebnis sieht man natürlich wenn man das Programm ausführt. Aber wozu sind einzelne Zeilen des Quellcodes gut? Zwar werden Sie mit großer Sicherheit wissen, was jede Zeile für sich macht, jedoch meistens nicht, wozu sie diese an der Stelle verwendet haben (der Sinn dahinter, also warum?). Wenn Sie nicht mehr wissen, was eine Anweisung (Funktion, Prozedur) macht, können Sie in einem Buch nachschlagen, in einem Tutorial wie diesem oder einer Online-Referenz nachlesen. Aber gegen das Problem des WESHALB?

Pascal schafft hier Abhilfe, denn Pascal erlaubt es, im Quellcode Kommentare einzufügen (andere Programmiersprachen können das natürlich genauso). Kommentare sind ganz normaler Text, der in den Quellcode geschrieben und vom Compiler ignoriert wird. Kommentare müssen extra gekennzeichnet werden. Am besten geben Sie in Ihren Kommentaren Antworten auf die WESHALB-Fragen. Beantworten Sie sich selbst die Fragen, die Sie sich später stellen werden. Klingt komplizierter als es ist. Im Grunde ein simples Wozu ist das gut?. Also wenn Sie sich fragen: Wozu? Im Kommentar steht dann die Antwort. Ach so.

Es macht Sinn, alle paar Zeilen einen kurzen Kommentar einzufügen. Nicht übertreiben (kein Roman) aber auch nicht zu faul sein. Nicht kommentieren ist nicht cool und macht aus Ihnen auch keinen besseren Programmierer. ;-) Im Gegenteil, es erhöht die Qualität Ihres Quellcodes und macht später Freude (oder verringert Frust) beim Wieder-Lesen.

Sie haben 2 Möglichkeiten, Kommentare als solche zu kennzeichnen:

1. Möglichkeit mit (* und *):

(* Kommentar *)

Der Text, der zwischen (* und *) steht, wird vom Compiler als Kommentar angesehen und ignoriert. In diesem Fall wäre das der Text Kommentar. Kommentare werden nicht mitcompiliert. Ob der Text da steht oder nicht, ist dem Compiler vollkommen egal. Die ausführbare Datei wird nicht größer durch Kommentare in der Quelldatei. Kommentare können sich auch über mehrere Zeilen erstrecken:

(* Dieser
Kommentar
erstreckt
sich
über
mehrere
Zeilen *)

Wichtig ist generell, dass Sie das abschließende *) nicht vergessen. Vergessen Sie dieses nämlich, reicht der Kommentar über den restlichen Quelltext und alle kommenden Programmierzeilen werden als Kommentar angesehen. Das hat zur Folge, dass der Compiler einen Fehler meldet, da er das abschließende END. nicht findet.

2. Möglichkeit mit { und }:

{ Kommentar }

Hier gilt das Gleiche wie bei (* ... *). Kommentare mit { ... } können sich ebenso über mehrere Zeilen erstrecken.

4.2. Cursor positionieren

Wie wir uns mit der Textausgabe beschäftigt haben, habe ich bereits kurz erwähnt, dass Write(Ln) den Text immer an die Stelle auf den Bildschirm schreibt, an der der Cursor gerade steht. Wenn Sie Ihr Programm starten und der Bildschirm zuvor mit ClrScr gelöscht wurde, steht der Cursor in Zeile 1, Spalte 1. Bedenken Sie, dass der Textmodus (in diesem lässt sich nur Text und keine Grafik anzeigen; bisher haben wir immer im Textmodus gearbeitet) den Bildschirm in 25 Zeilen zu je 80 Spalten unterteilt. In jeder dieser 25 Zeilen lassen sich demnach 80 Zeichen anzeigen, also 80*25 Zeichen insgesamt.

GotoXY bietet die Möglichkeit, den Sprung in eine Zeile und Spalte durchzuführen. Die Zeile und Spalte ist hierbei frei wählbar. Man kann also beliebig am Bildschirm hin- und herspringen, nicht nur in der aktuellen Zeile. GotoXY:

GotoXY (Spalte, Zeile);

Da die Spalten ja auf der X-Achse verlaufen, ist dies die erste Angabe. Hier steht ein Wert von 1 bis 80 (1 und 80 sind auch möglich). Die zweite Angabe ist die Zeile (Y-Achse). Hier ist ein Wert zwischen 1 bis 25 (1 und 25 wieder mit eingeschlossen) erlaubt. Mit

GotoXY (10, 2);

springen Sie in die 10. Spalte in Zeile 2.

Eine weitere Anweisung ist Window. Mit Window können Sie den Bildschirmbereich eingrenzen. Das heißt, dass Sie dann nur diesen Bildschirmbereich nutzen können. Folgendes Beispiel

Window (3, 2, 77, 23);

grenzt den zur Verfügung stehenden Bildschirmbereich nun von der 3. Spalte, 2. Zeile bis zur 77. Spalte in der 23. Zeile ein. Der restliche Bereich des Bildschirms steht nicht mehr zur Verfügung! Beachten Sie, dass GotoXY sich nun auf den mit Window eingeteilten Bildschirm bezieht. Das heißt die Position 1. Spalte, 1. Zeile ist im eingeteilten Fenster ganz links oben.

Window im Allgemeinen:

Window (Von Spalte, Von Zeile, Bis Spalte, Bis Zeile);

Das nächste Beispiel demonstriert die Verwendung von GotoXY und Window. Zunächst wird ein Fenster rechts unten eingerichtet, welches ca. 1/4 des Bildschirmplatzes benötigt. Danach wird der Cursor mit GotoXY in der Mitte (bezieht sich auf die Zeile) dieses Fensters positioniert und dort ein Text ausgegeben.

PROGRAM Fenster;
USES Crt;
 
BEGIN
  ClrScr;
  Window (39, 12, 79, 24);
  GotoXY (19, 7);
  Write ('Mitte');
  ReadKey;
END.

4.3. Operatoren

Ein Beispiel für die Verwendung von Operatoren stellt bereits eine Zeile aus Kapitel 3 dar:

Ergebnis := 2 * Radius * Pi;

Hier wurden zwei verschiedene Operatoren verwenden, der Zuweisungsoperator := und der arithmetische Operator *. Der Zuweisungsoperator := sorgt dafür, dass Daten zur Variable "transportiert" werden. Der arithmetische Operator * multipliziert zwei Werte miteinander. Die Daten, mit denen ein Operator arbeitet, nennt man Operanden. Je nachdem, ob ein Operator einen, zwei oder drei Operanden besitzt, unterscheidet man unäre (1), binäre (2) und ternäre (3) Operatoren. * ist also ein binärer Operator.

Im Folgenden werden (fast) alle Operatoren samt Priorität, Erläuterung und Beispiel aufgeführt:

Operator Erläuterung Priorität Beispiel
+ Addition bzw. bei Mengen Vereinigung 2 a := 74 + 4;
- Subtraktion bzw. bei Mengen Differenz 2 a := 80 - 2;
* Multiplikation bzw. bei Mengen Durchschnitt 3 a := 39 * 2;
/ Division von Fließkommazahlen 3 b := 156.0 / 2.0;
DIV Division von Ganzzahlen 3 a := 156 DIV 2;
MOD Modulo ( = Rest einer Division) 3 a := 78 MOD 10000;
AND Logisches UND oder Bitmanipulation 2 IF (a = 78) AND (b = 78.0) THEN ..
OR Logisches ODER oder Bitmanipulation 2 IF (a = 78) OR (b = 78.0) THEN ..
XOR Logisches ENTWEDER-ODER oder Bitmanipulation 2 IF (a = 78) XOR (b = 78.0) THEN ..
NOT Logisches NICHT oder Bitmanipulation 4 IF NOT (a = 78) THEN ..
IN Mengenzugehörigkeit 1 IF 78 IN Menge THEN ...
SHL Nach links "shiften" (Bitverschiebung nach links) 3 c := SHL (3);
SHR Nach rechts "shiften" (Bitverschiebung nach rechts) 3 c := SHR (3);
@ Speicheroperator 4 d := @a;
. Bereichszugriffsoperator 4 struktur1.var1 := 78;
:= Zuweisungsoperator 1 a := 78;
= Vergleich auf Gleichheit 1 IF (a = 78) THEN ..
< Logisches KLEINER-ALS 1 IF (a < 79) THEN ..
> Logisches GRÖSSER-ALS 1 IF (a > 77) THEN ..
<= Logisches KLEINER-GLEICH 1 IF (a <= 78) THEN ..
>= Logisches GRÖSSER-GLEICH 1 IF (a >= 78) THEN ..
<> Logisches UNGLEICH 1 IF (a <> 78) THEN ..

Lassen Sie sich von der Vielzahl der Operatoren nicht schockieren. In diesem Tutorial werden Sie - mit Ausnahme von SHL und SHR - noch alle oben aufgezählten Operatoren kennen lernen.

Die arithmetischen Operatoren werden wir gleich besprechen. Dazu gehören: + - * / MOD DIV. Einige Beispiele:

a := 10 + 245;

a := 10 + 245 + 14353;

Beim ersten Beispiel wird die Addition durchgeführt und das Ergebnis (255) der Variable a zugewiesen. Da der + - Operator eine höhere Priorität als der Zuweisungsoperator hat, wird die Addition zuerst durchgeführt. Daher die Prioritäten der einzelnen Operatoren. Beim zweiten Beispiel werden zwei Additionen durchgeführt und das Endergebnis dieser Additionen der Variable a zugewiesen.

a := 4000 - 3999;

a := 10 - 5 - 10;

Nun ist wichtig, dass die Variable a nicht nur von einem Ganzzahlentyp (oder Fließkommatyp) ist, sondern auch noch negative Zahlen speichern kann. Denn das Endergebnis der zweiten Rechnung ist -5.

a := 10 * 50;

a := 100 + 5 * 70;

Interessant ist lediglich das zweite Beispiel. Da der * - Operator eine höhere Priorität als der + - Operator, wird zuerst 5 * 70 berechnet und erst dann 100 hinzuaddiert. Punkt vor Strich, wie aus der Schule bekannt, also alles wie es sein soll. :-)

a := 50 DIV 5;

b := 77.4345 / 34.4;

Im ersten Beispiel wird eine Ganzzahlendivision durchgeführt. Beachten Sie, dass Sie bei der Division von Ganzzahlen NICHT / sondern DIV als Operator verwenden müssen. Das Ergebnis (10) wird der Variable a zugewiesen. Ich gehe übrigens immer noch von der Annahme aus, dass a im Beispiel eine Integer-Variable ist. Im nächsten Beispiel wird eine Division von Fließkommazahlen durchgeführt. Die Variable b muss daher auch von einem solchen Typ (z.B. Real) sein. Noch einmal zur Erinnerung: Als Dezimalkomma muss ein Punkt (z.B. 77.4345) verwendet werden, kein Beistrich (FALSCH: 77,4345)!

a := 100 MOD 71;

Hier ist das Ziel, herauszufinden, welcher Rest bei der Division herauskommt. Der Rest der Division wird der - im Beispiel - Integer-Variable a zugewiesen.

Vorheriges Kapitel Nächstes Kapitel