課題
- yes(はい),no(いいえ),neutral(どちらでもない)の値がそれぞれ1以上の整数で合計100になるように定められるものと仮定する.
- 真上から右回りでyes,no,neutralの順にそれぞれの回答の割合にあわせた円グラフを描く.yes,no,neutralを表す扇形の領域は異なる色で塗りつぶす.
- 円の大きさおよび3つの色は適当に決めてよい.
- グラフのみを描けばよい.文字,数値,引き出し線は必ずしも描かなくてよい.
- グラフのyes,no,neutralの各領域に枠線(縁取り)をつける必要はない.

プログラムでは,最初にyes,no,neutralの値が最初の条件を満たすように定められたとして,その後の描画処理では,どんな場合でも,与えられたデータにしたがって,円グラフを描けるように記述します. プログラムにおいては,変数を活用して,プログラムを分かりやすくまとめることを期待します. プログラムでは,yes,no,neutralに加えて,必要に応じて自由に変数を追加で定義してください. なお円グラフはどこからどういう順序でどこに描いても構いません.
プログラムテンプレート
次に示すテンプレート(雛型)をプログラム作成に利用して下さい. テンプレートには亀の動作以外は全て書いてあります. 亀の動作の記述を追加してプログラムを完成させて下さい. なお亀の動作は「def draw」から「end」の間に記述します(他の部分は変更する必要はありません).
テンプレートは名前を適宜変えた上で「Home」に保存して利用してください. なおファイルをダウンロードするにはリンクを右クリックして「名前を付けてリンク先を保存...」を選びます.
データの指定方法
プログラムを作成するために,まずyes,no,neutralで合計が100になるようにそれぞれ正の整数でデータを設定してください. また円グラフの半径rも適宜設定してください. それぞれの値は条件を満たせば適当で構いません. それらをテストデータとして利用します.
def draw
yes = 60
no = 25
neutral = 15
r = 150 # 半径
end
プログラムが完成したら,次のように変更してうまく動作することを確認してください. このようにするとyes,no,neutralの値が毎回ランダム(でたらめ)に設定されます. 半径は固定して構いません.
MIN_RATE=1 # yes,no,neutralの最小値の定義(注意::defの前に追加する) def draw # MIN_RATE ≦ yes,no,neutral # yes + no + neutral = 100 yes = rand(MIN_RATE..100-2*MIN_RATE) no = rand(MIN_RATE..100-yes-MIN_RATE) neutral = 100-yes-no r = 150 # 半径 end
rand(m..n)の値は,m,nがともに整数でm≦nのとき,m以上n以下の範囲の整数から(見かけ上)ランダムに決められます.
円弧と扇形の描画
円弧と扇形は次のように描画します. 扇形は外枠のみ描きます.
# 半径rで中心角thetaの円弧を左回りで描く. # thetaが負であれば右回りで描く. # 亀は終点で止まる. arc(r,theta) # 半径rで中心角thetaの扇形を左回りで描く. # thetaが負であれば右回りで描く. # 亀は描画を開始した位置に戻り,描画開始のときと同じ方向を向く. arc(r,theta,true)
[参考] 文字列の描画
次のようにして文字列を描画できます. 式の値を含めて表示することもできます.
x = 10 y = 15 # 「value=(10,15)」と描画する string("value=(#{x},#{y})") # 「Warning!」と描画する.文字は赤,文字の背景を黄色にする set_color(255,0,0) string("Warning!",[255,255,0]) # 「Hello!」と描画する.文字は青,文字の背景を黄色にする.文字のサイズを32とする set_color(255,0,0) string("Hello!",[255,255,0],32) # 「Hello!」と描画する.文字は青,文字のサイズを32とする(背景色は変更しない) set_color(255,0,0) string("Hello!",nil,32)
- 表示する文字列を" "で括ります
- 文字列の中に「#{式}」と書くと式の値を評価してから表示します(※)
- 亀の位置から右に向かって指定された文字列を描きます
- フォント(字体)は固定です
[参考] 数値データの変換(整数→小数)
整数に「to_f」を適用すると,(同じ値の)小数形式のデータが得られます.
a = 2
b = a.to_f # b → 2.0
数値のデータの場合はto_fを使わなくても,小数点と0を追加すれば, それで小数のデータとして扱われて,整数とは区別されます.
a = 2 # 整数データ b = 2.0 # 小数データ # 次のように書いてもよい(0の個数によって値の精度が変わったりはしない) b = 2.000 # 次のようにも書けるが不自然 b = 2.to_f c = 7 u = c / a # u → 3 (整数/整数→商) v = c / b # v → 3.5 (整数/小数→除算) d = -c # d → -7 u = d / a # u → -4 (整数/整数→商;余りは常に非負) v = d / b # v → -3.5 (整数/小数→除算)
注意
以下のことに注意して下さい.
- プログラムを変更したら必ず保存してください.
- タートルグラフィクスのプログラムは実行開始時にしか読み込まれません. そこでプログラムを変更したときに,すでにプログラムを動かしていた(タートルグラフィクスの画面が出たままになっていた)のであれば,一旦終了してから再度実行してください.
- プログラムを実行してエラーがでたら「よくある質問」を参照してみて下さい. もちろん分からないことがある場合には演習中に質問して下さい.
- プログラムを提出する際には「課題提出に関する注意」を必ず守るようにして下さい.
参考資料
Tips
以下,課題に取り組むにあたって,知っておくとよさそうなtips(hint)を示します.
- コマンド履歴を利用する
Terminal(端末)でカーソルキーの[↑]を押すと前に入力したコマンドがでてきます. 一度入力したコマンドを何度も入力する必要はありません.
$ [↑]なお[↑]を押し過ぎたら[↓]で戻せます. - プログラムを切り貼りする(Emacs)
プログラムで似たような処理をいくつも書く場合に,すべて手で入力する必要はありません. コピーしてから必要に応じて書き換えた方が楽です. 次にEmacsでコピーと貼り付けを行う方法を示します.
まずマウス(3ボタン)を使えば,次のようにコピーと貼り付けができます.- コピーしたい部分の最初から最後までをマウスの左ボタンを押しながらドラッグしてなぞる.
- 貼りつけたい場所で,マウスの中ボタンを押す.
次のようにメニューを使う方法もあります.- コピーしたい範囲をドラッグして選択しておく
- メニューの「Edit」から「Copy」でデータをコピーする
- メニューの「Edit」から「Paste」で貼り付ける
また次のようにキーボード操作を使う方法もあります.
[Ctrl]+[k] カーソルの位置から行末までを切り取る [Ctrl]+[y] 切り取ったテキストを貼り付ける
キーの組み合わせが独特ですが,慣れることができれば, キーボードから手を離す必要がなくなります. - 算術演算に関する注意
- 乗算: 演算子は「*」です.数学のように記号を省略することはできません.
- 除算: 演算子は「/」です.ただし「整数/整数」は「商」になります.
- 算術演算の優先順位
算術演算の優先順位は数学と同じです.また括弧によって優先順位を指定できます. 計算式での括弧には常に( )を使います. { }や[ ]は使いません.