【演習の注意事項】を良く読んで回答してください
【主な内容】
|
以下の例題と、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 (注)以下の画像はいずれも表示用に縮小しています。
|
元画像 |
平滑化した画像 |