_AProg/2011/ex06
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*応用プログラミング演習 2011年度 第6回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2011/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#j9f65946]
+講義資料の kenshin2.c を作って動作確認しなさい
+講義資料の kenshin4.c を作って動作確認しなさい
+typedefを使って kenshin4.c を書き換えてみなさい
+講義資料の scanftest.c を作って動作確認しなさい(Nを小さな数にした実験も行ってみること)
**課題A 締切: 今回の演習終了時(2点) [#kadaiA]
***step1 [#t716d2cc]
前回いくつかのファイルをとってきたディレクトリ /home/sample/takataka/aprog2011/ に,data4ex06a.txt という名前のテキストファイルがおいてある.
cpコマンドを使ってこれを自分のこの授業用のディレクトリにコピーし,内容を less で確認しなさい.
このファイルには,「ID番号」,「名前」,「年齢」,「視力」という4つの情報が一組になって書き込まれている.
よく見ると一部おかしなところがあるが,以下ではそのまま扱ってみよう.
***step2 [#ffc074ba]
data4ex06a.txt の内容を読み込み,次のような出力をするプログラムを作成しよう.
#pre{{
$ ./ex06a
4件のデータを読み込んだで
ID: 1055 Name: Hogeo Age: 40 Sight: 1.5
ID: 0666 Name: Henako Age: 18 Sight: 5.0
ID: 0999 Name: Fugayo Age: 20 Sight: 0.1
ID: 2345 Name: Piyochan Age: 67 Sight: 1.0
}}
ただし,次の指示に従うこと
-ソースファイル名は ex06a.c とすること(ソースファイルはこれひとつでよい)
-一組のデータを格納する構造体を自分で定義し,その構造体の配列を用いること.
ただし,名前はアスキー文字で最大50文字分を格納できるようにすること.
また,次のようにNを定義し,これを配列の大きさとすること
#define N 100
//-自分で定義した構造体に,typedef を用いて適当な型名をつけること
-データの読み込みの際にはfscanf()の戻り値を利用してデータ件数をプログラム自身に数えさせること.最大N件読み込めるようにすること.
上記の実行例で「4件のデータを読み込んだで」と出力されている理由をよく考えること.
-上記の出力例のように,ID番号の出力時には4桁固定で必要なら先頭に0をつけて出力すること.視力も上記のように出力されるようにすること.どうしてよいかわからなければC言語の書籍等で調べること.
**課題B 締切: 次回演習開始直後(6点),終了30分前(4点) [#kadaiB]
郵便番号簿探索プログラムを作ろう.
***step1 [#la1cd9bd]
ディレクトリ /home/sample/takataka/aprog2011/ に,
-zipdata100 100件分の郵便番号データから成るテキストファイル
-zipsearch.h zipsearch.o用のヘッダファイル
-zipsearch.o 探索の関数などをコンパイルして作られたオブジェクトファイル
という3つのファイルが置いてある.
これらを自分のこの授業用のディレクトリにコピーし, zipsearch.o 以外のファイルの内容を less で確認しなさい(zipsearch.o はオブジェクトファイルなので less では普通の人は読めません.試してみると面白いかもしれませんが).
***step2 [#p00dca95]
上記のファイルを利用して,zipdata100 に含まれるデータを読み込んで探索するプログラムを作りなさい.
-mainを含むソースファイルの名前は ex06zs.c とすること
-前回出てきた zssample と同様の動作をするように作ること.ただし,以下の2つの機能は実現しなくともよい(もちろんできる人は実現したらよい).
--探索回数の表示
--データの配列中での位置の表示(zssampleでは [] で囲んでそれを表してます)
-まずは線形探索するプログラムを作り,うまくいったら,二分探索の関数を使うように改造すること(&color(#00a000){二分探索するためにはデータをあらかじめ…};)
***step3 [#h4483976]
zipdata100 はデータが100件しかなくておもしろくないので,13万件弱のデータを含むファイルを使ってためそう.
このファイルはサイズが大きい(約4MB)ので,各自のディレクトリにファイルをコピーするともったいない.次のように fopen するようにしたらよい.
fopen("/home/sample/takataka/aprog2011/zipdata", "r");
このように,fopenの引数には,ファイル名だけではなく,ディレクトリ名も含めた&color(#00a000){パス};を指定することができる.
構造体の配列の大きさも大きくしなければならないことに気をつけよう.
もしかすると,配列のサイズを大きくすると,プログラムが正しく書けているのに実行すると Bus Error となってしまうかもしれない.
その場合は,配列の宣言の頭に static をつけて,
static ZIPDATA hoge[....];
のようにするとよい(どうしてこうするとよいか気になる人は,高橋に尋ねてください).
**課題S(おまけ) 締切: 次回の演習終了時(2点) [#kadaiS]
以下のことをやってみよう.
+課題Bのプログラムで探索回数(キー値とデータとの比較の回数)を表示できるようにし,線形探索と二分探索でどのくらい探索回数が違うかいろいろ試してみなさい.
+二分探索とはどのようなアルゴリズムであるか調べ,高橋に説明しなさい.
+上記の二分探索のプログラムのソート関数を,自分で作ったもので置き換えよう.
ソートアルゴリズムは,好きなものを使ったらよいが,なるべく計算量の少ないアルゴリズムの方がよいでしょう.
終了行:
*応用プログラミング演習 2011年度 第6回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2011/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#j9f65946]
+講義資料の kenshin2.c を作って動作確認しなさい
+講義資料の kenshin4.c を作って動作確認しなさい
+typedefを使って kenshin4.c を書き換えてみなさい
+講義資料の scanftest.c を作って動作確認しなさい(Nを小さな数にした実験も行ってみること)
**課題A 締切: 今回の演習終了時(2点) [#kadaiA]
***step1 [#t716d2cc]
前回いくつかのファイルをとってきたディレクトリ /home/sample/takataka/aprog2011/ に,data4ex06a.txt という名前のテキストファイルがおいてある.
cpコマンドを使ってこれを自分のこの授業用のディレクトリにコピーし,内容を less で確認しなさい.
このファイルには,「ID番号」,「名前」,「年齢」,「視力」という4つの情報が一組になって書き込まれている.
よく見ると一部おかしなところがあるが,以下ではそのまま扱ってみよう.
***step2 [#ffc074ba]
data4ex06a.txt の内容を読み込み,次のような出力をするプログラムを作成しよう.
#pre{{
$ ./ex06a
4件のデータを読み込んだで
ID: 1055 Name: Hogeo Age: 40 Sight: 1.5
ID: 0666 Name: Henako Age: 18 Sight: 5.0
ID: 0999 Name: Fugayo Age: 20 Sight: 0.1
ID: 2345 Name: Piyochan Age: 67 Sight: 1.0
}}
ただし,次の指示に従うこと
-ソースファイル名は ex06a.c とすること(ソースファイルはこれひとつでよい)
-一組のデータを格納する構造体を自分で定義し,その構造体の配列を用いること.
ただし,名前はアスキー文字で最大50文字分を格納できるようにすること.
また,次のようにNを定義し,これを配列の大きさとすること
#define N 100
//-自分で定義した構造体に,typedef を用いて適当な型名をつけること
-データの読み込みの際にはfscanf()の戻り値を利用してデータ件数をプログラム自身に数えさせること.最大N件読み込めるようにすること.
上記の実行例で「4件のデータを読み込んだで」と出力されている理由をよく考えること.
-上記の出力例のように,ID番号の出力時には4桁固定で必要なら先頭に0をつけて出力すること.視力も上記のように出力されるようにすること.どうしてよいかわからなければC言語の書籍等で調べること.
**課題B 締切: 次回演習開始直後(6点),終了30分前(4点) [#kadaiB]
郵便番号簿探索プログラムを作ろう.
***step1 [#la1cd9bd]
ディレクトリ /home/sample/takataka/aprog2011/ に,
-zipdata100 100件分の郵便番号データから成るテキストファイル
-zipsearch.h zipsearch.o用のヘッダファイル
-zipsearch.o 探索の関数などをコンパイルして作られたオブジェクトファイル
という3つのファイルが置いてある.
これらを自分のこの授業用のディレクトリにコピーし, zipsearch.o 以外のファイルの内容を less で確認しなさい(zipsearch.o はオブジェクトファイルなので less では普通の人は読めません.試してみると面白いかもしれませんが).
***step2 [#p00dca95]
上記のファイルを利用して,zipdata100 に含まれるデータを読み込んで探索するプログラムを作りなさい.
-mainを含むソースファイルの名前は ex06zs.c とすること
-前回出てきた zssample と同様の動作をするように作ること.ただし,以下の2つの機能は実現しなくともよい(もちろんできる人は実現したらよい).
--探索回数の表示
--データの配列中での位置の表示(zssampleでは [] で囲んでそれを表してます)
-まずは線形探索するプログラムを作り,うまくいったら,二分探索の関数を使うように改造すること(&color(#00a000){二分探索するためにはデータをあらかじめ…};)
***step3 [#h4483976]
zipdata100 はデータが100件しかなくておもしろくないので,13万件弱のデータを含むファイルを使ってためそう.
このファイルはサイズが大きい(約4MB)ので,各自のディレクトリにファイルをコピーするともったいない.次のように fopen するようにしたらよい.
fopen("/home/sample/takataka/aprog2011/zipdata", "r");
このように,fopenの引数には,ファイル名だけではなく,ディレクトリ名も含めた&color(#00a000){パス};を指定することができる.
構造体の配列の大きさも大きくしなければならないことに気をつけよう.
もしかすると,配列のサイズを大きくすると,プログラムが正しく書けているのに実行すると Bus Error となってしまうかもしれない.
その場合は,配列の宣言の頭に static をつけて,
static ZIPDATA hoge[....];
のようにするとよい(どうしてこうするとよいか気になる人は,高橋に尋ねてください).
**課題S(おまけ) 締切: 次回の演習終了時(2点) [#kadaiS]
以下のことをやってみよう.
+課題Bのプログラムで探索回数(キー値とデータとの比較の回数)を表示できるようにし,線形探索と二分探索でどのくらい探索回数が違うかいろいろ試してみなさい.
+二分探索とはどのようなアルゴリズムであるか調べ,高橋に説明しなさい.
+上記の二分探索のプログラムのソート関数を,自分で作ったもので置き換えよう.
ソートアルゴリズムは,好きなものを使ったらよいが,なるべく計算量の少ないアルゴリズムの方がよいでしょう.
ページ名: