Claus Schönleber

Hitchhacker´s Guide To PASCAL  [Vol. 1]

 [ zurück | weiter ]
   [ Start | Beispielprogramme Download | Home ]

Inhalt

Compiler
Programmieren
Datentypen,
Variablen,
Standardfunktionen
Logik
Verzweigung,
Strukturierung
Schleifen
Felder (Arrays)
Verteiler: CASE
Zeichenketten
(Strings)
Textdateien
Module
(Prozeduren,
Funktionen)
Anhang
(Operatoren,
abgeleitete
Funktionen)
 
 
 

 

 

Logik 

Warum schrecken so viele Menschen zurück, wenn Sie das Wort "Logik" hören? "Gefühllosigkeit", "Kälte" sind wohl gängige Assoziationen. Allerdings ist diese Reaktion nur auf ungenügendes Wissen um die Sache zurückzuführen. Im Übrigen ist es nicht die Abwehr gegen Logik, sondern oft die Reaktion auf pragmatische Rationalität, was aber in unserer Umgangssprache leider selten unterschieden wird. Anders gesagt: Spock ist kein Logiker, sondern Rationalist, und manchmal sogar noch nicht einmal sehr pragmatisch.

Wir brauchen nur einen winzigen Teil der Logik, um mit einer Programmiersprache umzugehen, einen kleinen Teil der Aussagenlogik. Es ist nicht einfach, die elementaren Prinzipien zu begründen. Dieser Teil der Logik ist aber unverzichtbare Voraussetzung, um mit der Materie klarzukommen. Es ist auch nicht weiter schwierig. Die größte Hürde für die meisten Menschen ist die Tatsache, daß wir verlernt haben, das, was um uns herum vorgeht, als etwas besonderes zu betrachten. Wenn man etwas als selbstverständlich ansieht, verliert man die Fähigkeit zur Analyse und ist in seinem eigenen, unveränderlichen Gedankengut gefangen. Für den Computer ist (jedenfalls bis jetzt) nichts selbstverständlich. Man hat, je nach Niveau der benutzten Sprache, alle Einzelheiten eines Lösungsverfahrens genau zu formulieren, sei es im Programm oder im Laufzeitsystem der Sprachimplementation. In PASCAL muß man jeden einzelnen Schritt eines Lösungsverfahrens festlegen. Das erfordert die Zerlegung der Lösung in viele kleine Teillösungen, die am Ende wieder zusammengefügt werden. 

Bevor wir formal werden, wollen wir uns ein Beispiel aus dem Alltag zu Gemüte führen: 

Situation: Sie sind im Vorstand eines Vereines, sagen wir im Meteoritensammlerverein. Die Mitglieder in Ihrem Verein setzen sich aus den verschiedensten Leuten zusammen. Da gibt es zunächst ordentliche Mitglieder und Fördermitglieder, Mitglieder mit ermäßigtem Beitrag und welche, die den vollen Beitrag bezahlen; dann gibt es Ehrenmitglieder, solche, die Meteoriten haben, welche, die keine haben, und so weiter. Es gibt nun, wie jeder in einem Verein aktive Leser weiß, viele Gelegenheiten, zu denen man einen Teil der Mitglieder erfassen muß. Sei es, um den ermäßigten Beitrag zu berechnen oder um irgendwelche anderen Statistiken zu erstellen. 

Beispiele

1. Ermäßigung 

Ordentliche Mitglieder können unter bestimmten Umständen eine Beitragsermäßigung beantragen. Die Umstände sind in unserem Beispiel : Schüler, Student, Rentner, geringes Einkommen. Eine Ermäßigung bekommt also ein 

Ordentliches Mitglied (OM), das 

A) Schüler ist oder 

B) Student ist oder 

C) Rentner ist oder 

D) ein geringes Einkommen hat. 

Die Bedingung kann dann (abgekürzt) so formuliert werden: 

OM und (A oder B oder C oder D) 
Die Bedingung "Ordentliches Mitglied" muß auf jeden Fall erfüllt werden, von den anderen vier Bedingungen reicht eine aus. Daß sich die vier Bedingungen nicht unbedingt ausschließen, tut dem Ganzen keinen Abbruch. Auch ein Student hat normalerweise geringes Einkommen; in diesem Fall treten also die Bedingungen B und D gleichzeitig auf. Da das "oder" jedoch nicht im ausschließenden Sinne benutzt wird, trifft die Bedingung trotzdem zu. 

2. Vereinsstatistik 

