~~NOTOC~~ ====== Motivation ====== Das folgende kleine Quiz-Programm in Python ist vermutlich einfach zu verstehen. Du kannst es gerne herunterladen und ausführen. antwort = input("Wie heisst das kulturelle und wirtschaftliche Zentrum der Ostschweiz? ") if (antwort == "St. Gallen") or (antwort == "St.Gallen") or (antwort == "Saint-Gall") or (antwort == "San Gallo"): print("Korrekt!") else: print("Vermutlich falsch.") print("Die als richtig akzeptierten Antworten wären 'St. Gallen', 'St.Gallen', 'Saint-Gall' oder 'San Gallo' gewesen.") Damit du dieses Programm richtig verstehst und in Zukunft ähnliche Programme problemlos schreiben kannst, werden im Rest dieser Webseite und auf der nachfolgenden Seite zu "if-else-statements" einige Sachverhalte erläutert: * Vergleichszeichen (etwa ''=='' im obigen Programm) * Wahrheitswerte * logische Verknüpfungen (etwa ''or'' im obigen Programm) * if-else-statements (beachte die Einrückungen im obigen Programm!) ====== Ein wenig Logik ====== ===== Zum Aufwärmen ===== Zur Einstimmung auf die folgenden eher theoretischen Erklärungen gib in der Python-Shell die folgenden Befehle (oder zumindest einige davon) ein (jeweils gefolgt von ''Enter''). Versuche, die Antworten des Computers vorherzusagen bzw. zu verstehen! (Die Worte in den Überschriften dienen der Orientierung und werden unten erklärt. Die Python-Shell antwortet immer, wenn deine Anfrage eine "sinnvolle" Antwort hat.) === Vergleichsoperatoren === * ''2 == 5'' * ''2 = 5'' * ''2 > 2'' * ''2 >= 2'' * ''not (2 == 5)'' oder gleichbedeutend ''2 != 5'' * ''"Hallo" == "HALLO"'' (selber tippen, kopieren kann fehlschlagen) * ''"Hallo" != "HALLO"'' * ''"2+5" == 2+5'' * ''False == True'' === Datentypen === * ''type(3)'' * ''type(2.5)'' * ''type("3+5")'' * ''type(False)'' === Boolesche Variablen = Booleans === * ''a = (2==5)'' * ''a'' * ''type(a)'' * ''antwort = "Sanggalle"'' * ''antwort'' * ''antwort == "St. Gallen"'' === Logische Verknüpfungen === Logisches Und: * ''False and True'' * ''True and True'' * ''a and True'' Logisches Oder: * ''False or False'' * ''True or False'' * ''True or True'' * ''a or True'' Verneinung = Negation: * ''not True'' * ''not a'' Alles sollte klar werden, sobald du den folgenden Text liest! ===== Wahrheitswerte (= boolesche Werte) und boolesche Variablen ===== Eine Aussage kann entweder ''wahr'' oder ''falsch'' sein, also einen dieser beiden sogenannten [[https://de.wikipedia.org/wiki/Wahrheitswert|Wahrheitswerte]] haben. Statt //Wahrheitswert// sagt man auch **boolescher Werte** (nach [[https://de.wikipedia.org/wiki/George_Boole|George Boole]]). Auf Englisch und in Python heissen die beiden Wahrheitswerte ''True'' und ''False'' (beachte die Grossschreibung). Der zugehörige Datentyp in Python heisst * ''bool'' für boolescher Datentyp; Daten vom Typ ''bool'' haben entweder den Wert ''True'' oder den Wert ''False''. Du hast dies in der Python-Shell bereits durch die Eingabe der Befehle ''type(True)'' bzw. ''type(False)'' gesehen. Variablen vom Datentyp ''bool'' werden als **boolesche Variablen** oder [[https://de.wikipedia.org/wiki/Boolean|Booleans]] bezeichnet. In der obigen Aufgabe war ''a'' eine boolesche Variable. ===== Logische Verknüpfungen ===== Boolesche Werte kann man mit den **logischen Verknüpfungen** ''and'', ''or'' und ''not'' kombinieren (statt //logischer Verknüpfung// sagt man auch [[https://de.wikipedia.org/wiki/Boolescher_Operator|boolescher Operator]]). Diese Verknüpfungen sind durch die folgenden Tabellen definiert (wie du bereits in der obigen Aufgabe herausgefunden hast). ---- **Definition von ''and'' (logisches Und, Konjunktion)** Die letzte Spalte der folgenden Tabelle gibt den Wert des //logischen Und// in Abhängigkeit von allen möglichen Belegungen der Variablen $a$ und $b$ an. Die vorletzte Zeile besagt beispielsweise, dass ''True and False'' als ''False'' definiert ist. | $a$ | $b$ | $a$ ''and'' b | | False | False | False | | False | True | False | | True | False | False | | True | True | True |\\ \\ Merke: Logisches Und ''and'' wird genau dann wahr, wenn beide Argumente wahr sind. ---- **Definition von ''or'' (logisches Oder, Disjunktion)** | $a$ | $b$ | $a$ ''or'' b | | False | False | False | | False | True | True | | True | False | True | | True | True | True | Merke: Logisches Oder ''or'' wird genau dann wahr, wenn mindestens eines der beiden Argumente wahr ist. ---- **Definition von ''not'' (logische Verneinung, Negation)** | $a$ | ''not'' $a$ | | False | True | | True | False | Wenn noch nicht intuitiv klar: Lerne die obigen Tabellen für ''and'', ''or'' und ''not'' auswendig! Sage das Ergebnis der folgenden booleschen Ausdrücke voraus. Teste dann jeweils in der Python-Shell, ob deine Vermutung korrekt war! * ''not(True) and False'' * ''not(True) or False'' * ''(True or False) and True'' * ''(True and True) or (False and True)'' * ''not(True or True)'' Wenn du zu viele Fehler gemacht hast: Erfinde eigene ähnliche Ausdrücke und teste dich selbst. In der mathematischen Logik schreibt man meist effizienter * "$a \land b$" statt "$a$ ''and'' $b$". * "$a \lor b$" statt "$a$ ''or'' $b$". * "$\neg a$" oder "$\overline{a}$" statt "''not'' $a$". Beim Rechnen mit Zahlen verwendest du mehr oder weniger bewusst diverse Rechenregeln (Kommutativgessetze, Assoziativgesetze, Distributivgesetz). Ähnliche Regeln (und noch einige mehr, etwa die "de morganschen Gesetze") gibt es auch beim Rechnen mit Wahrheitswerten, vgl. https://de.wikipedia.org/wiki/Boolesche_Algebra#Definition. Diese Gesetze sind sehr "symmetrisch" und sehr einfach zu beweisen (da man sie jeweils an endlich vielen Eingaben testen kann) - einige werden wir später im Abschnitt "Bits and Bytes" beweisen. ==== Vergleich zum normalen Sprachgebrauch: logisches Und/Oder/Nicht vs. alltagssprachliches Und/Oder/Nicht ==== Die logischen Verknüpfungen ''and'', ''or'' und ''not'' sind an den normalen Sprachgebrauch angelehnt:((Die Wörter "und" und "oder" werden aber in der normalen Sprache nicht immer als logische Verknüpfungen verwendet. Beispiele: (1) Frauen und Männer sind gleichberechtigt. (2) Ich war hungrig und ging in die Mensa. (3) Ich ging in die Mensa und war hungrig. (4) Sein oder Nichtsein, das ist hier die Frage.)) * Die Sonne scheint und das Haus ist rot. * Die Sonne scheint oder das Haus ist rot. * Es ist nicht richtig, dass die Sonne scheint. Im normalen Sprachgebrauch suggeriert "oder" bisweilen ein "entweder ... oder ..." (exklusives Oder). Beispiel: "Ich gehe heute abend ins Kino oder ins Theater." Im Sinne des oben definierten logischen Oders ''or'' ist diese Aussage auch dann wahr, wenn ich sowohl ins Kino als auch ins Theater gehe (denn ''True or True'' hat den Wert ''True''). ==== Vergleichszeichen oder "Wie entstehen Wahrheitswerte?" ==== Vergleiche liefern Boolesche Werte: * ''=='': gleich $=$ für Gleichheit; beispielsweise hat ''2 == 5'' den Wert ''False'' * ''!='': ungleich $\not=$ für Ungleichheit; ''a != b'' und ''not (a == b)'' haben dieselbe Bedeutung. * ''<'': kleiner $<$ * ''<='': kleiner-gleich $\leq$ * ''>'': grösser $>$ * ''>='': grösser-gleich $\geq$ Die Zeichen ''!='' und ''<='' und ''>='' sollen an die in der Mathematik gebräuchlichen Zeichen $\not=$ und $\leq$ und $\geq$ erinnern. Achtung: Das einzelne Zeichen ''='' ist beim Programmieren ein Zuweisungszeichen und kein Gleichheitszeichen wie in der Mathematik! Links davon muss immer eine Variable stehen. (Da die Informatiker das mathematische Gleichheitszeichen zweckentfremdet haben, müssen sie zur Strafe nun immer zwei Gleichheitszeichen eingeben, wenn sie auf Gleichheit testen wollen.) Teste in der Python-Shell: * alle 6 Vergleichszeichen zum Vergleich von Zahlen, also etwa ''-2.3 < -3.2''; * Gleichheitszeichen ''=='' und Ungleichheitszeichen ''!='' zum Vergleich von Strings; * die anderen vier Vergleichszeichen zum Vergleich von Strings, die nur aus Kleinbuchstaben bestehen; * Gleichheitszeichen ''=='' und Ungleichheitszeichen ''!='' zum Vergleich von Booleans (= Wahrheitswerten). Du darfst natürlich auch beliebige Strings oder Booleans mit den "anderen vier" Vergleichszeichen vergleichen, jedoch werden dich manche Ergebnisse vermutlich überraschen, etwa das von ''"Z"<"a"'' oder das von ''False < True''. Strings können unproblematisch mit den Zeichen ''=='' und ''!='' verglichen werden. Achtung aber bei den anderen Vergleichszeichen! Wenn man nur Strings vergleicht, die aus Kleinbuchstaben bestehen, wird die [[https://de.wikipedia.org/wiki/Alphabetische_Sortierung|alphabetische Sortierung]] verwendet, die hoffentlich auch im digitalen Zeitalter aus gedruckten Lexika oder Wörterbüchern bekannt ist. Kommen nur Grossbuchstaben vor, so wird dieselbe Ordnung verwendet. Wenn sowohl Gross- als auch Kleinbuchstaben vorkommen, kommen vermutlich unerwartete Ergebnisse heraus, denn als "alphabetische Reihenfolge" wird "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" verwendet. Kommen auch andere Sonderzeichen vor, wird die ASCII- (oder genauer die Unicode-)Reihenfolge verwendet, vgl. https://en.wikipedia.org/wiki/ASCII#Printable_characters. Auch hier ist der Vergleich mit ''=='' und ''!='' unproblematisch. Intern wird ''True'' als ''1'' und ''False'' als ''0'' gespeichert, was erklärt, warum etwa ''False < True'' wahr ist (und auch etwas wie ''5+True'' keinen Fehler erzeugt). ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:glf22|Zur Kursseite]]