プログラミング入門2
芝浦工業大学情報工学科
青木 義満
第7回
文字列
数学関数
ファイルの入出力
今回の講義内容
文字列
文字列の配列の扱い
関数への受け渡し
数学関数の利用
平方根,べき乗,三角関数 など
ファイル入出力
プログラミング入門2 3
文字列とは?
(p.210)
文字列リテラル
文字1つ1つ: ‘A’, ‘B’, ‘1’
複数の文字の並び=文字列
文字列リテラルとナル文字(NULL)
文字列リテラルの末尾には,必ず
ナル文字
が付加
puts( “ぷろぐらみんぐ入門” );
“”で囲まれた部分=文字列リテラル という
“
ABCD”
A
B
C
D
„¥0‟ → ナル文字
4文字
¥0
1文字
+
文字列型
文字を格納するためのデータ型
char型
文字の並び(文字列)を格納するには?
char型の変数を
文字数+ナル文字
分用意
→
char型の配列
で実現!!
“
ABCD”
A
B
C
D
4文字
¥0
1文字
+
char str[5];
?
要素数5の文字型の配列
プログラミング入門2 5
文字列を格納する配列 (p.210)
ソースファイル名: list0902.c
文字列をchar型の配列に格納し,表示
#include <stdio.h> int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ str[2] = 'C'; /* 代入 */ str[3] = '¥0'; /* 代入 */ printf("文字列strは%sです。¥n", str); /* 表示 */ return (0); }文字列の表示・初期化
文字列を printf関数 で表示
変換指定: %s を使用
文字配列の初期化
前ページの例のように,一文字づつの代入は大変
以下の形式で,配列にまとめて文字を代入可能
配列の要素数は省略可能
printf( “文字列は%sです¥n”, str );
変換指定
配列名を指定
(a)
char ss[ ] = { „A‟, „B‟, „C‟, „D‟, „¥0‟ };
プログラミング入門2 7
文字列の初期化と表示 (p.211)
ソースファイル名: list0903.c
文字配列を初期化し,printfで表示
#include <stdio.h>
int main(void)
{
char str[ ] = "ABC";
/* 初期化 */
printf("文字列strは%sです。¥n", str); /* 表示 */
return (0);
}
文字列の読込み
scanf関数による文字列の読込み
名前を格納する文字配列を用意
scanfの使い方
char name[40];
39文字
までの文字を格納可
scanf( “%s”, name );
文字列用変換指定
配列名
(文字配列の場合,&は不要!)
プログラミング入門2 9
文字列の読込み (p.212)
ソースファイル名: list0904.c
名前を表す文字列を読込み,挨拶をする
#include <stdio.h>
int main(void)
{
char name[40];
printf("お名前は:");
scanf("%s", name);
printf("こんにちは、%sさん!!¥n", name);
return (0);
}
文字列の配列 (p.214)
文字列に名前データを格納
複数の名前データの扱い
char name[ ] = “aoki” ;
char name1[ ] = “aoki” ;
char name2[ ] = “tokunaga” ;
char name3[ ] = “okura” ;
添え字変数を使っていないので,
for文で回せない!
文字列を配列として扱えれば便利!
プログラミング入門2 11
文字列の配列の実現
文字列のデータ構造
文字列の配列
1つの文字列自体が文字の集合 → 配列
複数の文字列を配列として扱うには?→
2次元配列
char name1[ ] = “aoki” ;
char name2[ ] = “tokunaga” ;
char name3[ ] = “okura” ;
name1 t o k u n a g a ¥n a o k i ¥n o k u r a ¥n name2 name3
name[3][9]
名前の数 (文字列データの個数) 名前の文字数(9文字分) o k u r a ¥n ¥n ¥n ¥n t o k u n a g a ¥n name[0] name[1] name[2] a o k i ¥n ¥n ¥n ¥n ¥n 0 1 2 3 4 5 6 7 8文字列の配列の実現
ソースファイル名: list0906.c (p.214)
複数の氏名データを文字列の配列で実現,表示
#include <stdio.h> int main(void) {char name[3][9] = { "aoki", "tokunaga", "okura" }; int i; printf("name[0] = %s¥n", name[0]); printf("name[1] = %s¥n", name[1]); printf("name[2] = %s¥n", name[2]); for(i=0; i < 3; i++){ printf("name[%d] = %s¥n", i, name[i]); } return(0); } 文字列の配列の宣言と 初期化 文字列の配列の表示
プログラミング入門2 13
文字列配列への文字列の読込み
ソースファイル名: list0907.c (p.215)
キーボードから複数の氏名データを文字列配列に読み込み,表示
#include <stdio.h> int main(void) { char name[3][128]; 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関数は,文字列の場合,&は いらない!数学関数の必要性
先週の課題
var
std
avg
x
n
var
x
n
avg
n
n
i
x
n i i n i i i
標準偏差:
分散:
平均点:
データ数(人数)
得点データ
1 2 1)
(
1
1
:
)
,...
3
,
2
,
1
(
:
for文, +演算子
2乗の計算
(x-avg)*(x-avg)
平方b根?
n乗,平方根,sin, cos…
数値計算用の便利な関数は?
数学関数
プログラミング入門2 15
C言語の数学関数
C言語標準の便利な数学関数群
sqrt(平方根),pow(n乗計算),sin, cos, tan(三
角関数),その他
数学関数をプログラム中で使用するには?
ソースファイルに数学関数定義の記述された
“math.h”
をインクルード
コンパイル時に,以下の記述を追加
ソースファイル:xxx.c
#include <stdio.h> Int main(void){ ・・・・・・・#include <math.h> 数学関数用ヘッダー “math.h”
をインクルードb
gcc xxx.c -o xxx
-lm
ソースファイル名 実行ファイル名-l →
リンクオプション (使用する関数を指定)m →
math.lib(数学関数)のmプログラミング入門2 17
代表的な数学関数たち(1)
平方根の計算
sqrt関数
仕様
double sqrt ( double x );
役割
doubleの値を受け取り,その平方根を計算してdoubleの値で返すy = sqrt(4.0)
y → 2.0
べき乗の計算
pow関数
仕様
double pow ( double x, double y );
役割
xのy乗を計算し,その結果をdoubleの値で返すz = pow( 4.0, 2.0)
z → 16.0
数学関数の使用例(1)
ソースファイル名:math1.c
平方根,べき乗の計算
#include <stdio.h> #include <math.h> int main(void) { double x, y, z; printf("input x : "); scanf("%lf", &x ); y = sqrt(x); z = pow(x, 2.0); printf("入力値 = %f¥n", x ); printf("平方根 = %f¥n", y ); printf("2乗 = %f¥n", z ); return(0); }math.hのインクルードを忘れずに!
コンパイル方法
gcc math1.c -o math1
-lm
プログラミング入門2 19
代表的な数学関数たち(2)
三角関数の計算
sin, cos, tan関数
仕様
double sin ( double x );
double cos ( double x );
double tan ( double x );
役割
角度(単位ラジアン)
を受け取り,sin, cos, tanを計算してdoubleの値で返す
高校の復習 ラジアン
180°=
1π(ラジアン)
1°=
π/180 (ラジアン)
角度を°で入力し,ラジアンに変換
x°→ x*(π/180)
数学関数の使用例(2)
ソースファイル名:math2.c
三角関数 sin, cos, tan の計算
#include <stdio.h>
#include <math.h>
int main(void) {
double x, sin_x, cos_x, tan_x; double radian; printf("input x : "); scanf("%lf", &x ); radian = x * (PI / 180.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.1415………
sin, cos, tanの計算
math.hのインクルードを忘れずに!
コンパイル方法
プログラミング入門2 21
その他の数学関数の例 (他にもあります)
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)
自然対数
log10(x)
基底10の対数
abs(x)
絶対値(int用)
fabs(x)
絶対値(double用)
*三角関数の角度はラジアン
ファイルとは何か?
これまでのプログラム
プログラムが終了すると,計算結果などのデータは
保存されない
変数の寿命は有限
ファイルの必要性
プログラム中のデータをファイルへ保存可能
ファイル内のデータをプログラム中に読み込み
間接的に他のプログラムとデータのやりとり
ファイルの入出力
プログラミング入門2 23
ファイルとは?
文章,画像,音楽データ
→ ファイルとして保存
ファイルの構造
パソコンでは,データは全てメモリ上に記録
メモリ管理の単位: バイト(byte)
ハードディスク,フロッピーディスク
CD-ROM,メモリ-カード 等
バイト単位の
データの連なり
=
ファイル
ファイルへのデータの書き込み
ファイルにデータを書き込む際の手順
ファイルを開く
どのファイルに対して(ファイル名)?
どのような形式で?
(テキスト or バイナリ, Read or Write)
データの書き込み
関数を使って,データをファイルに書き込む
ファイルを閉じる
使ったファイルを必ず閉じる
プログラミング入門2 25
ファイルを開く ~ fopen関数
データを書き込む先の
”ファイル名” を指定
どんなモードでファイルを開くか?
書き込み用
読込み用
読み書き用
ファイルを開く操作
FILE *fp;
fp = fopen( “file.txt”, “w” );
file.txt
(ファイル)
FILE *fp
(ファイルポインタ)
ファイル名 ファイルを開く 際のモード ファイルを指定fp を介して,ファイルにアクセスが可能!
ファイルを開く際のモードの種類 (テキストファイル)
モード
意味
“r”
読込み用にファイルを開く。ファイルが存在しない場合や
見つからない場合は失敗する。
“w”
書き込み用にファイルを作成。ファイルが存在する場合は
そのファイルの内容は破棄する。
“a”
追加書き込みのために既存ファイルを開く。ファイルが存
在しない場合には作成する。
“r+”
読み書き用にファイルを開く。ファイルは存在していなけ
ればならない。
“w+”
読み書き用にファイルを作成。ファイルが存在する場合に
は,そのファイルの内容は破棄する。
“a+”
読込みと追加の両方のモードでファイルを開く。ファイル
が存在しない場合は作成する。
プログラミング入門2 27
ファイルへのデータの書き込み
~ fprintf関数
printf関数(画面へのデータ出力)
→
f
printf関数(
f
ileへのデータ出力)
fprintf関数の書式
printf関数
printf( “iの値は%dです¥n”, i );
fprintf関数
fprintf( fp, “iの値は%dです¥n”, i );
データ書き込み先 」のファイル(ポインタ)iの値は1です
file.txt
fprintf関数の使用例
実数データの書き込み
文字列データの書き込み
複数の型のデータを1行に書き込み
double x → fprintf( fp, “%f¥n”, x );
char str[256] → fprintf( fp, “%s¥n”, str );
char name[ ] = “morishima”;
int student_id = 100;
double tensu = 95.5;
→ fprintf( fp, “%d %s %f ¥n”, student_id, name, tensu );
名前 学籍番号 点数
プログラミング入門2 29
ファイルを閉じる
使い終わったら,後片付け
ファイルを閉じる
ファイルを開く時に指定したファイルポインタを指定
fclose(fp);
ファイルへのデータ書き込み 例題
ソースファイル名:fileio1.c
様々なデータをファイルに書き込み
#include <stdio.h> int main(void) { FILE *fp; int student_id = 100; 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 );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); } ファイルポインタ宣言 ファイルに書き込むデータ “test.txt”という名前でファイルをオープン (書き込み用) データをファイルに書き込み ファイルを閉じる
プログラミング入門2 31