Top / AProg / 2014 / ex03

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

注意 [edit]

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

課題A(self) 完成目標: 課題Bにとりかかる前 [edit]

演習第1回の課題C?のプログラムを元にして,次のようなプログラムを作成しなさい.

  • ソースファイル名は ex03x999.c とする
  • データ件数とデータを標準入力から受け取るかわりにファイルから読み込むようにする
    • したがって,キー入力をうながす「何個?」「0番目:」のようなメッセージは出力をやめよう
    • 読み込むテキストファイルは data.txt という名前とし,データ件数とデータは適当に自分で決めること
    • ファイルを開く際のエラー処理を行うこと
  • 出力先は標準出力とする
  • check 次の箇所がソースプログラム中のどこか答えなさい
    • ファイルを開く所
    • ファイルを閉じる所
    • ファイルの内容を読み込んでいる所
    • ファイルポインタの変数を宣言している所
  • check 正しく動くことを確認したら,data.txt の内容を変更して再度実行してみよう
  • check 次のようにわざと間違えて動作を確認しよう
    • 開くファイルの名前を間違えてみる
    • data.txt に記したデータ件数を実際の数より少なくしてみる(現在のプログラムだと,逆に多い方に間違えると,入力を待ったままプログラムが終了しなくなるでしょう)

課題B(TA) 締切: 今回の演習終了20分前 [edit]

演習第2回の課題C?のプログラムを元にして,次のようなプログラムを作成しなさい.

  • ソースファイル名は ex03fliph.c とする
  • 画像はファイルから読みファイルに書くようにする.入力は uni3.pgm とし,出力のファイル名は自分で適当に決めること.ファイルを開く際のエラー処理も忘れずに
  • 画素値を反転させるかわりに画像を左右に反転させる.反転処理のための関数を定義してその中で左右の反転を行うこと
  • 演習第2回のおまけ課題ができた人は,PPM画像を入出力するプログラムとしても構わない

課題C(TA) 締切と点数: ↓参照 [edit]

次回演習開始後30分以内なら通常の課題2つ分の点数,それ以降次々回演習開始直後までなら通常の課題と同じ点数.

step0 [edit]

まず次のようにして,自分の手元に ex03c-sample という実行ファイルをコピーし,それを実行して動作を観察してみよう.

$ cd aprog2014
$ cp /home/sample/takataka/aprog2012/ex03c-sample     .     ←ピリオド
  • 入力ファイル名を間違えるとどうなる?
  • 処理の選択時に1,2,3,4以外のものを入力するとどうなる?

このプログラムと同じ動作をするプログラムを作ろう.ただし,

  • ソースファイル名は ex03c.c とすること
  • 処理の分岐にはif-else(またはswitch文)を用いること.
  • 3つの反転処理はそれぞれ個別に関数を作ってその中で行なうようにすること.また,それぞれの関数内では画素値をいじる処理だけ行う(そこで入出力はしない)ようにしよう
    • 2014-10-06 追記:これら3つの関数内部では,引数で受け取る二次元配列以外に作業用の二次元配列を宣言したりしないようにしてください.

プログラムは,一気に全てを完成させてコンパイル,というような作り方をするものでは決してない.以下のように,ソースを書く,コンパイル,実行,という段階を何度も何度も繰り返しながら完成させていくものである.

  1. 一部の機能だけ実現するソースプログラムを作る
  2. コンパイルする(エラーがあれば修正する)
  3. 実行して動作確認する(おかしなところがあれば修正する)
  4. うまくいったら,機能を追加して同じ作業を繰り返す

以下にプログラミングstepの例を示すので,どこから手をつけてよいのかわからない,という人は順番に実行していくこと. 以下のstepを踏まないで自力で作れる人は,従わなくても構わない.

★ 余裕のある人向け

  • if-elseによる条件分岐を楽勝で書ける人は,switch文を使ってみるとよいでしょう
  • PPM画像を入出力するプログラムとしても構わない

step1 [edit]

ファイル名を受け取る部分だけを,課題とは別のプログラムとして作ってみよう(ソースファイル名は自分で決めたらよい.例: ex03-step1.c ). ファイル入出力などのことは横においといて,キーボードから入力された文字列を単にprintf()するだけのプログラムを作ろう.

キーボードから入力された文字列をchar型の配列に格納する方法は,何通りもあります. どうやったらいいか自分で調べてみよう.

#include <stdio.h>

#define FNAMELENGTH 100

int main(void)
{
  char fname[FNAMELENGTH];   // 文字列用の配列

  printf("ファイル名を入力してね: ");

  ?????

  printf("ファイル名 %s\n", fname);

  return 0;
}

実行結果の例

$ ./ex03c-step1
ファイル名を入力してね: hogeratta.txt
ファイル名 hogeratta.txt

step2 [edit]

step1の結果と課題Bのプログラムを組み合わせて,入力と出力のファイル名をキーボードから入力するようにした新しいプログラムを作ろう(ソースファイル名は自分で決めたらよい.例: ex03-step2.c).

step1の結果をfopen()とどう組み合わせるかについては,C言語の本などから参考例がないか探してみたらよいだろう.

キーボードから入力したファイル名を使って動くものができたら,入力されたファイル名が正しくない(fopen()の戻り値が…)ときは入力をやり直させるように改良しよう.

step3 [edit]

入力された値に応じて処理を変えるプログラムを作ってみよう(step1,2のプログラムとは別に作るのがよいかもしれない). 例えば,キーボードから数を入力させて,次のようなことをするプログラムにしてみるとよい.

  • 数を入力してもらう
  • 1だったら「ほげほげ」と出力
  • 2だったら「ふがふが」と出力
  • それ以外だったら数の入力からやり直してもらう

step4 [edit]

step1,2,3の成果をもとに課題のプログラムを作ってみよう.

課題S & T(おまけ) [edit]

右のリンク先参照 AProg/2014/ex03ST?


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-21 (火) 10:29:44 (1126d)