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

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

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

{{toc}}

= 提出について

* 提出期限: 5/26(木)  23:59
* 修正期限: 6/02(木)  23:59

== レポートの作成方法

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

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

* 自宅, 学内から ITPASS サーバ (ika-itpass) にログインする場合,
  ((<[TEBIKI]SSHサーバへの公開鍵認証によるログイン>)) を参考にして下さい.
* シェルスクリプトを作って実行するだけなら学内の Mac でもできます.
* 606 号室にある自分の担当マシンは, 部屋の使用予定がない限り,
  許可なく使ってもらってもよいです. ゼミなどで使用している場合も, その場で許可をとってもらえば使用してかまいません.
  * 606 の使用予定は以下の URL の予定表で確認できます. このページを見るにはパスワードが必要です. パスワードは実習の際に教えます.

    ((<URL:https://itpass.scitec.kobe-u.ac.jp/~bldg3/hiki/hiki.cgi?606%B9%E6%BC%BC%A4%CE%CD%BD%CC%F3%B4%C9%CD%FD>))
* 606 号室への入室するにあたり事前に許可は不要ですが,
  鍵がかかっていて入れないことがあります. 希望者には鍵を貸し出しますので, TA にご一報ください.
* 部屋を使用するときには, 奥の宇宙物理学研究室の人に一言断ってから使用してください.

==  レポートの提出方法

=== ファイルを置く

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

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

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

=== アップロード確認

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

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

になります.

=== 提出完了の報告

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

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


= 必須課題

== 問1 html 作成スクリプト

=== 問題

html のテンプレートを生成するシェルスクリプトを作成してください.
そのスクリプトを実行する際, 生成する html のファイル名を引数として与えるようにしてください.
また, 対話形式 (実行例参照) で以下の変数を取得し, それを html に反映してください.

* ページの作成者
* ページのタイトル
* 本分に作る項目の数

最後にページを生成した日付をどこかに入れてください. 日付はスクリプトを実行したときに現在の時刻を自動で取得するようにしてください. 出力結果は下記の実行例を
参考にしてください.
スクリプトのファイル名は quiz1.sh , html ファイルの名前は quiz1.html, スクリプトの実行結果を記録したファイル名は quiz1.txt としてください.

余力があれば, 上記以外の変数(文字コードや背景色など)を取得するようにしてもいいでしょう.


==== レポートに書く内容

レポート内には以下を記述してください.
ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).
* シェルスクリプトファイル quiz1.sh.txt へのリンク

  上記で作成した quiz1.sh を quiz1.sh.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* シェルスクリプトの解説

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトの使い方の解説

  これをもとに TA が実際にテストします. 
  実行する際のスクリプト, データの置き場を明示すること.
* 実行例 quiz1.txt へのリンク

  実行例とは, スクリプトの作業記録です. 自分が実際にスクリプトを実行したときのコンソールをテキストファイルにコピーするなどしてください. 具体的には下記の実行例のようなものです.
* 生成した実行結果 quiz1.html ページへのリンク
* 参考資料

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行例

takahasu@ika-itpass:~/public_html/prg$ ./quiz1.sh quiz1.html
生成する html のタイトルを入力してください
ITPASS 実習レポート01
生成する html の著者を入力してください
takahasu
何個くらい項目を作る気でいますか?
4
takahasu@ika-itpass:~/public_html/prg$ ls
6kdv.html  kdv.html  quiz1.html  quiz1.sh  zAI_kdv.html
                      ^^^^^^^^^^html ファイルが生成されていることを確認

=== 実行結果

* ((<生成されたhtmlの例|URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2011/110513/report/sample.html>))

  なお, レイアウトや色使いは好きなものでかまいません.

=== ヒント

  * 日付時刻を出力するコマンドは「date」.
  * 引用符の種類に気をつける.
  * ((<ここ|[Exp2011]シェルスクリプト>))が参考になります.

== 問 2 テンパズル

=== 問題

テンパズルというゲームを実行するスクリプトを作ってください. テンパズルのルールは次の通りとします.

4 桁の数字の各桁を, 加算 (+), 減算 (−), 乗算 (×), 括弧を使って 10 にする.
除算 (÷), 並び替え, 数字の結合, 数字の前に − をつけること, 指数関数等の使用は不可.

スクリプトを作る際, 以下の点に気を配ってください.

* 標準出力と quiz2.txt に, 与えた 4 桁の数字と 10 を作る方法を全て出力させる
* 入力した数字が 4 桁でない場合にエラーが出るようにする
* バラバラで数字を入力するのではなく, 4 桁まとめて入力できるようにする
* "1+2+3+4" と "(1+2)+3+4" のような重複は生じてもよい

==== レポートに書く内容

レポート内には以下を記述してください.
ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).
* シェルスクリプトファイル quiz2.sh.txt へのリンク

  上記で作成した quiz2.sh を quiz2.sh.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* シェルスクリプトの解説

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトの使い方の解説

  これをもとに TA が実際にテストします. 
  実行する際のスクリプト, データの置き場を明示すること.
