Pascal - Kurzanleitung

Pascal ist eine universelle Hochsprache, die ursprünglich von Niklaus Wirth in den frühen 1970er Jahren entwickelt wurde. Es wurde entwickelt, um Programmieren als systematische Disziplin zu unterrichten und zuverlässige und effiziente Programme zu entwickeln.

Pascal ist eine auf Algol basierende Sprache und enthält viele Konstrukte von Algol. Algol 60 ist eine Teilmenge von Pascal. Pascal bietet verschiedene Datentypen und Programmierstrukturen. Es ist leicht, die Pascal-Programme zu verstehen und zu pflegen.

Pascal erfreut sich im Lehr- und Wissenschaftsbereich aus verschiedenen Gründen wachsender Beliebtheit:

  • Leicht zu lernen.
  • Strukturierte Sprache.
  • Es erzeugt transparente, effiziente und zuverlässige Programme.
  • Es kann auf einer Vielzahl von Computerplattformen kompiliert werden.

Merkmale der Pascal-Sprache

Pascal hat die folgenden Funktionen -

  • Pascal ist eine stark typisierte Sprache.
  • Es bietet eine umfassende Fehlerprüfung.
  • Es bietet verschiedene Datentypen wie Arrays, Datensätze, Dateien und Sets.
  • Es bietet eine Vielzahl von Programmierstrukturen.
  • Es unterstützt die strukturierte Programmierung durch Funktionen und Prozeduren.
  • Es unterstützt die objektorientierte Programmierung.

Fakten über Pascal

  • Die Pascal-Sprache wurde nach Blaise Pascal benannt, französischer Mathematiker und Pionier in der Computerentwicklung.

  • Niklaus Wirth schloss 1970 die Entwicklung der ursprünglichen Programmiersprache Pascal ab.

  • Pascal basiert auf dem blockstrukturierten Stil der Programmiersprache Algol.

  • Pascal wurde als eine Sprache entwickelt, die für den Programmierunterricht als systematische Disziplin geeignet ist und deren Implementierung sowohl zuverlässig als auch effizient sein kann.

  • Der ISO 7185 Pascal Standard wurde ursprünglich 1983 veröffentlicht.

  • Pascal war die primäre Hochsprache, die für die Entwicklung in Apple Lisa und in den frühen Jahren des Mac verwendet wurde.

  • 1986 veröffentlichte Apple Computer die erste Object Pascal-Implementierung, und 1993 veröffentlichte das Pascal Standards Committee eine objektorientierte Erweiterung für Pascal.

Warum Pascal verwenden?

Mit Pascal können die Programmierer komplexe strukturierte Datentypen definieren und dynamische und rekursive Datenstrukturen wie Listen, Bäume und Diagramme erstellen. Pascal bietet Funktionen wie Datensätze, Aufzählungen, Unterordnungen, dynamisch zugewiesene Variablen mit zugehörigen Zeigern und Mengen.

Pascal ermöglicht verschachtelte Prozedurdefinitionen in jeder Tiefe. Dies bietet wirklich eine großartige Programmierumgebung für das Erlernen des Programmierens als systematische Disziplin, die auf den grundlegenden Konzepten basiert.

Zu den erstaunlichsten Implementierungen von Pascal gehören -

  • Skype
  • Total Commander
  • TeX
  • Macromedia Captivate
  • Apple Lisa
  • Verschiedene PC-Spiele
  • Eingebettete Systeme

Für den allgemeinen Gebrauch stehen mehrere Pascal-Compiler und -Interpreter zur Verfügung. Unter diesen sind -

  • Turbo Pascal - bietet eine IDE und einen Compiler zum Ausführen von Pascal-Programmen unter CP / M, CP / M-86, DOS, Windows und Macintosh.

  • Delphi- bietet Compiler zum Ausführen von Object Pascal und generiert nativen Code für 32- und 64-Bit-Windows-Betriebssysteme sowie 32-Bit-Mac OS X und iOS. Embarcadero plant, Unterstützung für das Linux- und Android-Betriebssystem zu entwickeln.

  • Free Pascal- Es ist ein kostenloser Compiler zum Ausführen von Pascal- und Object Pascal-Programmen. Free Pascal Compiler ist ein 32- und 64-Bit-Turbo Pascal- und Delphi-kompatibler Pascal-Compiler für Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS und verschiedene andere Plattformen.

  • Turbo51 - Es ist ein kostenloser Pascal-Compiler für die 8051-Familie von Mikrocontrollern mit Turbo Pascal 7-Syntax.

  • Oxygene - Es ist ein Object Pascal-Compiler für die .NET- und Mono-Plattformen.

  • GNU Pascal (GPC) - Es ist ein Pascal-Compiler, der aus einem Front-End der GNU Compiler Collection besteht.

In diesen Tutorials werden wir Free Pascal verwenden. Sie können Free Pascal für Ihr Betriebssystem über den folgenden Link herunterladen : Free Pascal herunterladen

Installation von Free Pascal unter Linux

Die Linux-Distribution von Free Pascal gibt es in drei Formen:

  • ein tar.gz Version, auch als separate Dateien verfügbar.

  • ein .rpm Version (Red Hat Package Manager).

  • ein .deb (Debian) Version.

Installationscode für die RPM-Version ::

rpm -i fpc-X.Y.Z-N.ARCH.rpm

Dabei ist XYZ die Versionsnummer der RPM-Datei und ARCH eine der unterstützten Architekturen (i386, x86_64 usw.).

Installationscode für die Debian-Version (wie Ubuntu) -

dpkg -i fpc-XXX.deb

Wobei XXX die Versionsnummer der .deb-Datei ist.

Weitere Informationen finden Sie unter: Kostenloses Pascal-Installationshandbuch

Installieren von Free Pascal auf einem Mac

Wenn Sie Mac OS X verwenden, können Sie Free Pascal am einfachsten verwenden, indem Sie die Xcode-Entwicklungsumgebung von der Apple-Website herunterladen und die einfachen Installationsanweisungen befolgen. Sobald Sie Xcode eingerichtet haben, können Sie den Free Pascal-Compiler verwenden.

Installieren von Free Pascal unter Windows

Für Windows laden Sie das Windows-Installationsprogramm setup.exe herunter. Dies ist ein übliches Installationsprogramm. Für die Installation müssen Sie die folgenden Schritte ausführen:

  • Wählen Sie ein Verzeichnis.

  • Wählen Sie Teile des Pakets aus, die Sie installieren möchten.

  • Optional können Sie die Erweiterungen .pp oder .pas der Free Pascal IDE zuordnen.

Weitere Informationen finden Sie unter: Kostenloses Pascal-Installationshandbuch

Texteditor

Dies wird verwendet, um Ihr Programm einzugeben. Beispiele für wenige Editoren sind Windows Notepad, OS Edit-Befehl, Brief, Epsilon, EMACS und vim oder vi.

Name und Version des Texteditors können auf verschiedenen Betriebssystemen variieren. Beispielsweise wird Notepad unter Windows verwendet, und vim oder vi können sowohl unter Windows als auch unter Linux oder UNIX verwendet werden.

Die Dateien, die Sie mit Ihrem Editor erstellen, werden als Quelldateien bezeichnet und enthalten Programmquellcode. Die Quelldateien für Pascal-Programme werden normalerweise mit der Erweiterung benannt.pas.

Stellen Sie vor Beginn der Programmierung sicher, dass Sie über einen Texteditor verfügen und über genügend Erfahrung verfügen, um ein Computerprogramm zu schreiben, in einer Datei zu speichern, zu kompilieren und schließlich auszuführen.

Bevor wir die Grundbausteine ​​der Programmiersprache Pascal studieren, wollen wir uns eine minimale Pascal-Programmstruktur ansehen, damit wir sie in den kommenden Kapiteln als Referenz verwenden können.

Pascal Programmstruktur

Ein Pascal-Programm besteht im Wesentlichen aus folgenden Teilen:

  • Programmname
  • Verwendet den Befehl
  • Typdeklarationen
  • Ständige Erklärungen
  • Variablendeklarationen
  • Funktionserklärungen
  • Verfahrenserklärungen
  • Hauptprogrammblock
  • Anweisungen und Ausdrücke in jedem Block
  • Comments

Jedes Pascal-Programm hat im Allgemeinen eine Überschriftenanweisung, eine Deklaration und einen Ausführungsteil genau in dieser Reihenfolge. Das folgende Format zeigt die grundlegende Syntax für ein Pascal-Programm -

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Pascal Hallo Welt Beispiel

Es folgt ein einfacher Pascal-Code, der die Wörter "Hallo Welt!" - -

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

Dies führt zu folgendem Ergebnis:

Hello, World!

Schauen wir uns verschiedene Teile des obigen Programms an -

  • Die erste Zeile des Programms program HelloWorld; gibt den Namen des Programms an.

  • Die zweite Zeile des Programms uses crt; ist ein Präprozessorbefehl, der den Compiler anweist, die CRT-Einheit einzuschließen, bevor er zur eigentlichen Kompilierung übergeht.

  • Die nächsten Zeilen in den Anweisungen begin und end sind der Hauptprogrammblock. Jeder Block in Pascal ist in a eingeschlossenbegin Aussage und ein endErklärung. Auf die end-Anweisung, die das Ende des Hauptprogramms angibt, folgt jedoch ein Punkt (.) Anstelle eines Semikolons (;).

  • Das begin In der Anweisung des Hauptprogrammblocks beginnt die Programmausführung.

  • Die Linien innerhalb (*...*) wird vom Compiler ignoriert und es wurde hinzugefügt, um a hinzuzufügen comment im Programm.

  • Die Aussage writeln('Hello, World!');verwendet die in Pascal verfügbare Schreibfunktion, die die Meldung "Hallo Welt!" auf dem Bildschirm angezeigt werden.

  • Die Aussage readkey;Ermöglicht das Anhalten der Anzeige, bis der Benutzer eine Taste drückt. Es ist Teil der CRT-Einheit. Eine Einheit ist wie eine Bibliothek in Pascal.

  • Die letzte Aussage end. beendet dein Programm.

Pascal-Programm kompilieren und ausführen

  • Öffnen Sie einen Texteditor und fügen Sie den oben genannten Code hinzu.

  • Speichern Sie die Datei als hello.pas

  • Öffnen Sie eine Eingabeaufforderung und wechseln Sie in das Verzeichnis, in dem Sie die Datei gespeichert haben.

  • Geben Sie an der Eingabeaufforderung fpc hello.pas ein und drücken Sie die Eingabetaste, um Ihren Code zu kompilieren.

  • Wenn Ihr Code keine Fehler enthält, führt Sie die Eingabeaufforderung zur nächsten Zeile und generiert sie hello ausführbare Datei und hello.o Objektdatei.

  • Geben Sie nun ein hello an der Eingabeaufforderung, um Ihr Programm auszuführen.

  • Sie können "Hello World" auf dem Bildschirm sehen und das Programm wartet, bis Sie eine beliebige Taste drücken.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

Stellen Sie sicher, dass der Pascal-Compiler frei ist fpc befindet sich in Ihrem Pfad und Sie führen es in dem Verzeichnis aus, das die Quelldatei hello.pas enthält.

Sie haben eine Grundstruktur des Pascal-Programms gesehen, sodass andere Grundbausteine ​​der Pascal-Programmiersprache leicht zu verstehen sind.

Variablen

Eine Variablendefinition wird in einen Block eingefügt, der mit a beginnt var Schlüsselwort, gefolgt von Definitionen der Variablen wie folgt:

var
A_Variable, B_Variable ... : Variable_Type;

Pascal-Variablen werden außerhalb des Code-Körpers der Funktion deklariert, was bedeutet, dass sie nicht innerhalb der deklariert werden begin und end Paare, aber sie werden nach der Definition der Prozedur / Funktion und vor dem deklariert beginStichwort. Für globale Variablen werden sie nach dem Programmkopf definiert.

Funktionen / Prozeduren

In Pascal, a procedure ist ein Satz von auszuführenden Anweisungen ohne Rückgabewert und a functionist eine Prozedur mit einem Rückgabewert. Die Definition der Funktion / Prozeduren lautet wie folgt:

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

Bemerkungen

Die mehrzeiligen Kommentare sind in geschweiften Klammern und Sternchen als (* ... *) eingeschlossen. Pascal erlaubt einzeilige Kommentare in geschweiften Klammern {...}.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

Groß- und Kleinschreibung

Pascal ist eine Sprache ohne Groß- und Kleinschreibung, dh Sie können in beiden Fällen Ihre Variablen, Funktionen und Prozeduren schreiben. Wie die Variablen A_Variable haben a_variable und A_VARIABLE in Pascal dieselbe Bedeutung.

Pascal-Anweisungen

Pascal-Programme bestehen aus Anweisungen. Jede Anweisung gibt einen bestimmten Job des Programms an. Diese Jobs können Deklaration, Zuweisung, Lesen von Daten, Schreiben von Daten, Treffen logischer Entscheidungen, Übertragen der Programmflusskontrolle usw. sein.

Zum Beispiel -

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

Reservierte Wörter in Pascal

Die Anweisungen in Pascal bestehen aus bestimmten Pascal-Wörtern, die als reservierte Wörter bezeichnet werden. Zum Beispiel sind die Wörter, Programm, Eingabe, Ausgabe, var, real, begin, readline, writeline und end alle reservierte Wörter.

Im Folgenden finden Sie eine Liste der in Pascal verfügbaren reservierten Wörter.

und Array Start Fall const
div tun bis zu sonst Ende
Datei zum Funktion gehe zu wenn
im Etikette mod Null nicht
von oder verpackt Verfahren Programm
Aufzeichnung wiederholen einstellen dann zu
Art bis um var während mit

