繰り返し処理
ここからは繰り返し処理について説明します。
繰り返し処理とはある一定の回数同じ処理を行うと言うものです。また、ループ処理とも呼ばれます。
一定の回数は自分で決めることもできますし、
また、条件式を満たすまで繰り返すということも出来ます。
まず、良く使われるfor文について説明します。
for文は、大抵あらかじめ繰り返す回数がわかっている場合に使用します。
for文は
for(式1;条件式;式2){ 処理 } |
と記述します。まず、式1が実行され、条件式が真であれば処理を行い、その後式2を実行しこれを繰り返します。
ただし、式1はfor文を行う際の初めの1回しか実行されません。
つまり、条件式、処理、式2のみ繰り返されます。
また、式1を行う必要性がない場合は省略してもかまいません。
式2も同様に省略可です。
条件式を省略した場合または条件式の部分が0以外の値(真である値)のときに
switch文で使用したbreak文を使用しない限り永久に繰り返しを行います(これを無限ループと呼ぶ)。
一般に、for文での無限ループは処理以外を全て省略します。
ですが、あまり for文での無限ループは使用しないことが多いです。
例
#include <stdio.h> int main(void){ int a,i; scanf("%d",&a); for(i=0;i<a;i++){ printf("こんにちは。\n"); } return 0; } |
このプログラムでは、標準入力から入力した値の数だけ「こんにちは。」と表示します。
for文を見ると、まず、i=0で変数iが0に初期化され、i<aの条件が真のときに処理を行い、
その後、i++という式を行って、また、i<aの条件が真か偽かを評価して偽でない限り処理を行っています。
i++という式をはじめて見ると思いますが、i++とはi=i+1という式を意味しています。
i=i+1という式は数学から見れば明らかに間違った式ですが、プログラムでは、=は代入なので
この式はiという変数に、今現在のiに格納されている数字に1を足した数を代入するという意味です。
また、i--というのもあります。i--はi=i-1という意味です。
値が1つ増えることをインクリメント、逆に値が1つ減ることをデクリメントといいます。
このfor文で使用されている変数iはループのみで使用しているため、
ループのみで使用している変数をループ変数と呼びます。
そして、a=a+bという式はa+=bというふうに書くことが出来ます。a=a+bだと、aが2回も出てくるので、
a+=bと書いた方が簡潔にかけるのでそのような書き方が定義されています。
また、+=だけでなく、-=、*=、/=もあります。
上のプログラムで、iの宣言の所で0に初期化してしまえば、for文のi=0は省略できます。
また、i<aの部分をi++<aと書き換えると、for文のi++も省略できます。
これは、条件式が評価される際、評価し終わった後にiをインクリメントしています。
そして、i++が省略されているので、処理を行った後、また条件式の評価に戻るということを繰り返すことにより
繰り返し処理を行っています。
※ 一般に、for文で繰り返しのために使われる変数をループ変数と呼びます。
大抵はi、j、…とiからはじめます。多重ループ(ループの中でループを使用すること)を用いない場合は
ループ変数は、普通はiのみです。ただし、ループ変数がプログラムで重要な役割をしている場合は名前をつけます。
次の例は、先ほどのプログラムでは0からaまで(カウントアップ)でしたが、aから0まで(カウントダウン)という条件で繰り返しを行ったプログラムです。
#include <stdio.h> int main(void){ int a,i; scanf("%d",&a); for(i=a;i>0;i--){ printf("こんにちは。\n"); } return 0; } |
i--を使用することにより、カウントダウンにより繰り返しを実現しています。
i++、i--を紹介しましたが、++i、--iと言うのもあります。
違いは、i++はiが評価されてからiに1を足していたのに対して、
++iでは、この式を評価した時には、i+1の値になっています。
つまり、++iはiを評価しないと言うことです。
前者を後置増分(減分)演算子、後者を前置増分(減分)演算子と呼びます。
例
#include <stdio.h> int main(void){ int a,b; a=b=1; printf("a++=%d\n",a++); printf("++b=%d\n",++b); return 0; } |
つぎに、while文について説明します。
while文はfor文と同様に良く使われるもので、大抵繰り返し回数がわからない場合において使用します。
while文は
while(条件式){ 処理 } |
と記述します。
条件式が真である間処理を行います。
例
#include <stdio.h> int main(void){ int count=1; double a=100.0; printf("金利3.5%\n"); while(a<=200.0){ printf("%d年目:%f円\n",count,a); a*=1.035; count++; } printf("%d年目で%f円で200円を超えます。\n",count,a*1.035); return 0; } |
このプログラムは最初100円を持っており、金利3.5%であったとき、何年目で200円を超えるか
というものです。このように、while文は主に繰り返す回数がわからないときに使用します。
主にfor文は回数が分かっている、while文は回数不明のときに使用すると書きましたが、
for文はwhile文に、while文はfor文に書き換えることが出来ます。
for文は
for(式1;条件式;式2){ 処理 } |
と記述しますが、これをwhile文で記述すると
式1 while(条件式){ 処理 式2 } |
となります。
上のプログラムをfor文に書き換えると(for文のところのみ記述)
for(count=1;a<200.0;count++){ printf("%d年目:%f円\n",count,a); a*=1.035; } |
となります。
while文での無限ループはfor文と同様で、省略するか条件式の部分が真である値であるとき
無限ループとなります。ですが、真の値を1とするために普通は無限ループを使用する際は条件式の値を1とします。
例
#include <stdio.h> int main(void){ int a; while(1){ printf("負の値を入力しない限りループし続けます。\n"); scanf("%d",&a); if(a<0){ break; /*ループを抜ける*/ } } return 0; } |
このプログラムは、負の値を入力したとき、if文によってループを抜けるというプログラムです。
while文の条件式の部分に1を書くことにより、1が真である値なのでif文によりループを抜けない限りは
永遠とループし続けています。
繰り返し処理にはあともう一つdo文があります。
ほぼwhile文と変わらないのですが、while文が前判定なのに対してdo文は後判定となります。
前判定は、条件式がループの初めに評価されるのに対し、後判定はループが終わった後に判定されます。
例
#include <stdio.h> int main(void){ int a; do{ printf("負の値を入力しない限りループし続けます。\n"); scanf("%d",&a); }while(a>=0); return 0; } |
先ほどの無限ループでのプログラムをdo文に書き換えたものです。
これを、無限ループを用いないwhile文で書く場合にはscanf関数を2回書く必要があるので
do文を用いた方が、プログラムが短くなります。
このような場合にdo文を使います。