Einführung in die Informatik,
Algorithmen und Datenstrukturen
Teil 1 - Thema 5
Programmiekonzepte – imperatives Paradigma
Programmiersprachen – Paradigmen der
Programmierung
Paradigma
„Das Wort Paradigma kommt aus dem
Griechischen und Bedeutet Beispiel, Vorbild, Muster oder auch Abgrenzung.
Wörtlich müsste man den Begriff mit „nebenher Gezeigtes“ übersetzen. Heute wird der Begriff häufig im Sinne eines Denkmusters benutzt, als ein höher geordnetes Prinzip, nach dem man vorgeht.“
/Forbrig, Peter, Immo O. Kerner; Programmierung – Paradigmen und Konzepte; Fachbuchverlag Leipzig; 2006; S.11/
Programmierparadigma
„Ein Programmierparadigma ist das einer Programmiersprache oder einer
Programmiertechnik zu Grunde liegende Prinzip entweder zur Beschreibung von Arbeitsabläufen für einen Computer (imperativ) oder zur
Beschreibung der Aufgabenstellung (deklarativ)“.
/Forbrig, Peter, Immo O. Kerner; Programmierung – Paradigmen und Konzepte; Fachbuchverlag Leipzig; 2006; S.12/
Programmierparadigmen
imperativ
• Programm ist Folge elementarer Anweisungen
• Programmausführung ist Abarbeitung der Anweisungen
deklarativ - funktional
• Programm als Funktion von Eingabe- in Ausgabewerte
• Programmausführung ist die Berechnung der Funktion
deklarativ - logisch
• Programm als Sammlung von Fakten und Regeln
• Programmausführung ist die Suche nach Antworten auf Fragen
objektorientiert
• Programm ist eine Menge von Klassen und Objekten
• Programmausführung ist Interaktion zwischen Objekten
/Forbrig, Peter, Immo O. Kerner; Programmierung – Paradigmen und Konzepte; Fachbuchverlag
Programmiersprachen –
Prinzipien des Entwurfs
Prinzipien des Sprachentwurfs
Effizienz
• Optimierbarkeit - der Übersetzer sollte effizienten, ausführbaren Code erzeugen
• Effizienz der Übersetzung - Ermöglicht der
Sprachentwurf, dass Quellprogramme effizient übersetzt werden?
• Programmiereffizienz - Wie schnell und wie einfach können Programme in der Sprache geschrieben werden?
Prinzipien des Sprachentwurfs
Allgemeingültigkeit
Spezialfälle werden bei der Verfügbarkeit oder Verwendung von Konstrukten vermieden.
Orthogonalität
Sprachkonstrukte können auf jede sinnvolle weise kombiniert werden. Die Wechselwirkung von
Konstrukten oder der Kontext ihrer Verwendung verursachen keine unerwarteten Beschränkungen oder unerwartetes Verhalten.
Uniformität
Prinzipien des Sprachentwurfs
Einfachheit
Alles sollte so einfach wie möglich gemacht werden, aber nicht einfacher. /Einstein/
Ausdruckskraft
Ausdruckskraft ist die Leichtigkeit, mit der eine Sprache komplexe Prozesse und Strukturen ausdrücken kann.
Genauigkeit
Genauigkeit (Definitheit) ist das Vorhandensein einer genauen Definition einer Sprache, so dass das
Verhalten von Programmen vorhergesagt werden
Prinzipien des Sprachentwurfs
Maschinenunabhängigkeit
Verwendung unabhängiger Datentypen, die keine Einzelheiten über die Speicherzuteilung oder
Maschinenarchitektur berücksichtigen.
Sicherheit
Programmierfehler vereiteln und das Auffingen von Fehlern unterstützen. (z.B. durch Typenüberprüfung) Erweiterbarkeit
Der Benutzer kann der Sprache neue Eigenschaften
Programmiersprachen – Konzept der prozeduralen Programmierung am Beispiel
von Object-Pascal/Delphi
Prozedurale Programmierung
Die prozedurale Programmierung basiert auf dem imperativen Programmierparadigma.
Es war das ursprüngliche Paradigma und die darauf basierenden Sprachen haben heute bei Anwendern in Wissenschaft und Wirtschaft immer noch die
größte Verbreitung. Eine der Ursachen besteht darin, dass dieses Konzept auf die John-von- Neumann-Architektur abgestimmt ist, nach der heute fast alle Computer arbeiten.
Prozedurale Programmierung
Grundlage des imperativen Programmierkonzeptes sind die prozeduralen Befehle, die auch als
Anweisungen bezeichnet werden. Für diese Befehle gilt, dass das Steuerwerk des Computers zuerst eine Fertigmeldung generieren muss, bevor der nächste Befehl abgearbeitet werden kann. Damit wird eine Änderung des Zustandes oder der Umwelt des
Computers erreicht. Ist es für einen Befehl
erforderlich, dass zusätzlich zur Fertigmeldung auch noch ein Wert zurückgegeben wird, so wird dieser Befehl als funktionaler Befehl bezeichnet.
Prozedurale Programmiersprachen
Eine (prozedurale) Programmiersprache ist Turing- vollständig, wenn sie
• ganzzahlige Variablen und Arithmetik besitzt und
• Anweisungen sequentiell ausführt, einschließlich Zuweisungen,
Fallunterscheidungen (if) und Schleifen (while).
Theoretische Basis der prozeduralen Programmierung
Registermaschine:
Eine Registermaschine ist ein Automat, dessen Speicher aus einer fes- ten Anzahl von Registern besteht. In jedem Register kann eine beliebig große natürliche Zahl gespeichert werden.
Das Steuerwerk erlaubt die Anwendung von drei Operationen auf Re- gister und deren Inhalte.
Vergrößern des Inhalts (Addition) von Register m um 1 (Nachfolger- funktion) : Am
Verringern des Inhalts (Subtraktion) von Register m um 1 (Vorgänger- funktion) : Sm
Abfrage des Inhalts von Register m auf 0 : Tm
Programm einer Registermaschine
Ein Programm besteht aus einer Liste von markierten oder numerierten Befehlen Bi oder Anweisungen. Es gibt zwei Formen von Befehlen:
1. Tripel: (i, f, j) (i ::= marke, f ::= Operation Am oder Sm, j ::=
marke zu der nach Ausführung der Operation gegangen wird) 2. Quadrupel (i,Tm, j, k) (i ::= marke, Tm ::= Test auf 0, j ::=
marke, zu der verzweigt wird, wenn Register m = 0, k ::=
marke, zu der verzweigt wird, wenn Register m <> 0)
Befehle einer Registermaschine liegen stets in einer Zwei- Adressform vor. Dabei sind es entweder eine Register und eine Befehls-(Folge)adresse oder zwei Befehlsadressen.
Arbeit mit Registermaschinen
Zur Arbeit mit Registermaschinen wird allgemein vereinbart:
1. Das Programm einer Registermaschine startet immer mit dem Befehl 0.
2. Das Programm einer Registermaschine endet, wenn die in einem Befehl angegebene
Folgenummer nicht in der Liste als Nummer eines der Programmbefehle enthalten ist.
3. Startparameter stehen immer in den ersten
Registern. Resultatparameter stehen wiederum in den ersten Registern.
Definition Programm
In Programmen werden Daten in Datenstrukturen zusammengefasst, die dann durch
Kontrollstrukturen,die den Algorithmus repräsentieren, bearbeitet werden.
Algorithmen + Datenstrukturen = Programme (Wirth 1976)
Variablen
Eine Variable ist eine Größe, der ein Wert
zugeordnet werden kann. Sie kann als Operand z.B. in arithmetischen und logischen Ausdrücken auftreten. Ihre Merkmale sind
- Name, - Typ,
- Wert und
- Speicheradresse.
Variablen
Ein Variablenname sollte immer mit dem Zeichen V beginnen.
Jede verwendete Variable muss deklariert werden.
Bei der Variablendeklaration wird der Name und Typ festgelegt.
Der Anfangswert einer Variablen in PASCAL ist unbestimmt und von der zufälligen Belegung der Speicherzelle abhängig. In Delphi wird einer
globalen numerischen Variable der Startwert 0 zugewiesen.
Variablendeklaration
VAR variablen-
name
: typ
;
;
,
Variablendeklaration
bezeichner
Variablenname
Konstanten
Eine Konstante ist ein vereinbarter Bezeichner, der innerhalb des entsprechenden Blocks für einen konstanten Wert steht bzw. ein Wert selbst. Im Konstantendeklarationsteil sind die Definitionen aller Synonyme für Konstanten enthalten, die in einem Block auftreten.
CONST konstanten- name
konstante
= ;
Konstantendeklaration
Konstantendeklaration
Konstante
vorzeichen vorzeichenlose zahl
konstantenname zeichenkette
ausdruck
Konstantendeklaration
typisierte Konstante
CONST konstan- tenbe-
zeichner
: typ = kon- stan- te
;
;
Ausdrücke
Ausdrücke bestehen aus Operatoren und Operanden.
Ein Ausdruck steht immer für einen Wert.
Bei der Abarbeitung der Ausdrücke gelten folgende Regeln:
• Ein Operand zwischen zwei Operatoren von unterschiedlichem Rang ist immer an den höherrangigen Operator gebunden.
• Ein Operand zwischen zwei gleichrangigen Operatoren ist immer an den Operator gebunden, der links von ihm steht.
• Ausdrücke in Klammern werden als einzelner Operand betrachtet und immer als erstes abgearbeitet.
Wertzuweisungen
variable := ausdruck
Wertzuweisung
Werden in einem Ausdruck variablen verwendet, so ist eine Entreferenzierung notwendig. Diese ist ggf. mit einer
Typenanpassung verbunden.
Rolle des Semikolon
Das Semikolon ist ein Trennzeichen in der
Anweisungsfolge. Es ist ein Operator, der den
Übergang zur nächsten Anweisung veranlasst. Die vorhergehende Anweisung wird abgeschlossen.
Der Abschluss einer Anweisung erfolgt auch durch andere Zeichen z.B. end, then, else.
Durch die Zulassung der Leeranweisung ist es möglich, dass z.B. ein ; vor end steht.
Datentypen
Programmdaten können nach Typen klassifiziert werden.
Viele Programmiersprachen assoziieren den Typ einer Variablen durch ihre Deklaration.
„Ein Datentyp ist definiert durch eine Menge von Werten
zusammen mit einer Menge von Operationen, Funktionen und Relationen die auf diese Werten angewendet werden können.
Die Werte eines Typs besitzen eine gemeinsame, charakteristische Eigenschaft.“
Er beschreibt
• die Art der Werte, die gespeichert werden können,
• die interne Repräsentation der Werte und
• ggf. die Operationen die auf diese Werte ausgeführt werden
Datentypen
Zu jeder Programmiersprache gehört ein Satz
vordefinierter Datentypen, aus denen alle anderen Typen hergeleitet werden können. Diese Datentypen gehören in der Regel zu den einfachen
Datentypen.
Einfache Datentypen, die über eine Vorgänger- und Nachfolgerrelation verfügen, werden als ordinale Datentypen (Ordinaltypen) bezeichnet.
Datentypen
Mit Hilfe von Mengenoperationen können neue Datentypen konstruiert werden.
• Kartesisches Produkt RECORD
• Vereinigung
• Teilmengenbildung
• Potenzmengenbildung
• Funktionen ARRAY
Typ-Terminologie in Pascal
Pascal - Typen
einfache - Typen Zeigertypen strukturierte - Typen
Ordinal-
typen real array record set file
integer text boolean
char
Teilbereichs- typen
Aufzählungs- typen
ganzzahlige Datentypen in Object- Pascal
Typ Beschreibung Größe
ShortInt Wertebereich: -128 ... 127 1 Byte
SmallInt Wertebereich: -32768 ... 32767 2 Byte Integer Wertebereich: -2 147 483 648 ... 2 147 483 647 4 Byte Longint Wertebereich: -2 147 483 648 ... 2 147 483 647 4 Byte
Byte Wertebereich: 0 ... 255 1 Byte
Word Wertebereich: 0 ... 65535 2 Byte
LongWord Wertebereich: 0..4294967295 4 Byte Cardinal Wertebereich: 0 ... 4294967295 4 Byte Int64 Wertebereich: -2^63..2^63 -1 8 Byte
ganzzahlige Datentypen
+ -
ziffer
INTEGER
Datentypen für Zeichen und Zeichenketten in Object-Pascal
Typ Beschreibung Größe
Char Zeichen aus dem ASCII-Zeichensatz mit einer Ordnungsnummer zwischen 0 und 255
1 Byte
AnsiChar Byte-Zeichen, angeordnet entsprechend des erweiterten ANSI-Zeichensatzes
1 Byte
WideChar Word-Zeichen, angeordnet entsprechend des Unicode-Zeichensatzes. Die ersten 256
Zeichen entsprechen dem ANSI-Zeichensatz
2 Byte
Zeichenkettendatentypen
String AnsiString ($H+) oder ShortString ($H-), je nach Compilereinstellung
ShortString Zeichenkette mit max. 255 Zeichen (Länge+1) Byte AnsiString Zeichenkette unbegrenzter Länge 4 Byte WideString Zeichenkette unbegrenzter Länge mit 4 Byte
Zeichenkettendatentypen
CHAR/STRING
zeichen
'
'
Datentypen für Gleitkommazahlen in Object-Pascal
Typ Beschreibung Größe
Single einfachgenaue Gleitkommazahl
Wertebereich : 1.5*10^-45 ... 3.4*10^38 Genauigkeit : 7 - 8 Stellen
4 Byte
Double doppeltgenaue Gleitkommazahl
Wertebereich : 5.0*10^-324 ... 1.7*10^308 Genauigkeit : 15 - 16 Stellen
8 Byte
Extended extremgenaue Gleitkommazahl
Wertebereich : 1.9*10^-4951 ... 1.1*10^4932 Genauigkeit : 19 - 20 Stellen
10 Byte
Comp doppeltlange, ganze Zahl
Wertebereich: -9.2 *10^18 ... 9.2 *10^18 Genauigkeit : 18 - 19 Stellen Genauigkeit
8 Byte
Currency auf vier Nachkommastellen skalierte Festkommazahl Wertebereich: -922.337.203.685.477,5808 ...
922.337.203.685.477,5807
2 Byte
Real doppeltgenaue Gleitkommazahl
Wertebereich : 5.0*10^-324 ... 1.7*10^308
8 Byte
Datentypen für Gleitkommazahlen
REAL
integer . ziffer E integer
Variante Datentypen
Der Datentyp Variant wird für Variablen verwendet, wenn zum Zeitpunkt des Compilierens noch nicht feststeht.
Variablen des Typs Variant können zur Laufzeit die verschiedenen einfachen Datentypen annehmen.
Eine Variable vom Typ Variant belegt 16 Byte Speicher und besteht aus einem Typencode und einem Wert (bzw. einem Zeiger auf einen Wert), dessen Typ durch den Code
festgelegt ist. Sie wird bei der Erstellung mit dem speziellen Wert Unassigned initialisiert.
Der Typecode kann mit der Funktion VarType ermittelt werden.
Typenkompatibilität
Kompatibilität von Typen
In Pascal werden zwei beliebige Unterbereiche des selben Typs als kompatibel bezeichnet.
Verwendung von Operatoren
Operatoren sind in der Regel an Datentypen gebunden. Führt der gleiche Operator bei unterschiedlichen Datentypen
unterschiedliche Operationen aus, so wird er als überladen gekennzeichnet.
Typanpassung
Typumwandlungen können durch implizite Typumwandlungen
(Typanpassung) oder durch explizite Typumwandlungen (Datentyp wird vorangestellt) durchgeführt werden.
Steuerung des Kontrollflusses
Steuerungsmechanismen in Programmiersprachen
Bewachte und bedingte Anweisungen
Schleifen
Goto - Anweisungen
Prozeduren
Bewachte und bedingte Anweisungen
Die bewachten if-Anweisungen wurden von E. W. Dijkstra eingeführt:
if B1 -> S1
| B2 -> S2
| B3 -> S3 ...
| Bn -> Sn fi
Die booleschen Ausdrücke Bi werden als Wächter bezeichnet. Si sind die entsprechenden Anweisungsfolgen. Wenn eines der Bi als wahr ausgewertet wird, so wird die entsprechende
Anweisungsfolge Si ausgeführt. Es wird genau eine
Anweisungsfolge ausgeführt. Da keine Aussage darüber gemacht wird, welches Bi ausgewertet wird, führt das bewachte if den
Nichtdeterminismus in die Programmierung ein.
If - Anweisungen
If - Anweisung im Pascal
<if-anweisung> ::= if <boolescher_ausdruck> then <anweisung>
[else <anweisung>]
Problem: dangeling-else-Problem oder
Welches else gehört zu welchem if?
Lösung: Regel der engsten Schachtelung
Das else wird zu dem if assoziert, dem es am nächsten steht.
case - Anweisungen
Die case-Anweisung ist ein spezieller Fall des bewachten if, bei dem die Wächter Ordinalwerte sind, die von einem Ordinalausdruck
ausgewählt werden.
Einige Sprachimplementationen lassen einen eles (default)-Zweig zu.
Pascal - Beispiel:
case i of
1 : <anweisung>
2..4 : <anweisung>
4..8 : <anweisung>
else <anweisung>
end { of case }
Schleifen
Entsprechend dem bewachten if kann ein bewachtes do definiert werden:
do B1 -> S1
| B2 -> S2
| B3 -> S3 ...
| Bn -> Sn od
Diese Anweisung wird solange wiederholt, bis alle Bi falsch sind. Bei jedem Schritt wird eines der wahren Bi nichtdeterministisch ausgewählt, und das
while- Schleife
bewachtes do mit einem Wächter - die WHILE- SCHLEIFE.
WHILE B DO S
In dieser Anweisung wird zuerst ein boolescher Ausdruck B ausgewertet. Ist er wahr, so wird die Anweisung S (Verbundanweisung) ausgeführt.
Anschließend wird die Bedingung B erneut
ausgewertet. Die Anweisung S wird nie ausgeführt, wenn B am Beginn falsch ist (abweisender Zyklus).
for- Schleife
Für for- Schleifen ist in der Regel eine
KONTROLLVARIABLE, ein ANFANGSWERT, ein ENDWERT und ggf. noch eine SCHRITTWEITE notwendig.
Die Schleife wird ausgeführt, indem zunächst die Schranken (Anfangswert, Endwert) ausgewertet werden. Anschließend wird der Kontrollvariable der Anfangswert zugewiesen. Dieser wird bei jedem Durchlauf um die Schrittweite inkrementiert
(dekrementiert).
Anzahl der Durchläufe: | Endwert - Anfangswert | + 1
for- Schleife
Bei der Verwendung dieser Schleifenform treten einige Einschränkungen auf.
• Der Wert der Kontrollvariablen kann im Zykluskörper nicht geändert werden.
• Der Wert der Kontrollvariablen ist nach dem Verlassen der Schleife nicht definiert.
• Für die Kontrollvariable stehen nur eingeschränkte Datentypen, in der Regel ordinale Datentypen, zur Verfügung.
Blockorientierung
Ein (benannter) Block fasst eine oder mehrere
Aktionen oder Verarbeitungen unter einem Bezeichner N zusammen und macht die Schnittstellen dieser
Aktionen nach außen über eine Parameterliste explizit.
Der Block beschreibt einen eigenständigen Algorithmus, der ein abgeschlossener Teil des gesamten Algorithmus ist.
Verwendet ein Algorithmus diesen Block, so „ruft“ er ihn über den Namen und die Parameterliste auf.
Blockorientierung - Prozeduren
Eine Prozedur ist ein Konstrukt in einer
Programmiersprache, um von einer Gruppe von Aktionen oder Berechnungen zu abstrahieren.
Die Gruppe von Aktionen nennt man Rumpf der
Prozedur. Dieser Rumpf wird als Ganzes durch den Namen der Prozedur repräsentiert.
Eine Prozedur wird durch Spezifizieren Ihres Namens, ihrer Parameter und ihres Rumpfes deklariert.
Eine Prozedur wird aufgerufen, indem man den
Prozedurnamen zusammen mit den Argumenten für den Aufruf angibt.
Funktionsabstraktion/
Prozedurabstraktion
Eine Funktionsabstraktion abstrahiert von einem Ausdruck. Eine Funktionsabstraktion hat also einen Rumpf, der ein Ausdruck ist, und ein Funktionsaufruf ist ein Ausdruck, der einen Wert liefert, indem er den Rumpf der Funktionsabstraktion auswertet.
Eine Prozedurabstraktion abstrahiert von einem Befehl. Eine Prozedurabstraktion hat also einen
Rumpf, der ein Befehl ist, und einen Prozeduraufruf, der ein Befehl ist der Variablen überschreibt, indem er den Rumpf der Prozedurabstraktion ausführt.
Parameterübergabe zwischen Blöcken
Zum Datenaustausch zwischen den Blöcken stehen drei Grundformen zur Verfügung:
• Datenübergabe mittels gemeinsamer – globaler – Speicherbereiche
• Datenübergabe durch Verweis
• Datenübergabe durch Wert
Datenübergabe durch globale Speicherbereiche
Der Datenaustausch kann über die Nutzung globaler Variablen vorgenommen werden.
Globale Variablen sind immer die Eigenschaften der Komponenten.
Weiterhin besteht die Möglichkeit, im entsprechenden Deklarationsteil Variablen modulglobal (Gültigkeit in der entsprechenden UNIT) oder projektglobal zu deklarieren.
Globale Variablen sollten nur für globale Größen verwendet werden, da sonst die Universalität der
Parameterübergabe an Prozeduren
Wertübergabe:
Die Argumente (Aktualparameter) sind Ausdrücke, die zum Zeitpunkt des Aufrufes ausgewertet werden.
Deren Werte werden bei der Ausführung der Prozedur die Werte der Parameter (Formalparameter).
Call by value
Eine Veränderung der formalen Parameter wirkt sich nicht nach außen aus.
Die Wertrückgabe kann nach dem gleichen Verfahren realisiert werden, dann werden diese Parameter als Resultatparameter bezeichnet (z.B. bei Funktionen).
Parameterübergabe an Prozeduren in Delphi - Wertparameter
Wertparameter repräsentieren die
Parameterübergabeform „Call by value“.
Beispiel - Deklaration:
procedure P_test(a,b:real; i,j:integer);
Beispiel – Aufruf:
P_test(x,sin(x),y,2*a)
Die Formalparameter verhalten sich innerhalb der Prozedur wie lokale Variable.
Die Aktualparameter müssen zuweisungsverträglich zu den Formalparametern sein!
Parameterübergabe an Prozeduren in Delphi - Konstantenparameter
Konstantenparameter entsprechen dem Konzept „Call by Value“. Ihr Wert kann in der Prozedur nicht
verändert werden. Sie verhalten sich wie lokale, einfache Konstanten. Bei der Deklaration sind sie dadurch gekennzeichnet, dass der Bezeichner const vorangestellt wird.
CONST bezeichner : typ
Die Aktualparameter können Ausdrücke sein und müssen zuweisungsverträglich zu den
Formalparametern sein!
Beispiel: procedure P_test1 ( const a,b:real);
Parameterübergabe an Prozeduren
Referenzübergabe: (Datenübergabe durch Verweis) Die Argumente (Aktualparameter) sind Variablen mit zugeteilten Speicherplätzen. Zum Zeitpunkt des
Aufrufes wird der Speicherplatz der Variablen
übergeben, so dass der Parameter (Formalparameter) zu einem Aliasnamen für das Argument wird.
call by reference
Vorteile:
• die Daten müssen selbst nicht kopiert werden,
• alle Operationen finden an den Originaldaten des aufrufenden
Parameterübergabe an Prozeduren in Delphi - Variablenparameter
Variablenparameter repräsentieren die
Parameterübergabeform „call by reference“. Beim
Aufruf des Unterprogramms wird der Adresse der in der aktuellen Parameterliste angegeben Variablen ein
zweiter Bezeichner (Aliasname) zugewiesen. Damit weist der Bezeichner in der Aktualparameterliste und der Bezeichner in der Formalparameterliste auf die gleiche Speicherzelle.
Parameterübergabe an Prozeduren in Delphi - Variablenparameter
Jede Operation, in die der Formalparameter einbezogen ist, wird am Aktualparameter ausgeführt. Dazu ist es
notwendig, dass Formalparameter und Aktualparameter Variablen von identischem Typ sind.
Die Variablenparameter haben innerhalb des
Unterprogramms die Eigenschaften einer lokalen
Variablen, die vor Betreten des Blockes initialisiert sein kann.
Beispiel:
procedure test1 ( var a,b:real);
Parameterübergabe an Prozeduren in Delphi – Untypisierte Parameter
Auch die untypisierten Parameter sind eine Erweiterung des Delphi. Sie können in Verbindung mit Variablen-
oder Konstantenparameter benutzt werden. Es erfolgt keine Typangabe in der Prozedurdeklaration. Der
Parameter wird in der Prozedur als untypisiert
behandelt. Soll dieser Parameter verwendet werden, so muss eine explizite Typumwandlung durchgeführt
werden.
const bezeichner | var bezeichner
Beispiel: procedure P_rechnen( var a);
begin
integer(a) := integer(a) * 5;
Parameterübergabe an Prozeduren in Delphi – Default-Parameter
Der Standardwert, ein konstanter Ausdruck, wird hinter dem Parametertyp angegeben. Die Verbindung erfolgt durch Gleichheitszeichen. Wird der entsprechende
Parameter beim Unterprogrammaufruf nicht
angegeben, so wird der Standardwert eingesetzt. In der Deklaration können alle Parameter der Liste mit Standardparametern versehen werden. Die
Standardparameter müssen am Ende der Parameterliste stehen.
Die Verwendung von Standardparametern ist auf „Call by Value“-Parameter beschränkt.
Parameterübergabe an Prozeduren in Delphi – Default-Parameter
Default-Parameter (Beispiel) bezeichner : typ = wert Beispiel:
procedure teilen (var x : real; teiler : integer = 1);
begin
x := x / teiler;
end;
Aufrufe:
b := 28.3;
teilen(b);
button1.caption := floattostr(b);
teilen(b,5);
label1.caption := floattostr(b);
Regeln für die Konstruktion von Blöcken
1. Bezeichner, auf die außerhalb des Blockes kein Bezug genommen wird, sind lokal zu deklarieren.
2. Die Verwendung von globalen Daten sollte auf Ausnahmefälle beschränkt bleiben und ist dann durch eine verwendet-Klausel zu dokumentieren.
3. Wenn möglich, sind Wertparameter zu verwenden.
4. Referenzparameter sind nur für Daten zu verwenden, die außerhalb des Blockes manipuliert werden sollen.
5. Zur Unterstützung von Übersichtlichkeit, Wiederverwendbarkeit und Verifizierbarkeit von Algorithmen sollten geeignete Teile auch dann zu Algorithmen zusammengefasst werden, wenn diese im gesamten Algorithmus nur einmal aufgerufen werden.
Lebensdauer von Daten und Blöcken
Wird ein Block (z.B. Prozedur) aufgerufen, so
1. wird eine Instanz (Inkarnation) des Blockes erzeugt, 2. wird für die lokalen Variablen und Formalparameter
der Speicherplatz zur Verfügung gestellt, 3. werden die Aktualparameter des Aufrufs ausgewertete und zur Initialisierung der Formalparameter verwendet,
4. wird der Verarbeitungsteil durchlaufen,
5. werden die Resultatparameter zurückgegeben und 6. wird der Speicherplatz für die Instanz des Blockes
freigegeben.
Kontrollfragen
1. Beschreiben Sie das Paradigma der imperativen (prozeduralen)
Programmierung. Was versteht man unter prozeduralen und funktionalen Befehlen? Erläutern Sie die theoretische Basis der prozeduralen
Programmierung, die Registermaschine.
2. Erklären Sie das Konzept der Blockorientierung bei Programmiersprachen.
Zeigen Sie die Umsetzung dieses Konzeptes im Object-Pascal am Beispiel der Prozedur. Erläutern Sie die Lebensdauer von Daten und Blöcken am Beispiel der Abarbeitung einer Prozedur.
3. Welche Eigenschaften sollte ein Softwareentwurfssystem haben? Vergleichen Sie die Einsatzgebiete professionelle Softwareentwicklungswerkzeuge und spezieller Softwareentwicklungswerkzeuge für die Ausbildung.
4. Erklären Sie die Entwurfsprinzipien einer Programmiersprache:
Allgemeingültigkeit, Orthogonalität und Uniformität. Geben Sie 2 Beispiele aus der Programmiersprache Object-Pascal an, die diese Entwurfsprinzipien
unterstützen oder verletzen.
5. Erklären Sie die Begriffe „Defaultparameter“ und „untypisierter Parameter“.
Literatur:
/DUDEN03/ Basiswissen Schule – Informatik Abitur
PAETEC Verlag für Bildungsmedien Berlin, 2003 ISBN 3-89818-065-4
/HORN03/ Horn, Christian; Immo O. Kerner; Forbrig, Peter Lehr- und Übungsbuch Informatik
Band 1: Grundlagen und Überblick
Fachbuchverlag Leipzig; 2003; ISBN 3-446-22543-9 /FORBRIG06/ Forbrig, Peter; Immo O. Kerner
Lehr- und Übungsbuch Informatik
Programmierung – Paradigmen und Konzepte
Fachbuchverlag Leipzig; 2006; ISBN 3-446-40301-9 /LOUDEN94/ Louden, Kenneth C.
Programmiersprachen
Thomson Publishing International Bonn, 1994; ISBN 3-929821-03-6