21.11.2013 Aufrufe

Programmieren in Pascal

Programmieren in Pascal

Programmieren in Pascal

MEHR ANZEIGEN
WENIGER ANZEIGEN

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]

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!