TNP資料室 @ ウィキ

forの使い方について

最終更新:

kokeiro

- view
だれでも歓迎! 編集

forの使い方について

 この項目で学ぶこと

forの使い方

 プログラムを作成していると、同じよう処理を繰り返すことがよくあります。そのような処理を効率よく行うための制御文のひとつにforがあります。機能が多いのでしっかり覚えましょう。まずサンプルソースを見てみましょう。「変数++」は変数の値を+1する演算子です。

変数の値を5回表示する

#include<stdio.h>
int main (){
	int i;				// カウンタは慣例的に「i」を用いる
	for( i=0 ; i<5 ; i++ ){		// 初期設定式;条件式;再設定式
		printf("iの値は%d\n",i);
	}
	return 0;
}
これの実行結果は
iの値は0
iの値は1
 :
iの値は4
と表示されます。for文は一般に以下のような形をしています。
for( 初期設定式 ; 条件式 ; 再設定式 ){
	ここの処理を繰り返す
}
 初期設定式とは、for文が実行されるとき、一番はじめに一度だけ実行される式です。
条件式を満たさないとき(偽のとき)ループ処理が終了します
{}(ブロック)の最後まで来たとき、再設定式が実行されます
 ややこしいですね。順番に動作を見てみましょう。
1.初期設定式を実行する
2.条件式を計算する 真なら3へ 偽ならループ終了
3.ブロック内の処理を実行する
4.再設定式を実行する → 2へ
 はじめのうちは「これ5回実行されんの?それとも6回実行されんの?」と、戸惑うかもしれません。そのうち慣れます。定められた回数をループするとき、特別な理由がなければカウンタを0から始めてください。これは後の項目で習う配列を意識しているためです。

こんなかんじ

int i;
//5回実行したいとき
for( i=0 ; i<5 ; i++)
// 10回実行したいとき
for( i=0 ; i<10 ; i++ )

break文の使い方

 switch文で登場したbreak文と機能はほとんど一緒です。ループ中にbreakを実行するとそのループから抜けます。普通、if文によって特定の条件を満たしたときにbreakするようにして使います

( )内の省略

forの直後の( )内は、それぞれ省略することが出来ます。ただし、セミコロンを省略することはできません。条件式を省略した場合、break文を使用しないかぎりループを終えることが出来ません。これを無限ループといいます。全てを省略したソースを紹介します。
#include<stdio.h>
int main (){
	int i;
	i=0;
	for(  ;  ;  ){
		printf("iの値は%d\n",i);
		i++;
		if( i>3 )		// iが3より大きいなら
			break;		// ループを抜ける
	}
	return 0;
}

二重ループ

ループの中にループを書くことが出来ます。これを二重ループといいます。慣れるまでは動作が分かりにくいかもしれません。サンプルソースと実行結果を見てみましょう。

二重ループをして、実行された順番を見るためのプログラム

#include<stdio.h>
int main (){
	int i,j;
	for( i=0 ; i<3 ; i++ ){
		printf("外側のループの%d週目です\n",i+1);
		for( j=0 ; j<2 ; j++ ){
			printf("\t内側のループの%d週目です\n",j+1);
		}
	}
	return 0;
}

実行結果

外側のループの1週目です
	内側のループの1週目です
	内側のループの2週目です
外側のループの2週目です
	内側のループの1週目です
	内側のループの2週目です
外側のループの3週目です
	内側のループの1週目です
	内側のループの2週目です
printf関数内で使用している¥tはキーボードのTabキーの役割をします。字下げですね。
 さて、内側のループで特定の条件を満たしたときに、2重ループをbreak文を使って抜けたいとします。どうすればいいでしょうか。何も考えないでその場でbreakしたソ-スを紹介します。

1週目で j==1 の条件を満たしてループ全体を抜けたかったのに、失敗した例

#include<stdio.h>
int main (){
	int i,j;
	for( i=0 ; i<3 ; i++ ){
		printf("外側のループの%d週目です\n",i+1);
		for( j=0 ; j<2 ; j++ ){
			if( j==1 )
				break;
			printf("\t内側のループの%d週目です\n",j+1);
		}
	}
	return 0;
}

実行結果

外側のループの1週目です
	内側のループの1週目です
外側のループの2週目です
	内側のループの1週目です
外側のループの3週目です
	内側のループの1週目です

最初のbreak文のあと、再び外側のループに拾われてしまいうまく抜けることが出来ませんでした。解決するにはループを抜けるためのフラグを用いるとうまくいきます。

#include<stdio.h>
int main (){
	int i,j;
	int BreakFlag = 0;			// 0はフラグが立っていないことを示す
	for( i=0 ; i<3 ; i++ ){
		printf("外側のループの%d週目です\n",i+1);
		for( j=0 ; j<2 ; j++ ){
			if( j==1 ){		// 条件を満たしたら
				BreakFlag = 1;	// フラグを立てる
				break;		// 内側のループを抜ける
			}
			printf("\t内側のループの%d週目です\n",j+1);
		}
		if( BreakFlag ==1 )		// フラグが立っていたら外側のループを抜ける
			break;
	}
	return 0;
}

実行結果

外側のループの1週目です
	内側のループの1週目です

 うまくいきましたね。フラグを用いた分岐はゲームを作る際に重要になります。フラグの値は1を立っている状態とする必要はありませんが、一般的に偽と真に対応する0と1かで管理することが多いようです。

サンプルソース

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

目安箱バナー