untitled

Similar documents
Microsoft PowerPoint - 第3回目.ppt [互換モード]

2006年10月5日(木)実施

gengo1-12

gengo1-12

Taro-リストⅠ(公開版).jtd

Prog1_12th

ポインタ変数

Microsoft Word - Cプログラミング演習(9)

Taro-ファイル処理(公開版).jtd

gengo1-12

PowerPoint プレゼンテーション

プログラミングI第10回

memo

情報処理演習 B8クラス

untitled

PowerPoint Presentation

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

slide5.pptx

PowerPoint Presentation

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

memo

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

ポインタ変数

gengo1-6

計算機プログラミング

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

フィルタとは

Microsoft Word - Cプログラミング演習(10)

演算増幅器

PowerPoint Presentation

Microsoft Word - no15.docx

kiso2-09.key

Taro-リストⅢ(公開版).jtd

ポインタ変数

Microsoft PowerPoint - program.ppt [互換モード]

Taro-スタック(公開版).jtd

※ ポイント ※

プログラミング実習I

Microsoft Word - Cプログラミング演習(1)_2012

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

ファイル入出力

ファイル入出力

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - prog04.ppt

基礎プログラミング2015

ポインタ変数

Microsoft Word - Cプログラミング演習(3)

Microsoft Word - 3new.doc

第1回 プログラミング演習3 センサーアプリケーション

Microsoft PowerPoint pptx

3.Cygwin で日本語を使いたい Cygwin で以下のコマンドを実行すると それ以降 メッセージが日本語になります export LANG=ja_JP.UTF-8 これは 文字コードを日本語の UTF-8 に設定することを意味しています UTF-8 は Cygwin で標準の文字コードで, 多

講習No.9

プログラミングI第6回

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

Cプログラミング1(再) 第2回

C 言語固有の命令で全部で32 個 の関数C 言語第 1 回 C 言語って?( シラバス 1 2 回目 ) 関数型言語 コンピュータに実行してもらう命令はすべて関数の中に記述されている 関数がプロ グラム

Taro-再帰関数Ⅱ(公開版).jtd

プログラミング基礎

C言語入門

講習No.12

プログラミング基礎

Prog1_6th

第 3 回情報基礎演習 UNIX / Linux: ファイルシステム シェルを理解しよう! 谷口貴志 Panda に login し 情報基礎演習クラスの VDI から Ubuntu に接続し Linux に login した後, 左 上の Activity 端末のアイオン をクリック 端末 を立ち

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - 14th.ppt [互換モード]

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

情報処理概論(第二日目)

プレポスト【解説】

slide4.pptx

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

プログラミング演習3 - Cプログラミング -

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - prog06.ppt

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - 10Com2.ppt

Microsoft PowerPoint - class04.ppt

PowerPoint Presentation

C言語によるアルゴリズムとデータ構造

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

Prog1_10th

kiso2-06.key

I ASCII ( ) NUL 16 DLE SP P p 1 SOH 17 DC1! 1 A Q a q STX 2 18 DC2 " 2 B R b

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

Taro-再帰関数Ⅲ(公開版).jtd

基本的な利用法

物質工学科 田中晋

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

Microsoft Word - no103.docx

:30 12:00 I. I VI II. III. IV. a d V. VI

第2回講義:まとめ

PowerPoint プレゼンテーション

ポインタ変数

Microsoft Word - no11.docx

フローチャートの書き方

シェルプログラミング コマンドをパイプでつなげるだけでは済まないような ある程度まとまった処理を複数のコマンドを制御構文を用いたりしてファイルとしたものを ( シェル ) スクリプトと呼ぶ シェルプログラム バッチなどともいう.bash_profile もシェルスクリプトなので このファイルを解読し

