for 文

for 文

ループ(繰り返し)構文、「for」文について。
サイト全体の目次

稿


稿

for 文

このセクションのソース

預金を月ごとに複利計算するプログラムを使って、ループ(繰り返し)構文、「for」文を説明します。その前に、ループをやると無限ループといってループ処理から抜けられなくなることがあるので対策を先に書いておきます。ループ処理に限りませんが、プログラムを途中で強制終了させたい時は「Ctrl + c」で終了できます。重要ですので覚えておいてください。ではこのセクションのソースを示します。

/*01*/ #include <stdio.h>
/*02*/ 
/*03*/ main()
/*04*/ {
/*05*/   float principal; /*元金*/
/*06*/   float months;    /*月数*/
/*07*/   float y_rate;    /*利率(年利)*/
/*08*/   float m_rate;    /*合計*/
/*09*/   int count;
/*10*/ 
/*11*/   printf(" 元金を入力してください ---------</C> ");
/*12*/   scanf("%f", &principal);
/*13*/   printf(" 利率(年利:%%)を入力してください -> ");
/*14*/   scanf("%f", &y_rate);
/*15*/   printf(" 何ヶ月の預金ですか? -----------</C> ");
/*16*/   scanf("%f", &months);
/*17*/ 
/*18*/   m_rate = y_rate / 12;    /*年利から月利を計算*/
/*19*/ 
/*20*/   for(count = 0; count < months; count++)
/*21*/     principal += principal * (m_rate / 100);
/*22*/ 
/*23*/   printf("\n %.1f 円に増えます。\n", principal);
/*24*/ 
/*25*/   return 0;
/*26*/ }

List-2.3.1-20

for 文です。for 文は実行文を n 回繰り返すという処理をします。この例では「months」の回数だけ、命令をグルグルまわしています。次の例を見てください。

for(count = 0; count < months; count++)
    principal += principal * (m_rate / 100);

/*書式
for([1]条件式用変数の初期化; [2]条件式; [3]条件式用変数値の増加) 実行文;
*/

まず、[1]で条件式用の変数を初期化します。普通は「i = 0(上では count = 0)」としますが、必要に応じて好きな値にしてかまいません。この初期化は for 文に入った1番最初だけ行なわれます。

次に[2]で条件の判断をし、それが「true」ならば、ループ処理を続け、「false」ならばループ処理を抜けます。この条件式も自由(「i <= 10」のよう)にしてかまいません。例えば

/*** パターン1 ***/
for(i = 1;i <= 10;i++)
/*** パターン2 ***/
for(i = 0;i < 10;i++)

はいずれも「10回」繰り返すことになります (*1) 。

単にループすることが目的な場合は「パターン2」を使うことが一般的です。

[3]では、条件式用の変数値を増加させます。ここは、初期化と違いループされるごとに行なわれます。(ただし、一番最初のループ時は、初期化で「0」にされるため飛ばされます。)また、インクリメント演算子以外にも好きな方法で値をかえてかまいません。例えば「i += 2」「i--」などとしてもかまいません。ですが、「i = 10」などとやってしまうといつまでたっても条件式用変数の値が変わらず、無限ループになってしまうので注意してください。また、「i++」「++i」の違いですがこれは、まず条件式の判定してから条件式用変数の値を変更するので、どちらにしても変わりはありません。

if 文と同様ブロックを使うことで複数の実行文を for 文で実行させることができます。それから、条件式用の変数を実行文中で使うときは注意してください。

for(count = 0; count < 10; count++){
    count += 5;
    printf("count = %d\n", count);
}

などとやってしまうと、実行文中で変更した条件式用変数の値はそのまま保持されてしまうので、この場合ループは1回で終わってしまいます。また、ループを抜けても条件式用変数の値は保持されるので、必要があれば(ないと思いますが)使うことが出来ます。

ところで、[1][2][3]の各項目は省略することが出来ます。例えば、for 文に入る前に条件式用の変数を初期化してあれば[1]を省略したり、for 文の中で条件式用の変数を意識的に変更したい場合は[3]を省略しても良いでしょう。また、[2]の条件処理を省略したり、「1(真)」と書いたりすれば無限ループといって、永久にグルグル処理を続けます。しかし、これらのような応用的な使い方は次にやる while 文でほとんど代用できるので、for 文はできるだけ「n 回処理をする」ために使いましょう。ちなみに、無限ループから抜けるための方法は後ほど書きますので参考にして下さい。もし、やってしまったらとりあえず「Ctrl + c」で強制終了させてください。

それと for 文の中に for 文を入れても(好きなだけ)かまいません。また、そのような場合を2重ループなどと言ったりします。

C99 では[1]の部分で条件式用の変数を宣言することができます。例えば

for(int count = 0; count < 10; count++){
    printf("count = %d\n", count);
}

のようにします。この場合、count のスコープ(有効範囲)がどうなるのかという疑問がでてきますが、これは
{
	int count;
	for(count = 0; count < 10; count++){
		printf("count = %d\n", count);
	}
}

と読むことができます。つまり、for 文の中でのみ有効な変数として扱われるわけです。

list-2.3.1-23

変換文字の使い方について復習しておきます。

printf("\n %.1f 円に増えます。\n", principal);

この「.1」は、「小数部分は一桁だけ表示する(四捨五入で)。」という意味でした。ここの部分は
%-x.y(変換文字)    例:%6.2f    :%-5d

という書式です。「-」なしで整数部分を書くと、小数点も含めて「x」桁分の領域に「右詰」で出力します。「-」を付けると、「左詰」になります。「.y」は小数部分を何桁表示するか指定します。「x」「.y」はいずれも無理に書く必要はありません。

練習問題

問題-2.3.1

自然数 x を読み込んで、1 から x までの総和を求めてください

問題-2.3.2

for 文による二重ループを利用して九九表を表示させてください。

練習問題回答例

問題-2.3.1

#include <stdio.h>

main()
{
	int i, x, wa = 0;

	printf("整数値を入力して下さい。 ->");
	scanf("%d", &x);

	for(i = 1; i <= x; i++){
		wa += i;
	}

	printf("1~%d までの和 -> %d\n", x, wa);

	return 0;
}

問題-2.3.1

外側のループの変数を「行」、内側のループの変数を「列」として、その積を利用する。

#include <stdio.h>

main()
{
	int i, j;

	for(i = 1; i <= 9; i++){
		for(j = 1; j <= 9; j++){
			printf("%2d ", i * j);
		}
		printf("\n");
	}

	return 0;
}


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.