Top / AProg / 2015 / ex02

応用プログラミング演習 2015年度 第2回 [edit]

注意 [edit]

  • 演習のすすめ方について AProg/2015/ex00
  • Linux環境での操作についてわからないことがあったら Docs/4UNIXBeginners
  • 締切に間に合わずチェックを受けられなかった課題は自分で完成させておくこと. 先の回には,過去の課題のプログラムを改造して新たなプログラムを作る課題があります. 締切後には点数はつきませんが,質問等は随時どうぞ.

課題A(self) 締切: 今回の演習終了時 [edit]

全部できたらTAさんに申し出てください.

課題A-1 PGM画像を表示してみよう [edit]

PGM画像のサンプルをダウンロードして表示してみよう. サンプル画像: uni3.pgm

  1. 上記のサンプル画像を aprog2015 ディレクトリに保存しよう
    • check リンクを右クリックして「別名でリンク先を保存」とかそんな感じ.
    • check 必要なら mv コマンドでファイルを移動させよう Docs/4UNIXBeginners
  2. displayコマンドで画像として表示させてみよう.
    • check displayコマンドの使い方は講義資料参照.
    • check 終了は,画像の中にマウスカーソルがある状態で右クリック or 左クリックしてメニューから
  3. lessコマンドでテキストファイルとして中身を表示させてみよう.
    • check lessコマンドの使い方は講義資料参照.
    • check 表示させた内容から,この画像の幅,高さ,画素値の最大値を読み取りなさい.

課題A-2 画像を手作りしよう [edit]

テキストエディタを使って画像を手作り(?)しよう.

  1. aprog2015 ディレクトリ内で
    $ emacs  ex02a.pgm &
    と emacs を起動.
  2. このファイル ex02a.pgm が,次のようなアスキー形式のPGM画像を表すように内容を書く.
    1. 幅 100 画素,高さ 50 画素,画素値の最大値は 255
    2. 画素値の部分には,「0から240まで10ずつ増える数合計25個を1行に書いたもの」を200行書く.
      • check 行数が画像の高さと一致していませんが,PGMの規格では,テキストファイルの改行位置が画像の幅に対応している必要はないので,これで問題ありません.
      • check 200行手打ちは大変です.下の emacs でのカット&ペーストの例の説明を読んで,emacsで行単位でカットペーストする方法を学び,それを使って作業しなさい.マウスでコピペは超かっこ悪いのでやめましょう.
    3. ex02a.pgm を保存し,display コマンドで表示する.おかしかったら修正.
    4. 幅と高さの数字のみを 50 と 100 に書き換えて保存し,再度表示してみる.
      • check どんな画像になるか予想してから実行してみること

この課題にまつわる Emacs あれこれ [edit]

★ カット&ペーストの例

  1. 0から240まで10ずつ増える数合計25個を書いて最後に改行する
  2. その行の先頭にカーソルを移動し,C-k (「コントロールキーを押しながら'k'を押す」という意味)を2回繰り返す ==> 1度目でその行の中身がカットされ,2度目で改行がカットされます.
  3. その場で C-y を何度か押してみる.もちろん適当な場所にカーソルを移動してから C-y してもよい.
  4. emacs のキー操作でもっと便利な方法もありますが,ここでは一番簡単な方法を説明しています.気になる人はいろいろ調べてみるとよいでしょう.
    • C-k と C-y だけでも,例えば,上記の操作で10行作る ==> 先頭で C-k を20回繰り返してまとめてカット ==> C-y 1回で10行ペースト ==> さらに C-y ,なんてこともできますね

★ emacs で PGM ファイルを開いたら画像として表示されちゃった

最近の emacs は賢いのでそういうことをします.そのままでは編集できなくて困りますが,よく見ると emacs の一番下のメッセージ欄に

Type C-c C-c to view the image as text.

とか出てるでしょう.言われたとおり,C-c (コントロールキーを押しながら 'c' を押す)を2回繰り返す(ので,コントロールキーを押したまま 'c' を2回押すことに相当します)と,テキストとして閲覧編集ができるようになります.

課題B(self) 締切: 今回の演習終了時 [edit]

下記のプログラムソースは,標準入力からPGM画像形式の情報を受け取って,それを標準出力へ書き出すもの(未完成)である.これを完成させて,標準入力・標準出力の両方をファイルにリダイレクションして実行すると,単純に画像ファイルをコピーするのと同様のことができるようになる.このプログラムを完成させて,uni3.pgm や課題Aで作った画像で動作確認しなさい.

  • check ソースファイル名は ex02b.c とすること
  • check リダイレクションの方法については講義資料参照
    • リダイレクションを使う場合,入力と出力に同じファイルを指定すると,正しく動作せずファイルが壊れてしまうので要注意.
  • check 出力がちゃんと画像にならない(displayコマンドを実行すると変な魔法使いのおじいさんが出てくる)場合,たいていは出力の形式が間違っています.出力されたファイルを less コマンドで開いて中身を確認して,プログラムのどこに誤りがあるか考えよう.

↑のファイル名のリンクを右クリックして保存するのがらくちんです

課題C(TA&takataka) 締切: 後述 [edit]

注意: この課題は,「TAチェック課題」と「takatakaチェック課題」のハイブリッドです.「takatakaチェック課題」については AProg/2015/ex00 を参照してください.それぞれの課題としての締め切りは次の通りです.

  • TAチェック課題としての締め切り: 今回の演習終了20分前
  • takatakaチェック課題としての締め切り: 来週木曜17時30分まで(提出法については AProg/2015/ex00参照)

画像の画素値を反転させる(例えば画素値の最大値が255なら,0を255に,255を0にする)関数をつくろう.次の仕様にしたがって紙(授業の際に配布されたもの)に書きなさい.

  • 関数名は negate とする
  • 引数は「2次元配列を表すもの」, 「その幅を表すもの」, 「高さを表すもの」, 「画素値の最大値を表すもの」の4つ(順序もこの通り)とする
    • 次の課題で,前の課題のプログラムにこの関数を組み込んだものを作成する.そのため,この関数の引数として2次元配列を渡す部分には,ex02b.c で #define している2つの定数を(必要に応じて)用いること.
  • 戻り値なし

課題D(TA) 締切: 次回演習開始直後 [edit]

課題B,Cの結果を組み合わせて,画素値反転のプログラムを完成させよう.

  1. ソースファイル名は ex02negate.c とする
    • check 課題Bのプログラムを cp コマンドでこの名前にコピーしたら簡単です(cf. Docs/4UNIXBeginners ).エディタを2つ開いてマウスでコピー&ペーストとかそういうださださなことはやめましょう.
  2. 関数 negate の定義は main の定義より下に書き,プロトタイプ宣言をつけること.

課題S(おまけ) 締切: 次回演習開始直後 [edit]

次のことをやりなさい.おまけ課題のチェックは高橋が担当しますので,直接高橋に声をかけてください.この課題をやるには AProg/omake が役に立つかもしれません.

  1. グレイスケール画像の形式としてPGMがあるように,カラー画像の形式としてPPM(Portable PixMap)というものがあります. PPMでは,画素値をRGB(赤緑青)3色の値で表現します. テキスト形式のPPM画像では画素値をどのように並べる約束になっているのか自分で調べなさい.
  2. その結果をもとに,課題Dのプログラムをベースとして,PPM画像を読み込んでRGBそれぞれの画素値を反転させた画像を出力するプログラムを作りなさい.
    • 画素値を格納する配列の作り方や関数の設計は何通りもありえます.

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-09-25 (金) 15:06:20 (784d)