Taro-最大値探索法の開発(公開版

練習&演習問題

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Transcription:

プログラミング入門第 12 回講義 リダイレクトとパイプ ファイルリダイレクションパイプ応用例 マークのあるサンプルプログラムは /home/course/prog0/public_html/2006/lec/source/ 下に置いてありますから 各自自分のディレクトリにコピーして コンパイル 実行してみてください Prog-0 2006 Lec 12-1

ファイル (p.326) ファイル : あらゆる入出力データ 装置を論理化する概念 ( 実際のデータ記録装置, 記録方式, 記録形式等に依存しない処理環境の実現 ) C プログラム ファイルに表示 ファイルに印刷 ファイルから入力 ファイルに書込み 標準手続 ファイル処理 表示表示 印刷印刷 入力入力 読書き 実際の装置 Prog-0 2006 Lec 12-2

ファイル もし ファイルの概念が無かったら!? 表示 読書き 読書き それぞれの入出力装置の違いを別々にプログラムで記述することが必要!! 印刷 入力 読書き Prog-0 2006 Lec 12-3

Prog-0 2006 Lec 12-4 C プログラムの流れ C プログラムの流れ scanf(),printf() はそれぞれ標準入力ファイル ( キーボード ) 標準出力ファイル ( ディスプレイ ) に対応 C プログラム標準入力ファイル標準出力ファイル標準エラー出力ファイルLec12-12 参照

標準入出力とリダイレクション (p.365) リダイレクションとは 標準入出力ファイルの切り替えをプログラムの外で行う機能 リダイレクションの例 キーボード入力 ディスク入力に変更 画面表示 ディスク出力に変更 Prog-0 2006 Lec 12-5

リダイレクション (p.20) C プログラム 装置の切り替え 標準入力操作命令 標準出力操作命令 Prog-0 2006 Lec 12-6

標準入出力のリダイレクションの書式 実行ファイル名 入力ファイル名 例 : プログラム./a.out の標準入力を test.dat から読み込む./a.out test.dat 実行ファイル名 > 出力ファイル名実行ファイル名 >> 出力ファイル名 Prog-0 2006 Lec 12-7 例 :./a.out の標準出力を test.dat に書き込む./a.out > test.dat./a.out >> test.dat 先頭から書込み 末尾に追加書き

リダイレクションの例 (1) 例 1. ファイル一覧をファイル list.txt に書込む ls > list.txt 例 2. list.txt の行, 単語, 文字数を表示する wc list.txt 例 3. list.txt から文字列 file を含む行だけ file.txt に書き込む grep file list.txt > file.txt Prog-0 2006 Lec 12-8

リダイレクションの例 (2) リダイレクションでファイル中のデータの平均を計算する std1dc1{s10000001: #include #include stdio.h>./a.out./a.out stdio.h> 1 #include #include stdlib.h> 2 3 4 5 stdlib.h> 2 3 4 5 6 Control+Dは入力 Control+D の終わりを示す main() Control+D main() Average { Average 3.500000 3.500000 std1dc1{s10000002: int int i, i, data, data, result, result, sum sum./a.out./a.out lec12-1.data lec12-1.data Average (i (i ; ; i++){ Average 3.500000 3.500000 i++){ std1dc1{s10000003: result result scanf("%d",&data); cat cat lec12-1.data lec12-1.data 1 if if (result (result EOF) EOF) break; 2 3 4 5 break; 2 if if (result (result!! 1) 1) exit(1); 3 4 5 6 exit(1); std1dc1{s10000004: sum sum + + data; data; printf("average printf("average %f\n",(float)sum/i); Prog-0 2006 Lec 12-9 /home/course/prog0/public_html/2006/lec/source/lec12-1.c

標準入出力とパイプ (p.21) パイプとは二つのプログラムの標準出力と標準入力を結合する機能コマンド間に を挟むパイプの例 cat ex1.c grep 'printf' cat の出力が grep の入力となる プログラム cat ファイル出力処理 標準出力 パイプ 標準入力 プログラム grep ファイル入力処理 Prog-0 2006 Lec 12-10

パイプの例 例 1. ディレクトリ内のファイルをファイル容量の大きい順に表示 ls -l sort -k 4,4 -nr 例 2. そのディレクトリ内のファイルの数を数える ls wc -l 例 3. result.txt(id と点数のペアデータ ) から得点の高い順に 10 人表示する cat result.txt sort -k 2,2 -nr head -10 Prog-0 2006 Lec 12-11

標準エラー出力 (p.47,349) プログラムの出力をリダイレクトやパイプする場合に エラーメッセージを標準出力に出力していると エラーメッセージも画面に表示されず リダイレクトやパイプの対象になってしまう このためエラー出力用の標準ファイルを別に設け ( 標準エラー出力と呼ぶ ) リダイレクト パイプの場合も画面にエラーメッセージを表示するようにしている 標準エラー出力への出力は以下のようにして行う fprintf(stderr," 書式 ", ", 変数リスト ); ); 例 :fprintf(stderr," 入力した値がおかしい \n"); Prog-0 2006 Lec 12-12

プログラム内の標準入出力と標準エラー (p.47) #include stdio.h> main() { scanf( ); ); printf( ); ); fprintf(stderr, ); この中で定義 標準入力から入力標準入力から入力 標準出力ヘ出力標準出力ヘ出力 標準エラーヘ出力標準エラーヘ出力 Prog-0 2006 Lec 12-13

リダイレクト パイプの例簡単な画像処理 簡単な画像処理画画像を標準入力から入力入力された画像を処理 ( 例えば左に90 度回転 ) 画像を標準出力から出力エラー情報は標準エラー出力により表示 標準入力 標準像出力処標準エラー出力理エラー Prog-0 2006 Lec 12-14

簡単な画像形式 Plain PBM(Portable Bitmap) 形式 必ず P1 (magic number) P1 P1 320 160 画像の大きさ : 横縦 ( 画素数 ) 0 0 0 0 1 0 1 0... 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1... 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0... 1 1 0 0 0 1 0...... 0 1 1 0 1 1 0 1... 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0... 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1... 0 0 1 0 1 0 1 横 縦の数の画素データ ( 左上から横に ) 1: 黒 0: 白 データ間は空白で区切られている ( 本当は無くても良い ) 横 (x) 軸縦(y) 軸原点 Prog-0 2006 Lec 12-15 1 行は 70 文字以下今回はあまり気にしない

データ入力部分 ( 共通部分 ) #include #include stdio.h> stdio.h> #include #include stdlib.h> stdlib.h> #define #define MAX_X MAX_X 800 800 #define #define MAX_Y MAX_Y 800 800 #define #define BLACK BLACK 1 1 #define #define WHITE WHITE 0 0 画素データ読み込み Prog-0 2006 Lec 12-16 取り扱える画像の最大の大きさ ( 縦 横 ) 最初に P1 と書いていないものは デ画像用二次元配列 main(){ ータ形式が違う main(){ int int img_data[max_y][max_x]; この部分はプログラミング入門では扱わ img_data[max_y][max_x]; int int i, i, j, j, x_size, x_size, y_size; ない文字型を使用しているので 今のと y_size; ころは呪文だと思っておいてください ( 詳しくはP67,p139 参照 ) if if (getchar() (getchar()!! 'P' 'P' getchar() getchar()!! '1'){ '1'){ fprintf(stderr, fprintf(stderr, " " データの形式が違いますデータの形式が違います \n"); \n"); exit(1); exit(1); x,yそれぞれの画素数を得る scanf("%d", scanf("%d", &x_size); &x_size); 画素数が多すぎる場合 scanf("%d", scanf("%d", &y_size); &y_size); if if (x_size (x_size > > MAX_X MAX_X y_size y_size > > MAX_Y){ MAX_Y){ fprintf(stderr, fprintf(stderr, " " データが大きすぎますデータが大きすぎます \n"); エラーメッセージは全て標 \n"); exit(2); 準エラー出力へ exit(2); scanf 入力データがおかしいか (i (i i i y_size; y_size; i++){ i++){ 個数より早くEOFになった場合 (j (j j j x_size; x_size; j++){ j++){ if(scanf("%d",&img_data[i][j]) if(scanf("%d",&img_data[i][j])!! 1){ 1){ fprintf(stderr, fprintf(stderr, " " データ入力に異常がありますデータ入力に異常があります \n"); \n"); exit(3); データが白黒ではない場合 exit(3); if(img_data[i][j] if(img_data[i][j]!! WHITE WHITE && && img_data[i][j] img_data[i][j]!! BLACK){ BLACK){ fprintf(stderr, fprintf(stderr, " " データが異常でしたデータが異常でした \n"); \n"); exit(4); exit(4); 各エラーコードに対応したサンプルデータが /home/course/prog0/public_html/2006/lec/source/lec12-err{1,2,3a,3b,4.pbm にあるので試してみるとよい

データ出力 左 90 度回転出力 最初にP1と画素数を出力 printf("p1\n"); printf("p1\n"); 縦横反転するので %d\n", %d\n", y_size, y_size, x_size); x_size); y,xの順となる (i (i i i x_size; x_size; i++){ i++){ (j (j j j y_size; y_size; j++){ j++){ ",img_data[j][x_size-1-i]); ",img_data[j][x_size-1-i]); n 個 printf("\n"); printf("\n"); 1 行分終了で改行左 90 度回転 (y_size) [0][0] [0][1] [0][m-2] [0][m-1] [1][0] [1][1] [1][m-1] [2][0] [2][m-1] [3][0] [3][m-1] [n-1][0] [n-1][1] m 個 (x_size) 左 90 度 [n-1][m-2] [n-1][m-1] n 個 (y_size) m 個 (x_size) [0][m-1] [1][m-1] [0][m-2] [1][m-2] [0][m-3] [0][m-4] [n-2][m-1] [n-1][m-1] [n-1][m-2] [n-1][m-3] [n-1][m-4] /home/course/prog0/public_html/2006/lec/source/lec12-rl.c /home/course/prog0/public_html/2006/lec/source/lec12-rl.c Prog-0 2006 Lec 12-17 [0][0] [1][0] [n-2][0] [n-1][0]

実行結果 元データの表示 結果をdisplayコマンドに std1dc1{s10000001: display lec12-1.pbm & パイプ std1dc1{s10000002: gcc gcc lec12-rl.c -o -o rotl rotl std1dc1{s10000003:./rotl lec12-1.pbm display & std1dc1{s10000004: 元画像 元画像ファイルをリダイレクトで入力 Prog-0 2006 Lec 12-18

白黒反転プログラム データ出力 最初にP1とx,yの画素数を出力 printf("p1\n"); printf("p1\n"); %d\n", %d\n", x_size, x_size, y_size); y_size); (i (i i i y_size; y_size; i++){ i++){ (j (j j j x_size; x_size; j++){ j++){ if(img_data[i][j] if(img_data[i][j] BLACK) BLACK) ",WHITE); ",WHITE); else else ",BLACK); ",BLACK); printf("\n"); 白なら黒を出力 printf("\n"); 黒なら白を出力 /home/course/prog0/public_html/2006/lec/source/lec12-iv.c その他以下のプログラムソースがある ( 演習問題の関係で * がついているものは公開していない ) 右 90 度回転 * 左右反転上下反転 * 辺縁検出 /home/course/prog0/public_html/2006/lec/source/lec12-rr.c /home/course/prog0/public_html/2006/lec/source/lec12-lr.c /home/course/prog0/public_html/2006/lec/source/lec12-ud.c /home/course/prog0/public_html/2006/lec/source/lec12-eg.c Prog-0 2006 Lec 12-19

実行結果 左 90 度回転の後白黒反転 std1dc1{s10000001: gcc gcc lec12-iv.c -o -o invrt invrt std1dc1{s10000002:./rotl lec12-1.pbm./invrt display & std1dc1{s10000003: 元画像 ファイルからリダイレクト このようにパイプで処理をどんどん繋いで行く事が出来る Prog-0 2006 Lec 12-20

ノイズ除去 意味のある画像だと ぽつんと点があることはあまりないそこで ある点を見た時自分が黒点で 両隣の点が白い場合自分が白点で 両隣の点が黒い場合は ノイズ 雑音 ( この場合は画像中のゴミ ) と認識して両隣の色で置き換えることにする つまり : 例えば以下のような感じで画像が改善される Prog-0 2006 Lec 12-21

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

実行結果 結果をdisplayコマンドにパイプ std1dc1{s10000001: gcc gcc lec12-nc.c -o -o hncut hncut std1dc1{s10000002:./hncut lec12-2.pbm display & std1dc1{s10000003: 元画像 ファイルからリダイレクト Prog-0 2006 Lec 12-23 細かい点状のノイズを加えた ノイズは減ったが一部細い線が欠落した

パイプとリダイレクションのまとめ パイプのまとめ 標準入力の切り替え コマンドの前に 例 :ls wc -l 標準出力の切り替え コマンドの後に 例 :cat hoge.txt head リダイレクションまとめ 標準入力の切り替え 例 :./a.out in.txt 標準出力の切り替え ( ファイル書き換え ) > 例 :ls l > out.txt 標準出力の切り替え ( ファイルに追加 ) >> 例 :ls l >> out.txt Prog-0 2006 Lec 12-24