同じような処理をいちいちプログラムを変えて記述していると、プログラムの中身が膨大な量になってしまいます。そのようなときは人間が都度処理をするのではなく、コンピューターに処理をしてもらうと便利です。
プログラムのほとんどは文字列や数値などを問わず、条件判断+繰り返し文が基本的な構造となっています。
この理解を深めることで、Java以外のプログラムの習得も容易にできるようになると思います。
条件分岐に関してはこちらを参考にしてください。
処理の繰り返し
- プログラムでは、ある処理を繰り返し実行したいことがよくある
- ループ構文を使用すると繰り返し処理を簡単に記述できる
- 3つのループ構文
- ▶ for 文
- ▶ while 文
- ▶ do ~ while 文
コンピューターに同じ処理を繰り返し実行させたい場合はループ構文を用いてプログラムを作成します。このループ構文を使用することによって、簡単に繰り返し処理を記述することができます。
最も主流となっているものが for 文と while 文です。
for 文
- for 文の構文
- for ( 最初の処理; 条件式; 命令文の後に行う処理 ) {
- 命令文
- }
- 最初の処理を行う
- 条件式が true なら 命令文 を行う。false なら for 文を終了する。
- 命令文の後に行う処理を行う
- 2.に戻る
if 文の場合は( )の中身は1つの条件式でした。
if 文に関してはこちらを参考にしてください。
for の後の( ) の中には3つのことを記述します。3つの記述の間は;(セミコロン)で区切ります。
①最初の処理 = 初期化ともいいます。
②条件式 = ループさせるための条件を書きます。( if 文の条件分岐と似たようなものです)
③命令文を1回実行させてループさせるためには「命令文の後に行う処理」がないと永遠に条件式を満たすか満たさないかのループが回らなくなってしまいます。
for 文の例
- for ( int i = 0 ; i < 5 ; i ++ ) {
- System . out . println ( ” 今回は for 文を学習します “) ;
- }
「今回は for 文を学習します」を for 文を使って5回出力させるプログラムです。
まず最初の処理 int i = 0 で整数型の変数 i を宣言すると同時に 0 を代入します。
次は条件式 i < 5 で i と 5 の比較を行います。つまり i が 5 未満であればその間ずっとループさせるというものです。最後に命令文を1回実行した後 i ++ ( インクリメント ) を行います。1を増やすということです。
最初の処理 int i = 0 で初期化をします。
条件式 i < 5 で i と 5 を比べて i が 5 未満であれば true となり、そのままの幹の流れに沿って処理を実行します。false であれば、幹の流れから外れてループ終了となります。
true の場合、命令文が実行されます。
実行し終わったら i ++ ( インクリメント ) で i に 1を足して、また i < 5 まで戻って再度条件式の判断をおこないます。
最初の処理 int i = 0 でしたが i ++ を通過したことで int i = 1 となって、また条件式が実行されることになります。
このように繰り返して i が 5 未満という条件式が満たされなくなったら false となってループ終了となります。
したがって、このプログラムは i が0,1,2,3,4と5回命令文が実行されるということになります。
実行結果は
今回は for 文を学習します
今回は for 文を学習します
今回は for 文を学習します
今回は for 文を学習します
今回は for 文を学習します
となります。
算術演算子に関してはこちらを参考にしてください。
for ループ内で変数を使う
- for ループ内で変数を使用することで、例えば1から100までの和を求める計算ができる
- int sum = 0 ;
- for ( int i = 1 ; i <= 100 ; i ++ ) {
- sum += i ;
- System . out . println ( i + ” を足しました ” ) ;
- }
- System . out . println ( ” 合計は ” + sum ) ;
for 文の中で変数を使用することは当然可能です。
場合によっては変数をつかって for 文の中の処理の結果を一時的に蓄えておいて、その結果を for 文から抜けても参照することは可能です。
まず for 文の外で変数 sum に 0を代入して初期化します。
for 文の中は変数 i に1を代入する、つまり1から始めるということです。
条件式は i が100以下であれば繰り返す、ループさせます。
i ++ で1づつ増やしていくということです。
中の処理は最初に sum += 1; で加算代入をします。これは今の i の数値を毎回 sum の中に足していって、それと同時にいくつ足したのかをメッセージとして出力します。
例えば i が1のときは「1を加えました」2のときは「2を加えました」…が出力されます。
そして i が100になったら for 文を抜けます。
最後に変数 sum の中身である足し算の和の結果を参照する (”合計は”+ sum)が出力されます。
「加算代入」「インクリメント」はこちらの「変数を含む算術演算子」の項を参考にしてください。
- class Forbun {
- public static void main ( String [ ] args ) {
- int sum = 0 ;
- for ( int i = 1 ; i _<= 100; i ++ 😉 {
- sum += i ; // sum = sum + i ; と同じ
- System . out . println ( i + ” を足しました ” ) ;
- }
- System . out . println ( ” 合計は ” + sum ) ;
- }
- }
for 文の中で気を付けなければならないのは i _<= 100;です。
<= 100は100以下です。つまり i = 100 のときも足し算します。
実行結果は
1を足しました
2を足しました
3を足しました
・
・
・
・
100を足しました
合計は5050
となります。
変数のスコープ
- 変数には扱える範囲が決まっている。これを変数のスコープという
- スコープは変数の宣言が行われた場所から、そのブロック{ }の終わりまで
さきほど for 文の中に sum という変数を使用しました。
for 文の中に変数をつかう分には特に問題はありません。ただ変数の宣言をいつどこでしたら良いのか、またその変数の有効範囲はどこまでなのかが問題となってきます。
これを「変数のスコープ」といいます。
この「変数のスコープ」を意識せずにプログラムを記述していくとエラーが出てもなぜエラーとなったのかが理解できません。
さきほどのプログラムの例でみてみると int sum = 0 ; の変数の宣言は for 文の外でされています。
外で宣言された変数を for 文の中(水色の部分)で使用することは何も問題ありません。
ただ、逆に for 文の中でしか宣言されていない変数を for 文の外で使うことはできません。
上記の図でいうと int i = 1; の変数 i です。この i を for 文の外でつかうことはできません。この i はどこで宣言されているのか、システム側が見つけ出せずにエラーになってしまいます。
つまり赤文字の命令文は使えないということです。
スコープは変数の宣言が行われた場所から、そのブロック{ }の終わりまでです。
つまり int sum の有効範囲は public static void main ( String [ ] args ){ ⇐ から最後の }の間(ピンクの枠の中)で、 int i の有効範囲は水色の枠の中であるということです。
まとめ
for 文が理解できると人間がやると時間も労力もかかってしまうような複雑な処理をコンピューターにやってもらうことができます。ただ、for 文の構文の書き方や「変数のスコープ」を意識してプログラムを記述しないと簡単にエラーになってしまいます。
もし変数をプログラム全体で継続して使用したい場合は、その宣言を for 文や if 文また while 文の外で宣言するということを意識しなければなりません。