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文を使いこなせれば本格的なプログラマーの仲間入り??
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
Nobuo様
はじめまして。
JAVAの入門者ですが、解説の理解できるサイトを探していたところ、こちらのサイトに辿り着きました。
有難うございます!!
できましたら、While文の解説と書き換えをご教示下さい。
宜しくお願い致します。
by miho 2014/12/07 00:04
コメントありがとうございます!
>できましたら、While文の解説と書き換えをご教示下さい。
ですね。while文や三項演算子もやりたいと思いながら出来ていません。(汗)
また書けたら書きますので暖かく見守ってやってください。
お役に立てて良かったです。^^
by Nobuo@管理人 2014/12/07 23:58
返信頂き有難うございます!!
また、こちらのサイトで学習を続けたいと思いますので、
こちらこそ、宜しくお願い致します。
by miho 2014/12/17 01:00
とてもわかりやすいです。
ただ、一つだけ
>iを1増やして2周目に突入です。
これだとiが二つになると受け取る方もいるかもしれません。
その後の
>最初iは0だったので1になったわけです。
この文章で分かると思うのであまり関係ないかもしれませんが
気になったので報告しておきます
by 匿名 2015/03/19 23:20
ご指摘ありがとうございます。
微妙に手直ししておきました。
by Nobuo@管理人 2015/03/20 09:08
こんにちは、
一つ気になったので質問させていただきます。
ある数をn乗したいときにforを使うとのことですが、Javaではキャロットキー「^」を使うことはできないのですか?
すごい初歩的な質問ですいません。
by Java-beginner 2017/06/21 09:06
>java-beginnerさん
n乗する為にfor文を使っているのではなく、for文について解説する為にn乗という処理を行っていることをご理解下さい。
by Nobuo@管理人 2017/06/21 09:27
確かにこの回ではfor文の解説でしたね。。。
勝手に自分の脳内で話が進んでました。
申し訳ございませんでした。
by Java-beginner 2017/06/21 10:58
例ですが
int x = 2;
int n = 5;
略)answer * x;
略)print( x + “の” + n + “乗は、”);
という風にすればこれもまた手打ちですが、(わざわざ全ての箇所を書き換えることなく)元の値を変更できますね
コードとしては汚いのかもしれないですが
プログラム楽しいです
by 匿名 2018/07/15 09:40
すみません。今javaを勉強中でどうしても分からないので
教えてほしいのですが、
今回の出題は、「answer = answer * 2;」 を5回繰り返す
というものだと思うのですが、
for文の実行条件、継続処理 の部分が理解出来ず苦戦しています。
この、2の5乗を計算するのに、
「 i<5; i++ 」って式になるのはどうしてですか?
あと、実行条件パートの説明で
初期設定では、i は、0 なので、「i<5」は trueになりますね?
というわけで1回目の「answer = answer * 2;」が実行されます。
この意味も分からないです。
誰か教えて下さい。
宜しくお願い致します。
by 匿名 2018/08/22 17:38