_AProg/2012/ex06
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*応用プログラミング演習 2012年度 第6回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2012/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#kadaiN]
次のように cp コマンドを実行すると,カレントディレクトリに zssampleL と zssampleB という実行ファイルを入手できる(あらかじめコピー先のディレクトリにcdしておいてから cp を実行すること.また,↓の入力時には途中まで入力したらTabキーを押して補完することを繰り返すと楽ができるでしょう).
$ cp /home/sample/takataka/aprog2012/zssample? . ←ピリオド
それぞれ実行してみよう.
いまどきのコンピュータは速いのでたかだか12万件ちょいの郵便番号データではこの二つの違いは体感できないでしょうが,探索回数に注目.
**課題A 締切: 今回の演習終了時(3点) [#kadaiA]
前回いくつかのファイルをとってきたディレクトリ /home/sample/takataka/aprog2012/ に,data4ex06a.txt という名前のテキストファイルがおいてある.
cpコマンドを使ってこれを自分のこの授業用のディレクトリにコピーし,内容を less で確認しなさい.
このファイルには,[[前回の課題A>AProg/2012/ex05#kadaiA]] のようなデータが書き込まれている.
よく見ると一部おかしなところがあるが,直したりしないでそのまま扱ってみよう.
data4ex06a.txt の内容を読み込み,次のような出力をするプログラムを作成しよう.
#pre{{
$ ./ex06a
4件のデータを読み込んだで
番号: 1055 氏名: Hogeo 年齢: 40 視力: 1.5
番号: 666 氏名: Henako 年齢: 18 視力: 5.0
番号: 999 氏名: Fugayo 年齢: 20 視力: 0.1
番号: 2345 氏名: Piyochan 年齢: 67 視力: 1.0
一番年上は Piyochan さんです
}}
ただし,次の指示に従うこと
-ソースファイルは次のような構成とすること
-- ex06a.c 関数 main を定義したソース
-- sight.c 関数 Oldest (説明は後述)を定義したソース
-- sight.h 構造体の定義と関数 Oldest のプロトタイプ宣言を書いたヘッダ
-自分で定義した構造体の変数の配列を用意し,そこにファイルから読み込んだデータを格納するように作ること.
--構造体の定義は [[前回の課題A>AProg/2012/ex05#kadaiA]] と同様
--次のように定数Nを定義し,これを構造体変数の配列の大きさとすること
#define N 50
--データの読み込みの際にはfscanf()の戻り値を利用してデータ件数をプログラム自身に数えさせること.最大N件読み込めるようにすること.
上記の実行例で「4件のデータを読み込んだで」と出力されている理由をよく考えること.
- sight.c に次のような仕様の関数 Oldest を定義し,それを用いたプログラムとすること
-- 引数は構造体変数の配列とその要素数
-- 戻り値は,その配列中で年齢が最大のものの要素番号
**課題B 締切: 次回演習開始直後(3点) [#kadaiB]
他人の作ったソースを利用して画像処理をするプログラムを書いてみよう.
***step0 [#rd86f260]
ディレクトリ /home/sample/takataka/aprog2012/ にある image.c と image.h というファイルを手元にコピーして,中身を眺めてみよう.
この課題では,image.c で定義された関数たちがどのような処理を行っているか細かいところまで理解することは求めていない.
コメントを手がかりに,これらの関数を呼び出して画像処理するプログラムを作成できればよい.
***step1 [#j15139e0]
以下はそれらを用いて uni3.pgm というファイルからPGM画像を読み込み,そのまま hoge.pgm という名前で出力するプログラムである.
ex06image.c という名前でこれを作成し,コンパイルして実行してみよう.
- image.c / image.h は書き換える必要はない
- image.c では数学ライブラリに含まれる関数を用いているので,リンク時に -lm オプションをつける必要がある.
#pre{{
#include <stdio.h>
#include <stdlib.h>
#include "image.h"
int main(void)
{
Image img;
FILE *fp;
fp = fopen("uni3.pgm", "r");
if(fp == NULL){
printf("ファイルを開けません\n");
exit(EXIT_FAILURE);
}
readPGM(fp, &img);
fclose(fp);
fp = fopen("hoge.pgm", "w");
if(fp == NULL){
printf("ファイルを開けません\n");
exit(EXIT_FAILURE);
}
writePGM(fp, &img);
fclose(fp);
return 0;
}
}}
龍大計算機室のLinux環境では問題ないはずですが,他の環境の場合,上記のプログラムを正しく作成しても,実行時に Segmentation Falut や Bus Error になることがあります.
そういう場合は,変数 img の宣言の頭に static をつけて
static Image img;
とするとよいです.どうしてこうするとよいのか知りたい人は,高橋に尋ねてください.
***step2 [#w59270e7]
image.c を利用して,適当なPGM画像をファイルから読み込み,image.c で定義された
「画素値反転」,「左右反転」,「上下反転」,「うずまき」の4つの関数を順番に呼んで加工した画像を新たなPGM画像としてファイルに書き出すプログラムを作成しなさい.
- image.c / image.h は書き換える必要はない
-「うずまき」だけ他の関数とは仕様が異なることに注意.
-「うずまき」の第2引数は,とりあえず &jsmath(\pi/2); くらいの値を使い,その結果を見ていろいろ変えてみるとよいだろう.
**課題S(おまけ) 締切: 次回演習開始直後(2点) [#h8865fd7]
計算機室の環境に用意された ImageMagick という画像処理ツール群(displayコマンドもその一つ)の中に,animate というコマンドがある.
カレントディレクトリに hoge000.pgm, hoge001.pgm, ..., hoge123.pgm のように連番のついた画像ファイルが存在していたとすると,
$ animate hoge*.pgm
と実行することで,これらのファイルを使ったアニメーションもどき(パラパラ漫画)を表示させることができる(メニューから表示速度を変えたりすることも可能).
そこで,適当な画像を使い,うずまき回転角を徐々に増やしながら uzumaki() を呼んで処理した画像を連番のついたファイル名で保存するプログラムを作成し,アニメーションさせてみよう.
1枚ずつ作るのではなく,プログラムを一度実行したら複数の画像が全部作成されるようにすること.
終了行:
*応用プログラミング演習 2012年度 第6回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2012/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
**課題N この課題には点数はつきません [#kadaiN]
次のように cp コマンドを実行すると,カレントディレクトリに zssampleL と zssampleB という実行ファイルを入手できる(あらかじめコピー先のディレクトリにcdしておいてから cp を実行すること.また,↓の入力時には途中まで入力したらTabキーを押して補完することを繰り返すと楽ができるでしょう).
$ cp /home/sample/takataka/aprog2012/zssample? . ←ピリオド
それぞれ実行してみよう.
いまどきのコンピュータは速いのでたかだか12万件ちょいの郵便番号データではこの二つの違いは体感できないでしょうが,探索回数に注目.
**課題A 締切: 今回の演習終了時(3点) [#kadaiA]
前回いくつかのファイルをとってきたディレクトリ /home/sample/takataka/aprog2012/ に,data4ex06a.txt という名前のテキストファイルがおいてある.
cpコマンドを使ってこれを自分のこの授業用のディレクトリにコピーし,内容を less で確認しなさい.
このファイルには,[[前回の課題A>AProg/2012/ex05#kadaiA]] のようなデータが書き込まれている.
よく見ると一部おかしなところがあるが,直したりしないでそのまま扱ってみよう.
data4ex06a.txt の内容を読み込み,次のような出力をするプログラムを作成しよう.
#pre{{
$ ./ex06a
4件のデータを読み込んだで
番号: 1055 氏名: Hogeo 年齢: 40 視力: 1.5
番号: 666 氏名: Henako 年齢: 18 視力: 5.0
番号: 999 氏名: Fugayo 年齢: 20 視力: 0.1
番号: 2345 氏名: Piyochan 年齢: 67 視力: 1.0
一番年上は Piyochan さんです
}}
ただし,次の指示に従うこと
-ソースファイルは次のような構成とすること
-- ex06a.c 関数 main を定義したソース
-- sight.c 関数 Oldest (説明は後述)を定義したソース
-- sight.h 構造体の定義と関数 Oldest のプロトタイプ宣言を書いたヘッダ
-自分で定義した構造体の変数の配列を用意し,そこにファイルから読み込んだデータを格納するように作ること.
--構造体の定義は [[前回の課題A>AProg/2012/ex05#kadaiA]] と同様
--次のように定数Nを定義し,これを構造体変数の配列の大きさとすること
#define N 50
--データの読み込みの際にはfscanf()の戻り値を利用してデータ件数をプログラム自身に数えさせること.最大N件読み込めるようにすること.
上記の実行例で「4件のデータを読み込んだで」と出力されている理由をよく考えること.
- sight.c に次のような仕様の関数 Oldest を定義し,それを用いたプログラムとすること
-- 引数は構造体変数の配列とその要素数
-- 戻り値は,その配列中で年齢が最大のものの要素番号
**課題B 締切: 次回演習開始直後(3点) [#kadaiB]
他人の作ったソースを利用して画像処理をするプログラムを書いてみよう.
***step0 [#rd86f260]
ディレクトリ /home/sample/takataka/aprog2012/ にある image.c と image.h というファイルを手元にコピーして,中身を眺めてみよう.
この課題では,image.c で定義された関数たちがどのような処理を行っているか細かいところまで理解することは求めていない.
コメントを手がかりに,これらの関数を呼び出して画像処理するプログラムを作成できればよい.
***step1 [#j15139e0]
以下はそれらを用いて uni3.pgm というファイルからPGM画像を読み込み,そのまま hoge.pgm という名前で出力するプログラムである.
ex06image.c という名前でこれを作成し,コンパイルして実行してみよう.
- image.c / image.h は書き換える必要はない
- image.c では数学ライブラリに含まれる関数を用いているので,リンク時に -lm オプションをつける必要がある.
#pre{{
#include <stdio.h>
#include <stdlib.h>
#include "image.h"
int main(void)
{
Image img;
FILE *fp;
fp = fopen("uni3.pgm", "r");
if(fp == NULL){
printf("ファイルを開けません\n");
exit(EXIT_FAILURE);
}
readPGM(fp, &img);
fclose(fp);
fp = fopen("hoge.pgm", "w");
if(fp == NULL){
printf("ファイルを開けません\n");
exit(EXIT_FAILURE);
}
writePGM(fp, &img);
fclose(fp);
return 0;
}
}}
龍大計算機室のLinux環境では問題ないはずですが,他の環境の場合,上記のプログラムを正しく作成しても,実行時に Segmentation Falut や Bus Error になることがあります.
そういう場合は,変数 img の宣言の頭に static をつけて
static Image img;
とするとよいです.どうしてこうするとよいのか知りたい人は,高橋に尋ねてください.
***step2 [#w59270e7]
image.c を利用して,適当なPGM画像をファイルから読み込み,image.c で定義された
「画素値反転」,「左右反転」,「上下反転」,「うずまき」の4つの関数を順番に呼んで加工した画像を新たなPGM画像としてファイルに書き出すプログラムを作成しなさい.
- image.c / image.h は書き換える必要はない
-「うずまき」だけ他の関数とは仕様が異なることに注意.
-「うずまき」の第2引数は,とりあえず &jsmath(\pi/2); くらいの値を使い,その結果を見ていろいろ変えてみるとよいだろう.
**課題S(おまけ) 締切: 次回演習開始直後(2点) [#h8865fd7]
計算機室の環境に用意された ImageMagick という画像処理ツール群(displayコマンドもその一つ)の中に,animate というコマンドがある.
カレントディレクトリに hoge000.pgm, hoge001.pgm, ..., hoge123.pgm のように連番のついた画像ファイルが存在していたとすると,
$ animate hoge*.pgm
と実行することで,これらのファイルを使ったアニメーションもどき(パラパラ漫画)を表示させることができる(メニューから表示速度を変えたりすることも可能).
そこで,適当な画像を使い,うずまき回転角を徐々に増やしながら uzumaki() を呼んで処理した画像を連番のついたファイル名で保存するプログラムを作成し,アニメーションさせてみよう.
1枚ずつ作るのではなく,プログラムを一度実行したら複数の画像が全部作成されるようにすること.
ページ名: