• 検索結果がありません。

PowerPoint Presentation

N/A
N/A
Protected

Academic year: 2021

シェア "PowerPoint Presentation"

Copied!
16
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング入門2

芝浦工業大学情報工学科

青木 義満

第7回

文字列

数学関数

ファイルの入出力

今回の講義内容

文字列

文字列の配列の扱い

関数への受け渡し

数学関数の利用

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

ファイル入出力

(2)

プログラミング入門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の文字型の配列

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

文字列の表示・初期化

文字列を printf関数 で表示

変換指定: %s を使用

文字配列の初期化

前ページの例のように,一文字づつの代入は大変

以下の形式で,配列にまとめて文字を代入可能

配列の要素数は省略可能

printf( “文字列は%sです¥n”, str );

変換指定

配列名を指定

(a)

char ss[ ] = { „A‟, „B‟, „C‟, „D‟, „¥0‟ };

(4)

プログラミング入門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 );

文字列用変換指定

配列名

(文字配列の場合,&は不要!)

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

}

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

文字列の配列の実現

ソースファイル名: 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関数は,文字列の場合,&は いらない!

数学関数の必要性

先週の課題

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…

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

数学関数

(8)

プログラミング入門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

(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

数学関数の使用例(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)

ソースファイル名: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のインクルードを忘れずに!

コンパイル方法

(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用)

*三角関数の角度はラジアン

ファイルとは何か?

これまでのプログラム

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

保存されない

変数の寿命は有限

ファイルの必要性

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

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

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

ファイルの入出力

(12)

プログラミング入門2 23

ファイルとは?

文章,画像,音楽データ

→ ファイルとして保存

ファイルの構造

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

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

ハードディスク,フロッピーディスク

CD-ROM,メモリ-カード 等

バイト単位の

データの連なり

ファイル

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

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

ファイルを開く

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

どのような形式で?

(テキスト or バイナリ, Read or Write)

データの書き込み

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

ファイルを閉じる

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

(13)

プログラミング入門2 25

ファイルを開く ~ fopen関数

データを書き込む先の

”ファイル名” を指定

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

書き込み用

読込み用

読み書き用

ファイルを開く操作

FILE *fp;

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

file.txt

(ファイル)

FILE *fp

(ファイルポインタ)

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

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

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

モード

意味

“r”

読込み用にファイルを開く。ファイルが存在しない場合や

見つからない場合は失敗する。

“w”

書き込み用にファイルを作成。ファイルが存在する場合は

そのファイルの内容は破棄する。

“a”

追加書き込みのために既存ファイルを開く。ファイルが存

在しない場合には作成する。

“r+”

読み書き用にファイルを開く。ファイルは存在していなけ

ればならない。

“w+”

読み書き用にファイルを作成。ファイルが存在する場合に

は,そのファイルの内容は破棄する。

“a+”

読込みと追加の両方のモードでファイルを開く。ファイル

が存在しない場合は作成する。

(14)

プログラミング入門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 );

名前 学籍番号 点数

(15)

プログラミング入門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”という名前でファイルをオープン (書き込み用) データをファイルに書き込み ファイルを閉じる

(16)

プログラミング入門2 31

演習課題

1 )名前の入力とファイルへの書き込み(kada7-1.c)

 キーボードから数人分の氏名を入力し,入力した氏名データを画面表示した上 で,以下のようにテキストファイルに保存せよ。

2)数学関数を用いた数値計算(kadai7-2.c)

2つのベクトルの成分

P

1

(x1, y1),

P

2

(x2, y2) をキーボードから入

力し,内積の値を利用して,2つのベクトルの成す角度θ(°)を求めよ。

name.txt

Aoki Tokunaga Okura Morishima Komiya ・・・・・・ ・・・・・・ char name[NUM][128]; scanf

fprintf

参考:

o P1 (x1, y1) P1 (x1, y1) θ

)

(

cos

cos

cos

*

*

2 1 2 1 1 2 1 2 1 2 1 2 1 1 2 1 2 1 2 1 2 1 2 1

P

P

P

P

P

P

P

P

y

x

P

P

P

P

P

y

y

x

x

P

P

  

  

cos-1 : アークコサイン → acos関数使用 θはラジアンで出るので, 角度(°)に変換して表示

演習課題

3) 数学関数を用いた数値計算(kadai7-3.c)

以下の2次方程式の係数(a, b, c)を入力し,その方程式の解が

① 実数解(2つ)

② 実数解(1つ(重解))

③ 虚数解

のどの解を持つかを判別せよ。

また,実数解を持つ(①,②)場合には,その解を求めて表示せよ。

0

2

c

bx

ax

解の判別 X=?

参照

関連したドキュメント

【ご注意点】 ・カタログの中からお好みの商品を1点お 選びいただき、同封のハガキに記載のお

日本語で書かれた解説がほとんどないので , 専門用 語の訳出を独自に試みた ( たとえば variety を「多様クラス」と訳したり , subdirect

(7)

利用している暖房機器について今冬の使用開始月と使用終了月(見込) 、今冬の使用日 数(見込)

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)

3.8   ブラベンダービスコグラフィー   ブラベンダービスコグラフを用い、乾燥した試料を 450ml の水で測 定容器に流し込み、液温が