第 7 回文字列数学関数ファイルの入出力 芝浦工業大学情報工学科青木義満 今回の講義内容 文字列 文字列の配列の扱い 関数への受け渡し 数学関数の利用 平方根, べき乗, 三角関数など ファイル入出力
文字列とは? (p.0) 文字列リテラル 文字 つつ : A, B, 複数の文字の並び= 文字列 puts( ぷろぐらみんぐ入門 ); で囲まれた部分 = 文字列リテラルという 文字列リテラルとナル文字 (NULL) 文字列リテラルの末尾には, 必ずナル文字が付加 ABCD A B C D 0 0 ナル文字 4 文字 + 文字 3 文字列型 文字を格納するためのデータ型 char 型 文字の並び ( 文字列 ) を格納するには? char 型の変数を文字数 +ナル文字分用意 char 型の配列で実現!! ABCD A B C D 0 4 文字 + 文字 char str[5];? 要素数 5 の文字型の配列 4
文字列を格納する配列 (p.0) ソースファイル名 : list090.c 文字列を char 型の配列に格納し, 表示 int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[] = 'B'; /* 代入 */ str[] = 'C'; /* 代入 */ str[3] = ' 0'; /* 代入 */ printf(" 文字列 str は %s です n", str); /* 表示 */ return (0); 5 文字列の表示 初期化 文字列を printf 関数で表示 変換指定 : %s を使用 printf( 文字列は %s です n, str ); 文字配列の初期化 変換指定 配列名を指定 前ページの例のように, 一文字づつの代入は大変 以下の形式で, 配列にまとめて文字を代入可能 配列の要素数は省略可能 (a) char ss[ ] = { A, B, C, D, 0 ; (b) char ss[ ] = ABCD ; 6 3
文字列の初期化と表示 (p.) ソースファイル名 : list0903.c 文字配列を初期化し,printf で表示 int main(void) { char str[ ] = "ABC"; /* 初期化 */ printf(" 文字列 str は %s です n", str); /* 表示 */ return (0); 7 文字列の読込み scanf 関数による文字列の読込み 名前を格納する文字配列を用意 char name[40]; 39 文字までの文字を格納可 scanf の使い方 scanf( %s, name ); 文字列用変換指定 配列名 ( 文字配列の場合,& は不要!) 8 4
文字列の読込み (p.) ソースファイル名 : list0904.c 名前を表す文字列を読込み, 挨拶をする int main(void) { char name[40]; printf(" お名前は :"); scanf("%s", name); printf(" こんにちは %s さん!! n", name); return (0); 9 文字列の配列 (p.4) 文字列に名前データを格納 char name[ ] = aoki ; 複数の名前データの扱い char name[ ] = aoki ; char name[ ] = tokunaga ; char name3[ ] = okura ; 添え字変数を使っていないので, for 文で回せない! 同じ型のデータの集合 配列で実現 文字列を配列として扱えれば便利! 0 5
文字列の配列の実現 文字列のデータ構造 char name[ ] = aoki ; name a o k i n char name[ ] = tokunaga ; char name3[ ] = okura ; name t o k u n a g a n name3 o k u r a n 文字列の配列 つの文字列自体が文字の集合 配列 複数の文字列を配列として扱うには? 次元配列 0 3 4 5 6 7 8 name[3][9] 名前の文字数 (9 文字分 ) 名前の数 ( 文字列データの個数 ) name[0] name[] name[] a o k i n n n n n t o k u n a g a n o k u r a n n n n 文字列の配列の実現 ソースファイル名 : list0906.c (p.4) 複数の氏名データを文字列の配列で実現, 表示 int main(void) { char name[3][9] = { "aoki", "tokunaga", "okura" ; int i; 文字列の配列の宣言と初期化 printf("name[0] = %s n", name[0]); printf("name[] = %s n", name[]); printf("name[] = %s n", name[]); for(i=0; i < 3; i++){ printf("name[%d] = %s n", i, name[i]); 文字列の配列の表示 return(0); 6
文字列配列への文字列の読込み ソースファイル名 : list0907.c (p.5) キーボードから複数の氏名データを文字列配列に読み込み, 表示 int main(void) { char name[3][8]; int i; 文字列の配列の宣言と初期化 ( 文字数を多めに確保 ) printf( 名前を入力 n"); for(i=0; i < 3; i++){ printf( name[%d] :", i); scanf( %s, name[i]); printf(" 名前を表示 n"); for(i=0; i < 3; i++){ printf("name[%d] = %s n", i, name[i]); return(0); キーボードから文字列の配列へデータを読込み注意 :scanf 関数は, 文字列の場合,& はいらない! 文字列の配列の表示 3 数学関数の必要性 先週の課題 得点データ 平均点 : 分散 : 標準偏差 : : x avg n var n i n i std ( i,,3,... n) n i n : データ数 ( 人数 ) x ( x avg) i i var for 文, + 演算子 乗の計算 (x-avg)*(x-avg) 平方 b 根? n 乗, 平方根,sin, cos 数値計算用の便利な関数は? 数学関数 4 7
C 言語の数学関数 C 言語標準の便利な数学関数群 sqrt( 平方根 ),pow(n 乗計算 ),sin, cos, tan( 三角関数 ), その他 5 数学関数をプログラム中で使用するには? ソースファイルに数学関数定義の記述された math.h をインクルード ソースファイル :xxx.c #include <math.h> Int main(void){ 数学関数用ヘッダーをインクルードb math.h コンパイル時に, 以下の記述を追加 gcc xxx.c -o xxx -lm ソースファイル名 実行ファイル名 -l リンクオプション ( 使用する関数を指定 ) m math.lib( 数学関数 ) の m 6 8
代表的な数学関数たち () 平方根の計算 sqrt 関数 仕様 double sqrt ( double x ); 役割 べき乗の計算 pow 関数 double の値を受け取り, その平方根を計算して double の値で返す y = sqrt(4.0) y.0 仕様 double pow ( double x, double y ); 役割 x の y 乗を計算し, その結果を double の値で返す z = pow( 4.0,.0) z 6.0 7 数学関数の使用例 () ソースファイル名 :math.c 平方根, べき乗の計算 #include <math.h> math.h のインクルードを忘れずに! int main(void) { double x, y, z; printf("input x : "); scanf("%lf", &x ); y = sqrt(x); コンパイル方法 gcc math.c -o math -lm z = pow(x,.0); printf(" 入力値 = %f n", x ); printf(" 平方根 = %f n", y ); printf(" 乗 = %f n", z ); return(0); 8 9
代表的な数学関数たち () 三角関数の計算 sin, cos, tan 関数 仕様 役割 double sin ( double x ); double cos ( double x ); double tan ( double x ); 角度 ( 単位ラジアン ) を受け取り,sin, cos, tan を計算して double の値で返す 高校の復習ラジアン 80 = π( ラジアン ) = π/80 ( ラジアン ) 角度を で入力し, ラジアンに変換 x x*(π/80) 9 数学関数の使用例 () ソースファイル名 :math.c 三角関数 sin, cos, tan の計算 #include <math.h> int main(void) { double x, sin_x, cos_x, tan_x; double radian; math.h のインクルードを忘れずに! printf("input x : "); scanf("%lf", &x ); 角度を入力 ( 単位は ) radian = x * (PI / 80.0); sin_x = sin(radian); cos_x = cos(radian); tan_x = tan(radian); printf(" 入力値 = %f n", x ); printf("sin = %f n", sin_x ); printf("cos = %f n", cos_x ); printf("tan = %f n", tan_x ); return(0); 角度の単位を ラジアンに変換 PI : πの値,math.h 内でマクロ定義 #define PI 3.45 sin, cos, tan の計算 コンパイル方法 gcc math.c -o math -lm 0 0
その他の数学関数の例 ( 他にもあります ) pow(x, y) x の y 乗 sqrt(x) 平方 sin(x) サイン cos(x) コサイン tan(x) タンジェント asin(x) アーク サイン acos(x) アーク コサイン atan(x) アーク タンジェント sinh(x) ハイパボリック サイン cosh(x) ハイパボリック コサイン tanh(x) ハイパボリック タンジェント exp(x) e の x 乗 log(x) 自然対数 log0(x) 基底 0の対数 abs(x) 絶対値 (int 用 ) fabs(x) 絶対値 (double 用 ) * 三角関数の角度はラジアン ファイルとは何か? これまでのプログラム プログラムが終了すると, 計算結果などのデータは保存されない 変数の寿命は有限 ファイルの必要性 プログラム中のデータをファイルへ保存可能 ファイル内のデータをプログラム中に読み込み 間接的に他のプログラムとデータのやりとり ファイルの入出力
ファイルとは? 文章, 画像, 音楽データ ファイルとして保存 ファイルの構造 ハードディスク, フロッピーディスク CD-ROM, メモリ - カード等 パソコンでは, データは全てメモリ上に記録 メモリ管理の単位 : バイト (byte) バイト単位のデータの連なり = ファイル 3 ファイルへのデータの書き込み ファイルにデータを書き込む際の手順 ファイルを開く どのファイルに対して ( ファイル名 )? どのような形式で?( テキスト or バイナリ, Read or Write) データの書き込み 関数を使って, データをファイルに書き込む ファイルを閉じる 使ったファイルを必ず閉じる 4
ファイルを開く ~ fopen 関数 データを書き込む先の ファイル名 を指定 どんなモードでファイルを開くか? 書き込み用 読込み用 読み書き用 ファイルを開く操作 FILE *fp; FILE *fp ( ファイルポインタ ) fp = fopen( file.txt, w ); ファイルを指定 file.txt ( ファイル ) ファイル名 ファイルを開く際のモード fp を介して, ファイルにアクセスが可能! 5 ファイルを開く際のモードの種類 ( テキストファイル ) モード r w a r+ w+ a+ 意味 読込み用にファイルを開く ファイルが存在しない場合や見つからない場合は失敗する 書き込み用にファイルを作成 ファイルが存在する場合はそのファイルの内容は破棄する 追加書き込みのために既存ファイルを開く ファイルが存在しない場合には作成する 読み書き用にファイルを開く ファイルは存在していなければならない 読み書き用にファイルを作成 ファイルが存在する場合には, そのファイルの内容は破棄する 読込みと追加の両方のモードでファイルを開く ファイルが存在しない場合は作成する 6 3
ファイルへのデータの書き込み ~ fprintf 関数 printf 関数 ( 画面へのデータ出力 ) fprintf 関数 (file へのデータ出力 ) fprintf 関数の書式 printf 関数 printf( i の値は %d です n, i ); fprintf 関数 fprintf( fp, i の値は %d です n, i ); file.txt i の値は です データ書き込み先 のファイル ( ポインタ ) 7 fprintf 関数の使用例 実数データの書き込み double x fprintf( fp, %f n, x ); 文字列データの書き込み char str[56] fprintf( fp, %s n, str ); 複数の型のデータを 行に書き込み char name[ ] = morishima ; int student_id = 00; 学籍番号 double tensu = 95.5; 点数 名前 fprintf( fp, %d %s %f n, student_id, name, tensu ); 8 4
ファイルを閉じる 使い終わったら, 後片付け ファイルを閉じる ファイルを開く時に指定したファイルポインタを指定 fclose(fp); 9 ファイルへのデータ書き込み例題 ソースファイル名 :fileio.c 様々なデータをファイルに書き込み int main(void) { ファイルポインタ宣言 FILE *fp; int student_id = 00; char name[ ]= "morishima"; ファイルに書き込むデータ double tensu = 95.5; fp = fopen("test.txt","w"); fprintf( fp, "%d n", student_id ); fprintf( fp, "%s n", name ); fprintf( fp, "%f n", tensu ); test.txt という名前でファイルをオープン ( 書き込み用 ) fprintf( fp, "%d %s %f n", student_id, name, tensu ); fprintf( fp, "%d t%s t%f n", student_id, name, tensu ); データをファイルに書き込み fclose(fp); ファイルを閉じる return(0); 30 5
演習課題 ) 名前の入力とファイルへの書き込み (kada7-.c) キーボードから数人分の氏名を入力し, 入力した氏名データを画面表示した上で, 以下のようにテキストファイルに保存せよ name.txt scanf char name[num][8]; fprintf ) 数学関数を用いた数値計算 (kadai7-.c) 参考 : Aoki Tokunaga Okura Morishima Komiya つのベクトルの成分 P (x, y), P (x, y) をキーボードから入力し, 内積の値を利用して, つのベクトルの成す角度 θ( ) を求めよ o θ P (x, y ) P (x, y ) P P x * x P P cos P P y * y P P P P cos P x y P P cos ( ) P P cos - : アークコサイン acos 関数使用 θ はラジアンで出るので, 角度 ( ) に変換して表示 3 演習課題 3) 数学関数を用いた数値計算 (kadai7-3.c) 以下の 次方程式の係数 (a, b, c) を入力し, その方程式の解が 実数解 ( つ ) 実数解 ( つ ( 重解 )) 3 虚数解 のどの解を持つかを判別せよ また, 実数解を持つ (,) 場合には, その解を求めて表示せよ ax bx c 0 解の判別 X=? 3 6