Programmiersprachen gibt es leider nicht mehr all zu viele für den Atari. Einer derjenigen Sprachen, die nicht nur beliebt, sondern auch aktuell verfügbar sind, haben wir uns angenommen, um einen Programmierkurs für Einsteiger zu verfassen.
Um diesen Kurs aktiv nutzen zu können, benötigen Sie Pure Pascal, der z.Z. von der ASH GmbH (siehe Textende) vertrieben wird, hier und da aber auch über den Gebrauchtfachmarkt verfügbar ist.
PASCAL ist eine allgemein anwendbare, sogenannte "high-level" Programmiersprache. Die erste Implementierung von PASCAL erfolgte durch Prof. Nikolaus Wirth an der ETH Zürich in den Jahren 1968-1970 auf einem "Control Data Rechner". Das ursprüngliche Ziel der Entwicklung war eine Sprache, die strukturiertes Programmieren leicht erlernbar machen sollte. PASCAL wurde erstmals 1971 der Öffentlichkeit vorgestellt. 1982 erschien die erste international gültige
Norm für die Sprache PASCAL, in Deutschland in der DIN 66256 übernommen. Durch diese Norm sollte die Systemunabhängigkeit sichergestellt werden. Dies bedeutete, daß die geschriebenen Programme einfach, bei Verwendung von Standardbibliotheken, von einem Computersystem zu einem anderen konvertiert werden können.
Für den TOS- und MagiC-Bereich vertreibt die Firma Applications Systems Heidelberg das Programm "Pure Pascal". Dieser Artikel soll die Grundlagen der PASCAL-Programmierung vermitteln. Das Ziel dieses Kurses soll es sein, einfache Programme planen und erstellen zu können. Der Kurs ist nicht nur für diejenigen gedacht, die schon Programmiererfahrung mit sich bringen, sondern auch für die, die noch nie programmiert haben und dieses einfach erlernen möchten.
Alle, die vielleicht schon in einer anderen Programmiersprache programmiert haben, kennen bestimmt das Problem, daß man in großen Programmen schnell den Überblick verliert. Der Programmierer des Programms weiß nach einem Jahr vielleicht noch, warum er eine bestimmte Anweisung an einer bestimmten Stelle geschrieben hat oder wohin seine Unterprogramme verzweigen.
Jemand, der sich noch nie mit dem Quelltext dieses Programms beschäftigt hat. wird in den meisten Fällen Probleme damit bekommen, die Zusammenhänge der Programmstruktur herauszufinden. Um Zeit zu sparen und um auch anderen die Möglichkeit zu geben, das Programm zu verstehen, sollte ein Programm gut und ausführlich geplant und dokumentiert werden. Außerdem sollten genügend Kommentare in den Quelltext eingefügt werden (zu den Kommentaren später mehr).
Als Darstellungs- und Dokumentationsmethode wird heute überwiegend das Struktogramm mit Symbolen nach Nassi-Shneiderman verwendet. Früher wurde auch der Programmablaufplan (auch Flußdiagramm genannt) benutzt. Diese grafischen Symbole sind eine wesentliche Vereinfachung für die Planung, die Programmierung und den Programmtest. Im Laufe des Kurses werde ich diese Symbole verwenden und auch zum Verdeutlichen von Beispielen auf sie zurückgreifen. Die wichtigsten zwei Symbole, den "Block" (Abbildung 1) und die "Anweisung" (Abbildung 2) zeige ich schon mal vorweg, da diese überall benötigt werden.
Das ganze Programm ist aus einzelnen Blöcken zusammengesetzt. Eine Sequenz setzt sich aus einer Reihe von Blöcken zusammen. In den Blöcken steht eine programmiersprachenunabhängige Anweisung, wie z.B. "Bildschirmausgabe des Nachnamens". Hierdurch entsteht der Vorteil, daß jeder, ohne Kenntnis der Programmiersprache, nachvollziehen kann was das Programm machen soll. Lediglich der Programmierer muß wissen, welchen Befehl er benutzt, um das Strukto-gramm in die Programmiersprache (hier PASCAL) umzusetzen.
PASCAL ist eine strukturierte Programmiersprache, eine durchstrukturierte Vorarbeit (Struktogramm) läßt sich im Programm wiederfinden. Die Modularisierung und die Wiederholung ähnlicher Strukturen sind ein Abbild der grafischen Vorbereitung mittels Symbolen nach Nassi-Shneiderman.
Ein PASCAL-Programm wird in die folgenden drei Abschnitte unterteilt:
1 Programmkopf
Der Programmkopf besteht aus dem reservierten Wort PROGRAM und dem Programmnamen, der den PASCAL-Bedingungen für Namen unterliegt. Bsp: program STComputer;
2 Deklarationsteil
In diesem Teil werden die im Programm benötigten Konstanten und Variablen mit ihrem Datentyp vereinbart. Anschließend folgen Prozeduren und Funktionen. Prozeduren und Funktionen sind Unterprogramme, die vom Hauptprogramm oder einem anderen Unterprogramm aus aufgerufen werden.
3 Hauptprogramm
Das Hauptprogramm beginnt mit begin und endet mit end.. Es besteht aus den einzelnen Anweisungen und/oder Blöcken von Anweisungen (Sequenzen), die jeweils mit begin und end. geklammert werden.
Wie Anfangs schon erwähnt, sollte man zur Dokumentation des Programms und als Hilfe zur besseren Lesbarkeit und Bearbeitung Kommentare einfügen. Dazu gibt es in PASCAL die folgenden zwei Möglichkeiten:
1. (* Kommentar *)
2. { Kommentar }
Anmerkungen vorweg:
Variablen sind allgemein gesehen ein Fach, in dem man einen bestimmten Inhalt ablegen kann. Der Inhalt ist in diesem Fall eine Zahl, ein Zeichen bzw. Buchstabe oder eine Anzahl zusammenhängender Zeichen. Jede Variable bekommt einen Namen zugewiesen. In PASCAL muß dieser Name immer mit einem Buchstaben beginnen.
Auf diesen Buchstaben können in beliebiger Reihenfolge Ziffern und weitere Buchstaben folgen. Umlaute und Sonderzeichen (mit Ausnahme des Unterstrichs _) dürfen in Variablennamen nicht verwendet werden. Am sinnvollsten ist es aber, den Namen so zu wählen, daß er einen Sinn ergibt, d.h. daß man durch ihn auf den Inhalt schließen kann. Jeder Variable muß entsprechend ihrer Verwendung ein Datentyp "zugeordnet" werden. Jedem Datentypen ist ein Gültigkeitsbereich zugeordnet, der eingehalten werden muß! Der Inhalt der Variable kann beliebig innerhalb des Gültigkeitsbereichs des Datentypes verändert werden. Pure Pascal sorgt in einigen Fällen für eine Überprüfung der Einhaltung des Bereiches. Es gibt aber auch viele Fälle, bei denen eine solche Überprüfung nur durch den Programmierer möglich ist, d.h. er muß darauf achten, daß bei der Deklaration der richtige Datentyp zugewiesen wird.
Neben den Variablen gibt es Konstanten. Konstanten sind Variablen, die einen festen Inhalt erhalten, der während des Programmablaufes nicht geändert werden kann.
Eine mögliche Konstante ist z.B. PI.
Wie in Tabelle 1 zu sehen ist, gibt es eine Vielzahl von Datentypen, die wie in Kapitel 2.1 geschrieben, je nach erforderlichem Gültigkeitsbereich und Genauigkeit vom Programmierer verwendet werden können. Die Tabelle zeigt lediglich die "einfachen" Datentypen, weitere Datentypen werden in einem späteren Kapitel behandelt. (Siehe Tabelle 1).
Ganzzahlige Werte sind, wie der Name schon sagt, Werte ohne Nachkommastelle. Möchte man aber Werte mit Nachkommastelle zulassen, so muß man, je nach gewünschter Genauigkeit, auf die Datentypen für die reellen Zahlen zurückgreifen. Die Menge des Datentypes Charakter (Char) besteht auch den Zeichen des international vereinbarten AscII-Zeichensatzes. Mit einer Größe von 8 Bit lassen sich 256 Zeichen darstellen. Jedem Zeichen ist ein bestimmter AscII-Wert zugeordnet. Das A hat beispielsweise den Wert 65. Die ersten 32 Zeichen sind Steuerzeichen, d.h. nicht darstellbare Zeichen. Wichtig ist auch, daß sich dieser Datentyp, trotz des gleichen Wertebereiches, von dem Datentyp Byte unterscheidet. Für Zeichenketten, d.h. einer Folge von Zeichen, die in einem vorbereiteten Speicherbereich abgelegt werden, ist der Datentyp String zu benutzen. Die maximale Länge einer Zeichenkette betragt 255 Zeichen. Bei der Deklaration ist immer die maximale Länge der Zeichenkette anzugeben. Ist die Zeichenkette länger als der vereinbarte Speicher, so werden die überschüssigen Zeichen abgeschnitten. Wird keine Größe angegeben, werden 255 Zeichen angenommen. Möchte man lediglich einen Wahrheitswert (Ist die Aussage wahr oder falsch?) abfragen, so verwendet man den Datentyp Boolean. Er kann nur die Werte 0 für False (falsch) oder 1 für True (wahr) annehmen. Weil es einer der häufigsten Fehler ist, weise ich wiederholt darauf hin, daß bei der Deklaration darauf geachtet werden muß, daß man den richtigen Gültigkeitsbereich wählt, d.h. er nicht zu klein ist und daß man nicht zuviel Speicherplatz "verschenkt", indem man einen zu großen Datentyp benutzt.
Operator | Operandentyp | Ergebnistyp | Beispiel |
---|---|---|---|
+ j | Addition | Integer Real | Integer Real |
- | Subtraktion L | 1 | Integer Real |
* | Multiplikation | Integer Real | Integer Real |
/ i | iDivision | Integer Real | Integer Real |
div | Integerdivision | Integer | Integer |
mod | Modulo | Integer | Integer |
Tabelle 2: Arithmetische Operatoren
Die Deklaration von globalen Variablen erfolgt im Deklarationsteil und hat folgenden Aufbau:
var Variablenname: Datentyp;
Das Schlüsselwort var wird nur einmal verwendet. Alle weiteren Variablen werden nur mit dem Namen, Doppelpunkt, Datentyp und Semikolon deklariert:
var Variable1: Datentyp;
Variable2: Datentyp;
Variable3: Datentyp;
Mehrere Variablen gleichen Datentyps können auch in einer Zeile durch Komma deklariert werden. Von dieser Schreibweise ist allerdings abzuraten, da dadurch sehr schnell die Übersichtlichkeit verloren gehen kann und, wie später zu sehen ist, kein Platz für Kommentare bleibt:
var Variablen1, Variable2, Variables: Datentyp;
Im Folgenden sind Beispiele für die Deklaration von verschiedenen Datentypen aufgelistet:
Operator | Operation |
---|---|
< | kleiner |
<= | kleiner oder gleich |
> | größer |
>= | größer oder gleich |
= | gleich |
<> | ungleich |
Tabelle 3: Vergleichsoperatoren
var Alter : Integer; HausNr : Byte;
KundenNr : LongInt; Laenge : Real;
Hoehe : Real; Volumen : Extended;
Zeichen : Char;
ZeichA, ZeichB, ZeichC: Char;
Name : String[30]; Vorname : String[20];
Strasse, Ort : String;
Antwort : Boolean;
Ausdrücke, das können z.B. Rechenschritte oder Vergleiche sein, bestehen aus Operatoren und Operanden. Die meisten Operatoren von PASCAL verknüpfen zwei Operanden und werden deshalb als binär bezeichnet, die restlichen Operatoren mit nur einem Operanden, bezeichnet man daher als unär. Binäre Operatoren benutzen die übliche, aus der Mathematik bekannte Schreibweise: Zahll + Zahl2. Ein unärer Operator steht immer direkt vor dem Operanden: -Zahl3.
Beispiel:
Zahl2 := Zahl1 + Zahl2;
Zahl2 := +Zahl1;
Beide Anweisungszeilen führen zu dem gleichen Ergebnis und Anweisungen addieren den Inhalt von Zahl 1 mit dem Inhalt von Zahl2 und weisen das Ergebnis Zahl2 als neuen Inhalt zu. Der einzige Unterschied liegt darin, daß die erste Zeile binär und die zweite Zeile unär verknüpft ist. Bei einzelnen Rechenschritten, wie in dem Beispiel, ist die unäre Variante noch übersichtlich, folgen aber mehrere Operationen in einer Anweisung, so sollte man die binäre Variante vorziehen. Wie in dem Beispiel zu sehen ist, erfolgt die Zuweisung an die Variable Zahl2 durch einen Doppelpunkt gefolgt von einem Gleichheitszeichen. Diese Zeichenfolge steht immer dann, wenn eine Zuweisung erfolgen soll oder umgekehrt, eine Zuweisung erfolgt in PASCAL nur über diese Zeichenfolge. Die Operation kann auch anstelle der Variablen Zahlen enthalten, lediglich links von dem "Zuweisungszeichen" muß eine Variable stehen, da es unmöglich ist. einer Zahl einen Wert zuzuweisen.
Tabelle 2 enthält die arithmetischen Operatoren, die in PASCAL zur Verfügung stehen. Wie in der Tabelle zu sehen ist, muß der Programmierer bei der Verwendung der verschiedenen Operatoren darauf achten, daß der richtige Datentyp für das Ergebnis und die Operanden verwendet wird. Die ersten vier Operatoren dürften jeden aus der Schulzeit bekannt sein. Die Integerdivision und die Modulo-Rechnung hingegen möchte ich hier näher erläutern. In beiden Fällen wird eine Division durchgeführt. Im Gegensatz zur normalen Division mit dem Schrägstrich (/), bei der das komplette Ergebnis ermittelt wird,, ermittelt die Integerdivision (div) nur den ganzzahligen Divisionsfaktor (10 div 3 ergibt 3). Die Modulo-Rechnung gibt dem hingegen den Rest der Division zurück (10 mod 3 ergibt I). Neben den Operatoren ist zum Durchführen mehrerer Operationen in einer Anweisung das Setzen von Klammern möglich. Wie in der Mathematik gilt auch in PASCAL: Klammer- vor Punkt- vor Strichrechnung (siehe Tabelle 2 und 3).
Neben den arithmetischen Operatoren und den Vergleichsoperatoren gibt es in PASCAL eine Menge Standardfunktionen. Einige wichtige möchte ich hier nennen (Zahl, Winkel, a und b sind Platzhalter für Variablen oder Zahlen):
Funktionsaufruf | Rückgabe |
---|---|
ABS(Zahl) | Absolut-Wert (ohne Vorzeichen) |
FRAC(Zahl) | Nachkommastellen |
INT(Zahl) | Vorkommastellen |
SQR(Zahl) | Quadrat |
SQRT(Zahl) | Quadratwurzel |
SIN (Winkel) | Sinus des Winkels (Bogenmaß) |
COS(Wnkel) | Cosinus des Winkels (Bogenmaß) |
ARCTAN (Zahl) | Arkustangens (liefert Winkel im Bogenmaß) |
LN(Zahl) | Natürlicher Logarithmus |
EXP(Zahl) | Exponentialfunktion e* |
EXP(b * LN(a)) | Exponentenumrechnung ab |
Beispiel (ermittelt die Quadratwurzel aus 9 = 3): Quadratwurzel := SQRT(9)
Im nächsten Teil des Kurses geht es dann mit dem ersten Starten von Pure Pascal richtig los. Neben den Schreibweisen für Kontrollstrukturen zeige ich die wichtigsten Bestandteile der Programmieroberfläche. Bis dahin sollten Sie bei Interesse am Erlernen von PASCAL auch genügend Zeit haben. Pure Pascal bei ASH zu erwerben.
Bezugsquelle:
Application Systems Heidelberg GmbH Postfach 102 646 D-69016 Heidelberg
Teil 1
Einleitung; Grundelemente
Teil 2
Der Umgang mit PurePascal;
Kontrollstrukturen
Teil 3
Codierung von Struktogrammen
Teil 4
Prozeduren
Teil 5
Funktionen
Teil 6
Aufzählungsdatentypen
Teil 7
Strukturierte Datentypen
Teil 8
Dynamische Datentypen