Top Banner
1 プログラミング入門2 芝浦工業大学情報工学科 青木 義満 7文字列 数学関数 ファイルの入出力 プログラミング入門2 2 今回の講義内容 文字列 文字列の配列の扱い 関数への受け渡し 数学関数の利用 平方根,べき乗,三角関数 など ファイル入出力
16

プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

Oct 16, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

1

プログラミング入門2

芝浦工業大学情報工学科青木 義満

第7回文字列数学関数

ファイルの入出力

プログラミング入門2 2

今回の講義内容

文字列

文字列の配列の扱い

関数への受け渡し

数学関数の利用

平方根,べき乗,三角関数 など

ファイル入出力

Page 2: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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の文字型の配列

Page 3: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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”;

Page 4: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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 );

文字列用変換指定配列名(文字配列の場合,&は不要!)

Page 5: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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文で回せない!

文字列を配列として扱えれば便利!

同じ型のデータの集合 → 配列で実現

Page 6: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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);

}

文字列の配列の宣言と初期化

文字列の配列の表示

Page 7: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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…

数値計算用の便利な関数は? 数学関数

Page 8: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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

Page 9: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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

Page 10: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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

Page 11: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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

ファイルとは何か?

これまでのプログラム

プログラムが終了すると,計算結果などのデータは保存されない

変数の寿命は有限

ファイルの必要性

プログラム中のデータをファイルへ保存可能

ファイル内のデータをプログラム中に読み込み

間接的に他のプログラムとデータのやりとり

ファイルの入出力

Page 12: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

12

プログラミング入門2 23

ファイルとは?

文章,画像,音楽データ

→ ファイルとして保存

ファイルの構造

パソコンでは,データは全てメモリ上に記録

メモリ管理の単位: バイト(byte)

ハードディスク,フロッピーディスクCD-ROM,メモリ-カード 等

バイト単位のデータの連なり = ファイル

プログラミング入門2 24

ファイルへのデータの書き込み

ファイルにデータを書き込む際の手順

ファイルを開く どのファイルに対して(ファイル名)?

どのような形式で?(テキスト or バイナリ, Read or Write)

データの書き込み 関数を使って,データをファイルに書き込む

ファイルを閉じる 使ったファイルを必ず閉じる

Page 13: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

13

プログラミング入門2 25

ファイルを開く ~ fopen関数

データを書き込む先の ”ファイル名” を指定

どんなモードでファイルを開くか?

書き込み用

読込み用

読み書き用

ファイルを開く操作

FILE *fp;

fp = fopen( “file.txt”, “w” );

file.txt

(ファイル)

FILE *fp(ファイルポインタ)

ファイル名

ファイルを開く際のモード

ファイルを指定

fp を介して,ファイルにアクセスが可能!

プログラミング入門2 26

ファイルを開く際のモードの種類 (テキストファイル)

モード 意味

“r” 読込み用にファイルを開く。ファイルが存在しない場合や見つからない場合は失敗する。

“w”書き込み用にファイルを作成。ファイルが存在する場合はそのファイルの内容は破棄する。

“a”追加書き込みのために既存ファイルを開く。ファイルが存在しない場合には作成する。

“r+”読み書き用にファイルを開く。ファイルは存在していなければならない。

“w+”読み書き用にファイルを作成。ファイルが存在する場合には,そのファイルの内容は破棄する。

“a+”読込みと追加の両方のモードでファイルを開く。ファイルが存在しない場合は作成する。

Page 14: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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 );

名前

学籍番号

点数

Page 15: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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”という名前でファイルをオープン(書き込み用)

データをファイルに書き込み

ファイルを閉じる

Page 16: プログラミング入門2 - shibaura-it.ac.jpyaoki/pro2/pro2-07.pdfgcc math2.c -o math2 -lm 11 プログラミング入門2 21 その他の数学関数の例(他にもあります)

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=?