include stdio h define GYOU 3 define RETSU

  • Slides: 24
Download presentation

   2次元配列要素の入出力 #include <stdio. h> #define GYOU 3 #define RETSU 5 main(){ int data[GYOU][RETSU], i,

   2次元配列要素の入出力 #include <stdio. h> #define GYOU 3 #define RETSU 5 main(){ int data[GYOU][RETSU], i, j; for(i = 0; i < GYOU; i++){ for(j = 0; j < RETSU; j++){ scanf("%d", &data[i][j]); } } for(i = 0; i < GYOU; i++){ for(j = 0; j < RETSU; j++){ printf("%d ", data[i][j]); } printf("\n"); } } Prog-0 2013 lec 12 -4 std 1 dc 1{s 1000000}1: . /a. out 0 1 2 3 4 5 2 3 4 5 6 std 1 dc 1{s 1000000}2: /home/course/prog 0/public_html/2013/lec/source/lec 12 -1. c Copyright (C) 1999 – 2013 by Programming-0 Group

  リダイレクションの例(2) リダイレクションでファイル中のデータの平均を計算する #include <stdio. h> #include <stdlib. h> std 1 dc 1{s 1000000}1: .

  リダイレクションの例(2) リダイレクションでファイル中のデータの平均を計算する #include <stdio. h> #include <stdlib. h> std 1 dc 1{s 1000000}1: . /a. out Control+dは入力の 1 2 3 4 5 終わりを示す 2 3 4 5 6 Control+d(コントロールキーとDキーを同時に押す) Average = 3. 500000 std 1 dc 1{s 1000000}2: . /a. out < lec 12 -2. data Average = 3. 500000 std 1 dc 1{s 1000000}3: cat lec 12 -2. data 1 2 3 4 5 6 std 1 dc 1{s 1000000}4: main() { int i, data, result, sum = 0; for(i = 0; ; i++){ result = scanf("%d", &data); if (result == EOF) break; if (result != 1) exit(1); sum += data; } printf("Average = %f\n", (double)sum/i); } /home/course/prog 0/public_html/2013/lec/source/lec 12 -2. c Prog-0 2013 Lec 12 -11 Copyright (C) 1999 – 2013 by Programming-0 Group

  左90度回転出力 最初にP 1と画素 数を出力 データ 出力 printf("P 1\n"); 縦横反転するので printf("%d %d\n", y_size, x_size); y,

  左90度回転出力 最初にP 1と画素 数を出力 データ 出力 printf("P 1\n"); 縦横反転するので printf("%d %d\n", y_size, x_size); y, xの順となる for (i = 0; i < x_size; i++){ for (j = 0; j < y_size; j++){ printf("%d ", img_data[j][x_size-1 -i]); } n個 printf("\n"); (y_size) 1行分終了で改行 左90度回転 } m個 (x_size) 左90度 [0][0] [0][1] [1][0] [1][1] [2][0] [3][0] [0][m-2] [0][m-1] [n-1][0] [n-1][1] [n-1][m-2][n-1][m-1] [2][m-1] [3][m-1] n個 (y_size) m個 [0][m-1] [1][m-1] [n-2][m-1][n-1][m-1] [0][m-2] [1][m-2] [n-1][m-2] [0][m-3] [n-1][m-3] [0][m-4] [n-1][m-4] (x_size) /home/course/prog 0/public_html/2013/lec/source/lec 12 -rl. c Prog-0 2013 Lec 12 -17 [0][0] [1][0] [n-2][0] [n-1][0] Copyright (C) 1999 – 2013 by Programming-0 Group

実行結果 元データの表示 実行ファイルにrotlと std 1 dc 1{s 1000000}1: display lec 12 -1. pbm &

実行結果 元データの表示 実行ファイルにrotlと std 1 dc 1{s 1000000}1: display lec 12 -1. pbm & 言う名前を付ける std 1 dc 1{s 1000000}2: gcc lec 12 -rl. c -o rotl std 1 dc 1{s 1000000}3: . /rotl < lec 12 -1. pbm | display & std 1 dc 1{s 1000000}4: 元画像 Prog-0 2013 Lec 12 -18 元画像ファイルを リダイレクトで入力 結果をdisplay コマンド にパイプ Copyright (C) 1999 – 2013 by Programming-0 Group

  白黒反転プログラム 最初にP 1とx, yの画 素数を出力 データ 出力 printf("P 1\n"); printf("%d %d\n", x_size, y_size); for

  白黒反転プログラム 最初にP 1とx, yの画 素数を出力 データ 出力 printf("P 1\n"); printf("%d %d\n", x_size, y_size); for (i = 0; i < y_size; i++){ for (j = 0; j < x_size; j++){ if(img_data[i][j] == BLACK) printf("%d ", WHITE); else printf("%d ", BLACK); } 白なら黒を出力 printf("\n"); } 黒なら白を出力 /home/course/prog 0/public_html/2013/lec/source/lec 12 -iv. c その他以下のプログラムソースがある(注:演習問題の関係で、公開していないものがあります) 右90度回転 左右反転 上下反転 辺縁検出 Prog-0 2013 Lec 12 -19 /home/course/prog 0/public_html/2013/lec/source/lec 12 -rr. c /home/course/prog 0/public_html/2013/lec/source/lec 12 -lr. c /home/course/prog 0/public_html/2013/lec/source/lec 12 -ud. c /home/course/prog 0/public_html/2013/lec/source/lec 12 -eg. c Copyright (C) 1999 – 2013 by Programming-0 Group

実行結果 左90度回転の後 白黒反転 std 1 dc 1{s 1000000}1: gcc lec 12 -iv. c -o

実行結果 左90度回転の後 白黒反転 std 1 dc 1{s 1000000}1: gcc lec 12 -iv. c -o invrt std 1 dc 1{s 1000000}2: . /rotl < lec 12 -1. pbm |. /invrt | display & std 1 dc 1{s 1000000}3: ファイルからリダイレクト 元画像 Prog-0 2013 Lec 12 -20 このようにパ イプで処理を どんどん繋 いで行く事が 出来る Copyright (C) 1999 – 2013 by Programming-0 Group

  ノイズ除去プログラム printf("P 1\n"); printf("%d %d\n", x_size, y_size); for (i = 0; i < y_size;

  ノイズ除去プログラム printf("P 1\n"); printf("%d %d\n", x_size, y_size); for (i = 0; i < y_size; i++){ 行の先頭は隣がないのでそのまま出力 printf("%d ", img_data[i][0]); 横方向の両端を除いた点に for (j = 1; j < x_size-1; j++){ 関して処理を行う if(img_data[i][j-1] == WHITE && img_data[i][j] == BLACK && img_data[i][j+1] == WHITE){ 白黒白なら白を出力 printf("%d ", WHITE); } else if(img_data[i][j-1] == BLACK && img_data[i][j] == WHITE && img_data[i][j+1] == BLACK){ printf("%d ", BLACK); 黒白黒なら黒を出力 } else printf("%d ", img_data[i][j]); 2つのケース以外の場合はそのまま出力 } 行の最後は隣がないのでそのまま出力 printf("%d ", img_data[i][x_size-1]); printf("\n"); } /home/course/prog 0/public_html/2013/lec/source/lec 12 -nc. c Prog-0 2013 Lec 12 -22 Copyright (C) 1999 – 2013 by Programming-0 Group

実行結果 結果を display コマンドに パイプ std 1 dc 1{s 1000000}1: gcc lec 12 -nc.

実行結果 結果を display コマンドに パイプ std 1 dc 1{s 1000000}1: gcc lec 12 -nc. c -o hncut std 1 dc 1{s 1000000}2: . /hncut < lec 12 -2. pbm | display & std 1 dc 1{s 1000000}3: ファイルからリダイレクト 元画像 細かい点状のノイズを加えた Prog-0 2013 Lec 12 -23 ノイズは減ったが一部細い線が欠落した Copyright (C) 1999 – 2013 by Programming-0 Group