応用プログラミング及び実習 2017年度 第4回 [edit]

注意 [edit]

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

ソースを分割して作成/コンパイルする方法を理解するために,次のことをやってみよう.

  1. 講義資料のmain01.cとhoge01.cを実際に作成し,コンパイル・リンクしてprog01という実行ファイルを作り,実行してみる
  2. Q1,Q2をやってみる
  3. main02.cを作成し,Q3をやってみる

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

分割コンパイルのさらなる学習のため,下記のプログラムを分割してみよう.

step1 [edit]

step2 [edit]

ソースを分割しよう.次の3つのファイルに分けること.

ex04b.c
  • 関数 main の定義を含むソースファイル
ex04pimax.c
  • そのほかの関数の定義を含むソースファイル
  • ダウンロードしてstep1で修正した ex04b.c をコピーして編集したらはやいでしょう
ex04pimax.h
  • ヘッダファイル.次のようにしよう
    #ifndef EX04PIMAX_H  // 複数回インクルードされたときのエラーを避けるための処置
    #define EX04PIMAX_H  // #ifndef の相方は↓にあり.詳しくは講義資料参照
    
    ここに必要なものを書く
    
    #endif  // ifndef の終わり
    

check 元のプログラムでは,関数 pipi で必要なため,

#include <math.h>

がありました.分割した時は,この文はどこに書くのがよいでしょう? 必要ない所も含めてあちこちに書いちゃっても当然プログラムは動きますが,理解を深めるため,最小限にするならどこに書けばよいか,を考えてみてください.

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

画像の画素値を格納した2次元配列を受け取り,その画像を上下反転させる処理を行う関数を紙に書きなさい.

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

これまでの成果を組み合わせて,「画像をファイルから読み込む → 「画素値反転して上下反転する」を101回繰り返す → 画像をファイルへ書き出す」という処理をするプログラムを作ろう.ただし,分割コンパイルの技を使い,次のようなファイル構成とすること.

ex04d.c
  • 関数 main のみを含むソースファイル.
  • 適当な場所で,ex04image.c で定義された関数を呼び出す
  • AProg/2017/ex03#kadaiD のプログラムをコピーして修正したら楽でしょう
ex04image.c
次の関数たちの定義を含むソースファイル
ex04image.h
ex04image.c に書かれたものを使うために必要な情報を書いたヘッダファイル.次のようなものを書くことになるでしょう
  • 関数のプロトタイプ宣言
  • check 画像の最大サイズを表す定数 MAX_WIDTH, MAX_HEIGHT は,ex04d.c と ex04image.c の両方で使いたくなります.したがって,ex04image.h の中でこれらを #define して,ex04d.c と ex04image.c はどちらも ex04image.h をインクルードするようにすればよいでしょう.
  • check readPGMHeader, readPGMBody, writePGM は,引数に FILE 構造体の変数へのポインタを指定しています.この FILE 構造体は,stdio.h の中で定義されています.したがって,プロトタイプ宣言を置くところで stdio.h をインクルードしておく必要があります.そうすると,ex04image.h の中で stdio.h をインクルードしておくのが楽かもしれません.
  • 以上のことから,ex04image.h は次のような内容になるでしょう → 本当にみます?

check 関数 readPGMHeader で isspace という関数を,関数 getnum で isdigit という関数を使っており,これらの関数のために ctype.h というヘッダファイルが必要です.ということは,AProg/2017/ex03#kadaiD のプログラム中の

#include <ctype.h>

と同じものを ex04image.c の中に書かないといけませんね.

課題S(おまけ) 締切: 次回実習終了まで [edit]

簡単なアニメーション(もどき)を作ってみよう

  1. ex04image.c に,次のような関数を追加する(もちろんPPMの方で作っても可)
    • 関数名 shiftH
    • 引数で渡された画像を右に1画素ずらす.ただし,右からはみ出た画素は左端に入れる
  2. 画像を読み込んだあと,shiftH を呼んではファイルに書き出すことを一定回数(画像の幅の分とか)繰り返すプログラムを作成する
    • ファイル名は,hoge000.pgm, hoge001.pgm, hoge002.pgm ... のように,「同じ文字列 + 同じ桁数で1ずつ増えていく数 + 拡張子」としておこう
  3. display コマンドでお馴染みの ImageMagick という画像処理ツール群に,animate というコマンドがあり,コマンドライン引数で指定されたファイルをパラパラ漫画にして表示してくれます.上記のファイル名の例では,
    $ animate hoge*.pgm   または   hoge???.pgm
    とすればおけ.画像のウィンドウをクリックしてメニューを選択すると,切り替えスピードを調節したりもできます.

ここからは課題の要件ではありませんが,もっと遊びたい人向けのアイデア


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS