_AProg2010/ex05
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*応用プログラミング演習 2010年度 第5回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg2010/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#j9f65946]
+講義資料の main04.c, hoge04.c, hoge04.h を作成して正しく動作することを確認しよう
//+前回の課題Aのプログラムを,インクルードファイルを用いたものに改造してみよう
+次のように cp コマンドを実行すると,カレントディレクトリに zssample という実行ファイルを入手できる(あらかじめaprog2010にcdしておいてから cp を実行するのがよいでしょう.また,↓の入力時には途中まで入力したらTabキーを押して補完すると楽でしょう).
$ cp /home/sample/takataka/aprog2010/zssample . ←ピリオド
これは,この授業の前半7回の最終目標のプログラムである.実行してみよう.
**課題A 締切: 今回の演習終了時 [#ma58609e]
***step0 [#t716d2cc]
次のように cp コマンドを実行すると,prime.h と prime.c という二つのファイルを入手できる.
$ cp /home/sample/takataka/aprog2010/prime.* .
ちなみにこのコマンドを実行すると何がおこるかを説明すると…
+「*」は,「0文字以上の任意の文字」を表すので,prime.h と prime.c の両方がコピー元に指定される(もしも上記ディレクトリ内に他にも prime.hoge とかいうファイルがあったとしたらそれも).
+コピー先の指定が「.」つまりカレントディレクトリなので,コピー元のファイルたちは名前を変えずにカレントディレクトリにコピーされる
ということになっている.
「*」や「?」(任意の1文字を表す)の解釈はシェルが行っているので,cp 以外のコマンドでもこの技は使える.
$ ls *.c
$ ls ex??-a.c
などを実行してみるとよい.ちなみに,次のように実行すると大変なことになる.
$ rm *
コピーができたら,次のことをしなさい.
-lsコマンドを実行して本当にコピーできたことを確認
-emacs または less でこれらのファイルの中身を眺めてみる
以下のstepでは,この2つのファイルを利用するプログラムを作成する.
その際には,&color(#00a000){prime.h と prime.c は利用するだけで,それらの中身は変更しない}; ようにすること.
***step1 [#ffc074ba]
次のような動作をするプログラムを作りなさい.
-自分で作成するソースファイルの名前は ex05a.c とすること.
-入力された数は配列に格納すること.その配列の大きさは #define を使って定義しておくこと.
#pre{{
$ ./ex05a
何個?: 6 ← 6 はキーボードからの入力
0番目: 7 ← 7はキーボードからの入力.以下同様
1番目: 2
2番目: 1024
3番目: 1023
4番目: 8192
5番目: 8191
素数は3個 ← プログラムの出力
}}
***step2 [#i6cbea07]
prime.{c,h} を見るとわかるように,prime.c には三つの関数が定義されている.
step1のプログラムでは,そのうちひとつはmain()から呼び出されており,もう一つはその関数から呼び出されているが,残りひとつの関数は全く使われていないはずである.
step1のプログラムを改造し,その関数をmain()から呼び出すようにしなさい.
ここまでできたらチェックをうけよう.
**課題B 締切: 今回の演習終了時 [#kadaiB]
+課題Aのstep0で示したのと同じディレクトリ内に uzumaki.h と uzumaki.c というファイルがあるので,それを自分のaprog2010ディレクトリ内にコピーし(課題Aのstep0のcpコマンドの引数の最後の部分を変更したらよい),内容を確認しなさい.
+PGM画像をファイルから読み込み,関数Uzumakiを呼んでその画像を加工し,加工した画像をファイルに出力するプログラムを作りなさい.
--自分で作るソースファイルの名前は ex05b.c とすること.
//--関数Uzumakiの引数の説明を読むとわかるように,この関数では,引数に2つの画像を指定する必要がある.mainの側でも配列を2つ用意しよう.
--引数 thetamax の値は,まずは 3.1415/2 位で試し,それからいろいろ変えてみたらよい.
+サンプル画像以外の画像で実験してみたい,という人は [[AProg2010/omake#image]] を参考にしたらよいかも.
&color(#00a000){注意1: uzumaki.h には画像の幅と高さの最大値を表す定数が定義されている.mainの側で画像用の2次元配列を宣言する場合には,これを用いること.};
&color(#00a000){注意2: uzumaki.c は数学関数を利用しているので,リンク時に -lm オプションをつける必要がある};
**課題C 締切: 次回の演習開始直後 [#u72dc11c]
次のような動作をするプログラムを作成しなさい.この課題には通常の課題の2倍の点数がつきます.
#pre{{
$ ./ex05c
線形探索するよん
0以上の整数から成るデータを扱えるよん
データは何件?: 5
0番目のデータ(0以上の整数)を入力してね: 10
1番目のデータ(0以上の整数)を入力してね: 37
2番目のデータ(0以上の整数)を入力してね: 26
3番目のデータ(0以上の整数)を入力してね: 10
4番目のデータ(0以上の整数)を入力してね: 123
データは5件やな
キー値を入力してね(負の数だと終了するよ): 37
その値は1番目にあるよ
キー値を入力してね(負の数だと終了するよ): 10
その値は0番目にあるよ
キー値を入力してね(負の数だと終了するよ): 36
その値はないみたい
キー値を入力してね(負の数だと終了するよ): -2
ばいばい
}}
ただし,以下の指示に従うこと.
-ソースは次の3つのファイルから成るものとする
--関数mainの定義を含むソースファイル ex05c.c
--関数LSearchの定義を含むソースファイル search.c
--関数LSearchのプロトタイプ宣言を含むヘッダファイル search.h
-入力されるデータが0以上の整数であるかどうかのチェックは,省略して構わない(余裕のある人は考えてみよう)
-関数LSearchは次のような仕様とする(&color(#00a000){まずは関数LSearchの定義を紙に書いてみること};)
--引数は,int型配列,その要素数,キーの値,の3つ
--配列中にキーの値と一致する要素が見つかればその番号(配列の添字)を返し,見つからなければ-1を返す
--探索アルゴリズムは線形探索とする
--この関数中ではscanfもprintfも使わない(デバグ中は別ですが)
--配列中に同じ値が複数含まれている場合のことは考慮しなくてよい(上記の実行例からわかるように,最初に見つけたものの番号を返すようにしておけばよい)
ヒント: mainの側での1回の探索の手順はこんな感じですね.
+キー値を入力してもらう
+それが負だったらほげほげ
+LSearchを呼ぶ
+見つけたかどうかに応じてほげほげ
**課題D(おまけ) 締切: 次回の演習開始直後 [#s2475553]
課題Cのプログラムをもとにして,文字列を扱う探索プログラムを作ってみよう.
-文字列同士の比較は,「strなんたら」という関数を使うとよいかも
-文字列を扱う場合,空白を含んでも構わないようにしたり,↓の例でキーが"hoge"だった場合には2番目もヒットさせたりしたくなるが,この課題ではそこまでは考えないでよい
実行結果例:
#pre{{
$ ./ex05d
線形探索するよん
文字列から成るデータを扱えるよん
データは何件?: 5
0番目の値(文字列)を入力してね: abc
1番目の値(文字列)を入力してね: hoge
2番目の値(文字列)を入力してね: hogefuga
3番目の値(文字列)を入力してね: fuga
4番目の値(文字列)を入力してね: ABC
データは5件やな
キー値を入力してね(endと入力すると終了するよ): hoge
その値は1番目にあるよ
キー値を入力してね(endと入力すると終了するよ): fuga
その値は3番目にあるよ
キー値を入力してね(endと入力すると終了するよ): end
ばいばい
}}
終了行:
*応用プログラミング演習 2010年度 第5回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg2010/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#j9f65946]
+講義資料の main04.c, hoge04.c, hoge04.h を作成して正しく動作することを確認しよう
//+前回の課題Aのプログラムを,インクルードファイルを用いたものに改造してみよう
+次のように cp コマンドを実行すると,カレントディレクトリに zssample という実行ファイルを入手できる(あらかじめaprog2010にcdしておいてから cp を実行するのがよいでしょう.また,↓の入力時には途中まで入力したらTabキーを押して補完すると楽でしょう).
$ cp /home/sample/takataka/aprog2010/zssample . ←ピリオド
これは,この授業の前半7回の最終目標のプログラムである.実行してみよう.
**課題A 締切: 今回の演習終了時 [#ma58609e]
***step0 [#t716d2cc]
次のように cp コマンドを実行すると,prime.h と prime.c という二つのファイルを入手できる.
$ cp /home/sample/takataka/aprog2010/prime.* .
ちなみにこのコマンドを実行すると何がおこるかを説明すると…
+「*」は,「0文字以上の任意の文字」を表すので,prime.h と prime.c の両方がコピー元に指定される(もしも上記ディレクトリ内に他にも prime.hoge とかいうファイルがあったとしたらそれも).
+コピー先の指定が「.」つまりカレントディレクトリなので,コピー元のファイルたちは名前を変えずにカレントディレクトリにコピーされる
ということになっている.
「*」や「?」(任意の1文字を表す)の解釈はシェルが行っているので,cp 以外のコマンドでもこの技は使える.
$ ls *.c
$ ls ex??-a.c
などを実行してみるとよい.ちなみに,次のように実行すると大変なことになる.
$ rm *
コピーができたら,次のことをしなさい.
-lsコマンドを実行して本当にコピーできたことを確認
-emacs または less でこれらのファイルの中身を眺めてみる
以下のstepでは,この2つのファイルを利用するプログラムを作成する.
その際には,&color(#00a000){prime.h と prime.c は利用するだけで,それらの中身は変更しない}; ようにすること.
***step1 [#ffc074ba]
次のような動作をするプログラムを作りなさい.
-自分で作成するソースファイルの名前は ex05a.c とすること.
-入力された数は配列に格納すること.その配列の大きさは #define を使って定義しておくこと.
#pre{{
$ ./ex05a
何個?: 6 ← 6 はキーボードからの入力
0番目: 7 ← 7はキーボードからの入力.以下同様
1番目: 2
2番目: 1024
3番目: 1023
4番目: 8192
5番目: 8191
素数は3個 ← プログラムの出力
}}
***step2 [#i6cbea07]
prime.{c,h} を見るとわかるように,prime.c には三つの関数が定義されている.
step1のプログラムでは,そのうちひとつはmain()から呼び出されており,もう一つはその関数から呼び出されているが,残りひとつの関数は全く使われていないはずである.
step1のプログラムを改造し,その関数をmain()から呼び出すようにしなさい.
ここまでできたらチェックをうけよう.
**課題B 締切: 今回の演習終了時 [#kadaiB]
+課題Aのstep0で示したのと同じディレクトリ内に uzumaki.h と uzumaki.c というファイルがあるので,それを自分のaprog2010ディレクトリ内にコピーし(課題Aのstep0のcpコマンドの引数の最後の部分を変更したらよい),内容を確認しなさい.
+PGM画像をファイルから読み込み,関数Uzumakiを呼んでその画像を加工し,加工した画像をファイルに出力するプログラムを作りなさい.
--自分で作るソースファイルの名前は ex05b.c とすること.
//--関数Uzumakiの引数の説明を読むとわかるように,この関数では,引数に2つの画像を指定する必要がある.mainの側でも配列を2つ用意しよう.
--引数 thetamax の値は,まずは 3.1415/2 位で試し,それからいろいろ変えてみたらよい.
+サンプル画像以外の画像で実験してみたい,という人は [[AProg2010/omake#image]] を参考にしたらよいかも.
&color(#00a000){注意1: uzumaki.h には画像の幅と高さの最大値を表す定数が定義されている.mainの側で画像用の2次元配列を宣言する場合には,これを用いること.};
&color(#00a000){注意2: uzumaki.c は数学関数を利用しているので,リンク時に -lm オプションをつける必要がある};
**課題C 締切: 次回の演習開始直後 [#u72dc11c]
次のような動作をするプログラムを作成しなさい.この課題には通常の課題の2倍の点数がつきます.
#pre{{
$ ./ex05c
線形探索するよん
0以上の整数から成るデータを扱えるよん
データは何件?: 5
0番目のデータ(0以上の整数)を入力してね: 10
1番目のデータ(0以上の整数)を入力してね: 37
2番目のデータ(0以上の整数)を入力してね: 26
3番目のデータ(0以上の整数)を入力してね: 10
4番目のデータ(0以上の整数)を入力してね: 123
データは5件やな
キー値を入力してね(負の数だと終了するよ): 37
その値は1番目にあるよ
キー値を入力してね(負の数だと終了するよ): 10
その値は0番目にあるよ
キー値を入力してね(負の数だと終了するよ): 36
その値はないみたい
キー値を入力してね(負の数だと終了するよ): -2
ばいばい
}}
ただし,以下の指示に従うこと.
-ソースは次の3つのファイルから成るものとする
--関数mainの定義を含むソースファイル ex05c.c
--関数LSearchの定義を含むソースファイル search.c
--関数LSearchのプロトタイプ宣言を含むヘッダファイル search.h
-入力されるデータが0以上の整数であるかどうかのチェックは,省略して構わない(余裕のある人は考えてみよう)
-関数LSearchは次のような仕様とする(&color(#00a000){まずは関数LSearchの定義を紙に書いてみること};)
--引数は,int型配列,その要素数,キーの値,の3つ
--配列中にキーの値と一致する要素が見つかればその番号(配列の添字)を返し,見つからなければ-1を返す
--探索アルゴリズムは線形探索とする
--この関数中ではscanfもprintfも使わない(デバグ中は別ですが)
--配列中に同じ値が複数含まれている場合のことは考慮しなくてよい(上記の実行例からわかるように,最初に見つけたものの番号を返すようにしておけばよい)
ヒント: mainの側での1回の探索の手順はこんな感じですね.
+キー値を入力してもらう
+それが負だったらほげほげ
+LSearchを呼ぶ
+見つけたかどうかに応じてほげほげ
**課題D(おまけ) 締切: 次回の演習開始直後 [#s2475553]
課題Cのプログラムをもとにして,文字列を扱う探索プログラムを作ってみよう.
-文字列同士の比較は,「strなんたら」という関数を使うとよいかも
-文字列を扱う場合,空白を含んでも構わないようにしたり,↓の例でキーが"hoge"だった場合には2番目もヒットさせたりしたくなるが,この課題ではそこまでは考えないでよい
実行結果例:
#pre{{
$ ./ex05d
線形探索するよん
文字列から成るデータを扱えるよん
データは何件?: 5
0番目の値(文字列)を入力してね: abc
1番目の値(文字列)を入力してね: hoge
2番目の値(文字列)を入力してね: hogefuga
3番目の値(文字列)を入力してね: fuga
4番目の値(文字列)を入力してね: ABC
データは5件やな
キー値を入力してね(endと入力すると終了するよ): hoge
その値は1番目にあるよ
キー値を入力してね(endと入力すると終了するよ): fuga
その値は3番目にあるよ
キー値を入力してね(endと入力すると終了するよ): end
ばいばい
}}
ページ名: