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

£Ã¥×¥í¥°¥é¥ß¥ó¥°ÆþÌç (2018) - Â裵²ó ¨¡ À©¸æ¹½Â¤¡§¾ò·ïʬ´ô ¨¡

N/A
N/A
Protected

Academic year: 2021

シェア "£Ã¥×¥í¥°¥é¥ß¥ó¥°ÆþÌç (2018) - Â裵²ó ¨¡ À©¸æ¹½Â¤¡§¾ò·ïʬ´ô ¨¡"

Copied!
43
0
0

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

全文

(1)

.

.

Cプログラミング入門

(2018)

第5回

─ 制御構造:条件分岐 ─

松田七美男

2018

5

17

(2)

分岐とは

.

.

条件式の論理値(真偽)によって処理先を

変える機構で,あらゆるプログラミング言

語に必須のもの.

必要な構成要素

I

論理値

0

を偽,非

0

を真

として扱う

I

演算

:論理演算子,比較演算子

I

構文

if

文,

switch

文,条件演算子

(3)

分岐とは

.

.

条件式の論理値(真偽)によって処理先を

変える機構で,あらゆるプログラミング言

語に必須のもの.

必要な構成要素

I

論理値

0

を偽,非

0

を真

として扱う

I

演算

:論理演算子,比較演算子

I

構文

if

文,

switch

文,条件演算子

(4)

if

if (

条件

)

.

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が偽

(0)

なら何もしない

.

条件の評価値が偽

(0)

なら何もしない

.

文の書法

..

.

I

(

)

文の終わりはセミコロン

;

I

複合文

:複数の文を中括弧で囲んだもの

(5)

if

if (

条件

)

.

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が偽

(0)

なら何もしない

.

条件の評価値が偽

(0)

なら何もしない

.

文の書法

..

.

I

(

)

文の終わりはセミコロン

;

I

複合文

:複数の文を中括弧で囲んだもの

(6)

if

if (

条件

)

.

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が偽

(0)

なら何もしない

.

条件の評価値が偽

(0)

なら何もしない

.

文の書法

..

.

I

(

)

文の終わりはセミコロン

;

I

複合文

:複数の文を中括弧で囲んだもの

(7)

if

if (

条件

)

.

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が真

(

0)

なら文を実行

.

条件の評価値が偽

(0)

なら何もしない

.

条件の評価値が偽

(0)

なら何もしない

.

文の書法

..

.

I

(

)

文の終わりはセミコロン

;

I

複合文

:複数の文を中括弧で囲んだもの

(8)

if else

if (

条件

)

1

else

2

.

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

複数の処理をさせる場合の記述法

..

.

8

if (...) A;B; else C;D;

if (...)

{

A;B;

}

else

{

C;D;

}

すなわち,

複文

にする.

(9)

if else

if (

条件

)

1

else

2

.

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

複数の処理をさせる場合の記述法

..

.

8

if (...) A;B; else C;D;

if (...)

{

A;B;

}

else

{

C;D;

}

すなわち,

複文

にする.

(10)

if else

if (

条件

)

1

else

2

.

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

複数の処理をさせる場合の記述法

..

.

8

if (...) A;B; else C;D;

if (...)

{

A;B;

}

else

{

C;D;

}

すなわち,

複文

にする.

(11)

if else

if (

条件

)

1

else

2

.

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が真

(

0)

なら文

1

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

条件の評価値が偽

(0)

なら文

2

を実行

.

複数の処理をさせる場合の記述法

..

.

8

if (...) A;B; else C;D;

if (...)

{

A;B;

}

else

{

C;D;

}

すなわち,

複文

にする.

(12)

例題:

ex11.c

 

...

int main(int argc, char **argv)

{

double x;

printf("x = ");

scanf("%lf",&x);

printf("x = %g > ", x);

if (x)

{

printf("True\n");

}

else

{

printf("False\n");

}

return 0;

}

 

.

.

stdio.h, stdlib.h, math.h

include

.

コンパイル命令

..

.

(13)

例題:

ex11.c

 

...

int main(int argc, char **argv)

{

double x;

printf("x = ");

scanf("%lf",&x);

printf("x = %g > ", x);

if (x)

{

printf("True\n");

}

else

{

printf("False\n");

}

return 0;

}

 

.

.

stdio.h, stdlib.h, math.h

include

.

コンパイル命令

..

.

(14)

例題:

ex11.c

 

...

int main(int argc, char **argv)

{

double x;

printf("x = ");

scanf("%lf",&x);

printf("x = %g > ", x);

if (x)

{

printf("True\n");

}

else

{

printf("False\n");

}

return 0;

}

 

.

.

stdio.h, stdlib.h, math.h

include

.

コンパイル命令

..

.

(15)

例題:

ex12.c

 

