Kurz: Auch if ist nur ein Befehl; die Bedingung und die Blöcke sind Argumente:
Teil des Kurses Tcl
if, switch und Vergleiche
Auch if ist nur ein Befehl; die Bedingung und die Blöcke sind Argumente:
proc vorzeichen {n} {
if {$n > 0} {
return "positiv"
} elseif {$n < 0} {
return "negativ"
} else {
return "null"
}
}
proc note {n} {
switch $n {
1 { return "sehr gut" }
2 - 3 { return "gut bis befriedigend" }
default { return "sonst" }
}
}
puts "[vorzeichen 5] [vorzeichen -2] [vorzeichen 0]"
puts "[note 1] / [note 3] / [note 9]"
switch -glob "datei.txt" {
*.txt { puts "Textdatei" }
*.png { puts "Bild" }
default { puts "unbekannt" }
}
set alter 20
puts [expr {$alter >= 18 ? "volljährig" : "minderjährig"}]
puts [expr {"b" in {a b c}}]
puts [expr {"x" ni {a b c}}]Ausgabe:
positiv negativ null
sehr gut / gut bis befriedigend / sonst
Textdatei
volljährig
1
1Schleifen
for {set i 1} {$i <= 5} {incr i} { puts -nonewline "$i " }
puts ""
set j 0
while {$j < 3} {
puts -nonewline "w$j "
incr j
}
puts ""
foreach farbe {rot gruen blau} { puts -nonewline "$farbe " }
puts ""
foreach {schluessel wert} {a 1 b 2 c 3} { puts -nonewline "$schluessel=$wert " }
puts ""
foreach x {1 2 3} y {a b c} { puts -nonewline "$x$y " }
puts ""
for {set i 0} {$i < 10} {incr i} {
if {$i % 2 == 0} continue
if {$i > 7} break
puts -nonewline "$i "
}
puts ""
set summe 0
foreach n {1 2 3 4 5} { incr summe $n }
puts $summeAusgabe:
1 2 3 4 5
w0 w1 w2
rot gruen blau
a=1 b=2 c=3
1a 2b 3c
1 3 5 7
15Prozeduren
proc quadrat {x} { return [expr {$x * $x}] }
proc begruesse {name {gruss "Hallo"}} { return "$gruss, $name!" }
proc summe {args} {
set s 0
foreach z $args { incr s $z }
return $s
}
proc fak {n} {
if {$n <= 1} { return 1 }
return [expr {$n * [fak [expr {$n - 1}]]}]
}
proc tausche {aName bName} {
upvar 1 $aName a $bName b
set tmp $a
set a $b
set b $tmp
}
puts [quadrat 7]
puts [begruesse "Mia"]
puts [begruesse "Mia" "Servus"]
puts [summe 1 2 3 4 5]
puts [fak 15]
set p 1; set q 2
tausche p q
puts "$p $q"
puts [info exists p]
puts [info exists nicht_da]
puts [info args begruesse]
puts [info body quadrat]Ausgabe:
49
Hallo, Mia!
Servus, Mia!
15
1307674368000
2 1
1
0
name gruss
return [expr {$x * $x}]upvar verbindet eine lokale Variable mit einer Variablen des Aufrufers (Übergabe „per Referenz“).
Fehler: catch, try, error
proc teile {a b} {
if {$b == 0} { error "Division durch null" }
return [expr {$a / $b}]
}
if {[catch {teile 10 2} ergebnis]} {
puts "Fehler: $ergebnis"
} else {
puts "Ergebnis: $ergebnis"
}
if {[catch {teile 1 0} ergebnis]} { puts "Fehler: $ergebnis" }
try {
teile 5 0
} on error {meldung} {
puts "try: $meldung"
} finally {
puts "aufgeräumt"
}
catch {expr {1 / 0}} msg
puts $msg
catch {unbekannter_befehl} msg
puts $msg
catch {puts $nicht_gesetzt} msg
puts $msgAusgabe:
Ergebnis: 5
Fehler: Division durch null
try: Division durch null
aufgeräumt
divide by zero
invalid command name "unbekannter_befehl"
can't read "nicht_gesetzt": no such variableMerke
- Kontrollstrukturen (
if,for,while,foreach,switch) sind normale Befehle mit Blöcken in{} proc name {args} {rumpf}definiert Prozeduren,argsfängt beliebig viele Argumenteupvarunduplevelgreifen auf den Aufrufer zucatchundtrybehandeln Fehler;errorlöst sie aus
Übungsaufgabe
Schreibe ggt rekursiv und gib den ggT von 48 und 18 aus.
Quiz zur Selbstkontrolle
Wie definiert man eine Funktion in Tcl?
- proc name {parameter} {rumpf} (richtig)
- def name(parameter):
- function name()
- fn name
Wofür dient upvar?
- Variable des Aufrufers verknüpfen (richtig)
- Variable löschen
- Variable kopieren
- Variable typisieren
Was fängt Fehler ab?
- catch (oder try) (richtig)
- rescue
- except
- guard
Weiter im Kurs
Zurück: Einführung und erstes Programm
Weiter: Listen, Dictionaries und Strings
Alle Kapitel: Tcl im Überblick