Ubungspaket 9 ¨
Logische Ausdr¨ ucke
Ubungsziele: ¨
1. Umgang mit logischen Vergleichs- und Verkn¨ upfungsoperatoren 2. Bilden einfacher und komplexer logischer Ausdr¨ ucke
Skript:
Kapitel: 22 Semester:
Wintersemester 2021/22 Betreuer:
Thomas, Tim und Ralf Synopsis:
Logische Ausdr¨ ucke bestehen aus Vergleichsoperatoren wie
” gr¨ oßer“
oder ” kleiner“ sowie aus logischen Verkn¨ upfungen wie
” und“,
” oder“
bzw. ” nicht“. Logische Ausdr¨ ucke ben¨ otigen wir vor allem bei Fall-
unterscheidungen sowie Schleifen und ¨ uben sie deshalb hier gesondert
ein.
Teil I: Stoffwiederholung
Aufgabe 1: Wahr und Falsch
Wie werden in der Programmiersprache C die beiden logischen Werte
”wahr“ und
”falsch“
ausgedr¨uckt?
wahr : Alle Werte ungleich Null falsch: Ein Wert, der Null ist
Aufgabe 2: Pr¨ azedenzregeln
Erkl¨are kurz mit eigenen Worten, was man beim Programmieren als Pr¨azedenzregeln be- zeichnet. Was hat dies mit der Regel
”Punktrechnung geht vor Strichrechnung“ zu tun, die wir aus dem Mathematikunterricht kennen?
Pr¨azedenzregeln (auch Vorrangregeln genannt) geben an, welche Operationen in welcher Reihenfolge ausgef¨uhrt werden. In der Mathematik ist es ¨ahnlich. Hier gibt es beispiels- weise die Regel
”Punkrechnung geht vor Strichrechnung“. Diese Regeln stellen sicher, dass derartige Ausdr¨ucke von allen in gleicherweise ausgerechnet werden.
Aufgabe 3: Klammersetzung
Welche Klammern sind f¨ur das Einklammern von arithmetischen und logischen Ausdr¨ucken in der Programmiersprache C erlaubt?
(): ja []: nein {}: nein
Teil II: Quiz
Aufgabe 1: Klammersetzung
Bei gemischten Ausdr¨ucken ist immer die Frage, ob man Klammern setzen muss und wenn ja, wo? Hier hilft die Pr¨azedenztabelle (siehe Anhang im Skript oder den gesammelten Ubungspaketen) weiter, nach der der Compiler die Ausdr¨¨ ucke auswertet. Wo sind in den folgenden Ausdr¨ucken die Klammern, wie sie sich der Compiler denkt. In den Ausdr¨ucken sind i und j immer Variablen vom Typ int.
Ohne Klammern mit gedachten Klammern i > 1 && j > 2 (i > 1) && (j > 2) i < j || j == 1 (i < j) || (j == 1)
i < j || j == 1 && j != 4 (i < j) || ((j == 1) && (j != 4)) i + 1 < j || j + 2 < i ((i + 1) < j) || ((j + 2) < i)
Aufgabe 2: Vereinfachung logischer Ausdr¨ ucke
Manchmal kann man logische Ausdr¨ucke vereinfachen. Im Folgenden steht a immer f¨ur einen (logischen) Ausdruck, der die Werte
”wahr“ und
”falsch“ annehmen kann. ¨Uberlege, wie sich die folgenden Ausdr¨ucke vereinfachen lassen:
Ausdruck Vereinfachung
a und wahr a
a oder wahr wahr
a und falsch falsch a oder falsch a
Teil III: Fehlersuche
Aufgabe 1: Fehler in logischen Ausdr¨ ucken
Im folgenden Programm haben sich in den logischen Ausdr¨ucken wieder ein paar kleine Fehler eingeschlichen. Die nachfolgende Ausgabeanweisung (printf()) gibt immer an, f¨ur welche F¨alle der Ausdruck ein logisches
”wahr“ liefern soll. Finde und korrigiere die Fehler.
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j , k ;
6 /* e i n l e s e n von W e r t e n f u e r i , j und k */
7 if i == 1 && j == 1 )
8 p r i n t f ( " i und j h a b e n b e i d e den w e r t 1\ n " ) ; 9 if ( i == 1 && j == 1 || k > 0 )
10 p r i n t f ( " i ist 1 und g l e i c h z e i t i g j g l e i c h 1 o d e r k p o s i t i v \ n " ) ;
11 if ( i = > 1 )
12 p r i n t f ( " i ist g r o e s s e r o d e r g l e i c h 1\ n " ) ;
13 if ( i = 1 )
14 p r i n t f ( " i hat den w e r t 1\ n " ) ; 15 if ( i == 1 &&& j == 1 )
16 p r i n t f ( " i und j h a b e n b e i d e den w e r t 1\ n " ) ; 17 if ( ! ( i < 1) && j > -1 )
18 p r i n t f ( " i und j s i n d b e i d e g r o e s s e r als 0\ n " ) ;
19 }
Zeile Fehler Erl¨auterung Korrektur
Programm mit Korrekturen:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i , j , k ;
6 /* e i n l e s e n von W e r t e n f u e r i , j und k */
7 if ( i == 1 && j == 1 )
8 p r i n t f ( " i und j h a b e n b e i d e den w e r t 1\ n " ) ; 9 if ( i == 1 && ( j == 1 || k > 0) )
10 p r i n t f ( " i ist 1 und g l e i c h z e i t i g j g l e i c h 1 o d e r k p o s i t i v \ n " ) ;
11 if ( i >= 1 )
12 p r i n t f ( " i ist g r o e s s e r o d e r g l e i c h 1\ n " ) ;
13 if ( i == 1 )
14 p r i n t f ( " i hat den w e r t 1\ n " ) ; 15 if ( i == 1 && j == 1 )
16 p r i n t f ( " i und j h a b e n b e i d e den w e r t 1\ n " ) ; 17 if ( ! ( i < 1) && j > 0 )
18 p r i n t f ( " i und j s i n d b e i d e g r o e s s e r als 0\ n " ) ;
19 }
Teil IV: Anwendungen
Aufgabe 1: Werte logischer Ausdr¨ ucke
Welche Bedeutung und Werte haben bzw. liefern die folgenden logischen Ausdr¨ucke? In allen F¨allen sind i = 1, j = 2 und n = 0 Variablen vom Typ int und haben in allen F¨allen die angegebenen drei Werte. ¨Uberlege dir erst das Ergebnis und ¨uberpr¨ufe es erst anschließend anhand eines kleinen eigenen Programms. Beispiel f¨ur die erste Aufgabe:
1 # i n c l u d e < s t d i o . h >
2
3 int m a i n ( int argc , c h a r ** a r g v )
4 {
5 int i = 1 , j = 2 , n = 0;
6 p r i n t f ( " E r g e b n i s : % d \ n " , i > 2 ) ;
7 }
Ausdruck Ergebnis Bedeutung
i > 2. . . . 0/
”falsch“ i ist gr¨oßer als 2 i < 2. . . . 1/
”wahr“ i ist kleiner als 2 i < 2 && n == 0. . . . 1/
”wahr“ i ist kleiner als 2 und n ist null i. . . . 1/
”wahr“ i ist ungleich null (
”wahr“)
! i. . . . 0/
”falsch“ i hat den Wert null (
”falsch“)
! n. . . . 1/
”wahr“ n hat nicht den Wert
”wahr“
i == 1 && j. . . . 1/
”wahr“ i hat den Wert 1 und j ist
”wahr“
i > 2 || n == 0. . . . 1/
”wahr“ i ist gr¨oßer als 2 oder n hat den Wert 0 i > 2 || j == 2. . . . 1/
”wahr“ i ist gr¨oßer als 2 oder j hat den Wert 2 i && ! n. . . . 1/
”wahr“ i ist
”wahr“ und n ist
”falsch“
i == 2 && (j == 1 || n == 1) 0/ falsch“ ihat den Wert2und entweder istjgleich