Zeichensatz und Bezeichner in Pascal

Der Pascal-Zeichensatz besteht aus -

  • Alle Großbuchstaben (AZ)

  • Alle Kleinbuchstaben (az)

  • Alle Ziffern (0-9)

  • Sonderzeichen - + * /: = ,. ;. () [] = {} `Leerraum

Die Entitäten in einem Pascal-Programm wie Variablen und Konstanten, Typen, Funktionen, Prozeduren und Datensätze usw. haben einen Namen oder eine Kennung. Ein Bezeichner ist eine Folge von Buchstaben und Ziffern, die mit einem Buchstaben beginnen. Spezielle Symbole und Leerzeichen dürfen nicht in einer Kennung verwendet werden.

Datentypen einer Entität geben die Bedeutung, Einschränkungen, möglichen Werte, Operationen, Funktionen und den damit verbundenen Speichermodus an.

Ganzzahlige, reelle, boolesche und Zeichentypen werden als Standarddatentypen bezeichnet. Datentypen können in skalare, Zeiger- und strukturierte Datentypen unterteilt werden. Beispiele für skalare Datentypen sind Integer, Real, Boolean, Character, Subrange und Enumerated. Strukturierte Datentypen bestehen aus den Skalartypen. Zum Beispiel Arrays, Datensätze, Dateien und Sets. Wir werden die Zeigerdatentypen später diskutieren.

Pascal-Datentypen

Pascal-Datentypen können im folgenden Diagramm wie folgt zusammengefasst werden:

Typdeklarationen

Die Typdeklaration wird verwendet, um den Datentyp eines Bezeichners zu deklarieren. Die Syntax der Typdeklaration lautet -

type-identifier-1, type-identfier-2 = type-specifier;

In der folgenden Deklaration werden beispielsweise die Variablen Tage und Alter als Ganzzahltyp definiert, Ja und Wahr als Boolescher Typ, Name und Stadt als Zeichenfolgentyp, Gebühren und Ausgaben als Realtyp.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Ganzzahlige Typen

Die folgende Tabelle enthält Details zu Standard-Integer-Typen mit ihren in Object Pascal verwendeten Speichergrößen und Wertebereichen -

Art Minimum Maximal Format
Ganze Zahl -2147483648 2147483647 signiert 32-Bit
Kardinal 0 4294967295 vorzeichenloses 32-Bit
Shortint -128 127 8-Bit signiert
Smallint -32768 32767 16-Bit signiert
Longint -2147483648 2147483647 signiert 32-Bit
Int64 -2 ^ 63 2 ^ 63 - 1 signiert 64-Bit
Byte 0 255 vorzeichenloses 8-Bit
Wort 0 65535 vorzeichenloses 16-Bit
Langwort 0 4294967295 vorzeichenloses 32-Bit

Konstanten

Die Verwendung von Konstanten macht ein Programm besser lesbar und hilft, spezielle Mengen am Anfang des Programms an einer Stelle zu halten. Pascal erlaubt numerische, logische, String- und Zeichenkonstanten . Konstanten können im Deklarationsteil des Programms durch Angabe von deklariert werdenconst Erklärung.

Die Syntax der konstanten Typdeklaration lautet wie folgt:

const
Identifier = contant_value;

Es folgen einige Beispiele für konstante Deklarationen -

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

Alle konstanten Deklarationen müssen vor der Variablendeklaration angegeben werden.

Aufzählungsarten

Aufzählungsdatentypen sind benutzerdefinierte Datentypen. Sie ermöglichen die Angabe von Werten in einer Liste. Für den aufgezählten Datentyp sind nur Zuweisungsoperatoren und Vergleichsoperatoren zulässig. Aufgezählte Datentypen können wie folgt deklariert werden:

type
enum-identifier = (item1, item2, item3, ... )

Im Folgenden finden Sie einige Beispiele für aufgezählte Typdeklarationen.

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

Die Reihenfolge, in der die Elemente in der Domäne eines Aufzählungstyps aufgeführt sind, definiert die Reihenfolge der Elemente. Beispielsweise kommt im aufgezählten Typ SOMMER April vor Mai, Mai vor Juni und so weiter. Die Domäne der aufgezählten Typbezeichner darf nicht aus numerischen oder Zeichenkonstanten bestehen.

Unterbereichstypen

Mit Unterbereichstypen kann eine Variable Werte annehmen, die innerhalb eines bestimmten Bereichs liegen. Wenn beispielsweise das Alter der Wähler zwischen 18 und 100 Jahren liegen sollte, könnte eine Variable namens Alter wie folgt deklariert werden:

var
age: 18 ... 100;

Wir werden uns die Variablendeklaration im nächsten Abschnitt genauer ansehen. Sie können einen Unterbereichstyp auch mithilfe der Typdeklaration definieren. Die Syntax zum Deklarieren eines Unterbereichstyps lautet wie folgt:

type
subrange-identifier = lower-limit ... upper-limit;

Im Folgenden finden Sie einige Beispiele für Deklarationen von Subbereichstypen.

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

Unterbereichstypen können aus einer Teilmenge eines bereits definierten Aufzählungstyps erstellt werden. Beispiel:

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

Eine Variable ist nichts anderes als ein Name für einen Speicherbereich, den unsere Programme bearbeiten können. Jede Variable in Pascal hat einen bestimmten Typ, der die Größe und das Layout des Speichers der Variablen bestimmt. den Wertebereich, der in diesem Speicher gespeichert werden kann; und die Menge von Operationen, die auf die Variable angewendet werden können.

Der Name einer Variablen kann aus Buchstaben, Ziffern und dem Unterstrich bestehen. Es muss entweder mit einem Buchstaben oder einem Unterstrich beginnen. Pascal istnot case-sensitiveDaher bedeuten Groß- und Kleinbuchstaben hier dasselbe. Basierend auf den im vorherigen Kapitel erläuterten Grundtypen gibt es folgende grundlegende Variablentypen:

Grundvariablen in Pascal

Sr.Nr. Typ & Beschreibung
1

Character

Normalerweise ein einzelnes Oktett (ein Byte). Dies ist ein ganzzahliger Typ.

2

Integer

Die natürlichste Ganzzahlgröße für die Maschine.

3

Real

Ein Gleitkommawert mit einfacher Genauigkeit.

4

Boolean

Gibt wahre oder falsche logische Werte an. Dies ist auch ein ganzzahliger Typ.

5

Enumerated

Gibt eine benutzerdefinierte Liste an.

6

Subrange

Stellt Variablen dar, deren Werte innerhalb eines Bereichs liegen.

7

String

Speichert eine Reihe von Zeichen.

Die Programmiersprache Pascal ermöglicht auch das Definieren verschiedener anderer Variablentypen, die in den folgenden Kapiteln behandelt werden, z. B. Zeiger, Array, Datensätze, Sätze und Dateien usw. In diesem Kapitel werden nur grundlegende Variablentypen untersucht.

Variable Deklaration in Pascal

Alle Variablen müssen deklariert werden, bevor wir sie im Pascal-Programm verwenden. Auf alle Variablendeklarationen folgt das Schlüsselwort var . Eine Deklaration gibt eine Liste von Variablen an, gefolgt von einem Doppelpunkt (:) und dem Typ. Die Syntax der Variablendeklaration lautet -

var
variable_list : type;

Hier muss type ein gültiger Pascal-Datentyp sein, einschließlich Zeichen, Ganzzahl, Real, Boolescher Wert oder eines benutzerdefinierten Datentyps usw., und variable_list kann aus einem oder mehreren durch Kommas getrennten Bezeichnernamen bestehen. Einige gültige Variablendeklarationen werden hier angezeigt -

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

Im vorherigen Tutorial haben wir besprochen, dass Pascal das Deklarieren eines Typs erlaubt. Ein Typ kann durch einen Namen oder eine Kennung identifiziert werden. Dieser Typ kann verwendet werden, um Variablen dieses Typs zu definieren. Zum Beispiel,

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Jetzt können die so definierten Typen in Variablendeklarationen verwendet werden -

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

Bitte beachten Sie den Unterschied zwischen Typ - Deklaration und var - Deklaration. Die Typdeklaration gibt die Kategorie oder Klasse der Typen wie Ganzzahl, Real usw. an, während die Variablenspezifikation den Wertetyp angibt, den eine Variable annehmen kann. Sie können vergleichen Typ Deklaration in Pascal mit typedef in C. Am wichtigsten ist , der Variablenname bezieht sich auf den Speicherplatz in dem der Wert der Variablen wird gespeichert werden. Dies ist bei der Typdeklaration nicht der Fall.

Variable Initialisierung in Pascal

Variablen wird ein Wert mit einem Doppelpunkt und dem Gleichheitszeichen zugewiesen, gefolgt von einem konstanten Ausdruck. Die allgemeine Form der Wertzuweisung lautet -

variable_name := value;

Standardmäßig werden Variablen in Pascal nicht mit Null initialisiert. Sie können Müllwerte enthalten. Es ist daher besser, Variablen in einem Programm zu initialisieren. Variablen können in ihrer Deklaration initialisiert (mit einem Anfangswert versehen) werden. Der Initialisierung folgt dasvar Schlüsselwort und die Syntax der Initialisierung lautet wie folgt:

var
variable_name : type = value;

Einige Beispiele sind -

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

Schauen wir uns ein Beispiel an, das verschiedene Arten von Variablen verwendet, die bisher diskutiert wurden -

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

Aufgezählte Variablen

Sie haben gesehen, wie einfache Variablentypen wie Integer, Real und Boolean verwendet werden. Lassen Sie uns nun Variablen vom Aufzählungstyp sehen, die definiert werden können als -

var
var1, var2, ...  : enum-identifier;

Wenn Sie einen Aufzählungstyp deklariert haben, können Sie Variablen dieses Typs deklarieren. Zum Beispiel,

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

Das folgende Beispiel veranschaulicht das Konzept -

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Which drink do you want?
You can drink limejuice

Variablen unterordnen

Unterbereichsvariablen werden als - deklariert

var
subrange-name : lowerlim ... uperlim;

Beispiele für Unterbereichsvariablen sind -

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

Das folgende Programm veranschaulicht das Konzept -

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

Eine Konstante ist eine Entität, die während der Programmausführung unverändert bleibt. Mit Pascal können nur Konstanten der folgenden Typen deklariert werden:

  • Ordinaltypen
  • Typen einstellen
  • Zeigertypen (aber der einzige zulässige Wert ist Null).
  • Echte Typen
  • Char
  • String

Konstanten deklarieren

Die Syntax zum Deklarieren von Konstanten lautet wie folgt:

const
identifier = constant_value;

Die folgende Tabelle enthält Beispiele für einige gültige Konstantendeklarationen.

Real type constant

Sr.Nr. Konstanter Typ & Beispiele
1

Ordinal(Integer)type constant

valid_age = 21;

2

Set type constant

Vokale = Menge von (A, E, I, O, U);

3

Pointer type constant

P = NIL;

4

e = 2,7182818;

Velocity_light = 3.0E + 10;

5

Character type constant

Operator = '+';

6

String type constant

Präsident = 'Johnny Depp';

Das folgende Beispiel veranschaulicht das Konzept -

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter the radius of the circle
23
The circumference of the circle is 144.51

Beachten Sie die Formatierung in der Ausgabeanweisung des Programms. Die Variable c ist mit der Gesamtzahl der Ziffern 7 und 2 nach dem Dezimalzeichen zu formatieren. Pascal erlaubt eine solche Ausgabeformatierung mit den numerischen Variablen.

Ein Operator ist ein Symbol, das den Compiler anweist, bestimmte mathematische oder logische Manipulationen durchzuführen. Pascal erlaubt die folgenden Arten von Operatoren:

  • Rechenzeichen
  • Vergleichsoperatoren
  • boolesche Operatoren
  • Bitoperatoren
  • Operatoren festlegen
  • String-Operatoren

Lassen Sie uns die arithmetischen, relationalen, booleschen und Bitoperatoren einzeln diskutieren. Wir werden die Set-Operatoren und String-Operationen später diskutieren.

Rechenzeichen

Die folgende Tabelle zeigt alle von Pascal unterstützten arithmetischen Operatoren. Variable annehmenA hält 10 und variabel B hält 20, dann -

Beispiele anzeigen

Operator Beschreibung Beispiel
+ Fügt zwei Operanden hinzu A + B ergibt 30
- - Subtrahiert den zweiten Operanden vom ersten A - B ergibt -10
* * Multipliziert beide Operanden A * B ergibt 200
/. Teilt den Zähler durch den Nenner B / A ergibt 2
%. Modul Operator und Rest nach einer ganzzahligen Division B% A ergibt 0

Vergleichsoperatoren

Die folgende Tabelle zeigt alle von Pascal unterstützten Vergleichsoperatoren. Variable annehmenA hält 10 und variabel B hält 20, dann -

Beispiele anzeigen

Operator Beschreibung Beispiel
= Überprüft, ob die Werte von zwei Operanden gleich sind oder nicht. Wenn ja, wird die Bedingung wahr. (A = B) ist nicht wahr.
<> Überprüft, ob die Werte von zwei Operanden gleich sind oder nicht. Wenn die Werte nicht gleich sind, wird die Bedingung wahr. (A B) ist wahr.
> Überprüft, ob der Wert des linken Operanden größer als der Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A> B) ist nicht wahr.
< Überprüft, ob der Wert des linken Operanden kleiner als der Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A <B) ist wahr.
> = Überprüft, ob der Wert des linken Operanden größer oder gleich dem Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A> = B) ist nicht wahr.
<= Überprüft, ob der Wert des linken Operanden kleiner oder gleich dem Wert des rechten Operanden ist. Wenn ja, wird die Bedingung wahr. (A <= B) ist wahr.

Boolesche Operatoren

Die folgende Tabelle zeigt alle von der Pascal-Sprache unterstützten Booleschen Operatoren. Alle diese Operatoren arbeiten mit booleschen Operanden und erzeugen boolesche Ergebnisse. Variable annehmenA gilt wahr und variabel B hält falsch, dann -

Beispiele anzeigen

Operator Beschreibung Beispiel
und Wird als boolescher AND-Operator bezeichnet. Wenn beide Operanden wahr sind, wird die Bedingung wahr. (A und B) ist falsch.
und dann Es ähnelt dem AND-Operator, garantiert jedoch die Reihenfolge, in der der Compiler den logischen Ausdruck auswertet. Links nach rechts und die rechten Operanden werden nur bei Bedarf ausgewertet. (A und dann B) ist falsch.
oder Wird als boolescher ODER-Operator bezeichnet. Wenn einer der beiden Operanden wahr ist, wird die Bedingung wahr. (A oder B) ist wahr.
oder aber Es ähnelt dem Booleschen ODER, garantiert jedoch die Reihenfolge, in der der Compiler den logischen Ausdruck auswertet. Links nach rechts und die rechten Operanden werden nur bei Bedarf ausgewertet. (A oder B) ist wahr.
nicht Wird als boolescher NOT-Operator bezeichnet. Wird verwendet, um den logischen Zustand seines Operanden umzukehren. Wenn eine Bedingung wahr ist, macht der Operator Logical NOT sie falsch. nicht (A und B) ist wahr.

Bitoperatoren

Bitweise Operatoren arbeiten an Bits und führen eine bitweise Operation durch. Alle diese Operatoren arbeiten mit ganzzahligen Operanden und erzeugen ganzzahlige Ergebnisse. Die Wahrheitstabelle für bitweise und (&), bitweise oder (|) und bitweise nicht (~) lautet wie folgt:

p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

Angenommen, A = 60; und B = 13; jetzt im Binärformat werden sie wie folgt sein -

A = 0011 1100

B = 0000 1101

-----------------

A & B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Die von Pascal unterstützten bitweisen Operatoren sind in der folgenden Tabelle aufgeführt. Angenommen, Variable A hält 60 und Variable B hält 13, dann:

Beispiele anzeigen

Operator Beschreibung Beispiel
& Der binäre UND-Operator kopiert ein Bit in das Ergebnis, wenn es in beiden Operanden vorhanden ist. (A & B) ergibt 12, was 0000 1100 ist
| Der binäre ODER-Operator kopiert ein Bit, wenn es in einem der Operanden vorhanden ist. (A | B) ergibt 61, was 0011 1101 ist
! Der binäre ODER-Operator kopiert ein Bit, wenn es in einem der Operanden vorhanden ist. Es ist dasselbe wie | Operator. (A! B) ergibt 61, was 0011 1101 ist
~ Der Komplementoperator für binäre Einsen ist unär und bewirkt das Umdrehen von Bits. (~ A) ergibt -61, was aufgrund einer vorzeichenbehafteten Binärzahl 1100 0011 in 2er-Komplementform ist.
<< Binärer Linksschaltoperator. Der Wert der linken Operanden wird um die Anzahl der vom rechten Operanden angegebenen Bits nach links verschoben. Ein << 2 ergibt 240, was 1111 0000 ist
>> Binärer Rechtsschieber. Der Wert der linken Operanden wird um die Anzahl der vom rechten Operanden angegebenen Bits nach rechts verschoben. Eine >> 2 ergibt 15, was 0000 1111 ist

Bitte beachten Sie, dass sich verschiedene Implementierungen von Pascal in bitweisen Operatoren unterscheiden. Free Pascal, der hier verwendete Compiler, unterstützt jedoch die folgenden bitweisen Operatoren:

Betreiber Operationen
nicht Bitweise NICHT
und Bitweises UND
oder Bitweises ODER
xor Bitweises exklusives ODER
shl Bitweise nach links verschieben
shr Bitweise nach rechts verschieben
<< Bitweise nach links verschieben
>> Bitweise nach rechts verschieben

Vorrang der Operatoren in Pascal

Die Operatorrangfolge bestimmt die Gruppierung von Begriffen in einem Ausdruck. Dies wirkt sich darauf aus, wie ein Ausdruck ausgewertet wird. Bestimmte Operatoren haben eine höhere Priorität als andere. Beispielsweise hat der Multiplikationsoperator eine höhere Priorität als der Additionsoperator.

Zum Beispiel x = 7 + 3 * 2; Hier wird x 13 zugewiesen, nicht 20, da der Operator * eine höhere Priorität als + hat. Daher wird er zuerst mit 3 * 2 multipliziert und dann zu 7 addiert.

Hier werden Operatoren mit der höchsten Priorität oben in der Tabelle angezeigt, Operatoren mit der niedrigsten Priorität unten. Innerhalb eines Ausdrucks werden zuerst Operatoren mit höherer Priorität ausgewertet.

Beispiele anzeigen

Operator Vorrang
~ nicht Höchste
*, /, div, mod und, &
|,!, +, - oder,
=, <>, <, <=,>,> =, in
oder sonst und dann Am niedrigsten

Entscheidungsstrukturen erfordern, dass der Programmierer eine oder mehrere Bedingungen angibt, die vom Programm bewertet oder getestet werden sollen, zusammen mit einer Anweisung oder Anweisungen, die ausgeführt werden sollen, wenn die Bedingung als wahr bestimmt wird, und optional anderen Anweisungen, die ausgeführt werden sollen, wenn die Bedingung ausgeführt wird wird als falsch bestimmt.

Es folgt die allgemeine Form einer typischen Entscheidungsstruktur, die in den meisten Programmiersprachen zu finden ist:

Die Programmiersprache Pascal bietet die folgenden Arten von Entscheidungsaussagen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

Sr.Nr. Aussage & Beschreibung
1 if - dann Aussage

Ein if - then statement besteht aus einem booleschen Ausdruck, gefolgt von einer oder mehreren Anweisungen.

2 Wenn-dann-sonst-Anweisung

Ein if - then statement kann von einem optionalen gefolgt werden else statement, wird ausgeführt, wenn der boolesche Ausdruck false ist.

3 verschachtelte if-Anweisungen

Sie können eine verwenden if oder else if Aussage in einem anderen if oder else if Aussage (n).

4 case Anweisung

EIN case Mit der Anweisung kann eine Variable auf Gleichheit mit einer Liste von Werten getestet werden.

5 case - else-Anweisung

Es ist ähnlich wie beim if-then-else Erklärung. Hier einelse Begriff folgt dem case statement.

6 verschachtelte case-Anweisungen

Sie können eine verwenden case Aussage in einem anderen case Aussage (n).

Es kann vorkommen, dass Sie einen Codeblock mehrmals ausführen müssen. Im Allgemeinen werden Anweisungen nacheinander ausgeführt: Die erste Anweisung in einer Funktion wird zuerst ausgeführt, gefolgt von der zweiten usw.

Programmiersprachen bieten verschiedene Steuerungsstrukturen, die kompliziertere Ausführungspfade ermöglichen.

Mit einer Schleifenanweisung können wir eine Anweisung oder eine Gruppe von Anweisungen mehrmals ausführen. Im Folgenden wird die allgemeine Form einer Schleifenanweisung in den meisten Programmiersprachen beschrieben:

Die Programmiersprache Pascal bietet die folgenden Arten von Schleifenkonstrukten, um die Schleifenanforderungen zu erfüllen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

Sr.Nr. Schleifentyp & Beschreibung
1 while-do-Schleife

Wiederholt eine Anweisung oder eine Gruppe von Anweisungen, während eine bestimmte Bedingung erfüllt ist. Es testet die Bedingung, bevor der Schleifenkörper ausgeführt wird.

2 For-Do-Schleife

Führt eine Folge von Anweisungen mehrmals aus und verkürzt den Code, der die Schleifenvariable verwaltet.

3 Wiederholungsschleife

Wie eine while-Anweisung, nur dass sie die Bedingung am Ende des Schleifenkörpers testet.

4 verschachtelte Schleifen

Sie können eine oder mehrere Schleifen in einer anderen verwenden, während oder bis zur Schleife wiederholen.

Schleifensteuerungsanweisungen

Schleifensteueranweisungen ändern die Ausführung von ihrer normalen Reihenfolge. Wenn die Ausführung einen Bereich verlässt, werden alle automatischen Objekte, die in diesem Bereich erstellt wurden, zerstört.

Pascal unterstützt die folgenden Steueranweisungen. Klicken Sie auf die folgenden Links, um deren Details zu überprüfen.

Sr.Nr. Steueranweisung & Beschreibung
1 break-Anweisung

Beendet die loop oder case Anweisung und überträgt die Ausführung an die Anweisung unmittelbar nach der Schleifen- oder case-Anweisung.

2 Aussage fortsetzen

Bewirkt, dass die Schleife den Rest ihres Körpers überspringt und ihren Zustand sofort erneut testet, bevor sie wiederholt wird.

3 gehe zu Aussage

Überträgt die Kontrolle auf die beschriftete Anweisung. Es wird jedoch nicht empfohlen, die goto-Anweisung in Ihrem Programm zu verwenden.

Unterprogramme

Ein Unterprogramm ist eine Programmeinheit / ein Modul, die eine bestimmte Aufgabe ausführt. Diese Unterprogramme werden zu größeren Programmen zusammengefasst. Dies wird im Grunde als "modularer Aufbau" bezeichnet. Ein Unterprogramm kann von einem Unterprogramm / Programm aufgerufen werden, das als aufrufendes Programm bezeichnet wird.

Pascal bietet zwei Arten von Unterprogrammen -

  • Functions - Diese Unterprogramme geben einen einzelnen Wert zurück.

  • Procedures - Diese Unterprogramme geben keinen Wert direkt zurück.

Funktionen

EIN functionist eine Gruppe von Anweisungen, die zusammen eine Aufgabe ausführen. Jedes Pascal-Programm hat mindestens eine Funktion, nämlich das Programm selbst, und alle trivialsten Programme können zusätzliche Funktionen definieren.

Eine Funktion declarationinformiert den Compiler über den Namen, den Rückgabetyp und die Parameter einer Funktion. Eine Funktiondefinition liefert den eigentlichen Körper der Funktion.

Die Pascal-Standardbibliothek bietet zahlreiche integrierte Funktionen, die Ihr Programm aufrufen kann. Zum Beispiel FunktionAppendStr() Hängt zwei Zeichenfolgen an, Funktion New() Ordnet Variablen und vielen weiteren Funktionen dynamisch Speicher zu.

Funktion definieren

In Pascal, a functionwird mit dem Funktionsschlüsselwort definiert. Die allgemeine Form einer Funktionsdefinition lautet wie folgt:

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

Eine Funktionsdefinition in Pascal besteht aus einer Funktion header, lokal declarations und eine Funktion body. Der Funktionsheader besteht aus der Schlüsselwortfunktion und anameder Funktion gegeben. Hier sind alle Teile einer Funktion -

  • Arguments- Die Argumente stellen die Verknüpfung zwischen dem aufrufenden Programm und den Funktionskennungen her und rufen auch die formalen Parameter auf. Ein Parameter ist wie ein Platzhalter. Wenn eine Funktion aufgerufen wird, übergeben Sie einen Wert an den Parameter. Dieser Wert wird als tatsächlicher Parameter oder Argument bezeichnet. Die Parameterliste bezieht sich auf den Typ, die Reihenfolge und die Anzahl der Parameter einer Funktion. Die Verwendung solcher formalen Parameter ist optional. Diese Parameter können einen Standarddatentyp, einen benutzerdefinierten Datentyp oder einen Unterbereichsdatentyp haben.

    Die Liste der formalen Parameter in der Funktionsanweisung kann aus einfachen oder tiefgestellten Variablen, Arrays oder strukturierten Variablen oder Unterprogrammen bestehen.

  • Return Type- Alle Funktionen müssen einen Wert zurückgeben, daher muss allen Funktionen ein Typ zugewiesen werden. Dasfunction-typeist der Datentyp des Werts, den die Funktion zurückgibt. Es kann sich um einen standardmäßigen, benutzerdefinierten Skalar- oder Unterbereichstyp handeln, es kann sich jedoch nicht um einen strukturierten Typ handeln.

  • Local declarations - Lokale Deklarationen beziehen sich auf die Deklarationen für Bezeichnungen, Konstanten, Variablen, Funktionen und Prozeduren, die nur für den Funktionskörper gelten.

  • Function Body- Der Funktionskörper enthält eine Sammlung von Anweisungen, die definieren, was die Funktion tut. Es sollte immer zwischen den reservierten Wörtern Anfang und Ende stehen. Es ist der Teil einer Funktion, in dem alle Berechnungen durchgeführt werden. Es muss eine Zuweisungsanweisung vom Typ -name := expression;im Funktionskörper, der dem Funktionsnamen einen Wert zuweist. Dieser Wert wird zurückgegeben, wenn die Funktion ausgeführt wird. Die letzte Anweisung im Body muss eine Endanweisung sein.

Das folgende Beispiel zeigt, wie eine Funktion in pascal definiert wird -

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

Funktionserklärungen

Eine Funktion declarationinformiert den Compiler über einen Funktionsnamen und wie die Funktion aufgerufen wird. Der eigentliche Funktionskörper kann separat definiert werden.

Eine Funktionsdeklaration besteht aus folgenden Teilen:

function name(argument(s): type1; argument(s): type2; ...): function_type;

Für die oben definierte Funktion max () folgt die Funktionsdeklaration -

function max(num1, num2: integer): integer;

Eine Funktionsdeklaration ist erforderlich, wenn Sie eine Funktion in einer Quelldatei definieren und diese Funktion in einer anderen Datei aufrufen. In diesem Fall sollten Sie die Funktion oben in der Datei deklarieren, die die Funktion aufruft.

Eine Funktion aufrufen

Beim Erstellen einer Funktion definieren Sie, was die Funktion zu tun hat. Um eine Funktion zu verwenden, müssen Sie diese Funktion aufrufen, um die definierte Aufgabe auszuführen. Wenn ein Programm eine Funktion aufruft, wird die Programmsteuerung auf die aufgerufene Funktion übertragen. Eine aufgerufene Funktion führt eine definierte Aufgabe aus. Wenn ihre return-Anweisung ausgeführt wird oder wenn ihre letzte end-Anweisung erreicht ist, gibt sie die Programmsteuerung an das Hauptprogramm zurück.

Um eine Funktion aufzurufen, müssen Sie lediglich die erforderlichen Parameter zusammen mit dem Funktionsnamen übergeben. Wenn die Funktion einen Wert zurückgibt, können Sie den zurückgegebenen Wert speichern. Das Folgende ist ein einfaches Beispiel, um die Verwendung zu zeigen -

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Max value is : 200

Procedures sind Unterprogramme, die es ermöglichen, eine Gruppe von Ergebnissen zu erhalten, anstatt einen einzelnen Wert zurückzugeben.

Prozedur definieren

In Pascal wird eine Prozedur mit dem definiert procedureStichwort. Die allgemeine Form einer Prozedurdefinition lautet wie folgt:

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Eine Prozedur definition in Pascal besteht aus a header, lokal declarations und ein bodydes Verfahrens. Der Prozedurheader besteht aus dem Schlüsselwortprocedureund einen Namen für die Prozedur. Hier sind alle Teile einer Prozedur -

  • Arguments- Die Argumente stellen die Verknüpfung zwischen dem aufrufenden Programm und den Prozedurkennungen her und rufen auch die formalen Parameter auf. Die Regeln für Argumente in Prozeduren sind dieselben wie für die Funktionen.

  • Local declarations - Lokale Deklarationen beziehen sich auf die Deklarationen für Bezeichnungen, Konstanten, Variablen, Funktionen und Prozeduren, die nur für den Hauptteil der Prozedur gelten.

  • Procedure Body- Der Prozedurkörper enthält eine Sammlung von Anweisungen, die definieren, was die Prozedur tut. Es sollte immer zwischen den reservierten Wörtern Anfang und Ende stehen. Es ist der Teil einer Prozedur, in dem alle Berechnungen durchgeführt werden.

Es folgt der Quellcode für eine Prozedur namens findMin () . Diese Prozedur verwendet 4 Parameter x, y, z und m und speichert das Minimum unter den ersten drei Variablen in der Variablen mit dem Namen m. Die Variable m wird übergebenreference (Wir werden die Übergabe von Argumenten etwas später durch Bezugnahme diskutieren) -

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

Verfahrenserklärungen

Eine Prozedur declarationinformiert den Compiler über einen Prozedurnamen und wie die Prozedur aufgerufen wird. Der tatsächliche Hauptteil des Verfahrens kann separat definiert werden.

Eine Prozedurdeklaration hat die folgende Syntax:

procedure name(argument(s): type1, argument(s): type 2, ... );

Bitte beachten Sie, dass die name of the procedure is not associated with any type. Für die oben definierte Prozedur findMin () folgt die Deklaration -

procedure findMin(x, y, z: integer; var m: integer);

Prozedur aufrufen

Beim Erstellen einer Prozedur definieren Sie, was die Prozedur zu tun hat. Um die Prozedur zu verwenden, müssen Sie diese Prozedur aufrufen, um die definierte Aufgabe auszuführen. Wenn ein Programm eine Prozedur aufruft, wird die Programmsteuerung auf die aufgerufene Prozedur übertragen. Eine aufgerufene Prozedur führt die definierte Aufgabe aus und gibt die Steuerung an das aufrufende Programm zurück, wenn ihre letzte end-Anweisung erreicht ist.

Um eine Prozedur aufzurufen, müssen Sie lediglich die erforderlichen Parameter zusammen mit dem Prozedurnamen übergeben, wie unten gezeigt -

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter three numbers:
89 45 67
Minimum: 45

Rekursive Unterprogramme

Wir haben gesehen, dass ein Programm oder Unterprogramm ein anderes Unterprogramm aufrufen kann. Wenn sich ein Unterprogramm selbst aufruft, wird es als rekursiver Aufruf bezeichnet, und der Prozess wird als Rekursion bezeichnet.

Um das Konzept zu veranschaulichen, berechnen wir die Fakultät einer Zahl. Faktor einer Zahl n ist definiert als -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

Das folgende Programm berechnet die Fakultät einer bestimmten Zahl, indem es sich selbst rekursiv aufruft.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter a number:
5
Factorial 5 is: 120

Es folgt ein weiteres Beispiel, das das generiert Fibonacci Series für eine gegebene Zahl mit a recursive Funktion -

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

0 1 1 2	3 5 8 13 21 34

Argumente eines Unterprogramms

Wenn ein Unterprogramm (function or procedure) Um Argumente zu verwenden, muss es Variablen deklarieren, die die Werte der Argumente akzeptieren. Diese Variablen werden als bezeichnetformal parameters des Unterprogramms.

Die formalen Parameter verhalten sich wie andere lokale Variablen innerhalb des Unterprogramms und werden beim Eintritt in das Unterprogramm erstellt und beim Beenden zerstört.

Beim Aufrufen eines Unterprogramms gibt es zwei Möglichkeiten, wie Argumente an das Unterprogramm übergeben werden können:

Sr.Nr. Anruftyp & Beschreibung
1 Call by value

Diese Methode kopiert den tatsächlichen Wert eines Arguments in den formalen Parameter des Unterprogramms. In diesem Fall haben Änderungen am Parameter im Unterprogramm keine Auswirkung auf das Argument.

2 Rufen Sie als Referenz an

Diese Methode kopiert die Adresse eines Arguments in den formalen Parameter. Innerhalb des Unterprogramms wird die Adresse verwendet, um auf das tatsächliche Argument zuzugreifen, das im Aufruf verwendet wird. Dies bedeutet, dass Änderungen am Parameter das Argument beeinflussen.

Standardmäßig verwendet Pascal call by valueArgumente übergeben. Im Allgemeinen bedeutet dies, dass Code in einem Unterprogramm die zum Aufrufen des Unterprogramms verwendeten Argumente nicht ändern kann. Das Beispielprogramm, das wir im Kapitel 'Pascal - Funktionen' verwendet haben, hat die Funktion max () using verwendetcall by value.

Während das hier bereitgestellte Beispielprogramm ( exProcedure ) die Prozedur findMin () mit aufruftcall by reference.

Ein Bereich in jeder Programmierung ist ein Bereich des Programms, in dem eine definierte Variable vorhanden sein kann und auf den darüber hinaus nicht zugegriffen werden kann. Es gibt drei Stellen, an denen Variablen in der Programmiersprache Pascal deklariert werden können:

  • Innerhalb eines Unterprogramms oder eines Blocks, der als lokale Variablen bezeichnet wird

  • Außerhalb aller Unterprogramme, die als globale Variablen bezeichnet werden

  • Bei der Definition von Unterprogrammparametern werden die formalen Parameter genannt

Lassen Sie uns erklären, was sind local und global Variablen und formale Parameter.

Lokale Variablen

Variablen, die in einem Unterprogramm oder Block deklariert sind, werden als lokale Variablen bezeichnet. Sie können nur von Anweisungen verwendet werden, die sich in diesem Unterprogramm oder Codeblock befinden. Lokale Variablen sind Unterprogrammen außerhalb ihrer eigenen nicht bekannt. Es folgt das Beispiel mit lokalen Variablen. Hier sind alle Variablen a , b und c lokal für das Programm mit dem Namen exLocal .

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

value of a = 10 b = 20 c = 30

Lassen Sie uns nun das Programm etwas erweitern, eine Prozedur mit dem Namen display erstellen, die über einen eigenen Satz von Variablen a , b und c verfügt und deren Werte direkt aus dem Programm exLocal anzeigt .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

Globale Variablen

Globale Variablen werden außerhalb einer Funktion definiert, normalerweise über dem Programm. Die globalen Variablen behalten ihren Wert während der gesamten Lebensdauer Ihres Programms und können in allen für das Programm definierten Funktionen aufgerufen werden.

EIN globalAuf die Variable kann von jeder Funktion zugegriffen werden. Das heißt, eine globale Variable kann nach ihrer Deklaration im gesamten Programm verwendet werden. Es folgt ein Beispiel mitglobal und local Variablen -

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

Bitte beachten Sie, dass die Prozeduranzeige Zugriff auf die Variablen a, b und c hat, die globale Variablen in Bezug auf die Anzeige sind, sowie auf ihre eigenen lokalen Variablen. Ein Programm kann für lokale und globale Variablen denselben Namen haben, der Wert der lokalen Variablen innerhalb einer Funktion wird jedoch bevorzugt.

Lassen Sie uns das vorherige Beispiel ein wenig ändern, jetzt haben die lokalen Variablen für die Prozeduranzeige dieselben Namen wie a , b , c -

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

Die Zeichenfolge in Pascal ist eine Folge von Zeichen mit einer optionalen Größenangabe. Die Zeichen können numerisch, Buchstaben, Leerzeichen, Sonderzeichen oder eine Kombination aus allen sein. Extended Pascal bietet je nach System und Implementierung zahlreiche Arten von Zeichenfolgenobjekten. Wir werden häufigere Arten von Zeichenfolgen diskutieren, die in Programmen verwendet werden.

Sie können eine Zeichenfolge auf viele Arten definieren -

  • Character arrays - Dies ist eine Zeichenfolge, bei der es sich um eine Folge von Zeichen mit einer Größe von null oder mehr Byte in einfachen Anführungszeichen handelt.

  • String variables - Die Variable vom Typ String, wie in Turbo Pascal definiert.

  • Short strings - Die Variable vom Typ String mit Größenangabe.

  • Null terminated strings - Die Variable von pchar Art.

  • AnsiStrings - Ansistrings sind Zeichenfolgen ohne Längenbeschränkung.

Pascal bietet nur einen Zeichenfolgenoperator, den Zeichenfolgenverkettungsoperator (+).

Beispiele

Das folgende Programm druckt die ersten vier Arten von Zeichenfolgen. Wir werden AnsiStrings im nächsten Beispiel verwenden.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

Das folgende Beispiel verwendet einige weitere Funktionen.

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

Pascal String Funktionen und Prozeduren

Pascal unterstützt eine Vielzahl von Funktionen und Prozeduren, mit denen Zeichenfolgen bearbeitet werden. Diese Unterprogramme variieren implementierungsmäßig. Hier listen wir verschiedene Unterprogramme zur Manipulation von Zeichenfolgen auf, die von Free Pascal bereitgestellt werden -

Sr.Nr. Funktion & Zweck
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

Vergleicht zwei Zeichenfolgen

2

function AnsiCompareText(const S1: ; const S2:):Integer;

Vergleicht zwei Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung

3

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

Entfernt Anführungszeichen aus der Zeichenfolge

4

function AnsiLastChar(const S:):PChar;

Ruft das letzte Zeichen der Zeichenfolge ab

5

function AnsiLowerCase(const s:):

Konvertiert Zeichenfolge in Kleinbuchstaben

6

function AnsiQuotedStr(const S: ; Quote: Char):;

Zitiert eine Zeichenfolge

7

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

Vergleicht Zeichenfolgen zwischen Groß- und Kleinschreibung

8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

Vergleicht Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Vergleicht L-Zeichen von Zeichenfolgen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird

10

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Vergleicht L Zeichen von Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung

11

function AnsiStrLastChar(Str: PChar):PChar;

Ruft das letzte Zeichen der Zeichenfolge ab

12

function AnsiStrLower(Str: PChar):PChar;

Konvertiert Zeichenfolge in Kleinbuchstaben

13

function AnsiStrUpper(Str: PChar):PChar;

Konvertiert Zeichenfolge in Großbuchstaben

14

function AnsiUpperCase(const s:):;

Konvertiert Zeichenfolge in Großbuchstaben

15

procedure AppendStr(var Dest: ; const S:);

Hängt 2 Zeichenfolgen an

16

procedure AssignStr(var P: PString; const S:);

Weist den Wert der Zeichenfolgen auf dem Heap zu

17

function CompareStr(const S1: ; const S2:):Integer; overload;

Vergleicht zwei Zeichenfolgen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird

18

function CompareText(const S1: ; const S2:):Integer;

Vergleicht zwei Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung

19 procedure DisposeStr(S: PString); overload;

Entfernt die Zeichenfolge vom Heap

20

procedure DisposeStr(S: PShortString); overload;

Entfernt die Zeichenfolge vom Heap

21

function IsValidIdent( const Ident:):Boolean;

Ist string eine gültige Pascal-ID?

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

Letztes Vorkommen eines Zeichens in einer Zeichenfolge

23

function LeftStr(const S: ; Count: Integer):;

Ruft die ersten N Zeichen einer Zeichenfolge ab

24

function LoadStr(Ident: Integer):;

Lädt einen String aus Ressourcen

25

function LowerCase(const s: ):; overload;

Konvertiert Zeichenfolge in Kleinbuchstaben

26

function LowerCase(const V: variant ):; overload;

Konvertiert Zeichenfolge in Kleinbuchstaben

27

function NewStr(const S:):PString; overload;

Weist dem Heap eine neue Zeichenfolge zu

28

function RightStr(const S: ; Count: Integer):;

Ruft die letzten N Zeichen einer Zeichenfolge ab

29

function StrAlloc(Size: Cardinal):PChar;

Ordnet Speicher für Zeichenfolge zu

30

function StrBufSize(Str: PChar):SizeUInt;

Reserviert Speicher für eine Zeichenfolge

31

procedure StrDispose(Str: PChar);

Entfernt die Zeichenfolge vom Heap

32

function StrPas(Str: PChar):;

Konvertiert PChar in Pascal-String

33

function StrPCopy(Dest: PChar; Source:):PChar;

Kopiert die Pascal-Zeichenfolge

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

Kopiert N Bytes der Pascal-Zeichenfolge

35

function UpperCase(const s:):;

Konvertiert Zeichenfolge in Großbuchstaben

Pascal bietet den Datentyp Boolean, mit dem die Programmierer logische Entitäten wie Konstanten, Variablen, Funktionen und Ausdrücke usw. definieren, speichern und bearbeiten können.

Boolesche Werte sind grundsätzlich ganzzahlige Werte. Boolesche Variablen haben zwei vordefinierte mögliche WerteTrue und False. Die Ausdrücke, die in einen Booleschen Wert aufgelöst werden, können auch einem Booleschen Typ zugewiesen werden.

Free Pascal unterstützt auch die ByteBool, WordBool und LongBoolTypen. Diese sind vom Typ Byte, Word bzw. Longint.

Der Wert False entspricht 0 (Null) und jeder Wert ungleich Null wird bei der Konvertierung in einen Booleschen Wert als True betrachtet. Ein boolescher Wert von True wird in -1 konvertiert, falls er einer Variablen vom Typ LongBool zugewiesen wird.

Es ist zu beachten, dass logische Operatoren and, or und not sind für boolesche Datentypen definiert.

Deklaration von Booleschen Datentypen

Eine Variable vom Typ Boolean wird mit dem Schlüsselwort var deklariert.

var
boolean-identifier: boolean;

zum Beispiel,

var
choice: boolean;

Beispiel

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

Die Programmiersprache Pascal bietet eine Datenstruktur namens Array, in der eine sequentielle Sammlung von Elementen desselben Typs mit fester Größe gespeichert werden kann. Ein Array wird zum Speichern einer Sammlung von Daten verwendet. Oft ist es jedoch sinnvoller, sich ein Array als eine Sammlung von Variablen desselben Typs vorzustellen.

Anstatt einzelne Variablen wie Nummer1, Nummer2, ... und Nummer100 zu deklarieren, deklarieren Sie eine Array-Variable wie Zahlen und verwenden Zahlen [1], Zahlen [2] und ..., Zahlen [100] zur Darstellung einzelne Variablen. Auf ein bestimmtes Element in einem Array wird über einen Index zugegriffen.

Alle Arrays bestehen aus zusammenhängenden Speicherstellen. Die niedrigste Adresse entspricht dem ersten Element und die höchste Adresse dem letzten Element.

Beachten Sie, dass Sie, wenn Sie ein Array im C-Stil ab Index 0 möchten, den Index nur mit 0 anstelle von 1 starten müssen.

Arrays deklarieren

Um ein Array in Pascal zu deklarieren, kann ein Programmierer entweder den Typ deklarieren und dann Variablen dieses Arrays erstellen oder die Arrayvariable direkt deklarieren.

Die allgemeine Form der Typdeklaration eines eindimensionalen Arrays ist -

type
   array-identifier = array[index-type] of element-type;

Wo,

  • array-identifier - gibt den Namen des Array-Typs an.

  • index-type- gibt den Index des Arrays an; Es kann sich um einen beliebigen skalaren Datentyp handeln, außer um real

  • element-type - Gibt die Arten von Werten an, die gespeichert werden sollen

Zum Beispiel,

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

Geschwindigkeit ist nun ein variables Array vom Vektortyp, das ausreicht, um bis zu 25 reelle Zahlen aufzunehmen.

Um das Array mit dem Index 0 zu starten, lautet die Deklaration -

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

Arten von Array-Indizes

In Pascal kann ein Array-Index von einem beliebigen Skalartyp wie Integer, Boolean, Enumerated oder Subrange sein, außer real. Array-Indizes können auch negative Werte haben.

Zum Beispiel,

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

Nehmen wir ein anderes Beispiel, bei dem der Index vom Zeichentyp ist -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

Der Index kann vom Aufzählungstyp sein -

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

Arrays initialisieren

In Pascal werden Arrays durch Zuweisung initialisiert, entweder durch Angabe eines bestimmten Index oder durch Verwendung einer For-Do-Schleife.

Zum Beispiel -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

Zugriff auf Array-Elemente

Auf ein Element wird zugegriffen, indem der Arrayname indiziert wird. Dazu wird der Index des Elements in eckige Klammern nach dem Namen des Arrays gesetzt. Zum Beispiel -

a: integer;
a: = alphabet['A'];

Die obige Anweisung nimmt das erste Element aus dem Array mit dem Namen alphabet und weist der Variablen a den Wert zu.

Es folgt ein Beispiel, in dem alle oben genannten drei Konzepte verwendet werden. Deklaration, Zuweisung und Zugriff auf Arrays -

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

Pascal-Arrays im Detail

Arrays sind für Pascal wichtig und sollten viele weitere Details benötigen. Es gibt einige wichtige Konzepte im Zusammenhang mit Arrays, die einem Pascal-Programmierer klar sein sollten:

Sr.Nr. Konzept & Beschreibung
1 Mehrdimensionale Arrays

Pascal unterstützt mehrdimensionale Arrays. Die einfachste Form des mehrdimensionalen Arrays ist das zweidimensionale Array.

2 Dynamisches Array

Bei dieser Art von Arrays ist die Anfangslänge Null. Die tatsächliche Länge des Arrays muss mit dem Standard festgelegt werdenSetLength Funktion.

3 Gepacktes Array

Diese Arrays sind bitgepackt, dh jedes Zeichen oder jeder Wahrheitswert wird in aufeinanderfolgenden Bytes gespeichert, anstatt eine Speichereinheit zu verwenden, normalerweise ein Wort (4 Bytes oder mehr).

4 Übergeben von Arrays an Unterprogramme

Sie können einen Zeiger auf ein Array an ein Unterprogramm übergeben, indem Sie den Namen des Arrays ohne Index angeben.

Zeiger in Pascal sind einfach und machen Spaß zu lernen. Einige Pascal-Programmieraufgaben können einfacher mit Zeigern ausgeführt werden, und andere Aufgaben, wie z. B. die dynamische Speicherzuweisung, können nicht ohne Verwendung von Zeigern ausgeführt werden. Es wird also notwendig, Zeiger zu lernen, um ein perfekter Pascal-Programmierer zu werden. Beginnen wir damit, sie in einfachen Schritten zu lernen.

Wie Sie wissen, ist jede Variable ein Speicherort, und für jeden Speicherort ist eine Adresse definiert, auf die über den Namen der Zeigervariable zugegriffen werden kann, die eine Adresse im Speicher angibt.

Was sind Zeiger?

Ein Zeiger ist eine dynamische Variable, deren Wert die Adresse einer anderen Variablen ist, dh die direkte Adresse des Speicherorts. Wie bei jeder Variablen oder Konstante müssen Sie einen Zeiger deklarieren, bevor Sie ihn zum Speichern einer Variablenadresse verwenden können. Die allgemeine Form einer Zeigervariablendeklaration lautet -

type
   ptr-identifier = ^base-variable-type;

Der Zeigertyp wird definiert, indem dem Aufwärtspfeil des Caret-Symbols (^) der Basistyp vorangestellt wird. Der Basistyp definiert die Typen der Datenelemente. Sobald eine Zeigervariable als von einem bestimmten Typ definiert ist, kann sie nur auf Datenelemente dieses Typs verweisen. Sobald ein Zeigertyp definiert wurde, können wir den verwendenvar Deklaration zum Deklarieren von Zeigervariablen.

var
   p1, p2, ... : ptr-identifier;

Es folgen einige gültige Zeigerdeklarationen -

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

Die Zeigervariablen werden unter Verwendung des gleichen Caret-Symbols (^) dereferenziert. Beispielsweise ist die zugehörige Variable, auf die durch einen Zeiger rptr verwiesen wird , rptr ^ . Es kann als - zugegriffen werden

rptr^ := 234.56;

Das folgende Beispiel veranschaulicht dieses Konzept -

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

Drucken einer Speicheradresse in Pascal

In Pascal können wir die Adresse einer Variablen mit dem Adressoperator (@) einer Zeigervariable zuweisen. Wir verwenden diesen Zeiger, um das Datenelement zu bearbeiten und darauf zuzugreifen. Wenn wir jedoch aus irgendeinem Grund mit der Speicheradresse selbst arbeiten müssen, müssen wir sie in einer Worttypvariablen speichern.

Erweitern wir das obige Beispiel, um die im Zeiger iptr - gespeicherte Speicheradresse zu drucken.

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

NIL Zeiger

Es ist immer eine gute Praxis, a zuzuweisen NILWert für eine Zeigervariable, falls Ihnen keine genaue Adresse zugewiesen werden muss. Dies erfolgt zum Zeitpunkt der Variablendeklaration. Ein Zeiger, der zugewiesen istNILzeigt ins Nirgendwo. Betrachten Sie das folgende Programm -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

The value of ptr is 0

Um nach a zu suchen nil Zeiger Sie können eine if-Anweisung wie folgt verwenden:

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Pascal Zeiger im Detail

Zeiger haben viele, aber einfache Konzepte und sind für die Pascal-Programmierung sehr wichtig. Es gibt einige wichtige Zeigerkonzepte, die einem Pascal-Programmierer klar sein sollten:

Sr.Nr. Konzept & Beschreibung
1 Pascal - Zeigerarithmetik

Es gibt vier arithmetische Operatoren, die für Zeiger verwendet werden können: Inkrementieren, Dekrementieren, +, -

2 Pascal - Array von Zeigern

Sie können Arrays definieren, die eine Reihe von Zeigern enthalten.

3 Pascal - Zeiger auf Zeiger

Mit Pascal können Sie einen Zeiger auf einen Zeiger usw. setzen.

4 Übergeben von Zeigern an Unterprogramme in Pascal

Durch Übergeben eines Arguments als Referenz oder als Adresse kann das übergebene Argument im aufrufenden Unterprogramm durch das aufgerufene Unterprogramm geändert werden.

5 Zeiger aus Unterprogrammen in Pascal zurückgeben

Mit Pascal kann ein Unterprogramm einen Zeiger zurückgeben.

Mit Pascal-Arrays können Sie Variablentypen definieren, die mehrere Datenelemente derselben Art enthalten können. Ein Datensatz ist jedoch ein weiterer in Pascal verfügbarer benutzerdefinierter Datentyp, mit dem Sie Datenelemente verschiedener Arten kombinieren können.

Datensätze bestehen aus verschiedenen Feldern. Angenommen, Sie möchten Ihre Bücher in einer Bibliothek verfolgen, möchten Sie möglicherweise die folgenden Attribute für jedes Buch verfolgen:

  • Title
  • Author
  • Subject
  • Buch-ID

Datensatz definieren

Um einen Datensatztyp zu definieren, können Sie die Typdeklarationsanweisung verwenden. Der Datensatztyp ist definiert als -

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Hier ist die Art und Weise, wie Sie den Buchdatensatz deklarieren würden -

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Die Datensatzvariablen werden wie gewohnt definiert als

var
   r1, r2, ... : record-name;

Alternativ können Sie eine Datensatztypvariable direkt als - definieren

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Zugriff auf Felder eines Datensatzes

Um auf ein Feld eines Datensatzes zuzugreifen, verwenden wir den Member Access Operator (.). Der Mitgliedszugriffsoperator wird als Punkt zwischen dem Namen der Datensatzvariablen und dem Feld codiert, auf das wir zugreifen möchten. Das folgende Beispiel erläutert die Verwendung der Struktur:

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Datensätze als Unterprogrammargumente

Sie können einen Datensatz als Unterprogrammargument auf sehr ähnliche Weise übergeben wie jede andere Variable oder jeden anderen Zeiger. Sie würden auf die Datensatzfelder auf ähnliche Weise zugreifen wie im obigen Beispiel -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Zeiger auf Aufzeichnungen

Sie können Zeiger auf Datensätze auf sehr ähnliche Weise definieren, wie Sie Zeiger auf eine andere Variable wie folgt definieren:

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Jetzt können Sie die Adresse einer Datensatztypvariablen in der oben definierten Zeigervariablen speichern. Um eine Variable des erstellten Zeigertyps zu deklarieren, verwenden Sie das Schlüsselwort var -

var
   r1, r2, ... : record-ptr;

Bevor Sie diese Zeiger verwenden, müssen Sie einen Speicher für eine Variable vom Typ Datensatzname erstellen, die von diesen Zeigern bearbeitet wird.

new(r1);
new(r2);

Um mit einem Zeiger auf diesen Datensatz auf die Mitglieder eines Datensatzes zuzugreifen, müssen Sie das ^ verwenden. Betreiber wie folgt -

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Vergessen Sie nicht, den gebrauchten Speicher zu entsorgen, wenn er nicht mehr verwendet wird.

dispose(r1);
dispose(r2);

Lassen Sie uns das erste Beispiel mit einem Zeiger auf den Buchdatensatz neu schreiben. Ich hoffe, dass Sie das Konzept leicht verstehen können -

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Die With-Anweisung

Wir haben diskutiert, dass auf die Mitglieder eines Datensatzes mit dem Mitgliedszugriffsoperator (.) Zugerechnet werden kann. Auf diese Weise muss der Name der Datensatzvariablen jedes Mal geschrieben werden. DasWith Anweisung bietet eine alternative Möglichkeit, dies zu tun.

Schauen Sie sich das folgende Code-Snippet aus unserem ersten Beispiel an:

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

Die gleiche Aufgabe könnte mit dem geschrieben werden With Aussage als -

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal unterstützt einen einzigartigen Speichertyp namens Varianten. Sie können in einer Variantenvariablen einen beliebigen einfachen Wertetyp zuweisen. Der Typ eines in einer Variante gespeicherten Wertes wird nur zur Laufzeit ermittelt. Fast jeder einfache Typ kann Varianten zugeordnet werden: Ordinaltypen, Zeichenfolgentypen, int64-Typen.

Strukturierte Typen wie Mengen, Datensätze, Arrays, Dateien, Objekte und Klassen sind mit einer Variante nicht zuweisungskompatibel. Sie können einer Variante auch einen Zeiger zuweisen.

Free Pascal unterstützt Varianten.

Eine Variante deklarieren

Sie können den Variantentyp wie alle anderen Typen mit dem deklarieren varStichwort. Die Syntax zum Deklarieren eines Variantentyps lautet -

var
   v: variant;

Diese Variantenvariable v kann nun fast allen einfachen Typen zugeordnet werden, einschließlich der aufgezählten Typen und umgekehrt.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Beispiel

Das folgende Beispiel würde das Konzept veranschaulichen -

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

Eine Menge ist eine Sammlung von Elementen des gleichen Typs. Mit Pascal kann der eingestellte Datentyp definiert werden. Die Elemente in einer Menge werden als ihre Mitglieder bezeichnet. In der Mathematik werden Mengen dargestellt, indem die Elemente in geschweifte Klammern {} eingeschlossen werden . In Pascal sind Mengenelemente jedoch in eckigen Klammern [] eingeschlossen, die als Mengenkonstruktor bezeichnet werden.

Set-Typen und -Variablen definieren

Pascal Set-Typen sind definiert als

type
set-identifier = set of base type;

Variablen vom Satztyp sind definiert als

var
s1, s2, ...: set-identifier;

oder,

s1, s2...: set of base type;

Beispiele für eine gültige Satztypdeklaration sind -

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

Operatoren einstellen

Sie können die folgenden Set-Operationen für Pascal-Sets ausführen.

Sr.Nr. Operationen & Beschreibungen
1

Union

Dies verbindet zwei Sätze und gibt einen neuen Satz mit Mitgliedern aus beiden Sätzen.

2

Difference

Ruft die Differenz zweier Sätze ab und gibt einen neuen Satz mit Elementen an, die keinem Satz gemeinsam sind.

3

Intersection

Ruft den Schnittpunkt zweier Mengen ab und gibt eine neue Menge mit Elementen an, die beiden Mengen gemeinsam sind.

4

Inclusion

Eine Menge P ist in Menge Q enthalten, wenn alle Elemente in P ebenfalls in Q sind, aber nicht umgekehrt.

5

Symmetric difference

Ruft die symmetrische Differenz zweier Mengen ab und gibt eine Menge von Elementen an, die sich in einer der Mengen und nicht in ihrem Schnittpunkt befinden.

6

In

Es überprüft die Mitgliedschaft.

Die folgende Tabelle zeigt alle von Free Pascal unterstützten Set-Operatoren. Annehmen, dassS1 und S2 sind zwei Zeichensätze, so dass -

S1: = ['a', 'b', 'c'];

S2: = ['c', 'd', 'e'];

Operator Beschreibung Beispiel
+ Vereinigung zweier Sätze

S1 + S2 gibt einen Satz

['a', 'b', 'c', 'd', 'e']

- - Unterschied zweier Sätze

S1 - S2 gibt einen Satz

['a', 'b']

* * Schnittpunkt zweier Sätze

S1 * S2 gibt einen Satz

['c']

> < Symmetrische Differenz zweier Sätze S1> <S2 ergibt eine Menge ['a', 'b', 'd', 'e']
= Überprüft die Gleichheit zweier Sätze S1 = S2 ergibt den Booleschen Wert False
<> Überprüft die Ungleichheit zweier Sätze S1 <> S2 gibt den booleschen Wert True an
<= Enthält (Überprüft, ob eine Menge eine Teilmenge der anderen ist) S1 <= S2 ergibt den Booleschen Wert False
Einschließen Schließt ein Element in das Set ein; Im Grunde ist es die Vereinigung einer Menge und eines Elements desselben Basistyps

Include (S1, ['d']) ergibt einen Satz

['A B C D']

Ausschließen Schließt ein Element aus einer Menge aus; Im Grunde ist es der Unterschied einer Menge und eines Elements desselben Basistyps

Ausschließen (S2, ['d']) ergibt eine Menge

['c', 'e']

Im Überprüft die Zugehörigkeit eines Elements zu einer Menge ['e'] in S2 gibt den booleschen Wert True an

Beispiel

Das folgende Beispiel zeigt die Verwendung einiger dieser Operatoren:

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal behandelt eine Datei als eine Folge von Komponenten, die vom einheitlichen Typ sein müssen. Der Dateityp wird durch den Typ der Komponenten bestimmt. Der Datendatentyp ist definiert als -

type
file-name = file of base-type;

Wobei der Basistyp den Typ der Komponenten der Datei angibt. Der Basistyp kann mit Ausnahme eines anderen Dateityps Integer, Real, Boolean, Enumerated, Subrange, Record, Arrays und Sets sein. Variablen eines Dateityps werden mit der var- Deklaration erstellt -

var
f1, f2,...: file-name;

Im Folgenden finden Sie einige Beispiele zum Definieren einiger Dateitypen und Dateivariablen.

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

Erstellen und Schreiben in eine Datei

Lassen Sie uns ein Programm schreiben, das eine Datendatei für die Aufzeichnungen der Schüler erstellt. Es würde eine Datei mit dem Namen students.dat erstellen und die Daten eines Schülers darin schreiben -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

Beim Kompilieren und Ausführen erstellt das Programm eine Datei mit dem Namen students.dat im Arbeitsverzeichnis. Sie können die Datei mit einem Texteditor wie dem Editor öffnen, um die Daten von John Smith anzuzeigen.

Lesen aus einer Datei

Wir haben gerade eine Datei mit dem Namen students.dat erstellt und in diese geschrieben. Lassen Sie uns nun ein Programm schreiben, das die Daten des Schülers aus der Datei liest -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Name: John Smith
Address: United States of America
Batch Code: Computer Science

Dateien als Unterprogrammparameter

Mit Pascal können Dateivariablen als Parameter in Standard- und benutzerdefinierten Unterprogrammen verwendet werden. Das folgende Beispiel veranschaulicht dieses Konzept. Das Programm erstellt eine Datei mit dem Namen rainfall.txt und speichert einige Niederschlagsdaten. Als nächstes öffnet es die Datei, liest die Daten und berechnet den durchschnittlichen Niederschlag.

Bitte beachte, dass, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

Textdateien

Eine Textdatei in Pascal besteht aus Zeichenzeilen, wobei jede Zeile mit einer Zeilenende-Markierung abgeschlossen wird. Sie können Dateien wie folgt deklarieren und definieren:

type
file-name = text;

Der Unterschied zwischen einer normalen Zeichendatei und einer Textdatei besteht darin, dass eine Textdatei in Zeilen unterteilt ist, die jeweils durch eine spezielle Zeilenende-Markierung abgeschlossen werden, die vom System automatisch eingefügt wird. Im folgenden Beispiel wird eine Textdatei mit dem Namen contact.txt erstellt und in diese geschrieben.

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Enter the file name:
contact.txt 
Completed writing

An eine Datei anhängen

Das Anhängen an eine Datei bedeutet das Schreiben in eine vorhandene Datei, die bereits einige Daten enthält, ohne die Datei zu überschreiben. Das folgende Programm veranschaulicht dies -

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Funktionen zur Dateiverwaltung

Free Pascal bietet die folgenden Funktionen / Verfahren für die Dateiverwaltung:

Sr.Nr. Funktionsname & Beschreibung
1

procedure Append(var t: Text);

Öffnet eine Datei im Anhänge-Modus

2

procedure Assign(out f: file; const Name:);

Weist einer Datei einen Namen zu

3

procedure Assign(out f: file; p: PChar);

Weist einer Datei einen Namen zu

4

procedure Assign(out f: file; c: Char);

Weist einer Datei einen Namen zu

5

procedure Assign(out f: TypedFile; const Name:);

Weist einer Datei einen Namen zu

6

procedure Assign(out f: TypedFile; p: PChar);

Weist einer Datei einen Namen zu

7

procedure Assign(out f: TypedFile; c: Char);

Weist einer Datei einen Namen zu

8

procedure Assign(out t: Text; const s:);

Weist einer Datei einen Namen zu

9

procedure Assign(out t: Text; p: PChar);

Weist einer Datei einen Namen zu

10

procedure Assign(out t: Text; c: Char);

Weist einer Datei einen Namen zu

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

Liest Daten aus einer Datei in den Speicher

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

Liest Daten aus einer Datei in den Speicher

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Liest Daten aus einer Datei in den Speicher

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

Liest Daten aus einer Datei in den Speicher

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

Liest Daten aus einer Datei in den Speicher

16

procedure BlockRead(var f: file; var Buf; count: Int64);

Liest Daten aus einer Datei in den Speicher

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

Schreibt Daten aus dem Speicher in eine Datei

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

Schreibt Daten aus dem Speicher in eine Datei

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Schreibt Daten aus dem Speicher in eine Datei

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

Schreibt Daten aus dem Speicher in eine Datei

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

Schreibt Daten aus dem Speicher in eine Datei

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

Schreibt Daten aus dem Speicher in eine Datei

23

procedure Close(var f: file);

Schließt eine Datei

24

procedure Close(var t: Text);

Schließt eine Datei

25

function EOF(var f: file):Boolean;

Überprüft das Dateiende

26

function EOF(var t: Text):Boolean;

Überprüft das Dateiende

27

function EOF: Boolean;

Überprüft das Dateiende

28

function EOLn(var t: Text):Boolean;

Überprüft das Zeilenende

29

function EOLn: Boolean;

Überprüft das Zeilenende

30

procedure Erase(var f: file);

Löscht die Datei von der Festplatte

31

procedure Erase(var t: Text);

Löscht die Datei von der Festplatte

32

function FilePos( var f: file):Int64;

Position in Datei

33

function FileSize(var f: file):Int64;

Größe der Datei

34

procedure Flush(var t: Text);

Schreibt Dateipuffer auf die Festplatte

35

function IOResult: Word;

Gibt das Ergebnis der letzten Datei-E / A-Operation zurück

36

procedure Read(var F: Text; Args: Arguments);

Liest aus der Datei in die Variable

37

procedure Read(Args: Arguments);

Liest aus der Datei in die Variable

38

procedure ReadLn(var F: Text; Args: Arguments);

Liest aus der Datei in die Variable und geht zur nächsten Zeile

39

procedure ReadLn(Args: Arguments);

Liest aus der Datei in die Variable und geht zur nächsten Zeile

40

procedure Rename(var f: file; const s:);

Benennt die Datei auf der Festplatte um

41

procedure Rename(var f: file; p: PChar);

Benennt die Datei auf der Festplatte um

42

procedure Rename(var f: file; c: Char);

Benennt die Datei auf der Festplatte um

43

procedure Rename(var t: Text; const s);

Datei auf der Festplatte umbenennen

44

procedure Rename(var t: Text; p: PChar);

Benennt die Datei auf der Festplatte um

45

procedure Rename( var t: Text; c: Char);

Benennt die Datei auf der Festplatte um

46

procedure Reset(var f: file; l: LongInt);

Öffnet die Datei zum Lesen

47

procedure Reset(var f: file);

Öffnet die Datei zum Lesen

48

procedure Reset(var f: TypedFile);

Öffnet die Datei zum Lesen

49

procedure Reset(var t: Text);

Öffnet die Datei zum Lesen

50

procedure Rewrite(var f: file; l: LongInt);

Öffnet die Datei zum Schreiben

51

procedure Rewrite(var f: file);

Öffnet die Datei zum Schreiben

52

procedure Rewrite(var f: TypedFile);

Öffnet die Datei zum Schreiben

53

procedure Rewrite(var t: Text);

Öffnet die Datei zum Schreiben

54

procedure Seek(var f: file; Pos: Int64);

Legt die Dateiposition fest

55

function SeekEOF(var t: Text):Boolean;

Setzt die Dateiposition auf das Dateiende

56

function SeekEOF: Boolean;

Setzt die Dateiposition auf das Dateiende

57

function SeekEOLn(var t: Text):Boolean;

Setzt die Dateiposition auf das Zeilenende

58

function SeekEOLn: Boolean;

Setzt die Dateiposition auf das Zeilenende

59

procedure SetTextBuf(var f: Text; var Buf);

Legt die Größe des Dateipuffers fest

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

Legt die Größe des Dateipuffers fest

61

procedure Truncate(var F: file);

Schneiden Sie die Datei an der Position ab

62

procedure Write(Args: Arguments);

Schreibt eine Variable in eine Datei

63

procedure Write(var F: Text; Args: Arguments);

Variable in Datei schreiben

64

procedure Writeln(Args: Arguments);

Schreibt eine Variable in eine Datei und hängt eine neue Zeile an

65

procedure WriteLn(var F: Text; Args: Arguments);

Schreibt eine Variable in eine Datei und hängt eine neue Zeile an

In diesem Kapitel wird die dynamische Speicherverwaltung in Pascal erläutert. Die Programmiersprache Pascal bietet verschiedene Funktionen für die Speicherzuweisung und -verwaltung.

Speicher dynamisch zuweisen

Wenn Sie während der Programmierung die Größe eines Arrays kennen, ist dies einfach und Sie können es als Array definieren. Um beispielsweise einen Namen einer Person zu speichern, können maximal 100 Zeichen verwendet werden, sodass Sie Folgendes definieren können:

var
name: array[1..100] of char;

Betrachten wir nun eine Situation, in der Sie keine Ahnung von der Länge des zu speichernden Textes haben, z. B. eine detaillierte Beschreibung zu einem Thema speichern möchten. Hier müssen wir einen Zeiger auf eine Zeichenfolge definieren, ohne zu definieren, wie viel Speicher benötigt wird.

Pascal bietet eine Prozedur newZeigervariablen erstellen.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Wenn Sie nun einen Zeiger mit einer bestimmten Anzahl von Bytes definieren müssen, auf die später verwiesen werden soll, sollten Sie den verwenden getmem Funktion oder die getmem Prozedur, die die folgende Syntax hat -

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

Im vorherigen Beispiel haben wir einen Zeiger auf eine Zeichenfolge deklariert. Eine Zeichenfolge hat einen Maximalwert von 255 Byte. Wenn Sie wirklich nicht so viel Speicherplatz oder einen größeren Speicherplatz in Bezug auf Bytes benötigen , können Sie dies im Unterprogramm getmem angeben . Lassen Sie uns das vorherige Beispiel mit getmem - neu schreiben.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Sie haben also die vollständige Kontrolle und können einen beliebigen Größenwert übergeben, während Sie Speicher zuweisen, im Gegensatz zu Arrays, bei denen die Größe nach der Definition nicht mehr geändert werden kann.

Ändern der Größe und Freigeben des Speichers

Wenn Ihr Programm herauskommt, gibt das Betriebssystem automatisch den gesamten von Ihrem Programm zugewiesenen Speicher frei. Wenn Sie jedoch keinen Speicher mehr benötigen, sollten Sie diesen Speicher freigeben.

Pascal liefert das Verfahren dispose um eine dynamisch erstellte Variable mit der Prozedur freizugeben new. Wenn Sie Speicher mit dem zugewiesen haben getmem Unterprogramm, dann müssen Sie das Unterprogramm verwenden freememum diesen Speicher freizugeben. Die Freemem- Unterprogramme haben die folgende Syntax:

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Alternativ können Sie die Größe eines zugewiesenen Speicherblocks erhöhen oder verringern, indem Sie die Funktion ReAllocMem aufrufen . Lassen Sie uns das obige Programm noch einmal überprüfen und die Unterprogramme ReAllocMem und Freemem verwenden . Es folgt die Syntax für ReAllocMem -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Das folgende Beispiel verwendet ReAllocMem- und Freemem- Unterprogramme -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Speicherverwaltungsfunktionen

Pascal bietet eine Vielzahl von Speicherverwaltungsfunktionen, die bei der Implementierung verschiedener Datenstrukturen und der Implementierung von Low-Level-Programmierung in Pascal verwendet werden. Viele dieser Funktionen sind implementierungsabhängig. Free Pascal bietet die folgenden Funktionen und Verfahren für die Speicherverwaltung:

SN Funktionsname & Beschreibung
1

function Addr(X: TAnytype):Pointer;

Gibt die Adresse der Variablen zurück

2

function Assigned(P: Pointer):Boolean;

Überprüft, ob ein Zeiger gültig ist

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

Vergleicht 2 Speicherpuffer Byte pro Byte

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

Vergleicht 2 Speicherpuffer Byte pro Byte

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

Vergleicht 2 Speicherpuffer Byte pro Byte

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

Vergleicht 2 Speicherpuffer Byte pro Byte

7

function Cseg: Word;

Gibt das Codesegment zurück

8

procedure Dispose(P: Pointer);

Gibt dynamisch zugewiesenen Speicher frei

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Gibt dynamisch zugewiesenen Speicher frei

10

function Dseg: Word;

Gibt das Datensegment zurück

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Füllt den Speicherbereich mit einem 8-Bit-Muster

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Füllt den Speicherbereich mit einem bestimmten Zeichen

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Füllt den Speicherbereich mit einem 32-Bit-Muster

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Füllt den Speicherbereich mit einem 64-Bit-Muster

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Füllt den Speicherbereich mit einem 16-Bit-Muster

16

procedure Freemem( p: pointer; Size: PtrUInt);

Gibt den zugewiesenen Speicher frei

17

procedure Freemem( p: pointer );

Gibt den zugewiesenen Speicher frei

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Weist neuen Speicher zu

19

procedure Getmem( out p: pointer);

Weist neuen Speicher zu

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Gibt den aktuellen Speichermanager zurück

21

function High( Arg: TypeOrVariable):TOrdinal;

Gibt den höchsten Index des geöffneten Arrays oder der Aufzählung zurück

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Findet einen bytegroßen Wert in einem Speicherbereich

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Findet einen Wert in Zeichengröße in einem Speicherbereich

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Findet einen 32-Bit-Wert in DWord-Größe in einem Speicherbereich

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Findet einen Wert in QWord-Größe in einem Speicherbereich

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Findet einen wortgroßen Wert in einem Speicherbereich

27

function IsMemoryManagerSet: Boolean;

Ist der Speichermanager eingestellt?

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Gibt den niedrigsten Index des geöffneten Arrays oder der Aufzählung zurück

29

procedure Move( const source; var dest; count: SizeInt );

Verschiebt Daten von einem Speicherort an einen anderen

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Verschiebt Daten bis zum ersten Nullzeichen

31

procedure New( var P: Pointer);

Ordnen Sie dynamisch Speicher für Variablen zu

32

procedure New( var P: Pointer; Cons: TProcedure);

Ordnet dynamisch Speicher für Variablen zu

33

function Ofs( var X ):LongInt;

Gibt den Offset der Variablen zurück

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Kombiniert Segment und Offset zum Zeiger

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Ändert die Größe eines Speicherblocks auf dem Heap

36

function Seg( var X):LongInt;

Gibt das Segment zurück

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Legt einen Speichermanager fest

38

function Sptr: Pointer;

Gibt den aktuellen Stapelzeiger zurück

39

function Sseg: Word;

Gibt den Wert des Stapelsegmentregisters zurück

Ein Pascal-Programm kann aus Modulen bestehen, die als Einheiten bezeichnet werden. Eine Einheit kann aus einigen Codeblöcken bestehen, die wiederum aus Variablen und Typdeklarationen, Anweisungen, Prozeduren usw. bestehen. In Pascal gibt es viele integrierte Einheiten, und Pascal ermöglicht es Programmierern, ihre eigenen Einheiten zu definieren und zu schreiben, die verwendet werden sollen später in verschiedenen Programmen.

Eingebaute Einheiten verwenden

Sowohl die integrierten als auch die benutzerdefinierten Einheiten werden durch die Verwendungsklausel in ein Programm aufgenommen. Wir haben die Varianteneinheit bereits im Pascal - Variants Tutorial verwendet. In diesem Tutorial wird das Erstellen und Einfügen von benutzerdefinierten Einheiten erläutert. Lassen Sie uns jedoch zunächst sehen, wie eine eingebaute Einheit eingebaut wirdcrt in Ihrem Programm -

program myprog;
uses crt;

Das folgende Beispiel zeigt die Verwendung von crt Einheit -

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

Es ist dasselbe Programm, das wir gleich zu Beginn des Pascal-Tutorials verwendet haben. Kompilieren Sie es und führen Sie es aus, um die Auswirkungen der Änderung zu ermitteln.

Erstellen und Verwenden einer Pascal-Einheit

Um eine Einheit zu erstellen, müssen Sie die Module oder Unterprogramme schreiben, die Sie darin speichern möchten, und sie in einer Datei mit speichern .pasErweiterung. Die erste Zeile dieser Datei sollte mit dem Schlüsselwort unit beginnen, gefolgt vom Namen der Einheit. Zum Beispiel -

unit calculateArea;

Es folgen drei wichtige Schritte zum Erstellen einer Pascal-Einheit:

  • Der Name der Datei und der Name des Geräts sollten genau gleich sein. Daher wird unsere Einheit berechneArea in einer Datei mit dem Namen berechneArea.pas gespeichert .

  • Die nächste Zeile sollte aus einem einzelnen Schlüsselwort bestehen interface. Nach dieser Zeile schreiben Sie die Deklarationen für alle Funktionen und Prozeduren, die in dieser Einheit enthalten sein werden.

  • Schreiben Sie das Wort direkt nach den Funktionsdeklarationen implementation, was wieder ein Schlüsselwort ist. Geben Sie nach der Zeile mit der Schlüsselwortimplementierung eine Definition aller Unterprogramme an.

Das folgende Programm erstellt die Einheit berechneArea -

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

Als nächstes schreiben wir ein einfaches Programm, das die oben definierte Einheit verwendet -

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

Die meisten von Ihnen geschriebenen Softwareprogramme müssen Datumsfunktionen implementieren, die das aktuelle Datum und die aktuelle Uhrzeit zurückgeben. Termine gehören so sehr zum Alltag, dass es einfach wird, mit ihnen zu arbeiten, ohne nachzudenken. Pascal bietet außerdem leistungsstarke Tools für die Datumsarithmetik, mit denen Datumsangaben einfach bearbeitet werden können. Der tatsächliche Name und die Funktionsweise dieser Funktionen sind jedoch für verschiedene Compiler unterschiedlich.

Aktuelles Datum und Uhrzeit abrufen

Mit der TimeToString-Funktion von Pascal erhalten Sie die aktuelle Zeit in einer durch Doppelpunkte (:) getrennten Form. Das folgende Beispiel zeigt, wie die aktuelle Zeit abgerufen wird -

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

Wenn der obige Code kompiliert und ausgeführt wurde, ergibt sich das folgende Ergebnis:

Current time : 18:33:08

Das Date Funktion gibt das aktuelle Datum in zurück TDateTimeFormat. TDateTime ist ein doppelter Wert, der dekodiert und formatiert werden muss. Das folgende Programm zeigt, wie Sie es in Ihrem Programm verwenden, um das aktuelle Datum anzuzeigen:

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

Wenn der obige Code kompiliert und ausgeführt wurde, ergibt sich das folgende Ergebnis:

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

Die Now-Funktion gibt das aktuelle Datum und die aktuelle Uhrzeit zurück -

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

Wenn der obige Code kompiliert und ausgeführt wurde, ergibt sich das folgende Ergebnis:

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal bietet eine einfache Zeitstempelstruktur mit dem Namen TTimeStamp, die das folgende Format hat -

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

Verschiedene Datums- und Uhrzeitfunktionen

Free Pascal bietet die folgenden Datums- und Uhrzeitfunktionen:

Sr.Nr. Funktionsname & Beschreibung
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

Konvertiert den DateTime-Typ in das Dateidatum.

2

function DateTimeToStr( DateTime: TDateTime):;

Erstellt eine Zeichenfolgendarstellung von DateTime

3

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Erstellt eine Zeichenfolgendarstellung von DateTime

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

Erstellt eine Zeichenfolgendarstellung von DateTime

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Erstellt eine Zeichenfolgendarstellung von DateTime

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

Konvertiert DateTime in Systemzeit

7

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;Konvertiert DateTime in Zeitstempel

8

function DateToStr(Date: TDateTime):;

Erstellt eine Zeichenfolgendarstellung des Datums

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

Erstellt eine Zeichenfolgendarstellung des Datums

10

function Date: TDateTime;

Ruft das aktuelle Datum ab

11

function DayOfWeek(DateTime: TDateTime):Integer;

Ruft den Wochentag ab

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

Dekodiert DateTime in Jahr, Monat und Tag

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

Dekodiert DateTime in Stunden, Minuten und Sekunden

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

Codiert Jahr, Tag und Monat in DateTime

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

Codiert Stunden, Minuten und Sekunden in DateTime

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

Gibt die Zeichenfolgendarstellung von DateTime zurück

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Gibt die Zeichenfolgendarstellung von DateTime zurück

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

Fügt 1 zum Monat hinzu

19

function IsLeapYear(Year: Word):Boolean;

Bestimmt, ob das Jahr das Schaltjahr ist

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

Konvertiert die Anzahl der Millisekunden in einen Zeitstempel

21

function Now: TDateTime;

Ruft das aktuelle Datum und die aktuelle Uhrzeit ab

22

function StrToDateTime(const S:):TDateTime;

Konvertiert einen String in DateTime

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

Konvertiert einen String in DateTime

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

Konvertiert einen String in DateTime

25

function StrToDate(const S: ShortString):TDateTime;

Konvertiert Zeichenfolge in Datum

26

function StrToDate(const S: Ansistring):TDateTime;

Konvertiert Zeichenfolge in Datum

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

Konvertiert Zeichenfolge in Datum

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

Konvertiert Zeichenfolge in Datum

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

Converts string to date

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

Converts string to date

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

Converts string to date

32

function StrToTime(const S: Shortstring):TDateTime;

Converts string to time

33

function StrToTime(const S: Ansistring):TDateTime;

Converts string to time

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

Converts string to time

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

Converts string to time

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

Converts string to time

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

Converts string to time

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

Converts system time to datetime

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

Converts time stamp to DateTime

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

Converts Timestamp to number of milliseconds

41

function TimeToStr(Time: TDateTime):;

Returns string representation of Time

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

Returns string representation of Time

43

function Time: TDateTime;

Get current time

The following example illustrates the use of some of the above functions −

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

When the above code was compiled and executed, it produced the following result:

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

We can imagine our universe made of different objects like sun, earth, moon, etc. Similarly, we can imagine our car made of different objects like wheel, steering, gear, etc. Same way, there are object-oriented programming concepts, which assume everything as an object and implement a software using different objects. In Pascal, there are two structural data types used to implement a real world object −

  • Object types
  • Class types

Object-Oriented Concepts

Before we go in detail, let's define important Pascal terms related to Object-Oriented Pascal.

  • Object − An Object is a special kind of record that contains fields like a record; however, unlike records, objects contain procedures and functions as part of the object. These procedures and functions are held as pointers to the methods associated with the object's type.

  • Class − A Class is defined in almost the same way as an Object, but there is a difference in way they are created. The Class is allocated on the Heap of a program, whereas the Object is allocated on the Stack. It is a pointer to the object, not the object itself.

  • Instantiation of a class − Instantiation means creating a variable of that class type. Since a class is just a pointer, when a variable of a class type is declared, there is memory allocated only for the pointer, not for the entire object. Only when it is instantiated using one of its constructors, memory is allocated for the object. Instances of a class are also called 'objects', but do not confuse them with Object Pascal Objects. In this tutorial, we will write 'Object' for Pascal Objects and 'object' for the conceptual object or class instance.

  • Member Variables − These are the variables defined inside a Class or an Object.

  • Member Functions − These are the functions or procedures defined inside a Class or an Object and are used to access object data.

  • Visibility of Members − The members of an Object or Class are also called the fields. These fields have different visibilities. Visibility refers to accessibility of the members, i.e., exactly where these members will be accessible. Objects have three visibility levels: public, private and protected. Classes have five visibility types: public, private, strictly private, protected and published. We will discuss visibility in details.

  • Inheritance − When a Class is defined by inheriting existing functionalities of a parent Class, then it is said to be inherited. Here child class will inherit all or few member functions and variables of a parent class. Objects can also be inherited.

  • Parent Class − A Class that is inherited by another Class. This is also called a base class or super class.

  • Child Class − A class that inherits from another class. This is also called a subclass or derived class.

  • Polymorphism − This is an object-oriented concept where same function can be used for different purposes. For example, function name will remain same but it may take different number of arguments and can do different tasks. Pascal classes implement polymorphism. Objects do not implement polymorphism.

  • Overloading − It is a type of polymorphism in which some or all of operators have different implementations depending on the types of their arguments. Similarly functions can also be overloaded with different implementation. Pascal classes implement overloading, but the Objects do not.

  • Data Abstraction − Any representation of data in which the implementation details are hidden (abstracted).

  • Encapsulation − Refers to a concept where we encapsulate all the data and member functions together to form an object.

  • Constructor − Refers to a special type of function which will be called automatically whenever there is an object formation from a class or an Object.

  • Destructor − Refers to a special type of function which will be called automatically whenever an Object or Class is deleted or goes out of scope.

Defining Pascal Objects

An object is declared using the type declaration. The general form of an object declaration is as follows −

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

Let us define a Rectangle Object that has two integer type data members - length and width and some member functions to manipulate these data members and a procedure to draw the rectangle.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

After creating your objects, you will be able to call member functions related to that object. One member function will be able to process member variable of related object only.

Following example shows how to set lengths and widths for two rectangle objects and draw them by calling the member functions.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Following is a complete example to show how to use objects in Pascal −

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

When the above code is compiled and executed, it produces the following result −

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Visibility of the Object Members

Visibility indicates the accessibility of the object members. Pascal object members have three types of visibility −

Sr.No Visibility & Accessibility
1

Public

The members can be used by other units outside the program unit

2

Private

The members are only accessible in the current unit.

3

Protected

The members are available only to objects descended from the parent object.

By default, fields and methods of an object are public and are exported outside the current unit.

Constructors and Destructors for Pascal Objects −

Constructors are special type of methods, which are called automatically whenever an object is created. You create a constructor in Pascal just by declaring a method with a keyword constructor. Conventionally, the method name is Init, however, you can provide any valid identifier of your own. You can pass as many arguments as you like into the constructor function.

Destructors are methods that are called during the destruction of the object. The destructor methods destroy any memory allocation created by constructors.

Following example will provide a constructor and a destructor for the Rectangle class which will initialize length and width for the rectangle at the time of object creation and destroy it when it goes out of scope.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Vererbung für Pascal-Objekte

Pascal-Objekte können optional von einem übergeordneten Objekt erben. Das folgende Programm veranschaulicht die Vererbung in Pascal-Objekten. Lassen Sie uns ein anderes Objekt mit dem Namen erstellenTableTop, die vom Rectangle-Objekt erbt.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Im Folgenden sind die wichtigen Punkte aufgeführt, die notiert werden sollten:

  • Das Objekt Tabletop hat alle Mitglieder des Rectangle-Objekts geerbt.

  • Es gibt auch eine Zeichenmethode in TableTop . Wenn das Ziehverfahren eines aufgerufen wird TableTop Objekt, wird TableTop der Auslosung aufgerufen.

  • Es gibt eine implizite Instanz mit dem Namen self das bezieht sich auf die aktuelle Instanz des Objekts.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Sie haben gesehen, dass Pascal-Objekte einige Merkmale eines objektorientierten Paradigmas aufweisen. Sie implementieren Kapselung, Verstecken von Daten und Vererbung, haben aber auch Einschränkungen. Zum Beispiel nehmen Pascal-Objekte nicht am Polymorphismus teil. Daher werden Klassen häufig verwendet, um ein korrektes objektorientiertes Verhalten in einem Programm zu implementieren, insbesondere in der GUI-basierten Software.

Eine Klasse wird fast genauso definiert wie ein Objekt, ist jedoch eher ein Zeiger auf ein Objekt als auf das Objekt selbst. Technisch bedeutet dies, dass die Klasse auf dem Heap eines Programms zugewiesen wird, während das Objekt auf dem Stapel zugewiesen wird. Mit anderen Worten, wenn Sie eine Variable als Objekttyp deklarieren, nimmt sie auf dem Stapel so viel Platz ein wie die Größe des Objekts. Wenn Sie jedoch eine Variable vom Klassentyp deklarieren, nimmt sie immer die Größe eines Zeigers an auf dem Stapel. Die tatsächlichen Klassendaten befinden sich auf dem Heap.

Pascal-Klassen definieren

Eine Klasse wird wie ein Objekt mithilfe der Typdeklaration deklariert. Die allgemeine Form einer Klassendeklaration lautet wie folgt:

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

Es lohnt sich, folgende wichtige Punkte zu beachten:

  • Klassendefinitionen sollten nur unter den Typdeklarationsteil des Programms fallen.

  • Eine Klasse wird mit dem definiert class Stichwort.

  • Felder sind Datenelemente, die in jeder Instanz der Klasse vorhanden sind.

  • Methoden werden innerhalb der Definition einer Klasse deklariert.

  • Es gibt einen vordefinierten Konstruktor namens Createin der Root-Klasse. Jede abstrakte Klasse und jede konkrete Klasse ist ein Nachkomme von Root, daher haben alle Klassen mindestens einen Konstruktor.

  • Es gibt einen vordefinierten Destruktor namens Destroyin der Root-Klasse. Jede abstrakte Klasse und jede konkrete Klasse ist ein Nachkomme von Root, daher haben alle Klassen mindestens einen Destruktor.

Definieren wir eine Rechteckklasse mit zwei Datenelementen vom Typ Integer - Länge und Breite sowie einige Elementfunktionen zum Bearbeiten dieser Datenelemente und eine Prozedur zum Zeichnen des Rechtecks.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

Schreiben wir ein vollständiges Programm, das eine Instanz einer Rechteckklasse erstellt und das Rechteck zeichnet. Dies ist das gleiche Beispiel, das wir bei der Erörterung von Pascal-Objekten verwendet haben. Sie werden feststellen, dass beide Programme mit den folgenden Ausnahmen fast gleich sind:

  • Sie müssen die Anweisung {$ mode objfpc} einschließen, um die Klassen verwenden zu können.

  • Sie müssen die Anweisung {$ m +} für die Verwendung von Konstruktoren einschließen.

  • Die Klasseninstanziierung unterscheidet sich von der Objektinstanziierung. Nur das Deklarieren der Variablen schafft keinen Platz für die Instanz. Sie verwenden den Konstruktor create, um Speicher zuzuweisen.

Hier ist das vollständige Beispiel -

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

Sichtbarkeit der Klassenmitglieder

Sichtbarkeit gibt die Zugänglichkeit der Klassenmitglieder an. Pascal-Klassenmitglieder haben fünf Arten der Sichtbarkeit -

Sr.Nr. Sichtbarkeit und Zugänglichkeit
1

Public

Diese Mitglieder sind immer erreichbar.

2

Private

Auf diese Mitglieder kann nur in dem Modul oder der Einheit zugegriffen werden, die die Klassendefinition enthält. Sie können von innerhalb oder außerhalb der Klassenmethoden aufgerufen werden.

3

Strict Private

Auf diese Mitglieder kann nur über Methoden der Klasse selbst zugegriffen werden. Andere Klassen oder untergeordnete Klassen in derselben Einheit können nicht auf sie zugreifen.

4

Protected

Dies ist dasselbe wie privat, außer dass diese Mitglieder für absteigende Typen zugänglich sind, selbst wenn sie in anderen Modulen implementiert sind.

5

Published

Dies ist dasselbe wie ein Public, aber der Compiler generiert Typinformationen, die für das automatische Streaming dieser Klassen benötigt werden, wenn sich der Compiler im Status {$ M +} befindet. In einem veröffentlichten Abschnitt definierte Felder müssen vom Klassentyp sein.

Konstruktoren und Destruktoren für Pascal-Klassen

Konstruktoren sind spezielle Methoden, die automatisch aufgerufen werden, wenn ein Objekt erstellt wird. Wir nutzen dieses Verhalten also voll aus, indem wir viele Dinge durch Konstruktorfunktionen initialisieren.

Pascal bietet eine spezielle Funktion namens create () zum Definieren eines Konstruktors. Sie können beliebig viele Argumente an die Konstruktorfunktion übergeben.

Im folgenden Beispiel wird ein Konstruktor für eine Klasse mit dem Namen "Bücher" erstellt und der Preis und der Titel für das Buch zum Zeitpunkt der Objekterstellung initialisiert.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Wie der implizite Konstruktor create gibt es auch eine implizite Destruktormethode destroy, mit der Sie alle in der Klasse verwendeten Ressourcen freigeben können.

Erbe

Pascal-Klassendefinitionen können optional von einer übergeordneten Klassendefinition erben. Die Syntax lautet wie folgt:

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

Das folgende Beispiel enthält eine Romanklasse, die die Books-Klasse erbt und je nach Anforderung weitere Funktionen hinzufügt.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Es lohnt sich, folgende wichtige Punkte zu beachten:

  • Die Mitglieder der Bücherklasse haben protected Sichtweite.

  • Die Novels-Klasse hat zwei Konstruktoren, also die overload Der Operator wird zum Überladen von Funktionen verwendet.

  • Das Books.Display-Verfahren wurde deklariert virtual, so dass die gleiche Methode aus der Novels-Klasse kann override es.

  • Der Novels.Create-Konstruktor ruft den Basisklassenkonstruktor mit dem auf inherited Stichwort.

Schnittstellen

Schnittstellen werden definiert, um den Implementierern einen gemeinsamen Funktionsnamen bereitzustellen. Verschiedene Implementierer können diese Schnittstellen entsprechend ihren Anforderungen implementieren. Man kann sagen, Schnittstellen sind Skelette, die von Entwicklern implementiert werden. Das Folgende ist ein Beispiel für eine Schnittstelle -

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

Beachten Sie, dass eine Klasse, wenn sie eine Schnittstelle implementiert, alle Methoden der Schnittstelle implementieren sollte. Wenn eine Methode einer Schnittstelle nicht implementiert ist, gibt der Compiler einen Fehler aus.

Abstrakte Klassen

Eine abstrakte Klasse kann nicht instanziiert, sondern nur vererbt werden. Eine abstrakte Klasse wird angegeben, indem das Wortsymbol abstrakt wie folgt in die Klassendefinition aufgenommen wird:

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

Beim Erben von einer abstrakten Klasse müssen alle in der Klassendeklaration des Elternteils als abstrakt gekennzeichneten Methoden vom Kind definiert werden. Darüber hinaus müssen diese Methoden mit derselben Sichtbarkeit definiert werden.

Statisches Schlüsselwort

Wenn Sie Klassenmitglieder oder Methoden als statisch deklarieren, können Sie auf sie zugreifen, ohne dass eine Instanziierung der Klasse erforderlich ist. Auf ein als statisch deklariertes Mitglied kann nicht mit einem instanziierten Klassenobjekt zugegriffen werden (obwohl dies mit einer statischen Methode möglich ist). Das folgende Beispiel veranschaulicht das Konzept -

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

12
31
31
51
51

Sie müssen die Direktive {$ static on} verwenden, um die statischen Elemente zu verwenden.