Prev / Next / カメ太の日記

いちばん軽いといちばん重い[unplugged][dolittle]

2008-12-03

scales

アンプラグド第7章「いちばん軽いといちばん重い(整列アルゴリズム)」
では、天秤を使っておもりの重さを比較します。実際の授業では天秤を用
意するのが難しいため、ドリトルで天秤プログラムを作ってみました。
プログラムの1行目で重さを軽い順に定義しておくと、マウスでクリック
して重さを比較することができます。カードの文字を空白で区切って並べ
ます。

カード定義="B F D A E C"。
カード=カード定義!" " 分割。

配列:クイック=「|; p l r ret|
  「(自分!要素数?)>1」!なら「
    p=自分!1 読む。tmp=自分!作る 1 位置で消す。
    l=tmp!「|x| x < p」選ぶ。r=tmp!「|x| x >= p」選ぶ。
    ret=l!クイック。ret!(p)書く。(r!クイック)!「|e| ret!(e)書く」それぞれ実行。ret。
  」そうでなければ「自分」実行。
」。

結果=ラベル!"??" 作る 48 文字サイズ -60 -100 位置。
カウンタ=1。
ラベル!"おもり:" 作る -360 -180 位置。
ボタン!100 50 大きさ(色!128 255 128 作る)塗る。
ボタン:大きい=「自分!(赤)文字色」。
ボタン:小さい=「自分!(青)文字色」。
ボタン:ふつう=「自分!(黒)文字色」。
ボタン:選択中=「自分!(緑!暗くする)文字色」。
ボタン:動作=「
「:カウンタ>2」!なら「:カウンタ=1。結果!"??"書く。左!ふつう。右!ふつう」実行。
「:カウンタ==1」!なら「:左=自分。自分!選択中」実行。
「:カウンタ==2」!なら「「(左!読む)>(自分!読む)」!なら「:右=:左。:左=自分。」そうでなければ「:右=自分。」実行。「左:値>右:値」!なら「結果!((左!読む)!">"(右!読む)連結)書く。左!大きい。右!小さい」そうでなければ「結果!((左!読む)!"<"(右!読む)連結)書く。左!小さい。右!大きい」実行」実行。
:カウンタ=:カウンタ+1。
」。
カード表示=カード!作る クイック。
カード表示!「|c|
b=ボタン!(c)作る。
b:値=((カード定義!(c)何文字目?)+1)/2。
」それぞれ実行。

permlink