int main(int argc, char **argv) {

double x, y; printf("x, y = ");

scanf("%lf, %lf", &x, &y);

printf("(%4.2f,%4.2f) > ", x, y); if (x > 0) { if (y > 0) printf("1st quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("4th-quadrant\n"); } else if (x == 0) { if (y == 0) printf("origin\n"); else printf("y-axis\n"); } else { /* x < 0 */ if (y > 0) printf("2nd quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("3rd-quadrant\n"); } return 0; }  

q

.

コンパイル命令

..

.

(16)

例題:

ex12.c

 

int main(int argc, char **argv) {

double x, y; printf("x, y = ");

scanf("%lf, %lf", &x, &y);

printf("(%4.2f,%4.2f) > ", x, y); if (x > 0) { if (y > 0) printf("1st quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("4th-quadrant\n"); } else if (x == 0) { if (y == 0) printf("origin\n"); else printf("y-axis\n"); } else { /* x < 0 */ if (y > 0) printf("2nd quadrant\n"); else if (y == 0) printf("x-axis\n"); else printf("3rd-quadrant\n"); } return 0; }  

q

.

コンパイル命令

..

.

(17)

関係演算子

演算子

意味

結果: 真なら1,偽なら 0

<

より小さい

x < y

x

y

より小さければ

1

,でないなら

0

<=

以下

x <= y

x

y

以下ならば

1

,で ないなら

0

>

より大きい

x > y

x

y

より大きければ

1

,でないなら

0

>=

以上

x >= y

x

y

以上ならば

1

,で ないなら

0

==

等しい

x == y

x

y

が等しければ

1

でないなら

0

!=

等しくない

x != y

x

y

が等しくなければ

1

,でないなら

0

(18)

論理演算子

演算子

意味

結果: 真なら1,偽なら 0

&&

論理積

(x ∧ y)

x && y

x

y

がともに真ならば

1

,でないなら

0

||

論理和

(x ∨ y)

x || y

x

y

の少なくとも一方 が真ならば

1

,でないな

0

!

否定

(¬x)

!x

x

が真でないならば

1

でないなら

0

.

論理演算子の対象

..

.

関係演算子や論理演算子の表では単純な変数

x

y

を例にし

ているが,一般には式もよい.例えば

(x == 1) && (y != 3)

: 「

x

1

,かつ

y

3

でない」

(19)

論理演算子

演算子

意味

結果: 真なら1,偽なら 0

&&

論理積

(x ∧ y)

x && y

x

y

がともに真ならば

1

,でないなら

0

||

論理和

(x ∨ y)

x || y

x

y

の少なくとも一方 が真ならば

1

,でないな

0

!

否定

(¬x)

!x

x

が真でないならば

1

でないなら

0

.

論理演算子の対象

..

.

関係演算子や論理演算子の表では単純な変数

x

y

を例にし

ているが,一般には式もよい.例えば

(x == 1) && (y != 3)

: 「

x

1

,かつ

y

3

でない」

(20)

排他的論理和

否定 論理積 論理和 排他的論理和 含意

¬p

p

q

p

∧ q

p

∨ q

p

Y q

p

⇒ q

F

T

T

T

T

F

T

F

T

F

F

T

T

F

T

F

T

F

T

T

T

T

F

F

F

F

F

T

日常会話での「または」は,論理和ではなく排他的論理和を

表現している場合があるので注意が必要.

C

言語では排他的

論理和の演算子は定義されていないので,以下のような論理

表現を用いることになる.

p

Y q = (p ∧ ¬q) ∨ (¬p ∧ q)

(21)

例題:

ex12.c

の別方法

 

int main(int argc, char **argv) {

double x, y; printf("x, y = ");

scanf("%lf, %lf", &x, &y);

printf("(%4.2f,%4.2f) > ", x, y);

if (x > 0 && y > 0) printf("1st quadrant\n"); if (x < 0 && y > 0) printf("2nd quadrant\n"); if (x < 0 && y < 0) printf("3rd quadrant\n"); if (x > 0 && y < 0) printf("4th quadrant\n"); if (x != 0 && y == 0) printf("x-axis\n"); if (x == 0 && y != 0) printf("y-axis\n"); if (x == 0 && y == 0) printf("origin\n"); return 0; }  

.

短所

..

.

if

文を

8

回実行

(22)

例題:

ex12.c

の別方法

 

int main(int argc, char **argv) {

double x, y; printf("x, y = ");

scanf("%lf, %lf", &x, &y);

printf("(%4.2f,%4.2f) > ", x, y);

if (x > 0 && y > 0) printf("1st quadrant\n"); if (x < 0 && y > 0) printf("2nd quadrant\n"); if (x < 0 && y < 0) printf("3rd quadrant\n"); if (x > 0 && y < 0) printf("4th quadrant\n"); if (x != 0 && y == 0) printf("x-axis\n"); if (x == 0 && y != 0) printf("y-axis\n"); if (x == 0 && y == 0) printf("origin\n"); return 0; }  

.

短所

..

.

if

文を

8

回実行

(23)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(24)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(25)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(26)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(27)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(28)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(29)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(30)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(31)

switch (case)

整数式

0

の値によって処理先を複数変える(

多重分岐

switch (

整数式

0

) {

case

整数

A

:

1

break;

case

整数

P

:

case

整数

Q

:

2

break;

default:

f

break;

}

.

.

整数式0 の値が

.

整数

A

(定数)に等しい場合は,

.

1

を実行

.

外に出る

.

整数

Q

(定数)に等しい場合は,

.

2

を実行

.

break(

外に出る

)

.

整数

P

(定数)に等しい場合は,

.

文も

break

もないので下に降りて

.

2

を実行

.

break(

外に出る

)

.

上記以外の場合には,

default

.

f

を実行

.

break(

外に出る

)

(32)

条件演算子

.

条件演算子

..

.

唯一の3項演算子.

式を形成するので値を持つ

こと

if else

文などとは違う.

0

?

1

:

2

.

.

0

が真ならば 式

1

を評価

.

0

が真ならば 式

1

を評価

.

0

が偽ならば 式

2

を評価

.

0

が偽ならば 式

2

を評価

例)

max = (a > b) ? a : b

(33)

条件演算子

.

条件演算子

..

.

唯一の3項演算子.

式を形成するので値を持つ

こと

if else

文などとは違う.

0

?

1

:

2

.

.

0

が真ならば 式

1

を評価

.

0

が真ならば 式

1

を評価

.

0

が偽ならば 式

2

を評価

.

0

が偽ならば 式

2

を評価

例)

max = (a > b) ? a : b

(34)

条件演算子

.

条件演算子

..

.

唯一の3項演算子.

式を形成するので値を持つ

こと

if else

文などとは違う.

0

?

1

:

2

.

.

0

が真ならば 式

1

を評価

.

0

が真ならば 式

1

を評価

.

0

が偽ならば 式

2

を評価

.

0

が偽ならば 式

2

を評価

例)

max = (a > b) ? a : b

(35)

条件演算子

.

条件演算子

..

.

唯一の3項演算子.

式を形成するので値を持つ

こと

if else

文などとは違う.

0

?

1

:

2

.

.

0

が真ならば 式

1

を評価

.

0

が真ならば 式

1

を評価

.

0

が偽ならば 式

2

を評価

.

0

が偽ならば 式

2

を評価

例)

max = (a > b) ? a : b

(36)

条件演算子

.

条件演算子

..

.

唯一の3項演算子.

式を形成するので値を持つ

こと

if else

文などとは違う.

0

?

1

:

2

.

.

0

が真ならば 式

1

を評価

.

0

が真ならば 式

1

を評価

.

0

が偽ならば 式

2

を評価

.

0

が偽ならば 式

2

を評価

例)

