ループボディ

Download Report

Transcript ループボディ

第6回 制御のながれ(2)

ループ制御

for
 while
 do – while
break
 continue
 ラベルとgoto 文

繰り返し文 - for 文 
ある処理を設定した条件となるまで、何度も
繰り返し実行させる
for(初期設定式; 継続条件 ; 更新式)
文(statement) or ブロック({ 複数の文})
1. 初期設定式を評価する
ループボディ
2. 継続条件を判断して真である間
I. ループボディの処理を実行す
る
II. 更新式を評価する

式は、省略が可能であるが、セミコロンは省
略できない!!
for 文のフローチャート
for ループ 始まり
初期設定式
偽
継続判定式
真
ループボディの
処理
更新式
for ループ終了
forのプログラム例:
(1から10までを足す)
#include <stdio.h>
main(){
int i;
int sum=0;
初期設定式
継続条件
更新式
ループボディ
for( i = 1; i <= 10; i ++ )
sum = sum + i;
printf(" sum (1 – 10) = %d ∖n",sum);
}
繰り返し - while 文 条件式が真である限り、処理部の実行を繰り
返す
 書式
while( 条件式 )
処理部
 処理部は、文かブロック(複数の文を{}で括
る)
 0回以上の繰り返しに用いられる


cf. do-while
while のフローチャート
while ループ開始
条件式
ループボディ
の処理
while ループ終了
while を使ったプログラム例
i = 1;
sum = 0;
while ( i <= 10 ){
sum = sum + i;
i ++;
}
条件式
ループボディ
Q.上のwhile ループを for ループに書き直すとどうなるか?
無限ループ

while ( 1 )


for( 初期設定式; ;更新式 )


判定式が常に真であるため、無限ループとなる
継続判定式を空文にすると、常に継続となり無
限ループとなる
通常、ループボディで無限ループを終了させ
る条件分岐を入れ、break によってループを
抜け出す
do – while ループ

繰り返し(ループ)が1回以上である場合に使用する

1度は必ずループボディの処理を行う
do
文 or ブロック
while( 式 );
 繰り返すかどうかの判断は、ループボディの処理を
してから行われる。
do-while のフローチャート
ループ開始
ループ処理部
(ループボディ)
1
継続条件式
0
ループ終了
do – while の利用例 – itoa 関数 /* itoa : 整数n を 文字列s に変換する */
char* itoa(int n){
int i, sign;
char s[20];
if( (sign = n) < 0 )
n = -n;
i = 0;
do{
s[i ++] = n % 10 + '0';
}while( (n /= 10) > 0 );
if( sign < 0 )
s[i ++] = '-';
s[ i ] = '\0';
reverse(s);
return s;
}
break 文、continue 文

break 文


最も内側のループの制御または、switchから抜
け出す
continue 文
以降のループのイタレーションの処理をスキップ
して次のイタレーションに制御を移す
 while や do の場合は、テスト(判定)部分がた
だちに実行される
 for の場合は、更新式がただちに実行される

break 文の例
fp = fopen("hoge","w");
while( 1 ){
ch = getchar();
if( ch == '\n' )
無限ループの脱出に
break;
使用
putc(ch,fp);
}
fclose(fp);
continue 文の例
空白をスキップして文字数をカウント
count = 0;
while( (ch=getchar()) != EOF ){
if( isspace(ch) )
continue;
count ++;
}
ラベルとgoto 文
ラベル(名札)をつける
 制御の途中でラベルを付けることができる
 ラベルは、コロンで終端
label1:
 goto 文 … プログラム中につけられたラベルに制御を移す
goto <label_name>
例)
• ただし、goto 文は処理の流れを著
for( i = 0; i < n ; i ++)
しく見難くするだけでなく、コンパイラ
for( j = 0; j < i; j ++){
による最適化も困難にするため、使
if( v[ i ] [ j ] > 0 )
用は差し控える
goto found;
...
• goto 文を使わなくても、必ず同じ
}
制御フローは実現できる
}
found:
...
