Teil III : Vom Algorithmus zur Programmiersprache

Werbung
Teil III :
Vom Algorithmus zur
Programmiersprache
1. Algorithmen, Programme, Sprachen
2. Programm- und Sprachelemente
3. Modula-2
4. Zahlendarstellung
1. Algorithmen, Programme, Sprachen
•
•
•
•
Der Algorithmusbegriff
Merkmale und Eigenschaften von Algorithmen
Nachrichten und Sprachen
Formale Sprachen – Syntax
Der Algorithmusbegriff
Begriffsklärung:
Ein Algorithmus ist eine Vorschrift, eine Anleitung zur
Lösung einer Aufgabenstellung, die so präzise
formuliert ist, dass man sie im Prinzip „mechanisch“
ausführen kann
Das heisst
es werden Verarbeitungsvorschriften als Nachrichten formuliert, die
interpretiert werden müssen
Randbedingungen
à verschiedene Formalismen sind möglich
à gemeinsames Sprachverständnis ist Voraussetzung
Der „ganze Alltag“ besteht aus Algorithmen:
­
­
­
­
­
Gebrauchsanweisung, Bedienungsanleitung
Rezepte zur Zubereitung von ...
Anleitungen zum „Basteln“
Vorschriften nach denen man sich richtet (oder auch nicht)
Prozessabläufe (Waschmaschine)
Aha:
Algorithmus
Reproduzierbarkeit
Beispiel 1: Rezept für Marmorkuchen
Zutaten: mehr oder minder eindeutige Eingabeparameter
250g Mehl, 150g Zucker, 120g Butter, 1/2 Päckchen
Backpulver, 3 Eier, 1/4 l Milch, 1 Löffel Kakaopulver, eine
Prise Salz, gestossene Vanille
Zubereitung:
Die Butter mit den Eigelben schaumig rühren, nach und nach
abwechselnd Milch, Zucker, das mit Backpulver gesiebte
Mehl, Vanille, Salz und zum Schluss den festen Eischnee
untermischen. Den Teig halbieren und unter die eine Hälfte
den Kakao mischen. Den hellen Teig in eine gefettete, mit
Mehl ausgestreute Form füllen, den dunklen Teig darauf
verteilen, eine Gabel mehrmals spiralig durch den Teig
ziehen. Den Kuchen im vorgeheizten Backofen bei mittlerer
Hitze (ca. 180º) backen. Backzeit ca. 50 min.
Beispiel 2:
Addieren nach
Adam Riese
Beispiel 3: Schaltbild (eines Diodenempfängers mit 2-stufigem NF-Verstärker)
Beispiel 4:
Suchen und Finden
einer Ehefrau
Beispiel 5: Anleitung Münzfernsprecher
Elementare Eigenschaften eines Algorithmus:
Ø ausführbar und reproduzierbar
Ø aus schrittweise ausführbaren elementarer Operationen
zusammengesetzt
·
was heisst „elementar“;
Abstraktionsniveau (minimaler Grad an Detaillierung)
Ø endliche Beschreibung
Ø endliche Ausführungszeit (Termination)
Ø unabhängig von Programmiersprache und Computer
Entwicklung eines Algorithmus
Ø
schrittweise Verfeinerung mit dem Ziel, die Komplexität zu bewältigen
Ø
Vorgehensweise:
· Zunächst Lösung in großen "Einheiten" angeben
· Dann jede "Einheit" als gesondertes "Problem" behandeln
Beispiel 6: Radwechsel, da Reifen platt
Ø
Lösung: Führe folgende Schritte durch
1. Schrauben lösen
2. Wagen anheben
3. Rad entfernen
4. Reserverad montieren
5. Wagen absetzen
6. Schrauben festziehen
Ø
Vorteil der Vorgehensweise
· "roter Faden"
· "großes Problem" wird auf "kleinere Probleme" zurückgeführt
Ø
Einzelne Schritte lassen sich weiter detaillieren:
2.1 Wagenheber ansetzen
2.2 Wagen hochpumpen
3.1 Schrauben entfernen
3.2 Rad abnehmen
Ø
Auch bereits detaillierte Schritte können noch weiter verfeinert werden
2.1.1 Bordbuch holen
2.1.2 Ansatzpunkte für Wagenheber ermitteln
2.1.3 geeigneten Ansatzpunkt auswählen
2.1.4 Wagenheber am gewählten Ansatzpunkt ansetzen
Grad der Verfeinerung (abhängig davon für wen/was bestimmt)
Ø
für wen: Mensch oder Maschine
Ø
für was: Grobkonzept oder Feinkonzept
Selektion (Auswahl)
Ø
Ø
ist eine Auswahl unter Anweisungsalternativen; sie erfolgt nach explizit angegebenem Auswahlkriterium (mit den Werten "wahr" oder "falsch"); eine Auswahl
kann u.U. "geschachtelt" auftreten aber auch als Mehrfach-Auswahl.
Auswahl und ...
· bedingte Anweisung:
Falls mindestens 1 Schraube festsitzt dann Rostlöser verwenden
·
alternative Anweisungen:
Falls Ersatzreifen vorhanden dann wechsle den Reifen sonst hole Hilfe
oder auch
Falls kein Ersatzreifen vorhanden dann hole Hilfe sonst wechsle den Reifen
·
·
Geschachtelte Anweisungen:
Falls Ersatzreifen vorhanden dann falls Ersatzreifen nicht platt dann wechsle Reifen
sonst hole Hilfe
Mehrfach-Auswahl:
Falls in der Nähe
Telefonzelle: ADAC anrufen
Wohnhaus : bitte Anwohner um Hilfe
Tankstelle:
Tankwart um Hilfe bitten
M
ansonsten:
Warten bis jemand vorbeikommt
Wiederholung
Ø
Ø
Wiederholte Ausführung einer Einzelanweisung oder einer Folge von
Anweisungen
Wiederholungen ...
· in vorbestimmter Anzahl:
wiederhole für Schraube 1 bis Schraube 5:
Kreuzschlüssel aufsetzen;
Falls Schraube lösbar
dann drehe Schraube eine Drehung nach links
sonst Rostlöser verwenden;
warten;
drehe Schraube eine Drehung nach links
·
in Abhängigkeit einer Bedingung:
während Schraube noch mit Nabe verbunden:
drehe Schraube eine Drehung nach links
oder auch
wiederhole
drehe Schraube eine Drehung nach links
bis Schraube nicht mehr mit Nabe verbunden
oder auch
wiederhole immer wieder
drehe Schraube eine Drehung nach links;
falls Schraube nicht mehr mit Nabe verbunden dann höre auf
Merkmale und Eigenschaften von Algorithmen
Ø Algorithmen und Objekte können elementar aber auch
zusammengesetzt sein
Ø Operationen auf benannten Objekten
Ø Ausführung von Algorithmus-Teilen sequentiell/parallell
Ø $ nicht-elementare Unteralgorithmen, die durch ihren
„Namen“ aufgerufen werden ® Prozedurkonzept
Ø $ bedingte Ausführung von Verarbeitungsschritten
Ø $ Wiederholungsanweisungen ® Mehrfachausführungen
Ø meistens auch:
·
·
$ Eingabe-Objekte zur Ausführung des Algorithmus
$ Ausgabe-Objekte nach Ausführung des Algorithmus
Wiederholungsanweisungen ® Mehrfachausführungen
Weitere Eigenschaften
Ø Sequentialität / Parallelität / Kollateralität (sequentiell oder parallel)
Ø Termination
·
terminierender Algorithmus kommt in endlich vielen Schritten zum
Ende
Ø Determinismus
·
deterministischer Algorithmus besitzt eindeutig vorgeschriebenen
Verlauf
Ø Determiniertheit
·
·
·
determinierter Algorithmus führt zu eindeutigem Ergebnis
deterministischer Algorithmus ist immer determiniert (verkörpert also
eine Abbildung)
nicht-deterministischer Algorithmus ist bisweilen determiniert
Aussagen über Algorithmen
Ø Voraussetzungen
·
·
unter welchen Bedingungen arbeitet der Algorithmus?
- Menge aller erlaubten Eingaben
- Menge aller möglichen Ausgaben (bei erlaubten Eingaben)
Was geschieht bei falscher Eingabe
Ø Terminationsverhalten
·
·
endet ein Algorithmus für alle möglichen Eingaben? Beweis!
Ist es möglich, den Algorithmus in einen nicht-endenden Zyklus
zu bringen?
Ø Korrektheit
·
·
„Übereinstimmung“ Algorithmus - Prozess?
liefert der Algorithmus bei Ausführung die richtige Ausgabe als
Funktion der Eingabe?
Aussagen über Algorithmen (cont‘d)
Ø Aufwand/Effizienz
·
·
·
Speicherplatzbedarf?
Ausführungszeit?
Abhängigkeit der Ausführungszeit von der Eingabe?
Der Korrektheitsbeweis für einen Algorithmus umfasst den
Beweis der Termination und den Beweis der Korrektheit!
Urfrage zur Algorithmisierbarkeit/Berechenbarkeit:
Was lässt sich algorithmisch lösen (berechnen)?
Gibt es einen Algorithmus, der in endlich vielen Schritten mit
der Ausgabe = f(Eingabe) stoppt, d.h. die (bekannte)
Abbildung f: (Eingabe) ¾¾® (Ausgabe) realisiert?
Nachrichten und Sprachen
Ø Die Form einer Nachricht wird durch eine Sprache
festgelegt
Ø Eine Sprache ist hierarchisch aufgebaut
Zeichen ¾¾¾® Folgen von Zeichen
Wörter ¾¾¾® Folgen von Wörtern
Sätze ¾¾¾® Folgen von Sätzen
Sprache
Charakteristika von Sprachen
Ø Grundelement „Zeichen“
·
·
·
bildet die kleinste Einheit (bzgl. best. Abstraktionsebene)
ist Element einer Grundzeichenmenge („Alphabet“)
Bedeutung ist durch Pragmatik festgelegt
Ø Zeichenfolgen (= Nachrichten)
·
·
werden durch Verkettung gebildet
Regeln für erlaubte/gültige Verkettungen ® Syntax
Ø Interpretation der Zeichenfolgen (= Information)
·
Feststellung der Bedeutung der Zeichenfolgen ® Semantik
Beispiel: Katz und Maus
Pragmatik:
(Die Darstellungen
von Katze und Maus
sind „selbsterklärend“)
Syntax:
Katze frisst Maus
Maus frisst Katze
Semantik:
Maus ist Beutetier von Katzen
Katze jagt Vögel, Mäuse
Definition algorithmischer Sprachen
Ø Syntax
·
·
regelhafte Beschreibung (Festlegung) der äusseren Form einer
Zeichen- oder Wortfolge, die ein legales Konstrukt der algorithmischen Sprache ergibt
Regeln sind abhängig oder unabhängig von der Interpretation formulierbar
Ø Semantik
·
·
regelhafte Bedeutungszuweisung zu bestimmten, syntaktisch
korrekten Kombinationen von Wörtern
Voraussetzung: „höhere“ Sprache (Metasprache) zur Erläuterung
der Bedeutung der Programmiersprachenkonstrukte
Ø Pragmatik
·
Zurückführung einer in der Sprache als primitiv anzusehenden
Operation auf „elementarere Bestandteile“
Beispiel: Multiplikation
a := 5;
b := 6;
c := a • b
¾®
c = 30
Syntax:
lt. Konstruktionsregeln ein gültiger Ausdruck
Semantik:
Bedeutung: Multiplikation zweier Zahlen a, b
mit bestimmtem Typ (und Wertebereich)
Pragmatik:
Zurückführung der Multiplikation auf einzelne
Additions- und Shiftbefehle
Prinzipielle Fragestellungen zu:
Formale Sprachen und Compiler « Spezifikation und
Analyse von Programmiersprachen
Ø Wie sieht eine Grammatik für eine (Programmier-)Sprache aus?
Ø Wie kann die Zugehörigkeit eines Programms zu der durch die
Grammatik definierten Sprache überprüft werden und wie sieht
ggf. dessen „syntaktische Struktur“ aus?
Ø Wie kann die Eindeutigkeit der Syntax garantiert werden mit dem
Ziel einer eindeutigen Analyse (eindeutige Semantik), deren
Ergebnis (ausführbarer Code) dann auf einem Rechner
ausgeführt werden kann?
Die Konstruktion von Kunstsprachen („formale Sprachen“)
und die Analyse ihrer Sprachelemente ist für die Informatik
von zentraler Bedeutung!
Formale Sprachen - Syntax
Wiederholung:
Syntax und Semantik von Programmiersprachen
Natürliche Sprachen und Programmiersprachen haben feste Regeln für den
Aufbau von Sätzen in der Sprache (Syntax = Lehre vom Satzbau)
Programmiersprache: Zusammenfassung aller laut der Syntax korrekten
Satzkonstruktionen (Programme)
Syntax: Erzeugung gültiger Satzkonstruktionen mittels der in der Grammatik
festgelegten Regeln
Semantik (Bedeutungslehre): Beschreibung der Wirkung eines Programms
auf den Rechner, d.h. welche Funktion durch das Programm berechnet wird.
Im Folgenden beschäftigen wir uns mit syntaktischen Strukturen, die Semantik bleibt
unberücksichtigt.
Grammatiken und (Formale) Sprachen
Ø Zeichen, Worte, Sprachen
·
Zeichen (Symbole) sind Elemente von Zeichenmengen
S: endliche, nicht-leere Menge von Symbolen (Alphabet), d.h.
S ¹ { }, card(S) = |S| = n < ¥
·
Worte (Symbol-, Zeichenketten, strings)
mit den Elementen siÎS werden Zeichenketten „über dem
Alphabet S“ durch Aneinanderhängen (Konkatenation) gebildet:
S1 = S
S2 = S x S
M
Sk = S x S x ... x S (k-fach)
M
Sk: Menge aller Zeichenketten w = s1s2...sk der Länge k über S
S*: Menge aller Zeichenketten endlicher Länge über S incl.
leerem Wort l (S* ist freie Sprache über S)
·
Sprache über S
S* enthält alle, durch beliebige Anordnung von siÎS konstruierbaren Worte
Beschränkung auf
„legale“ Konstrukte
L = R(S) Regelsprache aus S*
d.h. L Í S*
Frage: Wie beschreibt man eine Regelsprache?
Ø Grammatik
·
Generierung („Produktion“) einer Sprache mittels einer Grammatik
·
G = (SN, ST, P, wS) mit
SN: Menge der Nichtterminalzeichen
ST: Menge der Terminalzeichen
SN Ç ST = Æ
P = {pi}, |P| = n < ¥: Produktionen (Ersetzungsregeln)
PÍ (SNÈ ST)* x (SNÈ ST)*
pi : a ® b, wenn (a,b) Î P
wS : Startwort, wS Î (SNÈ ST)*, | wS| ³ 0
·
Aus einem Wort u kann ein Wort v dadurch abgeleitet werden,
indem ein a in u durch b ersetzt wird und damit aus dem Wort u
das Wort v entsteht.
Ø Ableitung eines Worts
·
Problem
Es liegt ein Wort w vor; w gehört zur Sprache, also w Î R(S)
·
Strategien
Top-Down: ausgehend vom Startsymbol wird mittels der
Produktionen (Ersetzungsregeln) abgeleitet, bis die gegebene Folge
„generiert“ ist.
Bottom-Up: umgekehrt (durch „Reduktion“)
·
Beispiel
G = (SN,ST,P,wS)
G = ( {S,A}, {0,1}, {S ® 0A11, A ® , A ® 0A, A ® 1A}, S)
(1)
(2)
(3)
(4)
Problem: Gehört 0000111 zur Sprache?
Top-Down: S ® 0A11 ® 00A11 ® 000A11 ® 0000A11 ®
(1)
(3)
(3)
® 00001A11 ® 0000111
(4)
(2)
(3)
(4)
Kontextfreie Grammatiken und Programmiersprachen
Ø Kontextfreie Grammatik
·
G = (SN, ST, P, Z) mit
SN, ST: wie gehabt
PÍ SN x (SNÈ ST)* , d.h.
pi : A ® b, wenn (A,b) Î P, wobei A Î SN
·
Z : Startsymbol, Z Î SN
Beispiel: siehe letzte Folie
Ø EBNF (Erweiterte Backus-Naur-Form)
·
·
verkürzte Darstellung für kontextfreie Grammatiken
Alternative: A ® a | b
als Abkürzung für die Produktionen
A ® a, A ® b
·
Wiederholungen
- 0- oder 1-mal a:
- 0-, 1- oder n-mal a:
·
A ® [a]
A ® {a}
Beispiel von vorne
aus den Produktionen
S ® 0A11, A ® , A ® 0A, A ® 1A
wird in EBNF
S ® 0A11, A ® {0 | 1}
Ø Syntaxdiagramme
·
Graphische Darstellung für kontextfreie Grammatiken
·
Grundbausteine der Diagramme
§
Nicht-terminale Zeichen (Variablen) A
A
(à Platzhalter für ein weiteres Diagramm)
§
Terminalzeichen s
s
(à Zeichen der formalen Sprache)
§
Konkatenationen (Wortkonstruktionen)
(à Übergang von einem Knoten
(
) zum Folgenden)
·
Beispiel Grammatik von vorne
S
0
A
1
1
A
0
1
Ø Zusammenhang: EBNF – Syntaxdiagramm
1.
Alternative
A ® a | B.
2.
B
Verkettung
A ® aB .
3.
a
A
A
a
B
Wiederholungen
0- oder 1-mal a
A ® [a ].
0-, 1- oder n-mal a
A ® {a }.
a
a
2. Programm- und Sprachelemente
• Programmieren und Sprachen
• Erste Schritte in MODULA-2
• Syntaxdiagramme
Programmieren und Sprachen
Entwurf und Notation von Programmen
Programmiersprache
mit
Aufbauregeln (Syntax)
und
Standardinterpretation
(Semantik)
Ziel ist es,
einen Algorithmus zur Lösung eines Problems in einer maschinell
erfassbaren Form zu formulieren
Hauptaufgabe dabei ist es allerdings,
einen (abstrakten) Algorithmus zu konzipieren und verifizieren;
Programmieren ist somit eine konstruktive Tätigkeit, mehr als nur
Codierung
® Spezifikation, Entwurf, Modularisierung, ...
Empfehlenswert ist es,
systematisch („vom Problem zur Maschine“) vorzugehen
(„Programmierzyklus“)
Programmierzyklus (aus Puchan et al., 1994)
Problem
Spezifikation des
Problems
Entwicklung eines
Algorithmus
Kodierung mittels
Programmiersprache
Editieren
am Rechner: Compilieren
richtig kodiert?
Ausführen
(Syntax)
... das
Programm
dem
Algorithmus
entspricht?
... der
Algorithmus
das
Problem
löst?
Testen, d.h. prüfen ob ...
falls o.k.
Programm ist fertig und „wahrscheinlich“ korrekt
Testen & beweisbare Korrektheit
reale Phänomene
Modellbildung
Abstraktion
Objekte
Algorithmen &
Datenstrukturen
® Spezifikation
Codierung
Daten
Strukturierung
Datenstrukturen
Algorithmen
Formulierung
® Syntax
Entwurf
Programme
Realisierung am Rechner
Programmiersprachen - Programmierstile
Ø imperativ (algorithmisch, prozedural)
·
PASCAL, MODULA-2, BASIC, ALGOL, COBOL, C, FORTRAN
Ø funktional
·
LISP, Gofer, OPAL, Haskell
Ø objektorientiert
·
Smalltalk, C++
Ø prädikativ (logisch)
·
PROLOG
Bemerkungen
• OO-Sprachen enthalten imperativen „Kern“
• Imperative Sprachen sind noch stets
Weitesten verbreitet
Erste Schritte in MODULA-2
Grundlegender Aufbau von MODULA-2 Programmen
Ø Komponenten eines Programms
· Beschreibung von Aktionen
* Anweisungen („statements“)
* Kontrollkonstrukte
* Abstraktion durch Prozeduren
· Beschreibung von Daten
* Deklarationen und Definitionen
* Manipulationen auf einfachen und komplexen Daten
Ø Programmschema
MODULE Name [Priorität]
IMPORT
Deklarationen von Konstanten, Typen, Variablen, ...
BEGIN
Initialisierungsteil
Verarbeitungsteil
Ausgabeteil
END Name.
Rumpf
Namen und Symbole
Ø Namen (auch: Bezeichner, Identifier)
· Frei gewählte (sinnvolle!) Bezeichnungen für „Elemente“
· Zugriff auf die Elemente über ihren Namen
· Aufbau
Ø Einige reservierte Namen für Modula-2
Ø Operationssymbole und Begrenzer
Syntaxdiagramme
für Modula-2 (1)
Syntaxdiagramme
für Modula-2 (2)
Syntaxdiagramme
für Modula-2 (3)
Syntaxdiagramme
für Modula-2 (4)
Syntaxdiagramme
für Modula-2 (5)
Syntaxdiagramme
für Modula-2 (6)
Syntaxdiagramme
für Modula-2 (7)
Syntaxdiagramme
für Modula-2 (8)
Syntaxdiagramme
für Modula-2 (9)
Syntaxdiagramme
für Modula-2 (10)
3. Modula-2
•
•
•
•
•
Ein erstes Programm
Einfache Datentypen
Operationsprinzipien – Anweisungen
Einfache selbstdefinierte Typen
Strukturierte Daten
Ein erstes Programm
Bibliothek (explizite Nennung)
MODULE Ueberschrift;
FROM InOut
IMPORT WriteString, WriteLn;
BEGIN
WriteString(“Allgemeine Informatik I");
WriteLn;
WriteString(“Wintersemester 2001/2002");
WriteLn;
END Ueberschrift.
Ausgabe des angegebenen
Texts mit Zeilenvorschub
Kommunikation: Programm - Betriebssystem
Modula-2 Programm
IMPORTs
Bibliotheks-Modul
Bibliotheks-Modul
Bibliotheks-Modul
Bibliotheks-Modul
Anforderungen
Betriebssystem
(hier: UNIX)
Dienste
Ø in Modula-2
· Sprachkern ist standardisiert
· Zugriff auf Betriebssystem-Dienste via Bibliotheks-Module
* Bibliotheken sind nicht standardisiert
* Bibliotheken gehören nicht zum Sprachumfang
· Beurteilung
* Nachteil: Unklarheit bzgl. verfügbarer Funktionalität und Struktur der
Bibliotheken
* Vorteil: Implementierung der Sprache rechner-/systemunabhängig
Ø Ulmer Modula-2 Implementierung
· Liste und Doku unter:
http://www.mathematik.uni-ulm.de/modula/man/
Gestaltung von Programmen (Grundsätzliches)
Ø Grundregeln zu Programmaufbau und -gestaltung
· jedes Programm besteht aus (mehreren) Modulen
· jeder Modul ist ein eigenes Dokument
· Quelltext ist zeilenweise organisiert, mit je 1 Anweisung oder
Vereinbarung pro Zeile
· Verwendung von Leerzeilen (Absetzen von Blöcken)
· Einrücken von Anweisungen (entsprechend „logischer Struktur“)
· sinnvolle Verwendung von Kommentaren (* ... *)
Ø Kommentare
· Syntax: beliebiger, in (* ... *) eingeschlossener Text
· sinnvoll einsetzen
* Modulanfang: Kurzbeschreibung der Aufgabe
* Beschreibung der Ein- und Ausgabegrößen
* Erläuterung des logischen Programmablaufs
(grob strukturierter Algorithmus, Invarianten)
* Erklärung von Variablen, Typen, .... (falls nötig)
* Kennzeichnung von END
· nicht sinnvoll
* Unter-, aber auch Überkommentierung
* Paraphrasierung des Programmtexts
Ein inakzeptables Programm
MODULE Mehrwertsteuer;
FROM RealInOut IMPORT ReadReal, WriteReal, WriteFloat; FROM InOut
IMPORT WriteString, WriteLn;
CONST
M = 0.16;VAR
x,y :
REAL;
BEGIN (*BEGIN Anweisung
*)
WriteString("Geben Sie den Preis ein: ");
ReadReal(x); (* Einlesen von x
*)
y := x • M; WriteLn;WriteString("Die MWSt beträgt (Float): ");
WriteFloat(MWSt, 8, 2); WriteLn;
WriteString("Die Mehrwertsteuer beträgt (Real): ");WriteReal(y, 10);
WriteLn; END Mehrwertsteuer.
Übersetzung von Programmen („Compilation“)
Modula-2
Programm
Modula-2
Compiler
<name>.m2
Fehlermeldungen
(Syntaxfehler)
ausführbarer Code
a.out
UNIX
input
a.out
UNIX
output
Übersetzung und Ausführung von Programmen
Ø Übersetzung
· m2c <Name>.m2
* Aufruf des Modula-2 Compilers (Programmstart)
* input = <Name>.m2; output = a.out (ausführbares Programm)
· m2c -o <Name> <Name>.m2
* -o ist Compileroption
* das ausführbare Programm heisst statt a.out jetzt <Name>
Ø Ausführung
· Start mittels ...$ a.out
· bzw. Start mittels ...$ <Name>
Einfache Datentypen
Eigenschaften eines „Typs“
Ø Grundsätzliches
· Der (Daten-)Typ kennzeichnet die aktuelle Wertemenge eines Objekts
(Konstante, Variable, Ausdruck, Funktion, ...)
· Typ-Zuordnung durch Vereinbarung (= Deklaration)
Ø Eigenschaften
· Der Datentyp bestimmt die Wertemenge,
* zu der eine Konstante gehört
* deren Werte durch eine Variable oder einen Ausdruck angenommen
werden können
* deren Werte durch einen Operator oder eine Funktion berechnet werden
können
· Der Datentyp ist anhand seiner Notation oder Vereinbarung erkennbar
· Jeder Operator bzw. jede Funktion
* erwartet Argumente eines bestimmten Typs
* liefert Resultate eines bestimmten Typs
Taxonomie der Datentypen
Datentypen
Einfache Datentypen
Strukurierte Datentypen
Gleitkommazahlen
POINTER
REAL
LONGREAL
COMPLEX
LONGCOMPLEX
ARRAY
STRING
Ganzzahlen und
Ordinaltypen
CARDINAL
INTEGER
BOOLEAN
CHAR
Zeiger Datentypen
Ausschnittstyp/
Unterbereichstyp
(subrange)
Aufzählungstyp
(enumeration)
RECORD
SET,
PACKEDSET
BITSET
Einfache Standardtypen
Ø Cardinal
· Wertemenge: nicht-negative ganze Zahlen
{0,1, ... ,MaxCard}; MaxCard = 232 - 1
· Deklaration:
VAR
c,anzahl,monat,hausnummer: CARDINAL;
· Ein-/Ausgabe:
FROM InOut IMPORT ReadCard(var),Write(var,breite);
· Operationen:
* Addition
+
nur beschränkter
Wertebereich verfügbar !!
* Subtraktion
–
* Multiplikation
*
* ganzzahlige Division mit Rest
DIV, MOD
* Vergleiche
=,<>,>=,>,<=,<
· Beachte: Vergleichsoperationen sind zweistellig
* Falsch: x < y < z
Ø Integer
· Wertemenge: vorzeichenbehaftete ganze Zahlen
{-2N-1, ... ,2N-1-1}; N = 32
· Deklaration:
VAR
k, wert,index,faktor: INTEGER;
· Ein-/Ausgabe:
FROM InOut IMPORT ReadInt(var),WriteInt(var,breite);
· Operationen:
*
*
*
*
*
*
Addition
Subtraktion
Multiplikation
ganzzahlige Division mit Rest
Vergleiche
Vorzeichenumkehrung
+
nur beschränkter
–
Wertebereich verfügbar !!
*
DIV, MOD
=,<>,>=,>,<=,<
–
· Konvertierung « Cardinal
VAR
i,int
: INTEGER;
c,card
: CARDINAL;
i:= INTEGER(card);
c:= CARDINAL(int)
Ø Definition von DIV und MOD
· (x,y) ® (q,r)
mit x,y,q,r Î N (oder Z)
wobei x DIV y ® q
(„Quotient“)
x MOD y ® r („Rest“)
· x DIV y = floor(x/y) =: q
wobei q > 0, if sgn(x)=sgn(y)
q = 0, if abs(x)<abs(y)
q < 0, if sgn(x)¹sgn(y)
· x MOD y =: r
wobei r = x - (x DIV y)·y, if r ³ 0
r = x - (x DIV y)·y + y, if r < 0
· „DIV-MOD“ - Identität
(x DIV y)·y + (x MOD y) = x
logisch:
„abgerundeter“ Quotient • Nenner + Rest = Zähler
Ø Boolean
· Wertemenge: Wahrheitswerte {FALSE,TRUE}, auch {0,1}
· Deklaration:
VAR
present,billig,laut,gefunden : BOOLEAN;
· Ein-/Ausgabe:
keine!
· Operationen:
* Negation, Verneinung
* Konjunktion, logisches UND
* Disjunktion, logisches ODER
NOT
AND
OR
~
&
Rangordnung
* Vergleiche
· Verwendung
* Ergebnis einer Vergleichsoperation
* Ausdruck einer erfüllten oder nicht erfüllten Eigenschaft
* Variablen vom Typ BOOLEAN sollten Eigenschaftsworte sein
· Boolean in Bedingungen:
anstatt:
IF billig THEN ... ELSE ...
IF billig = TRUE THEN ... ELSE ...
anstatt:
IF NOT billig THEN ... ELSE ...
IF billig = FALSE THEN ... ELSE ...
Beispiele zur Aussagenlogik
Wahrheitstabelle:
P
NOT p
FALSE
0
TRUE1
TRUE
1
FALSE
0
Wahrheitstabelle:
p
q
p AND q
p OR q
1
1
1
1
1
0
0
1
0
1
0
1
0
0
0
0
Beispiele zur Aussagenlogik
de Morgan‘sche Regeln
NOT (p AND q) = (NOT p) OR (NOT q)
NOT (p OR q) = (NOT p) AND (NOT q)
Vergleiche:
p
q
p<q
p <= q
p>q
p >= q
1
1
0
1
0
1
1
0
0
0
1
1
0
1
1
1
0
0
0
0
0
1
0
1
Beispiele zur Aussagenlogik
Implikation:
p
q
p®q
p <= q
NOTp OR q
TRUE
1
TRUE
1
TRUE
1
TRUE
1
TRUE1
TRUE
1
FALSE
0
FALSE
0
FALSE
0
FALSE0
FALSE
0
TRUE
1
TRUE
1
TRUE
1
TRUE1
FALSE
0
FALSE
0
TRUE
1
TRUE
1
TRUE1
Ø Character
· Standardisierter Zeichensatz
* Festlegung einer rechnerinternen Darstellung von Zeichen (Bitmuster)
* Festlegung einer Ordnung über der Zeichenmenge
* Beispiel: ASCII (American Standard Code for Information Interchange)
· Deklaration:
VAR
ch1,ch2,ch3 : CHAR;
· Zuweisung:
ch1 := "a";
ch2 := 'b';
ch3 := 65C; (65C ist ASCII-Oktal-Code für das Zeichen 5)
· Ein-/Ausgabe:
FROM InOut IMPORT Read,Write;
· Operationen: Vergleiche auf Basis der ASCII-Ordnung
* ORD(ch) liefert den ASCII-Wert (Ordnungsnr.) des Characters ch
– Z.B. ORD(M) = 33; ORD(!) = 77
* CHR(z) liefert den Character zum ASCII-Wert z (0 £ z < 128)
* Es gilt: CHR(ORD(ch)) = ch und ORD(CHR(z)) = z
Ø Real
· Wertemenge: darstellbare reelle Zahlen
Dezimalpunkt !!
(beschr. Stellenzahl)
· Deklaration:
CONST pi = 3.1415;
VAR coeff,std,temp: REAL;
· Ein-/Ausgabe:
FROM RealInOut IMPORT
· Operationen:
*
*
*
*
*
*
ReadReal(var),
WriteReal(var,minstellen);
Addition
+
Subtraktion
–
Multiplikation
*
Division
/
Vergleichsoperatoren
=,<>,>=,>,<=,<
alle Op. auf REAL-Werten sind Approximationen
(Genauigkeit von Maschine/Implementierung)
· Konvertierung
* FLOAT:
* TRUNC:
CARDINAL / INTEGER ® REAL
REAL ® CARDINAL / INTEGER
Operationsprinzipien – Anweisungen
Allgemeines
Ø Ein Programm manipuliert Daten
· Operationen ® Datenmanipulation (d.h. Zustandsänderung)
· Aktionen (® Zustandsänderung) werden in Anweisungen (statements)
beschrieben
statement
einfach
((Wert-)Zuweisung)
strukturiert
zusammengesetzt
bedingt
Prozedur
repetetiv
Syntaktische Definition von Anweisungen
Zuweisung und Ausdrücke (1)
Ø Zuweisung („assignment“) :=
· Syntax
· Bedeutung, Wirkung
* Auswertung des Ausdrucks
® Wert des Ausdrucks muss vom Typ der Variable sein (zumindest
typverträglich)
* Zuweisung des Ergebniswertes an die Variable
® alter Wert der Variable wird überschrieben (Zustandsänderung)
· Beispiele
* inkrementieren:
zaehler := zaehler + 1
* dekrementieren:
zaehler := zaehler - 1
* Werte zweier Variablen x,y tauschen
xalt := x
x := y (* x und y haben denselben Wert *)
y := xalt
Zuweisung und Ausdrücke (2)
Ø Ausdruck („expression“)
· Auswerteregeln: links ® rechts, algebraische Regeln
Ausdruck
Operanden
Konstanten Variablen Funktionen
Operatoren
monadisch
(einstellig)
dyadisch
(zweistellig)
Ausdrücke mit mehreren Operatoren:
- (explizit) Klammerungen
- (implizit) durch Sprachregelung festgelegte Ausführungsreihenfolge
(z.B. „Punkt vor Strich“)
siehe Syntax-Diagramme !
Zuweisung und Ausdrücke (3)
Ø Ausdruck („expression“) (cont‘d)
· Beispiele:
*
*
*
*
*
3.0 * 8.0 / 4.0 * 5.0
Û
2*3-4*5
Û
80 / 5 / 3
Û
SQRT(SQR(3) + 11*5) = 8.000
4 = 0
® = FALSE
· Syntax einfacher Ausdrücke
((3.0 * 8.0) / 4.0) * 5.0
(2 * 3) - (4 * 5) = -14
(80 / 5) / 3 = 5.333
Zuweisung und Ausdrücke (4)
Ø Ausdruck („expression“) (cont‘d)
· Rangfolge von Operatoren (ergibt sich aus Syntax)
* Negation und unäres Minus
(in Factor)
* Multiplikationsoperatoren
(in Term)
* Additionsoperatoren
(in SimpleExpression)
* Relationaloperatoren
(in Expression)
· Beispiel
* – 3 – 4 DIV –2 < 7 + 3 * – 2
NOT(~), –
*, /, DIV, MOD, AND(&)
+, – , OR
=, <>, >=, >, <=, <, IN
Rangfolge
Leere Anweisungen und Anweisungsfolgen
Ø Leere Anweisung („empty statement“)
· Anweisung ohne Wirkung für Programmstellen, an denen
syntaktisch eine Anweisung vorkommen muss, jedoch keine
Aktion stattfinden soll
Ø Anweisungsfolgen
· Aneinanderreihung von Anweisungen
· Klammerung
* explizit: BEGIN ... END bei Moduln, Prozeduren
* implizit: Auswahl, Wiederholung, ...
Das ; dient lediglich der Trennung von Anweisungen, nicht
als deren Abschluss. ; ist nicht Teil der Anweisung
Verzweigungen - Fallunterscheidungen (1)
Ø IF - Anweisung
· Struktur: Einfachauswahl
IF logische Bedingung THEN ... ELSE ... END
* falls logische Bedingung = true ® Abarbeitung der THENAnweisungsfolge ...
* falls logische Bedingung = false ® Abarbeitung der ELSEAnweisungsfolge ...
· Beispiel: Schein oder nicht Schein
IF note <= 4.0
THEN WriteString(“bestanden")
ELSE WriteString("nicht bestanden")
END;
Verzweigungen - Fallunterscheidungen (2)
Ø IF - Anweisung (Cont‘d)
· Struktur: Mehrfachauswahl
IF ... THEN ...
ELSIF ... THEN ...
M
ELSE ... END
· Syntax
· Beispiel:
Notenschlüssel
IF
ELSIF
ELSIF
ELSIF
ELSE
END;
punkte >= 100 THEN
punkte >= 80 THEN
punkte >= 60 THEN
punkte >= 40 THEN
WriteString("Note
WriteString("Note 1")
WriteString("Note 2")
WriteString("Note 3")
WriteString("Note 4")
5 (nicht bestanden!)")
Verzweigungen - Fallunterscheidungen (3)
Ø CASE - Anweisung
· n unabhängige Ausgangssituationen (cases); jede ist mit einer
Aktion verbunden
· Struktur
CASE Ausdruck zur Fallunterscheidung OF
K : ...
¬ Fall 1
K : ...
¬ Fall 2
M
ELSE ... ¬ Fall n oder der „Rest“
END
· Syntax
Verzweigungen - Fallunterscheidungen (4)
Ø CASE - Anweisung (cont‘d)
· Beispiel: Notenschlüssel
CASE
punkte OF
0..39 : WriteString("Note
|40..59 : WriteString("Note
|60..79 : WriteString("Note
|80..99 : WriteString("Note
ELSE
WriteString("Note
END;
5 (nicht bestanden!)")
4")
3")
2")
1")
besser:
CASE
punkte OF
0..39
: WriteString("Note 5 (nicht bestanden!)")
|40..59
: WriteString("Note 4")
|60..79
: WriteString("Note 3")
|80..99
: WriteString("Note 2")
|100..105 : WriteString("Note 1")
ELSE
WriteString("unzulässige Punktezahl")
END;
ELSE sollte (obwohl optional) in CASE nie fehlen,
um unvorhergesehene Fälle aufzufangen
Verzweigungen - Fallunterscheidungen (5)
Ø CASE - Anweisung (cont‘d)
· Beispiel: Einfache Menüsteuerung
....
VAR ch : CHAR;
....
(* einfache Menuesteuerung zur Bibliotheksverwaltung *)
WriteString("Eingabezeichen (Kommando): ");
Read(ch);
WriteLn;
Aufrufe von Prozeduren
CASE
ch OF
"S", "s" : SucheTitel(Bliste)
| "N", "n" : NeuerTitel(Bliste)
| "E", "e" : EntferneTitel(Bliste)
| "A", "a" : Ausgabe(Bliste)
| "W", "w" :
(* leere Anweisung *)
| "X", "x" : EXIT
ELSE
WriteString("unzulässiges Kommando")
END;
.....
Wiederholungsanweisungen (1)
Ø Motivation
· Wiederholte Durchführung von Berechnungsschritten
Ø Beispiel: Fakultätsfunktion
· Definition: n! =def 1, falls n = 0 und 1 * 2 * ... * (n-1) * n sonst
· Lösung:
MODULE Fakultät; (* Fakultät einer Zahl n *)
FROM InOut IMPORT ReadCard, WriteCard,WriteString, WriteLn;
VAR
n,i,x:
CARD;
BEGIN
WriteString("Geben Sie n ein: ");
ReadCard(n); WriteLn;
i := 0; x : = 1;
?
WriteString("Die Fakultät von (");
WriteCard(n, 0);
WriteString(") ist : ");
WriteCard(x, 0);
WriteLn;
END Fakultät.
- Prinzip:
Wiederholte Multiplikation
mit Abbruch
-Verschiedene
Realisierungen
Wiederholungsanweisungen (2)
Verschiedene Realisierungen für
Ø WHILE ... DO ...... END
· vorangestellte Bedingung (kopfgesteuerte Schleife)
· solange Bedingung gilt, führe Anweisungsfolge aus
Ø REPEAT ...... UNTIL ...
· nachgestellte Bedingung (fußgesteuerte Schleife)
· führe Anweisungsfolge aus, bis (Abbruch-)Bedingung erfüllt ist
Ø FOR ... TO ... [BY ...] DO ...... END
· feste Zählschleife (kopfgesteuerte Schleife)
· führe Anweisungsfolge aus, solange der Index sequentiell verändert
wird.
Ø LOOP ...... END
· einfache Schleife (loop)
· führe Anweisungsfolge aus, solange bis Schleife per EXIT verlassen
wird.
Wiederholungsanweisungen (3)
fußgesteuert
kopfgesteuert
Anweisung
Schleifenbedingung
Zählschleife
nicht
erfüllt
LOOP
Initialisierung
Anweisung
erfüllt
Schleifenbedingung
nicht
erfüllt
erfüllt
Endstand
erreicht
Anweisung
nein
Anweisung
Veränderung
ja
EXIT
Anweisung
Wiederholungsanweisungen (4)
Ø WHILE-Schleife
· Struktur:
WHILE Bedingung DO
M (*Anweisungsfolge*)
END
· Beispiel: Fakultät (mit „?“ markierter Teil)
WHILE i < n DO
i := i+1; x := x*i
END
· Syntax:
Wiederholungsanweisungen (5)
Ø REPEAT-Schleife
· Struktur:
REPEAT
M (*Anweisungsfolge*)
UNTIL Bedingung
· Beispiel: Fakultät (mit „?“ markierter Teil)
REPEAT
i := i+1; x := x*i
UNTIL i >= n
· Syntax:
Wiederholungsanweisungen (6)
Ø FOR-Schleife
· Struktur:
FOR index:=ausdruck1 TO ausdruck2 BY KonstAusdruck DO
M (*Anweisungsfolge*)
END
· Beispiel: Fakultät (mit „?“ markierter Teil)
FOR k:= 1 TO n BY 1 DO
x := x*k
END
· Syntax:
Wiederholungsanweisungen (7)
Ø FOR-Schleife (cont‘d)
· Hinweise:
*
*
*
*
*
Die Anweisungsfolge wird mit fest vorgegebener Wertefolge durchlaufen
index = Zählvariable (Laufvariable); Ausdruck1 = Startwert von index
Ausdruck2 = Endwert der Iteration
KonstAusdruck = Schrittweite der Laufvariable (= 1 falls nichts angegeben)
Ausdruck1, Ausdruck2, KonstAusdruck dürfen in der Anweisungsfolge
nicht verändert werden (ggf. WHILE bzw. REPEAT verwenden)
* index ist nach Abarbeitung der FOR-Anweisung undefiniert!
· Beispiel: Fakultät
* Variable i ist nun überflüssig
Wiederholungsanweisungen (8)
Ø Loop-Anweisung
· Struktur:
LOOP
M (*Anweisungsfolge mit EXIT(s)*)
END (*LOOP*)
· Beispiel: Fakultät (mit „?“ markierter Teil)
LOOP
i := i+1; IF i > n THEN EXIT ELSE x := x*i END
END (*LOOP*)
· Syntax:
· Verwendung:
„gewollte Endlosschleife“ mit Ausstieg(en) an beliebiger(/n)
Stelle(n) innerhalb der Schleife
Beispiel „WHILE“: ggT (1)
Ø größter gemeinsamer Teiler (ggT)
· Der ggT(a,b) zweier ganzer Zahlen a und b ist die größte ganze
Zahl, durch die sowohl a als auch b teilbar ist.
· Beispiel: ggT(16,36) = 4
· Anwendung: optimales Kürzen
· Es gilt:
ggT(a,a) = a
falls b = a
ggT(a,b) = ggT(a-b,b)
falls b < a
ggT(a,b) = ggT(a,b-a)
falls b > a
® iteratives Programm zur Berechnung des ggT
· effizienter: Euklid‘scher Algorithmus für a ³ b:
ggT(a,b) = b
falls a MOD b = 0
ggT(a,b) = ggT(b, a MOD b)
sonst
Beispiel „WHILE“: ggT (2)
MODULE ggT;
(* Berechnung des groessten gemeinsamen Teilers
* zweier positiver ganzer Zahlen *)
FROM InOut IMPORT WriteString, WriteLn, WriteCard, ReadCard
VAR
x, y : CARDINAL ;
BEGIN
WriteString("Bestimmung des GGT"); WriteLn;
WriteString("=================="); WriteLn;
WriteString("Erste positive Zahl eingeben: ");
ReadCard(x); WriteLn;
WriteString("Zweite positive Zahl eingeben: ");
ReadCard(y); WriteLn;
IF (x > 0) AND (y > 0) THEN
WHILE (x <> y) DO
IF (x > y ) THEN x := x - y
ELSE (* y < x *) y := y - x
END (* IF *)
END; (* WHILE *)
WriteString("GGT = ");
WriteCard(x,0)
ELSE
WriteString("fehlerhafte Eingabe!")
END; (* IF *)
END ggT.
ggT
Konvertierung: WHILE « REPEAT (1)
Ø ... im Prinzip durch Negierung der Schleifenbedingung
· beachte bei logisch (mit und / oder) zusammengesetzten Bedingungen
die de Morgan‘schen Regeln!
* Beispiel:
Bedingung: q OR (i = n)
negierte Bedingung: (NOT q) AND (NOT(i=n))
also: (NOT q) AND (i<>n)
Ø Beispiel: WHILE ® REPEAT (nicht zu empfehlen)
WHILE bedingung DO anweisung END
konvertiert in:
IF bedingung THEN
REPEAT anweisung UNTIL NOT bedingung
END
Konvertierung: WHILE « REPEAT (2)
Ø Beispiel: REPEAT ® WHILE
· mit Code-Verdopplung
REPEAT anweisung UNTIL abbruchbedingung
konvertiert in:
anweisung;
WHILE NOT abbruchbedingung DO anweisung END
· mit Schaltervariable schalter
REPEAT anweisung UNTIL abbruchbedingung
konvertiert in:
schalter := TRUE;
WHILE schalter DO
anweisung;
schalter := NOT abbruchbedingung
END
Beispiel „FOR“: Normalverteilungswerte
MODULE
FROM
FROM
FROM
Normalverteilung;
RealInOut
IMPORT ReadReal, WriteFloat;
InOut
IMPORT WriteString, WriteLn, WriteInt;
MathLib
IMPORT exp, sqrt;
CONST
pi = 3.141592653589793238462643383;
Max = 10;
VAR
i
std scale, faktor, GaussWert
: INTEGER;
: REAL;
BEGIN
WriteString("Berechnung der Normalverteilung ...);
WriteLn;
WriteString("Eingabe der Standardabweichung: ");
ReadReal(std); WriteLn;
scale := 1.0 / (sqrt(2.0 * pi) * std);
FOR i := -max TO max DO
faktor := -(FLOAT(i) * FLOAT(i)) / (2.0 * std);
GaussWert := scale * exp(faktor);
WriteInt(i, 5); WriteString(" : ");
WriteFloat(GaussWert, 4, 8); WriteLn
END
END Normalverteilung.
Beispiel „LOOP“: Werbeseiten (aus Puchan et al.)
LOOP
EXIT
EXIT
END
Beispiel „LOOP“: Werbeseiten (aus Puchan et al.)
MODULE Werbung;
FROM STextIO
FROM NochzuSchreiben
IMPORT Write, WriteString, WriteLn;
IMPORT eingabein30s,(*geeignete Warteroutine*)
CLS;
(*löscht den Bildschirm *)
BEGIN
LOOP
(* Ausgabe 1. Bildschirmseite mit Werbung *)
CLS(); (* Bildschirm löschen *)
WriteString("Schauen Sie sich diesen Rechner an.");
WriteLn;
WriteString("Es gibt nichts, was der nicht kann.");
WriteLn;
IF eingabein30s() THEN
EXIT
END(*IF*);
(* Ausgabe z. Bildschirmseite mit Werbung *)
CLS () ;
WriteString("Drum sollten Sie ihn rasch erwerben,");
WriteLn;
WriteString("Dann freuen sich auch Ihre Erben!!");
IF eingabein30s() THEN
EXIT
END(* IF *);
END(* LOOP *)
END Werbung.
MODULE wcount;
(* counts chars, words and lines from stdin *)
Beispiel „WHILE“:
Wordcount
FROM InOut IMPORT Read, Done, WriteString, WriteLn, WriteCard;
CONST
newline
blank
tab
= 12C;
= 40C;
= 11C;
Steuerzeichen im Text
VAR
chars, words, lines
ch
inword
BEGIN
chars
words
lines
inword
:=
:=
:=
:=
0;
0;
0;
FALSE;
: CARDINAL;
: CHAR;
: BOOLEAN;
Initialisierung der Zähler chars, words und lines,
sowie des „Zustands“ „im Wort“
Einlesen des 1. Zeichens
Read(ch);
WHILE Done DO
chars := chars + 1;
IF inword THEN
CASE ch OF
| blank, tab, newline : inword :=
words :=
ELSE (* nichts *)
END (* CASE *)
ELSE
CASE ch OF
| blank, tab, newline : (* nichts
ELSE
inword :=
END (* CASE *)
END; (* IF *)
FALSE;
words + 1
*)
TRUE
Schleife „arbeitet“ solange Zeichen eingelesen werden.
Analyse aller eingelesenen Zeichen:
Zeichen im Wort?
Wenn nein: neue Zeile, Tab, oder Blank
IF ch = newline THEN
lines := lines + 1
END; (* IF *)
Einlesen des „nächsten“ Zeichens
Read(ch)
END; (* WHILE *)
WriteCard(chars,14); WriteString(" character(s)"); WriteLn;
WriteCard(vords,14); WriteString(" vord(s)"); WriteLn;
WriteCard(lines,14); WriteString(" line(s)"); WriteLn
END vcount.
Ausgabe des Ergebnisses
MODULE numlines;
(* text files with line numbers *)
Beispiel „WHILE“:
Zeilennummerierung
FROM InOut IMPORT Read, Done, Write, WriteString, WriteLn, WriteCard;
CONST
newline = 12C;
VAR
number : CARDINAL;
ch
: CHAR;
first : BOOLEAN;
BEGIN
number := 0;
first := TRUE;
Read(ch);
WHILE Done DO
IF first THEN
number := number + 1;
WriteCard(number,4); WriteString(": ");
first := FALSE
END; (* IF *)
IF ch <> newline THEN
Write(ch)
ELSE WriteLn; first := TRUE
END; (* IF *)
Read(ch)
END (* WHILE *)
END numlines.
Einfache selbstdefinierte Typen
Taxonomie der Datentypen
Einordnung
Datentypen
bisher:
Einfache Datentypen
Strukurierte Datentypen
Gleitkommazahlen
POINTER
REAL
LONGREAL
COMPLEX
LONGCOMPLEX
ARRAY
RECORD
STRING
Ganzzahlen und
Ordinaltypen
CARDINAL
INTEGER
BOOLEAN
CHAR
Zeiger Datentypen
jetzt:
Aufzählungstyp (enumeration)
Ausschnittstyp/
Unterbereichstyp (subrange))
SET,
PACKEDSET
BITSET
Ø Syntax
Ø Syntax (cont‘d)
Aufzählungs- und Unterbereichstypen (1)
Ø Allgemein: Ordinal-Datentypen (geordnet)
· bisher: vordefinierte Datentypen mit interner Ordnung
· jetzt: explizite Definition von Wertemengen durch
* Aufzählung (Reihenfolge = Ordnung)
* Selektion von Teilmengen (Unterbereiche)
Ø Aufzählungstyp (“enumeration”)
· eine geordnete Menge von Werten wird spezifiziert durch Aufzählung
(konstanter Identifikatoren)
· Beispiele:
* mit Variablendeklaration
VAR
Tag : (Montag, Dienstag, Mittwoch, Donnerstag,
Freitag, Samstag, Sonntag);
Farbe : (Weiss, Rot, Blau, Gelb, Gruen, Schwarz);
Aufzählungs- und Unterbereichstypen (2)
Ø Aufzählungstyp (“enumeration”) (cont‘d)
· Beispiele:
* mit Typdefinition
TYPE
Wochentag = (Montag, Dienstag, Mittwoch, Donnerstag,
Freitag, Samstag, Sonntag);
FarbPalette = (Weiss, Rot, Blau, Gelb, Gruen, Schwarz);
VAR
Tag
Farbe
: Wochentag;
: FarbPalette;
* wäre BOOLEAN nicht schon Standard
TYPE
BOOLEAN = (FALSE, TRUE)
Aufzählungs- und Unterbereichstypen (3)
Ø Aufzählungstyp (“enumeration”) (cont‘d)
· Bemerkungen
* Elemente müssen eindeutig definiert sein, dürfen also nicht in 2 Typen
vorkommen
* Bezeichner dürfen nur in einer festgelegten Bedeutung vorkommen
nicht erlaubt:
Karte : (7, 8, 9, Bube, Dame, König, 10, As)
Tag
: (MO, DI, MI, DO, FR, SA, SO)
aber erlaubt:
Tag
: (Mo, Di, Mi, Do, Fr, Sa, So)
* die Elemente einer Aufzählung erhalten analog ihrer Position in der
Aufzählung eine Ordnungszahl zugeordnet
· Operationen und Aktionen
* Wertzuweisung wie gewohnt: Tag := Dienstag; Farbe := Blau;
* durch die Def. der Ordnung sind Vergleiche möglich {=,<>,<,<=,>,>=}
* Funktionen
– Minimum, Maximum: MIN(T) = a0 , MAX(T) = an ¬ Typ T = (a0,a1,...,an)
– Ordnungszahl- und Wertfunktion: ORD(...), VAL(...) mit: ORD(x) =
VAL(CARDINAL,x)
– Nachfolger und Vorgänger: INC(...), DEC(...)
Aufzählungs- und Unterbereichstypen (4)
Ø Aufzählungstyp (“enumeration”) (cont‘d)
· Bsp: MIN, MAX, ORD, INC, DEC bei einem Aufzählungstyp
TYPE
Spielkarte : (Sieben, Acht, Neun, Bube, Dame,
Koenig, Zehn, As);
VAR
Karte : Spielkarte;
BEGIN
...
WriteCard(ORD(MIN(Spielkarte)), 2);
WriteCard(ORD(MAX(Spielkarte)), 2);
Karte := Neun;
WriteCard(ORD(Karte), 2);
= ORD(Sieben) = 1
= ORD(As) = 8
= ORD(Neun) = 3
INC(Karte);
WriteCard(ORD(Karte), 2); WriteLn;
Karte := Bube
DEC(Karte, 2);
WriteCard(ORD(Karte), 2); WriteLn;
Karte := Acht
= ORD(Bube) = 4
= ORD(Acht) = 2
END
Aufzählungs- und Unterbereichstypen (5)
Ø Unterbereichstyp (“subrange”)
· Festlegung eines Unterbereichs des Definitionsbereichs eines ...
* vordefinierten Typs
* eigens definierten (Ordinal-)Typs
· der Grundtyp ist der “Träger (host type)”
· Syntax
Syntaxdiagramme aus Puchan et.al.
Aufzählungs- und Unterbereichstypen (6)
Ø Unterbereichstyp (“subrange”) (cont‘d)
· Beispiele
* Typdefinition
TYPE
Buchstabe
Ziffer
ZahlInt
Wochentag
VL_Tag
BYTE
=
=
=
=
=
=
[“a” .. “z”];
[0 .. 9];
(*Grundtyp CARDINAL*)
INTEGER[1 .. 10];
(Mo, Di, Mi, Do, Fr, Sa, So);
[Mo .. Fr];
[0 .. 255];
* Variablendefinition
VAR
CAPITAL
OktZiffer
: [“A” .. “Z”];
: Ziffer[0 .. 7];
· Hinweise
* der Trägerdatentyp bestimmt die Menge der erlaubten Operationen
* bei Operationen auf Unterbereichstypen dürfen die Ergebnisse den
Wertebereich nicht verlassen
* Unterbereiche auf REAL nicht erlaubt
Aufzählungs- und Unterbereichstypen (7)
Ø Funktion VAL(T,x)
Vereinbarungen:
TYPE Tage
Wochentage
VAR
= (So, Mo, Di, Mi, Do, Fr, Sa);
= [Mo .. Fr];
i, j, z : INTEGER;
r
: REAL
Wertzuweisungen:
i := 42; j := -1; z := 0; r := -2.7;
VAL liefert folgende Ergebnisse:
VAL(CARDINAL, i)
VAL(CARDINAL, j)
VAL(CARDINAL, r)
VAL(INTEGER, i)
VAL(INTEGER, r)
VAL(REAL, i)
VAL(REAL, TRUE)
VAL(CHAR, z)
VAL(CHAR, r)
VAL(BOOLEAN, 0)
VAL(Tage, 5)
VAL(Wochentage, 5)
VAL(Wochentage, z)
=
=
=
=
=
=
=
=
=
=
=
=
=
42
Fehler
Fehler
42
-2
42.0
Fehler
0C
Fehler
FALSE
Fr
Fr
Fehler
Beziehungen mit VAL
CHR(x)
ORD(x)
INT(x)
TRUNC(x)
FLOAT(x)
=
=
=
=
=
VAL(CHAR, x)
VAL(CARDINAL, x)
VAL(INTEGER, x)
VAL(CARDINAL, x)
VAL(REAL, x)
x vom Typ T:
INC(x,n) « x:=VAL(T,VAL(INTEGER,x)+n)
Aufzählungs- und Unterbereichstypen (8)
Ø Kompatibilität (auch für strukturierte Daten)
· Typkompatibilität
strenge Regeln bzgl. der Verträglichkeit von verschiedenen Typen in
Ausdrücken und Zuweisungen!
* 2 Typen sind identisch, wenn sie in einer Typdefinition gleichgesetzt
werden
* 2 Typen haben den gleichen Grundtyp, wenn sie Unterbereiche des
gleichen Typs sind.
· Ausdruckskompatibilität
Alle Operanden in einem Ausdruck haben den gleichen Typ oder den
gleichen Grundtyp
· Zuweisungskompatibilität
Variable W sei vom Typ V, Ausdruck A von Typ E;
Zuweisung W := A ist möglich, falls (Auswahl):
* V und E sind gleich oder haben gleichen Grundtyp
* V hat Grundtyp CARDINAL, E hat Grundtyp INTEGER oder umgekehrt
* V hat Grundtyp CHAR und E ist einelem. oder leere Stringkonstante
Strukturierte Daten
Datenstrukturen
bisher:
Taxonomie der Datentypen
Datentypen
jetzt:
Einfache Datentypen
Strukurierte Datentypen
Gleitkommazahlen
POINTER
REAL
LONGREAL
COMPLEX
LONGCOMPLEX
ARRAY
STRING
Ganzzahlen und
Ordinaltypen
CARDINAL
INTEGER
BOOLEAN
CHAR
Zeiger Datentypen
Ausschnittstyp/
Unterbereichstyp
(subrange)
Aufzählungstyp
(enumeration)
RECORD
SET,
PACKEDSET
BITSET
Ø Unterscheidungsmerkmale
· Typ der Komponenten
* alle Komponenten vom selben Typ (homogene Struktur)
* Komponenten sind i.A. unterschiedlichen Typs (heterogene Struktur)
* übrigens: Komponenten können selbst strukturierte Objekte sein
· Anzahl der Komponenten
* fest vorgegeben, schon zur Übersetzungszeit bekannt,
bleibt während der Programmlaufzeit konstant
* nicht fest vorgegeben; wird während der Programmlaufzeit einmal
bestimmt, bleibt für den Rest der Programmlaufzeit konstant
* variabel, kann sich während der Programmlaufzeit beliebig ändern
(dynamische Liste)
· Zugriff auf die Komponenten
* sequentiell, d.h. nur in bestimmter Reihenfolge (® Dateien)
* direkt über Index (Zahl, Nummer) oder Komponenten-Bezeichner (Name)
* Zugehörigkeitstest (m Î M? ® true/false); Komponenten nicht direkt
ansprechbar
ARRAYs (Felder) (1)
Ø Allgemeines
· Verwendung:
Gruppierungsmöglichkeit (Struktur!) einer fest definierten Anzahl
von Variablen derselben Charakteristik (=(Daten-)Typ)
· Deklaration
VAR
feld
: ARRAY[Typ 1] OF Typ 2;
* Typ 1: Indextyp, muss Ordnungstyp sein
* Typ 2: jeder beliebige, auch selbstdefinierte Typ
· Komponenten von Feldern können selbst wieder strukturiert sein,
also z.B. Felder
* a
:
ARRAY[1..N] OF
ARRAY[1..N] OF REAL
kann abgekürzt werden zu:
a : ARRAY[1..N],[1..N] OF REAL
Einrückung zeigt Hierarchie
ARRAYs (Felder) (2)
Ø Allgemeines (cont‘d)
· Beispiele zu den Indextypen
TYPE
TAGE
VAR
tabelle
=
(So, Mo, Di, Mi, Do, Fr. Sa);
: ARRAY[CHAR] OF CHAR;
Übersetzung eines Zeichensatzes in einen anderen
speicher
Ordinaltyp
: ARRAY[0 .. 1000] OF INTEGER;
lineares Speichersegment
Ordinaltyp
Unterbereich aus
CARDINAL/INTEGER
freierTag : ARRAY[TAGE] OF BOOLEAN;
arbeitsfreie Wochentage
Ordinaltyp
oben definierter Typ
Aufzählungstyp
matrix
: ARRAY[1 .. 3],[1 .. 5] OF REAL;
3 x 5 Matrix
Ordinaltyp
Unterbereich aus
CARDINAL/INTEGER
ARRAYs (Felder) (3)
Ø Allgemeines (cont‘d)
· Beispiele zu gültigen Vereinbarungen von ARRAYs
CONST
n = 8;
TYPE
Wort
Vektor
Letter
Farbe
Fahne
Muster
Palettel
Palette2
Matrix
Matrixl
=
=
=
=
=
=
=
=
=
=
ARRAY[0..3] OF CHAR;
ARRAY[1..n] OF REAL;
ARRAY["a".."z"] OF INTEGER; nicht typkompatibel
(rot, gelb, blau);
trotz interner identischer Struktur
ARRAY[1..3] OF Farbe;
ARRAY Farbe OF BOOLEAN;
ARRAY[1..n] OF ARRAY Farbe OF BOOLEAN;
ARRAY[1..n], Farbe OF BOOLEAN;
ARRAY[1..n],[1..n] OF REAL;
ARRAY[1..n] OF Vektor;
VAR
name,vorname
feld
feld1
k1Buchst
muster
identity
v
z
:
:
:
:
:
:
:
:
Zuweisungen an Feldelemente
name[1]
:= "w";
klBuchst["f"] := 17;
muster[blau] := TRUE;
feld[1,3]
:= 2.7;
feld[1][3]
:= 2.7;
z[7, gelb]
:= TRUE;
z[7][gelb]
:= TRUE;
Wort;
Matrix;
Matrixl;
Letter;
Muster;
Matrix;
Vektor;
ARRAY[1..n] OF Muster;
ARRAYs (Felder) (4)
Ø Zuweisung, Kompatibilität
· Elementweise Zuweisung kompatibler Typen (z.B. REAL)
m[i,j] := 5.0;
A[i] := B[j];
FOR i : = 1 TO n DO
FOR j := 1 TO n DO
IF i = j
THEN
identity[i,j] := 1.0
ELSE
identity[i,j] := 0.0
END (* IF *)
END (* FOR j *)
END; (* FOR i *)
· Sind die Elemente vom selben Typ und sind die Längen der beiden
(Teil-)Felder identisch dann ist erlaubt:
A := B;
2 Felder können nur einander zugewiesen werden, wenn sie denselben oder einen durch Typumbenennung (Alias) entstandenen
kompatiblen Typ haben!
ARRAYs (Felder) (5)
Ø Repräsentation
CONST
n = 5;
m = 3;
VAR
vektor : ARRAY[1..n] OF CARDINAL;
matrix : ARRAY[1..n],[1..m] OF CARDINAL;
Intuition:
- 1. Index = Zeile
- 2. Index = Spalte
vektor
(=Adresse)
1
2
3
4
5
matrix
(=Adresse)
1
2
3
4
5
1
2
3
4
5
6
7
8
9
10 11 12
13 14 15
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3
4,1
5,1
matrix
(=Adresse)
1
2
3
4,2
4,3
5,2
5,3
ARRAYs (Felder) (6)
Ø Zugriff auf Feldelemente
· mit Hilfe von Zählschleifen
· Möglichkeiten (abhängig von Zugriffsreihenfolge)
* innere Schleife zu 2. Index
FOR i:=1 TO n DO
FOR j:=1 TO m DO
matrix[i,j]:= j + (i-1)*m
END
END
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 11 12
10 11 12
13 14 15
13 14 15
1,1
1,2
1,3
2,1
2,2
2,3
3,1
3,2
3,3
4,1
5,1
4,2
4,3
5,2
5,3
* innere Schleife zu 1. Index
FOR j:=1 TO m DO
FOR i:=1 TO n DO
matrix[i,j]:= i + (j-1)*n
END
END
1
1
2
6
3
11
4
2
5 6
7 12
7
3
8 9
8 13
10 11 12
4 9 14
13 14 15
5 10 15
1,1
1,2
1,3
2,1
2,2
3,1
3,2
4,1
5,1
2,3
3,3
4,2
4,3
5,2
5,3
ARRAYs (Felder) (7)
Ø Strings (Zeichenketten)
besonderer ARRAY-Typ für Komponenten vom Typ CHAR
· Struktur
I
f
I
n
f
o
r
m
a
t
i
k
T
h
e
n
U
n
· Deklaration
TYPE
STRING = ARRAY[0..27] OF CHAR;
CONST
s = “string";
leer = “"; (* Leer-String *)
· Operationen
Ein-/Ausgabe
FROM InOut
IMPORT ReadString;
* Schreiben:
U
l
Obere Feldgrenze
Untere Feldgrenze
* Lesen:
i
0C = CHR(0), Nullbyte
m 0C
FROM InOut IMPORT WriteString;
RECORDs (Verbunde) (1)
Ø Feste Verbunde ((Daten-)Verbunde, in anderen Sprachen: „structure“)
· Verwendung
Zusammenfassung von Objekten verschiedener Datentypen unter
einem Namen (ein Komplex)
· Syntax
RECORDs (Verbunde) (2)
Ø Feste Verbunde (cont‘d)
· Deklaration (in TYPE oder VAR)
gegeben sei ein strukturiertes Objekt (artikel) mit seinen
Attributen/Komponenten (nummer, bestand, preis, lager), wobei
eine Komponente wiederum strukturiert sein kann (lager ® gang,
regal, ebene)
VAR
artikel: RECORD
nummer
bestand
preis
lager
END
:
:
:
:
CARDINAL;
CARDINAL;
REAL;
RECORD
gang : [‘A‘..‘H'];
regal : [1..7];
ebene : [1..4]
END
RECORDs (Verbunde) (3)
Ø Feste Verbunde (cont‘d)
· Komponenten
RECORD-Komponente besteht aus Selektor und Komponenten-Typ
preis
Selektor
:
REAL
Komponententyp
RECORD- Komponente
· Zugriff auf individuelle Komponenten
<Bezeichner>.<Selektor>
RECORD-Name
Komponentenname
Selektor- Punkt
RECORDs (Verbunde) (4)
Ø Feste Verbunde (cont‘d)
· Beispiel (1) für Zugriff und Zuweisung
VAR
heute, morgen,
datum
: RECORD
tag
: [1..31];
monat : (Jan, Feb, Mar, Apr, Mai, Jun, Jul, Aug,
Sep, Okt, Nov, Dez);
jahr : [1900..2100]
END
BEGIN
...
datum.tag
datum.monat
datum.jahr
...
heute.jahr
morgen.tag
datum
...
END
:= 10;
:= Apr;
:= 2000;
:= 2001;
:= heute.tag + 1;
:= heute;
Zuweisung eines
ganzen RECORDs
RECORDs (Verbunde) (5)
Ø Zuweisung und WITH-Anweisung
· Standard
* Zuweisung an einzelne Elemente eines RECORD
* Zuweisung ganzer RECORDs
· Wiederholungs-Konstrukt (® WITH-Klausel)
Beispiel
* bei ARRAYs: elementweise Verarbeitung
WITH datum DO
durch FOR-Anweisung
tag
:= 10;
* bei RECORDs:
monat := Apr;
jahr := 2000
einzelne Elemente i.A. unterschiedlichen Typs
END;
(® unterschiedliche Operationen)
®
Zusammenfassung einer Folge individueller Anweisungen, die
sich auf Komponenten desselben Verbundes beziehen
®
bessere Übersichtlichkeit und Effizienzsteigerung falls (intern!)
* Syntax
RECORDs (Verbunde) (6)
Ø Zuweisung (cont‘d)
· Beispiel (3) Zuweisung
VAR
studenten : ARRAY[0..199] OF PERSON;
k
...
: CARDINAL;
BEGIN
...
studenten[50].name := "Klaus Murmann";
studenten[50].gebdatum.monat := Jan;
...
IF studenten[33].name[0] = “A“
THEN tue_dies
ELSE Tue_das
...
END
RECORD im RECORD
RECORDs (Verbunde) (7)
Ø RECORD mit Varianten (Verbunde mit Varianten)
· Verwendung
Möglichkeit mehrere verwandte (nicht ganz identische) RECORDs
unter einem Namen (ein Datentyp!) zu definieren
· Syntax
Das Diagramm Komponente wird durch die CASE-Klausel erweitert
Selektor
RECORDs (Verbunde) (8)
Ø RECORD mit Varianten (cont‘d)
· Deklaration (in TYPE oder VAR)
Programm muss zwischen den verschiedenen Varianten unterscheiden können (® CASE-Klausel)
· Beispiel: komplexe Zahlen (COMPLEX), die entweder kartesisch
oder polar dargestellt werden:
Selektor mit IndexTyp (muss Aufzählungstyp sein)
TYPE
COMPLEX = RECORD
CASE art : (kartesisch, polar) OF;
Auswahl:
kartesisch : re, im : REAL
jeweils ein Wert des
| polar
: r, phi : REAL
ELSE
Selektors aus der
END
Aufzählung.
Damit wird die
Variante bezeichnet
kann auch
entfallen
Zu jeder Variante
müssen die zugehörigen
Komponenten des Verbundes deklariert werden.
RECORDs (Verbunde) (9)
Ø RECORD mit Varianten (cont‘d)
· Bemerkungen
* Varianten können geschachtelt (in Hierarchien) auftreten
* die Werte des Selektors implizieren verschiedene Arten und Anzahl der
Komponenten
* der Compiler reserviert Speicherplatz für die Komponenten mit dem
größten Bedarf
* aktuelle Wert des Selektors « aktuelle Variante
· Achtung:
die Flexibilität durch die Möglichkeit Varianten deklarieren
zu können/dürfen ist eine Quelle häufiger Fehler!
ØØØØ sorgfältiger Umgang mit dieser Strukturierungsmöglichkeit is highly recommended
RECORDs (Verbunde) (10)
Ø RECORD mit Varianten (cont‘d)
· Beispiel „Personalverwaltung“
TYPE
STRING30 = ARRAY[0..29] OF CHAR;
STATUS
= (verh, verw, gesch, ledig);
DATUM
= RECORD
fester RECORD
tag
: [1..31];
monat : (Jan, Feb, Mar, Apr, Mai, Jun, Jul, Aug,
Sep, Okt, Nov, Dez);
jahr : [1900..2100]
END;
PERSON
= RECORD
RECORD mit Varianten
name
: RECORD
nachname, fester RECORD im RECORD
vorname
: STRING30
END;
groesse
: [0..MaxInt]; (* in cm *)
gebDatum : DATUM;
Varianten im RECORD PERSON
CASE MS : STATUS OF
verh, verw : Hdatum : DATUM
| gesch
: Sdatum : DATUM;
ersteS : BOOLEAN
| ledig
:
(* leer *)
END
END;
SETs (Mengen) (1)
Ø Allgemeines
· Verwendung: Zusammenfassung von Elementen desselben
Grundtyps und Behandlung der Werte als Mengen
· In Modula-2 gibt es 2 Arten von Mengen (beide homogen, statisch)
* vordefinierte Mengen, Datentyp BITSET
* benutzerdefinierte Mengen, Datentyp SET OF ...
· Zugriff
Kein direkter Zugriff auf die Elemente, nur Zugehörigkeitstests und
Mengenoperationen
· Hinweise
* als Element-Typen eines SETs sind erlaubt:
– Aufzählungstypen (incl. BOOLEAN)
– Unterbereich der nicht-negativen ganzen Zahlen
* max. Anzahl der Elemente darf aus höchstens W Elementen bestehen
(W maschinenabhängig « Wortlänge: W = 16, 32, ..., „Ulm“)
* BITSET = SET OF CARDINAL[0 .. W-1]
* Bestimme W „rechtzeitig“
SETs (Mengen) (2)
Ø Allgemeines (cont‘d)
· Syntax
vordefiniert
benutzerdefiniert
Syntaxdiagramme aus Puchan et.al.
SETs (Mengen) (3)
Ø Allgemeines (cont‘d)
· Mengenkonstante
explizite Aufzählung der zur Menge gehörigen Elemente in { ... }
(die leere Menge { } ist möglich)
{
Dem Klammerpaar {...} muss
der Grundtyp vorangestellt werden
nicht notwendig bei BITSET
}
SETs (Mengen) (4)
Ø Allgemeines (cont‘d)
· Beispiel „Personenbeschreibung“
TYPE
Eigenschaften
Personenbeschreibung
...
VAR
Taeter
...
= (gross, klein, dick, normal, schlank,
fleissig, ordentlich, baertig);
= SET OF Eigenschaften;
: Personenbeschreibung;
· Beispiel „Farb-Palette“
TYPE
FARBE
...
= (rot, gruen, blau);
CONST
rg
alle
...
= FARBE{rot, gruen};
= FARBE{rot .. blau};
VAR
x
...
: SET OF FARBE;
SETs (Mengen) (5)
Ø Operationen auf Mengen (cont‘d)
· Mengenoperationen (Ergebnistyp = Operandentyp)
* Vereinigung È
* Durchschnitt Ç
* Differenz \
A \ B = A Ç ¬B
® +
® •
® –
* symmetrische Differenz D
A D B = (A È B) \ (A Ç B)
® /
Menge aller Elemente die A und nicht in B enthalten sind
Menge aller Elemente die genau in einer der beiden Mengen A, B enthalten sind
· Vergleichsoperatoren (Ergebnistyp = BOOLEAN)
*
*
*
*
Gleichheit =
Ungleichheit ¹
Inklusion Ê bzw. Í
Element von/aus Î
®=
® <>, #
® >= bzw. <=
® IN
SETs (Mengen) (6)
Ø Operationen auf Mengen (cont‘d)
· Beispiel „Vereinigung“
TYPE
Card
= SET OF [1..4];
...
VAR
m
: Card;
...
m := Card{1..2};
m := m + Card{2..4};
Ergebnis: m = {1, 2, 3, 4}
· Beispiel „Durchschnitt“
(* Vereinbarungen wie oben *)
...
m := Card{1, 2, 3};
m := m * Card{2..4};
Ergebnis: m = {2, 3}
· Beispiel „Differenz“
(* Vereinbarungen wie oben *)
...
m := Card{1, 2, 3};
m := m - Card{2..4};
Ergebnis: m = {1}
SETs (Mengen) (7)
Ø Operationen auf Mengen (cont‘d)
· Beispiel „ Symmetrische Differenz“
TYPE
Card
= SET OF [1..4];
...
VAR
m
: Card;
...
m := Card{1, 2, 3};
m := m / Card{2..4};
Ergebnis: m = {1, 4}
· Beispiel „ Vergleiche“
(* Vereinbarungen wie oben *)
...
Card{1, 2} = Card{3, 4}
1 IN Card{1..3, 4}
Card{1, 2} <= Card{1..4}
Card{1, 2} >= Card{1..4}
Card{1, 2, 3, 4} <> Card{1..4}
Ergebnis: FALSE
Ergebnis: TRUE
Ergebnis: TRUE
Ergebnis: FALSE
Ergebnis: FALSE
· Beispiel zur Verwendung von SETs
(* Vereinbarungen *)
...
IF c IN CHAR{'a','e','i','o','u'} THEN ... END
Û
CASE c OF 'a','e','i','o','u' : ... END
SETs (Mengen) (8)
Ø Operationen auf Mengen
· Hinzufügen/Entfernen von Elementen
* Hinzufügen:
* Entfernen:
Ø Implementierung
INCL(menge,element)
Û menge := menge + {Elementwert}
EXCL(menge,element)
Û menge := menge - {Elementwert}
(Vereinigung)
(Differenz)
· der Basistyp ist geordnet, das erste Element wird mit Index 0
gezählt
· ein Objekt wird abgebildet auf ein oder mehrere Speicherworte
· Zuordnung eines Elements zu einer Menge durch Setzen des Bits
an der entsprechenden (Bit-)Position
TYPE
menge
...
VAR
x
...
= SET OF ['a' .. 'p'];
: menge;
0
1
a
1
0
b
x := menge ['a','c','k','p'];
2
1
c
3
0
d
4
0
e
5
0
f
6
0
g
7
0
h
8
0
i
9 10 11 12 13 14 15
0 1 0 0 0 0 1
j k l m n o p
4. Zahlendarstellung
• Zahlen und ihre Darstellung in Digitalrechnern
• Gleitkommazahlen: Darstellung und Arithmetik
Zahlen und ihre Darstellung in Digitalrechnern
Grundstrukturen: Speicherorganisation und Zahlenmengen
Ø Linear organisierter Speicher
· zu einer Adresse gehört ein Speicher mit 32 Bit-Zellen
(1 Wort „breit“)
adresse
Linearer Speicher
bit
MSB
31
24 23
16 15
LSB
0
8 7
Halbwort
byte
Grundstrukturen: Speicherorganisation und Zahlenmengen
Ø Zahlenmengen (No Ì Z Ì Q Ì R Ì C)
·
·
·
·
·
natürliche Zahlen
ganze Zahlen = natürliche Zahlen und negative ganze Zahlen
rationale Zahlen = ganze Zahlen und gebrochene zahlen
reelle Zahlen = rationale Zahlen und irrationale Zahlen
komplexe Zahlen = reelle Zahlen und „echt imaginäre“ Zahlen
Ganzzahldarstellung (1)
Ø Basis-Zahlendarstellung:
n
zahl = å ai × b i
i =0
·
·
·
·
die Basis b ³ 2 ist aus den natürlichen Zahlen
die Ziffer ai ist aus den natürlichen Zahlen 0 £ ai £ b-1
die Darstellung ist eindeutig
Schreibweise:
zahl = (an ... a0)b
Beispiel: (1024)10 = 1•103 + 0•102 + 2•101 + 4•100
· gebräuchliche Zahlenbasen:
* 2 (Binär-System)
* 8 (Oktal-System)
* 10 (Dezimal-System)
* 16 (Hexadezimal-System)
Beispiel
100011101
435
285
11D
· Multiplikation/Division mit b: shift der Zahl-Ziffernfolge um 1 Stelle
nach links/rechts
Ganzzahldarstellung (2)
Ø Konvertierung zwischen zwei Basen:
n
zahl = å ai × b i = anb n + an -1b n -1 + K + a1b + a0
i =0
zahl = (L (an b + an -1 ) × b + K) × b + a0
(® Horner-Schema)
· Basis b ® Basis 10
* Eingabe: b, Feld a[0..k]
* Ausgabe: Dezimalzahl
* „vorwärts: von links nach rechts“
· Basis 10 ® Basis b
* Eingabe: Dezimalzahl, neue Basis b
* Ausgabe: Feld a[0..k] (neue Ziffernfolge)
* „rückwärts: von rechts nach links “
zahl := 0;
FOR i:=n TO 0 BY -1 DO;
zahl := zahl*b + a[i]
END;
i := 0;
a[i] := 0;
WHILE zahl>0 DO
a[i] := zahl MOD b;
zahl := zahl DIV b;
i
:= i+1
END;
Ganzzahldarstellung (3)
Ø Konvertierung zwischen zwei Basen: (cont‘d)
· Beispiel: (236)8 ® (?)3
* Schritt 1: (236)8 ® Dezimalzahl
n = 2:
(236)8 = ((0·8 + 2)·8 + 3 )·8 + 6 = 158 = (158)10
* Schritt 2: Dezimalzahl ® (?)3
b=3
(158)10 :
158 / 3 = 52
52 / 3 = 17
17 / 3 = 5
5/3 = 1
1/3 = 0
Rest
Rest
Rest
Rest
Rest
2
1
2
2
1
also: (158)10 = ((((0·3 + 1)·3 + 2)·3 + 2)·3 + 1)·3 + 2 = (12212)3
wobei: ( ... ) = 52, ( ... ) = 17, ( ... ) = 5, ( ... ) = 1,
Ganzzahldarstellung (4)
Ø Spezialfall: Konvertierung zwischen Basen 2 ® 2k
· von rechts nach links: Zusammenfassen von jeweils k benachbarten Ziffern
· Beispiel mit der Zahl (300)10 : Die Darstellung zur Basis b=2 soll in
die zur Basis b=8 umgewandelt werden, d.h. k=3:
(100101100) 2 = 1 × 28 + 0 × 27 + 0 × 26 + 1 × 25 + 0 × 2 4 + 1 × 23 + 1× 2 2 + 0 × 21 + 0 × 2 0
100 101 100 = (1 × 2 2 + 0 × 21 + 0 × 20 ) × 26 + (1× 2 2 + 0 × 21 + 1 × 20 ) × 23 + (1 × 2 2 + 0 × 21 + 0 × 2 0 ) × 2 0
100 101 100 = 4 × 8 2 + 5 × 81 + 4 × 80 = (454)8
Ø Spezialfall: Konvertierung zwischen Basen 2k ® 2
· selbst nachdenken!
Negative Zahlen im Binärsystem (1)
Ø Allgemeines
· Die Anzahl der darstellbaren Zahlen ist beschränkt!
(abhängig von der Wortlänge)
* Wortlänge = 8bit ® N = 28 = 256 versch. 0/1-Kombinationen
® 256 verschiedene Zahlen darstellbar, z.B. 0 ... 255 (= N - 1)
· Unser Rechner kann nur addieren, besitzt lediglich ein Addierwerk,
kein Subtrahierwerk; letztlich heisst das, auch Multiplikationen und
Divisionen muss das Addierwerk erledigen!
· Frage: Kann man sich im Bereich der Dezimalzahlen einen
Algorithmus vorstellen, der mittels Addition eine Subtraktion
durchführt?
(unter der Nebenbedingung, dass die Anzahl der darstellbaren
Zahlen beschränkt ist)
* Idee: falls x > 0, dann nix:
falls x < 0, dann:
x®x
x ® N - |x|
Negative Zahlen im Binärsystem (2)
Ø 4 Möglichkeiten der Darstellung
· Vorzeichen und Betrag („signed magnitude“)
* Bit ganz links als Vorzeichen: 0 « + ; 1 « – ;
restliche Bits stellen den Betrag der Zahl dar
* Beispiel: Wortlänge n = 4 Bit ® N = 24 = 16 versch. 0/1-Kombinationen
® 16 verschiedene Zahlen darstellbar, bisher (kardinal) 0 ... 15 (= N - 1),
jetzt (integer) -7 ... +7, also -(2n-1 - 1) ... +(2n-1 - 1)
* Problem 1
es gibt zwei Nullen: +0 « 0000; -0 « 1000
also: Eine Zahl aber zwei unterscheidbare(!) Bitfolgen
* Problem 2
Bei dieser Darstellung ist ein Addierwerk und ein Subtrahierwerk
notwendig; es gibt keinen Algorithmus, der für diese Darstellung
Subtraktion per Addition erledigt
* Problem 3
Es ist eine Logik erforderlich zur Entscheidung, ob Addition oder
Subtraktion auszuführen ist (4 Vorzeichenfälle)
Negative Zahlen im Binärsystem (3)
Ø 4 Möglichkeiten der Darstellung (cont‘d)
· Einer-Komplement (One‘s Complement)
* gebildet durch stellenweises Invertieren der Originalzahl: 0 ® 1, 1 ® 0
* addiert man zur Originalzahl ihr Einer-Komplement (= Invertierte) so
ergibt sich immer eine Folge von Einsen
* Eine Folge von Einsen ist nichts anderes als (die Invertierte der) Null,
also -0 (+0 « Folge von Nullen), d.h. man hat zur Originalzahl deren
„Negatives addiert“
* Beispiel: Wortlänge n = 4 Bit ® N = 24 = 16 versch. 0/1-Kombinationen
® 16 verschiedene Zahlen darstellbar, bisher (kardinal) 0 ... 15 (= N - 1),
jetzt (integer) -7 ... +7, also -(2n-1 - 1) ... +(2n-1 - 1)
* Problem 1: besteht noch
es gibt zwei Nullen: +0 « 0000; -0 « 1111
also: Eine Zahl aber zwei unterscheidbare(!) Bitfolgen
* Problem 2: ist gelöst
Bei dieser Darstellung genügt ein Addierwerk; Subtraktion bedeutet
Addition des Negativen
* Problem 3 (Logik): stellt sich nicht mehr
* Problem 4: 1011 = -4 oder +11 ?? durch beschränkten Zahlenbereich -7
.. .. +7 gelöst. Þ Bit ganz links: 1 « negative Zahl, 0 « positive Zahl
Negative Zahlen im Binärsystem (4)
Ø 4 Möglichkeiten der Darstellung (cont‘d)
· Zweier-Komplement (Two‘s Complement)
* gebildet durch das Einer-Komplement mit nachfolgender Addition von 1
* addiert man zur Originalzahl ihr Zweier-Komplement (= Invertierte + 1) so
ergibt sich immer eine 1 mit nachfolgenden Nullen; die Anzahl der Stellen
ist um eine gewachsen
* Streicht man die führende 1, so sind die nachfolgenden Nullen nichts
anderes als Null, man hat zur Originalzahl deren „Negatives addiert“
* Beispiel: Wortlänge n = 4 Bit ® N = 24 = 16 versch. 0/1-Kombinationen
® 16 verschiedene Zahlen darstellbar, bisher (kardinal) 0 ... 15 (= N - 1),
jetzt (integer) -8 ... +7, also -(2n-1) ... +(2n-1 - 1)
* Problem 1: besteht nicht mehr: 0000 « 0; 1111 « -1
* Problem 2 ist gelöst
Bei dieser Darstellung genügt ein Addierwerk; Subtraktion bedeutet
Addition des Negativen
* Problem 3 (Logik): stellt sich nicht mehr
* Problem 4: 1011 = -5 oder +11 ?? durch beschränkten Zahlenbereich -8
.. .. +7 gelöst. Þ Bit ganz links: 1 « negative Zahl, 0 « positive Zahl
Negative Zahlen im Binärsystem (5)
Ø 4 Möglichkeiten der Darstellung (cont‘d)
· Zweier-Komplement (cont‘d)
* übrigens: Im Zweier-Komplement stimmt die Dualdarstellung von -5 mit
der von 24 - 5 = 16 - 5 = 11 überein:
(5)10 = (0101)2
Zweier-Komplement von (5)10: (1010)2 + 1 = (1011)2 = (11)10
* Beispiel mit Dezimalzahlen (b = 10)
– Es sei n = 2 ® N = 102 = 100 verschiedene Dezimalzahlen, entweder kardinal 0 ... 99 (= N - 1) oder (integer) -50 ... +49, also -5·10n-1 ... + 5·10n-1 -1
– Originalzahl sei (z.B.): 23
Ihr Zehner-Komplement: 102 - 23 = 77 . 77 ist nicht im Zahlenbereich -50 ...
+49; 77 ist die Darstellung von -23 im Zehner-Komplement (x<0: x ® N - |x|)
– addiert man zur Originalzahl ihr Zehner-Komplement, so ergibt sich immer
eine 1 mit nachfolgenden Nullen (hier 100); die Anzahl der Stellen ist um eine
gewachsen
– Streicht man die führende 1, so sind die nachfolgenden Nullen nichts anderes
als Null, man hat zur Originalzahl deren „Negatives addiert“, also eine
Darstellung von -23
– Þ Statt (z.B) 36 - 23 = 13 kann man auch rechnen: 36 + 77 = 113
Þ Statt (z.B) 14 - 23 = - 9 kann man auch rechnen: 14 + 77 = 91 =100 - 9
Negative Zahlen im Binärsystem (6)
Ø 4 Möglichkeiten der Darstellung (cont‘d)
· Zweier-Komplement (cont‘d)
* häufigst genutzte rechnerinterne Darstellung negativer ganzer Zahlen
* Beispiel mit Dualzahlen (b = 2):
– Dual zu berechnen: 85 - 103 = -18
(85)10 = (01010101)2
– Es sei n = 8 ® N = 28 = 256 verschiedene Dezimalzahlen: -128 ... +127
– Aus der Subtraktion -103 soll eine Addition werden:
Originalzahl ist: (103)10 = (01100111)2
Ihr Zweier-Komplement: 10011000 + 1 = 10011001
– Subtraktion ® Addition: 01010101 + 10011001 = 11101110
– Anzahl der Stellen nicht gewachsen
Þ Keine Streichung der führenden 1, die 1 ganz links zeigt ein negatives
Ergebnis, d.h. Ergebnis liegt als Zweier-Komplement vor
Þ Übersetzung = Bildung Zweier-Komplement:
11101110 ® 00010001 +1 = 00010010 = (18)10
Þ Das negative Ergebnis lautet -18
Negative Zahlen im Binärsystem (7)
Ø 4 Möglichkeiten der Darstellung (cont‘d)
· Exzess 2n-1
* der gesamte darstellbare Zahlenbereich (positive und negative
Halbachse) wird auf die positive Halbachse abgebildet
exzess-zahl = zahl + 2n-1
* Beispiel mit n = 8, d.h. Exzess = „Shift“ = 28-1 = 27
(-3)10 ® -3 + 128 = (125)10 = (01111101)2
* Die Darstellungen sind mit denjenigen der Zweier-KomplementDarstellung bis auf das invertierte linke Bit („Vorzeichen“) identisch
Negative Zahlen im Binärsystem (8)
Ø Vergleich der 4 Systeme (n=4)
Dual
Vorz./Betrag
Einer-Kompl.
Zweier-Kompl.
Exzess
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
+0
+1
+2
+3
+4
+5
+6
+7
–0
–1
–2
–3
–4
–5
–6
–7
+0
+1
+2
+3
+4
+5
+6
+7
–7
–6
–5
–4
–3
–2
–1
–0
0
+1
+2
+3
+4
+5
+6
+7
–8
–7
–6
–5
–4
–3
–2
–1
–8
–7
–6
–5
–4
–3
–2
–1
0
+1
+2
+3
+4
+5
+6
+7
Negative Zahlen im Binärsystem (9)
Ø Zahlenring (n=8) für Dualzahlen und Zweier-Komplement
Gleitkommazahlen: Darstellung und Arithmetik
Gleitkommazahlen
Ø Zahlenmenge
b
· rationale Zahlen: r = a/b
1
r=a/b
1
a
Zahlenstrahl
· reelle Zahlen: Hinzunahme von nicht-rationalen Zahlen: p, e, Ö2
Die reellen Zahlen in ihrer mathematischen Bedeutung stellen ein
Kontinuum dar (jedes beliebig große Intervall auf dem Zahlenstrahl
enthält unendlich viele Werte)
Gleitkommazahlen (1)
Ø Zahlenmenge (cont‘d)
· Wertebereich REAL (Gleitkommazahlen) im Rechner stellt eine
endliche Menge von Repräsentanten von Intervallen des
Kontinuums dar Þ Diskretisierung
* numerische Darstellung ® Verarbeitung von Daten des Typs REAL
nicht exakt (® numerische Mathematik)
Gleitkommazahlen Û mathematisch reelle Zahlen
Û mathematisch rationale Zahlen
Gleitkommazahlen (2)
Ø Zahlendarstellung (Konrad Zuse, 1937)
zahl = m × b e
0.1 = 1/10 = 1/b ist kleinstmöglicher Mantissenbetrag!
Warum?
Der nächstkleinere Zahlenbetrag wäre: 0.099 • 10-99
wegen normierter Darstellung:
0.099 • 10-99 ® 0.99 • 10-100
Das ist unmöglich wegen zweiziffrigem Exponent!
· m : Mantisse , -M < m < +M
Normalform: 1/b £ |m| < 1 oder m = 0
· b : Basis, z.B. 10, aber auch kleine Potenz von 2: 2, 4, 8, 16
· e : Exponent, -E £ e £ +E, auch -E1 £ e £ +E2
· alle Werte M, b, E sind rechnerabhängig
· Aufbau:
zahl = ± 0.a1a2...aµ • be mit a1 ¹ 0 (normalisierte Darstellung)
und 0 £ ai £ b-1
· Beispiel: b = 10, Mantisse m: 3 Ziffern, Exponent e: 2 Ziffern
* Mantisse: 1/10 £ |m| < 1 oder 0
* Exponent: -99 £ e £ +99
* darstellbarer Bereich: – 0.999 • 1099 ... – 0.100 • 10-99
+0.100 • 10-99 ... +0.999 • 1099
· Multiplikation/Division mit b: shift der Zahl-Ziffernfolge um 1 Stelle
nach links/rechts oder e ® e+1 / e ® e-1
Gleitkommazahlen (3)
Die Mantisse ist somit um 1Bit
länger als gedacht, weil a1 nicht
gespeichert werden muss!
Ø Normalisierung
· Darstellung der Mantisse in Normalform: 1/b £ |m| < 1
· eine Mantisse mit gesetztem Führungsbit a1 heisst normalisiert
zahl = ± 0.a1a2...aµ • be mit a1 = 1
· durch die Normalisierung wird die Gleitpunktdarstellung eindeutig
Ø Rechnerinterne Repräsentation
· der verfügbare Platz (hier 2 Byte) wird in Felder aufgeteilt
15
Vorzeichen
8 7
Exponent
0
Mantisse
· Für arithmetische Operationen muss bei hardwaremäßiger
Realisierung hoher Aufwand betrieben werden, daher
* Software-Realisierung
* Spezialprozessoren
* Leistungsdaten: MIPS, FLOPS
Gleitkommazahlen (4)
Ø Beispiel einer 3 Byte breiten Zahlendarstellung (Basis b = 2)
12 13
15 16
0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1
Vorzeichen
Exponent
* Vorzeichen:
* Exponent e:
* Mantisse m:
Mantisse
0, also +
Breite: 7 Bit
Exzess 64(=27-1) - Darstellung
(1010100)2 = (84)10 ® 84 - 64 = 20
be = 2 20 = 1048576
Breite: 16 Bit
Darstellung der Mantisse:
16
m = å a j × 2 - j = 1× 2 -12 + 1 × 2 -13 + 1× 2 -15 + 1 × 2 -16
j =1
= (1 × 2 +4 + 1× 2 +3 + 1× 2 +1 + 1 × 20 ) × 2 -16
= 27 × 2 -16
* Zahl:
zahl = + 27 • 2-16 • 220 = + 432
Gleitkommazahlen (5)
Ø Beispiel (cont‘d)
· Normalisierung:
zahl = 2 20 × (1 × 2 -12 + 1× 2 -13 + 0 × 2 -14 + 1 × 2 -15 + 1 × 2 -16 )
= 2 20 × (2 -11 × (1× 2 -1 + 1 × 2 -2 + 0 × 2 -3 + 1 × 2 -4 + 1 × 2 -5 )
= 29 × (1× 2 -1 + 1× 2 -2 + 0 × 2 -3 + 1 × 2 -4 + 1 × 2 -5 )
* Vorzeichen:
* Exponent e:
* Mantisse m:
bleibt 0, also +
Breite: 7 Bit
Exzess 64(=27-1) - Darstellung
9 + 64 = 73 ® (73)10 = (1001001)2
Exponent e um 11 dekrementiert
Breite: 16 Bit
Mantisse um 11 Bit nach links geschoben
0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0
Vorzeichen
Exponent
* Zahl bleibt erhalten:
Mantisse
zahl = + 27 • 2-5 • 29 = + 432
Gleitkommazahlen (6)
Ø REAL-Zahlen auf dem Zahlenstrahl
· Beispiel: b = 10, Mantisse m: 3 Ziffern, Exponent e: 2 Ziffern
NULL
-0.999 • 1099
ausdrückbare
negative Zahlen
negative
overflow
-10100
negative
underflow
- 0.100 • 10-99
-0.999 • 1099
positive
underflow
0
+0.100 • 10-99
ausdrückbare
positive Zahlen
positive
overflow
+10100
· jede REAL-Zahlen repräsentiert ein Intervall der reellen Zahlen;
das Intervall wächst mit zunehmendem Betrag der Zahl, d.h. die
Dichte der Repräsentation nimmt mit zunehmendem Betrag der Zahl
ab
· Eine Abschätzung des Einflusses der Ungleichverteilung der
Repräsentanten auf die rechenoperationen ist nicht trivial
· Behandlung von overflow/underflow, Null, „undefiniert“?
® IEEE Floating-Point Standard 754 (1985) (siehe A.S. Tanenbaum)
Gleitkommazahlen (7)
Ø Probleme
· Test: Assoziativgesetz (Beispiel mit 4-stelliger Arithmetik)
x = 9.900, y = 1.000, z = -0.999
(x+y) + z = 10.90 + (-0.999)
= 9.910
x + (y+z) = 9.900 + 0.001
= 9.901
· Test: Distributivgesetz (Beispiel mit 4-stelliger Arithmetik)
x = 1100., y = -5.000, z = 5.001
(x•y) + (x•z) = (-5500) + 5501 = 1.000
x • (y+z) = 1100. • 0.001
= 1.100
· Auslöschung
Bei der Subtraktion zweier fast gleich großer Werte heben sich die
signifikanten Ziffern auf und die Differenz verliert dadurch an
Signifikanz (z.B. Differenzenquotient)
· Überlaufgefahr
... bei Division durch kleine Werte
Gleitkommazahlen (8)
Ø Rechnerarithmetik
x = mx × 2 ex ,
y = my × 2
· Addition
ex -e y
+ my ) × 2
ex -e y
- my ) × 2
x + y = ( mx × 2
· Subtraktion
x - y = (mx × 2
· Multiplikation
x × y = (mx × m y ) × 2
· Division
ey
ex + e y
x ¸ y = ( mx ¸ m y ) × 2
ex -e y
ey
falls ex £ e y
ey
falls ex £ e y
Herunterladen