#author("2017-10-02T19:41:24+09:00","default:takataka","takataka") #author("2017-10-02T19:42:01+09:00","default:takataka","takataka") *応用プログラミング及び実習 2017年度 第2回 [#d5bb394b] //&color(#ff0000){工事中}; #contents **注意 [#l5135b5b] - 実習のすすめ方について [[AProg/2017/ex00]] - Linux環境での操作についてわからないことがあったら [[Docs/4UNIXBeginners]] -以下の説明の「aprog20XY」の XY には「20XYが年度を表す4桁の数(西暦)になるように」数を当てはめてください. - &color(red){締切に間に合わずチェックを受けられなかった課題は自分で完成させておくこと.}; 先の回には,過去の課題のプログラムを改造して新たなプログラムを作る課題があります. 締切後には点数はつきませんが,質問等は随時どうぞ. **課題A(self) 締切: 今回の実習終了時 [#kadaiA] 全部できたらtakatakaさんに申し出てください. ***課題A-1 PGM画像を表示してみよう [#efe541a1] plain PGM形式の画像のサンプルをダウンロードして表示してみよう. サンプル画像: [[uni3.pgm>AProg:uni3.pgm]] + 上記のサンプル画像を aprog20XY ディレクトリに保存しよう -- &color(white,blue){check}; リンクを右クリックして「別名でリンク先を保存」とかそんな感じ. -- &color(white,blue){check}; 必要なら mv コマンドでファイルを移動させよう [[Docs/4UNIXBeginners]] + displayコマンドで画像として表示させてみよう. --&color(white,blue){check}; displayコマンドの使い方は講義資料参照. --&color(white,blue){check}; 終了は,画像の中にマウスカーソルがある状態で右クリック or 左クリックしてメニューから + lessコマンドでテキストファイルとして中身を表示させてみよう. --&color(white,blue){check}; lessコマンドの使い方は講義資料参照. --&color(white,blue){check}; 表示させた内容から,この画像の幅,高さ,画素値の最大値を読み取りなさい. ***課題A-2 プログラムに画像を生成させてみよう [#y9a15738] + aprog20XY ディレクトリ内に以下のプログラムを保存.右下の''view raw''を右クリックして保存するのがらくちんです -- &color(white,blue){check}; ソースファイル名は ex02a.c とすること &gist(c0ff880aeaf882262e0df8c1b3464017); + そのままコンパイル&実行して出力を眺め,何が起こっているのか理解する. + WIDTH と HEIGHT を大きくして,↑をもう一度 + 適当なファイル名(拡張子は pgm とすること)を指定して標準出力をリダイレクションし,ファイルを作成する -- &color(white,blue){check}; リダイレクションの方法については講義資料参照 + それを display コマンドで表示させて正しく画像を作れたことを確認 **課題B(self) 締切: 今回の実習終了時 [#kadaiB] 下記のプログラムソースは,標準入力から plain PGM 形式の情報を受け取って,それを標準出力へ書き出すもの(未完成)である.これを完成させて,標準入力・標準出力の両方をファイルにリダイレクションして実行すると,単純に画像ファイルをコピーするのと同様のことができるようになる.このプログラムを完成させて,uni3.pgm や課題Aで作った画像で動作確認しなさい. - &color(white,blue){check}; ソースファイル名は ex02b.c とすること - &color(white,blue){check}; リダイレクションの方法については講義資料参照 -- リダイレクションを使う場合,入力と出力に同じファイルを指定すると,正しく動作せずファイルが壊れてしまうので要注意. - &color(white,blue){check}; 出力がちゃんと画像にならない(displayコマンドを実行すると変な魔法使いのおじいさんが出てくる)場合,たいていは出力の形式が間違っています.出力されたファイルを less コマンドで開いて中身を確認して,プログラムのどこに誤りがあるか考えよう. #gist(3fbc1953939415783e9c); ↑のファイル名のリンクを右クリックして保存するのがらくちんです 右下の ''view raw''を右クリックして保存するのがらくちんです **課題C(TA&takataka) 締切: 本文参照 [#kadaiC] &color(red){注意: この課題は,「TAチェック課題」と「takatakaチェック課題」のハイブリッドです.};「takatakaチェック課題」については [[AProg/2017/ex00]] を参照してください.それぞれの課題としての締め切りは次の通りです. - TAチェック課題としての締め切り: 今回の実習終了20分前 - takatakaチェック課題としての締め切り: 来週月曜13時まで(提出法については [[AProg/2017/ex00]]参照) 画像の画素値を反転させる(例えば画素値の最大値が255なら,0を255に,255を0にする)関数をつくろう.次の仕様にしたがって紙(授業の際に配布されたもの)に書きなさい. - 関数名は negate とする - 引数は「2次元配列を表すもの」, 「その幅を表すもの」, 「高さを表すもの」, 「画素値の最大値を表すもの」の4つ(順序もこの通り)とする - 戻り値なし - 次の課題で,前の課題のプログラムにこの関数を組み込んだものを作成する.そのため,この関数の引数として2次元配列を渡す部分には,ex02b.c で #define している2つの定数を(必要に応じて)用いること. - 画素値の最大値が 255 でなくとも動作するように作ること **課題D(TA) 締切: 次回実習開始直後 [#kadaiD] 課題B,Cの結果を組み合わせて,画素値反転のプログラムを完成させよう. + ソースファイル名は ex02negate.c とする -- &color(white,blue){check}; 課題Bのプログラムを cp コマンドでこの名前にコピーしたら簡単です(cf. [[Docs/4UNIXBeginners]] ).エディタを2つ開いてマウスでコピー&ペーストとかそういうださださなことはやめましょう. + 関数 negate の定義は main の定義より下に書き,プロトタイプ宣言をつけること. **課題S(おまけ) 締切: 次回実習終了まで [#kadaiS] 次のことをやりなさい.おまけ課題のチェックは高橋が担当しますので,直接高橋に声をかけてください.この課題をやるには [[AProg/omake]] が役に立つかもしれません. + グレイスケール画像の形式としてPGMがあるように,カラー画像の形式としてPPM(Portable PixMap)というものがあります. PPMでは,画素値をRGB(赤緑青)3色の値で表現します. plain PPM では画素値をどのように並べる約束になっているのか自分で調べなさい. + その結果をもとに,課題Dのプログラムをベースとして,PPM画像を読み込んでRGBそれぞれの画素値を反転させた画像を出力するプログラムを作りなさい. -- 画素値を格納する配列の作り方や関数の設計は何通りもありえます.