ppt

Werbung
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
Herunterladen