max = (a > b) ? a : b

(37)

例題:

ex14.c

 

#include <stdio.h> #include <stdlib.h> #include <math.h>

int main(int argc, char **argv) { int n; double x; printf("x = "); scanf("%lf", &x); printf("%f > ", x); n = x ? printf("True\n") : printf("False\n"); printf("printed characters = %d\n", n); return (0); }  

(38)

構造化プログラミング

処理を小さな単位に分解し,交差のない階層的な構

造に組み上げると,全体の見通しがよいプログラム

となる.

.

構造化定理

..

.

1つの入口と1つの出口を持つようなプログラムは,次の3

つの基本的な論理構造の組合せで記述できる.

I

連接

(sequential)

I

選択

(test) ⇔

分岐

I

反復

(iteration) ⇔

繰り返し

(39)

構造化プログラミング

処理を小さな単位に分解し,交差のない階層的な構

造に組み上げると,全体の見通しがよいプログラム

となる.

.

構造化定理

..

.

1つの入口と1つの出口を持つようなプログラムは,次の3

つの基本的な論理構造の組合せで記述できる.

I

連接

(sequential)

I

選択

(test) ⇔

分岐

I

反復

(iteration) ⇔

繰り返し

(40)

構造化プログラミングのイメージ

処理を小さな単位に分解し,

交差のない

階層的な構造に組み

上げると,全体の見通しがよいプログラムとなる.

.

.

一筆書きのイメージ

(41)

構造化プログラミングのイメージ

処理を小さな単位に分解し,

交差のない

階層的な構造に組み

上げると,全体の見通しがよいプログラムとなる.

.

.

一筆書きのイメージ

.

(42)

構造化プログラミングのイメージ

処理を小さな単位に分解し,

交差のない

階層的な構造に組み

上げると,全体の見通しがよいプログラムとなる.

.

.

一筆書きのイメージ

.

(43)

構造化プログラミングのイメージ

処理を小さな単位に分解し,

交差のない

階層的な構造に組み

上げると,全体の見通しがよいプログラムとなる.

.

.

一筆書きのイメージ

.

参照

関連したドキュメント

バックスイングの小さい ことはミートの不安がある からで初心者の時には小さ い。その構えもスマッシュ

[r]

る、というのが、この時期のアマルフィ交易の基本的な枠組みになっていた(8)。

物語などを読む際には、「構造と内容の把握」、「精査・解釈」に関する指導事項の系統を

テキストマイニング は,大量の構 造化されていないテキスト情報を様々な観点から

実際, クラス C の多様体については, ここでは 詳細には述べないが, 代数 reduction をはじめ類似のいくつかの方法を 組み合わせてその構造を組織的に研究することができる

このエアコンは冷房運転時のドレン(除湿)水を内部で蒸発さ

四税関長は公売処分に当って︑製造者ないし輸入業者と同一