Wir suchen im Vereinsregister nach Ehrenmitgliedern (EM) mit einer großen Meteoritensammlung (MS); groß heißt hier mehr als 5. 
EM und (MS > 5)
Wie wir sehen, müssen in diesem Beispiel alle Bedingungen gleichzeitig zutreffen. Eine Bedingung hängt sogar von der Anzahl der Meteoriten ab, die gesammelt worden sind. Trifft auch nur eine Bedingung nicht zu, dann wird das betreffende Mitglied nicht mitgezählt. 

3. Mahnungen 

Wir suchen alle Mitglieder, die ihren Beitrag (B) noch nicht gezahlt haben, damit ihnen Mahnungen geschickt werden können. Die Bedingung ist dann: 
OM und nicht B 
An dieser Stelle ist das "nicht" wichtig. Denn um alle zu finden, die den Beitrag nicht bezahlt haben, muß man die Aussage "Beitrag bezahlt" (B), die ja falsch ergäbe, mit "nicht" negieren, damit die gesamte Aussage wahr ergibt (Nachrechnen!). 

Fazit: Es ist bei der Verarbeitung von Daten unvermeidlich, daß man nach bestimmten Mustern suchen muß. Diese Muster werden aus einer Mischung von Bedingungen und Verknüpfungen erreicht. Die Bedingungen heißen Aussagen und die Verknüpfungen sind die logischen Operatoren UND, ODER und NICHT. In Programmiersprachen, z.B. in PASCAL werden die englischen äquivalente AND, OR und NOT verwendet. Solche verknüpften Bedingungen, wenn sie als Suchanfragen in Datenbanken benutzt werden, werden auch als Raster bezeichnet (z.B. Rasterfahndung).

Aussagen 

Über alle Mitglieder in unserem Verein können Aussagen gemacht werden, wie wir in den oben stehenden Beispielen gesehen haben. Diese Aussagen sind - vor ihrer Überprüfung - nicht die Bestätigung, daß es so wäre, sondern haben die Qualität von Behauptungen oder Hypothesen. Somit muß eine Aussage auf ihren Wahrheitsgehalt untersucht werden, indem man dieses Muster (die Aussage) auf einen konkreten Datensatz (Karteikarte eines Mitglieds) zu einem bestimmten Zeitpunkt anwendet. Ist ein Mitglied zum Beispiel Ehrenmitglied, wird die Bedingung (Aussage) EM mit dem Wert "true" (wahr) ausgewertet, ist das Mitglied kein Ehrenmitglied, kommt "false" (falsch) heraus. Mit diesen beiden Werten kann man rechnen wie mit Zahlen. Es gelten ebenfalls Rechenregeln. Es ist überhaupt dasselbe Prinzip, nur daß eben nicht mit Zahlen, sondern mit den beiden Werten "true" und "false" gerechnet wird. Daß es so wenig Werte gibt, sagt nichts über die Vielfalt der Möglichkeiten aus. 

Da es nicht sicher ist, welches Ergebnis bei der Auswertung herauskommt, muß man den Wahrheitsgehalt zu bestimmten Zeitpunkten (hier bei jeder neuen Karteikarte) wieder prüfen, da er sich bei einer neuen Karteikarte (= anderes Mitglied) wieder ändern kann. 

Ein Programm besteht, wie wir an dem Vereinsbeispiel sehen können, aus vielen Aussagen, deren Wahrheitsgehalt im Augenblick des Bedarfs ermittelt werden muß. Abhängig vom Ergebnis der Auswertung werden bestimmte Anweisungen ausgeführt, andere nicht. 

Wir fassen zusammen: 

Aussage
Eine Aussage ist ein ein Satz, von dem es sinnvoll ist, zu sagen, er sei wahr oder falsch. 
Beispiele
"Die Sonne ist ein Fixstern" (wahr) 
"4 ist keine Primzahl" (wahr) 
"Morgen ist Donnerstag." (manchmal wahr) 
"Gestern regnete es" (manchmal wahr) 
"5 ist kleiner als 3." (falsch) 
"Insekten haben acht Beine" (falsch) 
Kontext
Ein Kontext oder Umfeld im diesem Sinne ist ein verabredeter Themenbereich, in dem eine Aussage geprüft wird. 
Beispiele
Logik; Zoologie; Klatsch; Bibel; Physik; Philosophie; Rockmusik. 
Merksatz: Um den Wahrheitsgehalt einer Aussage ermitteln zu können, muß der Kontext bzw. das Umfeld der Aussage festgelegt werden. Ohne Kontext bzw. Umfeld ist die Auswertung einer Aussage nicht möglich. Aussagen ohne festgelegten Kontext sind sinnlos. 

