#author("2017-10-14T11:17:58+09:00","default:takataka","takataka")
#author("2017-10-23T09:57:33+09:00","default:takataka","takataka")
*応用プログラミング及び実習 2017年度 第5回 [#bebe2b15]
 
//&color(#ff0000){工事中};

#contents


**注意 [#o3f5d008]

- 実習のすすめ方について [[AProg/2017/ex00]]
- 演習のすすめ方について [[AProg/2017/ex00]]
- Linux環境での操作についてわからないことがあったら [[Docs/4UNIXBeginners]]
- &color(red){締切に間に合わずチェックを受けられなかった課題は自分で完成させておくこと.}; 先の回には,過去の課題のプログラムを改造して新たなプログラムを作る課題があります. 締切後には点数はつきませんが,質問等は随時どうぞ.

**課題A(self) 締切:今回の実習終了時 [#kadaiA]

次の二つのことをやりなさい.

***その一 [#kadaiA_1]

今回の講義資料の「scanfの戻り値」のページと以下の補足資料を読んで理解しよう.後の課題で使います.

[[補足資料>AProggakunai:AProg2016-scanf.pdf]](学内アクセス限定)
*** その二 [#kadaiA_2]
&color(blue){郵便番号探索のサンプルプログラムの実行ファイルをコピーして実行してみよう};

+ 自分の aprog20XY ディレクトリへ移動してから,次のように cp コマンドを実行すると,zipsearch という名前の実行形式のファイルを手元にコピーすることができる.
 $ cp /roes/sample/takataka/aprog20XY/zipsearch   .     ← 最後の「空白+ピリオド」を忘れずに & XY は当然...
 $ cp /roes/sample/takataka/aprog20XY/zipsearch   .     ← 最後の「空白+ピリオド」を忘れずに & XY は当然...
これは,
>
/ (ルートディレクトリ)の中の roes ディレクトリの中の sample ディレクトリの中の...の zipsearch というファイルを,「.」 つまりカレントディレクトリ(cd で移動した現在地)にコピーせよ
''/ (ルートディレクトリ)の中の roes ディレクトリの中の sample ディレクトリの中の...の zipsearch というファイルを,. つまりカレントディレクトリ(cd で移動した現在地)にコピーせよ''
<
という指示である.cp コマンドは,コピー先としてファイル名ではなくディレクトリ名を指定した場合,そのディレクトリ中に元と同じ名前でコピーしてくれる.
+ 入手したファイルは実行形式のものであるから,そのまま実行できる.実際に実行して,適当な入力をして動作を確認しなさい.


**課題B(self) 締切:今回の実習終了時 [#kadaiB]

&color(blue){構造体の学習(1)};
&color(blue){[[第4回課題B>AProg/2017/ex04#kadaiB]] のプログラムの一部を使いまわして,改良しよう};

講義資料の kcard.h, kcard.c, kenshin3.c を作ってコンパイル&実行しよう.
kenshin3.c は以下のリンク先から入手すればよい(講義資料のものと少し違ってる).
新たに作成するソースファイル(main関数の定義を含むもの)の名前は ex05b.c として,次のようにする.
+ ex04b.c では main の中でデータ件数を読み取り,それから個々の値を読み取るようにしていたが,ex05b.c では, scanf の戻り値を利用してデータ件数をプログラム自身に数えさせるようにする.ex05b.c 以外のソースをいじる必要はないはず
+ 標準入力のリダイレクションを利用して,適当に作ったテキストファイル hoge に対して
 $ ./ex05b  <  hoge
のように実行すると,hoge の中身を読み取って ex04b と同様の出力が得られるようにする

[[kenshin3.c>https://gist.github.com/takatakamanbou/64dc9521df74f799a510]]

&color(white,blue){check}; kcard.h と kcard.c は,&color(blue){理解を深めるため,コピペしたりしないで,何を書いてるのか考えながらキーボードを叩いて入力しよう.};
**課題C(TA) 締切: &color(blue){今回の実習終了20分前};  [#kadaiC]

&color(blue){郵便番号データを読み込むプログラムを作ろう};

+次の場所に,課題Aのプログラムで扱っている郵便番号データの一部を抜粋したテキストファイルがある.
 /roes/sample/takataka/aprog20XY/zipdataS
課題Aの cp コマンドの使い方を参考に,これを自分の aprog20XY ディレクトリにコピーしなさい.コピーできたら,less で中身を眺めてみよう.
+ 以下を修正して,上記のファイルを読み込んで,データ件数,ファイルの最初の行のデータ(郵便番号と住所),最後の行のデータを出力するプログラムを作りなさい.ソースファイル名は ex05zip.c としよう.ただし,次のことに注意.
-- &color(white,blue){check}; 変数 addr の宣言に NCHAR + 1 とあるのはなぜか,理由を考えておくこと.
-- &color(white,blue){check}; ファイルは1行ずつ読み込むものとして,fscanf の戻り値を利用してデータ件数をプログラム自身に数えさせよう.
--  &color(white,blue){check}; 郵便番号には 0 ではじまるものもある.最初の 0 も表示させるようにすること.printf の「書式指定」の仕方を書籍やウェブで調べよう.

&gist(83893d328566a80d7a8e);
**課題D(TA) 締切:次回実習開始直後 [#kadaiD]

**課題C(TA) 締切:次回実習開始直後 [#kadaiC]
&color(blue){[[第4回課題D>AProg/2017/ex04#kadaiD]] のプログラムをもとに,機能強化したプログラムを作ろう.};

//&color(#ff0000){工事中};
改良点は次の通り.main を含むソースファイルの名前は ex05d.c とすること.
+ 画像を左右反転させる関数 flipH を ex04image.c に追加する(当然あっちのファイルも修正が...).ちなみに,H は horizontally, V は vertically の意味です.
+ 次のような処理手順とする.
++ 画像をファイルから読み込む
++ 画像処理のメニューを表示し,番号で処理を選択してもらう.処理は繰り返し適用できるようにしておく
++ 画像をファイルへ書き出す


&color(blue){他人の作ったプログラムを利用してみる};

[[課題A>#kadaiA]] のソースファイル入手先と同じ場所に,prime.h, prime.o, primedata.txt  という3つのファイルがある.次のように cp コマンドを実行すると,これらを手元にコピーすることができる.
 $ cp /roes/sample/takataka/aprog20XY/prime*   .     ← 最後の「空白+ピリオド」を忘れずに

この3つのファイルは,次のようなものである.
- prime.o: 3つの関数を定義したC言語ソースファイルを龍大計算機室の環境のコンパイラ cc でコンパイルして得られたオブジェクトファイル.オブジェクトファイルだから,中身は(普通の)人間には読めません.
- prime.h:  上記3つの関数のプロトタイプ宣言を書いたヘッダファイル.コメントとしてそれぞれの関数の機能と引数の意味が書いてある.
- primedata.txt:   いくつかの整数がならんだテキストファイル.less や emacs で中身を眺めてみよう.

これらのファイルを利用するプログラムを書こう.ただし,↓のリンク先に main関数を定義したソースファイルがあるので,これを手元に保存し,そこに書かれたコメントを参考に修正を加えて作ること(mainの中身は,「★★★」の部分以外を修正する必要はないはず).

[[ex05prime.c>https://gist.github.com/takatakamanbou/6515c6450f85de524050afdb3191d2e0]]


- &color(white,blue){check}; prime.o はオブジェクトファイルなんだから,既に cc -c の手順は済んでるわけですね.後は ex05prime.c の方をコンパイルして,2つのオブジェクトファイルをリンクして実行形式を作る,と.
- &color(white,blue){check}; 授業で説明したように,オブジェクトファイルは,ソースをコンパイルして(ほぼ)機械語プログラムの状態にしたものです.上記のように prime.o は龍大計算機室の環境で実行できる機械語プログラムを生成するコンパイラで作ってあるので,それ以外の環境ではおそらく使えません.
- &color(white,blue){check};  完成して動作確認できたら,次のことを考えよう
-- なぜ 4649 と 5963 は出てこない?
-- NDATA を 10 に変更したらどうなる?


**課題D(takataka) 締切: 来週月曜13時 [#kadaiD]

&color(blue){線形探索のプログラムを作ろう};

[[ex05search.c>https://gist.github.com/takatakamanbou/fdd5b225bc156562d073d76887c9f41c]]

↑のリンク先にあるソースは,[[課題C>#kadaiC]] の primedata.txt に書かれた数を配列に読み込んで,キーボードから入力された数をキーとして線形探索するプログラムである.このプログラムを完成させて,次の部分を指定の紙に書いて提出しなさい.

+ 25行目から32行目までの部分(行数は増減しても構わない)
+ 関数 LSearch の定義.


ただし,以下の指示を守ること.
- 関数 LSearch は,次のような仕様とする
++ 引数は,int型の配列,その要素数,探索キーの値の3つ.順序もこの通りとする
++ 戻り値は次のように定める
---配列中にキーの値と一致するものが見つかった場合はその要素番号(配列の添字)
---見つからなければ -1
- main 中の無限ループの中身は,次のような実行結果が得られるように作ること.括弧の部分はプログラムの出力ではなくコメントである.
こんな感じ.
この例では,uni3.pgm の画素値を反転してさらに上下も反転した画像が hoge.pgm に出力されることになります.
- (★ほげ)は,プログラムの出力ではなくコメントです.
- メッセージなどを忠実に再現する必要はありません.自分で適当にアレンジしたらよいほげ.
#pre{{
$ ./ex05search 
検索したい数を入力してね: 8191      (8191等はキーボードからの入力)
9 番目にあるよ
検索したい数を入力してね: 1
0 番目にあるよ
検索したい数を入力してね: 4649
ないよ
検索したい数を入力してね: 10333
13 番目にあるよ
検索したい数を入力してね: ^C          (無限ループするので,CTRL-C で止めた)
入力ファイル名を指定するほげ:  uni3.pgm  ←  uni3.pgm はキーボードからの入力
uni3.pgm を読み込んだほげ    (★ fopenのエラー時の処理は,ex04d.c のをそのまま使えばよい)
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [99] ファイルに書き出す
どないするほげ?:   1  (★ 1はキーボードからの入力)
ほげ〜,画素値反転したで
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [99] ファイルに書き出す
どないするほげ?:   3  (★ 3はキーボードからの入力)
ほげ〜,上下反転したで
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [99] ファイルに書き出す
どないするほげ?:   666  (★ 666はキーボードからの入力)
ほげほげ〜,わからへん
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [99] ファイルに書き出す
どないするほげ?:   99  (★ 99はキーボードからの入力)
出力ファイル名を指定するほげ:  hoge.pgm
hoge.pgm に書きだしたほげ.ばいばい 
}}

**課題S(おまけ) 締切: 次回実習終了まで [#kadaiS]
**課題S(おまけ) [#c220731d]

新規の出題はありません.以下をやる,適当に自分で面白い課題を見つける,等々お好きにどうぞ.

&color(blue){三目ならべ(oxゲーム)をつくろう};
- [[AProg/2017/ex03ST]]
- [[AProg/2017/ex04#kadaiS]]

zipsearch や prime* と同じ場所に,sammoku.h, sammoku.c, sammokumain.c というファイルがおいてある.これらを自分のこの科目のディレクトリにコピーしなさい.

これらは,三目ならべ(oxゲーム)のプログラムである.
コンパイルして動かしてみると….
これをちゃんと遊べるように直そう(どこをどう修正したのか忘れないようにソース中にコメントを書いておくこと).
ただし,三目ならべを五目ならべや百目ならべに変更するのが簡単に済むように考えること.

ヒント:
- sammoku.h を修正する必要はないはず.
- まずはコンパイラのエラーメッセージを見て,コンパイルエラーをなくそう.
- 人間対コンピュータでとりあえずゲームができるようになったら,よく観察しよう.
既に置いてあるとことか (5,5) なんて所に置こうとするとか…



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS