Tclで電卓

mzp2008-02-15

30分プログラム、その245。新しくプログラミング言語を覚えたいときに行うべき10の練習問題 | IDEA*IDEAの4つめ「電卓を作ろう」。

4. 簡易電卓。0で割ったときの処理を自分なりに作りこむ。

電卓っぽい動きをするだけで大変だったので、0割り算は無視。電卓は意外と大変。
あと回りの人がTclを知らなくてびっくりした。たいていの言語にTkバインディングあるじゃんよー。

使い方

$ wish calc.tcl

ソースコード

#!/usr/bin/env wish
wm title . "calc"
proc make {parent name} {
    button ".$name" -text $name
}

proc make_buttons {parent from to} {
    frame ".$parent"
    for {set i $from} {$i <= $to} {incr i} {
	button ".$parent.$i" -text $i -command "
	    set value \[expr \$value*10+$i\]
	"
    }
}

make_buttons "fm1" 7 9
button .fm1.div -text "/" -command {
    set previous [expr $previous $op $value]
    set op "/" 
    set value 0
}

make_buttons "fm2" 4 6
button .fm2.mul -text "*" -command {
    set previous [expr $previous $op $value]
    set op "*"
    set value 0
}

make_buttons "fm3" 1 3
button .fm3.minus -text "-" -command {
    set previous [expr $previous $op $value]
    set op "-" 
    set value 0
}

make_buttons "fm4" 0 0
button .fm4.eq    -text "=" -command {
    set value [expr $previous $op $value]
}

button .fm4.plus  -text "+" -command { 
    set previous [expr $previous $op $value]
    set op "+" 
    set value 0
}

button .fm4.clear -text "C" -command { 
    set op "+"
    set previous 0
    set value 0
}

set op "+"
set previous  0
set value 0
label .value -textvariable value

pack .fm1.7 .fm1.8 .fm1.9 .fm1.div -side left
pack .fm2.4 .fm2.5 .fm2.6 .fm2.mul -side left
pack .fm3.1 .fm3.2 .fm3.3 .fm3.minus -side left
pack .fm4.0 .fm4.plus .fm4.eq .fm4.clear -side left
pack .value .fm1 .fm2 .fm3 .fm4 -fill x