Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen...

35
Programmierkurs für absolute Anfänger http://www.coli.uni-saarland.de/~cabr/ teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester 2005

Transcript of Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen...

Page 1: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger

http://www.coli.uni-saarland.de/~cabr/teaching.php

Wahrheitswerte, Operatoren und Schleifen

Caren BrinckmannSommersemester 2005

Page 2: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 2

Ü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

Page 3: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 3

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.

Page 4: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 4

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?

Page 5: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 5

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!

Page 6: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 6

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);

Page 7: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 7

Wiederholung (3) Verwechslungsgefahr:

arithmetischer Gleichheitsoperator == Zuweisungsoperator =

Bedingte Anweisungen: if (Bedingung_1) {

Anweisungsblock_1 } elsif (Bedingung _2) {

Anweisungsblock_2...

} else {Anweisungsblock_sonst

}

Page 8: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 8

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

Page 9: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 9

weitere Funktionen Wurzelfunktion: sqrt

$zahl = 15;$wurzel = sqrt($zahl); ## -> 3.872...

Nachkommastellen abschneiden: int$ganzezahl = int($wurzel); ## -> 3

Zufallszahl: randrand($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.)

Page 10: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 10

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) {

...}

}

Page 11: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 11

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

Page 12: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 12

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.

Page 13: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 13

Wahrheitswerte in Perl falsch:

0 (die Zahl 0)

"0" (die Zeichenkette 0)

"" (die leere Zeichenkette)

undef (Wert einer Variablen, die noch nicht initialisiert wurde)

wahr: alle anderen Werte!

Page 14: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 14

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 { print "P";}

if($x = $a) { print "Q";} else { print "R";}

Page 15: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 15

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 {

# ...

}

Page 16: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 16

Zuweisungsoperatoren$zahl = $zahl + 2;

äquivalent: $zahl += 2;

ebenso: -= *= /= %= **= .=

$zahl = 3;$zahl += 5;$zahl -= 6;$zahl *= 10;$zahl /= 4;$zahl %= 3;$zahl **= 3;

$string = "rosa";$string .= "rot";

Page 17: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 17

Inkrement- und Dekrementoperator

$zahl = $zahl + 1;

einfacher: $zahl += 1;

noch einfacher: $zahl++;

ebenso: $zahl = $zahl - 1;

einfacher: $zahl -= 1;

noch einfacher: $zahl--;

Page 18: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 18

Zeichenketten-Wiederholungsoperator

$string = "so" x 3; sososo

$string x= 2; sosososososo

$laut = "t";

$wiederholungen = 5;

$zeichenkette = $laut x $wiederholungen;

Page 19: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 19

Arithmetische Vergleichsoperatoren

Vergleich von Zahlen:

== gleich

!= ungleich

< kleiner

> größer

<= kleiner gleich

>= größer gleich

Page 20: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 20

Beispiel$x=3.000;

$y=3.001;

$z="3";

if($x == $y) {print "A";}

if($x != $y) {print "B";}

if($x < $y) {print "C";}

if($x <= $y) {print "D";}

if($x > $y) {print "E";}

if($x >= $y) {print "F";}

if($x == $z) {print "G";}

if($y != $z) {print "H";}

Page 21: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 21

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!

Page 22: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 22

Lexikographische Vergleichsoperatoren Vergleich von Zeichenketten alphabetische Sortierung: die ASCII-Werte der

Buchstaben werden verglichen

eq gleich

ne ungleich

lt kleiner

gt größer

le kleiner gleich

ge größer gleich

Page 23: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 23

Beispiel$s1="abba";

$s2="abbb";

if($s1 eq $s2) {print "A";}

if($s1 ne $s2) {print "B";}

if($s1 lt $s2) {print "C";}

if($s1 le $s2) {print "D";}

if($s1 gt $s2) {print "E";}

if($s1 ge $s2) {print "F";}

$x=24;

$y=1111;

if($x gt $y) {print "G";}

Page 24: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 24

Ü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";

}

Page 25: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 25

Logische Operatoren – Motivationif ($kontostand <= 0) {

if ($dispo == 0) {

print "Sie dürfen kein Geld abheben.\n";

}

}

if (($kontostand <= 0) && ($dispo == 0)) {

print "Sie dürfen kein Geld abheben.\n";

}

äquivalent:

Page 26: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 26

Logische Operatoren nicht: ! und not und: && und and oder: || und 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.

Page 27: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 27

Präzedenz der Operatorenin 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)

Page 28: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 28

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 ) { print "D"; }

if (! $x) { print "E"; }

if (!($y<$x) && $y==2 || $x==3) { print "F"; }

if (!($y<$x && $y==2 || $x==3)) { print "G"; }

Page 29: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 29

Ü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";

}

Page 30: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 30

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);

Page 31: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 31

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++;

}

Syntax: while (Bedingung) {Anweisungsblock

} Anweisungsblock wird ausgeführt, solange Bedingung

wahr ist.

Page 32: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 32

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.

Page 33: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 33

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";

Page 34: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 34

Beispiel: Lautdauern aufsummieren

$gesamtdauer = 0;while ($zeile = <STDIN>) {

chomp $zeile;($laut,$dauer) = split(/,/,$zeile);$gesamtdauer += $dauer;

}print "Gesamtdauer: $gesamtdauer\n";

g,40u:,156t,65@,52n,80

t,72a:,267k,91

lautdauern.txt gesamtdauer.pl

Aufruf:perl -w gesamtdauer.pl < lautdauern.txt

Page 35: Programmierkurs für absolute Anfänger cabr/teaching.php Wahrheitswerte, Operatoren und Schleifen Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 3 35

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";