- 本日の作業内容
- 出席確認
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し,
出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 |
justice@mag.shimane-u.ac.jp |
件名 |
AttendA12-19_ruby_s0540**
AttendB12-19_ruby_s0540** |
(Aクラス) (Bクラス) |
本文 |
学生番号
氏名
キーワード
|
(改行) (改行)
キーワードは授業中に紹介 |
注意 |
「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号
に修正して下さい.また,ABクラス別は指示にしたがって下さい.
|
- ゴミファイル削除
S@pphireを使用して無限ループを実行してしまった際に,saphireディ
レクトリにNFSサーバが作成したログが記録されます.このログファイルは無用
のものですが,容量がやたら大きくて場合によっては数GBにもなります.これが
サーバに負荷をかけて授業中にパソコンの操作が困難になっている要因の一つで
す.まずは,これまでに出来てしまったファイルを削除しておきましょう.ディ
レクトリ内のファイルをまず確認してください.
$ ls -a ~/sapphire
としてみて,結果の表示の中に .nfs0023d2720000001f のような
.nfs で始まる名前のファイルがあればそれがゴミです.それを削除してお
きましょう.
$ rm -f ~/sapphire/.nfs*
- S@pphireアップデート
S@pphireを使用して無限ループを実行してしまった際にサーバに負荷をかけてし
まうことを避けるために,スクリプトの実行ディレクトリを変更したバージョン
のS@pphireを作成しました.これで,動作がうまく行くか,まだわかりませんが,
そちらのバージョンにアップデートしてください.バージョン0.1.7を再ダウン
ロードするだけで,他の設定はそのままで使用できます.
ダウンロードページへ移動
- printf による文字幅指定
前回の授業で printf を利用した文字幅指定を一部使用しました.今
回はもう少し詳しく説明しておきますので,今後は参考にしてください.
まずは,次のスクリプトの動作結果を確認してみましょ
う.
i = 0
while i < 20
a = i / 3.0
b = i / 123456.7
printf "%4d %-4d %7.1f %7.3f %e %8.1e\n", i, i, a, a, b, b
i += 1
end
|
最初の二つの列は整数型の表示ですが,4文字分の幅を確保した上で,最初は右
寄せ,次は左寄せで表示しています.このようにマイナス符号をつけると左寄せ
となります.
次の二つの列は浮動小数点型の表示ですが,用意する文字幅はいっしょでも小数
部の桁数を変えています.このように,小数点を %f につけることに
より小数部の桁数指定が可能です.
最後が指数表示で,桁数が大きい数を有効数字と指数に別けて表示するものです.
小数部の桁数指定は %f のときと同じです.
- while ループの活用
長さの分からない文字列において,特定の文字が何回出てくるか,というような
処理は while ループに向いた処理ですので,その例を試してみましょ
う.次の例を見て下さい.
n = rand(10) + 10
str = ""
for i in 0..n
str += rand(100).to_s
end
printf "String: %s\n", str
counter = 0
while str.length > 0
if str[0].chr == "0"
counter += 1
end
str = str.reverse.chop
end
printf "Occurrence of 0: %d\n", counter
|
前半部分で行っていることは,数字からなる不定の長さの文字列生成です.後半
の while ループで生成した文字列の中に数字の「0」が何回出てくる
かを数えています.これまでの授業で学習して来たメソッドを使用することを前
提にしていますので,ちょっとややこしい処理になっています.文字列の先頭の
文字が「0」かどうかを比較して,マッチすれば変数 counter の値を
1増やします.しかし,先頭文字列を一文字除去する方法が無いので,文字列の
順番を reverse メソッドで逆にし,chop メソッドで末尾の
文字を取り除きます.なので,while ループの中では文字列が毎回反
転しています.終了条件は文字列の長さが0になったときです.
上のスクリプトは次のようにしても出来ます.各種の
言語にはいろいろ便利なメソッドや関数がありますので,勉強すればするほど短
くてすっきりしたプログラムが書けるようになります.
n = rand(10) + 10
str = ""
for i in 0..n
str += rand(100).to_s
end
printf "String: %s\n", str
before = str.length
after = str.delete("0").length
printf "Occurrence of 0: %d\n", before - after
|
for ループだけでも実現できます.以下のように
なり,実はこっちの方がすっきりしているようです.しかし,
while にも慣れておきましょう.それには,使うことが
一番です.
n = rand(10) + 10
str = ""
for i in 0..n
str += rand(100).to_s
end
printf "String: %s\n", str
counter = 0
for i in 0..str.length-1
if str[i].chr == "0"
counter += 1
end
end
printf "Occurrence of 0: %d\n", counter
|
もう一つ例を考えてみましょう.今度は,意図的に無限ループを作り,特定の条
件が成立したときにループから抜け出るものです.次の例
をを見て下さい.
i = 1
while i
num = rand(100) + 700
if num == 777
break
end
i += 1
end
printf "777が出たのは%4d 回目\n", i
|
無限にくり返すループを作れるのは while ループですので,ユーザか
らの応答を待ってアクションをおこすようなプログラムでは実は重要な概念です.
さて,このスクリプトで大事なのは新たに出てきたメソッド break です.こ
れは,while ループに限らずその他のループにおいても,ループを抜
け出すメソッドです.必要に応じて使うと便利なメソッドです.
- until ループ
while ループは条件が真の間回り続けるループでしたが,if
に対する unless と同じように,条件が逆になったループも存在
します.ここで紹介する until ループは条件式が偽の間回ります.単
語の意味的には,「真になるまで」回るということで until です.
使いかたの例を見てみましょう.
n = 20
i = 1
until i > 20
puts i
i += 1
end
|
- 演習
- 前回の授業で作成したすごろくスクリプトを改良して,上がるためにはちょ
うどぴったりの目のときだけになるようにしてみましょう.
結果表示は以下のようなものとしてみます.
スタート
サイコロの目: 4,進んだコマ数: 4
サイコロの目: 6,進んだコマ数: 10
サイコロの目: 2,進んだコマ数: 12
サイコロの目: 6,進んだコマ数: 18
サイコロの目: 1,進んだコマ数: 19
サイコロの目: 5,進めず
サイコロの目: 5,進めず
サイコロの目: 6,進めず
サイコロの目: 3,進めず
サイコロの目: 3,進めず
サイコロの目: 3,進めず
サイコロの目: 1,進んだコマ数: 20
サイコロの目: 1,ゴール!
|
解答例
- 上のスクリプトをさらに改造していきます.ゴール直前にサイコロの目がの
こりのマスの数よりも多い場合には,余りの分だけ戻ってやりなおし,ちょ
うどのときだけ上がるようにしてみましょう.
サイコロの目: 2,現在位置: 2,ゴールまであと: 19
サイコロの目: 2,現在位置: 4,ゴールまであと: 17
サイコロの目: 6,現在位置: 10,ゴールまであと: 11
サイコロの目: 1,現在位置: 11,ゴールまであと: 10
サイコロの目: 6,現在位置: 17,ゴールまであと: 4
サイコロの目: 1,現在位置: 18,ゴールまであと: 3
サイコロの目: 5,残念!現在位置: 19,ゴールまであと: 2
サイコロの目: 4,残念!現在位置: 19,ゴールまであと: 2
サイコロの目: 3,残念!現在位置: 20,ゴールまであと: 1
サイコロの目: 4,残念!現在位置: 18,ゴールまであと: 3
サイコロの目: 2,現在位置: 20,ゴールまであと: 1
サイコロの目: 1,ゴール!
|
解答例
- 2番目の演習問題の現在位置を絵として画面に次のように表示するスクリプ
トに改造してみましょう.
Start 1---5---10---15---20
Dice: 4 | * |
Dice: 4 | * |
Dice: 3 | * |
Dice: 3 | * |
Dice: 4 | * |
Dice: 1 | * |
Dice: 6 | * |
Dice: 6 | * |
Dice: 5 | * |
Dice: 5 | * |
Dice: 1 | *|
Dice: 5 | * |
Dice: 1 | * |
Dice: 6 | * |
Dice: 4 | *|
Dice: 2 | *|
Dice: 6 | * |
Dice: 5 | * Goal!
|
ヒント:文字列には積の演算が可能.スペースを何個置くと良いかを考える.
解答例
- 小テスト
授業の終わりに小テストを実施します.アナウンスに注意していて下さい.
- 宿題
宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく
ださい.
- 本日の用語