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 1
Schleifen
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 15
Prozeduren
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 variable
Merke
- 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
Aufgabe
Schreibe ggt rekursiv und gib den ggT von 48 und 18 aus.