Transcript PPT

情報処理Ⅱ
2006年10月20日(金)
本日学ぶこと

制御文



for, while, do~while
if~else, switch~case
問題


九九の表を出力できる?
1st, 2nd, 3rd, 4th, …,
1000th と順番に序数を生成
できる?
2
ダイクストラの構造化プログラミング

プログラムは,「順接」,「反復」,「分岐」の組み合わせで表
現できる.
順接
反復
処理1
条件
条件
処理
条件を満たす
ときの処理
処理2
分岐
条件を満たさ
ないときの処理
3
for

よく使う
構文

for (初期化; 条件; 増分) {
処理
}
•


初期化
最初に「条件」を満たしていな
ければ,1回も「処理」をしない.
条件
処理
増分
4
0, 0.1, ..., 1.0 を取り出すには



ループ用の変数iは整数型にする.
for文を用いて,i の値を 0, 1, ..., 10 と変えるよ
うにする.
i / 10.0 は,0, 0.1, ..., 1.0 となる.
for (i = 0; i <= 10; i++) {
iの初期値は0
iは10まで
(for i less than
or equal to 10)
iの値を1増やす
i = i + 1 と等価
5
九九プログラム

方針


1≦i≦9, 1≦j≦9の各(i,j)について,i * jを計算する.
1≦j≦9のそれぞれのjの値に対して,
1≦i≦9のそれぞれのiの値との積を計算し,出力する
for (j = 1; j <= 9; j++) {
for (i = 1; i <= 9; i++) {
printf("%2d ", i * j);
}
printf("\n");
}
for文の中にfor文…
for文の「入れ子
(ネスト)」という
i=3, j=9
6
while

よく使う
構文

while (条件) {
処理
}
•


条件
最初に「条件」を満たしていな
ければ,1回も「処理」をしない.
処理
7
whileとfor
while

while文をfor文で記述可能


空文
(くうぶん)
for文をwhile文で記述可能


for (; 条件;) {
処理
}
条件
処理
for
初期化
条件
処理
増分
初期化
while (条件) {
処理
増分
}
使い分けは?


for: 「反復の回数」や「初期化と増分」が決まっているとき
while: 「反復の回数」や「増分」が不確定・不規則なとき
8
do~while

構文

do {
処理
} while (条件);
たまに使う
セミコロンを忘れずに
•



少なくとも1回は「処理」をする.
while文で記述可能

処理がbreakを含む場合は
やや煩雑
処理
条件
9
if

よく使う
構文

if (条件) {
処理
}
条件
•

処理

if (条件) {
条件を満たすときの処理
} else {
条件を満たさないときの処理
}
条件
•

•

条件を満たす
ときの処理
条件を満たさ
ないときの処理
10
多分岐(1)

たまに使う
構文

if 文の入れ子
if (条件1) {
if (条件2) {
条件1~2をともに満たすときの処理
} else {
条件1を満たすが,条件2を満たさないときの処理
}
} else {
条件1を満たさないときの処理
}
•
–
•
–
•

•

11
多分岐(2)

よく使う
構文

if (条件1) {
条件1を満たすときの処理
} else if (条件2){
条件1は満たさず,条件2を満たすときの処理
} else if (条件3) {
条件1~2は満たさず,条件を3を満たすときの処理
} else {
条件1~3のいずれも満たさないときの処理
}
•

•

•

•

12
AND条件とOR条件

よく使う
構文

if (条件1 && 条件2) {
条件1~2をともに満たすときの処理
} else {
条件1~2の少なくとも一方を満たさないときの処理
}
if (条件1 || 条件2) {
条件1~2の少なくとも一方を満たすときの処理
} else {
条件1~2をともに満たさないときの処理
}
•

•


•

•

13
序数プログラム

方針


1≦number≦1000の各整数に対して(for文を用いて),
その序数となる単語を求めて出力する
出力方法
• printf("%dst", 1); ⇒ 1st
• printf("%dnd", 2); ⇒ 2nd
• printf("%drd", 3); ⇒ 3rd
• printf("%dth", 4); ⇒ 4th
14
序数プログラム

方針(つづき)


接尾辞のつけかた
• 下2桁が「11」,「12」もしくは「13」のとき,"th"
• 下1桁が「1」のとき,"st"
• 下1桁が「2」のとき,"nd"
• 下1桁が「3」のとき,"rd"
• それ以外は,"th"
下?桁
• 整数xの下1桁 ⇒ xを10で割った余り ⇒ x % 10
• 整数xの下2桁 ⇒ xを100で割った余り ⇒ x % 100
15
switch~case


多分岐を実現するもう一つの方法
構文
 switch (整数値) {
case 値1:
コロン
整数値
値1の処理
break;
case 値2:
値2の処理
値1の処理
break;
break
…
default:
それ以外の処理
}
たまに使う

•
•

•
値2の処理
…
それ以外
の処理
•
break


•

16
switch~caseにbreakが
なかったら

滅多に使わない
構文


switch (整数値) {
case 値1:
値1の処理
case 値2:
値2の処理
…
default:
それ以外の処理
}
整数値
値1の処理
•

値2の処理
•

…

•

それ以外
の処理
17
序数プログラムを書き換える

ifをswitch~caseに置き換える
18
制御文に関する補足



ブロック
breakとcontinue
無限ループ
19
ブロック

「{ 処理 }」をブロック(複合文)という


「処理」には複数の文が書ける.
• セミコロンまでが一つの文.
• 制御文を用いた if (…) {…} なども(セミコロンはなくて
も)一つの文.
ブロックの先頭で,変数を宣言できる.この変数は,ブロックが
終わると利用できなくなる.
20
{ と } が省略可能なとき

「処理」が一つの文のときは,{ と } を省略できる.

if (条件)
処理
•

ただし,条件を満たすときにする処理,満たさないときにする
処理が紛らわしくなるので,常に { と } をつけるようにし
ておくとよい
if (条件)
処理1;
処理2;
if (条件) {
処理1;
処理2;
}
if (条件1)
if (条件2)
処理1;
else
処理2;
if (条件1) {
if (条件2)
処理1;
} else
処理2;
違う!
違う!
条件の真偽にかかわらず
処理2を実行する.
条件1が真,条件2が偽のとき
に限り,処理2を実行する.
21
breakとcontinue

break


for, while, do, switchの処理の中で使用でき,それ
ぞれのブロックを抜ける.
continue


breakは
よく使う
for, while, doの処理の中で使用でき,反復の先頭に戻
る.
• forでは,増分してから条件判定へ
• while, doでは,ただちに条件判定へ
注意点


ifやelseのブロックでbreakをすると,そのブロックではなく,
すぐ外の(forなどの)ブロックを抜ける
入れ子の中から一気に抜けることはできない(gotoが必要)
22
無限ループ

たまに使う
例

while (1) {
処理
}
for (;;) {
処理
}
•


条件
(恒真)
処理
•


注意点

通常は,「処理」の中にif文を設け,何らかの条件でbreakに
よって抜けるように書く.
23
まとめ




「反復」は,for, while, do~while
「分岐」は,if, switch~case
制御文は入れ子にできる.「{」と「}」の対応に注目して読む
breakはブロックを抜け,continueは反復の先頭に戻る.
適用される制御文に注意
24