• Keine Ergebnisse gefunden

Einführung in die Informatik, Algorithmen und Datenstrukturen. Teil 1 - Thema 5 Programmiekonzepte imperatives Paradigma

N/A
N/A
Protected

Academic year: 2022

Aktie "Einführung in die Informatik, Algorithmen und Datenstrukturen. Teil 1 - Thema 5 Programmiekonzepte imperatives Paradigma"

Copied!
65
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Einführung in die Informatik,

Algorithmen und Datenstrukturen

Teil 1 - Thema 5

Programmiekonzepte – imperatives Paradigma

(2)

Programmiersprachen – Paradigmen der

Programmierung

(3)

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/

(4)

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/

(5)

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

(6)

Programmiersprachen –

Prinzipien des Entwurfs

(7)

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?

(8)

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

(9)

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

(10)

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

(11)

Programmiersprachen – Konzept der prozeduralen Programmierung am Beispiel

von Object-Pascal/Delphi

(12)

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.

(13)

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.

(14)

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).

(15)

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

(16)

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.

(17)

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.

(18)

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)

(19)

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.

(20)

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.

(21)

Variablendeklaration

VAR variablen-

name

: typ

;

;

,

Variablendeklaration

bezeichner

Variablenname

(22)

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

(23)

Konstantendeklaration

Konstante

vorzeichen vorzeichenlose zahl

konstantenname zeichenkette

ausdruck

(24)

Konstantendeklaration

typisierte Konstante

CONST konstan- tenbe-

zeichner

: typ = kon- stan- te

;

;

(25)

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.

(26)

Wertzuweisungen

variable := ausdruck

Wertzuweisung

Werden in einem Ausdruck variablen verwendet, so ist eine Entreferenzierung notwendig. Diese ist ggf. mit einer

Typenanpassung verbunden.

(27)

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.

(28)

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

(29)

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.

(30)

Datentypen

Mit Hilfe von Mengenoperationen können neue Datentypen konstruiert werden.

• Kartesisches Produkt RECORD

• Vereinigung

• Teilmengenbildung

• Potenzmengenbildung

• Funktionen ARRAY

(31)

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

(32)

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

(33)

ganzzahlige Datentypen

+ -

ziffer

INTEGER

(34)

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

(35)

Zeichenkettendatentypen

CHAR/STRING

zeichen

'

'

(36)

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

(37)

Datentypen für Gleitkommazahlen

REAL

integer . ziffer E integer

(38)

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.

(39)

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.

(40)

Steuerung des Kontrollflusses

Steuerungsmechanismen in Programmiersprachen

 Bewachte und bedingte Anweisungen

 Schleifen

 Goto - Anweisungen

 Prozeduren

(41)

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.

(42)

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.

(43)

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 }

(44)

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

(45)

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).

(46)

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

(47)

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.

(48)

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.

(49)

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.

(50)

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.

(51)

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

(52)

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

(53)

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).

(54)

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!

(55)

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);

(56)

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

(57)

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.

(58)

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);

(59)

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;

(60)

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.

(61)

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);

(62)

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.

(63)

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.

(64)

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“.

(65)

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

Referenzen

ÄHNLICHE DOKUMENTE

Welche System-G¨ utekriterien sind in folgender Fallstudie verletzt worden und durch welche konstruktiven Maßnahmen k¨ onnte ¨ Ahnliches beim zuk¨ unftigen Einsatz von

Ein Algorithmus ist eine endliche Folge von eindeutigen Anweisungen, mit- tels derer in endlich vielen Schritten aus vorgegebenen spezifizierten Einga- begr¨ oßen

Regular train tickets have time stamping printed up to date, but a platform ticket is printed up to minutes. At that time, the ticket collectors suddenly started purchasing

Erg¨ anzen sie dessen Ausgabe durch die zus¨ atzliche Ausgabe einer War- nung, wenn nach dem Prompt Bitte einen Wochentag eingeben: mehr als ein Wort eingegeben wurde...

(Ein Stack oder Kellerspeicher ist ein linearer Speicher mit Zugriff nach dem FILO — first in last out — Prinzip.) Die Operationen sollen heißen: new, push, pop,

Vergessen Sie bitte nicht, daß in einem sicher- heitskritischen Raum nur berechtigte Personen Eintritt erlangen d¨ urfen und daß die Menge der zutrittsberechtigten Personen

they told the dispatchers that an alarm had been given to a fire station, when in reality the fire station did not receive the alarm, and kept playing cards and wondering why there

• inOrder: ¨ Ahnlich; hier wird ein Baum-Knotenzeiger jedoch h¨ ochstens zweimal auf den Stack gepush’t: Beim ersten pop’en wird sowohl der Baum-Knotenzeiger als auch sein linker