150 likes | 361 Views
第 6 回 制御のながれ(2). ループ制御 for while do – while break continue ラベルと goto 文. 繰り返し文 - for 文 -. ある処理を設定した条件となるまで、何度も繰り返し実行させる 式は、省略が可能であるが、 セミコロンは省略できない!!. for( 初期設定式; 継続条件 ; 更新式) 文 (statement) or ブロック( { 複数の文 }). 初期設定式を評価する 継続条件を判断して真である間 ループボディの処理を実行する 更新式を評価する. ループボディ.
E N D
第6回 制御のながれ(2) • ループ制御 • for • while • do – while • break • continue • ラベルとgoto 文
繰り返し文 - for 文 - • ある処理を設定した条件となるまで、何度も繰り返し実行させる • 式は、省略が可能であるが、セミコロンは省略できない!! for(初期設定式; 継続条件 ; 更新式) 文(statement)or ブロック({ 複数の文}) • 初期設定式を評価する • 継続条件を判断して真である間 • ループボディの処理を実行する • 更新式を評価する ループボディ
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> 例) for( i = 0; i < n ; i ++) for( j = 0; j < i; j ++){ if( v[ i ] [ j ] > 0 ) goto found; ... } } found: ... • ただし、goto 文は処理の流れを著しく見難くするだけでなく、コンパイラによる最適化も困難にするため、使用は差し控える • goto 文を使わなくても、必ず同じ制御フローは実現できる