EMZETT.
Login

Kurz: Auch if ist nur ein Befehl; die Bedingung und die Blöcke sind Argumente:

Teil des Kurses Tcl

Kapitel 2 von 8 im Kurs Tcl. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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 $summe

Ausgabe:

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 $msg

Ausgabe:

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, args fängt beliebig viele Argumente
  • upvar und uplevel greifen auf den Aufrufer zu
  • catch und try behandeln Fehler; error löst sie aus

Übungsaufgabe

Schreibe ggt rekursiv und gib den ggT von 48 und 18 aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Einführung und erstes Programm

Weiter: Listen, Dictionaries und Strings

Alle Kapitel: Tcl im Überblick