Wish Tcl/Tk 入門

Wish Tcl/Tk 入門

3. 四則計算、初等関数

数値計算をするための基本的な関数は、tcl に含まれています。 またビット操作があります。関数にどんなものがあるか全てを 列挙しませんが、c 言語や fortran 言語 basic にあるようなもの はだいたい揃っています。実例から学びます。

3.1 平均点の計算

(実行例 1.1) 入力した数字の平均点と標準偏差を計算します。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# heikin.tcl
# 人数、合計、自乗和 を計算します。
# 小数点がつくと自動的に実数として処理します。
#
set ninzuu 0
set goukei 0.
set jijowa 0. 
set heikin 0.
set sigma 0.
# 初期化 ボタンです。
button .bt1 -fg blue -bg yellow -text 初期化 -command {
set tensuu1 0.
set ninzuu 0
set goukei 0.
set jijowa 0. 
set heikin 0.
set sigma 0.
}
#
# 点数の入力 entry 窓を作ります。.e1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
# -textvariable moji 変数文字に結果が入ります。
#
entry .e1 -width 10 -bg white -fg blue -textvariable tensuu
#
# bind コマンド 窓 .e1 上での 改行  と { ... }
#               結合します。
#
bind .e1  { 
set ninzuu [ expr $ninzuu + 1 ] 
set goukei [ expr $goukei + $tensuu ]
# pow(a,b) a の b 乗 です。a^b や a**b は使えません。
set jijowa [ expr $jijowa + pow($tensuu,2) ]
set heikin [ expr $goukei / $ninzuu. ]
set sigma  [ expr sqrt( $jijowa/$ninzuu - $heikin*$heikin ) ]
set tensuu1 $tensuu
set tensuu ""
}
#
# いろいろな label を作ります。-relief 形 です。
# 
label .lb1 -text 点数の入力 -bg white -fg blue
label .lb15 -text 直前の点数 -bg white -fg orange
label .lb16 -textvariable tensuu1 -relief groove -bg white -fg blue
label .lb2 -text 現在までの人数 -bg white -fg black
label .lb25 -textvariable ninzuu -relief ridge -bg white -fg blue
label .lb3 -text 平均点 -bg white -fg black
label .lb35 -textvariable heikin -relief raised -bg white -fg blue
label .lb4 -text 標準偏差 -bg white -fg black
label .lb45 -textvariable sigma -relief solid -bg white -fg blue
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#
# -fill both ( x 方向にも y 方向にも 詰めて配置)
#
pack  .lb1 .e1 .lb15 .lb16 .lb2 .lb25 .lb3 \
      .lb35 .lb4 .lb45 .bt1 -fill both -expand yes

点数を入力するには、入力窓に マウスを移動しクリックする 必要があります。

改行で入力です。これは bind で Return key と command を つないでいます。すでに勉強しました。

少し長い例ですが、実行してみますと 平均点と標準偏差が その都度計算されます。直前の点数をいれたのは、どこまで入力し たかを忘れないためです。

label の -relief で 表示窓の形式が変わります。default は -relief flat です。

3.2 ちょっとした電卓 (pow)

(実行例 3.2) 計算式をいれて実行すれば ok です。これは応用が広 い例題だと思います。また tcl で 認識できる 計算 の check が 出来ます。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# siki.tcl
# 初期化 ボタンです。
button .bt1 -fg blue -bg yellow -text 初期化 -command {
set siki ""
set kekka ""
}
#
# 点数の入力 entry 窓を作ります。.e1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
# -textvariable moji 変数文字に結果が入ります。
#
entry .e1 -width 10 -bg white -fg blue -textvariable siki
#
# bind コマンド 窓 .e1 上での 改行  と { ... }
#               結合します。
#
bind .e1  { set kekka [ expr $siki ] }
#
# 実行ボタンでも 実行できることにします。
#
button .bt2 -text 実行 -fg red -bg white -command { 
set kekka [ expr $siki ] } 
button .bt3 -text 終了 -fg blue -bg white -command exit
#
# いろいろな label を作ります。-relief 形 です。
# 
label .lb0 -text 計算式 -width 30 -bg white -fg black
label .lb1 -text 計算結果 -bg white -fg black
label .lb2 -textvariable kekka -relief solid -bg white -fg blue
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#
pack .lb0 .e1 .bt2 .lb1 .lb2 .bt1 .bt3 -fill both -expand yes

先程より短いですが、まずは上を実行して見てください。 計算式に、たとえば (3+4)*8 を入力し、実行ボタンを押します。 また pow(2,10) や exp(1.0) を入力してみてください。

初期化を押さなければ計算式を修正して、再度実行が出来ます。 通常の電卓より便利だと思います。ポケコンはこういう感じだと思 います。

tcl を利用した電卓はいくらでも自分の好きなように作ること ができます。mocalc などは tcl/tk で作られた電卓です。Linux などの package にありますので、ftp 検索で探してみてください。

3.3 ちょっとしたプログラム電卓 (text, eval)

(実行例 3.3) 3.2 を拡張して短い tcl 文章をプログラムとして実 行してみましょう。思想は同じです。text 入力部品 を使います。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# program.tcl
# プログラム入力 text 窓を作ります。.txt1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
#
text .txt1 -width 30 -bg white -fg blue 
#
# 実行ボタンで 実行します。
#
button .bt2 -text 実行 -fg red -bg white -command { 
set contents [ .txt1 get 1.0 end ]
eval $contents 
} 
button .bt3 -text 終了 -fg blue -bg white -command exit
#
# いろいろな label を作ります。-relief 形 です。
# 
label .lb1 -text "計算結果 = \$kekka" -bg white -fg black
label .lb2 -textvariable kekka -relief solid -bg white -fg blue
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#
pack .txt1 .bt2 .lb1 .lb2 .bt3 -fill both -expand yes

#
# set a 1 ; set kekka [ expr $a + 5 ]
#

実行してみましょう。大きな入力空間ができます。 そこに 下の tcl の プログラムを マウスで copy して見てくださ い。そして実行 ボタンを押すと 実行結果に $kekka の値 が表示 されます。

set x 1
set y 10
set z [ expr $x + $y ]
set kekka $z

いろいろな 変数を set したり、複雑な計算ができます。 結果は set kekka で kekka にいれれば 実行されます。

実行は、text の 内容を contents にいれます。get コマンド を利用しています。そして contents の中身を eval コマンドで実 行しています。これも逐次に解釈する インタープリターの性質を うまく利用しています。これで tcl のプログラムを check するこ ともできます。ただし error が分かりにくいと思いますので、文 法を見たいのであれば、% wish を起動してそこの プロンプトで実 行するほうが実際には便利でしょう。プログラムを直しながら何度 でも実行できるのがここの味噌です。初期化ボタンはその意味で作 りませんでした。必要なら マウスで editor に copy します。 file に save するのには menu command を勉強する必要がありま す。


rsaito@ee.uec.ac.jp