Beispiele:

Aussage "Der Hahn ist ein Vogel" 
Kontext Ornitologie, Zoologie, Bauernhof  - Auswertung wahr (Haustier) 
Kontext Installationen, Sanitäranlagen - Auswertung falsch (Armatur) 
Kontext Wissenschaftsgeschichte - Auswertung falsch (Physiker Otto Hahn) 
Aussage "C ist ein lateinischer Buchstabe" 
Kontext Deutschlehrer - Auswertung wahr (lateinisches Alphabet) 
Kontext ASSEMBLER-Programmierer - Auswertung falsch (Hexadezimale Ziffer mit Zahlenwert 12) 
Kontext Russe - Auswertung falsch (kyrillischer Buchstabe, entspricht dem lateinischen "S") 
Aussage "w < 17" 
Kontext w := 5 - Auswertung wahr 
Kontext w := 23 - Auswertung falsch 

Wie man an den Beispielen sieht, hängt es wirklich nur vom benutzten Kontext ab, welchen Wahrheitsgehalt man einer Aussage zuordnen kann. Eine schöne Übung, um diese Tatsache nachzuprüfen, sind Reden aller Art, insbesondere politische. 

Logische Operatoren 

Die Werte, mit denen wir also in unserem Teil der Logik rechnen, besteht aus den beiden Symbolen TRUE und FALSE. Ja, Sie haben richtig gelesen! Denn diese Werte sind keine Zeichenketten, Strings, oder ähnliches. Sie haben denselben Status wie Zahlen in der Arithmetik. Und Zahlen werden mit Symbolen dargestellt, die aus Ziffern bestehen. Dementsprechend werden die beiden einzigen Wahrheitswerte, mit denen wir in PASCAL (und anderen Sprachen, z.B. JAVA) arbeiten, mit den Symbolen TRUE und FALSE dargestellt. Da sie aber in PASCAL keine reservierten Worte darstellen, werden sie im Folgenden klein geschrieben. 

Um mit diesen Werten rechnen zu können, brauchen wir zusätzlich noch einige Rechenoperatoren und Regeln dazu. Wir haben sie in unserem Vereinsbeispiel schon kennengelernt. Die Operatoren sind: 
 

NOT Negation (unär)
OR ODER-Verknüpfung (binär)
XOR Antivalenzverknüpfung (binär);
(Nur im binären Fall ist die Antivalenz mit XOR äquivalent.)
AND UND-Verknüpfung (binär)
[Logische Operatoren]

Wie in den Klammern schon angegeben, ist der Operator NOT unär, d.h., daß er nur auf jeweils einen Wert angewandt werden kann. Er hat eine ähnliche Funktion wie das negative Vorzeichen bei Zahlen. OR und AND dagegen sind binär, d.h. zweiwertig; sie werden auf jeweils zwei Werte angewandt. Weiterhin gibt es noch die Vergleichsoperatoren, die oben schon erwähnt worden sind. 

Wir haben nun alles, was man zum Rechnen braucht: 

  • Eine definierte Menge von Werten (true, false) 
  • Die Operatoren NOT, OR, AND, XOR, 
  • Vergleichsoperatoren 
Wie rechnet man nun mit diesen für manche ungewohnten Operatoren? Es ist nicht sehr schwierig. Da es nur zwei Werte gibt, können sich die Ergebnisse aus solchen Rechnungen in nicht sehr großen Bereichen bewegen. So liegt es eigentlich klar auf der Hand, daß die Negation von "wahr" nur "falsch" sein kann. Ein Beispiel: Die Aussage "Der Hahn ist ein Vogel" kann negiert werden, indem man ein "kein" dazwischen setzt: "Der Hahn ist kein Vogel". Es geht aber noch formaler, indem wir NOT benutzen: 
NOT ("Der Hahn ist ein Vogel") 
NOT heißt: "Es ist nicht true (wahr), daß...". Damit wird aus der Auswerteung "wahr" das Ergebnis "falsch", beim Ausgangswert "falsch" kommt "wahr" heraus. 

Um die Ergebnisse aller Operatoren darzustellen, benutzt man eine Wahrheitstafel

