- 本日の作業内容
- 出席確認
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し,
出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 |
justice@mag.shimane-u.ac.jp |
件名 |
AttendA12-12_ruby_s0540**
AttendB12-12_ruby_s0540** |
(Aクラス) (Bクラス) |
本文 |
学生番号
氏名
キーワード
|
(改行) (改行)
キーワードは授業中に紹介 |
注意 |
「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号
に修正して下さい.また,ABクラス別は指示にしたがって下さい.
|
- インデント見本
最近複雑な処理が徐々に加わってきたために,インデント(字下げ)に対する注意
が散漫になってきているようです.もう一度きちんとした字下げを確認して下さ
い.次のスクリプトは見本です.
n = 10
count = 1
for i in 0..n-8
m = 1
l = 2
for j in 1..l
if j == 1
printf "%2d行目\n", count
else
count += 1
printf "%2d行目\n", count
end
end
for k in m..l
count += 1
printf "%2d行目\n", count
end
count += 1
end
printf "これでおしまい\n"
|
- エラーメッセージ
エラーメッセージはプログラム作成において非常に重要な意味を持ちますが,み
なさんはメッセージを読もうとしないことが多いように見受けられます.それは,
大きな損失です.そして,英語で書いてあってもパターンはいくつかしかないの
で,それに慣れればすぐに分かるようになります.以下のページにいくつか代表
的な例をまとめていますので,参考にしてください.
http://www.ecs.shimane-u.ac.jp/~nawate/lecture/gairon05/12-12/error.html
- while ループ
注意
これから扱う while ループは間違ったスクリプトを実行させると永久
に終了しない「無限ループ」となる可能性があります.スクリプトが終わらない
場合,S@pphireの「実行」ボタンがへこんだままになって,応答が無くなります.
その場合には,その右隣の「停止」ボタンをクリックしてください.それをしな
いで,S@pphire自身を終了させた場合,無限ループはそのまま動作し続けるので,
そのようなことをくり返していると,授業の途中でパソコンがフリーズします.
昨年はそれでテストや期末試験が出来なかった人が何人か出ました.
- 必要性
前回試した for ループは仮変数に対してどこからどこまでくり返す
かを最初に決めた上で処理を行うものでしたが,必ずしもそのように条件がはっ
きりしている場合だけではありません.例えば,乱数を発生させてその数を足し
て行き,合計がある数まで達したら処理を終わるようなスクリプトでは何回くり
返すのかは分かりません.そこで,終了条件をより柔軟に設定できるループに
while ループがあります.
スクリプトを見てみましょう.
sum = 0
i = 1
while sum < 100
num = rand(10)
sum += num
printf "回数:%2d, 乱数:%2d, 合計:%3d\n", i, num, sum
i += 1
end
|
くり返し乱数を発生させて,発生した乱数の合計が100を越えると終わります.
乱数を使いますので,実行するたびに結果は変わります.大体20回から30回くら
いくり返して終了するはずです.
フローチャートを描くと図1のようになります.フローチャート自体は for
ループと while とで,同じようになることに注意して
下さい.初期条件や終了条件を全て明示的に設定するのが while
ループです.
図1 上記スクリプトのフローチャート
while ループでは for ループのように何回くり返すかを数
える機能 (カウンタ) はありませんので,回数や順番を必要とする場合に
はこのように自分で増やして行く必要があります.初期化は必ずループの
外側,ループの前で行わないとくり返すたびに初期化されてしまいます.
- 構文
while ループの構文は,図1のように
なります.
図1 while ループの構文
ループは条件式が真である限りくり返されます.条件式が偽である間処理をくり
返すような until ループもあります.
- while ループの効用
「文字列処理」と呼ばれるような,文章 (テキスト) がある限り読み込むとか,
出力するといった処理で威力を発揮します.この処理については,後で時間があ
れば言及することにします.
- 応用
while ループの醍醐味である不規則な増分の例を
次の例で試してみましょう.どのような処理を行うものかは,先ずはスクリプト
を眺めて考えて下さい.その後で実行して確認して下さい.
num = rand(10000) + 1
printf "Cross sum of the number %d becomes ", num
sum = 0
while num > 0
sum += num % 10
num /= 10
end
printf "%d.\n", sum
|
このスクリプトの動作に関しては,後程フローチャートと併せて説明するように
しますので,アナウンスに注意して下さい.
- 演習
- 先週学習した三重の for ループの内,次のものを while
ループに変更してみましょう.
for i in 1..3
for j in i..4
for k in j..5
printf "i = %d, j = %d, k = %d\n", i, j, k
end
end
end
|
解答例
- やはり先週学習した行列表示のスクリプト
を while ループに変えてみましょう.
for i in 1..3
for j in 1..3
printf "A%d%d ", i, j
end
printf "\n"
end
|
解答例
- すごろくのシミュレーションを行いましょう.サイコロを振って出た目の数
だけコマを進めます.「ふりだし」から「上がり」まで,途中にマスが20
あるとします.各回のサイコロの目と自分の進んだコマ数を表示し,上
がるまで続けるスクリプトを作成してみましょう.表示は次のようになる
とします.
スタート
サイコロの目: 6,進んだコマ数: 6
サイコロの目: 3,進んだコマ数: 9
サイコロの目: 4,進んだコマ数: 13
サイコロの目: 4,進んだコマ数: 17
サイコロの目: 1,進んだコマ数: 18
サイコロの目: 4,進んだコマ数: 22
ゴール!
|
解答例
- 三角関数のcos xはxが小さいときに,テイラー展開した結果
の高次の項を無視するにより 1 - x と
近似されます.この近似の誤差が1%以内に収まる最大のxを求めて
みましょう.xの単位はラジアンで小数点以下3桁(小数第三位)までの数を扱うものと
します.
解答例
ヒント:xの値を0から順に増やして行き,近似値と真値の差が0.01を越えたら終
了.
- 小テスト
授業の終わりに小テストを実施します.アナウンスに注意していて下さい.
- 宿題
宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく
ださい.
- 本日の用語