IT pass HikiWiki - [Exp2009]シェルスクリプト課題 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

((<"スケジュール表・各回資料 (05/08)"|[Exp2009]スケジュール表・各回資料#05-2F08>))

{{toc}}

= 提出について

* 提出期限: 5/28 (木)
* 修正期限: 6/4 (木)

== レポートの作成方法

* ((<ITPASS サーバでレポートを公開するには|[Exp2009]ITPASS サーバでレポートを公開するには>)) を参照してください. また, ((<簡単なレポートの書き方指南>)) も良く読みましょう.
* レポートの一番上に以下のことを必ず明記してください.
  * タイトル (例: ITPASS 実習レポート1)
  * 名前
  * 担当情報実験機名 (例: joho01)
* レポートの HTML ファイルの名前は index.html にしてください.
  複数の HTML ファイルを作る場合は, 以下の要件を満たすようにしてください.
  * index.html を表紙, 目次とする
  * どの HTML ファイルも index.html との相互リンクが張ってある
* ((<レポートのテンプレート|URL:/~itpass/exp/fy2009/090508/practice/hiki-samples/sample.html>))  を置いてあります. 自由に使ってもらってかまいません.
* HTML の書き方については実習の時間内では解説しません.
  Web や書籍などで書き方を調べてください.
  上記のテンプレートを参照するのもよいでしょう.
  これもレポートの一環としてがんばってください.
* 問題の難易度を高めに設定しています.
  解けない場合は, 未完成のスクリプトを提出し,
  どこまでできて, 何につまづいたかを詳しく解説してください.
  問題そのものができていなくても,
  きちんとした解説があるレポートには高い評価を与えます.
* 自力で頑張っても分からない場合は, 他の人が提出したレポート
  (実習のメーリングリストに投げられたレポート提出報告メールに
  書かれている (はずの) URL から見られます)
  を参考にすることを推奨します.
  その場合, 参考にしたレポートを参考資料に挙げるようにしてください.
  また, 丸写しにするのではなく, 自分なりの改良も加えましょう.
* ((<2008 年のレポート課題|[Exp2008]シェルスクリプト課題>))も参考にしてみてください.

=== 授業時間外のレポート作成について

* 自宅, 学内から ITPASS サーバ (ika-epa) にログインする場合,
  ((<[TEBIKI]SSHサーバへの公開鍵認証によるログイン>)) を参考にして下さい.
* シェルスクリプトを作って実行するだけなら学内の Mac でもできます.
* 606 号室にある自分の担当マシンは, 部屋の使用予定がない限り,
  許可なく使ってもらってもよいです.
* 従って, 部屋を使用する前には部屋の使用予定がないことを
  ((<予定表|URL:http://cps.scitec.kobe-u.ac.jp/for-steering/hiki-wheel/hiki.cgi?%BF%C0%B8%CD%C2%E7%B3%D8+%BC%AB%C1%B3%B2%CA%B3%D8+3+%B9%E6%B4%DB+606+%B9%E6%BC%BC>))で確認して下さい.
* 606 号室への入室するにあたり事前に許可は不要ですが,
  鍵がかかっていて入れないことがあります. 予め御了承下さい.
* 部屋を使用するときには, 奥の宇宙物理学研究室の人に一言断ってから使用してください.

==  レポートの提出方法

=== ファイルを置く

今回のレポートは全て
ITPASS サーバ (ika-epa) の ~/public_html/report01/
以下に置いてください.
置き場所となるディレクトリは必要に応じて自分で作ってください.

情報実験機で作ったファイルを ITPASS サーバに転送するには scp というコマンドを使うとよいでしょう. 詳しくは man を見てください.
各ファイルの置き方は以下のようにしてください.

* html ファイルは ~/public_html/report01/ 以下に置く.
* シェルスクリプトは ~/public_html/report01/scripts/ 以下に置く.
* 結果として出力されたファイルは
  ~/public_html/report01/results/ 以下に置く.
* 注意: 問題として配布するデータファイルは置かなくても結構です.
  ただし, どこからどうやって入手したかはレポート本文に明記しておきましょう.

=== アップロード確認

ブラウザから全部のファイルにアクセスできるか確認してみましょう.
例えば, ITPASS サーバ (ika-epa) では,
~/public_html/report01/index.html に対応する URL は

  http://epa.scitec.kobe-u.ac.jp/~(自分のアカウント名)/report01/index.html

になります.

=== 提出完了の報告

提出期限までに以下のメールを送ってください.
内容を確認した後, 修正すべき点があればその旨を連絡します.
修正完了後, 再度メールで報告してください.
こちらから, レポート提出完了のメールが送られた時点で
レポートを提出したことになります.

* メールの内容
  * 件名
    * 「ITPASS実習レポート 5/8 出題分 (自分の氏名)」
  * 宛先
    * itpass のメーリングリスト
  * メール本文に必ず記入すること
    * 情報実験機番号
    * 氏名
    * レポートの URL

= 必須課題

== 問 1 数当て

=== 問題

引数に任意の二桁の正の整数 m を与え, その数字をユーザに当てさせるようなシェルスクリプトを作ってください. 適当な数字を打ち込むと, 正解の数字より大きいか小さいか答えてくれて, 正解するまで続くようにするといいでしょう. スクリプト名は quiz1.sh とし, 実行結果を quiz1.txt に出力するようにしてください.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz1.sh.txt へのリンク.
  (上記で作成した quiz1.sh を quiz1.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします
  * 実行する際のスクリプト, データの置き場を明示すること
* 実行結果 quiz1.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトルおよび,
    何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など

=== 実行例

以下は, 引数が 20 の場合の実行例です.

$ ./quiz1.sh 20
What's your number?                       --> 適当な数字を入力するように促してくる
58                                        <-- 適当な数字を入力する
Your number is larger than the answer.    --> 入力した数字が引数よりも大きいと表示される

……

What's your number?                       --> 適当な数字を入力するように促してくる
20                                        <-- 適当な数字を入力
Your number matches the answer!!          --> 引数と一致していると表示される

=== 実行結果の例

quiz1.txt に出力してください.

What's your number?
85
Your number is larger than the answer.
What's your number?
46
Your number is larger than the answer.
What's your number?
29
Your number is larger than the answer.
What's your number?
13
Your number is smaller than the answer.
What's your number?
17
Your number is smaller than the answer.
What's your number?
20
Your number matches the answer!!

=== ヒント

* read というコマンドで計算機に数字や文字列を読み込ませることができます

=== 解答例

* ((<スクリプト|URL:/~itpass/exp/fy2009/090508/report/answer_scripts/quiz1.sh.txt>))

== 問 2 素因数分解

=== 問題

以下のコマンドを実行してみてください.

$ factor 12

すると, 以下のように 12 が素因数分解されます.

12: 2 2 3


この factor コマンドのように任意の整数を素因数分解するシェルスクリプトを作ってください.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz2.sh.txt へのリンク.
  (上記で作成した quiz2.sh を quiz2.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします
  * 実行する際のスクリプト, データの置き場を明示すること
* 実行結果 quiz2.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトルおよび,
    何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など

=== 実行例

以下は, 任意整数を 613413 としたときの実行例です.

$ ./quiz2.sh
What's the number?      --> 数値の入力を促してくる
613413                  <-- 因数分解させる数をシェルに読み込ませる
613413: 3 3 3 3 7573

=== 実行結果の例

quiz2.txt に出力してください.

613413: 3 3 3 3 7573     <-- 因数分解させた数字と因数分解の結果


=== ヒント

* 一般にシェルからコマンドを実行すると, コマンドは終了時にシェルに「終了ステータス(返り値)」を伝えます.
* 直前に終了したコマンドの終了ステータス(返り値)をシェル変数 $? で参照できます.
* expr というコマンドで整数の計算ができます.

=== 解答例

* ((<スクリプト|URL:/~itpass/exp/fy2009/090508/report/answer_scripts/quiz2.sh.txt>))


余力のある人は, 以下のオプション課題にも答えてみて下さい.

= オプション課題

== 問 3 ブラックジャック

=== 問題

以下の条件を満たすシェルスクリプトを作ってください. すなわち, トランプのブラックジャックのゲームができるようなシェルスクリプトです. スクリプト名は quiz3.sh とし, 実行結果を quiz3.txt に出力してください.

(1) カードを引くか引かないかを決め, 引くと答えれば 2 へ, 引かないと答えれば終了.
(2) 引いたカードの値を乱数としておき, その値を $m とする. ただし, ブラックジャックのルールでは, 絵札は 10 点扱いなので, 乱数の範囲は1 - 10 とする.
(3) 1, 2 を繰り返し, $m の合計を 21 に近づける.
(4) $m の合計の値が 22 以上になったら強制的に終了される.

レポート内には以下を記述してください.

* シェルスクリプトファイル quiz3.sh.txt へのリンク.
  (上記で作成した quiz3.sh を quiz3.sh.txt という名前に変更
  してください. ブラウザ上から読めるようにするためです).
* シェルスクリプトの解説
  * スクリプト内の各行が何をしているのか, スクリプト内にコメント文として書く
* スクリプトの使い方の解説
  * これをもとに TA が実際にテストします
  * 実行する際のスクリプト, データの置き場を明示すること
* 実行結果 quiz3.txt へのリンク
* 参考資料
  * URL をベタ書きにするのではなく, そのページの作者やタイトルおよび,
    何を参考にしたのかも明記する.
* 共同作業した人の名前
* コメント
  * 本課題を回答するにあたって工夫したこと, 感想など


=== 実行例

1, 22 以上になって強制終了される場合
$ ./quiz3.sh
Do you take a card?[Y/n]       --> カードを引くかどうか聞いてくる
Y                              <-- それに対する返答 (ここでは yes)
Your card is 4.                --> 引いたカードを表示する
Now, your score is 4.          --> 現在の合計値を表示する

……

Do you take a card?[Y/n]       --> カードを引くかどうか聞いてくる
Y                              <-- それに対する返答 (ここでは yes)
Your card is 7.                --> 引いたカードを表示する
Now, your score is 24.         --> 現在の合計値を表示する
So, your score is over 21.     --> 22 以上になったことを表示
Game over!!                    --> 強制終了を示す表示

2, 21 以下のときに途中で手動で終了する場合
$ ./quiz3.sh
Do you take a card?[Y/n]               --> カードを引くかどうか聞いてくる
Y                                      <-- それに対する返答 (ここでは yes)
Your card is 4.                        --> 引いたカードを表示する
Now, your score is 4.                  --> 現在の合計値を表示する

……

Do you take a card?[Y/n]               --> カードを引くかどうか聞いてくる
n                                      <-- それに対する返答 (ここでは no)
Now, your score is 18 and finish!      --> 現在の合計値を表示する

=== 実行結果の例

quiz3.txt に出力してください.

score: 6, 3, 10, 4            <-- 引いた数字の羅列
total: 23                    <-- 上記の数字の合計

=== ヒント

* 引数については ((<引数処理|[Exp2009]シェルスクリプト#引数処理>))
  を参照してください.
* $RANDOM 変数で0 から 32767 までのランダムな整数が生成できます.

=== 解答例

* ((<スクリプト|URL:/~itpass/exp/fy2009/090508/report/answer_scripts/quiz3.sh.txt>))

== 提出されたレポート

* joho01
  * ((<山本 起大|URL:/~itpass/exp/fy2009/090508/report/answers_090605/yamatatu/>))
  * ((<石井 真生|URL:/~itpass/exp/fy2009/090508/report/answers_090605/maoni1jp/>))
* joho02
  * ((<徳永 翔太|URL:/~itpass/exp/fy2009/090508/report/answers_090605/mp130fal/>))
  * ((<増井 浩行|URL:/~itpass/exp/fy2009/090508/report/answers_090605/mh0918/>))
  * ((<郭 雨佳|URL:/~itpass/exp/fy2009/090508/report/answers_090605/lhj0559/>))
* joho04
  * ((<佐伯 拓郎|URL:/~itpass/exp/fy2009/090508/report/answers_090605/taksaeki/>))
  * ((<中谷 剣|URL:/~itpass/exp/fy2009/090508/report/answers_090605/truegi/>))
  * ((<山本 祐大|URL:/~itpass/exp/fy2009/090508/report/answers_090605/yuta17/>))
* joho05
  * ((<高橋 由実子|URL:/~itpass/exp/fy2009/090508/report/answers_090605/takahasu/>))
  * ((<箕浦 舞|URL:/~itpass/exp/fy2009/090508/report/answers_090605/pminoura/>))
* joho07
  * ((<後藤 陽香|URL:/~itpass/exp/fy2009/090508/report/answers_090605/harukag/>))
  * ((<高木  瑠美|URL:/~itpass/exp/fy2009/090508/report/answers_090605/takagiru/>))
* joho08
  * ((<瀧本 香織|URL:/~itpass/exp/fy2009/090508/report/answers_090605/takkikki/>))
  * ((<嵩 由芙子|URL:/~itpass/exp/fy2009/090508/report/answers_090605/onlyyuko/>))
* joho10
  * ((<羽山 遼|URL:/~itpass/exp/fy2009/090508/report/answers_090605/ryo0906/>))
  * ((<河合 佑太|URL:/~itpass/exp/fy2009/090508/report/answers_090605/ykawai/>))



((<"スケジュール表・各回資料 (05/08)"|[Exp2009]スケジュール表・各回資料#05-2F08>))