Programmieren in Pascal
Programmieren in Pascal
Programmieren in Pascal
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Programmieren</strong> <strong>in</strong> <strong>Pascal</strong><br />
1. Vorraussetzungen für<br />
Turbo<strong>Pascal</strong><br />
●<br />
Probleme mit Turbo<br />
<strong>Pascal</strong> 7.0<br />
2. Kapitel: E<strong>in</strong>führung<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Allgeme<strong>in</strong>e<br />
Programmstruktur<br />
Grundbegriffe<br />
Bezeichner<br />
Reservierte Wörter<br />
Vere<strong>in</strong>abrung von<br />
Variablen<br />
Vere<strong>in</strong>barung von<br />
Konstanten<br />
Befehle der Unit Crt<br />
3. Kapitel: Datentypen<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Übersicht der Datentypen<br />
<strong>in</strong> TP<br />
E<strong>in</strong>fache Datentypen<br />
Der Datentyp Integer<br />
Der Datentyp Real<br />
Der Datentyp Str<strong>in</strong>g<br />
Standardrout<strong>in</strong>en für den<br />
Datentyp Str<strong>in</strong>g<br />
Aufzählende Datentypen<br />
Teilbereichstypen<br />
Explizite und implizite<br />
Typenvere<strong>in</strong>barung<br />
4. Kapitel: Bed<strong>in</strong>gungen<br />
●<br />
Die IF - Entscheidung<br />
Problembehebung bei Turbo<br />
<strong>Pascal</strong> 7.0<br />
Da Turbo <strong>Pascal</strong> 7.0 e<strong>in</strong> MS DOS Programm ist,<br />
muss es auf das jeweilige System bzw. die<br />
jeweiligen Pathangaben (Verzeichnisangaben)<br />
e<strong>in</strong>gestellt werden. Deshalb kann es zu Problem<br />
kommen, sollte dies der Fall se<strong>in</strong> befolgen Sie die<br />
folgenden Schritte um Turbo <strong>Pascal</strong> 7.0 auf Ihrem<br />
System e<strong>in</strong>zurichten:<br />
1. Downloaden Sie die gepackte Datei von<br />
Turbo <strong>Pascal</strong> 7.0 (Hier geht's zum<br />
Download).<br />
2. Legen Sie e<strong>in</strong> Verzeichnis auf Ihrer<br />
Festplatte an, zum Beispiel C:\Turbo.<br />
3. Starten Sie die heruntergeladene Datei und<br />
geben Sie als Zielverzeichnis das von Ihnen<br />
erstellte Verzeichnis an.<br />
4. Nach Beendigung des Vorgangs, wechseln<br />
Sie <strong>in</strong> das von Ihnen erstellte Verzeichnis<br />
und klicken mit der rechten Maustaste auf<br />
die Datei Turbo.exe. Im ersche<strong>in</strong>enden<br />
Kontextmenü wählen Sie den E<strong>in</strong>trag<br />
Eigenschaften.<br />
5. Es öffnet sich e<strong>in</strong> Fenster <strong>in</strong> dem Sie zur<br />
Registerkarte Programm wechseln.<br />
6. Dort können Sie e<strong>in</strong>ige E<strong>in</strong>stellungen<br />
vornehmen. In dem Feld Befehlszeile tragen<br />
Sie den Path <strong>in</strong> dem sich Turbo <strong>Pascal</strong><br />
bef<strong>in</strong>det plus den Date<strong>in</strong>amen Turbo.exe e<strong>in</strong><br />
(z.B. C:\turbo\turbo.exe).<br />
file:///E|/homepage/<strong>Pascal</strong>/<strong>in</strong>dex.htm (1 of 3) [07.10.2001 00:28:26]
<strong>Programmieren</strong> <strong>in</strong> <strong>Pascal</strong><br />
●<br />
Die CASE - Entscheidung<br />
5. Kapitel: Schleifen<br />
● Die REPEAT / UNTIL -<br />
Schleife<br />
● Die FOR - Schleife<br />
● Die WHILE - Schleife<br />
6. Kapitel: Unterprogramme<br />
●<br />
●<br />
Grundwissen<br />
Globale und lokale<br />
Bezeichner<br />
7. Kapitel: Prozeduren<br />
7. In dem Feld Arbeitsverzeichnis geben Sie<br />
nur das Verzeichnis <strong>in</strong> dem sich Turbo<br />
<strong>Pascal</strong> bef<strong>in</strong>det e<strong>in</strong> (z.B. C:\turbo).<br />
8. Jetzt bestätigen Sie die E<strong>in</strong>gaben durch<br />
e<strong>in</strong>en Klick auf den OK-Button. Das Fenster<br />
wird geschlossen.<br />
9. Starten Sie jetzt Turbo <strong>Pascal</strong> mit der Datei<br />
Turbo.exe.<br />
10. Wählen Sie im Menü Option den E<strong>in</strong>trag<br />
Verzeichnisse aus.<br />
11. Hier ändern Sie die Werte EXE/TPU -<br />
Verzeichniss (BSP: C:\Turbo) und UNIT -<br />
Verzeichniss (BSP: C:\Turbo\Units) <strong>in</strong> die<br />
von Ihnen erstellten Verzeichnisse um.<br />
●<br />
●<br />
●<br />
●<br />
Grundstruktur e<strong>in</strong>er<br />
Prozedur<br />
Prozeduren ohne<br />
Werteparameter<br />
Prozeduren mit<br />
Werteparameter<br />
Prozeduren mit<br />
Variablenparameter<br />
12. Ist dies erfolgt schließen Sie das Fenster und<br />
wählen <strong>in</strong> dem Menü Option den E<strong>in</strong>trag<br />
Speichern Turbo.TP<br />
13. Jetzt können Sie, hoffentlich, e<strong>in</strong>wandfrei mit<br />
Turbo <strong>Pascal</strong> arbeiten.<br />
Download TP 7.0 Allg. Programmstruktur<br />
8. Kapitel: Funktionen<br />
●<br />
●<br />
Grundstruktur e<strong>in</strong>er<br />
Funktion<br />
Funktionen<br />
9. Kapitel: Strukturierte<br />
Datentypen<br />
●<br />
●<br />
●<br />
●<br />
Grundlagen<br />
Arrays<br />
Records<br />
Mengen<br />
❍ Deklaration<br />
❍ Wertzuweisung<br />
❍ Mengenoperationen<br />
❍ Wertausgabe<br />
❍ Mengen verändern<br />
10. Kapitel: Dateiverarbeitung<br />
file:///E|/homepage/<strong>Pascal</strong>/<strong>in</strong>dex.htm (2 of 3) [07.10.2001 00:28:26]
<strong>Programmieren</strong> <strong>in</strong> <strong>Pascal</strong><br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
Grundlagen<br />
Datei öffnen bzw. anlegen<br />
In e<strong>in</strong>e Datei schreiben<br />
Aus e<strong>in</strong>er Datei lesen<br />
Datensatzzeiger<br />
Datensatz löschen<br />
11. Kapitel:<br />
Befehlsverzeichniss<br />
●<br />
Anweisungen<br />
12. Kapitel:<br />
Programmbeispiele<br />
●<br />
●<br />
E<strong>in</strong>fache<br />
Programmbeispiele<br />
Kaufmännische<br />
Programmbeispiele<br />
file:///E|/homepage/<strong>Pascal</strong>/<strong>in</strong>dex.htm (3 of 3) [07.10.2001 00:28:26]
Die allgeme<strong>in</strong>e Programmstruktur von Turbo <strong>Pascal</strong> ist grob <strong>in</strong> folgende vier Elemente gegliedert<br />
Die allgeme<strong>in</strong>e Programmstruktur<br />
Die allgeme<strong>in</strong>e Programmstruktur von Turbo <strong>Pascal</strong> ist grob <strong>in</strong> folgende<br />
vier Elemente gegliedert:<br />
●<br />
●<br />
●<br />
●<br />
Dem Programmkopf: Dieser besteht aus dem reservierten Wort<br />
"program" und e<strong>in</strong>em Bezeichner, der dem Programm e<strong>in</strong>en<br />
Namen gibt.<br />
Der USES-Anweisung: Diese enthält alle Namen der bei der<br />
Programmausführung benötigten Units (Programm Bibliotheken).<br />
Diese werden bei der Kompilierung e<strong>in</strong>gebunden.<br />
Der Vere<strong>in</strong>barungsteil: Hier werden alle globalen, also im ganzen<br />
Programm gültigen Konstanten, Datentypen, Variablen und<br />
Unterprogramme festgelegt. Dabei ist zu beachten, dass nur das<br />
benutzt werden kann was vorher vere<strong>in</strong>bart wurde.<br />
Das Hauptprogramm: Enthält Anweisungen und<br />
Anweisungsblöcke. Das Hauptprogramm beg<strong>in</strong>nt mit dem<br />
reservierten Wort "beg<strong>in</strong>", und endet mit dem reservierten Wort<br />
"end".<br />
Und jetzt zum besserem Verständnis, noch e<strong>in</strong> kle<strong>in</strong>en Beispiel, an dem<br />
die allg. Struktur ersichtlich wird:<br />
PROGRAM Me<strong>in</strong>_erstes_Programm;<br />
USES crt;<br />
VAR i: Byte;<br />
BEGIN<br />
writeln('Hallo!');<br />
writeln('So leicht ist Turbo <strong>Pascal</strong>');<br />
writeln('Programmende!');<br />
readln;<br />
END;<br />
Dieses kle<strong>in</strong>e Programm gibt, mit der Prozedur Writeln(), drei Zeilen<br />
Text auf dem Bildschirm aus. Nach Ausgabe des Textes, wird das<br />
Programm solange angehalten bis die ENTER-Taste gedrückt wird.<br />
file:///E|/homepage/<strong>Pascal</strong>/programmstruktur_.htm (1 of 2) [07.10.2001 00:29:36]
Die allgeme<strong>in</strong>e Programmstruktur von Turbo <strong>Pascal</strong> ist grob <strong>in</strong> folgende vier Elemente gegliedert<br />
Probleme mit TP Grundbegriffe<br />
file:///E|/homepage/<strong>Pascal</strong>/programmstruktur_.htm (2 of 2) [07.10.2001 00:29:36]
Grundbegriffe<br />
Grundbegriffe<br />
Zum Anfang erst mal e<strong>in</strong> kle<strong>in</strong>es Programm an dem dann die e<strong>in</strong>zelnen<br />
Begriffe erklärt werden.<br />
PROGRAM losgehts;<br />
BEGIN<br />
Writeln('Und ab gehts..');<br />
Readln;<br />
END;<br />
●<br />
●<br />
●<br />
●<br />
Programmname: H<strong>in</strong>ter dem reservierten Wort PRORGRAM wird<br />
immer der Programmname angegeben. Dieser muss mit e<strong>in</strong>em<br />
Buchstaben beg<strong>in</strong>nen und sollte nicht länger als Acht Zeichen<br />
se<strong>in</strong>. Er kann jedoch bis 64 Zeichen lang se<strong>in</strong>. (Siehe auch<br />
Abschnitt Bezeichner)<br />
Anweisungswörter: Das Programm losgehts ist e<strong>in</strong> sehr kurzes<br />
Programm und enthält nur zwei Anweisungen bzw.<br />
Anweisungswörter.<br />
Writeln ist e<strong>in</strong> Anweisungswort und steht für "Schreibe (Write)<br />
e<strong>in</strong>e Zeile (L<strong>in</strong>e)". Mit Writeln wird der Computer angewiesen,<br />
den angegebenen Text <strong>in</strong> e<strong>in</strong>er Zeile auszugeben.<br />
Zuweisungsanweisung ":=": (Zuweisungsoperator) Rechts vom<br />
Zuweisungszeichen ( := ) kann e<strong>in</strong> Ausdruck stehen, l<strong>in</strong>ks vom<br />
Zuweisungszeichen darf aber immern nur e<strong>in</strong>e Variable stehen.<br />
Variable := Ausdruck<br />
Die Zuweisungsanweisung geht immer <strong>in</strong> zwei Schritten vor sich: Im<br />
ersten wird der Wert des Ausdrucks ermittelt, um dann im zweiten Schritt<br />
diesen Wert <strong>in</strong> die l<strong>in</strong>ks vom Zuweisungszeichen angegebene Variable<br />
zuzuweisen. Der bisherige Wert wird dabei überschrieben - er wird durch<br />
denn neuen Wert ersetzt. Die Zuweisung geschieht somit von rechts<br />
nach l<strong>in</strong>ks.<br />
PROGRAM laenge;<br />
VAR<br />
text_laenge: Byte;<br />
text: Str<strong>in</strong>g;<br />
BEGIN<br />
text := 'Wie gehts denn so?';<br />
text_laenge := length(text);<br />
readln;<br />
file:///E|/homepage/<strong>Pascal</strong>/grundbegriffe.htm (1 of 2) [07.10.2001 00:29:47]
Grundbegriffe<br />
END.<br />
●<br />
Trennungszeichen ";": Das Semikolon dient <strong>in</strong> Turbo <strong>Pascal</strong> zur<br />
Trennung von Anweisungen. Durch e<strong>in</strong> ";" wird dem System<br />
mitgeteilt, dass e<strong>in</strong> neuer Befehl beg<strong>in</strong>nt. Dadurch wird zum<br />
Beispiel folgende Schreibweise möglich:<br />
Writeln('Hallo'); Writeln('Du da!'); Readln;<br />
● Kommentare im Quellcode: Kommentare werden zwischen (*...*)<br />
oder { ... } im Quelltext (Programmtext) geschrieben. Der<br />
Kommentar wird bei der Codierung gezeigt, bei der Ausführung<br />
des Programms jedoch ignoriert.<br />
●<br />
●<br />
Durch Kommentare ist es möglich bestimmte Abläufe im<br />
Programm zu erklären bzw. zu kennzeichnen. Dadurch wird der<br />
Quelltext für andere Programmierer leichter lesbar!<br />
Endezeichen ".": Der Punkt markiert das Ende e<strong>in</strong>es<br />
Programmes. Quelltext, der h<strong>in</strong>ter dem Punkt angegeben wird,<br />
bleibt somit unberücksichtigt.<br />
BEGIN..END als Block: E<strong>in</strong> BEGIN..END - Bereich begrenzt<br />
e<strong>in</strong>en Block als zusammengehörende E<strong>in</strong>heit auszuführender<br />
Anweisungen. Im Programm losgehts umschließt BEGIN...END<br />
zwei Anweisungen. E<strong>in</strong> Programm kann viele BEGIN...END -<br />
Bereiche enthalten - es darf jedoch nur h<strong>in</strong>ter dem letzten END e<strong>in</strong><br />
Punkt stehen.<br />
Allg. Programmstruktur Bezeichner <strong>in</strong> TP<br />
file:///E|/homepage/<strong>Pascal</strong>/grundbegriffe.htm (2 of 2) [07.10.2001 00:29:47]
Bezeichner <strong>in</strong> TP<br />
Bezeichner <strong>in</strong> <strong>Pascal</strong><br />
Bezeichner s<strong>in</strong>d die Namen für Variablen, Konstanten, Datentypen und<br />
Unterprogramme. Sie können vom Programmierer selbst vergeben<br />
werden.<br />
CONST<br />
Kurs = 1.67;<br />
VAR<br />
Meldung: Str<strong>in</strong>g;<br />
In Turbo <strong>Pascal</strong> s<strong>in</strong>d folgende Zeichen für Bezeichner erlaubt: Die<br />
Buchstaben A..Z <strong>in</strong> Groß- und Kle<strong>in</strong>schreibung, die Zahlen 0..9 und der<br />
Unterstrich. Dabei ist aber zu beachten das, dass erste Zeichen e<strong>in</strong>es<br />
Bezeichners immer e<strong>in</strong> Buchstabe se<strong>in</strong> muss!<br />
Als weiteres sollten Sie sich an die folgenden Grundsätze für die<br />
Namens- bzw. Bezeichnervergabe gewöhnen:<br />
●<br />
●<br />
●<br />
●<br />
Bezeichner sollten immer kurz und aussagekräftig geschrieben<br />
werden.<br />
Es s<strong>in</strong>d nur die ersten 64 Zeichen signifikant. D.h. nur zwischen<br />
den ersten 64 Zeichen wird unterschieden.<br />
In Turbo <strong>Pascal</strong> gibt es ke<strong>in</strong>e Unterscheidung zwischen Groß- und<br />
Kle<strong>in</strong>schreibung. SUN = sun = SuN<br />
Als weiteres ist es s<strong>in</strong>nvoll die Schreibweise der Bezeichner im<br />
gesamten Programm bei zubehalten.<br />
Auch hier noch mal e<strong>in</strong> paar Beispiel, denn an Beispielen lernt man am<br />
besten:<br />
VAR<br />
i: Byte;<br />
summe: Real;<br />
zaehler: Integer;<br />
Name, Vorname, Strasse: Str<strong>in</strong>g;<br />
PLZ: St<strong>in</strong>g[5];<br />
CONST<br />
Pi := 3,14159265358;<br />
file:///E|/homepage/<strong>Pascal</strong>/bezeichner_<strong>in</strong>_tp.htm (1 of 2) [07.10.2001 00:30:00]
Bezeichner <strong>in</strong> TP<br />
Kurs := 1.75;<br />
Grundbegriffe<br />
Reservierte Wörter<br />
file:///E|/homepage/<strong>Pascal</strong>/bezeichner_<strong>in</strong>_tp.htm (2 of 2) [07.10.2001 00:30:00]
Reservierte Wörter<br />
Reservierte Wörter<br />
Reservierte Wörter dürfen von Benutzer nicht als Bezeichner benutzt<br />
werden, das heißt es darf <strong>in</strong> e<strong>in</strong>em Programm ke<strong>in</strong>e Variable, Konstante,<br />
ke<strong>in</strong> Unterprogramm etc. geben welche den Namen e<strong>in</strong>es reservierten<br />
Wortes trägt.<br />
Es ist zur besseren Übersicht vorteilhaft, wenn Sie reservierte Wörter <strong>in</strong><br />
Großbuchstaben schreiben.<br />
Zum Beispiel darf e<strong>in</strong> Programm nicht BEGIN genannt werden, wohl aber<br />
BEGINNE.<br />
Reservierte Wörter <strong>in</strong> Turbo <strong>Pascal</strong> s<strong>in</strong>d unter anderem folgende Wörter:<br />
●<br />
ABSOLUTE, AND, ARRAY, BEGIN, CASE,<br />
CONST, CONSTRUCTUR, DESTRUCTOR, DIV,<br />
DO, DOWNTO, ELSE, END, EXTERNAL, FILE,<br />
FOR, FORWARD, FUNCTION, GOTO, IF,<br />
IMPLEMENTATION, IN, INLINE, INTERFACE,<br />
INTERRUPT, LABEL, MOD, NIL, NOT,<br />
OBJECT, OF, OR, OVERLAY, PACKED,<br />
PROCEDURE, PROGRAMM, RECORD, REPEAT,<br />
SET, SHL, SHR, STRING, THEN, TO, TYPE,<br />
UNIT, UNTIL, USES, VAR, VIRTUAL,<br />
WHILE, WITH, XOR<br />
Beispiel:<br />
PROGRAM Test;<br />
USES Crt;<br />
VAR downto: STRING[20];<br />
BEGIN<br />
downto := 'Hallo';<br />
Writeln(downto);<br />
readln;<br />
END;<br />
file:///E|/homepage/<strong>Pascal</strong>/reservierte_woerter.htm (1 of 2) [07.10.2001 00:30:10]
Reservierte Wörter<br />
Was ist am obigen Programm falsch? Richtig, hier wurde e<strong>in</strong>e Variable<br />
namens DOWNTO deklariert. Da DOWNTO aber e<strong>in</strong> reserviertes Wort ist, ist<br />
dies nicht zulässig.<br />
Bezeichner<br />
Vere<strong>in</strong>barung von Variablen<br />
file:///E|/homepage/<strong>Pascal</strong>/reservierte_woerter.htm (2 of 2) [07.10.2001 00:30:10]
Vere<strong>in</strong>barung von Variablen<br />
Vere<strong>in</strong>barung von Variablen<br />
E<strong>in</strong>e Variable kann man sich als Schachtel mit e<strong>in</strong>em Namen<br />
(Schachtelaufschrift) und e<strong>in</strong>em Wert (Schachtel<strong>in</strong>halt) vorstellen. Der<br />
Variablenname kann vom Benutzer frei gewählt werden. Der Computer<br />
ordnet diesem Namen dann bestimmte Speicherplätze im RAM zu.<br />
Welche Werte <strong>in</strong> dieser Variablen gespeichert werden können, hängt<br />
vom vere<strong>in</strong>barten Datentyp ab.<br />
E<strong>in</strong>e Variable wird mit dem reservierten Wort VAR vere<strong>in</strong>bart, worauf der<br />
Variablenname (Bezeichner) und der Datentyp folgt.<br />
VAR<br />
DM: Integer;<br />
Im Vere<strong>in</strong>barungsteil e<strong>in</strong>es Programms müssen alle Größen auf die<br />
später zugegriffen wird vere<strong>in</strong>bart (erklärt, deklariert) werden. VAR DM:<br />
Integer; liest man so: "Für e<strong>in</strong>e Variable DM Speicherplatz<br />
bereitstellen, damit später Zahlen abgelegt werden können".<br />
Bei der Vere<strong>in</strong>barung von Variablen gelten folgende Regeln:<br />
●<br />
●<br />
Die Vere<strong>in</strong>barungsregel: Erst nachdem man e<strong>in</strong>e Variable<br />
vere<strong>in</strong>bart hat, kann man <strong>in</strong> sie e<strong>in</strong>en Wert e<strong>in</strong>geben bzw. sich<br />
ihren Wert ausgeben lassen. Das heißt alle Variablen mit denen<br />
man Arbeiten möchten, müssen vorher deklariert werden. Die<br />
Vere<strong>in</strong>barungsregel bezieht sich auf den gesamten<br />
Programmblock.<br />
Die Initialisierungsregel: Bevor Sie mit e<strong>in</strong>er Variablen Arbeiten,<br />
zum Beispiel Rechnen, sollten Sie der Variablen immer erst e<strong>in</strong>en<br />
Anfangswert zuweisen (z.B. DM := 0;). Die Initialisierungsregel<br />
bezieht sich auf den Anweisungsteil des Programms.<br />
Reservierte Wörter<br />
Vere<strong>in</strong>barung von Konstanten<br />
file:///E|/homepage/<strong>Pascal</strong>/vere<strong>in</strong>barung_von_variablen.htm [07.10.2001 00:30:19]
Festlegen von Konstanten<br />
Festlegen von Konstanten<br />
Konstanten s<strong>in</strong>d Bezeichner die im gesamten Programm gleich bleiben,<br />
d.h. sie bekommen nur e<strong>in</strong>mal e<strong>in</strong>en Wert zugewiesen. Dieser Wert<br />
bleibt dann im gesamten Programm gleich und darf nicht verändert<br />
werden.<br />
Hier e<strong>in</strong> Beispiel für e<strong>in</strong>e Konstantenvere<strong>in</strong>barung:<br />
CONST<br />
Kurs_<strong>in</strong>_Dollar := 2.45;<br />
Das reservierte Wort "const" markiert den Anfang e<strong>in</strong>er<br />
Konstantenvere<strong>in</strong>barung. Durch CONST Kurs_<strong>in</strong>_Dollar = 2.45 wird für<br />
die Konstante namens Kurs_<strong>in</strong>_Dollar e<strong>in</strong> Zahlenwert von 2.45<br />
festgelegt.<br />
Der Datentyp für e<strong>in</strong>e Konstante muss nicht angegeben werden, da er<br />
Automatisch vom Compiler festgelegt wird.<br />
Jetzt noch e<strong>in</strong> paar ander Beispiele:<br />
CONST<br />
Programm_Title = 'Me<strong>in</strong> kle<strong>in</strong>es Programm';<br />
Menu_Item_01 = 'Kopieren';<br />
ERROR_NO_FILE = 'Datei nicht gefunden!';<br />
Vere<strong>in</strong>barung von Konstanten<br />
Befehle der Unit Crt<br />
file:///E|/homepage/<strong>Pascal</strong>/f_konstanten.htm [07.10.2001 00:30:34]
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm<br />
Befehle der Unit Crt<br />
Die Unit "crt" enthält Grundlegende Operationen für die Datene<strong>in</strong>gabe,<br />
Datenausgabe, Datenmanipulation und die Textgestalltung.<br />
Sie enthält unter andrem folgende Befehle:<br />
●<br />
textcolor (Farbe oder Farbcode): Textcolor legt die Farbe<br />
des Textes fest. Die Farbe kann als Englisches Wort (z.B.: red)<br />
oder Farbcode erfolgen.<br />
Mit der Addition des Attributes BLINK, wird der Text bl<strong>in</strong>kent<br />
angezeigt!<br />
Beispiel:<br />
PROGRAM Text_Farbe;<br />
USES crt;<br />
BEGIN<br />
writeln('Jetzt ist der Text Normal');<br />
textcolor(red);<br />
writeln('Jetzt ist er rot');<br />
textcolor(darkred);<br />
writeln('dunkelrot');<br />
writeln('Immer noch dunkelrot');<br />
textcolor(grey);<br />
writeln('Wieder Normal');<br />
textcolor(white + bl<strong>in</strong>k);<br />
writeln('Weiß + bl<strong>in</strong>kent');<br />
readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm (1 of 3) [07.10.2001 00:30:47]
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm<br />
●<br />
textbackground (Farbe oder Farbcode): Textbackground<br />
legt die H<strong>in</strong>tergrundfarbe des Textes fest. Die Farbe kann als<br />
Englisches Wort (z.B.: red) oder Farbcode erfolgen.<br />
Beispiel:<br />
PROGRAM Text_H<strong>in</strong>tergrund;<br />
USES crt;<br />
BEGIN<br />
writeln('H<strong>in</strong>tergrund ist Schwarz');<br />
textbackgrund(red);<br />
writeln('H<strong>in</strong>tergrund ist rot');<br />
readln;<br />
END.<br />
●<br />
delay (Zeit <strong>in</strong> ms): Delay hält das Programm für e<strong>in</strong>e<br />
bestimmte Zeit an. Die Zeitangabe erfolgt <strong>in</strong> Millisekunden.<br />
Beispiel:<br />
PROGRAM Warten;<br />
USES crt;<br />
BEGIN<br />
writeln('Programm läuft');<br />
delay(5000)<br />
writeln('Programm hat 5 Sekunden gewartet');<br />
readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm (2 of 3) [07.10.2001 00:30:47]
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm<br />
●<br />
writeln (Str<strong>in</strong>g): Writeln gibt Text auf dem Bildschirm aus<br />
und führt dann e<strong>in</strong>en Zeilenumbruch durch..<br />
Beispiel:<br />
PROGRAM Text_ausgabe;<br />
USES crt;<br />
VAR<br />
Text: Str<strong>in</strong>g; BEGIN<br />
:Text := 'Me<strong>in</strong> kle<strong>in</strong>es Programm!';<br />
writeln(Text);<br />
writeln('Schön oder?');<br />
readln;<br />
END.<br />
●<br />
write (Str<strong>in</strong>g): Write gibt, genauso wie writeln, Text auf<br />
dem Bildschirm aus, führt aber ke<strong>in</strong>en Zeilenumbruch durch.<br />
●<br />
gotoxy (Spalte, Zeile): Positioniert den Cursor auf dem<br />
Bildschirm. Im Text-Modus von Turbo <strong>Pascal</strong> gibt es 80 Spalten<br />
und 25 Zeilen.<br />
Vere<strong>in</strong>barung von Konstanten<br />
Datentypen <strong>in</strong> TP<br />
file:///E|/homepage/<strong>Pascal</strong>/Befehl_unit_crt.htm (3 of 3) [07.10.2001 00:30:47]
Datentypen <strong>in</strong> <strong>Pascal</strong><br />
Datentypen <strong>in</strong> <strong>Pascal</strong><br />
Der Datentyp gibt an Welche Werte e<strong>in</strong>e Variable, Konstante und Unterprogramme<br />
annehmen bzw. zurück geben können.<br />
In Turbo <strong>Pascal</strong> stehen folgende vordef<strong>in</strong>ierten Datentypen zur Verfügung. Natürlich können<br />
auch noch selbst def<strong>in</strong>ierte Datentypen erzeugt werden.<br />
Datentypen für ganze Zahlen<br />
Typ Speicherbedarf Zahlenbereich<br />
BYTE<br />
SHORTINT<br />
WORD<br />
INTEGER<br />
LONGINT<br />
1 Byte<br />
1 Byte<br />
2 Byte<br />
2 Byte<br />
4 Byte<br />
0 .. 255<br />
-128 .. 127<br />
0 .. 65536<br />
-32768 .. 32767<br />
-2147483648 ..<br />
2147483647<br />
Datentypen für reelle Zahlen<br />
Typ Speicherbedarf Zahlenbereich<br />
REAL<br />
SINGLE<br />
DOUBLE<br />
EXTENDED<br />
Datentypen für Zeichen<br />
CHAR<br />
STRING<br />
4 Byte<br />
6 Byte<br />
8 Byte<br />
10 Byte<br />
2.9E-39 .. 1.7E+38<br />
1.5E-45 .. 3.4E38<br />
5.0E-324 .. 1.7E308<br />
1.9E-4951 .. 1.1E4932<br />
Typ Speicherbedarf Inhalt<br />
1 Byte<br />
255 Byte max.<br />
e<strong>in</strong> Zeichen z.B.: a, B, $<br />
Zeichenkette (Worte,<br />
Sätze)<br />
Datentyp für Logische Variablen<br />
Typ Speicherbedarf Inhalt<br />
BOOLEAN<br />
1 BYTE<br />
True(wahr) oder<br />
False(unwahr)<br />
Vordef<strong>in</strong>ierte Konstanten<br />
Name Wert Datentyp<br />
MAXINT<br />
PI<br />
TRUE<br />
FALSE<br />
32767<br />
3.1415926536E00<br />
Wahrheitswert richtig<br />
Wahrheitswert falsch<br />
<strong>in</strong>teger<br />
real<br />
boolean<br />
boolean<br />
Befehle der Unit Crt E<strong>in</strong>fache Datentypen<br />
file:///E|/homepage/<strong>Pascal</strong>/datentypen_<strong>in</strong>_pascal.htm [07.10.2001 00:33:35]
E<strong>in</strong>fache Datentypen<br />
E<strong>in</strong>fache Datentypen<br />
In Turbo <strong>Pascal</strong> werden die e<strong>in</strong>fachen Datentypen Real, Integer, Byte,<br />
Boolean, Char bereitgestellt. Verarbeitet mann Text als e<strong>in</strong>e<br />
Datene<strong>in</strong>heit, so zählt man auch den Str<strong>in</strong>g zu den e<strong>in</strong>fachen Typen.<br />
E<strong>in</strong>fach bedeutet, dass e<strong>in</strong>e Konstante oder Variable dieses Typs jeweils<br />
nur e<strong>in</strong>en Wert annahmen darf: e<strong>in</strong>e Zahl, e<strong>in</strong> Zeichen oder e<strong>in</strong>en Text.<br />
Dabei unterscheidet man zwischen abzählbaren und nicht abzählbaren<br />
Datentypen. Integer, Byte, Boolean und Char s<strong>in</strong>d abzählbare<br />
Datentypen. Real jedoch ist nicht abzählbar, da es unendlich viele<br />
gebrochene Zahlen gibt - man kann sie nicht abzählen. Zu e<strong>in</strong>er Real-<br />
Zahl kann man ke<strong>in</strong>en exakten Vorgänger bzw. Nachfolger angeben.<br />
Dieser Datentyp eignet sich deshalb auch nicht zum Zählen, sondern<br />
mehr zum Messen.<br />
Für skalierbare (Abzählbare) Datentypen stehen unter andrem folgende<br />
vordef<strong>in</strong>ierten Funktionen zur Verfügung:<br />
●<br />
Succ(): Liefert den Nachfolger e<strong>in</strong>es Wertes, falls es nicht der<br />
letzte ist.<br />
Beispiel:<br />
Succ(99) ist 100<br />
Succ('d') ist 'e'<br />
●<br />
Pred(): Gibt den Vorgänger e<strong>in</strong>es Wertes, falls es nicht der erste<br />
ist, aus.<br />
Beispiel:<br />
Pred(1) ist 0<br />
Pred('b') ist 'a'<br />
●<br />
Ord(): Gibt die Ordnungsnummer e<strong>in</strong>es Wertes aus.<br />
Beispiel:<br />
Ord(99) ist 99<br />
Ord('A') ist 65<br />
E<strong>in</strong>fache Datentypen können Sie Vergleichen, dazu s<strong>in</strong>d folgende<br />
Vergleichsoperatoren erlaubt: , =, =, <br />
file:///E|/homepage/<strong>Pascal</strong>/e<strong>in</strong>fache_datentypen.htm (1 of 2) [07.10.2001 00:34:10]
E<strong>in</strong>fache Datentypen<br />
Datentypen <strong>in</strong> TP Der Datentyp Integer<br />
file:///E|/homepage/<strong>Pascal</strong>/e<strong>in</strong>fache_datentypen.htm (2 of 2) [07.10.2001 00:34:10]
Der Datentyp Integer<br />
Der Datentyp Integer<br />
Der Datentyp Integer enthält ganzwertige Zahlen im Bereich von -32768<br />
und 32767.<br />
Der Datentyp Integer ist e<strong>in</strong> ord<strong>in</strong>aler Datentyp. Sie zeichnen sich durch<br />
e<strong>in</strong>e natürliche Reihenfolge ihrer Werte aus. d.h. es gibt e<strong>in</strong>en 1. Wert, 2.<br />
Wert, ..., n. Wert.<br />
E<strong>in</strong> Integer Wert belegt <strong>in</strong>tern 2 Bytes im Speicher.<br />
Deklaration:<br />
CONST<br />
I = 100;<br />
VAR<br />
ALTER: Integer;<br />
Auf e<strong>in</strong>en Integer-Wert s<strong>in</strong>d folgende Operatoren möglich:<br />
● +, -, *, /<br />
● =, , =, <br />
● DIV (ganzzahlige Division)<br />
● MOD (Rest der ganzzahligen Division)<br />
● AND, OR, XOR, NOT (Vergleiche)<br />
Integer-Werte s<strong>in</strong>d nutzbar für Kontrollvariablen <strong>in</strong> FOR und CASE<br />
Anweisungen.<br />
Als weiteres stellt der Integer-Datentyp den Grundtyp für die<br />
Mengenbildung da und ist auch als ARRAY-Index nutzbar.<br />
E<strong>in</strong>fache Datentypen Der Datentyp Real<br />
file:///E|/homepage/<strong>Pascal</strong>/der_datentyp_<strong>in</strong>teger.htm [07.10.2001 00:34:42]
Der Datentyp Real<br />
Der Datentyp Real<br />
E<strong>in</strong> Realwert enthält e<strong>in</strong>e Gleitkomma-Zahl mit 11 signifikanten Stellen <strong>in</strong><br />
der Mantisse und -38 bis 38 <strong>in</strong> der Hochzahl.<br />
Der Datentyp Real ist nicht abzählbar, da es unendlich viele gebrochene<br />
Zahlen gibt - man kann sie nicht abzählen. Zu e<strong>in</strong>er Real-Zahl kann man<br />
ke<strong>in</strong>en exakten Vorgänger bzw. Nachfolger angeben. Dieser Datentyp<br />
eignet sich deshalb auch nicht zum Zählen, sondern mehr zum Messen.<br />
E<strong>in</strong> Real - Wert belegt <strong>in</strong>tern 4 Bytes im Speicher.<br />
Deklaration:<br />
CONST<br />
Kurs = 1.25;<br />
VAR<br />
Summe: Real;<br />
Folgende Operationen s<strong>in</strong>d auf den Datentyp Real anwendbar:<br />
● +, -, *, /<br />
● Ke<strong>in</strong>e Potenzierung<br />
Auf den Datentyp Real s<strong>in</strong>d unter andrem folgende arithmetische<br />
Funktionen anwendbar:<br />
●<br />
●<br />
●<br />
●<br />
●<br />
●<br />
abs(r): absoluter Betrag von r<br />
sqr(r): Quadrat von r<br />
sqrt(r): Quadratwurzel von r<br />
s<strong>in</strong>(r): S<strong>in</strong>usfunktion<br />
cos(r): Cos<strong>in</strong>usfunktion<br />
<strong>in</strong>t(r): Ganzzahliger Anteil der Variable r<br />
Der Real Datentyp ist nicht ord<strong>in</strong>al und deshalb nicht nutzbar für die<br />
Funktionen Pred, Succ und Ord. Für die Indizierung, Mengenbildung<br />
und Ablaufkontrollen wie FOR und CASE ist er ebenfalls nicht nutzbar.<br />
Der Datentyp Integer<br />
Der Datentyp Str<strong>in</strong>g<br />
file:///E|/homepage/<strong>Pascal</strong>/der_datentyp_real.htm [07.10.2001 00:34:53]
Der Datentyp Str<strong>in</strong>g<br />
Der Datentyp Str<strong>in</strong>g<br />
E<strong>in</strong>e Variable vom Datentyp Str<strong>in</strong>g ist e<strong>in</strong>e Ane<strong>in</strong>anderreihung von<br />
Zeichen des Datentyps Char zu e<strong>in</strong>er Zeichenkette. Turbo <strong>Pascal</strong><br />
unterstützt Zeichenketten bis zu e<strong>in</strong>er Länge von 255 Zeichen. E<strong>in</strong><br />
Str<strong>in</strong>g, der ke<strong>in</strong> Zeichen enthält, hat die Länge Null und wird Null- oder<br />
Leerstr<strong>in</strong>g genannt.<br />
E<strong>in</strong>e Variable vom Typ Str<strong>in</strong>g wird wie folgt vere<strong>in</strong>bart:<br />
VAR<br />
str: St<strong>in</strong>g;<br />
identisch mit: str: Str<strong>in</strong>g[255];<br />
Damit kann im Programm e<strong>in</strong>e Variable benutzt werden, die maximal 255<br />
Zeichen enthalten kann.<br />
Soll die maximale Länge e<strong>in</strong>er Zeichenkette verr<strong>in</strong>gert werden, so<br />
geschieht dies durch Angabe e<strong>in</strong>es Integer-Wertes, der <strong>in</strong> eckige<br />
Klammern dem reservierten Wort Str<strong>in</strong>g folgt:<br />
VAR<br />
str: Str<strong>in</strong>g[15];<br />
Damit wurde e<strong>in</strong>e Zeichenkette reserviert, die maximal 15 Zeichen<br />
enthalten darf. Sie kann zwar weniger, aber niemals mehr als die<br />
angegebenen Zeichen enthalten.<br />
Werden Zeichenketten Variablen zugewiesen, so stehen sie immer<br />
zwischen Hochkommas. Mit der Vere<strong>in</strong>barung der Variablen str von<br />
Datentyp Str<strong>in</strong>g ist zum Beispiel folgende Zuweisung zulässig:<br />
str := 'Test';<br />
Auf jedes Zeichen der Zeichenkette kann e<strong>in</strong>zeln zugegriffen werden, <strong>in</strong><br />
dem die Position des Zeichens <strong>in</strong> eckigen Klammern h<strong>in</strong>ter dem Namen<br />
der Zeichenkette gesetzt wird:<br />
str := 'Me<strong>in</strong> Str<strong>in</strong>g';<br />
writeln(str[6]);<br />
Mit der writeln Anweisung wird das 6. Zeichen, also das "S", der<br />
Zeichenkette ausgegeben.<br />
file:///E|/homepage/<strong>Pascal</strong>/der_datentyp_str<strong>in</strong>g.htm (1 of 2) [07.10.2001 00:35:15]
Der Datentyp Str<strong>in</strong>g<br />
Mit Str<strong>in</strong>gs s<strong>in</strong>d alle Vergleichsoperationen und die Addition von Str<strong>in</strong>gs<br />
erlaubt.<br />
Beispiel für die Addition von Str<strong>in</strong>gs:<br />
str3 := str1 + str2;<br />
str := 'Alex' + 'an der';<br />
Der Datentyp Real<br />
Standardrout<strong>in</strong>en für den Datentyp Str<strong>in</strong>g<br />
file:///E|/homepage/<strong>Pascal</strong>/der_datentyp_str<strong>in</strong>g.htm (2 of 2) [07.10.2001 00:35:15]
Aufzählende Datentypen<br />
Aufzählende Datentypen<br />
Aufzählungstypen s<strong>in</strong>d selbstdef<strong>in</strong>ierte Datentypen, deren Wertebereich<br />
durch Aufzählen festgelegt wird. Der aufzählende Datentyp besteht aus<br />
e<strong>in</strong>er Aufzählung von Elementen, die <strong>in</strong> runden Klammern stehen und<br />
jeweils durch Kommas getrennt s<strong>in</strong>d.<br />
TYPE<br />
TypName = (element1, element2 ..., elemnetN);<br />
Die Deklaration e<strong>in</strong>es Aufzählungstypen erfolgt mit dem reservierten<br />
Wort TYPE, welchem der TypName und die Aufzählung der Elemente<br />
folgt.<br />
Beispiele für solche Deklarationen s<strong>in</strong>d:<br />
TYPE<br />
Zahlen = (e<strong>in</strong>s, zwei, drei);<br />
Groesse = (gross, mittle, kle<strong>in</strong>);<br />
Farben = (blau, gelb, weiss, grau, rot);<br />
Der aufzählende Datentyp besitzt e<strong>in</strong>e bestimmte Reihenfolge, d.h. die<br />
Anordnung der Elemente ist beim Zugriff zu beachten. Für jedes Element<br />
gibt es e<strong>in</strong>en festen Vor- bzw. Nachfolger, was die Anwendung der<br />
Standardfunktionen Succ, Pred und Ord ermöglicht.<br />
Leider weisen Aufzählungstypen e<strong>in</strong>en entscheidenden Nachteil auf, der<br />
ihre breite Verwendung e<strong>in</strong>schränkt. Sie lassen sich weder über die<br />
read/readln Anweisung e<strong>in</strong>lesen, noch lassen sie sich über<br />
write/Writeln ausgeben. Da die Werte ke<strong>in</strong>e Zeichenketten<br />
darstellen.<br />
So müssen für die E<strong>in</strong>- und Ausgabe gesonderte Hilfsvariablen deklariert<br />
werden. Dennoch können aufzählende Datentypen die Programmstruktur<br />
erhöhen und für bessere Lesbarkeit im Programm sorgen.<br />
Die Reihenfolge, <strong>in</strong> der die Werte aufgeführt werden, legt gleichzeitig<br />
e<strong>in</strong>e Anordnung fest. Ke<strong>in</strong>er der Werte darf mehrmals aufgeführt werden.<br />
Zwei Typbeschriebungen, die dieselben Werte <strong>in</strong> unterschiedlicher<br />
Reihenfolge enthalten, s<strong>in</strong>d somit verschieden.<br />
TYPE<br />
Auto_Art_1 = (lkw, bus, pkw);<br />
Auto_Art_2 = (lkw, pkw, bus);<br />
file:///E|/homepage/<strong>Pascal</strong>/aufzählende_datentypen.htm (1 of 3) [07.10.2001 00:35:28]
Aufzählende Datentypen<br />
Der Type Auto_Art_2 unterscheidet sich <strong>in</strong> der Reihenfolge von pkw<br />
und bus, ist also e<strong>in</strong> anderer Datentyp als Auto_Art_1.<br />
Mit der Type- und Var - Vere<strong>in</strong>barung<br />
TYPE<br />
Groesse = (kle<strong>in</strong>, mittel, gross);<br />
VAR<br />
person: Groesse;<br />
ist folgende Schleife möglich:<br />
FOR person := kle<strong>in</strong> TO gross DO<br />
BEGIN<br />
...;<br />
...;<br />
END;<br />
Aufgrund der festgelegten Reihenfolge s<strong>in</strong>d auch Vergleichsoperationen<br />
möglich. Es werden dabei die Plätze verglichen, an denen die e<strong>in</strong>zelnen<br />
Werte <strong>in</strong> der Typendef<strong>in</strong>ition auftreten. Deren Zählung beg<strong>in</strong>nt mit 0. Der<br />
Wert kle<strong>in</strong> steht vor dem Wert mittel<br />
In den meisten Fällen werden Auszählungstypen nicht zur E<strong>in</strong>- und<br />
Ausgabe benutzt, sondern dazu Klarheit und Lesbarkeit e<strong>in</strong>es<br />
Programms zu erhöhen.<br />
Zur Ausgabe e<strong>in</strong>es Wertes aus dem Aufzählungstyp kann, wie bereits<br />
erwähnt, der Wert nicht selbst <strong>in</strong> e<strong>in</strong>er Schreibanweisung benutzt<br />
werden. Man muss die Ausgabe e<strong>in</strong>es passenden Str<strong>in</strong>gs gesondert<br />
programmieren. Dies erfolgt zum Beispiel mit e<strong>in</strong>er CASE-Entscheidung.<br />
VAR<br />
person: groesse;<br />
...;<br />
BEGIN<br />
...;<br />
CASE person OF<br />
kle<strong>in</strong>: Wrtieln('kle<strong>in</strong>');<br />
mittel: Writeln('mittel');<br />
gross: Writeln('gross');<br />
END;<br />
...;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/aufzählende_datentypen.htm (2 of 3) [07.10.2001 00:35:28]
Aufzählende Datentypen<br />
Standardrout<strong>in</strong>en des Datentyp Str<strong>in</strong>g Teilbereichtstypen<br />
file:///E|/homepage/<strong>Pascal</strong>/aufzählende_datentypen.htm (3 of 3) [07.10.2001 00:35:28]
Teilbereichstypen<br />
Teilbereichstypen<br />
Mit Ausnahme der Datentypen für die Erfassung von reellen Zahlen (z.B.<br />
Real oder Double) lassen sich zu allen bisher bekannten Datentypen<br />
Unterbereichstypen (Teilbereichstypen) deklarieren. Diese s<strong>in</strong>d e<strong>in</strong><br />
Ausschnitt, e<strong>in</strong> Bereich aus der Wertemenge e<strong>in</strong>es zugrundeliegenden,<br />
also vorher def<strong>in</strong>ierten (bekannten) Datentyps.<br />
Mit der Typdeklaration:<br />
TYPE<br />
Bis_Tausend = 0..1000;<br />
können Sie zum Beispiel e<strong>in</strong>em Teilbereich der ganzen Zahlen e<strong>in</strong>en<br />
eigenen Datentyp zuweisen. Die Deklaration e<strong>in</strong>es solchen Datentyps ist<br />
<strong>in</strong>sbesondere deshalb s<strong>in</strong>nvoll, weil der Computer allen späteren<br />
deklarierten Variablen dieses Typs die richtige E<strong>in</strong>haltung des zulässigen<br />
Wertebereichs überprüft und Bereichsüberschreitungen mit<br />
entsprechenden Fehlermeldungen quitiert. Bis_Tausend umfaßt nach<br />
der obigen Deklaration alle ganzen Zahlen im Bereich von Null bis<br />
E<strong>in</strong>tausend.<br />
Der Datentyp des Grundtyps muss nicht angegeben werden, da er vom<br />
Compiler erkannt und festgelegt wird.<br />
TYPE<br />
Grosse_buchstaben = 'A'..'Z'; {Grundtyp Char}<br />
Ziffern = '0'..'9'; {Grundtyp Char}<br />
Mit den Werten des Unterbereich s<strong>in</strong>d im Pr<strong>in</strong>zip dieselben Operationen<br />
möglich, die für die Werte des Grundtyps def<strong>in</strong>iert s<strong>in</strong>d. Es muss aber<br />
beachtet werden, dass nicht alle Operationen e<strong>in</strong>en Wert des<br />
Unterbereichs als Ergebnis zu haben brauchen. Zum Beispiel kann die<br />
Differenz zweier natürlicher Zahlen negativ se<strong>in</strong>, welche nicht mehr zum<br />
Unterbereichstyp der natürlichen Zahlen gehört.<br />
Bei den Unterbereichstypen s<strong>in</strong>d alle Vergleichsoperationen erlaubt, die<br />
auch beim Grundtyp zugelassen s<strong>in</strong>d.<br />
Aufzählende Datentypen<br />
Explizite / Implizite Typenvere<strong>in</strong>barung<br />
file:///E|/homepage/<strong>Pascal</strong>/teilbereichstypen.htm [07.10.2001 00:35:41]
Explizite und implizite Typenvere<strong>in</strong>barung<br />
Explizite und implizite Typenvere<strong>in</strong>barung<br />
Explizite Typenvere<strong>in</strong>barung ist die benannte Typvere<strong>in</strong>barung. Für<br />
e<strong>in</strong>en Datentyp wird ausdrücklich (explizit) unter Type e<strong>in</strong> Name<br />
vergeben. Der Datentyp ist benannt und kann beliebig oft auf der rechten<br />
Seite e<strong>in</strong>er Variablenvere<strong>in</strong>barung angegeben werden.<br />
Aus der Expliziten Typenvere<strong>in</strong>barung ergeben sich folgende Vorteile:<br />
●<br />
●<br />
●<br />
Übersichtlichkeit durch Wahl aussagekräftiger Namen.<br />
Unterbereichstypen (Teilbereichstypen) können nur zu benannten<br />
Typen vere<strong>in</strong>bart werden.<br />
Nur benannte Typen können als Parameter übergeben werden<br />
(strukturierte Datentypen wie Array, Record, Mengen etc. müssen<br />
benannt werden)<br />
Die Implizierte Typenvere<strong>in</strong>barung dagegen ist die anonyme<br />
Typenvere<strong>in</strong>barung. Der Datentyp wird nur auf der rechten Seite e<strong>in</strong>er<br />
Variablenvere<strong>in</strong>barung angegeben er bleibt somit anonym. Bei kurzen<br />
Programmen ist diese Möglichkeit berechtigt.<br />
Beispiele für explizite und implizite Typenvere<strong>in</strong>barung:<br />
●<br />
Explizite Typenvere<strong>in</strong>barung mit const und type:<br />
CONST<br />
rabatt_1 = 2;<br />
rabatt_2 = 15;<br />
TYPE<br />
Rabatte = rabatt_1..rabatt_2;<br />
●<br />
VAR<br />
Rabatt: Rabatte;<br />
Explizite Typenvere<strong>in</strong>barung mit type:<br />
TYPE<br />
Rabatte = 2..15;<br />
●<br />
VAR<br />
Rabatt: Rabatte;<br />
Implizite Typenvere<strong>in</strong>barung mit var:<br />
file:///E|/homepage/<strong>Pascal</strong>/explizite_und_implizite_typenver.htm (1 of 2) [07.10.2001 00:35:50]
Explizite und implizite Typenvere<strong>in</strong>barung<br />
VAR<br />
Rabatt: 2..15;<br />
Teilbereichstypen<br />
Die IF - Entscheidung<br />
file:///E|/homepage/<strong>Pascal</strong>/explizite_und_implizite_typenver.htm (2 of 2) [07.10.2001 00:35:50]
Die IF<br />
Die IF - Bed<strong>in</strong>gung<br />
Mit der IF - Struktur entscheidet Turbo <strong>Pascal</strong> zwischen zwei<br />
Anweisungen oder Anweisungsblöcken, deren Ausführung von e<strong>in</strong>er<br />
Bed<strong>in</strong>gung abhängig ist. Die allgeme<strong>in</strong>e Schreibweise lautet wie folgt:<br />
IF Bed<strong>in</strong>gung THEN Anweisung ELSE Anweisung2;<br />
IF leitet die IF - Struktur e<strong>in</strong>, worauf die Bed<strong>in</strong>gung folgt, von deren Wert<br />
(true oder false) es abhängt, ob der THEN - Zweig oder der ELSE -<br />
Zweig ausgeführt wird. Die Bed<strong>in</strong>gung muss entweder e<strong>in</strong> Ausdruck oder<br />
e<strong>in</strong>e Variable vom Typ Boolean se<strong>in</strong>.<br />
Ist die Bed<strong>in</strong>gung True, werden die Anweisungen des THEN - Zweiges<br />
ausgeführt. Die Anweisungen im ELSE - Zweig werden dann ignoriert.<br />
Ist die Bed<strong>in</strong>gung False, werden die Anweisungen des ELSE - Zweiges<br />
(falls vorhanden) ausgeführt. Die Anweisungen des THEN - Zweiges<br />
werden dann ignoriert!<br />
Der ELSE - Zweig ist optional. Er muss nicht <strong>in</strong> jeder IF - Struktur<br />
enthalten se<strong>in</strong>. Wenn der ELSE - Zweig fehlt wird mit der eigentlichen<br />
Programmausführung fortgefahren.<br />
Sollen <strong>in</strong> e<strong>in</strong>em Zweig mehrere Anweisungen, also e<strong>in</strong> Anweisungsblock,<br />
ausgeführt werden, so müssen diese zwischen BEGIN und END<br />
geschachtelt werden.<br />
Das Struktogramm für e<strong>in</strong>e IF - Bed<strong>in</strong>gung sieht wie folgt aus:<br />
Hier e<strong>in</strong> kle<strong>in</strong>es Beispiel für e<strong>in</strong>e IF - Entscheidung:<br />
PROGRAM Sortieren_von_drei_Zahlen;<br />
USES crt;<br />
VAR a, b, c, h: INTEGER;<br />
BEGIN<br />
{PROGRAMMINFO}<br />
TextColor(white);<br />
CLRSCR;<br />
WRITELN('SORTIERUNGSPROGRAMM');<br />
WRITELN('Geben Sie drei ganze Zahlen e<strong>in</strong>!');<br />
{DATENABFRAGE}<br />
file:///E|/homepage/<strong>Pascal</strong>/die_if.htm (1 of 2) [07.10.2001 00:35:57]
Die IF<br />
WRITELN;<br />
WRITE('Erste Zahl: ');<br />
READLN(a);<br />
WRITE('Zweite Zahl: ');<br />
READLN(b);<br />
WRITE('Dritte Zahl: ');<br />
READLN(c);<br />
WRITELN;<br />
{DATENVERARBEITUNG}<br />
IF a > b THEN<br />
BEGIN<br />
H := a; a := b; b := h;<br />
END;<br />
IF b > c THEN<br />
BEGIN<br />
h := b; b := c; c := h;<br />
END;<br />
IF a > b THEN<br />
BEGIN<br />
h := a; a := b; b := h;<br />
END;<br />
{ERGEBNISS AUSGEBEN}<br />
writeln('geordnet: ', a:7,b:7,c:7);<br />
READLN;<br />
END.<br />
Das obige Beispiel zeigt den Syntax und den Ablauf e<strong>in</strong>er IF -<br />
Entscheidung. Im Programm müssen drei Zahlen e<strong>in</strong>gegeben werden,<br />
die dann vom Programm im sortierten Zustand wieder ausgegeben<br />
werden.<br />
Explizite / implizite Typenvere<strong>in</strong>barung Die CASE - Entscheidung<br />
file:///E|/homepage/<strong>Pascal</strong>/die_if.htm (2 of 2) [07.10.2001 00:35:57]
Die CASE<br />
Die CASE - Bed<strong>in</strong>gung<br />
E<strong>in</strong>e Mehrfachentscheidung kann mit der CASE-Anweisung viel übersichtlicher und<br />
kürzer programmiert werden (vgl. zu IF). Die allg. Struktur der CASE-Anweisung<br />
lautet:<br />
case Ausdruck of<br />
marke1: Anweisung;<br />
marke2: Anweisung;<br />
marke3: Anweisung;<br />
...<br />
else<br />
Anweisung(en);<br />
end;<br />
Turbo <strong>Pascal</strong> berechnet bei der Verwendung der CASE-Anweisung den Ausdruck<br />
(auch Selektor genannt) und vergleicht ihn nache<strong>in</strong>ander mit den e<strong>in</strong>zelnen Marken.<br />
von denen <strong>in</strong>nerhalb der CASE-Anweisung beliebig viele vorhanden se<strong>in</strong> können.<br />
Stimmt der Wert des Ausdrucks mit dem Wert der Marke übere<strong>in</strong>, wird die auf der<br />
Marke folgende Anweisung bzw. der Anweisungsblock ausgeführt. Die restlichen<br />
Marken werden übersprungen! F<strong>in</strong>det Turbo <strong>Pascal</strong> ke<strong>in</strong>e Marke deren Wert mit dem<br />
Wert des Ausdrucks übere<strong>in</strong>stimmt, die Anweisung bzw. der Anweisungsblock des<br />
(optionalen) ELSE-Zweigs ausgeführt.<br />
Die Werte der Marken dürfen e<strong>in</strong>zelne Werte, mehrere Werte (durch Kommata<br />
getrennt) oder auch Bereiche, durch die Angabe charakterisiert (B1..B2), se<strong>in</strong>.<br />
●<br />
●<br />
●<br />
Es s<strong>in</strong>d nur ord<strong>in</strong>ale Datentypen (allg. Aufzählungstypen) erlaubt!<br />
Der wert des Selektors muss aus dem Bereich -32768..32767 se<strong>in</strong>!<br />
Beachten Sie das jede Marke <strong>in</strong> der CASE-Anweisung nur e<strong>in</strong>mal auftreten darf!<br />
Das Struktogramm für e<strong>in</strong>e CASE - Bed<strong>in</strong>gung sieht wie folgt aus:<br />
file:///E|/homepage/<strong>Pascal</strong>/die_case.htm (1 of 3) [07.10.2001 00:36:06]
Die CASE<br />
Auch hier e<strong>in</strong> kle<strong>in</strong>es Beispiel für e<strong>in</strong>e CASE - Entscheidung:<br />
PROGRAM quatral_mit_case;<br />
USES crt;<br />
CONST<br />
Frage = 'Geburtsmonat? ';<br />
VAR<br />
Monat: Byte;<br />
BEGIN<br />
Clrscr;<br />
Write(Frage);<br />
GotoXY(1 + Length(Frage), 1);<br />
Readln(Monat);<br />
Clrscr;<br />
GotoXY(10, 5);<br />
Write('Sie s<strong>in</strong>d im ');<br />
{BEGIN CASE - BEDINGUNG}<br />
CASE Monat OF<br />
1..3: Write('I. Quatral geboren.');<br />
4..6: Write('II. Quatral geboren.');<br />
7..9: Write('III. Quatral geboren.');<br />
ELSE Write('IV. Quatral geboren.');<br />
END;<br />
{ENDE CASE - BEDINGUNG}<br />
GotoXY(1, 25);<br />
Write('Bitte [Return] druecken ...');<br />
Readln;<br />
file:///E|/homepage/<strong>Pascal</strong>/die_case.htm (2 of 3) [07.10.2001 00:36:06]
Die CASE<br />
END.<br />
Das obige Beispiel zeigt den Syntax und den Ablauf e<strong>in</strong>er CASE - Entscheidung. Das<br />
Programm gibt, nach E<strong>in</strong>gabe des Geburtsmonats, das Geburtsquartal aus.<br />
Die IF - Entscheidung<br />
Die REPEAT / UNTIL - Schleife<br />
file:///E|/homepage/<strong>Pascal</strong>/die_case.htm (3 of 3) [07.10.2001 00:36:06]
Die REPEAT<br />
Die REPEAT / UNTIL - Schleife<br />
Schleifen werden <strong>in</strong> allen Programmiersprachen benutzt um e<strong>in</strong>zelne<br />
Anweisungen oder Anweisungsblöcke zu wiederholen. Schleifen<br />
erleichtern die Arbeit und machen e<strong>in</strong> Programm übersichtlicher.<br />
Erstmal das Struktogramm für e<strong>in</strong>e UNTIL / REPEAT - Schleife:<br />
Die Anzahl der Schleifendurchläufe muss vorher nicht bekannt se<strong>in</strong>. Es<br />
wird zur Beendigung der Schleife e<strong>in</strong>e Bed<strong>in</strong>gung benutzt. Die<br />
Abbruchbed<strong>in</strong>ung wird am Ende der Schleife geprüft. Allgeme<strong>in</strong>e<br />
Schreibweise der Repeat-Schleife:<br />
REPEAT<br />
Anweisung(en);<br />
UNTIL Abbruchbed<strong>in</strong>gung;<br />
Die Anweisungen <strong>in</strong>nerhalb der Repeat-Schleife werden beim ersten<br />
Durchlauf ohne Prüfung der Bed<strong>in</strong>gung ausgeführt! Am Ende der<br />
Schleife wird dann geprüft, ob die Bed<strong>in</strong>gung erfüllt (True) ist. Ist dies der<br />
Fall, wird die Schleife verlassen, ansonsten werden die Anweisungen<br />
<strong>in</strong>nerhalb der Schleife erneut und solange ausgeführt bis die<br />
Abbruchbed<strong>in</strong>gung erfüllt ist.<br />
Die Struktur der Repeat-Schleife verlangt offensichtlich, dass die<br />
Abbruchbed<strong>in</strong>gung <strong>in</strong>nerhalb der Schleife verändert wird und die<br />
Möglichkeit bestehen muss, dass die Bed<strong>in</strong>gung True werden kann!<br />
INFO: Hat sich e<strong>in</strong> Programm "Aufgehängt": Hilft häufig nur noch die<br />
file:///E|/homepage/<strong>Pascal</strong>/die_repeat.htm (1 of 4) [07.10.2001 00:36:11]
Die REPEAT<br />
Programmunterbrechung mit [Strg] + [Break]!<br />
Und jetzt noch zur Veranschaulichung e<strong>in</strong> kle<strong>in</strong>es Beispiel:<br />
PROGRAM Schuld_abzahlen;<br />
USES crt;<br />
VAR<br />
Schuld, Jahresrate: Real;<br />
Z<strong>in</strong>ssatz, Schuldneu: Real;<br />
Z<strong>in</strong>sen, Schuldalt: Real;<br />
Jahre: Integer;<br />
BEGIN<br />
Clrscr;<br />
Jahre := 0;<br />
Z<strong>in</strong>sen := 0;<br />
SchuldAlt := 0;<br />
SchuldNeu := 0;<br />
Write('Schuld: ');<br />
Readln(Schuld);<br />
Write('Jahresrate: ');<br />
Readln(Jahresrate);<br />
Write('Z<strong>in</strong>ssatz: ');<br />
Readln(Z<strong>in</strong>ssatz);<br />
Jahre := 1;<br />
SchuldAlt := Schuld;<br />
Z<strong>in</strong>sen := Schuldalt * Z<strong>in</strong>ssatz / 100;<br />
Schuldneu := Schuldalt<br />
+ Z<strong>in</strong>sen - JahresRate;<br />
GotoXY(1, 5);<br />
Write('Jahre');<br />
GotoXY(18, 5);<br />
Write('Schuldalt');<br />
GotoXY(35, 5);<br />
Write('Z<strong>in</strong>sen');<br />
GotoXY(50, 5);<br />
Write('Jahresrate');<br />
GotoXY(70, 5);<br />
Write('Schuldneu');<br />
GotoXY(2, 5+ Jahre);<br />
Write(Jahre);<br />
GotoXY(19, 5 + Jahre);<br />
Write(Schuldalt:2:2);<br />
GotoXY(36, 5 + Jahre);<br />
Write(Z<strong>in</strong>sen:2:2);<br />
file:///E|/homepage/<strong>Pascal</strong>/die_repeat.htm (2 of 4) [07.10.2001 00:36:11]
Die REPEAT<br />
GotoXY(51, 5 + Jahre);<br />
Write(Jahresrate:2:2);<br />
GotoXY(71, 5 + Jahre);<br />
Write(Schuldneu:2:2);<br />
Repeat<br />
Jahre := Jahre + 1;<br />
Schuldalt := Schuldneu;<br />
Z<strong>in</strong>sen := Schuldalt<br />
* Z<strong>in</strong>ssatz / 100;<br />
Schuldneu := Schuldalt<br />
* Z<strong>in</strong>sen - Jahresrate;<br />
GotoXY(2, 5+ Jahre);<br />
Write(Jahre);<br />
GotoXY(19, 5 + Jahre);<br />
Write(Schuldalt:2:2);<br />
GotoXY(36, 5 + Jahre);<br />
Write(Z<strong>in</strong>sen:2:2);<br />
GotoXY(51, 5 + Jahre);<br />
Write(Jahresrate:2:2);<br />
GotoXY(71, 5 + Jahre);<br />
Write(Schuldneu:2:2);<br />
UNTIL Schuldneu < Jahresrate;<br />
Writeln('');<br />
Writeln('Die letzte Rate beträgt: ',<br />
Schuldneu:2:2);<br />
Readln;<br />
END.<br />
Das obige Beispiel zeigt den Syntax und den Ablauf e<strong>in</strong>er<br />
REPEAT/UNTIL - Schleife. Das Programm gibt e<strong>in</strong>en Zahlungsplan für<br />
die Abzahlung e<strong>in</strong>es Kredites, <strong>in</strong> Tabellenform aus.<br />
Die REPEAT - UNTIL Schleife wird so lange ausgeführt bis die<br />
Restschuld des Kredits kle<strong>in</strong>er als die Jährliche Rate ist.<br />
Hier noch e<strong>in</strong> weiteres kle<strong>in</strong>es Beispiel:<br />
PROGRAM BSP_Rep;<br />
USES Crt;<br />
VAR<br />
Ch: Char;<br />
BEGIN<br />
REPEAT<br />
Ch := ReadKey;<br />
file:///E|/homepage/<strong>Pascal</strong>/die_repeat.htm (3 of 4) [07.10.2001 00:36:11]
Die REPEAT<br />
UNTIL Ch <strong>in</strong> ['J','j','N','n'];<br />
END.<br />
Dieses Programm wiederholt die Schleife solange bis die richtige Taste<br />
gedrückt wurde.<br />
Die CASE-Anweisung<br />
Die FOR - Schleife<br />
file:///E|/homepage/<strong>Pascal</strong>/die_repeat.htm (4 of 4) [07.10.2001 00:36:11]
Die FOR<br />
Die FOR - Schleife<br />
Schleifen werden <strong>in</strong> allen Programmiersprachen benutzt um e<strong>in</strong>zelne<br />
Anweisungen oder Anweisungsblöcke zu wiederholen. Schleifen<br />
erleichtern die Arbeit und machen e<strong>in</strong> Programm übersichtlicher.<br />
Erstmal das Struktogramm für e<strong>in</strong>e FOR - Schleife:<br />
Bei der FOR - Schleife ist die Anzahl der Schleifendurchläufe bereits vor<br />
dem ersten Schleifendurchlauf bekannt. Start-, Endwert und müssen<br />
vom Gleichen Datentyp se<strong>in</strong>. (z.B. Integer) Die Zählvariable soll durch<br />
ke<strong>in</strong>e Anweisung <strong>in</strong>nerhalb der For-Schleife <strong>in</strong> ihrem Wert verändert<br />
werden. Sie darf aber zur Berechnung anderer Variablen oder zu<br />
anderen Zwecken <strong>in</strong>nerhalb der For-Schleife benutzt werden. Die<br />
Zählervariable wird auf e<strong>in</strong>em bestimmten Startwert gesetzt und bei<br />
jedem Schleifendurchlauf auf das nächste Element des Bereichs, aus<br />
dem sie stammt, gesetzt, bis der Endwert erreicht ist.<br />
Die allg. Schreibweise lautet:<br />
FOR Zählervariable :=<br />
Startwert TO Endwert DO Anweisung;<br />
wobei Startwert < Endwert<br />
Für mehrere Anweisungen:<br />
FOR Zählervariable :=<br />
Startwert TO Endwert DO<br />
BEGIN<br />
Anweisungen;<br />
END;<br />
Bei Verwendung des reservierten Wortes DOWNTO kann man auch<br />
rückwärts zählen! Die Schreibweise lautet dann:<br />
FOR Zählervariable :=<br />
Startwert DOWNTO Endwert DO Anweisung;<br />
wobei Startwert > Endwert<br />
file:///E|/homepage/<strong>Pascal</strong>/die_for.htm (1 of 2) [07.10.2001 00:36:27]
Die FOR<br />
INFO: Hat sich e<strong>in</strong> Programm "Aufgehängt": Hilft häufig nur noch die<br />
Programmunterbrechung mit [Strg] + [Break]!<br />
Und jetzt noch zur Veranschaulichung e<strong>in</strong> kle<strong>in</strong>es Beispiel:<br />
PROGRAM zaehlen;<br />
USES crt;<br />
VAR<br />
Zahlen: Array[1..10] of Integer;<br />
Items, i: Byte;<br />
BEGIN<br />
Clrscr;<br />
Items := 10;<br />
FOR i := 1 to Items DO<br />
BEGIN<br />
Write(i,'. Wert e<strong>in</strong>geben: ');<br />
Readln(Zahlen[i]);<br />
END;<br />
END.<br />
Dieses kle<strong>in</strong>e Beispiel benutzt e<strong>in</strong>e FOR-Schleife um Zahlenwerte <strong>in</strong> e<strong>in</strong><br />
Array e<strong>in</strong>zulesen. Die FOR-Schleife wird Zehn mal durchlaufen, wobei<br />
die aktuelle Position im Array durch die Zählervariable i festgelegt wird.<br />
Die REPEAT / UNTIL - Schleife Die WHILE - Schleife<br />
file:///E|/homepage/<strong>Pascal</strong>/die_for.htm (2 of 2) [07.10.2001 00:36:27]
Die WHILE<br />
Die WHILE - Schleife<br />
Schleifen werden <strong>in</strong> allen Programmiersprachen benutzt um e<strong>in</strong>zelne<br />
Anweisungen oder Anweisungsblöcke zu wiederholen. Schleifen<br />
erleichtern die Arbeit und machen e<strong>in</strong> Programm übersichtlicher.<br />
Auch jetzt erstmal das Struktogramm für e<strong>in</strong>e WHILE - Schleife:<br />
Auch die While -Schleife macht die Ausführung der Anweisung(en)<br />
<strong>in</strong>nerhalb der Schleife von e<strong>in</strong>er Bed<strong>in</strong>gung abhängig. Die allg.<br />
Schreibweise lautete:<br />
WHILE Bed<strong>in</strong>gung DO Anweisung;<br />
oder bei mehreren Anweisungen:<br />
WHILE Bed<strong>in</strong>gung DO<br />
BEGIN<br />
Anweisungen;<br />
END;<br />
Im Gegensatz zur Repeat-Schleife, aber <strong>in</strong> Übere<strong>in</strong>stimmung mit der<br />
For-Schleife, werden mehrere Anweisungen von BEGIN und END<br />
geklammert.<br />
Die Bed<strong>in</strong>gung wird bereits vor der Ausführung der ersten<br />
Schleifenanweisung geprüft. Ist sie erfüllt (True), werden die<br />
Anweisungen audgeführt, sonst nicht. Damit besteht die Möglichkeit,<br />
file:///E|/homepage/<strong>Pascal</strong>/die_while.htm (1 of 3) [07.10.2001 00:36:46]
Die WHILE<br />
dass e<strong>in</strong>e While-Schleife ke<strong>in</strong>mal durchlaufen wird.<br />
Wurde die Schleife m<strong>in</strong>destens e<strong>in</strong>mal durchlaufen, so wird die<br />
Bed<strong>in</strong>gung vor jedem Schleifendurchlauf erneut geprüft. Nur wenn Sie<br />
noch immer True bzw. Wahr ist, werden die Anweisungen erneut<br />
ausgeführt!<br />
Die Struktur der While-Schleife verlangt offensichtlich, dass die<br />
Abbruchbed<strong>in</strong>gung <strong>in</strong>nerhalb der Schleife verändert wird und die<br />
Möglichkeit bestehen muss, dass die Bed<strong>in</strong>gung False bzw. falsch<br />
werden kann!<br />
INFO: Hat sich e<strong>in</strong> Programm "Aufgehängt": Hilft häufig nur noch die<br />
Programmunterbrechung mit [Strg] + [Break]!<br />
Und jetzt noch zur Veranschaulichung e<strong>in</strong> kle<strong>in</strong>es Beispiel:<br />
PROGRAM Anzahl_Summe_Mittel;<br />
USES crt;<br />
VAR<br />
Anzahl: Integer;<br />
Zahl, Summe, Mittel: Real;<br />
BEGIN<br />
Textcolor(White);<br />
Clrscr;<br />
Summe := 0;<br />
Anzahl := 0;<br />
Anzahl := 0;<br />
Write('1. Zahl: ');<br />
Readln(Zahl);<br />
WHILE Zahl 0 DO<br />
BEGIN<br />
Summe := Summe + Zahl;<br />
Anzahl := Anzahl + 1;<br />
Write(Anzahl, '. Zahl: ');<br />
Readln(Zahl);<br />
Mittel := Summe / Anzahl;<br />
END;<br />
Writeln('Anzahl: ', Anzahl);<br />
Writeln('Summe: ', Summe:4:2);<br />
Writeln('Mittelwert: ', Mittel:4:3);<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/die_while.htm (2 of 3) [07.10.2001 00:36:46]
Die WHILE<br />
In diesem Beispiel wird die While-Schleife benutzt e<strong>in</strong>e unbekannte<br />
Anzahl von Zahlen e<strong>in</strong>zugeben. Die Schleife wird beendet wenn die<br />
e<strong>in</strong>gegebene Zahl e<strong>in</strong>e Null ist.<br />
Die FOR - Schleife<br />
Grundwissen Unterprogramme<br />
file:///E|/homepage/<strong>Pascal</strong>/die_while.htm (3 of 3) [07.10.2001 00:36:46]
Grundwissen<br />
Grundwissen - Unterprogramme<br />
E<strong>in</strong> "gutes" Programm sollte übersichtlich strukturiert se<strong>in</strong>. Dazu gehören<br />
e<strong>in</strong>erseits e<strong>in</strong>e ausreichende Dokumentation, andererseits aber auch,<br />
dass Programme <strong>in</strong> kle<strong>in</strong>ere Abschnitte, die auch Unterprogramme<br />
genannt werden, unterteilt s<strong>in</strong>d. Dadurch erhöht sich die Lesbarkeit e<strong>in</strong>es<br />
Programms. Außerdem können Fehler leichter entdeckt und<br />
Programmänderungen e<strong>in</strong>facher vorgenommen werden.<br />
E<strong>in</strong> Unterprogramm ist e<strong>in</strong> eigenständiger Teil e<strong>in</strong>es Haupt- oder e<strong>in</strong>es<br />
anderen Unterprogramms. Unterprogramme sollten so gehalten werden,<br />
dass sie möglichst vom jeweiligen Hauptprogramm unabhängig s<strong>in</strong>d.<br />
Das heißt das benutzte Bezeichner <strong>in</strong>nerhalb von e<strong>in</strong>em Unterprogramm<br />
immer lokal deklariert werden sollten! Immer, wenn e<strong>in</strong> Unterprogramm<br />
mit se<strong>in</strong>en Namen aufgerufen wird, werden die Anweisungen dieser<br />
Rout<strong>in</strong>e ausgeführt, so, als stünden sie an der Stelle, an welcher der<br />
Name der Rout<strong>in</strong>e im Programm genannt ist.<br />
In Turbo <strong>Pascal</strong> unterscheiden wir Funktionen und Prozeduren als<br />
Unterprogramme.<br />
Jedes größere Programm umfasst Prozeduren und Funktionen als<br />
Unterprogramme. Damit ergeben sich Vorteile h<strong>in</strong>sichtlich Ökonomie,<br />
Lesbarkeit und Programmentwicklung:<br />
1. Ökonomie-Vorteil E<strong>in</strong> Unterprogramm kann an mehreren Stellen<br />
e<strong>in</strong>es Programms aufgerufen werden. Es muss aber nur e<strong>in</strong>mal<br />
programmiert werden.<br />
2. Gliederungs-Vorteil: E<strong>in</strong> Programm wird durch Unterprogramme<br />
gegliedert und damit besser lesbar.<br />
3. Bauste<strong>in</strong>-Vorteil: E<strong>in</strong> Unterprogramm kann als Bauste<strong>in</strong> <strong>in</strong><br />
mehreren Programmen aufgerufen werden. Die Bauste<strong>in</strong>e werden<br />
<strong>in</strong> e<strong>in</strong>er Programm-Bibliothek (UNIT) gesammelt.<br />
Die While - Schleife<br />
Lokale und Globale Bezeichner<br />
file:///E|/homepage/<strong>Pascal</strong>/grundwissen.htm [07.10.2001 00:37:34]
Lokale und globale Bezeichner<br />
Lokale und globale Bezeichner<br />
Bezeichner s<strong>in</strong>d Variablen, Konstanten, Datentypen, Unterprogramme.<br />
Global heißt ,,gesamt" und wir verstehen unter e<strong>in</strong>em globalen<br />
Bezeichner, Bezeichner die dem gesamten Programm, e<strong>in</strong>schließlich<br />
aller Unterprogramme, zur Verfügung stehen. Wird also e<strong>in</strong>e Bezeichner<br />
im Vere<strong>in</strong>barungsteil des Hauptprogramms deklariert, handelt es sich<br />
dabei um e<strong>in</strong>en globalen Bezeichner. Lokal heißt dagegen ,,örtlich".<br />
Darunter verstehen wir Bezeichner, die nur dem Unterprogramm zur<br />
Verfügung stehen, <strong>in</strong> dessen Vere<strong>in</strong>barungsteil sie deklariert worden<br />
s<strong>in</strong>d. Den anderen Unterprogrammen und dem Hauptprogramm s<strong>in</strong>d sie<br />
,,unbekannt". Sie können dort nicht verwendet werden!<br />
Es ist zulässig, dass Bezeichner mit denselben Namen sowohl global als<br />
auch lokal vere<strong>in</strong>bart werden dürfen. Für den Fall gilt, dass stets der<br />
lokale Bezeichner Vorrang vor dem globalen Bezeichner hat.<br />
Beispiel: Der globale Bezeichner x, im Hauptprogramm vere<strong>in</strong>bart, hat <strong>in</strong><br />
Unterprogrammen nur dann Gültigkeit, wenn dort ke<strong>in</strong> Bezeichner x<br />
vere<strong>in</strong>bart worden ist. Wurde jedoch auch <strong>in</strong> e<strong>in</strong>em Unterprogramm e<strong>in</strong><br />
Bezeichner x deklariert, so werden mit diesem lokalen Bezeichner<br />
Operationen ausgeführt, wenn dieser im Unterprogramm angesprochen<br />
wird. Der globale Bezeichner bleibt davon unberührt und unverändert.<br />
Verwenden Sie <strong>in</strong> Unterprogrammen ausschließlich lokale Bezeichner.<br />
Damit erreichen Sie die größtmögliche Unabhängigkeit der Rout<strong>in</strong>en von<br />
e<strong>in</strong>em bestimmten Hauptprogramm und können sie <strong>in</strong> andere<br />
Programme übernehmen oder <strong>in</strong> Bibliotheken zusammenfassen. (vgl.<br />
Standardbibliotheken von Turbo <strong>Pascal</strong> - Units)<br />
Grundwissen Unterprogramme<br />
Grundstruktur Prozeduren<br />
file:///E|/homepage/<strong>Pascal</strong>/lokale_und_globale_bezeichner.htm [07.10.2001 00:37:41]
Grundstruktur e<strong>in</strong>er Prozedur<br />
Grundstruktur e<strong>in</strong>er Prozedur<br />
Jede Prozedur ist wie e<strong>in</strong> "normales" Programm aufgebaut und weicht<br />
nur <strong>in</strong> zwei Teilen von diesem ab:<br />
●<br />
●<br />
Am Anfang der Prozedur steht das reservierte Wort PROCEDURE<br />
anstelle von dem reservierten Wort PROGRAM.<br />
Am Ende der Prozedur steht ke<strong>in</strong>e END mit e<strong>in</strong>em Punkt, sondern<br />
e<strong>in</strong> END mit e<strong>in</strong>em Semikolon.<br />
Die Grundstruktur e<strong>in</strong>er Prozedur sieht wie folgt aus:<br />
PROCEDURE ProzedureName;<br />
{Hier beg<strong>in</strong>nt der Deklarationsteil}<br />
CONST {Hier werden<br />
lokale Konstanten<br />
vere<strong>in</strong>bart}<br />
TYPE {Hier werden<br />
lokale Datentypen<br />
vere<strong>in</strong>bart}<br />
VAR {Hier werden<br />
lokale Variablen<br />
vere<strong>in</strong>bart}<br />
{Hier werden lokale Unterprogramme der<br />
Prozedur ProzedurName vere<strong>in</strong>bart}<br />
{Hier endet der Deklarationsteil}<br />
BEGIN<br />
{Es folgen Anweisungen der Prozedur}<br />
END;<br />
Wenn Sie die Struktur der Prozedur mit der e<strong>in</strong>es Programms<br />
vergleichen, werden Sie e<strong>in</strong>e große Ähnlichkeit feststellen. Die<br />
Vere<strong>in</strong>barungen e<strong>in</strong>er Prozedure beg<strong>in</strong>nt mit dem reservierten Wort<br />
PROCEDURE worauf der Name (Bezeichner) folgt, über den Sie die<br />
Prozedure im aufrufenden Programm ansprechen (aufrufen) können.<br />
Anschließend folgen Vere<strong>in</strong>barungsteil und Hauptprogramm der<br />
Prozedure.<br />
file:///E|/homepage/<strong>Pascal</strong>/grundstruktur_e<strong>in</strong>er_prozedur.htm (1 of 2) [07.10.2001 00:37:46]
Grundstruktur e<strong>in</strong>er Prozedur<br />
ACHTUNG: Beachten Sie, dass alle Vere<strong>in</strong>barungen und Rout<strong>in</strong>en, die<br />
<strong>in</strong> e<strong>in</strong>er Prozedure deklariert werden, lokal s<strong>in</strong>d.<br />
Und jetzt zum besserem Verständnis, noch e<strong>in</strong> kle<strong>in</strong>es Beispiel:<br />
PROGRAM proc_test;<br />
USES crt;<br />
PROCEDURE Info;<br />
CONST<br />
Version = '1.0';<br />
BEGIN<br />
Writeln('Programmversion: ' + Version);<br />
END;<br />
BEGIN<br />
Info;<br />
Readln;<br />
END.<br />
Hier wird die Prozedur Info benutzt um die Version des Programms<br />
aufzurufen, die Prozedur Info gibt den Inhalt der Konstante Version aus.<br />
Globale und lokale Bezeichner Prozeduren ohne Werteparameter<br />
file:///E|/homepage/<strong>Pascal</strong>/grundstruktur_e<strong>in</strong>er_prozedur.htm (2 of 2) [07.10.2001 00:37:46]
Prozeduren ohne Werteparameter<br />
Prozeduren ohne Werteparameter<br />
Deklaration:<br />
procedure ProzedurName;<br />
Zuerst e<strong>in</strong> Beispiel für e<strong>in</strong>e e<strong>in</strong>fache Prozedur:<br />
PROCEDURE warten;<br />
VAR<br />
ch: char;<br />
BEGIN<br />
gotoxy(1, 25);<br />
write('Bitte e<strong>in</strong>e Taste Drücken ...');<br />
ch := readkey;<br />
END;<br />
Durch die Verwendung e<strong>in</strong>er Prozedur, die den entsprechenden<br />
Programmtext enthält, ist jeweils nur e<strong>in</strong>e Anweisung im Hauptprogramm<br />
notwendig, statt vorher drei Anweisungen.<br />
warten;<br />
Da die Prozedur nicht auf globale Variablen zugreift ist sie unabhängig<br />
vom jeweiligen Hauptprogramm.<br />
Die Prozedur soll so verändert werden, dass der Ausgabetext (Bitte e<strong>in</strong>e<br />
...) auf e<strong>in</strong>er beliebigen Bildschirmposition ausgegeben wird. Zur Lösung<br />
dieses Problems gibt es zwei pr<strong>in</strong>zipielle Möglichkeiten:<br />
1. Die Verwendung von globalen Variablen (Variablen die im<br />
Hauptprogramm vere<strong>in</strong>bart wurden). Auf e<strong>in</strong>e globale Variable<br />
kann <strong>in</strong> e<strong>in</strong>em Unterprogramm zugegriffen werden: lesend oder<br />
schreibend (z.B. a := c; mit a und c im Hauptprogramm deklariert).<br />
E<strong>in</strong> Unterprogramm das auf globale Variablen zugrifft ist nicht<br />
mehr vom Hauptprogramm unabhängig, d.h. es kann nicht <strong>in</strong><br />
anderen Programmen benutzt werden!<br />
Dies widerspricht dem Modulkonzept von TP (dies trifft auch auf<br />
andere Programmiersprachen zu wie z.B. C++) und ist somit ke<strong>in</strong><br />
Modul. (Schlechter Programmierstil)<br />
2. Die Verwendung von Wertparametern<br />
file:///E|/homepage/<strong>Pascal</strong>/prozeduren_ohne_werteparameter.htm (1 of 2) [07.10.2001 00:37:59]
Prozeduren ohne Werteparameter<br />
Und jetzt noch e<strong>in</strong> Beispiel mit der Oben genannten Prozedur Warten:<br />
PROGRAM wait;<br />
USES crt;<br />
PROCEDURE Warten;<br />
VAR<br />
ch: char;<br />
BEGIN<br />
gotoxy(1, 25);<br />
write('Bitte e<strong>in</strong>e Taste Drücken ...');<br />
ch := readkey;<br />
END;<br />
BEGIN<br />
Writeln('Das Programm wird angehalten!');<br />
Warten;<br />
Writeln('Und weiter!');<br />
Readln;<br />
END.<br />
Das Programm ruft die Prozedure Warten auf, welche das Programm<br />
solange anhält bis e<strong>in</strong>e Taste gedrückt wird.<br />
Grundstruktur e<strong>in</strong>er Prozedur Prozeduren mit Werteparameter<br />
file:///E|/homepage/<strong>Pascal</strong>/prozeduren_ohne_werteparameter.htm (2 of 2) [07.10.2001 00:37:59]
Prozeduren mit Werteparametern<br />
Prozeduren mit Werteparametern<br />
TP bietet die Möglichkeit, Prozeduren vom aufrufenden Programm aus<br />
Werte zu übergeben, mit denen <strong>in</strong>nerhalb der Prozedur gearbeitet<br />
werden kann. Dadurch wird e<strong>in</strong> Unterprogramm noch universeller<br />
e<strong>in</strong>setzbar, da jedes Programm <strong>in</strong>dividuelle Werte an die Rout<strong>in</strong>e<br />
übergeben kann; sogar <strong>in</strong>nerhalb e<strong>in</strong>es Programms können beim<br />
mehrmaligen Aufruf e<strong>in</strong>es Unterprogramms verschiedene Werte<br />
übergeben werden.<br />
Deklaration:<br />
PROCEDURE Name (Bezeichner1, ... : Typ1;<br />
Bezeichner2, ... : Typ2;<br />
... : ....;)<br />
In der Parameterliste werden die Werte mit ihren Datentypen aufgeführt.<br />
Werte gleichen Typs werden durch Kommata, Werte unterschiedlichen<br />
Typs durch e<strong>in</strong> Semikolon getrennt. z.B.:<br />
PROCEDURE Test ( a, b: Byte; ch: Char);<br />
BEGIN<br />
END;<br />
Die Prozedur TEST muss, nach dieser Deklaration, mit genau zwei<br />
Werten vom Typ Integer und e<strong>in</strong>em Wert vom Typ Char aufgerufen<br />
werden, und zwar genau <strong>in</strong> dieser Reihenfolge!<br />
z.B.: Test (a, b, 'C');<br />
Sie können entweder e<strong>in</strong>en Wert oder e<strong>in</strong>e Variable übergeben!<br />
A und B werden wie lokale Variablen der Prozedur Test behandelt. Ihnen<br />
werden die übergebenen Werte zugewiesen. Über den Namen der<br />
Variable kann mit den Werten <strong>in</strong>nerhalb der Prozedur gearbeitet werden.<br />
ACHTUNG: Bei der Wertübergabe greift die Prozedur niemals auf die<br />
eigentlichen Argumente des Aufrufs zu. Die Werte, die von der Prozedur<br />
verarbeitet werden, s<strong>in</strong>d nur lokale Kopien, welche auf dem Stack<br />
gespeichert werden. Bei der Wertübergabe wird der Inhalt der<br />
tatsächlichen Argumente nicht verändert!<br />
Die Wertübergabe kann jedoch nicht bei allen Prozeduren verwendet<br />
file:///E|/homepage/<strong>Pascal</strong>/prozeduren_mit_werteparametern.htm (1 of 2) [07.10.2001 00:38:08]
Prozeduren mit Werteparametern<br />
werden. In folgenden Fällen ist die Wertübergabe nicht von Vorteil:<br />
●<br />
●<br />
Bei der Übergabe von großen Klassenobjekten! (Zeit und<br />
Platzbedarf ist für die Praxis zu hoch!)<br />
Wenn die Werte des Arguments geändert werden müssen!<br />
Prozeduren ohne Werteparameter<br />
Prozeduren mit Variablenparameter<br />
file:///E|/homepage/<strong>Pascal</strong>/prozeduren_mit_werteparametern.htm (2 of 2) [07.10.2001 00:38:08]
Prozeduren mit Variablenparameter<br />
Prozeduren mit Variablenparameter<br />
Soll zwischen dem aufrufenden Programm und e<strong>in</strong>er Prozedur e<strong>in</strong><br />
zweiseitiger Datenaustausch stattf<strong>in</strong>den, dann müssen der Prozedur<br />
anstatt Wertparameter Variablenparameter übergeben werden. TP legt<br />
von den übergebenen Variablen, im Gegensatz zur Übergabe von<br />
Werteparametern, ke<strong>in</strong>e Kopie auf dem Stack an, sondern arbeitet direkt<br />
mit den Variablen! E<strong>in</strong> Unterprogramm kann also den Wert e<strong>in</strong>er<br />
Variablen verändern und den veränderten Wert an das aufrufende<br />
Programm zurück liefern!<br />
Deklaration:<br />
PROCEDURE Name (var Bezeichner1, ... : Typ1;<br />
var Bezeichner2, ... : Typ2;<br />
var ... : ....;)<br />
z.B: prozedure Test (var a: Byte; var ch: Char);<br />
Bei der Parameterübergabe s<strong>in</strong>d auch Mischformen statthaft!<br />
z.B.: procedure Test (a, b; Byte; var ch: Char);<br />
Prozeduren mit Werteparameter<br />
Grundstruktur e<strong>in</strong>er Funktion<br />
file:///E|/homepage/<strong>Pascal</strong>/prozeduren_mit_variablenparamete.htm [07.10.2001 00:38:24]
Grundstruktur e<strong>in</strong>er Funktion<br />
Grundstruktur e<strong>in</strong>er Funktion<br />
In <strong>Pascal</strong> s<strong>in</strong>d zwei Typen von Unterprogrammen möglich, Prozeduren<br />
und Funktionen. e<strong>in</strong>e Funktion ist e<strong>in</strong> Unterprogramm, das dem rufenden<br />
Programm genau e<strong>in</strong>en Ergebniswert übergibt.<br />
Jede Funktion ist wie e<strong>in</strong> "normales" Programm aufgebaut und weicht<br />
nur <strong>in</strong> zwei Teilen von diesem ab:<br />
●<br />
●<br />
Am Anfang der Funktion steht das reservierte Wort FUNCTION<br />
anstelle von dem reservierten Wort PROGRAM.<br />
Am Ende der FUNCTION steht ke<strong>in</strong>e END mit e<strong>in</strong>em Punkt,<br />
sondern e<strong>in</strong> END mit e<strong>in</strong>em Semikolon.<br />
Die Grundstruktur e<strong>in</strong>er Funktion sieht wie folgt aus:<br />
FUNCTION Name(Parameterliste): Ergebnistyp;<br />
{Hier beg<strong>in</strong>nt der Deklarationsteil}<br />
CONST {Hier werden<br />
lokale Konstanten<br />
vere<strong>in</strong>bart}<br />
TYPE {Hier werden<br />
lokale Datentypen<br />
vere<strong>in</strong>bart}<br />
VAR {Hier werden<br />
lokale Variablen<br />
vere<strong>in</strong>bart}<br />
{Hier endet der Deklarationsteil}<br />
BEGIN<br />
{Es folgen Anweisungen der Funktion}<br />
END;<br />
Wenn Sie die Struktur der Funktion mit der e<strong>in</strong>es Programm vergleichen,<br />
werden Sie e<strong>in</strong>e große Ähnlichkeit feststellen. Die Vere<strong>in</strong>barungen e<strong>in</strong>er<br />
Funktion beg<strong>in</strong>nt mit dem reservierten Wort FUNCTION worauf der<br />
Name (Bezeichner) folgt, über den Sie die FUNCTION im aufrufenden<br />
Programm ansprechen (aufrufen) können. Anschließend folgen<br />
file:///E|/homepage/<strong>Pascal</strong>/grundstruktur_e<strong>in</strong>er_funktion.htm (1 of 3) [07.10.2001 00:38:31]
Grundstruktur e<strong>in</strong>er Funktion<br />
Vere<strong>in</strong>barungsteil und Hauptprogramm der Funktion.<br />
ACHTUNG: Beachten Sie, dass alle Vere<strong>in</strong>barungen und Rout<strong>in</strong>en, die<br />
<strong>in</strong> e<strong>in</strong>er Funktion deklariert werden, lokal s<strong>in</strong>d.<br />
Schauen wir uns nun e<strong>in</strong>mal den Funktionskopf etwas genauer an:<br />
FUNCTION Name(Parameterliste): Ergebnistyp;<br />
Nach dem reservierten Wort FUNCTION, folgt der Funktionsname und<br />
danach, <strong>in</strong> Klammern, e<strong>in</strong> oder mehrere formale Parameter mit ","<br />
aufgezählt. Nach der Parameterliste folgt e<strong>in</strong> Doppelpunkt, dem der<br />
Datentyp des Funktionswertes folgt, der nach der Funktionsausführung<br />
dem rufenden Programm übergeben wird. Während der Ausführung<br />
muss dem Funktionsnamen m<strong>in</strong>destens e<strong>in</strong>mal e<strong>in</strong> Wert dieses Typs<br />
zugewiesen werden.<br />
Datentypen für die Parameterliste bzw. dem Ergebniswert s<strong>in</strong>d:<br />
Integer, Byte, Real, Char, Boolean oder Str<strong>in</strong>g.<br />
Und jetzt zum besserem Verständnis, noch e<strong>in</strong> kle<strong>in</strong>es Beispiel:<br />
PROGRAM func_test;<br />
USES crt;<br />
VAR<br />
Brutto_Preis, Netto: Real;<br />
FUNCTION Brutto(Netto: Real): Real;<br />
BEGIN<br />
Brutto := 16 * Netto / 100;<br />
END;<br />
BEGIN<br />
Netto := 34.89;<br />
Brutto_Preis := Brutto(Netto);<br />
END.<br />
Hier wird die Funktion Brutto benutzt, um den Bruttopreis aus e<strong>in</strong>em<br />
Nettopreis zu errechnen. Der Funktion Brutto wird der Nettowert der<br />
Variable Netto übergeben, woraus die Funktion den Bruttopreis<br />
errechnet und zurück gibt. Der Bruttopreis wird dann <strong>in</strong> die Variable<br />
Brutto_Preis e<strong>in</strong>gelesen.<br />
file:///E|/homepage/<strong>Pascal</strong>/grundstruktur_e<strong>in</strong>er_funktion.htm (2 of 3) [07.10.2001 00:38:31]
Grundstruktur e<strong>in</strong>er Funktion<br />
Prozeduren mit Variablenparameter<br />
Funktionen<br />
file:///E|/homepage/<strong>Pascal</strong>/grundstruktur_e<strong>in</strong>er_funktion.htm (3 of 3) [07.10.2001 00:38:31]
Funktionen<br />
Funktionen<br />
In <strong>Pascal</strong> s<strong>in</strong>d zwei Typen von Unterprogrammen möglich, Prozeduren<br />
und Funktionen. e<strong>in</strong>e Funktion ist e<strong>in</strong> Unterprogramm, das dem rufenden<br />
Programm genau e<strong>in</strong>en Ergebniswert übergibt.<br />
Für den Anweisungsteil e<strong>in</strong>er Funktion gelten die gleichen Regeln wie für<br />
Hauptprogramm bzw. für e<strong>in</strong>e Prozedur. Zusätzlich jedoch muss man<br />
irgendwo im Anweisungsteil dem Funktionsnamen e<strong>in</strong> Ergebnis<br />
zuweisen. Erst dadurch kann dieser Wert dem rufenden Hauptprogramm<br />
übergeben bzw. bekannt gemacht werden. Der Funktionsname wird wie<br />
e<strong>in</strong> Variablenname behandelt (Beispiel: Brutto := 16 * Netto / 100 mit<br />
dem Namen Brutto).<br />
●<br />
den Funktionsnamen behandelt man wie e<strong>in</strong>en Konstantennamen:<br />
z.B. mit Writeln ausgeben, mit IF Abfragen und auf der rechten<br />
Seite e<strong>in</strong>er Zuweisung schreiben. H<strong>in</strong>ter dem Funktionsnamen<br />
verbirgt sich e<strong>in</strong> Funktionswert.<br />
Zum Schluss noch e<strong>in</strong> kle<strong>in</strong>es Beispielprogramm:<br />
PROGRAM Werte;<br />
VAR<br />
Brutto, Netto: Real;<br />
I: Byte;<br />
FUNCTION B_Preis(Netto, Mwst: Real): Real;<br />
BEGIN<br />
Brutto_Preis := 16 * Mwst / 100;<br />
END;<br />
BEGIN<br />
FOR I := 1 TO 10 DO<br />
BEGIN<br />
Writeln('Netto: ');<br />
Readln(Netto);<br />
Brutto := B_Preis(Netto, 16);<br />
Writeln('Brutto: ', FloatToStr(Brutto));<br />
END;<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/funktionen.htm (1 of 2) [07.10.2001 00:38:38]
Funktionen<br />
Grundstruktur e<strong>in</strong>er Funktion<br />
Strukturierte Datentypen<br />
file:///E|/homepage/<strong>Pascal</strong>/funktionen.htm (2 of 2) [07.10.2001 00:38:38]
Tabelle e<strong>in</strong>e Spalte zentriert<br />
Strukturierte Datentypen<br />
Strukturierte Datentypen werden aus e<strong>in</strong>fachen Datentypen so<br />
zusammengesetzt, dass unter e<strong>in</strong>em Namen mehrere Werte bzw.<br />
Elemente gespeichert und gelesen werden können.<br />
Hier e<strong>in</strong> kle<strong>in</strong>es Beispiel ohne Strukturierten Datentyp: Es soll der<br />
durchschnittliche Absatz e<strong>in</strong>es Artikels pro Woche ermittelt werden.<br />
VAR<br />
AbsatzMo: Integer;<br />
BEGIN<br />
.<br />
.<br />
AbsatzMo := 56;<br />
.<br />
.<br />
END.<br />
Diese Vorgehensweise würde bedeuten, dass fünf weitere Variablen<br />
(AbsatzDi, AbsatzMi ...) deklariert und <strong>in</strong>itialisiert werden müssten.<br />
Benutz man jedoch e<strong>in</strong>en strukturierten Datentyp muss nur e<strong>in</strong>e Variable<br />
deklariert werden, welche die Daten für alle 5 Wochentage enthält.<br />
Strukturierte Datentypen bieten daher folgende Vorteile:<br />
●<br />
●<br />
Bessere Überschaubarkeit des Quelltextes.<br />
Weniger Programmieraufwand.<br />
Zu den Strukturierten Datentypen gehören unter anderem Arrays,<br />
Records, Mengen und der Datentyp File.<br />
Funktionen<br />
Arrays<br />
file:///E|/homepage/<strong>Pascal</strong>/struktorierte_datentypen.htm [07.10.2001 00:38:46]
Arrays<br />
Arrays<br />
Der Datentyp Array speichert mehrere Elemente e<strong>in</strong>es gleichen<br />
Datentyps unter e<strong>in</strong>em Namen ab. Wir unter scheiden dabei zwei Arten:<br />
●<br />
●<br />
e<strong>in</strong>dimensionale Arrays<br />
zweidimensionale Arrays<br />
E<strong>in</strong>dimensionale Arrays<br />
In e<strong>in</strong>dimensionalen Arrays werden die Daten <strong>in</strong> Form e<strong>in</strong>er Reihe<br />
abgespeichert. Mann könnte sagen das e<strong>in</strong> Array e<strong>in</strong> Schrank mit<br />
mehreren Schubladen darstellt. Wobei der Schrank das Array und die<br />
Schubladen die Elemente des Arrays s<strong>in</strong>d.<br />
Die explizierte Deklaration e<strong>in</strong>es e<strong>in</strong>dimensionalen Arrays erfolgt wie<br />
folgt:<br />
VAR<br />
Absatz: Array [1..5] OF Integer;<br />
Für e<strong>in</strong> Array müssen der Datentyp der zu speichernden Elemente sowie<br />
die Anzahl und der Datentyp der Indizes vere<strong>in</strong>bart werden.<br />
Die Allg. Form lautet:<br />
VAR<br />
VarName: Array [Konst1..Konst2] OF Datentyp;<br />
VarName legt den Variabelennamen für das Array fest, über den Sie<br />
später auf das Array zugreifen können. Mit dem reservierte Wort Array<br />
beg<strong>in</strong>nt die Deklaration des Arrays, worauf die Indexgrenzen bzw. der<br />
Ausdehnungsbereich des Arrays folgt. Dabei ist zu beachten das<br />
Konstante1 < Konstante2 ist. Nach den Wertebereich folgt die<br />
Festlegung des Datentyps für die Elemente des Arrays. Die Elemente<br />
können beliebige e<strong>in</strong>fache und strukturierte Datentypen darstellen.<br />
Der Zugriff auf die Elemente e<strong>in</strong>es Arrays erfolgt pr<strong>in</strong>zipiell über den<br />
Index. Der Indextyp muss also immer skalierbar se<strong>in</strong>.<br />
Absatz [1] := 12;<br />
Hier wird dem ersten Element des Arrays Absatz der Wert 12<br />
file:///E|/homepage/<strong>Pascal</strong>/arrays.htm (1 of 2) [07.10.2001 00:38:52]
Arrays<br />
zugewiesen. Genauso e<strong>in</strong>fach können die Daten aus e<strong>in</strong>em Array<br />
ausgegeben werden.<br />
Writeln('Freitag: ', Absatz[5]);<br />
Natürlich kann die Ausgabe auch mit Hilfe e<strong>in</strong>er FOR-Schleife erfolgen,<br />
was bei großen Datenmengen sehr s<strong>in</strong>nvoll ist:<br />
For i := 1 to 5 do<br />
Writeln('Absatz ', I, ': ', Absatz[I]);<br />
Zweidimensionale Arrays<br />
E<strong>in</strong> zweidimensionales Array ist e<strong>in</strong>e Tabelle mit waagerechten Zeilen<br />
und senkrechten Spalten. Alle Elemente haben denselben Datentyp.<br />
Über den Zeilen und Spalten<strong>in</strong>dex wird auf das Element direkt<br />
zugegriffen.<br />
Deklaration e<strong>in</strong>es zweidimensionalen Arrays:<br />
VAR<br />
Absatz: Array [1..2, 1..6] OF Real;<br />
Dieses Beispielarray besteht aus 2 Spalten und 6 Zeilen.<br />
Das E<strong>in</strong>lesen und E<strong>in</strong>geben von Werten <strong>in</strong> e<strong>in</strong>em zweidimensionale<br />
Array erfolgt auf die gleiche Weise wie beim e<strong>in</strong>dimensionalen Array.<br />
Strukturierte Datentypen<br />
Records<br />
file:///E|/homepage/<strong>Pascal</strong>/arrays.htm (2 of 2) [07.10.2001 00:38:52]
Records<br />
Records<br />
E<strong>in</strong> Record lässt sich mit e<strong>in</strong>em Datensatz e<strong>in</strong>er Datenbank vergleichen.<br />
In diesem lassen sich Datenelemente mit unterschiedlichen Datentypen<br />
zusammenfassen.<br />
Allg. Form der Typenvere<strong>in</strong>barung e<strong>in</strong>es Records:<br />
TYPE<br />
RecordTyp = RECORD<br />
Datenfeld1: Datentyp1;<br />
.....<br />
Datenfeld2: Datentyp2;<br />
END;<br />
VAR<br />
RecordVar: Recordtyp;<br />
Hier e<strong>in</strong> kle<strong>in</strong>es Beispiel für e<strong>in</strong>e Record Deklaration:<br />
TYPE<br />
Tkunden = RECORD<br />
Name: Str<strong>in</strong>g;<br />
Umsatz: Real;<br />
END;<br />
VAR<br />
Kunde: Tkunde;<br />
Der schreibende Zugriff auf e<strong>in</strong> Recordelement erfolgt nach folgendem<br />
Schema:<br />
RecordVar.Datenfeld := Wert;<br />
Der Punkt wird als so genannter Qualifizierer genutzt. E<strong>in</strong> solcher<br />
Ausdruck mit Punktnotation nennt man e<strong>in</strong>en qualifizierten Ausdruck und<br />
bildet auch die Grundlage beim Zugriff auf Eigenschaften und Methoden<br />
von Objekten (Bei Objektorientierten Programmiersprachen).<br />
Beispiel für den schreiben Zugriff auf e<strong>in</strong> Recordelement:<br />
Kunde.Name := 'Alex';<br />
Der lesende Zugriff erfolgt nach dem gleichen Schema wie beim<br />
file:///E|/homepage/<strong>Pascal</strong>/records.htm (1 of 2) [07.10.2001 00:39:00]
Records<br />
Schreiben, an dem folgendem Beispiel wird dies deutlich:<br />
Writeln('Ihr Name ist:', Kunde.Name);<br />
Arrays<br />
Mengendeklaration<br />
file:///E|/homepage/<strong>Pascal</strong>/records.htm (2 of 2) [07.10.2001 00:39:00]
Mengendeklaration<br />
Mengendeklaration<br />
E<strong>in</strong>e Menge ist e<strong>in</strong>e Zusammenfassung von maximal 256 Elementen<br />
e<strong>in</strong>es gleichen skalierbaren (ord<strong>in</strong>alen) Grundtyps (Datentyps).<br />
Explizite Deklaration e<strong>in</strong>er Menge vom Basistyp Byte:<br />
TYPE<br />
TMenge = SET of Byte;<br />
VAR<br />
Menge: TMenge;<br />
Implizierte Deklaration e<strong>in</strong>er Menge vom Basistyp Byte:<br />
VAR<br />
Menge: SET of Byte;<br />
Der Nachteil der impliziten Deklaration ist, dass die Variable Menge nicht<br />
als Parameter übergeben werden kann. Es ist deshalb immer ratsam<br />
e<strong>in</strong>e Menge explizit zu deklarieren.<br />
Bitte beachten Sie, dass hier zum Beispiel der Datentyp Integer nicht<br />
verwendet werden kann, da er den gültigen Wertebereich von 256<br />
Elementen überschreitet.<br />
In vielen fällen ist es nicht nötig den gesamten Wertebereich e<strong>in</strong>es<br />
Datentyps zu reservieren, <strong>in</strong> diesem Fall können Sie die Menge mit<br />
e<strong>in</strong>em bestimmten Bereich des Basistyps deklarieren.<br />
TYPE<br />
TMenge = SET of 1..20;<br />
In der obigen Beispieldeklaration ist TMenge e<strong>in</strong>e Teilmenge vom<br />
Datentyp Byte. Beim deklarieren e<strong>in</strong>er Teilmenge muss ke<strong>in</strong> Datentyp<br />
angegeben werden, da der Compiler <strong>in</strong> automatisch erkennt.<br />
Records<br />
Wertzuweisungen<br />
file:///E|/homepage/<strong>Pascal</strong>/mengendeklaration.htm [07.10.2001 00:39:11]
Wertzuweisungen<br />
Wertzuweisungen<br />
Leider ist es nicht möglich e<strong>in</strong> Mengenelement direkt über die Tastatur<br />
e<strong>in</strong>zugeben, da e<strong>in</strong>e Menge, im Vergleich zu e<strong>in</strong>em Array, ke<strong>in</strong>en Index<br />
besitzt.<br />
VAR<br />
Menge1: TMenge;<br />
Menge2: TMenge;<br />
BEGIN<br />
.<br />
Writeln('Wert 1');<br />
readln(Menge1);<br />
.<br />
END.<br />
Das obige Programm ergibt e<strong>in</strong>en offensichtlichen Fehler, da versucht<br />
wird den Wert e<strong>in</strong>er Menge über die Tastatur e<strong>in</strong>zulesen.<br />
Die Mengenvariablen werden statt dessen mit Werten belegt, <strong>in</strong>dem die<br />
Elemente <strong>in</strong> e<strong>in</strong>er Mengenklammer [..] aufgezählt werden.<br />
VAR<br />
Menge1: TMenge;<br />
Menge2: TMenge;<br />
BEGIN<br />
.<br />
Menge1 := [1, 2, 3, 4, 5 ,6];<br />
Menge2 := [1..15];<br />
.<br />
END.<br />
Bei der Angabe der Mengenelemente, spielt die Reihenfolge ke<strong>in</strong>e Rolle.<br />
Die Hauptsache ist das alle benötigten Elemente angegeben s<strong>in</strong>d.<br />
Mengendeklaration<br />
Mengenoperationen<br />
file:///E|/homepage/<strong>Pascal</strong>/wertzuweisungen.htm [07.10.2001 00:39:17]
Mengenoperationen<br />
Mengenoperationen<br />
In Turbo <strong>Pascal</strong> existieren, wie <strong>in</strong> der Mathematik, drei grundlegende<br />
Mengenoperationen:<br />
●<br />
●<br />
●<br />
Die Vere<strong>in</strong>igungsmenge<br />
Die Differenzmenge<br />
Die Durchschnittsmenge<br />
Am folgenden Programmbeispiel werde ich versuchen die drei<br />
Mengenoperationen zu erklären.<br />
Als erstes die Deklaration der Menge:<br />
TYPE<br />
TGrossBuStab = SET of 'A'..'X';<br />
VAR<br />
Menge1: TGrossBuStab;<br />
Menge2: TGrossBuStab;<br />
Menge3: TGrossBuStab;<br />
Jetzt noch die Initialisierung (Wertzuweisung) der Mengenvariablen:<br />
Menge1 := ['A', 'B', 'C'];<br />
Menge2 := ['A', 'X', 'Y'];<br />
Die Initialisierung der Variable Menge3 muss nicht erfolgen das <strong>in</strong> ihr das<br />
Ergebnis der Mengenoperationen abgespeichert wird.<br />
Vere<strong>in</strong>igungsmenge:<br />
Zu e<strong>in</strong>er Vere<strong>in</strong>igungsmenge gehören alle Elemente, die m<strong>in</strong>destens <strong>in</strong><br />
e<strong>in</strong>er der beiden Mengen enthalten s<strong>in</strong>d.<br />
Menge3 := Menge1 + Menge2;<br />
Das Ergebnis der Operation wird <strong>in</strong> Menge3 abgespeichert. Folgende<br />
Elemente bef<strong>in</strong>den sich danach <strong>in</strong> Menge3: C, B, A, X, Y.<br />
Differenzmenge:<br />
file:///E|/homepage/<strong>Pascal</strong>/mengenoperationen.htm (1 of 2) [07.10.2001 00:39:25]
Mengenoperationen<br />
Zu e<strong>in</strong>er Differentmenge gehören alle Elemente, die <strong>in</strong> Menge1, aber<br />
nicht <strong>in</strong> Menge2 enthalten s<strong>in</strong>d.<br />
Menge3 := Menge1 - Menge2;<br />
Das Ergebnis der Operation wird <strong>in</strong> Menge3 abgespeichert. Folgende<br />
Elemente bef<strong>in</strong>den sich danach <strong>in</strong> Menge3: C, B.<br />
Durchschnittsmenge:<br />
Zu e<strong>in</strong>er Durchschnittsmenge gehören alle Elemente, die gleichzeitig <strong>in</strong><br />
beiden Mengen enthalten s<strong>in</strong>d.<br />
Menge3 := Menge1 * Menge2;<br />
Das Ergebnis der Operation wird <strong>in</strong> Menge3 abgespeichert. Folgende<br />
Elemente bef<strong>in</strong>den sich danach <strong>in</strong> Menge3: A.<br />
Wertzuweisungen<br />
Wertausgabe<br />
file:///E|/homepage/<strong>Pascal</strong>/mengenoperationen.htm (2 of 2) [07.10.2001 00:39:25]
Wertausgabe<br />
Wertausgabe<br />
Leider können Mengenelemente weder direkt von der Tastatur<br />
e<strong>in</strong>gelesen, noch direkt auf dem Monitor ausgegeben werden.<br />
Deshalb gibt es <strong>in</strong> Turbo <strong>Pascal</strong> den IN - Operator. Der Operator<br />
überprüft, ob e<strong>in</strong>e Variable mit e<strong>in</strong>em Mengenelement übere<strong>in</strong>stimmt.<br />
Der IN - Operator wird oftmals als Abbruchbed<strong>in</strong>gung <strong>in</strong> fußgesteuerten<br />
Schleifen benutzt.<br />
TYPE<br />
TMenge = SET of Char;<br />
VAR<br />
Menge: TMenge;<br />
BEGIN<br />
Menge := ['J', 'j', 'Y', 'y'];<br />
REPEAT<br />
.<br />
.<br />
UNTIL Abbruch IN Menge;<br />
END.<br />
Mengenoperationen<br />
Mengen verändern<br />
file:///E|/homepage/<strong>Pascal</strong>/wertausgabe.htm [07.10.2001 00:39:31]
Mengen verändern<br />
Mengen verändern<br />
An dieser Stelle möchte ich nochmals erwähnen, dass Mengenelemente<br />
nicht direkt über die Tastatur e<strong>in</strong>gelesen werden können. Trotzdem ist es<br />
möglich, Mengen<strong>in</strong>halte mit Hilfe der Mengenoperationen flexibel zu<br />
gestalten.<br />
Zum Beispiel soll e<strong>in</strong> e<strong>in</strong>gegebener Text dah<strong>in</strong>gehend manipuliert<br />
werden, dass aus ihm alle Buchstaben entfernt werden und <strong>in</strong> e<strong>in</strong>er<br />
Menge abgespeichert werden.<br />
Die Manipulation ist nach folgenden Schritten durchzuführen:<br />
●<br />
Der Ausgangspunkt ist e<strong>in</strong>e leere Menge:<br />
Aufbaumenge := [ ];<br />
●<br />
Als nächstes muss e<strong>in</strong>e Prüfmenge festgelegt werden:<br />
Pruefmenge := ['a'..'z'] + ['A'..'Z'];<br />
●<br />
Prüfen ob Buchstabe <strong>in</strong> Menge enthalten ist:<br />
IF Text[1] IN Pruefmenge THEN .....<br />
●<br />
Als weiteres wird e<strong>in</strong> gefundener Buchstabe <strong>in</strong> die Aufbaumenge<br />
durch Iteration e<strong>in</strong>gefügt:<br />
Aufbaumenge := Aufbaumenge + [Text[1]];<br />
Die Variable Text be<strong>in</strong>haltet den e<strong>in</strong>gegebenen Text, die [1] gibt die<br />
Position im Text an, an der geprüft wird. Um e<strong>in</strong>en ganzen Text zu<br />
prüfen ist es ratsam e<strong>in</strong>e FOR-Schleife zu benutzen.<br />
FOR i := 1 to length(text) do<br />
IF Text[I] IN Pruefmenge THEN<br />
Aufbaumenge := Aufbaumenge + [Text[I]];<br />
Wertausgabe<br />
Dateiverarbeitung<br />
file:///E|/homepage/<strong>Pascal</strong>/mengen_veraendern.htm [07.10.2001 00:39:36]
Dateiverarbeitung<br />
Dateiverarbeitung<br />
Datei: Unter e<strong>in</strong>er Datei versteht man e<strong>in</strong>e Sammlung von<br />
zusammengehörenden Daten, die auf e<strong>in</strong>em Externem Speicher wie<br />
zum Beispiel e<strong>in</strong>e Diskette oder Festplatte sichergestellt werden. Damit<br />
ist es jetzt möglich zum Beispiel e<strong>in</strong>gegebene Temperaturwerte beim<br />
nächsten Start e<strong>in</strong>es Programms wieder zu verwenden.<br />
Datenverarbeitung: Dateien übersteigen häufig die <strong>in</strong>terne<br />
Speicherkapazität des Computers. Das bedeutet, dass stets nur e<strong>in</strong> Teil<br />
der Datei im RAM gehalten werden kann. Bei der Datenverarbeitung<br />
geht es somit neben der Verarbeitung von Daten im RAM, stets auch um<br />
das Übertragen von Daten zwischen dem RAM und den Externspeichern<br />
bzw. E<strong>in</strong>-/Ausgabegeräte.<br />
Datene<strong>in</strong>heiten: Jede Datei besteht aus mehreren Datensätzen, die <strong>in</strong><br />
Datenfelder e<strong>in</strong>geteilt s<strong>in</strong>d. Jedes Feld wiederum besteht aus e<strong>in</strong>er Folge<br />
von Zeichen (Bytes), wobei sich e<strong>in</strong> Byte aus 8 Bits zusammensetzt.<br />
Mengen verändern<br />
Dateien anlegen bzw. öffnen<br />
file:///E|/homepage/<strong>Pascal</strong>/dateiverarbeitung.htm [07.10.2001 00:39:41]
Dateien anlegen bzw<br />
Dateien anlegen bzw. öffnen<br />
Die Grundlage für die Datenstruktur e<strong>in</strong>er Datei ist e<strong>in</strong> Record <strong>in</strong> dem<br />
die Struktur des Datensatzes mit se<strong>in</strong>en Datenfeldern festgelegt ist.<br />
TYPE<br />
TAdresse = RECORD<br />
AdrNr: Byte;<br />
Name: Str<strong>in</strong>g[20];<br />
END;<br />
Ist die Struktur des Datensatzes angelegt erfolgt die Zuweisung zu e<strong>in</strong>em<br />
Datei-Objekt, im folgendem Beispiel ist das Objekt TDatei e<strong>in</strong>e Datei mit<br />
dem Inhalt vom Record TAdresse.<br />
TDatei = FILE of TAdresse;<br />
Als nächstes müssen jetzt noch Variablen für die erstellten Objekte<br />
vergeben werden, über die dann später im Programm auf die Objekte<br />
zugegriffen wird.<br />
VAR<br />
Adresse: TAdresse;<br />
AdressDat: TDatei;<br />
Ist die Datenstruktur erstellt kann auf e<strong>in</strong>e Datei zugegriffen werden. Die<br />
Schnittstelle für den Zugriff auf Dateien schafft <strong>in</strong> Turbo <strong>Pascal</strong> die<br />
Anweisung Assign. Die Anweisung Assign stehlt sozusagen die<br />
Verb<strong>in</strong>dung zwischen Programm und Datei her.<br />
Die allg. Form der Anweisung lautet:<br />
Assign(Dateivariable, Date<strong>in</strong>ame);<br />
Bezogen auf unser Beispiel sieht die Anweisung wie folgt aus:<br />
Assign(AdressDat, 'testDat.dat');<br />
Damit ist die Verb<strong>in</strong>dung von Programm und Datei hergestellt. Assign<br />
<strong>in</strong>teressiert es dabei nicht ob die Datei existiert, da Assign nur die<br />
Schnittstelle mit der angegebenen Datei <strong>in</strong>itialisiert. Beachten Sie, dass<br />
Assign die Grundlage für jede Datei-Operation darstellt, sie ist also<br />
file:///E|/homepage/<strong>Pascal</strong>/dateien_anlegen_bzw.htm (1 of 2) [07.10.2001 00:39:44]
Dateien anlegen bzw<br />
immer zuerst aufzurufen.<br />
Ist die Verb<strong>in</strong>dung zur Datei hergestellt, kann e<strong>in</strong>e Datei geöffnet bzw.<br />
e<strong>in</strong>e neue Angelegt werden.<br />
Das erstellen e<strong>in</strong>er Datei erfolgt mit der Anweisung Rewrite. Rewrite<br />
erstellt e<strong>in</strong>e neue leere Datei auf dem Datenträger, dabei ist zu<br />
beachten, dass die Datei überschreiben wird wenn sie bereits existiert.<br />
Rewrite(AdressDat);<br />
Soll e<strong>in</strong>e vorhandene Datei geöffnet werden, erfolgt dies mit der<br />
Anweisung Reset.<br />
Reset(AdressDat);<br />
Jetzt können Sie Daten aus e<strong>in</strong>er Datei lesen bzw. <strong>in</strong> e<strong>in</strong>e Datei<br />
schreiben. S<strong>in</strong>d alle Dateioperationen beendet, sollte die Datei immer mit<br />
der Anweisung Close geschlossen werden.<br />
Close(AdressDat);<br />
Dateiverarbeitung<br />
In e<strong>in</strong>e Datei schreiben<br />
file:///E|/homepage/<strong>Pascal</strong>/dateien_anlegen_bzw.htm (2 of 2) [07.10.2001 00:39:44]
In e<strong>in</strong>e Datei schreiben<br />
In e<strong>in</strong>e Datei schreiben<br />
Beachten Sie, dass bevor Sie <strong>in</strong> e<strong>in</strong>e Datei schreiben können, die <strong>in</strong> den<br />
vorherigen Seiten besprochenen Vorraussetzungen gegeben se<strong>in</strong><br />
müssen. Also das erstellen e<strong>in</strong>er Datenstruktur, das Herstellen e<strong>in</strong>er<br />
Verb<strong>in</strong>dung und das öffnen bzw. erstellen e<strong>in</strong>er Datei.<br />
Das sequentielle Schreiben <strong>in</strong> e<strong>in</strong>e Datei, also das schreiben an die<br />
aktuelle Adresse (Position) erfolgt mir der Anweisung Write.<br />
Der Prototyp der Anweisung lautet:<br />
Write(Dateivariable, Recordvariable);<br />
Auf unser Beispiel aus den vorherigen Seiten angewandt, lautet die<br />
Anweisung wie folgt:<br />
Write(AdressDat, Adresse);<br />
Die Anweisung Write schreibt den Inhalt des Records Adresse <strong>in</strong> die<br />
Datei AdressDat, beachten Sie dabei, dass Sie vor dem Schreiben <strong>in</strong> die<br />
Datei den Elementen des Records Werte zuweisen müssen.<br />
Adresse.Adr := 12;<br />
Adresse.Name := 'Katja';<br />
Zum Abschluss noch e<strong>in</strong> kle<strong>in</strong>es Beispiel zum Schreiben <strong>in</strong> e<strong>in</strong>e neue<br />
Datei, <strong>in</strong> dem alle Schritte ersichtlich werden:<br />
PROGRAM Schreib;<br />
USES Crt;<br />
TYPE<br />
TAdresse = RECORD<br />
AdrNr: Byte;<br />
Name: Str<strong>in</strong>g[12];<br />
END;<br />
TDatei = FILE of TAdresse;<br />
VAR<br />
AdressDat: TDatei;<br />
Adresse: TAdresse;<br />
file:///E|/homepage/<strong>Pascal</strong>/<strong>in</strong>_e<strong>in</strong>e_datei_schreiben.htm (1 of 2) [07.10.2001 00:39:53]
In e<strong>in</strong>e Datei schreiben<br />
BEGIN<br />
Assign(AdressDat, 'testdat.dat');<br />
Rewrite(AdressDat);<br />
Adresse.AdrNr := 12;<br />
Adresse.Name := 'Katja';<br />
Write(AdressDat, Adresse);<br />
Close(AdressDat);<br />
Readln;<br />
END.<br />
Dieses Programm erstellt e<strong>in</strong>e neue Datei namens testdat.dat und<br />
schreib <strong>in</strong> diese e<strong>in</strong>en Datensatz.<br />
Dateien anlegen bzw. öffnen<br />
Aus e<strong>in</strong>er Datei lesen<br />
file:///E|/homepage/<strong>Pascal</strong>/<strong>in</strong>_e<strong>in</strong>e_datei_schreiben.htm (2 of 2) [07.10.2001 00:39:53]
Aus e<strong>in</strong>er Datei lesen<br />
Aus e<strong>in</strong>er Datei lesen<br />
Beachten Sie, dass bevor Sie aus e<strong>in</strong>er Datei lesen können, die <strong>in</strong> den<br />
vorherigen Seiten besprochenen Vorraussetzungen gegeben se<strong>in</strong><br />
müssen. Also das erstellen e<strong>in</strong>er Datenstruktur, das Herstellen e<strong>in</strong>er<br />
Verb<strong>in</strong>dung, das öffnen e<strong>in</strong>er Datei und natürlich auch dass vorhanden<br />
se<strong>in</strong> von Datensätzen <strong>in</strong> der Datei.<br />
Das sequentielle lesen e<strong>in</strong>er Datei, also das lesen von der aktuellen<br />
Adresse (Position) erfolgt mir der Anweisung Read.<br />
Der Prototyp der Anweisung lautet:<br />
Read(Dateivariable, Recordvariable);<br />
Auf unser vorheriges Beispiel angewandt lautet die Anweisung wie folgt:<br />
Read(AdressDat, Adresse);<br />
Die Anweisung Read liest den Inhalt des Aktuellen Datensatzes aus der<br />
Datei AdressDat <strong>in</strong> das Record Adresse. Mit den ausgelesenen Werten<br />
im Record können Sie nun weiterarbeiten.<br />
Nummer := Adresse.Adr;<br />
Name := Adresse.Name;<br />
Auch hier e<strong>in</strong> kle<strong>in</strong>es Beispiel zum lesen aus e<strong>in</strong>er Datei, <strong>in</strong> der alle<br />
Schritte etwas mehr ersichtlich werden:<br />
PROGRAM lesen;<br />
USES Crt;<br />
TYPE<br />
TAdresse = RECORD<br />
AdrNr: Byte;<br />
Name: Str<strong>in</strong>g[12];<br />
END;<br />
TDatei = FILE of TAdresse;<br />
VAR<br />
AdressDat: TDatei;<br />
Adresse: TAdresse;<br />
Nummer: Byte;<br />
file:///E|/homepage/<strong>Pascal</strong>/aus_e<strong>in</strong>er_datei_lesen.htm (1 of 2) [07.10.2001 00:39:59]
Aus e<strong>in</strong>er Datei lesen<br />
Name: Str<strong>in</strong>g[12];<br />
BEGIN<br />
Assign(AdressDat, 'testdat.dat');<br />
Reset(AdressDat);<br />
Read(AdressDat, Adresse);<br />
Nummer := Adresse.AdrNr;<br />
Name := Adresse.NameM<br />
Close(AdressDat);<br />
Readln;<br />
END.<br />
Das Programm liest e<strong>in</strong>en Datensatz aus e<strong>in</strong>er Datei namens testdat.dat<br />
und speichert die Daten dann im Record Adresse ab.<br />
Schreiben <strong>in</strong> e<strong>in</strong>e Datei<br />
Datensatzzeiger<br />
file:///E|/homepage/<strong>Pascal</strong>/aus_e<strong>in</strong>er_datei_lesen.htm (2 of 2) [07.10.2001 00:39:59]
Datensatzzeiger<br />
Datensatzzeiger<br />
Prüft, ob das Ende e<strong>in</strong>er Datei erreicht ist. Der sogenannte<br />
Datensatzzeiger wird während der E<strong>in</strong>- bzw. Ausgabe <strong>in</strong> e<strong>in</strong>e Datei<br />
ständig aktualisiert.<br />
Allgeme<strong>in</strong>er Prototyp der Funktion:<br />
Eof(Dateivariable);<br />
Anwendung auf unser Beispiel:<br />
Eof(AdressDat);<br />
Eof prüft, ob es <strong>in</strong> der angegebenen Datei ohne explizite Veränderung<br />
der momentanen Position noch etwas zu lesen gibt und liefert True,<br />
wenn die Datei ke<strong>in</strong>e Komponenten enthält, nur für Schreibaktionen<br />
geöffnet worden ist, oder der Positionszeiger <strong>in</strong>nerhalb der Datei h<strong>in</strong>ter<br />
der letzten Komponente steht.<br />
Der Datensatzzeiger kann sehr gut <strong>in</strong> e<strong>in</strong>er While - Schleife verwendet<br />
werden, zum Beispiel um e<strong>in</strong>e ganze Datei auszulesen.<br />
BEGIN<br />
I := 1;<br />
WHILE (Eof(AdressDat) true) DO<br />
BEGIN<br />
Read(AdressDat, Adresse);<br />
Nummern[i] := Adresse.AdrNr;<br />
Namen[i] := Adresse.Name;<br />
I := i +1;<br />
END;<br />
END.<br />
In dem Beispiel wird die While - Schleife solange wiederholt bis Eof<br />
Wahr (True) zurück gibt. Innerhalb der While - Schleife werden die<br />
ausgelesenen Daten dann <strong>in</strong> e<strong>in</strong> Array e<strong>in</strong>gelesen.<br />
Möchten Sie die aktuelle Position <strong>in</strong> e<strong>in</strong>er Datei ermitteln, existiert dazu<br />
die Anweisung FilePos.<br />
Die allg. Form lautet:<br />
FilePos(AdressDat);<br />
file:///E|/homepage/<strong>Pascal</strong>/datensatzzeiger.htm (1 of 2) [07.10.2001 00:40:11]
Datensatzzeiger<br />
Auf unser Beipiel angewandt sieht dies wie folgt aus:<br />
Pos := FilePos(AdressDat);<br />
Möchten Sie nun den Datensatzzeiger auf e<strong>in</strong>e Bestimmte Position<br />
setzen, nutzen Sie dafür die Funktion Seek.<br />
Der Prototyp der Prozedur lautet:<br />
Seek(Dateivariable, Datensatz);<br />
In unserem Beispiel sieht das wie folgt aus:<br />
Seek(AdressDat, 10);<br />
Setzt den Datensatzzeiger auf die 10. Position. Benötigen Sie nun noch<br />
die Anzahl der Datensätze, steht Ihnen die Funktion FileSize zur<br />
Verfügung.<br />
Seek(AdressDat, FileSize(AdressDat);<br />
Das Beispiel setzt den Datensatzzeiger auf die letzte Position <strong>in</strong> der<br />
Datei, da die Anzahl der Datensätze der letzen Position <strong>in</strong> der Datei<br />
entspricht.<br />
Lesen aus e<strong>in</strong>er Datei<br />
Datensatz löschen<br />
file:///E|/homepage/<strong>Pascal</strong>/datensatzzeiger.htm (2 of 2) [07.10.2001 00:40:11]
Datensatz löschen<br />
Datensatz löschen<br />
In Turbo <strong>Pascal</strong> existiert ke<strong>in</strong>e Anweisung zum löschen von<br />
Datensätzen, das ganze kann man nur über e<strong>in</strong>en Umweg erreichen.<br />
Das löschen von Datensätzen erfolg mit dem sogenannten Vater-Sohn-<br />
Pr<strong>in</strong>zip. Das Vater-Sohn-Pr<strong>in</strong>zip besagt das e<strong>in</strong>e neue Datei (Sohn)<br />
angelegt wird, die von der Grunddatei (Vater) abgeleitet ist.<br />
In dieser neuen Datei werden nur die Datensätze übernommen die nicht<br />
gelöscht werden sollen. Diese Form ersche<strong>in</strong>t ziemlich umständlich. Sie<br />
hat aber den entscheidenden Vorteil, dass bei Verlust der Sohn Datei ihr<br />
Inhalt aus der Vater Datei rekonstruiert werden kann.<br />
Jetzt noch e<strong>in</strong> kle<strong>in</strong>es Beispiel welches e<strong>in</strong>en Datensatz unter<br />
Verwendung des Vater-Sohn-Pr<strong>in</strong>zips löscht:<br />
PROGRAM Del_Ds;<br />
USES Crt;<br />
TYPE<br />
TAdresse = RECORD<br />
AdrNr: Byte;<br />
Name: Str<strong>in</strong>g[12];<br />
END;<br />
TDatei = FILE of TAdresse;<br />
VAR<br />
Adresse, Adresse2: TAdresse;<br />
AdressVater: TDatei;<br />
AdressSohn: TDatei;<br />
DS: Byte;<br />
BEGIN<br />
Write('Welchen Datensatz loeschen: ');<br />
readln(ds);<br />
Assign(AdressVater, 'adressen.alt');<br />
Reset(AdressVater);<br />
Assign(AdressSohn, 'adressen.new');<br />
Rewrite(AdressSohn);<br />
While (EOF(AdressVater)true) DO<br />
BEGIN<br />
Read(AdressVater, Adresse);<br />
IF Adresse.AdrNr ds THEN<br />
BEGIN<br />
file:///E|/homepage/<strong>Pascal</strong>/datensatz_loeschen.htm (1 of 2) [07.10.2001 00:40:20]
Datensatz löschen<br />
Adresse2.AdrNr:=Adresse.AdrNr;<br />
Adresse2.Name:=Adresse.Name;<br />
Write(AdressSohn, Adresse2);<br />
END;<br />
END;<br />
Close(AdressSohn);<br />
Close(AdressVater);<br />
Readln;<br />
END.<br />
Datensatzzeiger<br />
Befehlsverzeichnis<br />
file:///E|/homepage/<strong>Pascal</strong>/datensatz_loeschen.htm (2 of 2) [07.10.2001 00:40:20]
Befehlsverzeichnis<br />
Befehlsverzeichnis<br />
Wie Sie sich sicher denken können ist es schwierig und kaum möglich<br />
auf alle Befehle bzw. Anweisungen <strong>in</strong> e<strong>in</strong>er Programmiersprache<br />
e<strong>in</strong>zugehen. Vor allem da dadurch die Übersichtlichkeit der e<strong>in</strong>zelnen<br />
Kapitel bzw. Schwerpunkte leidet. Deshalb gibt es hier e<strong>in</strong>e kle<strong>in</strong>e<br />
Übersicht über die häufigsten Befehle. Die e<strong>in</strong>zelnen Anweisungen<br />
enthalten e<strong>in</strong>e kurze Erläuterung, die Deklaration und e<strong>in</strong> Beispiel.<br />
Da dieser Teil sehr Umfangreich ist, bef<strong>in</strong>det er sich leider noch <strong>in</strong> Arbeit.<br />
Ich werde aber versuchen Ihn so schnell wie möglich fertig zu stellen!<br />
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z<br />
A<br />
Abs<br />
Arc<br />
Assign<br />
B<br />
Bar<br />
Blockread<br />
Break<br />
C<br />
Case<br />
Concat<br />
Chr<br />
Circle<br />
ClearScreen<br />
ClearViewPort<br />
Close<br />
ClrEol<br />
D<br />
DirectVideo<br />
DiskSize<br />
DIV<br />
DetectGraph<br />
DosExitCode<br />
Delay<br />
DelL<strong>in</strong>e<br />
DrawPoly<br />
Append<br />
ArcTan<br />
AssignCrt<br />
Bar3D<br />
Blockwrite<br />
ChDir<br />
Cont<strong>in</strong>ue<br />
Copy<br />
ClearDevice<br />
Cos<br />
CreateDir<br />
CloseGraph<br />
Clrscr<br />
DiskFree<br />
Dispose<br />
DateTime<br />
Dec<br />
DosVersion<br />
Delete<br />
Draw<br />
file:///E|/homepage/<strong>Pascal</strong>/befehlsverzeichnis.htm (1 of 5) [07.10.2001 00:40:30]
Befehlsverzeichnis<br />
E<br />
Ellipse<br />
EnvCount<br />
EnvStr<br />
Eof<br />
Eoln<br />
Erase<br />
Exclude<br />
Exec<br />
Exit<br />
Exp<br />
F<br />
F<strong>in</strong>dFirst<br />
F<strong>in</strong>dNext<br />
FloodFill<br />
Flush<br />
For<br />
Forward<br />
Frac<br />
FreeMem<br />
FSearch<br />
FExpand<br />
FSplit<br />
Function<br />
FileExpand<br />
FileMode<br />
FilePos<br />
FileSearch<br />
FileSize<br />
FileSplit<br />
FillChar<br />
FillEllipse<br />
FillPattern<br />
FillPoly<br />
G<br />
GetArcCoods<br />
GetArgCount<br />
GetArgStr<br />
GetAspectRatio<br />
GetBkColor<br />
GetCBreak<br />
GetColor<br />
GetCurDir<br />
GetDate<br />
GetDefaultPalette<br />
GetDir<br />
GetDriverName<br />
GetEnv<br />
GetEnvVar<br />
GetFAttr<br />
GetFillPattern<br />
GetFillSett<strong>in</strong>gs<br />
GetFTime<br />
GetGraphMode<br />
GetImage<br />
GetIntVec<br />
GetL<strong>in</strong>eSett<strong>in</strong>gs<br />
GetMaxColor<br />
GetMaxMode<br />
GetMaxX<br />
GetMaxY<br />
GetMem<br />
GetModeName<br />
GetModeRange<br />
GetPalette<br />
GetPaletteSize<br />
GetPixel<br />
GetTextSett<strong>in</strong>gs<br />
GetTime<br />
GetVerify<br />
GetViewSett<strong>in</strong>gs<br />
GetX<br />
GetY<br />
Goto<br />
GotoXY<br />
GraphDefaults<br />
GraphResult<br />
H<br />
Hi<br />
HighVideo<br />
Hx<br />
file:///E|/homepage/<strong>Pascal</strong>/befehlsverzeichnis.htm (2 of 5) [07.10.2001 00:40:30]
Befehlsverzeichnis<br />
I<br />
If<br />
ImageSize<br />
Inc<br />
IN<br />
Include<br />
InitGraph<br />
Inl<strong>in</strong>e<br />
Insert<br />
InsL<strong>in</strong>e<br />
Int<br />
IOResult<br />
K<br />
Keep<br />
KeyPressed<br />
L<br />
Label<br />
L<strong>in</strong>eTo<br />
Ln<br />
Lo<br />
Length<br />
Low<br />
LowVideo<br />
L<strong>in</strong>e<br />
L<strong>in</strong>eFill<br />
M<br />
Make<br />
Mark<br />
MaxAvail<br />
MaxColors<br />
MaxInt<br />
MaxLongInt<br />
Move<br />
MoveRel<br />
Mem<br />
MemAvail<br />
MemL<br />
MemW<br />
MkDir<br />
MoveTo<br />
MsDos<br />
N<br />
NormVideo<br />
NoSound<br />
O<br />
Ord<br />
OutText<br />
OutTextXY<br />
P<br />
Procedure<br />
PackTime<br />
PaletteType<br />
ParamStr<br />
PieSlice<br />
Pos<br />
Pred<br />
Ptr<br />
PutImage<br />
PutPixel<br />
R<br />
Release<br />
RemoveDir<br />
Random<br />
Randomize<br />
file:///E|/homepage/<strong>Pascal</strong>/befehlsverzeichnis.htm (3 of 5) [07.10.2001 00:40:30]
Befehlsverzeichnis<br />
Read<br />
Repeat<br />
ReadKey<br />
Readln<br />
Reset<br />
Rectangle<br />
RestoreCrtMode<br />
Rewrite<br />
RmDir<br />
Round<br />
RunError<br />
S<br />
SizeOf<br />
SlashFill<br />
SmallFont<br />
SoildFill<br />
SoildLn<br />
Sound<br />
South<br />
SPtr<br />
Sqr<br />
Sqrt<br />
Str<br />
StrCat<br />
StrComp<br />
StrCopy<br />
StrDispose<br />
StrECopy<br />
StrEnd<br />
StrIComp<br />
Seek<br />
SeekEof<br />
SeekEoln<br />
StrMove<br />
StrNew<br />
Succ<br />
StrUpper<br />
Swap<br />
SetColor<br />
SetBkColor<br />
SetCurDate<br />
SetDate<br />
SetFAttr<br />
SetFTime<br />
S<strong>in</strong><br />
SetTextStyle<br />
SetTime<br />
T<br />
Trunc<br />
Truncate<br />
Test8086<br />
Test8087<br />
Text<br />
TextAttr<br />
TextBackground<br />
TextColor<br />
TextHeight<br />
TextMode<br />
TextWidth<br />
Then<br />
TypeOf<br />
To<br />
U<br />
UnpackTime<br />
UpCase<br />
Until<br />
V<br />
ViewPortType<br />
Val<br />
W<br />
WhereX<br />
WhereY<br />
While<br />
W<strong>in</strong>dow<br />
With<br />
W<strong>in</strong>dM<strong>in</strong><br />
file:///E|/homepage/<strong>Pascal</strong>/befehlsverzeichnis.htm (4 of 5) [07.10.2001 00:40:30]
Befehlsverzeichnis<br />
W<strong>in</strong>dMax<br />
Writeln<br />
Write<br />
Datensatz löschen<br />
E<strong>in</strong>fache Beispiele<br />
file:///E|/homepage/<strong>Pascal</strong>/befehlsverzeichnis.htm (5 of 5) [07.10.2001 00:40:30]
Turbo <strong>Pascal</strong><br />
Turbo <strong>Pascal</strong> - Programmbeispiele<br />
Jeder der gerade e<strong>in</strong>e Programmiersprache lernt, weis wie schwierig es<br />
am Anfang ist das gelernte Wissen anzuwenden. Deshalb denke ich das<br />
es das beste und auch das E<strong>in</strong>fachste ist e<strong>in</strong>e Programmiersprache<br />
anhand von Beispielen zu lernen. Auch gerne als "Learn<strong>in</strong>g by<br />
Example" bezeichnet. Deshalb gibt es hier e<strong>in</strong>ige kle<strong>in</strong>e Turbo <strong>Pascal</strong><br />
Programm die grundlegende Funktionen durchführen.<br />
Addition.pas<br />
Teilbar.pas<br />
Hallo!.pas<br />
Buchstab.pas<br />
Dreieck.pas<br />
Function.pas<br />
Func_gib.pas<br />
Kalender.pas<br />
Lauf.pas<br />
Sortiere.pas<br />
Mittelw.pas<br />
z<strong>in</strong>srep.pas<br />
Addiert e<strong>in</strong>e Reihe von Zahlen und gibt<br />
deren Summe aus.<br />
Das Programm verlangt das zwei Zahlen<br />
e<strong>in</strong>gegeben werden und überprüft dann ob<br />
die erste Zahl e<strong>in</strong> Teiler von der zweiten<br />
ist.<br />
Zeigt die Funktionsweise e<strong>in</strong>er For-Schleife<br />
und gibt Text aus deren Farbe und Position<br />
per Zufall ermittelt wird.<br />
Prüft ob e<strong>in</strong> Buchstabe e<strong>in</strong>gegeben wurde<br />
und wiederholt solange bis ke<strong>in</strong> Buchstabe<br />
mehr e<strong>in</strong>gegeben wird.<br />
Errechnet <strong>in</strong> e<strong>in</strong>er Funktion den<br />
Flächen<strong>in</strong>halt e<strong>in</strong>es Dreiecks.<br />
Prüft <strong>in</strong> e<strong>in</strong>er Funktion welche Taste<br />
gedrückt wurde.<br />
Rechnet Bogenmaß <strong>in</strong> Grad und Grad <strong>in</strong><br />
Bogenmaß um.<br />
Nach E<strong>in</strong>gabe des Jahres, gibt das<br />
Programm e<strong>in</strong>en Kalender für jeden Monat<br />
aus.<br />
Erzeugt aus e<strong>in</strong>er Zeichenkette e<strong>in</strong>en<br />
Str<strong>in</strong>g, der solange läuft bis e<strong>in</strong>e Taste<br />
gedrückt wird.<br />
Nach der E<strong>in</strong>gabe von drei Zahlen, werden<br />
diese vom Programm sortiert ausgegeben.<br />
Errechnet mit e<strong>in</strong>er While-Schleife aus<br />
e<strong>in</strong>igen Zahlen die Summe und den<br />
Mittelwert.<br />
Errechnet mit Hilfe e<strong>in</strong>er Repeat-Schleife<br />
verschiedene Z<strong>in</strong>ssätze auf das<br />
e<strong>in</strong>gegebene Kapital.<br />
file:///E|/homepage/<strong>Pascal</strong>/beisp_turbo_pascal.htm (1 of 2) [07.10.2001 00:40:37]
Turbo <strong>Pascal</strong><br />
Temp_01.pas Errechnet, nach der E<strong>in</strong>gabe von 24<br />
Temperaturen, die M<strong>in</strong>-/Maximumwerte,<br />
den Durchschnitt und die<br />
Temperaturschwankung.<br />
Befehlsverzeichnis<br />
Käufmännische Beispiele<br />
file:///E|/homepage/<strong>Pascal</strong>/beisp_turbo_pascal.htm (2 of 2) [07.10.2001 00:40:37]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/addition.pas<br />
PROGRAM addition;<br />
USES crt;<br />
VAR sum, x: Real;<br />
BEGIN<br />
TextColor(White);<br />
Clrscr;<br />
sum := 0;<br />
{1. Zahl e<strong>in</strong>lesen und Sum Berechnen}<br />
Write('1. Zahl e<strong>in</strong>geben: ');<br />
Readln(x);<br />
sum := sum + x;<br />
{2. Zahl e<strong>in</strong>lesen und Sum Berechnen}<br />
Write('2. Zahl e<strong>in</strong>geben: ');<br />
Readln(x);<br />
sum := sum + x;<br />
{3. Zahl e<strong>in</strong>lesen und Sum Berechnen}<br />
Write('3. Zahl e<strong>in</strong>geben: ');<br />
Readln(x);<br />
sum := sum + x;<br />
{4. Zahl e<strong>in</strong>lesen und Sum Berechnen}<br />
Write('4. Zahl e<strong>in</strong>geben: ');<br />
Readln(x);<br />
sum := sum + x;<br />
{5. Zahl e<strong>in</strong>lesen und Sum Berechnen}<br />
Write('5. Zahl e<strong>in</strong>geben: ');<br />
Readln(x);<br />
sum := sum + x;<br />
Writeln;<br />
Writeln('Die Summe betr„gt :', sum:10:2);<br />
GotoXY(1, 25);<br />
Write('Bitte [Return] dr•cken...');<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/addition.pas [07.10.2001 00:41:39]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/teilbar.pas<br />
PROGRAM teilbarkeit;<br />
USES crt;<br />
VAR t, a: Integer;<br />
BEGIN<br />
clrscr;<br />
Textcolor(white);<br />
writeln('šBERPRšFEN DER TEILBARKEIT');<br />
writeln;<br />
writeln('Ist t e<strong>in</strong> Teiler von a?');<br />
writeln;<br />
write('E<strong>in</strong>gabe von t: ');<br />
readln(t);<br />
write('E<strong>in</strong>gabe von a: ');<br />
readln(a);<br />
gotoXY(32, 3);<br />
IF a mod t = 0 THEN<br />
write('>')<br />
ELSE<br />
write('>');<br />
readln<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/teilbar.pas [07.10.2001 00:42:35]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/hallo!.pas<br />
PROGRAM Schleife_mit_For;<br />
USES crt;<br />
VAR I: Integer;<br />
BEGIN<br />
Clrscr;<br />
FOR I := 1 TO 24 DO<br />
BEGIN<br />
GotoXY(Random(30) + I, I);<br />
TextColor(Random(15));<br />
Writeln('Hallo Leute, wie gehts?!');<br />
delay(1000);<br />
END;<br />
FOR I := 24 DOWNTO 1 DO<br />
BEGIN<br />
GotoXY(Random(30) + I, I);<br />
TextColor(Random(15));<br />
Writeln('Schon wieder Mittwoch!');<br />
delay(1000);<br />
END;<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/hallo!.pas [07.10.2001 00:42:50]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/buchstab.pas<br />
program LiesBuchstabe;<br />
uses crt;<br />
var<br />
ch: char;<br />
ok: boolean;<br />
function buchstabe(var ch: char): boolean;<br />
{var<br />
ch: char; }<br />
beg<strong>in</strong><br />
gotoxy(1,5);<br />
write('Bitte e<strong>in</strong> Zeichen e<strong>in</strong>geben: ');<br />
ch := readkey;<br />
if (ch <strong>in</strong> ['a'..'z']) or (ch <strong>in</strong> ['A'..'Z'])<br />
then buchstabe := true<br />
else buchstabe := false;<br />
gotoxy(1,5);<br />
clreol;<br />
end;<br />
procedure warteWo(sp, zei: byte);<br />
var<br />
ch: char;<br />
beg<strong>in</strong><br />
gotoxy(5, 10);<br />
write('Bitte e<strong>in</strong>e Taste dr•cken...');<br />
ch := readkey;<br />
end;<br />
beg<strong>in</strong><br />
repeat<br />
clrscr;<br />
ok := buchstabe(ch);<br />
gotoxy(5, 12);<br />
if ok<br />
then<br />
beg<strong>in</strong><br />
write ('Es wurde e<strong>in</strong> Buchstabe e<strong>in</strong>gegeben.');<br />
write ('Sie haben den Buchstaben "', ch, '" gedr•ckt!');<br />
end<br />
else write ('Es wurde ke<strong>in</strong> Buchstabe e<strong>in</strong>gegeben.');<br />
warteWo(1, 25);<br />
until not ok;<br />
end.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/buchstab.pas [07.10.2001 00:42:58]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/dreieck.pas<br />
PROGRAM Dreieck;<br />
USES Crt;<br />
VAR<br />
Laenge, Hoehe: Real;<br />
Inhalt: Real;<br />
FUNCTION fl_Dreieck(l,h: Real): Real;<br />
BEGIN<br />
fl_Dreieck := l * h /2;<br />
END;<br />
BEGIN<br />
Clrscr;<br />
Write('Geben Sie die L„nge des Dreiecks e<strong>in</strong>: ');<br />
Readln(Laenge);<br />
Write('Geben Sie die H”he des Dreiecks e<strong>in</strong>: ');<br />
Readln(Hoehe);<br />
Inhalt:= fl_Dreieck(Laenge,Hoehe);<br />
Writeln('Das Dreieck hat e<strong>in</strong>en Fl„chen<strong>in</strong>halt von: ',Inhalt:10:2,' cmý');<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/dreieck.pas [07.10.2001 00:43:06]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/function.pas<br />
Program _function;<br />
Uses crt;<br />
Var<br />
Ch: Char;<br />
FUNCTION LiesZeichen: Char;<br />
BEGIN<br />
GotoXY(1, 5);<br />
Write('Bitte dr•cken Sie e<strong>in</strong> Zeichen: ');<br />
LiesZeichen := ReadKey;<br />
GotoXY(1, 5);<br />
ClrEol;<br />
END;<br />
BEGIN<br />
ClrScr;<br />
Ch := LiesZeichen;<br />
Writeln('Folgendes Zeichen wurde gedr•ckt: ', ch);<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/function.pas [07.10.2001 00:43:14]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/func_gib.pas<br />
Program _function;<br />
Uses Crt, me<strong>in</strong>_sub;<br />
var<br />
Bogenmass, Grad, W<strong>in</strong>kel: Real;<br />
ch: char;<br />
Beg<strong>in</strong><br />
repeat<br />
Clrscr;<br />
Writeln('<br />
Copyright 1999 by Alexander Gr„f');<br />
writeln;<br />
Write('Bitte geben Sie e<strong>in</strong> W<strong>in</strong>kel <strong>in</strong> Radiant e<strong>in</strong>: ');<br />
Readln(Bogenmass);<br />
Grad := BiGu(Bogenmass);<br />
Writeln('Dies entspricht ', Grad:2:2, ' Grad');<br />
writeln;<br />
Write('Bitte geben Sie e<strong>in</strong>en W<strong>in</strong>kel <strong>in</strong> Grad e<strong>in</strong>: ');<br />
Readln(W<strong>in</strong>kel);<br />
Grad := Gibu(W<strong>in</strong>kel);<br />
Writeln('Dies entspricht e<strong>in</strong>em Bogenmaá von: ', Grad:2:2);<br />
Writeln;<br />
Write('WEITER DATEN BERECHNEN (Y/N)?');<br />
Ch := Upcase(readkey);<br />
until ch = 'N';<br />
end.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/func_gib.pas [07.10.2001 00:43:21]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas<br />
Program KalenderDruck;<br />
Uses Crt;<br />
Type Wochentage = (Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag);<br />
Monate = (Januar, Februar, Maerz, April, Mai, Juni, Juli, August, September, Oktober,<br />
November, Dezember);<br />
Var<br />
Jahr: Integer;<br />
Monat : Monate;<br />
ersterT: Wochentage;<br />
schaltjahr: Boolean;<br />
I, Z, S, M, MonatsTage: Byte;<br />
NameMonat: Str<strong>in</strong>g;<br />
FUNCTION erster_tag(jahr: Integer; Var Schaltjahr: boolean):Wochentage;<br />
VAR<br />
c, j, k, d: Integer;<br />
BEGIN<br />
Schaltjahr:=(Jahr mod 4 = 0) AND<br />
NOT ((Jahr MOD 100 =0) AND<br />
(Jahr MOD 400 0));<br />
{c := jahr div 100;<br />
j := jahr mod 100;<br />
IF j = 0 then schaltjahr := (c mod 4) = 0<br />
ELSE schaltjahr := (j mod 4) = 0;<br />
IF Schaltjahr = true then k := 6<br />
ELSE K := 8;<br />
d := k + j div 4 -2 * (c mod 4);}<br />
d:= 1 + 6 + jahr + jahr div 4 - jahr div 100 + jahr div 400;<br />
IF Schaltjahr THEN d := d - 1;<br />
CASE d mod 7 OF<br />
0: erster_tag := Sonntag;<br />
1: erster_tag := Montag;<br />
2: erster_tag := Dienstag;<br />
3: erster_tag := Mittwoch;<br />
4: erster_tag := Donnerstag;<br />
5: erster_tag := Freitag;<br />
6: erster_tag := Samstag;<br />
END;<br />
END;<br />
BEGIN<br />
REPEAT<br />
Clrscr;<br />
Write('Bitte geben Sie das Jahr e<strong>in</strong> (z.B. 1999): ');<br />
Readln(jahr);<br />
IF ( jahr < 1582 ) or ( jahr > 3000 ) THEN<br />
BEGIN<br />
TextColor(Red);<br />
Writeln(jahr, ' liegt auáerhalb des zul„sigen Bereichs!');<br />
Writeln('Bitte geben Sie e<strong>in</strong> Jahr von 1582 bis 3000 e<strong>in</strong>!');<br />
TextColor(white);<br />
Readln;<br />
END;<br />
UNTIL ( jahr > 1582 ) and ( jahr < 3000 );<br />
ersterT := erster_tag(jahr, schaltjahr);<br />
{IF Schaltjahr = False THEN ersterT := succ(ersterT);}<br />
CASE ersterT OF<br />
Sonntag: s := 0;<br />
Montag: s := 1;<br />
Dienstag: s := 2;<br />
Mittwoch: s := 3;<br />
Donnerstag: s := 4;<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas (1 of 3) [07.10.2001 00:43:29]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas<br />
Freitag: s := 5;<br />
Samstag: s := 6;<br />
END;<br />
Monat := Januar;<br />
FOR M := 1 to 12 DO<br />
BEGIN<br />
CASE Monat OF<br />
Januar: BEGIN<br />
NameMonat := 'Januar';<br />
MonatsTage := 31;<br />
END;<br />
Februar: BEGIN<br />
NameMonat := 'Februar';<br />
IF SchaltJahr = True then MonatsTage := 29<br />
ELSE MonatsTage := 28;<br />
END;<br />
Maerz: BEGIN<br />
NameMonat := 'M„rz';<br />
MonatsTage := 31;<br />
END;<br />
April: BEGIN<br />
NameMonat := 'April';<br />
MonatsTage := 30;<br />
END;<br />
Mai: BEGIN<br />
NameMonat := 'Mai';<br />
MonatsTage := 31;<br />
END;<br />
Juni: BEGIN<br />
NameMonat := 'Juni';<br />
MonatsTage := 30;<br />
END;<br />
Juli: BEGIN<br />
NameMonat := 'Juli';<br />
MonatsTage := 31;<br />
END;<br />
August: BEGIN<br />
NameMonat := 'August';<br />
MonatsTage := 31;<br />
END;<br />
September: BEGIN<br />
NameMonat := 'September';<br />
MonatsTage := 30;<br />
END;<br />
Oktober: BEGIN<br />
NameMonat := 'Oktober';<br />
MonatsTage := 31;<br />
END;<br />
November: BEGIN<br />
NameMonat := 'November';<br />
MonatsTage := 30;<br />
END;<br />
Dezember: BEGIN<br />
NameMonat := 'Dezember';<br />
MonatsTage := 31;<br />
END;<br />
END;<br />
Clrscr;<br />
TextColor(White);<br />
GotoXY(33, 1);<br />
Writeln(NameMonat,' ', Jahr);<br />
GotoXY(5, 3);<br />
Writeln('Sontag');<br />
GotoXY(5, 4);<br />
Writeln('Montag');<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas (2 of 3) [07.10.2001 00:43:29]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas<br />
GotoXY(5, 5);<br />
Writeln('Dienstag');<br />
GotoXY(5, 6);<br />
Writeln('Mittwoch');<br />
GotoXY(5, 7);<br />
Writeln('Donnerstag');<br />
Gotoxy(5, 8);<br />
Writeln('Freitag');<br />
GotoXY(5, 9);<br />
Writeln('Samstag');<br />
Z := 0;<br />
FOR I := 1 to MonatsTage DO<br />
BEGIN<br />
S := S + 1;<br />
IF S = 8 THEN<br />
BEGIN<br />
IF I 1 THEN<br />
BEGIN<br />
S := 1; z := z +10;<br />
END<br />
ELSE<br />
BEGIN<br />
S := 1;<br />
END<br />
END;<br />
GotoXY(20 + Z, 2 + S);<br />
Writeln(I);<br />
END;<br />
Monat := Succ(Monat);<br />
GotoXY(30, 12);<br />
writeln('Weiter mit [ENTER]');<br />
Readln;<br />
END;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/kalender.pas (3 of 3) [07.10.2001 00:43:29]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/lauf.pas<br />
Program Bildschirmschoner;<br />
Uses Crt;<br />
Var<br />
Text, teil, e<strong>in</strong>f, str2, str3, str4, str1: Str<strong>in</strong>g;<br />
laenge_text, I, e: <strong>in</strong>teger;<br />
Text_bild: Str<strong>in</strong>g[30];<br />
Beg<strong>in</strong><br />
Textcolor(white);<br />
clrscr;<br />
Writeln('Bitte geben Sie e<strong>in</strong>e Zeichenkette e<strong>in</strong>: ');<br />
Readln(text);<br />
laenge_text := Length(text);<br />
str3 := Copy(text, 1, 1);<br />
str4 := Copy(text, length(text), 1);<br />
I := 1;<br />
clrscr;<br />
Repeat<br />
str2 := Copy(text, 1 , 1);<br />
str1 := Copy(text, Length(text), 1);<br />
Delete(text, Length(text) , 1);<br />
If (str2 = str3) and (str1 = str4) then text := str1 + ' ' + text else text := str1 + text;<br />
GotoxY(20,12);<br />
Randomize;<br />
textcolor(random(16));<br />
write(text);<br />
delay(1500);<br />
clreol;<br />
until keypressed;<br />
Textcolor(white)<br />
end.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/lauf.pas [07.10.2001 00:43:35]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/sortiere.pas<br />
PROGRAM Sortieren_von_drei_Zahlen;<br />
USES crt;<br />
VAR a, b, c, h: Integer;<br />
BEGIN<br />
{PROGRAMMINFO}<br />
TextColor(white);<br />
clrscr;<br />
writeln('SORTIERUNGSPROGRAMM');<br />
writeln('Geben Sie drei ganze Zahlen e<strong>in</strong>!');<br />
{DATENABFRAGE}<br />
writeln;<br />
write('Erste Zahl: ');<br />
readln(a);<br />
write('Zweite Zahl: ');<br />
readln(b);<br />
write('Dritte Zahl: ');<br />
readln(c);<br />
writeln;<br />
{DATENVERARBEITUNG}<br />
IF a > b THEN<br />
BEGIN<br />
H := a; a := b; b := h;<br />
END;<br />
IF b > c THEN<br />
BEGIN<br />
h := b; b := c; c := h;<br />
END;<br />
IF a > b THEN<br />
BEGIN<br />
h := a; a := b; b := h;<br />
END;<br />
{ERGEBNISS AUSGEBEN}<br />
writeln('geordbet: ', a:7,b:7,c:7);<br />
readln<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/sortiere.pas [07.10.2001 00:43:41]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/mittelw.pas<br />
PROGRAM Anzahl_Summe_Mittel;<br />
USES crt;<br />
VAR<br />
Anzahl: Integer;<br />
Zahl, Summe, Mittel: Real;<br />
BEGIN<br />
Textcolor(White);<br />
Clrscr;<br />
Summe := 0;<br />
Anzahl := 0;<br />
Anzahl := 0;<br />
Write('1. Zahl: ');<br />
Readln(Zahl);<br />
WHILE Zahl 0 DO<br />
BEGIN<br />
Summe := Summe + Zahl;<br />
Anzahl := Anzahl + 1;<br />
Write(Anzahl, '. Zahl: ');<br />
Readln(Zahl);<br />
Mittel := Summe / Anzahl;<br />
END;<br />
Writeln('Anzahl: ', Anzahl);<br />
Writeln('Summe: ', Summe:4:2);<br />
Writeln('Mittelwert: ', Mittel:4:3);<br />
Readln;<br />
END.<br />
{Wenn Zahl ungleich 0 dann beg<strong>in</strong>e Schleife}<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/mittelw.pas [07.10.2001 00:43:49]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/z<strong>in</strong>srep.pas<br />
PROGRAM Z<strong>in</strong>senBerechnen;<br />
USES crt;<br />
VAR<br />
Kapital, Help,<br />
Z<strong>in</strong>ssatz, Z<strong>in</strong>sen: Real;<br />
BEGIN<br />
Clrscr;<br />
Write('Bitte gib das Kapital e<strong>in</strong>: ');<br />
Readln(Kapital);<br />
Help := Kapital / 100;<br />
Clrscr;<br />
Writeln('Jahres-Z<strong>in</strong>sberechnung f•r Kapital von DM: ', Kapital:10:2);<br />
Writeln;<br />
Z<strong>in</strong>ssatz := 6.4;<br />
REPEAT<br />
Z<strong>in</strong>ssatz := Z<strong>in</strong>ssatz + 0.1;<br />
Z<strong>in</strong>sen := Help + Z<strong>in</strong>ssatz;<br />
Writeln('Z<strong>in</strong>sen bei ', Z<strong>in</strong>ssatz:4:1, ': DM -->', Z<strong>in</strong>sen:10:2);<br />
UNTIL Z<strong>in</strong>ssatz > 7.4;<br />
GotoXY(1, 25);<br />
Write('Bitte [Return] dr•cken...');<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/z<strong>in</strong>srep.pas [07.10.2001 00:43:57]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/temp_01.pas<br />
PROGRAM temperatur;<br />
USES crt;<br />
VAR messw: ARRAY [1..24] OF real;<br />
m<strong>in</strong>, max, schwank, schnitt: real;<br />
PROCEDURE e<strong>in</strong>geb_messw;<br />
VAR<br />
i: Byte;<br />
BEGIN<br />
END;<br />
FOR i:= 1 TO 24 DO<br />
BEGIN<br />
write('Geben sie ihren ',i,'. Messwert e<strong>in</strong>: ');<br />
readln (messw [i]);<br />
END;<br />
PROCEDURE m<strong>in</strong>imum;<br />
VAR<br />
i: Byte;<br />
BEGIN<br />
END;<br />
m<strong>in</strong>:=messw[1];<br />
FOR i:= 2 TO 24 DO<br />
IF m<strong>in</strong> > messw[i] THEN m<strong>in</strong>:=messw[i];<br />
PROCEDURE maximum;<br />
VAR<br />
i: Byte;<br />
BEGIN<br />
END;<br />
max:=messw[1];<br />
FOR i:= 2 TO 24 DO<br />
IF max < messw[i] THEN max:=messw[i];<br />
PROCEDURE schwankung;<br />
BEGIN<br />
END;<br />
schwank:= max-m<strong>in</strong>;<br />
PROCEDURE durchschnitt;<br />
VAR<br />
i: Byte;<br />
BEGIN<br />
END;<br />
FOR i := 1 TO 24 DO schnitt := schnitt + messw[i];<br />
schnitt := schnitt / 24;<br />
PROCEDURE ausgabe;<br />
BEGIN<br />
writeln (' ');<br />
writeln ('Der Durchschnittswert betr„gt ',schnitt:3:2,' øC .'); {Warum drei<br />
Kommastellen? - Ge„ndert!}<br />
writeln ('Die ermittelte Temperaturschwankung betr„gt ',schwank:3:2,' øC .');<br />
writeln ('Das Maximum betr„gt ',max:3:2,' øC .');<br />
writeln ('Das M<strong>in</strong>imum betr„gt ',m<strong>in</strong>:3:2,' øC .');<br />
writeln (' ');<br />
writeln ('Danke f•r die Benutzung dieses Programmes. Weiter mit beliebiger Taste.');<br />
END;<br />
BEGIN<br />
clrscr;<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/temp_01.pas (1 of 2) [07.10.2001 00:44:06]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/temp_01.pas<br />
END.<br />
writeln ('Dies ist e<strong>in</strong> Programm zur Ermittlung von Temperaturschwankungen.');<br />
writeln ('Ausserdem werden M<strong>in</strong>i- bzw. Maximumwerte sowie Durchschnittswerte ermittelt.');<br />
writeln (' ');<br />
e<strong>in</strong>geb_messw;<br />
m<strong>in</strong>imum;<br />
maximum;<br />
schwankung;<br />
durchschnitt;<br />
ausgabe;<br />
readkey;<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/temp_01.pas (2 of 2) [07.10.2001 00:44:06]
Programmbeispiele<br />
Programmbeispiele - kaufmännische<br />
Jeder der gerade e<strong>in</strong>e Programmiersprache lernt, weis wie schwierig es<br />
am Anfang ist das gelernte Wissen anzuwenden. Deshalb denke ich das<br />
es das beste und auch E<strong>in</strong>fachste ist e<strong>in</strong>e Programmiersprache anhand<br />
von Beispielen zu lernen. Auch gerne als "Learn<strong>in</strong>g by Example"<br />
bezeichnet. Deshalb gibt es hier e<strong>in</strong>ige kle<strong>in</strong>e Turbo <strong>Pascal</strong> Programm<br />
die kaufmännische Berechnungen durchführen.<br />
Abschreib.pas<br />
Berechnet Abschreibungstabellen für die<br />
l<strong>in</strong>eare, degressive und komb<strong>in</strong>ierte<br />
Abschreibung.<br />
E<strong>in</strong>fache Beispiele<br />
erste Seite<br />
file:///E|/homepage/<strong>Pascal</strong>/programmbeispiele_kaufmann.htm [07.10.2001 00:44:29]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/abschreib.pas<br />
PROGRAM Afa;<br />
USES Crt;<br />
FUNCTION ShowItems: Char;<br />
Type TMenge = Set of Char;<br />
VAR Item: Char;<br />
Menge_Item: TMenge;<br />
BEGIN<br />
Menge_Item := ['1','2','3'];<br />
REPEAT<br />
Clrscr;<br />
GotoXY(28, 10);<br />
Writeln('Abschreibungsmethode:');<br />
GotoXY(28, 13);<br />
Writeln('(1) l<strong>in</strong>ear');<br />
GotoXY(28, 14);<br />
Writeln('(2) degressiv');<br />
GotoXY(28, 15);<br />
Writeln('(3) degressiv --> l<strong>in</strong>ear');<br />
GotoXY(28, 17);<br />
Write('Bitte w„hlen: ');<br />
Readln(Item);<br />
UNTIL Item IN Menge_Item;<br />
ShowItems := Item;<br />
END;<br />
PROCEDURE l<strong>in</strong>ear(nd: Byte; ak, satz: Real);<br />
VAR rbw, prozent: Real;<br />
I: Byte;<br />
BEGIN<br />
RBW := ak;<br />
Writeln;<br />
Writeln('Abschreibungsmethode : l<strong>in</strong>ear');<br />
Writeln('Anschaffungskosten : ', ak:0:2, ' DM');<br />
Writeln('Nutzungsdauer<br />
: ', nd, ' Jahre');<br />
Writeln('J„hrliche Abschreibung: ', satz:0:2 ,' DM');<br />
Writeln;<br />
FOR i := 1 TO nd DO<br />
BEGIN<br />
rbw := rbw-satz;<br />
Writeln(i,'. JAHR - AFA: ', satz:10:2,' DM - RBW: ', rbw:10:2,' DM');<br />
END;<br />
END;<br />
PROCEDURE degressiv(nd: Byte; ak, satz: Real);<br />
VAR rbw, afa: Real;<br />
I: Byte;<br />
BEGIN<br />
rbw := ak;<br />
Writeln;<br />
Writeln('Abschreibungsmethode : degressiv');<br />
Writeln('Anschaffungskosten : ', ak:0:2, ' DM');<br />
Writeln('Nutzungsdauer<br />
: ', nd, ' Jahre');<br />
Writeln;<br />
FOR i := 1 TO nd DO<br />
BEGIN<br />
afa := rbw * satz / 100;<br />
rbw := rbw - afa;<br />
Writeln(i,'. JAHR - AFA: ', afa:10:2,' DM - RBW: ', rbw:10:2,' DM');<br />
END;<br />
END;<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/abschreib.pas (1 of 2) [07.10.2001 00:44:51]
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/abschreib.pas<br />
PROCEDURE degr_l<strong>in</strong>(nd: Byte; ak, satz: Real);<br />
VAR rbw, afa, ujahr, l_satz: Real;<br />
I: Byte;<br />
BEGIN<br />
rbw := ak;<br />
ujahr := round(nd-(100/satz)+1);<br />
Writeln;<br />
Writeln('Abschreibungsmethode : degressiv --> l<strong>in</strong>ear');<br />
Writeln('Anschaffungskosten : ', ak:0:2, ' DM');<br />
Writeln('Nutzungsdauer<br />
: ', nd, ' Jahre');<br />
Writeln('šbergangsjahr<br />
: ', ujahr:0:0, '. Jahr');<br />
Writeln;<br />
FOR i := 1 TO nd DO<br />
BEGIN<br />
IF i < ujahr THEN afa := rbw * satz / 100 ELSE<br />
BEGIN<br />
IF i=ujahr then l_satz := rbw/(nd-(i-1));<br />
afa := l_satz;<br />
END;<br />
rbw := rbw - afa;<br />
Writeln(i,'. JAHR - AFA: ', afa:10:2,' DM - RBW: ', rbw:10:2,' DM');<br />
END;<br />
END;<br />
VAR Item: Char;<br />
AK, satz: Real;<br />
nutzdauer: Byte;<br />
BEGIN<br />
Item := ShowItems;<br />
Clrscr;<br />
Write('Geben Sie die Nutzungsdauer e<strong>in</strong>: ');<br />
Readln(nutzdauer);<br />
Write('Geben Sie die Anschaffungskosten e<strong>in</strong>: ');<br />
Readln(ak);<br />
Clrscr;<br />
CASE Item OF<br />
'1': BEGIN<br />
satz := ak / nutzdauer;<br />
l<strong>in</strong>ear(nutzdauer, ak, satz);<br />
END;<br />
'2': BEGIN<br />
satz := (100 / nutzdauer) * 3 ;<br />
IF satz>30 then satz := 30;<br />
degressiv(nutzdauer, ak, satz);<br />
END;<br />
'3': BEGIN<br />
satz := (100 / nutzdauer) * 3 ;<br />
IF satz>30 then satz := 30;<br />
degr_l<strong>in</strong>(nutzdauer, ak, satz);<br />
END;<br />
END;<br />
Writeln;<br />
Writeln('Bitte [ENTER] dr•cken ...');<br />
Readln;<br />
END.<br />
file:///E|/homepage/<strong>Pascal</strong>/pascalDateien/abschreib.pas (2 of 2) [07.10.2001 00:44:51]