【演習の注意事項】を良く読んで回答してください
【主な内容】
|
以下の例題と、3つのレベル (初級レベル, 中級レベル, 上級レベル) の 課題すべてに回答しなさい。各々の課題毎にファイルを作成しなさい。
今回の課題はテキスト(文書)ファイルで提出するものと C言語のプログラムファイルで提出するものがあります。 前者は".txt"、後者は".c" という拡張子をつけて下さい。 各課題にはファイル名が指定してあるので、その指示にしたがって下さい。
なお、実行例やコマンドなどで赤色の字はキーボードから 入力したもの、深緑の字はコンピュータからの表示を示しています。 また、%はプロンプト (皆さんの環境ではstd1dc1{s1160000}1:等に相当する) を示しており、皆さんが入力するのはその次の文字からになります。
また、今回はパイプを使う関係上、実行ファイル名をa.out
ではなく、個別に指定してある場合もあります。その際は以下のように
コンパイルオプション -o を使用して下さい。
% gcc ソースファイル名.c -o 実行ファイル名
% cp /home/course/prog0/public_html/2008/lec/source/lec12-1.c . % cp /home/course/prog0/public_html/2008/lec/source/lec12-1.data .なお、プログラムへの入力は入力リダイレクションでlec12-1.dataを使用し, 出力結果を出力リダイレクションでファイル ex12a3.txt に保存すること。
/* * gflpud.c * * pgm形式の画像データを受け取って,上下反転する。 * * 終了コード * 0 : 正常終了 * 1 : 入力データの形式がおかしい * 2 : 入力データの画素数または階調が範囲外 * 3 : 入力データがおかしいかデータが揃わないうちにEOFになった * 4 : 入力データの画素の値が範囲外 */ #include <stdio.h> #include <stdlib.h> #define MSIZE 800 main() { int dat[MSIZE][MSIZE]; int i, j, width, height, maxval; /* 入力 */ /* ファイル形式のチェック */ /* この部分はプログラミング入門の範囲を越えているので、このまま使って下さい。*/ if (getchar() != 'P' || getchar() != '2'){ fprintf(stderr, "データの形式が違います\n"); exit(1); } /* x,yそれぞれの画素数を得る */ scanf("%d %d", &width, &height); /* Maxval(白の値)を得る */ scanf("%d",&maxval); /* 画素数が範囲外の場合 */ if (width < 1 || height < 1 || width > MSIZE || height > MSIZE){ fprintf(stderr, "設定サイズが範囲外です。\n"); exit(2); } /* Maxvalが範囲外 */ if (maxval < 1 || maxval >= 65536){ fprintf(stderr, "階調が範囲外です\n"); exit(2); } /* 実際のデータ入力 */ for (i = 0; i < height; i++){ for (j = 0; j < width; j++){ /* scanf入力データがおかしいかEOFになった場合 */ if(scanf("%d",&dat[i][j]) != 1){ fprintf(stderr, "データ入力に異常があります\n"); exit(3); } /* データが範囲外 */ if(dat[i][j] < 0 || dat[i][j] > maxval){ fprintf(stderr, "データが異常でした\n"); exit(4); } } } /* これより上はどのプログラムもほぼ同じ */ /* 出力 */ /* 最初にP2とx,yの画素数、Maxvalを出力 */ printf("P2\n"); printf("%d %d\n", width, height); printf("%d\n", maxval); /* 実際のデータ出力 */ for (i = 0; i < height; i++){ for (j = 0; j < width; j++){ printf("%2d ",dat[________][________]); } printf("\n"); } }
[実行例1] % ./gflpud < feep64.pgm P2 24 7 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 29 29 29 29 0 0 46 46 46 46 0 0 63 0 0 0 0 0 12 0 0 0 0 0 29 0 0 0 0 0 46 0 0 0 0 0 63 0 0 0 0 0 12 12 12 0 0 0 29 29 29 0 0 0 46 46 46 0 0 0 63 63 63 63 0 0 12 0 0 0 0 0 29 0 0 0 0 0 46 0 0 0 0 0 63 0 0 63 0 0 12 12 12 12 0 0 29 29 29 29 0 0 46 46 46 46 0 0 63 63 63 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [実行例2] % ./gflpud < feep64.pgm | display(注)表示用に拡大しています。
[実行例1] % ./grotr < feep64.pgm P2 7 24 (←縦、横が反対になることに注意!) 63 0 0 0 0 0 0 0 0 12 12 12 12 12 0 0 0 0 12 0 12 0 0 0 0 12 0 12 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 29 29 29 29 0 0 29 0 29 0 29 0 0 29 0 29 0 29 0 0 29 0 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 46 46 46 46 0 0 46 0 46 0 46 0 0 46 0 46 0 46 0 0 46 0 0 0 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 63 63 63 63 0 0 0 0 63 0 63 0 0 0 0 63 0 63 0 0 0 0 63 63 63 0 0 0 0 0 0 0 0 [実行例2] % ./grotr < neko64.pgm | display![]()
[実行例1] % ./ginv < feep64.pgm P2 24 7 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 51 51 51 51 63 63 34 34 34 34 63 63 17 17 17 17 63 63 0 0 0 0 63 63 51 63 63 63 63 63 34 63 63 63 63 63 17 63 63 63 63 63 0 63 63 0 63 63 51 51 51 63 63 63 34 34 34 63 63 63 17 17 17 63 63 63 0 0 0 0 63 63 51 63 63 63 63 63 34 63 63 63 63 63 17 63 63 63 63 63 0 63 63 63 63 63 51 63 63 63 63 63 34 34 34 34 63 63 17 17 17 17 63 63 0 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 [実行例2] % ./ginv < ajisai64.pgm | display(注)表示用に縮小しています。
[実行例1]
% ./gbin < feep64.pgm P2 24 7 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 63 63 63 0 0 63 63 63 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 0 0 0 0 0 63 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 63 63 0 0 0 63 63 63 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 0 0 0 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 63 63 63 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [実行例2] % ./gbin < nakaniwa64.pgm | display(注)表示用に縮小しています。
[実行例1] % ./gcscale < feep64.pgm P2 24 7 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 18 18 18 0 0 43 43 43 43 0 0 63 63 63 63 0 0 63 63 63 63 0 0 18 0 0 0 0 0 43 0 0 0 0 0 63 0 0 0 0 0 63 0 0 63 0 0 18 18 18 0 0 0 43 43 43 0 0 0 63 63 63 0 0 0 63 63 63 63 0 0 18 0 0 0 0 0 43 0 0 0 0 0 63 0 0 0 0 0 63 0 0 0 0 0 18 0 0 0 0 0 43 43 43 43 0 0 63 63 63 63 0 0 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [実行例2] % ./gcscale < nakaniwa64.pgm | display (注)以下の画像はいずれも表示用に縮小しています。
元画像 |
輝度を上げた画像 |
[実行例1](横3画素の平均による平滑化) % ./gsmooth < feep64.pgm P2 24 7 63 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 12 12 8 4 9 19 29 29 19 9 15 30 46 46 30 15 21 42 63 63 42 0 0 4 4 0 0 0 9 9 9 0 0 0 15 15 15 0 0 0 21 21 21 21 21 0 0 8 12 8 4 0 9 19 29 19 9 0 15 30 46 30 15 0 21 42 63 63 42 0 0 4 4 0 0 0 9 9 9 0 0 0 15 15 15 0 0 0 21 21 21 0 0 0 0 4 4 0 0 0 9 19 29 29 19 9 15 30 46 46 30 15 21 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [実行例2](3x3画素による平滑化) % ./gsmooth < nakaniwa64.pgm | display (注)以下の画像はいずれも表示用に縮小しています。
元画像 |
平滑化した画像 |