2019/02/06
sponsored link
繰り返しとは?
今回はfor文についてです。前にif文というのをやりましたが、あれは条件分岐の構文でしたね。for文というのは繰り返しの構文です。
for文がどんなものか理解してもらう為に、2の累乗を計算するプログラムを作ってみます。例えば、2の5乗だと、数式にすると1×2×2×2×2×2で32になりますね。2の累乗とは1に2を何回掛けるかってことです。
この計算をプログラムにやってもらいましょう。int型変数answerを用意して、初めに1を代入してあります。そこに2を5回掛けます。
PowerOfTwo.java
public class PowerOfTwo{ public static void main(String[] args){ int answer = 1; answer = answer * 2; //1回 answer = answer * 2; //2回 answer = answer * 2; //3回 answer = answer * 2; //4回 answer = answer * 2; //5回 System.out.print("2の5乗は、"); System.out.println(answer); } }
全く同じ文「answer = answer * 2;」がいっぱい並んでいますが、意味分かりますでしょうか?
なんのこっちゃ分からない方は「=」と「*」の評価の順番を意識して(参考:演算子って何?)、変数answerの値がどう変わっていってるのか確認しながら、一行ずつ読んで下さい。要するに2の5乗を計算しています。
このクラスを実行すると、
答えも合ってます。しかし、全く同じ文を続けて5回も書くのはプログラムとしてはちょっと不細工だし、面倒です。そこで、登場するのが、for文です。
for文を使えば「{answer = answer * 2;}を5回繰り返しなさい」と書くことが出来るんです。
for文の基本的な使い方
for(5){
answer = answer * 2;
}
これで、「answer = answer * 2;」 を5回繰り返してくれ・・たら楽なんですけど、繰り返し回数の定義はもうちょっと複雑です。「for( )」の「( )」の中に繰り返しの条件を書くのですが、単に何回繰り返すかの数字を入れるわけではありません。
まず「( )」の中を「;」で区切って3つのパート(初期設定、実行条件、継続処理)に分けます。
for文の基本構文
for( 初期設定 ; 実行条件 ; 継続処理 ){ ブロック }
5回繰り返すにはどう書けばいいか、ゆっくりやっていきます。こんな丁寧に書いてるサイトないですよ~。(笑)
まず初期設定のパート、
for( int i=0; 実行条件 ; 継続処理 ){
answer = answer * 2;
}
初期設定は「int i=0」です。int変数 iを宣言して、そこに0を代入しています。この変数 iは繰り返し回数をカウントする為に使います。ここの変数名は別に何でもいいのですが、特に意味なくただのカウントとして使うのであれば普通は「i」を使うことが多いです。
続いて、実行条件のパート、
for( int i=0; i<5; 継続処理 ){
answer = answer * 2;
}
実行条件は「i<5」です。この実行条件がtrueであればブロックの中が実行されます。
初期設定ではiは0なので、「i<5」はtrueになりますね?というわけで1回目の「answer = answer * 2;」が実行されます。
続いて、継続処理のパート、
for( int i=0; i<5; i++ ){
answer = answer * 2;
}
継続処理というのは、ブロックの中を実行した後で処理される内容です。その処理をされてから次の周に進みます。
ここでは継続処理は「i++」です。この「++」というのはインクリメントというやつで、int変数の値を1増やしたい時に使います。ここでは iの値を1増やしています。
つまり、「answer = answer * 2;」を実行したら、iの値を1増やして2周目に突入です。最初iの値は0だったので1になったわけです。
2周目以降は、初期設定はもう関係ありません。初期設定の出番は当然ですが最初だけです。
で、2周目も実行条件のチェックです。さっきのインクリメントでiは1に変わっていますが、実行条件「i<5」はtrueになるので、2周目の「answer = answer * 2;」実行です。
で、同じように「answer = answer * 2;」が実行し終わったら、継続処理「i++」で iの値が2になります。そして3周目・・、と続いて行きます。
5周目のブロックを実行した後の継続処理でiの値は5になります。すると次の6周目で実行条件「i<5」がfalseとなります。実行条件がfalseになればブロック内は実行されずにfor文を抜けます。
結果的に「answer = answer * 2;」を5回実行してfor文を抜けるわけです。
for( int i=0; i<5; i++ ){ }
↑この形で書けば、実行条件パートの「i<5 」の数字の回数だけ繰り返しブロック内が実行されることになるんですね。
勘のいい人はお分かりだと思いますが、5回実行させる為の書き方なんていくらでもあります。
for( int i=1; i<=5; i++ ){ answer = answer * 2; }
この書き方でもカウント1から始まって5で終わるので結局5回実行することになるし、感覚的にはこちらの方が分かりやすい気もしますが、普通に○回繰り返しというプログラムをする時は、カウント0から始めて実行条件式は「<=」ではなく「<」を使うのが一般的です。
慣れてきたらいろんな繰り返し条件が書けるようになると思うので、とりあえずはこの基本の形を覚えたらいいと思います。
check point
- for( 初期設定 ; 実行条件 ; 継続処理 ){ ブロック }
- まず初期設定パートを実行
- 実行条件式がtrueならばブロック内を実行
- ブロック内を実行したら継続処理を実行し、実行条件式を評価
- 実行条件式がfalseならブロック内を実行せずにfor文を抜ける
- 例)5回繰り返し for(int i=0; i<5; i++){ 繰り返したい処理 }
2のn乗を計算
では、さっきの「PowerOfTwo.java」をfor文を使ってスマートに書き換えましょう。
PowerOfTwo.java
public class PowerOfTwo{ public static void main(String[] args){ int answer = 1; for( int i=0; i<5; i++ ){ answer = answer * 2; } System.out.print("2の5乗は、"); System.out.println(answer); } }
これで2の5乗を計算してくれるプログラムはばっちりです。
けど5乗しか計算できないんじゃあ面白くないので、このプログラムを、任意の整数nを与えたら2のn乗を計算できるように改造しましょう。
PowerOfTwo.java
public class PowerOfTwo{
public static void main(String[] args){
int n = 5;
int answer = 1;
for( int i=0; i<5; i++ ){
answer = answer * 2;
}
System.out.print("2の5乗は、");
System.out.println(answer);
}
}
例によって手打ち設定で申し訳ないのですが、「int n」を宣言してとりあえず5を代入しています。このnをどうするのかというと、そうです、賢明な読者様ならもうお分かりだと思います。
PowerOfTwo.java
public class PowerOfTwo{ public static void main(String[] args){ int n = 5; int answer = 1; for( int i=0; i<n; i++ ){ answer = answer * 2; } System.out.print("2の" + n + "乗は、"); System.out.println(answer); } }
これで2のn乗を計算してくれるプログラムの完成です。nの初期化部分を例によって手打ちで書き換えてもらえれば、10乗でも20乗でも一瞬のうちに計算して答えを吐き出してくれます。
nの値を変えていくつか実行した結果を載せておきます。
ただし変数answerはint型なので2の31乗-1までしか入りませんので正確に計算できるのは30乗までです。ちなみに31乗で計算すると面白い答えがでます。コンピュータが、32bitのメモリ領域で(-2の31乗)から(2の31乗-1)の数値(int型)を保持している仕組みがちょっと分かります。(参考:基本データ型について)
次回はfor文で配列を回すというのをやります。配列とfor文を使いこなせれば本格的なプログラマーの仲間入り??
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
2018/8/22の方にコメントいたします。
今回登場するfor文は繰り返し構文で、その名の通りある作業を繰り返し行う(実行する)ものになります。そして、例として出てくる2の5乗は「1×2×2×2×2×2」で1に2を5回掛けています。今回、初期設定では初期値を0と設定し、継続処理では「i++」と書きました。
for文では初めに初期設定を通過した後、実行条件に進み、true判定を受ければブロック内の作業を実行し、それから継続処理に進みます。今回のように、初期値iを0と設定した場合は、iを「今ブロック({}内の計算)内の作業を○回実行した」値と考えて見てください。そうすれば、例における2の5乗では「×2」を5回行うので、計算(ブロック内の作業を実行)する度にiの値が1ずつ増え、ちょうど5回行ったところで実行条件に引っかかり(false判定を受け)、繰り返し作業が終了するのが理解出来るかと思います。
また、『初期設定では、i は、0 なので、「i<5」は trueになりますね?
というわけで1回目の「answer = answer * 2;」が実行されます。』という文ですが、今回の例では初期設定で初期値に設定した値は0です。そして実行条件はi<5、つまり「iの値が5未満かどうか」を判断するものになります。条件を満たした場合、実行条件は「true」判定を出します。また、forにおけるブロック内の作業は、実行条件でtrue判定を受けた場合のみ実行されます。
true、falseが分からない場合は「true、falseとは」等と検索して調べてください。
by TOMa 2020/06/11 10:29