* 実行結果(スクリプトの作業記録) quiz2.txt へのリンク
* 参考資料

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行例

10 にできる場合

$ ./quiz2.sh 1234                       <-- 4 桁の数字を引数として与える
1234:
1 + 2 + 3 + 4                           <-- 10 を作る方法がすべて表示される
1 * 2 * 3 + 4
( 1 + 2 ) + 3 + 4
……

10 にできない場合

$ ./quiz2.sh 0000                       <-- 4 桁の数字を引数として与える
0000:
can't make 10.                          <-- 10 を作れない旨が表示される

入力した数字が 4 桁でない場合

$ ./quiz2.sh 12345                      <-- 誤って 5 桁の数字を引数として与える
12345:
the number must be four-digits.         <-- エラーメッセージが表示される

=== 実行結果

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

1234:
1 + 2 + 3 + 4            <-- 与えた 4 桁の数字と, 10 を作るすべての方法
1 * 2 * 3 + 4
( 1 + 2 ) + 3 + 4
……

=== ヒント

* 引数については ((<引数処理|[Exp2011]シェルスクリプト#引数処理>))
  を参照してください.
* expr というコマンドで整数の計算ができます.

=== オプション問題

余力のある人は, 除算 (÷) が使用できる場合についても考えてみてください.

= オプション課題
((*以下の問題は必須ではありません*))

== 問 3 成績出力スクリプト

=== 問題

複数人のテストの点数データが書き込まれたファイルを読み込み, 各人の成績情報を出力するシェルスクリプトを作成してください.

* 成績が書き込まれたデータファイルの形式(教科数が 5 科目の場合)は, 以下のようになります. 実際スクリプトに読み込ませるファイル(score.dat)は, この((<リンク|URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2011/110513/report/score.dat>))から取得してください.

<受験人数>
<教科数>
<受験者1>,<教科 A の得点>,<教科 B の得点>,<教科 C の得点>,<教科 D の得点>,<教科 E の得点>
<受験者2>,<教科 A の得点>,<教科 B の得点>,<教科 C の得点>,<教科 D の得点>,<教科 E の得点>
.. 以下人数分続く..

* 作成するスクリプトについて
  * 標準入力によって入力された名前の人のテスト結果を出力してください. テスト結果として, 各教科の点数と全教科平均点を出力するようにしてください.
  * 点数データのファイル名は, コマンドライン引数によって与えてください.
  * データファイルから成績データを読み込む際は, 全員分の成績データを一度配列に保持するようにしてください( grep などを用いて, 該当する名前の行のみを抜き取る方法は今回禁止とします).
  * 実際にスクリプトを作成する際には, 教科数が 5 科目以外の場合でも対応できるようにしてください. (なお, 教科数が 6 科目の場合のデータファイルは, この((<リンク|URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2011/110513/report/score6.dat>))から取得できます. )
  * 最低限のエラー処理を行って下さい. 例えば, データファイルに存在しない受験者の成績照会を求められたときは, その旨を伝える出力を行って下さい.

==== レポートに書く内容

レポート内には以下を記述してください. ただしリンクを貼る際は((*相対パスで指定するようにしてください*)).

* シェルスクリプトファイル quiz3.sh.txt へのリンク.

  上記で作成した quiz3.sh を quiz3.sh.txt という名前に変更してください. ブラウザ上から読めるようにするためです.
* シェルスクリプトの解説.

  スクリプト内の各行が何をしているのか, ((*スクリプト内にコメント文として書く*)).
* スクリプトに読み込ますデータファイル score.dat へのリンク
* スクリプトの使い方の解説.

  これをもとに TA が実際にテストします.
  実行する際のスクリプト, データの置き場を明示すること.
* 実行結果(スクリプト実行時の出力) quiz3.txt へのリンク.
* 参考資料.

  URL をベタ書きにするのではなく, そのページの作者やタイトル, および何を参考にしたのかも明記する.
* 共同作業した人の名前
* 工夫したこと, 感想など

=== 実行例

* 以下は, スクリプトの実行例です. (もちろん, 以下のような出力形式である必要はありません.)

受験者 ykawai の成績情報を照会した場合

$ ./quiz3.sh score.dat
受験者の名前を入力してください: ykawai  <-- 入力を求められたので ykawai と入力                                                        

>> [ ykawai のテスト結果] >>>>>>>>>
教科 A : 80 点
教科 B : 85 点
教科 C : 65 点
教科 D : 75 点
教科 E : 55 点

- 全教科の平均点 72 点 -

データファイルに存在しない受験者の成績情報を照会した場合

$ ./quiz3.sh score.dat
受験者の名前を入力してください: yhawai <-- 入力を求められたので yhawai と入力                                  

>> 受験者 yhawai は存在しません.  


=== 実行結果

quiz3.txt に出力してください.
少なくとも, 上の 2 種類の実行例を quiz3.txt に出力するようにしてください.

=== ヒント

* シェルスクリプトにおける配列の使い方を調べてみよう.

=== 応用問題

* 上で求められた以外の機能を何か一つ追加して下さい. 以下は, 追加する機能の例です.
  * 全教科平均点が, 全受験者の中で何番目か出力する.  
  * 成績順に受験者名をソートする.
  * 他のプログラミング言語を用いて, 同様の処理を実装してみる.
  * etc


= 提出されたレポート

* joho01
  * ((<寺村 大樹|URL:/~itpass/exp/fy2011/110513/report/answers_final/teradai/>))
  * ((<富永 裕貴|URL:/~itpass/exp/fy2011/110513/report/answers_final/tomipooh/>))  
* joho02
  * ((<中村 望|URL:/~itpass/exp/fy2011/110513/report/answers_final/nozo64/>))  
  * ((<原田 竣也|URL:/~itpass/exp/fy2011/110513/report/answers_final/snyh56/>))  
* joho04
  * ((<大田 百合菜|URL:/~itpass/exp/fy2011/110513/report/answers_final/yuriyuri/>))  
  * ((<坂本 花菜|URL:/~itpass/exp/fy2011/110513/report/answers_final/kana210/>))  
* joho05
  * ((<坂廼邉 翼|URL:/~itpass/exp/fy2011/110513/report/answers_final/nobesaka/>))  
  * ((<佐藤 緩奈|URL:/~itpass/exp/fy2011/110513/report/answers_final/kanna625/>))  
* joho07
  * ((<高田 和佳|URL:/~itpass/exp/fy2011/110513/report/answers_final/ntakada/>))  
  * ((<斉田 美香|URL:/~itpass/exp/fy2011/110513/report/answers_final/saichan/>))  
* joho08
  * ((<清水 俊平|URL:/~itpass/exp/fy2011/110513/report/answers_final/sshimizu/>))  
  * ((<宮田 誠也|URL:/~itpass/exp/fy2011/110513/report/answers_final/miyacchi/>))  
* joho10
  * ((<大原 宗|URL:/~itpass/exp/fy2011/110513/report/answers_final/ksn89/>))  
  * ((<柏本 光司|URL:/~itpass/exp/fy2011/110513/report/answers_final/cassy/>))  
* joho11
  * ((<小川 法師|URL:/~itpass/exp/fy2011/110513/report/answers_final/oga0930/>))  
  * ((<山根 史弥|URL:/~itpass/exp/fy2011/110513/report/answers_final/yamanen/>))  

[((<"スケジュール表・各回資料 (05/13)"|[Exp2011]スケジュール表・各回資料#05-2F13>))]に戻る