1 プログラミング入門2 芝浦工業大学情報工学科 青木 義満 第7回 文字列 数学関数 ファイルの入出力 プログラミング入門2 2 今回の講義内容 文字列 文字列の配列の扱い 関数への受け渡し 数学関数の利用 平方根,べき乗,三角関数 など ファイル入出力
1
プログラミング入門2
芝浦工業大学情報工学科青木 義満
第7回文字列数学関数
ファイルの入出力
プログラミング入門2 2
今回の講義内容
文字列
文字列の配列の扱い
関数への受け渡し
数学関数の利用
平方根,べき乗,三角関数 など
ファイル入出力
2
プログラミング入門2 3
文字列とは? (p.210)
文字列リテラル 文字1つ1つ: ‘A’, ‘B’, ‘1’
複数の文字の並び=文字列
文字列リテラルとナル文字(NULL)
文字列リテラルの末尾には,必ずナル文字が付加
puts( “ぷろぐらみんぐ入門” );
“”で囲まれた部分=文字列リテラル という
“ABCD” „¥0‟ → ナル文字A B C D
4文字
¥0
1文字+
プログラミング入門2 4
文字列型
文字を格納するためのデータ型
char型
文字の並び(文字列)を格納するには?
char型の変数を文字数+ナル文字分用意
→ char型の配列で実現!!
“ABCD” A B C D
4文字
¥0
1文字+
char str[5];?要素数5の文字型の配列
3
プログラミング入門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);
}
プログラミング入門2 6
文字列の表示・初期化
文字列を printf関数 で表示
変換指定: %s を使用
文字配列の初期化
前ページの例のように,一文字づつの代入は大変
以下の形式で,配列にまとめて文字を代入可能
配列の要素数は省略可能
printf( “文字列は%sです¥n”, str );
変換指定 配列名を指定
(a) char ss[ ] = { „A‟, „B‟, „C‟, „D‟, „¥0‟ };
(b) char ss[ ] = “ABCD”;
4
プログラミング入門2 7
文字列の初期化と表示 (p.211)
ソースファイル名: list0903.c
文字配列を初期化し,printfで表示
#include <stdio.h>
int main(void)
{
char str[ ] = "ABC"; /* 初期化 */
printf("文字列strは%sです。¥n", str); /* 表示 */
return (0);
}
プログラミング入門2 8
文字列の読込み
scanf関数による文字列の読込み
名前を格納する文字配列を用意
scanfの使い方
char name[40]; 39文字までの文字を格納可
scanf( “%s”, name );
文字列用変換指定配列名(文字配列の場合,&は不要!)
5
プログラミング入門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);
}
プログラミング入門2 10
文字列の配列 (p.214)
文字列に名前データを格納
複数の名前データの扱い
char name[ ] = “aoki” ;
char name1[ ] = “aoki” ;
char name2[ ] = “tokunaga” ;
char name3[ ] = “okura” ;
添え字変数を使っていないので,for文で回せない!
文字列を配列として扱えれば便利!
同じ型のデータの集合 → 配列で実現
6
プログラミング入門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
プログラミング入門2 12
文字列の配列の実現
ソースファイル名: 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);
}
文字列の配列の宣言と初期化
文字列の配列の表示
7
プログラミング入門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関数は,文字列の場合,&はいらない!
プログラミング入門2 14
数学関数の必要性
先週の課題
varstd
avgxn
var
xn
avg
n
nix
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…
数値計算用の便利な関数は? 数学関数
8
プログラミング入門2 15
C言語の数学関数
C言語標準の便利な数学関数群
sqrt(平方根),pow(n乗計算),sin, cos, tan(三角関数),その他
プログラミング入門2 16
数学関数をプログラム中で使用するには?
ソースファイルに数学関数定義の記述された
“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
9
プログラミング入門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
プログラミング入門2 18
数学関数の使用例(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
10
プログラミング入門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 20
数学関数の使用例(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のインクルードを忘れずに!
コンパイル方法
gcc math2.c -o math2 -lm
11
プログラミング入門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 22
ファイルとは何か?
これまでのプログラム
プログラムが終了すると,計算結果などのデータは保存されない
変数の寿命は有限
ファイルの必要性
プログラム中のデータをファイルへ保存可能
ファイル内のデータをプログラム中に読み込み
間接的に他のプログラムとデータのやりとり
ファイルの入出力
12
プログラミング入門2 23
ファイルとは?
文章,画像,音楽データ
→ ファイルとして保存
ファイルの構造
パソコンでは,データは全てメモリ上に記録
メモリ管理の単位: バイト(byte)
ハードディスク,フロッピーディスクCD-ROM,メモリ-カード 等
バイト単位のデータの連なり = ファイル
プログラミング入門2 24
ファイルへのデータの書き込み
ファイルにデータを書き込む際の手順
ファイルを開く どのファイルに対して(ファイル名)?
どのような形式で?(テキスト or バイナリ, Read or Write)
データの書き込み 関数を使って,データをファイルに書き込む
ファイルを閉じる 使ったファイルを必ず閉じる
13
プログラミング入門2 25
ファイルを開く ~ fopen関数
データを書き込む先の ”ファイル名” を指定
どんなモードでファイルを開くか?
書き込み用
読込み用
読み書き用
ファイルを開く操作
FILE *fp;
fp = fopen( “file.txt”, “w” );
file.txt
(ファイル)
FILE *fp(ファイルポインタ)
ファイル名
ファイルを開く際のモード
ファイルを指定
fp を介して,ファイルにアクセスが可能!
プログラミング入門2 26
ファイルを開く際のモードの種類 (テキストファイル)
モード 意味
“r” 読込み用にファイルを開く。ファイルが存在しない場合や見つからない場合は失敗する。
“w”書き込み用にファイルを作成。ファイルが存在する場合はそのファイルの内容は破棄する。
“a”追加書き込みのために既存ファイルを開く。ファイルが存在しない場合には作成する。
“r+”読み書き用にファイルを開く。ファイルは存在していなければならない。
“w+”読み書き用にファイルを作成。ファイルが存在する場合には,そのファイルの内容は破棄する。
“a+”読込みと追加の両方のモードでファイルを開く。ファイルが存在しない場合は作成する。
14
プログラミング入門2 27
ファイルへのデータの書き込み ~ fprintf関数
printf関数(画面へのデータ出力)
→ fprintf関数(fileへのデータ出力)
fprintf関数の書式
printf関数
printf( “iの値は%dです¥n”, i );
fprintf関数
fprintf( fp, “iの値は%dです¥n”, i );
データ書き込み先」のファイル(ポインタ)
iの値は1です
file.txt
プログラミング入門2 28
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 );
名前
学籍番号
点数
15
プログラミング入門2 29
ファイルを閉じる
使い終わったら,後片付け
ファイルを閉じる
ファイルを開く時に指定したファイルポインタを指定
fclose(fp);
プログラミング入門2 30
ファイルへのデータ書き込み 例題
ソースファイル名: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”という名前でファイルをオープン(書き込み用)
データをファイルに書き込み
ファイルを閉じる
16
プログラミング入門2 31
演習課題
1 )名前の入力とファイルへの書き込み(kada7-1.c)
キーボードから数人分の氏名を入力し,入力した氏名データを画面表示した上で,以下のようにテキストファイルに保存せよ。
2)数学関数を用いた数値計算(kadai7-2.c)
2つのベクトルの成分P1 (x1, y1), P2 (x2, y2) をキーボードから入力し,内積の値を利用して,2つのベクトルの成す角度θ(°)を求めよ。
name.txt
Aoki
Tokunaga
Okura
Morishima
Komiya
・・・・・・・・・・・・
char name[NUM][128];scanffprintf
参考:
o
P1 (x1, y1)
P1 (x1, y1)θ)(coscos
cos
**
21
211
21
21
2
1
2
112121
212121
PP
PP
PP
PP
yxPPPPP
yyxxPP
・
・
・
・
cos-1 : アークコサイン→ acos関数使用
θはラジアンで出るので,角度(°)に変換して表示
プログラミング入門2 32
演習課題
3) 数学関数を用いた数値計算(kadai7-3.c)
以下の2次方程式の係数(a, b, c)を入力し,その方程式の解が
① 実数解(2つ)
② 実数解(1つ(重解))
③ 虚数解
のどの解を持つかを判別せよ。
また,実数解を持つ(①,②)場合には,その解を求めて表示せよ。
02 cbxax 解の判別 X=?