Microsoft PowerPoint - kougi6.ppt

Similar documents
Microsoft PowerPoint - kougi7.ppt

V

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - kougi8.ppt

Microsoft PowerPoint - kougi4.ppt

cp-7. 配列

Microsoft PowerPoint - kougi2.ppt

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

Microsoft PowerPoint - kougi9.ppt

ファイル入出力

C言語講座 ~ファイル入出力編~

ファイル入出力

情報処理演習 B8クラス

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

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - guidance.ppt

Prog1_12th

2006年10月5日(木)実施

※ ポイント ※

演算増幅器

ゲームエンジンの構成要素

gengo1-12

PowerPoint Presentation

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

gengo1-12

PowerPoint プレゼンテーション

gengo1-12

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

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

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

プログラミング基礎

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog04.ppt

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

memo

計算機プログラミング

02: 変数と標準入出力

PowerPoint Presentation

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

PowerPoint プレゼンテーション

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

Microsoft Word - 3new.doc

02: 変数と標準入出力

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

Microsoft Word - no204.docx

テキスト処理第 2 回 田中哲産業技術総合研究所情報技術研究部門 akira/textprocess/

slide4.pptx

ポインタ変数

PowerPoint Presentation

Microsoft PowerPoint - kougi10.ppt

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft Word - no103.docx

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

ポインタ変数

PowerPoint プレゼンテーション

Microsoft PowerPoint - lec4.ppt

ポインタ変数

練習&演習問題

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

Microsoft PowerPoint - prog06.ppt

Microsoft Word - no15.docx

Microsoft Word - cpro_m_13.doc

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

memo

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

Microsoft PowerPoint pptx

Microsoft PowerPoint pptx

データ構造

ガイダンス

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

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

Prog1_10th

02: 変数と標準入出力

数値計算

物質工学科 田中晋

02: 変数と標準入出力

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

スライド タイトルなし

memo

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

第9回 配列(array)型の変数

Microsoft PowerPoint - 5Chap15.ppt

数値計算

DVIOUT

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

講習No.12

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

PowerPoint プレゼンテーション - 物理学情報処理演習

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

データ構造

02: 変数と標準入出力

Microsoft PowerPoint - while.ppt

JavaプログラミングⅠ

Prog1_15th

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

Microsoft PowerPoint - bp02.ppt

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

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

Transcription:

C プログラミング演習 第 6 回ファイル処理と配列 1

ファイル処理 2

ファイル読み込み ファイル プログラム ファイルの中身は変わらない 3

ファイル書き出し ファイル プログラム ファイルの中身が変わる ファイルは伸び縮みすることがある 4

例題 1. テキストファイル形式の ファイルからのデータ読み込み 次のような名簿ファイル ( テキストファイル形式 ) を読み込んで,1 列目の氏名と,3 列目の住所だけを表示するプログラムを作る 各データは, 半角の空白文字 (1 つまたは複数 ) で区切られる 金子邦彦 1200/01/01 福岡市東区箱崎 3 丁目 392-123-8234 1300/12/31 福岡市東区貝塚団地 492-252-7188 0800/05/31 福岡市東区香椎浜 1 丁目 592-824-7144 3 行のテキストファイル 5

テキストファイル形式 行単位での読み書きに意味がある 人間が 目で見て 読むことができるファイル MPL 40 pattern1 = 786 pattern2 = 1 pattern3 = 979 pattern4 = 0 テキストファイルの例 <FF>0<FF><E0>^@^ PJFIF^@^A^B^A^@< 96>^@<96>^@^@<FF ><E0>~JFXX^@^P<F F>00<FF>U^@^C^@^ テキストファイルでないバイナリファイルの例 ( 画像のファイル ) 6

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; 7

例題 1 の手順 1. 準備演習用のデータファイル z: Book1.txt を各自で作成 ( 本資料のページ 9,10,11,12,13) 2. ビルドと実行 例題 1 のプログラムを各自で実行し, 実行結果を確認 ( 本資料のページ 14,15) 各自で行ってください ( 実行結果の確認まで ) 8

まず, データファイル z: Book1.txt を準備する ( テキストファイル形式 ) 金子邦彦 1200/01/01 福岡市東区箱崎 3 丁目 392-123-8234 1300/12/31 福岡市東区貝塚団地 492-252-7188 0800/05/31 福岡市東区香椎浜 1 丁目 592-824-7144 z: Book1.txt の例 ( 全角の空白文字が混ざっていると動かないことがあるので注意してください ) 半角の空白文字 9

メモ帳 を起動している 10

コピーして 11

貼り付ける 12

保存する場所 は,Z ドライブ ファイル名は Book1.txt ファイル 名前を付けて保存 13

ビルド後の画面 ビルドの手順 : ビルド のビルド ビルドが正常終了したことを示すメッセージ 1. 正常終了 を確認 14