Man geht üblicherweise von zwei Aussagen A und B aus. Da es für die zwei Aussagen jeweils zwei verschiedene Möglichkeiten der Auswertung gibt, existieren insgesamt vier mögliche Kombinationen. Diese sind in den ersten zwei Spalten eingetragen. In der dritten Spalte ist die Operation mit NOT eingetragen, wobei zwar zwei Zeilen reichen würden, um des vollständigen Bildes der Tabelle willen das Ergebnis aber traditionsgemäß doppelt aufgeführt wurde. Im Übrigen steht "T" für true, "F" für "false". 
 

Aussage a Aussage b NOT a a OR b a AND b a XOR b
F F T F F F
F T T T F T
T F F T F T
T T F T T F
[Wahrheitstafel]

Anwendung 

Es gibt natürlich viele Anwendungen, und wir werden im Laufe dieses Kurses auch noch einige kennenlernen. Aber zwei sehr einfache Beispiele sollen Ihnen doch vorgeführt werden. 

1. Prüfen eines Bereiches 

In der Eingabe eines Programmes sollen aus nachvollziehbaren Gründen nur ein begrenzter Buchstabenbereich zugelassen werden. Die aus einem Zeichen bestehende Eingabe muß nun daraufhin überprüft werden, ob der Bereich eingehalten wurde. Der zulässige Bereich soll für unser Beispiel das Alphabet (Buchstaben "A" bis "Z") sein, die Eingabevariable heiße "eingabe" und sei vom Typ "char". Wie man anhand der ASCII-Tabelle im Anhang überprüfen kann, stehen die Buchstaben in richtiger Reihenfolge lückenlos hintereinander. Das ermöglicht einen Vergleich mittels der Vergleichsoperatoren. 

Es sind zwei Aussagen zu verknüpfen: 

  1. Aussage A: eingabe < 'A' 
  2. Aussage B: eingabe > 'Z' 
Wir wollen im Falle einer Bereichsüberschreitung einen Fehler ausgeben. Daraus ergibt sich folgende Tafel: 
 
Eingabe < 'A' Eingabe > 'Z' gewünschtes Ergebnis
F F F
F T T
T F T
T T [existiert nicht]
[Anwendung der Wahrheitstafel]

Wenn wir die dritte Spalte dieses Beispiels mit der oben stehenden Wahrheitstafel vergleichen, sehen wir, daß zwei Operatoren dieses Ergebnis liefern, nämlich OR und XOR. Obwohl beide nicht ganz identisch sind, klappt das in diesem Falle trotzdem, da der Fall, daß beide Aussagen gleichzeitig wahr sind, nicht eintreten kann. Kein Buchstabe kann gleichzeitig vor "A" und hinter "Z" stehen. 

Der geforderte logische Ausdruck muß also heißen: 

(eingabe < 'A') OR (eingabe > 'Z') 
oder 
(eingabe < 'A') XOR (eingabe > 'Z') 
Die Klammern dienen der Übersicht und sollten eigentlich immer, ob notwendig oder nicht, gesetzt werden.

2. Prüfen auf gerade Zahl 

Eine gerade Zahl (in der Variablen "x" vom Type "integer") ist ohne Rest durch zwei teilbar, also gilt: 
x MOD 2 = 0 
Es geht aber einfacher; in PASCAL gibt es die Funktion odd (), die prüft, ob eine Zahl ungerade ist. Eine gerade Zahl ist dann diejenige, bei der die Funktion odd () ein false zurückgibt. Die Auswertung soll allerdings bei einer geraden Zahl ein true ergeben, also muß negiert werden. Außerdem soll das Ergebnis in eine Variable "is_even" vom Typ "boolean" geschrieben werden: 
is_even := NOT odd (x); 
Dieses Beispiel zeigt auch gleich eine Programmiertechnik, die Sie sich schon, vor aller PASCAL-Kenntnis, merken können. Die Variable "is_even" ist ein Flag. Ein Flag ist eine Variable, in der man das Ergebnis eines Ereignisses speichert, um es später zu verwenden. Das kann, wie im Beispiel, eine Variable vom Typ "boolean" sein, oder, in manchen Fällen auch mal vom Typ "integer", wenn es mehr als zwei Möglichkeiten gibt. 
Flag
Ein Flag in diesem Sinne ist eine Variable vom Typ "boolean" (in seltenen Fällen "integer"), die durch ihren Zustand einem späteren Programmteil anzeigt, daß eine früher getestete Bedingung erfüllt worden ist (oder auch nicht). 
Beispiele
(siehe oben Beispiel 2)
Flags müssen vor Ihrer ersten Benutzung unbedingt in einen definierten Anfangszustand versetzt (initialisiert) werden. 
 [ zurück | weiter ]
   (c) 2001 Schoenleber.com