情報処理II

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