Programmierkurs für absolute Anfänger Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester 2005 http://www.coli.uni-saarland.de/~cabr/teaching.php Übungen 10 Leute haben das erste Übungsblatt allein bearbeitet bzw. separat abgegeben. Wichtig: Übungspartner finden! Außerdem: Lösungen nur einmal abgeben. Aufgaben gründlich durchlesen, bevor losprogrammiert wird! Erst das Programm mit Hilfe von Kommentaren strukturiert entwerfen, dann programmieren. Auf dem eigenen Notebook programmieren? Freitag, 29.4.05, 10:45h im CIP-Raum: Installation von Perl unter Windows auf Euren Notebooks Programmierkurs für absolute Anfänger – Sitzung 3 1 Vorlesungsstoff Powerpoint-Folien ausdrucken und durcharbeiten Literatur: Ziegler, J. (2002): Programmieren lernen mit Perl. Springer. http://www.algorilla.de/index.php?page=download.con Schwartz, R. & Christiansen, T. (1997): Learning Perl. O'Reilly. Online-Doku: http://perldoc.perl.org/ neue Sprechstunde: Do 14-15h, Zi. 4.08 Vorlesungsstoff rechtzeitig nachbereiten, so dass die Übungsaufgaben in der Übung gelöst werden können. Programmierkurs für absolute Anfänger – Sitzung 3 2 UNIX / Linux-Kenntnisse Dies ist kein UNIX/Linux-Kurs... Literatur im Handapparat in der Bibliothek: Wolfinger, Christine (2002): Keine Angst vor UNIX. Springer. Linux-Kursmaterial: http://ruthless.zathras.de/facts/linux/ Liste elementarer Unix-Befehle: http://www.zki.hs-magdeburg.de/info/kontakt/service/hardware/ sgi/sgi/unixeinfuehrung1 Buch und/oder freundlichen Helfer schnappen, und elementare Grundkenntnisse selbstständig aneignen! Angebot von Martin: Fr, 29.4.05, 14:30h im CIP-Raum: Einführung in elementare Unix-Befehle und Beantwortung aller sonstigen Fragen. Wer hat Interesse? Programmierkurs für absolute Anfänger – Sitzung 3 3 Wiederholung (1) Namen von Perl-Programmen enden auf .pl Der Quellcode des Programms kann mit einem beliebigen Texteditor erstellt und gespeichert werden. Das Perl-Programm meinprogramm.pl wird ausgeführt mit folgendem Befehl: perl -w meinprogramm.pl Wenn der Perl-Interpreter keine Fehlermeldungen ausgibt und das Programm läuft, heißt das nur, dass es syntaktisch korrekt ist. Trotzdem kann es noch semantische Fehler enthalten. Jedes Programm muss daher ausgiebig getestet werden: Nicht nur den Standardfall testen, sondern alle Möglichkeiten, die auftreten können, abdecken! Programmierkurs für absolute Anfänger – Sitzung 3 4 Wiederholung (2) Innerhalb eines Perl-Programms wird jede Anweisung mit einem Semikolon ; abgeschlossen. Kommentarzeilen beginnen mit # In Variablen werden Werte gespeichert. Namen von skalaren Variablen, d.h. Variablen, die genau einen Wert speichern, beginnen in Perl mit dem Dollar-Zeichen $ Lesen einer Zeile (mit Zeilentrennzeichen) von der Standardeingabe (Tastatur): $zeile = <STDIN>; Funktionsaufruf: Funktionsname(Argument) $wortlaenge1 = length($wort); $wortlaenge2 = length("abakadabra"); Funktion chomp schneidet das letzte Zeichen einer Zeichenkette ab, wenn dieses das Zeilentrennzeichen \n ist. chomp $zeile; ## Variante: chomp($zeile); Programmierkurs für absolute Anfänger – Sitzung 3 5 Wiederholung (3) Verwechslungsgefahr: arithmetischer Gleichheitsoperator == Zuweisungsoperator = Bedingte Anweisungen: if (Bedingung_1) { Anweisungsblock_1 } elsif (Bedingung _2) { Anweisungsblock_2 ... } else { Anweisungsblock_sonst } Programmierkurs für absolute Anfänger – Sitzung 3 6 Nachtrag: \t und ** Häufig benötigtes Sonderzeichen: Tabulator-Zeichen \t print "$spalte1\t$spalte2\t$spalte3\n"; Weiterer arithmetischer Operator: Exponent ** $x = 2 ** 7; 27 = 128 $y = 9 ** 2; 92 = 81 Programmierkurs für absolute Anfänger – Sitzung 3 7 weitere Funktionen Wurzelfunktion: sqrt $zahl = 15; $wurzel = sqrt($zahl); ## -> 3.872... Nachkommastellen abschneiden: int $ganzezahl = int($wurzel); ## -> 3 Zufallszahl: rand rand($zahl) liefert eine zufällige Kommazahl zwischen 0 (inklusive) und $zahl (exklusiv). $zufallskommazahl = rand($zahl); ## Zufallszahl zwischen 0 und 14.99999... mehrere Funktionen/Operatoren in einem Ausdruck: $ganzezufallszahl = int(rand($zahl) + 1); ## ganze Zufallszahl zwischen 1 und 15 (inkl.) Programmierkurs für absolute Anfänger – Sitzung 3 8 Schachtelung von Blöcken Innerhalb eines if-Blocks kann es weitere if-Blöcke geben Schachtelung Schachtelung kann beliebig tief werden. wichtig: korrekte Klammerstruktur und korrekte Einrücktiefe! if ($zahl = = 1) { ... if ($teiler == 0) { ... } ... } else { ... if ($teiler > 0) { ... } } Programmierkurs für absolute Anfänger – Sitzung 3 9 Zahlen und Zeichenketten Eine Zeichenkette, die nur aus Ziffern besteht, kann als Zahl interpretiert werden. $string = "43"; $zahl = 27; $resultat = $string + $zahl; $resultat erhält den Wert 70 Eine Zeichenkette, die keine Ziffern enthält, wird im arithmetischen Kontext als 0 interpretiert. $resultat = "Hallo" + 5; $resultat erhält den Wert 5 Programmierkurs für absolute Anfänger – Sitzung 3 10 Initialisierung von Variablen Eine Variable, die nicht initialisiert wurde, d.h. der noch nie ein Wert zugewiesen wurde, hat in Perl den speziellen Wert undef. Wenn eine nicht-intialisierte skalare Variable in einem Ausdruck verwendet wird, so erhält sie automatisch als initialen Wert den Null-String "". $resultat = $undefiniert + 2; $resultat erhält den Wert 2 Nach Möglichkeit sollten alle Variablen bei ihrem ersten Vorkommen im Programm initialisiert werden. Programmierkurs für absolute Anfänger – Sitzung 3 11 Wahrheitswerte in Perl falsch: 0 "0" "" undef (die Zahl 0) (die Zeichenkette 0) (die leere Zeichenkette) (Wert einer Variablen, die noch nicht initialisiert wurde) wahr: alle anderen Werte! Programmierkurs für absolute Anfänger – Sitzung 3 12 Beispiel: Wahrheitswerte $a=3; if($a) { print "A";} else { print "B";} if(0) { print "C";} else { print "D";} if("0"){ print "E";} else { print "F";} if("") { print "G";} else { print "H";} if($x) { print "I";} else { print "J";} if(3.1415) { print "K";} else { print "L";} if("abel") { print "M";} else { print "N";} if($x == $a) { print "O";} else if($x = $a) { print "Q";} else { print "P";} { print "R";} Programmierkurs für absolute Anfänger – Sitzung 3 13 Flaggen und Boole'sche Variablen Flagge: Variable, die nur kleine ganzzahlige Werte annimmt und an bestimmten Stellen Auskunft darüber gibt, ob bestimmte Bedingungen erfüllt sind oder nicht. Boole'sche Variable: Flagge, die nur zwei Werte annimmt. $gefunden = 0; # Suche... if ($gefunden) { # ... } else { # ... } Programmierkurs für absolute Anfänger – Sitzung 3 14 Zuweisungsoperatoren äquivalent: ebenso: $zahl $zahl $zahl $zahl $zahl $zahl $zahl $zahl = $zahl + 2; $zahl += 2; -= *= /= %= **= = 3; += 5; -= 6; *= 10; /= 4; %= 3; **= 3; .= $string = "rosa"; $string .= "rot"; Programmierkurs für absolute Anfänger – Sitzung 3 15 Inkrement- und Dekrementoperator einfacher: noch einfacher: $zahl = $zahl + 1; $zahl += 1; $zahl++; ebenso: einfacher: noch einfacher: $zahl = $zahl - 1; $zahl -= 1; $zahl--; Programmierkurs für absolute Anfänger – Sitzung 3 16 Zeichenketten-Wiederholungsoperator $string = "so" x 3; $string x= 2; sososo sosososososo $laut = "t"; $wiederholungen = 5; $zeichenkette = $laut x $wiederholungen; Programmierkurs für absolute Anfänger – Sitzung 3 17 Arithmetische Vergleichsoperatoren Vergleich von Zahlen: == != < > <= >= gleich ungleich kleiner größer kleiner gleich größer gleich Programmierkurs für absolute Anfänger – Sitzung 3 18 Beispiel $x=3.000; $y=3.001; $z="3"; if($x == $y) if($x != $y) if($x < $y) if($x <= $y) if($x > $y) if($x >= $y) if($x == $z) if($y != $z) {print {print {print {print {print {print {print {print "A";} "B";} "C";} "D";} "E";} "F";} "G";} "H";} Programmierkurs für absolute Anfänger – Sitzung 3 19 Rundungsfehler Durch die interne Darstellung von Kommazahlen kann es zu Rundungsfehlern kommen. $wert1 = 14.3; $wert2 = 100 + 14.3 - 100; if ($wert1 == $wert2) { print "wert1 ist gleich wert2\n"; } else { print "wert1 und wert2 sind verschieden\n"; } Fazit: Vorsicht beim Vergleich von Kommazahlen! Programmierkurs für absolute Anfänger – Sitzung 3 20 Lexikographische Vergleichsoperatoren Vergleich von Zeichenketten alphabetische Sortierung: die ASCII-Werte der Buchstaben werden verglichen eq ne lt gt le ge gleich ungleich kleiner größer kleiner gleich größer gleich Programmierkurs für absolute Anfänger – Sitzung 3 21 Beispiel $s1="abba"; $s2="abbb"; if($s1 eq $s2) if($s1 ne $s2) if($s1 lt $s2) if($s1 le $s2) if($s1 gt $s2) if($s1 ge $s2) $x=24; $y=1111; if($x gt $y) {print {print {print {print {print {print "A";} "B";} "C";} "D";} "E";} "F";} {print "G";} Programmierkurs für absolute Anfänger – Sitzung 3 22 Übung Folgendes Programm enthält einen beliebten Fehler. Das Programm druckt "Alter Schwede!". Warum? $name = "Otto"; # irgendein Code, der $name nicht verändert # ... if ($name = = "Samar") { print "Alter Schwede!\n"; } Programmierkurs für absolute Anfänger – Sitzung 3 23 Logische Operatoren – Motivation if ($kontostand <= 0) { if ($dispo == 0) { print "Sie dürfen kein Geld abheben.\n"; } } äquivalent: if (($kontostand <= 0) && ($dispo == 0)) { print "Sie dürfen kein Geld abheben.\n"; } Programmierkurs für absolute Anfänger – Sitzung 3 24 Logische Operatoren nicht: und: oder: ! && || und und und not and or Die Varianten unterscheiden sich nur in ihrer Präzedenz: ! hat eine höhere Präzedenz als not, && eine höhere Präzedenz als and, und || hat eine höhere Präzedenz als or. Programmierkurs für absolute Anfänger – Sitzung 3 25 Präzedenz der Operatoren in absteigender Präzedenz: ++ -- (Inkrement, Dekrement) ** (Exponent) ! + - (logisches nicht, unäres plus, unäres minus) * / % x (mal, durch, modulo, String-Wiederholung) + - . (binäres plus, binäres minus, String-Konkatenation) < > <= >= lt gt le ge == != eq ne && (logisches und) || (logisches oder) = += -= *= etc. (Zuweisungsoperatoren) not (logisches nicht) and (logisches und) or (logisches oder) Programmierkurs für absolute Anfänger – Sitzung 3 26 Beispiel $x=1; $y=2; if ($y<$x || $y==2) { print "A"; } if ($y<$x && $y==2) { print "B"; } if (! ($x<$y)) { print "C"; } if (! $x<$y ) if (! $x) { print "D"; } { print "E"; } if (!($y<$x) && $y==2 || $x==3) { print "F"; } if (!($y<$x && $y==2 || $x==3)) { print "G"; } Programmierkurs für absolute Anfänger – Sitzung 3 27 Übung Schreibe ein Programm, das Folgendes leistet: Drei Zahlen x, y und z werden eingelesen. Wenn y zwischen x und z liegt, wird "DRINNEN" ausgegeben. Lösung: $x=<STDIN>; chomp $x; $y=<STDIN>; chomp $y; $z=<STDIN>; chomp $z; if (($x<$y && $y<$z) || ($z<$y && $y<$x)) { print "DRINNEN\n"; } Programmierkurs für absolute Anfänger – Sitzung 3 28 Abgekürzte Auswertung Ein komplexer Ausdruck wird immer von links nach rechts ausgewertet. Der Perl-Interpreter bricht die Auswertung ab, sobald das Ergebnis feststeht: Ausdruck1 && Ausdruck2 Wenn Ausdruck1 falsch ist, wird Ausdruck2 gar nicht mehr ausgewertet. Ausdruck1 || Ausdruck2 Wenn Ausdruck1 wahr ist, wird Ausdruck2 gar nicht mehr ausgewertet. Beispiel: Division durch 0 vermeiden $a = 0; $b = 3; $resultat = $a && ($b / $a); Programmierkurs für absolute Anfänger – Sitzung 3 29 while-Schleife Beispiel: Alle Zahlen von 1 bis 1000 aufzählen. print "1\n"; print "2\n"; print "3\n"; ... $zahl = 1; while ($zahl<=1000) { print "$zahl\n"; $zahl++; } while (Bedingung) { Anweisungsblock } Syntax: Anweisungsblock wird ausgeführt, solange Bedingung wahr ist. Programmierkurs für absolute Anfänger – Sitzung 3 30 Programme mit Daten füttern Normalfall: Standardeingabe STDIN wird von der Tastatur bezogen. Ein Programm kann seine Standardeingabe aber auch aus einer Datei beziehen: Aufruf auf der Kommandozeile mit dem "<"- Symbol Beispiel: $ perl programm.pl < datei.txt Durchforsten der Standardeingabe: Zeile für Zeile aus der Standardeingabe lesen, bis diese leer ist. while ($zeile = <STDIN>) { ## mach was mit $zeile } Übung: Programm, das eine Datei mit Namen einliest, und nur die Namen ausgibt, die mehr als 5 Buchstaben haben. Programmierkurs für absolute Anfänger – Sitzung 3 31 Funktion split Die Funktion split teilt eine Zeichenkette in mehrere Zeichenketten auf. Syntax: split(/Trennzeichen/,Zeichenkette) Beispiel: $zeile1 = "g-40"; ($laut1,$dauer1) = split(/-/,$zeile1); print "Laut: $laut1\nDauer: $dauer1\n"; $zeile2 = "g\t40"; ## Tabulatorzeichen \t ($laut2,$dauer2) = split(/\t/,$zeile2); print "Laut: $laut2\nDauer: $dauer2\n"; $zeile3 = "h\t50-70"; ($laut3,$dauer3) = split(/\t/,$zeile3); print "Laut: $laut3\nDauer: $dauer3\n"; Programmierkurs für absolute Anfänger – Sitzung 3 32 Beispiel: Lautdauern aufsummieren lautdauern.txt g,40 u:,156 t,65 @,52 n,80 t,72 a:,267 k,91 gesamtdauer.pl $gesamtdauer = 0; while ($zeile = <STDIN>) { chomp $zeile; ($laut,$dauer) = split(/,/,$zeile); $gesamtdauer += $dauer; } print "Gesamtdauer: $gesamtdauer\n"; Aufruf: perl -w gesamtdauer.pl < lautdauern.txt Programmierkurs für absolute Anfänger – Sitzung 3 33 Beispiel: Passwortabfrage Folgendes Programm fordert den Benutzer solange zur Eingabe eines Passworts auf, bis er das Passwort "coli" eingibt: $passwort = ""; while ($passwort ne "coli") { print "Passwort: "; $passwort = <STDIN>; chomp $passwort; } print "Das Passwort ist richtig!\n"; Programmierkurs für absolute Anfänger – Sitzung 3 34