実行中の画面 実行の手順 : デバッグ 実行 実行ウインドウが現れる 15

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; while( fgets( line, 100, in_file )!= NULL ) { ファイルオープンに失敗したときのみ実行される部分 sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; while による繰り返し部分 16

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; NULL の意味 fopen 関数では ファイルオープンの失敗ファイルオープンの失敗 char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; fgets 関数では ファイルの終わりファイルの終わり while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; == は等しいという意味!= は等しくないという意味 17

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; fopen 関数では ファイルオープンの失敗ファイルオープンの失敗 fgets 関数では ファイルの終わりファイルの終わり while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; ファイルオープンに失敗したら, プログラムが終わる ファイルの終わりになるまで, fgets, sscanf, printf を繰り返す 18

ファイル操作 ファイルのオープンとクローズ fopen ファイルの読み書きを行う前に ファイルはオープンされねばならない fclose ファイルの読み書きが終わったら ファイルはクローズされねばならない ファイルの読み込み fgets 1 行単位の読み込み fread バイト単位での読み込み (1 バイト, 複数バイト ) ファイルの書き出し fputs 1 行単位での書き出し fwrite バイト単位での書き出し (1バイト, 複数バイト ) fprintf 整形しての書き出し 19

オープンモード in_file = fopen("z: Book1.txt", "r"); ファイル名 ( 文字列 ) オープンモード ( 文字列 ) r モード 読み込みモード 引数 file で指定したファイルが存在しないか, 読み込み不可能な場合には, オープンすることができない. w モード 書き出しモード 引数 file で指定したファイルが存在しない場合には, ファイルが新たに作成される. ファイルがすでに存在した場合, ファイル中のデータはすべて捨てられる ( ファイルの長さは 0 になる ). 20

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; ファイルポインタ in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; ファイルの読み込み (1 行単位 ) ファイルのクローズ ファイルのオープン while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; while による繰り返し部分 21

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; char 型の配列 ( サイズ 100) を 4 つ宣言している ( 配列についての詳細は後述 ) while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; 22

例題 1 のプログラムが行っていること プログラムが使うメモリ空間 line name birth address 100 バイトのメモリエリア 100 バイトのメモリエリア 100 バイトのメモリエリア 100バイトのメモリエリア 23

例題 1 のプログラムが行っていること プログラムが使うメモリ空間 データファイル 金子邦彦 1200/01/01 福岡市東区箱崎 3 丁目 392-123-8234 1300/12/31 福岡市東区貝塚団地 492-252-7188 0800/05/31 福岡市東区香椎浜 1 丁目 592-824-7144 fgets で読み出し (1 行分 ) 金子邦彦 line name birth address 100 バイトのメモリエリア 100 バイトのメモリエリア 100 バイトのメモリエリア 100バイトのメモリエリア 24

データファイル 金子邦彦 1200/01/01 福岡市東区箱崎 3 丁目 392-123-8234 1300/12/31 福岡市東区貝塚団地 492-252-7188 0800/05/31 福岡市東区香椎浜 1 丁目 592-824-7144 2 行目以降も同様の処理が続く 例題 1 のプログラムが行っていること fgets で読み出し (1 行分 ) プログラムが使うメモリ空間 金子邦彦 金子邦彦 1200/01/01 line name birth address 福岡市東区箱崎 3 丁目 sscanf での処理 100 バイトのメモリエリア 100 バイトのメモリエリア 100 バイトのメモリエリア 100バイトのメモリエリア 25

実際のメモリの中身 メモリの中身を画面表示したもの 26

実際のメモリの中身 ここでは,16 バイトごとに区切って,1 行で表示 メモリの中身を画面表示したもの 27

実際のメモリの中身 1 バイト 16 進数 2 桁 (00 から FF) 2 進数では 8 桁 (00000000 から 11111111) 10 進数では 0 から 255 までの 256 通り バイト は, データの基本単位 メモリの中身を画面表示したもの 28

実際のメモリの中身 address (100 バイト ) birth (100 バイト ) name (100 バイト ) line (100 バイト ) 29

2 プログラムとデータ プログラムが使うメモリ空間 line[0] line[1] line[99] sscanf( line, "%s %s %s", name, birth, address ); 1 データの取り出し name birth address 3 fgets( line, 100, in_file ) ファイルの 読み込み (1 行単位 ) printf( "name=%s,... 1 行分の表示 30

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; 変数は 3 種類使っている 整数を扱う int 型 文字を扱う char 型 ファイルポインタ 31

fgets の振る舞い ファイルの 1 行読み込み ファイルの一行分を読み込んで 末端の 0 を付ける ファイルには 各行の終わりに 改行文字 ( n) が付いている ( 目には見えない ) 読み込み先 ( 文字の配列 ) のサイズが ファイルの 1 行の長さより長いときは 残りの部分 は変化しない ファイル Mark n 1 行読み込むと 変化しない 文字の配列 line M a r k 16 進数 16 進数の 0A の 00 改行文字文字列の末端 32

fgets での 100 fgets( line, 100, in_file ) 100 バイトに達したら行末になっていなくても読み込み終了せよ 文字の配列 ファイル 改行文字 16 進数 16 進数の 0A の 00 文字列の末端配列のサイズが100ならば 読み込めるデータの本体 ( 改行文字 を除く) は, 最大で98 文字まで 33

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { char line[100]; char name[100]; char birth[100]; char address[100]; FILE *in_file; int ch; in_file = fopen("z: Book1.txt", "r"); if ( in_file == NULL ) { return 0; while( fgets( line, 100, in_file )!= NULL ) { sscanf( line, "%s %s %s", name, birth, address ); printf( "name=%s, address=%s n", name, address ); fclose(in_file); ch = getchar(); ch = getchar(); return 0; それぞれ対応 それぞれ対応 char 型の配列については, sscanf, printf, fprintf では %s を, 使う決まりになっている 34

配列 35

一次元配列 0 から始まる番号がついたデータの並び 配列の要素には型がある 例 ) int, char, double など 配列 a 0 から開始 0 1 2 サイズは 3 36

例題 2. ベクトルの内積 ベクトル (1.9, 2.8, 3.7) と, ベクトル (4.6, 5.5, 6.4) の内積を表示するプログラムを作る 2つのベクトルの内積の計算のために, サイズ 3の一次元配列を2つ使う 37

例題 2: ベクトルの内積 #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { int i; double ip = 0.0; double u[]={1.9, 2.8, 3.7; double v[]={4.6, 5.5, 6.4; int ch; for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; printf(" 内積 =%f n", ip); ch = getchar(); ch = getchar(); return 0; 変数の宣言および初期化 整数を扱う int 型 浮動小数を扱う double 型 38

#include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { int i; double ip = 0.0; double u[]={1.9, 2.8, 3.7; double v[]={4.6, 5.5, 6.4; int ch; for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; printf(" 内積 =%f n", ip); ch = getchar(); ch = getchar(); return 0; メモリ確保および初期化が行われる 変数 u, v は, 浮動小数を要素とする配列で, サイズは 3 u 1.9 2.8 3.7 0 1 2 v 4.6 5.5 6.4 0 1 2 39

ip i i = 0, 1, 2 での繰り返し (3 回繰り返し ) 最初は i = 0 0 0 + 1.9 * 4.6 0 for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; i = 0 のときは ip + u[0]*v[0] u 1.9 2.8 0 1 v 4.6 5.5 0 1 3.7 2 6.4 2 40

ip i i = 0, 1, 2 での繰り返し (3 回繰り返し ) 次は i = 1 8.74 8.74 + 2.8 * 5.5 1 for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; i = 1 のときは ip + u[1]*v[1] u 1.9 2.8 0 1 v 4.6 5.5 0 1 3.7 2 6.4 2 41

ip i i = 0, 1, 2 での繰り返し (3 回繰り返し ) 次は i = 2 24.14 24.14 + 3.7 * 6.4 2 for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; i = 2 のときは ip + u[2]*v[2] u 1.9 2.8 0 1 v 4.6 5.5 0 1 3.7 2 6.4 2 42

ベクトルの内積 for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; 繰り返し 1 回目 繰り返し 2 回目 繰り返し 3 回目 繰り返し 4 回目 i の値 繰り返し条件式が成り立つか i = 0 i < 3 が成り立つ ip = ip + u[0] * v[0]; i = 1 i < 3 が成り立つ ip = ip + u[1] * v[1]; i = 2 i < 3 が成り立つ ip = ip + u[2] * v[2]; i = 3 i < 3 が成り立たない ip の値 つまり ip の値は u[0]*v[0] つまり ip の値は u[0]*v[0] + u[1]*v[1] つまり ip の値は u[0]*v[0] + u[1]*v[1] +u[2]*v[2] 43

配列の使い方 添字をつけて 普通の変数のように使う int a[3]; a[0] = i; a[1] = 5; fscanf( %d,&a[2]); j = a[2]; printf( %d %d n,a[0],a[1]); 配列 a a[0] a[1] a[2] 添字 0 1 2 44

次のプログラムを実行してみなさい #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { int i; double ip = 0.0; double u[]={1.9, 2.8, 3.7; double v[]={4.6, 5.5, 6.4; int ch; for (i=0; i<3; i++) { ip = ip + u[i]*v[i]; printf(" 内積 =%f n", ip); ch = getchar(); ch = getchar(); return 0; 各自で行ってください ( 実行結果の確認まで ) 終わったら, 例題 3を各自で行ってください 45

例題 3. 棒グラフを描く 整数の配列から, その棒グラフを表示するプログラムを作る. ループの入れ子で, 棒グラフの表示を行う 46

例題 3: 棒グラフ #include "stdafx.h" #include <math.h> int _tmain(int argc, _TCHAR* argv[]) { int i; int j; int ch; int a[]={6,4,7,1,5,3,2; for (i=0; i<7; i++) { for (j=0; j<a[i]; j++) { printf("*"); printf(" n"); ch = getchar(); ch = getchar(); return 0; 配列の宣言 配列からの 読み出し 47

棒グラフを書く 実行結果の例 ****** **** ******* * ***** *** ** 48

多重ループ ループを入れ子構造にする 外側のループ for (i=0 ; i < n ;i++) { 内側のループ for (j=0 ; j < m ;j++) { i=0 i=1 i 0 0 0 0 1 1 1 j 0 1 2 m-1 0 1 2 1 m-1 i=n-1 n-1 m-1 49