_AProg/2011/ex02
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*応用プログラミング演習 2011年度 第2回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2011/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
-&color(Red){締切に間に合わずチェックを受けられなかった課題は自分で完成させておくこと};.
先の回には,過去の課題のプログラムを改造して新たなプログラムを作る課題があります.
締切後にはチェックはしませんが,質問は随時どうぞ.
**準備 [#c9c53218]
PGM画像のサンプルをダウンロードして表示してみよう.
サンプル画像: [[uni3.pgm>AProg:uni3.pgm]]
+上記のサンプル画像のリンクをブラウザで右クリックして「別名でリンク先を保存」.保存先は aprog2011 ディレクトリの中にしよう
+displayコマンドで表示してみよう.displayコマンドの使い方は講義資料参照.
終了は,画像の中にマウスカーソルのある状態で右クリック or 左クリックしてメニューから
+lessコマンドで表示してみよう.lessコマンドの使い方は講義資料参照.lessの出力からこの画像のサイズを読み取ろう
**課題A 締切: 今回の演習終了30分前(2点) [#g4fc9b35]
step1から順に進めて,最後までできたらチェックを受けよう.
易しい課題なので,TAさん+高橋は結果のみを評価します.
正しい結果が得られているかどうか自分自身でよく考えて判断してください.
もちろんわからないことがあったら途中で質問して構いません.
***step1 行列を出力するプログラムを作る [#a658082a]
実行すると以下のような出力の得られるプログラムを作りなさい.
-ソースファイル名は ex02array.c とすること
-2次元配列を使うこと.配列の大きさは 100 x 100 とする
-行数と列数は適当に宣言した変数に代入しておくようにすること(キーボードから受け取るようにしなくてよい).その変数値を変えると下のように出力が変化するようにしてください
#pre{{
3行4列
0 1 2 3
100 101 102 103
200 201 202 203
}}
#pre{{
2行7列
0 1 2 3 4 5 6
100 101 102 103 104 105 106
}}
***step2 リダイレクションとless [#tfce4e32]
次のことをやりなさい
+標準出力をリダイレクトしてプログラムを実行
$ ./ex02array > hoge
+ls コマンドで hoge というファイルができていることを確認
+less コマンドでファイル hoge の内容を確認
+ex02array.cの行数列数を適当に変更して同じことを繰返してみる
***step3 PGM画像を作ろう [#f55bbc40]
ex02array.c を ex02pgm.c にコピーして,次のようなPGM画像を出力するプログラムに改造しなさい(画像サイズは横200画素,縦150画素とし,それぞれ変数に格納すること).
#ref(AProg:ex02pgm.png);
-コピーには cp コマンドを使いましょう
-標準出力をリダイレクトして出力を適当な名前のファイルに書き込み,display コマンドで画像として表示できることを確認しよう
++プログラムを実行.リダイレクションしよう
++hoge.pgm の内容が正しそうか確認.lessを使おう
++hoge.pgm を画像として表示しよう
ここまでできたらチェックをうけよう
***step4 このstepはおまけです.チェック対象外です [#bfbd9bcb]
ex02pgm.c をもとにして,次のような画像を作れるプログラムを作ってみよう.
&ref(AProg:ex02a2-2.png);
&ref(AProg:ex02a2-3.png);
**課題B 締切: 今回の演習終了時(2点) [#yac9d979]
***step1 行列を入力すると各要素を7倍して出力 [#ydadd051]
以下のような動作をするプログラムを作りなさい.
-ソースファイル名は ex02array2.c とすること
-2次元配列を使うこと
-7倍の計算は,2次元配列を引数にとる関数を用いて行うようにすること.
関数はなるべく部品として使い回しやすいように作るのがよいから,この課題では,
この関数は7倍の計算のみを行う(入力や出力の処理はmain()にまかせる)ように作ること.
#pre{{
2 3 ← キー入力
11 22 33 ← キー入力
44 55 66 ← キー入力
2 3
77 154 231
308 375 462
}}
***step2 入出力のリダイレクション [#mdff22b2]
+emacs等で次のような内容のテキストファイルを作る(例えば hoge.txt とする)
#pre{{
3 4
1 2 3 4
-5 -6 -7 -8
9 10 11 12
}}
+そのファイルを入力としてプログラムを実行してみる
+さらに出力もリダイレクションしてみる
+得られた出力ファイルの内容を less で確認してみよう
ここまでできたらチェックをうけよう
***step3 このstepはおまけです.チェック対象外です [#wa5f8c1e]
UNIXのシェルでは,'<'と'>'の他に,'|'を使うことができます(「パイプ」といいます).
次のように実行するとどうなるでしょう?
$ ./ex02array2 < hoge.txt | ./ex02array2
$ ./ex02array2 < hoge.txt | ./ex02array2 | ./ex02array2
$ ./ex02array2 < hoge.txt | ./ex02array2 | ./ex02array2 | ./ex02array2
**課題C 締切: 次回演習開始直後(3点) [#kadaiC]
&color(Red){課題Bのプログラムを元にして};(*),画像の明るさを反転させるプログラムを作ろう.
-ソースファイル名は ex02negate.c とすること
-最大で 512x512 画素の画像まで扱えるように配列の大きさを定めること
-「明るさの反転」: 白(255)を黒(0)に,黒(0)を白(255)にするのだから...
-PGM画像のヘッダを読み込む部分は,講義資料の pgmheader.c を参考にするとよいかも
-画像の入出力はリダイレクションによって行えるように作ること.
ためしに uni3.pgm の明るさを反転させよう.
(*) つまり,課題Bのように関数を使って.
**課題S(おまけ) 締切: 次回演習開始直後(2点) [#afbdc6bd]
おまけ課題等をやる際には [[AProg/omake]] が役に立つかもしれません.
グレイスケール画像の形式としてPGMがあるように,カラー画像の形式としてPPM(Portable PixMap)というものがあります.
PPMでは,画素値をRGB(赤緑青)3色の値で表現します.
テキスト形式のPPM画像では画素値をどのように並べる約束になっているのか自分で調べ,
課題Cのプログラムをもとにして,PPM画像を読み込んで色を反転させた画像を出力するプログラムを作りなさい.
ただし,ここでいう色の反転とは,R,G,Bそれぞれの値を課題Cと同様に変化させることをいいます.
つまり,
(新しいRの値)= 255 - (元のRの値)
(新しいGの値)= 255 - (元のGの値)
(新しいBの値)= 255 - (元のBの値)
ということです.
PPM画像のサンプル: [[blackuni3.ppm>AProg:blackuni3.ppm]]
ヒント: 画素値の配列への格納の仕方はいろいろ考えられますが,R,G,Bに対応させて2次元配列を3つ使うのが簡単かも.
終了行:
*応用プログラミング演習 2011年度 第2回 [#bebe2b15]
//&color(#ff0000){工事中};
#contents
**注意 [#i749b259]
-演習のすすめ方について [[AProg/2011/ex01#note]]
-Linux環境での操作についてはわからないことがあったら [[Docs/4UNIXBeginners]]
-&color(Red){締切に間に合わずチェックを受けられなかった課題は自分で完成させておくこと};.
先の回には,過去の課題のプログラムを改造して新たなプログラムを作る課題があります.
締切後にはチェックはしませんが,質問は随時どうぞ.
**準備 [#c9c53218]
PGM画像のサンプルをダウンロードして表示してみよう.
サンプル画像: [[uni3.pgm>AProg:uni3.pgm]]
+上記のサンプル画像のリンクをブラウザで右クリックして「別名でリンク先を保存」.保存先は aprog2011 ディレクトリの中にしよう
+displayコマンドで表示してみよう.displayコマンドの使い方は講義資料参照.
終了は,画像の中にマウスカーソルのある状態で右クリック or 左クリックしてメニューから
+lessコマンドで表示してみよう.lessコマンドの使い方は講義資料参照.lessの出力からこの画像のサイズを読み取ろう
**課題A 締切: 今回の演習終了30分前(2点) [#g4fc9b35]
step1から順に進めて,最後までできたらチェックを受けよう.
易しい課題なので,TAさん+高橋は結果のみを評価します.
正しい結果が得られているかどうか自分自身でよく考えて判断してください.
もちろんわからないことがあったら途中で質問して構いません.
***step1 行列を出力するプログラムを作る [#a658082a]
実行すると以下のような出力の得られるプログラムを作りなさい.
-ソースファイル名は ex02array.c とすること
-2次元配列を使うこと.配列の大きさは 100 x 100 とする
-行数と列数は適当に宣言した変数に代入しておくようにすること(キーボードから受け取るようにしなくてよい).その変数値を変えると下のように出力が変化するようにしてください
#pre{{
3行4列
0 1 2 3
100 101 102 103
200 201 202 203
}}
#pre{{
2行7列
0 1 2 3 4 5 6
100 101 102 103 104 105 106
}}
***step2 リダイレクションとless [#tfce4e32]
次のことをやりなさい
+標準出力をリダイレクトしてプログラムを実行
$ ./ex02array > hoge
+ls コマンドで hoge というファイルができていることを確認
+less コマンドでファイル hoge の内容を確認
+ex02array.cの行数列数を適当に変更して同じことを繰返してみる
***step3 PGM画像を作ろう [#f55bbc40]
ex02array.c を ex02pgm.c にコピーして,次のようなPGM画像を出力するプログラムに改造しなさい(画像サイズは横200画素,縦150画素とし,それぞれ変数に格納すること).
#ref(AProg:ex02pgm.png);
-コピーには cp コマンドを使いましょう
-標準出力をリダイレクトして出力を適当な名前のファイルに書き込み,display コマンドで画像として表示できることを確認しよう
++プログラムを実行.リダイレクションしよう
++hoge.pgm の内容が正しそうか確認.lessを使おう
++hoge.pgm を画像として表示しよう
ここまでできたらチェックをうけよう
***step4 このstepはおまけです.チェック対象外です [#bfbd9bcb]
ex02pgm.c をもとにして,次のような画像を作れるプログラムを作ってみよう.
&ref(AProg:ex02a2-2.png);
&ref(AProg:ex02a2-3.png);
**課題B 締切: 今回の演習終了時(2点) [#yac9d979]
***step1 行列を入力すると各要素を7倍して出力 [#ydadd051]
以下のような動作をするプログラムを作りなさい.
-ソースファイル名は ex02array2.c とすること
-2次元配列を使うこと
-7倍の計算は,2次元配列を引数にとる関数を用いて行うようにすること.
関数はなるべく部品として使い回しやすいように作るのがよいから,この課題では,
この関数は7倍の計算のみを行う(入力や出力の処理はmain()にまかせる)ように作ること.
#pre{{
2 3 ← キー入力
11 22 33 ← キー入力
44 55 66 ← キー入力
2 3
77 154 231
308 375 462
}}
***step2 入出力のリダイレクション [#mdff22b2]
+emacs等で次のような内容のテキストファイルを作る(例えば hoge.txt とする)
#pre{{
3 4
1 2 3 4
-5 -6 -7 -8
9 10 11 12
}}
+そのファイルを入力としてプログラムを実行してみる
+さらに出力もリダイレクションしてみる
+得られた出力ファイルの内容を less で確認してみよう
ここまでできたらチェックをうけよう
***step3 このstepはおまけです.チェック対象外です [#wa5f8c1e]
UNIXのシェルでは,'<'と'>'の他に,'|'を使うことができます(「パイプ」といいます).
次のように実行するとどうなるでしょう?
$ ./ex02array2 < hoge.txt | ./ex02array2
$ ./ex02array2 < hoge.txt | ./ex02array2 | ./ex02array2
$ ./ex02array2 < hoge.txt | ./ex02array2 | ./ex02array2 | ./ex02array2
**課題C 締切: 次回演習開始直後(3点) [#kadaiC]
&color(Red){課題Bのプログラムを元にして};(*),画像の明るさを反転させるプログラムを作ろう.
-ソースファイル名は ex02negate.c とすること
-最大で 512x512 画素の画像まで扱えるように配列の大きさを定めること
-「明るさの反転」: 白(255)を黒(0)に,黒(0)を白(255)にするのだから...
-PGM画像のヘッダを読み込む部分は,講義資料の pgmheader.c を参考にするとよいかも
-画像の入出力はリダイレクションによって行えるように作ること.
ためしに uni3.pgm の明るさを反転させよう.
(*) つまり,課題Bのように関数を使って.
**課題S(おまけ) 締切: 次回演習開始直後(2点) [#afbdc6bd]
おまけ課題等をやる際には [[AProg/omake]] が役に立つかもしれません.
グレイスケール画像の形式としてPGMがあるように,カラー画像の形式としてPPM(Portable PixMap)というものがあります.
PPMでは,画素値をRGB(赤緑青)3色の値で表現します.
テキスト形式のPPM画像では画素値をどのように並べる約束になっているのか自分で調べ,
課題Cのプログラムをもとにして,PPM画像を読み込んで色を反転させた画像を出力するプログラムを作りなさい.
ただし,ここでいう色の反転とは,R,G,Bそれぞれの値を課題Cと同様に変化させることをいいます.
つまり,
(新しいRの値)= 255 - (元のRの値)
(新しいGの値)= 255 - (元のGの値)
(新しいBの値)= 255 - (元のBの値)
ということです.
PPM画像のサンプル: [[blackuni3.ppm>AProg:blackuni3.ppm]]
ヒント: 画素値の配列への格納の仕方はいろいろ考えられますが,R,G,Bに対応させて2次元配列を3つ使うのが簡単かも.
ページ名: