4.プログラムの繰り返し
4-1 「繰り返しとは?」
はじめに
プログラムで行う処理は、1回だけ実行するのではなく、何度も繰り返して実行することができます。 本章では、プログラミングの流れを繰り返すための方法を学習をしていきます。
繰り返し文とは?
プログラミング言語には、繰り返し文というものがあります。繰り返し文とは、 ある決められた回数の間、操作を繰り返して実行するというものです。また、繰り返しのことを 「ループ」と言う場合もあります。この事を説明したものを以下の動画にてまとめてありますので、 確認してみてください。
今回学習する繰り返し文に用いられる構文には種類があり、「do文」、「while文」、「for文」 といった順番で学習していきます。
do文
まずは、このプログラムを見てみましょう。
※※オレンジは入力した値
解説
このプログラムでは、1~12という月の値から季節を判定することができます。 数値の3,4,5のどれかを入力すると春、数値の6,7,8のどれかを入力すると 夏、数値の9,10,11のどれかを入力すると秋、 数値の12,1,2のどれかを入力すると冬が表示されるようになっており、今回の実行例では 3を入力しているので、春という結果が表示されています。
重要
上のプログラムのif文の中で使われている「&&」のことを論理積演算子、 「||」のことを論理和演算子といいます。 論理積は両方とも真であれば真、論理和は一方でも真であれば真になります。

このことを参考に、上のプログラムの「春」になる条件を考えてみると、 「month >= 6 && month <= 8」となっているため、monthの値が6以上かつ、 8以下となり、6,7,8の値を指しています。9という値を入力すると、6以上という条件には当てはまりますが、 8以下という条件には当てはまらないので、「春」とは表示されず、「month >= 9 && month <= 11」という条件の 「夏」が表示されます。「month == 12 || month == 1 || month == 2」の式だと、12,1,2のどれかが入力されると「冬」が表示されます。
それでは、このプログラムを少し改良してみます。
// 読み込んだ月の季節を表示
import java.util.Scanner;
class Season2 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int retry;
do { ・・・①
System.out.print("季節を求めます。\n何月ですか:");
int month = stdIn.nextInt();
if (month >= 3 && month <= 5) // 3月・4月・5月
System.out.println("それは春です。");
else if (month >= 6 && month <= 8) // 6月・7月・8月
System.out.println("それは夏です。");
else if (month >= 9 && month <= 11) // 9月・10月・11月
System.out.println("それは秋です。");
else if (month == 12 || month == 1 || month == 2) // 12月・1月・2月
System.out.println("それは冬です。");
System.out.print("もう一度? 1…Yes/0…No:");
retry = stdIn.nextInt();
} while (retry == 1); ・・・②
}
}
季節を求めます。
何月ですか:3
それは春です。
もう一度? 1…Yes/0…No:1
季節を求めます。
何月ですか:6
それは夏です。
もう一度? 1…Yes/0…No:0
※オレンジは入力した値
解説
先ほどのプログラムとの違いは、①と②が増えたことです。 ①のdoには「実行せよ」という意味があり、②のwhileには「~の間」という意味を持ちます。 このように、doとwhileとで文を囲んでいるいる文をdo文と呼びます。 do文は必ず1回以上文を実行させたい場合に使用します。本プログラムのdo文の流れを以下に示します。
while文
次に、while文についての解説をしていきます。while文もdo文と同様に、条件が成立する間処理を繰り返します。 さっそく、次のプログラムを見てみましょう。
// 正の整数値を0までカウントダウン
import java.util.Scanner;
class CountDown1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("カウントダウンします。");
int x;
① do {
System.out.print("正の整数値:");
x = stdIn.nextInt();
} while (x <= 0);
② while (x >= 0) {
System.out.println(x);
x--; ・・・③
}
}
}
カウントダウンします
正の整数値:-10
正の整数値:5
5
4
3
2
1
0
※※オレンジは入力した値
解説
ピンクで囲まれた①の部分は先ほど学習した、do文です。今回のプログラムのdo文は、正の整数値(x<=0)が入力されるまで 繰り返されることになっているため、-10が入力された時には正の整数値ではないためdo文を抜けることができず、もう一度 入力を促すようになっています。そして、②の部分が今回はじめて出てきた、while文です。 while文は、「while 式(制御文)」を評価した値がtrueである間、処理を繰り返し行います。 今回のwhile文では「while (x >= 0)」となっているため、xの値が0以上の間処理を繰り返すことになります。
重要1
今回のプログラムのwhie文の中にx「--」という文が利用されています(・・・③)。これは、減分演算子というものです。 単項演算子(オペランドが一つだけであるような演算子)である減分演算子「--」は、オペランドの値をデクリメントする(一つだけ減らす)演算子です。 今回のプログラムで考えてみると、xの値が5で、x--されることにより、値が4に更新されます。 このことが0になるまで繰り返され、0がデクリメントされ、-1になった時「(x >= 0)」とう 条件が成り立たなくなるため、while文を抜けることになります。
重要2
減分演算子「--」の逆に、増分演算子「++」というものもあります。また、x++と書くか、++xと書くかで答えが違ってきます。 そのことも学習しておきましょう。ちなみに、オペランドの値を1つ増やすこと「++」のことをインクリメントする、 1つ減らすこと「--」のことをデクリメントするといいます。
++x | xの値をインクリメントする。(1つ増加させる。)生成するのは増加後の値。 |
---|
x++ | xの値をインクリメントする。(1つ増加させる。生成するのは増加前の値。 |
---|
--x | xの値をデクリメントする。(1つ減少させる。)生成するのは減少後の値。 |
---|
x-- | xの値をデクリメントする。(1つ減少させる。)生成するのは減少前の値。 |
---|
まずは、前置増分演算子のプログラムを見てみましょう。
// 正の整数値を0までカウントダウン
import java.util.Scanner;
class Zenti {
public static void main(String[] args) {
int x = 5;
int y = ++x;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
x = 6
y = 6
今回の前置増分演算子の場合は、xの値に1加算された状態でyに代入されるため、yにはxに1足された数(今回だと5に1足された数=6)が代入され、
実行結果としてy = 6と表示されます。xの実行結果も6になるので、xとyの実行結果が同じになります。
次は、後置増分演算子の場合を見てみましょう。
// 正の整数値を0までカウントダウン
import java.util.Scanner;
class Kouti {
public static void main(String[] args) {
int x = 5;
int y = x++;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
x = 6
y = 5
実行結果を見てみると値が違うことがわかります。後置増分演算子の場合だと、xの後ろに「++」が付いているため、 まずyにxの値が代入された後にxの値に1足されます。そのため、yにはxがインクリメントされる前の値「5」が、 xにはインクリメントされた後の値「6」が代入されます。
for文
最後にfor文について学習しましょう。まず、このプログラムを見てみましょう。
// 読み込んだ個数だけ*を表示
import java.util.Scanner;
class Kome1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("何個*を表示しますか:");
int n = stdIn.nextInt();
for (int i = 0; i < n; i++)
System.out.print('*');
System.out.println();
}
}
何個*を表示しますか:5
*****
※オレンジは入力した値
解説
このプログラムは入力された値の分「*」を表示するプログラムです。 ピンク色で囲まれた部分が今回学習するfor文です。 ちなみに、このプログラムは今までに学習したwhile文にも書き換えることができます。
// 読み込んだ個数だけ*を表示
import java.util.Scanner;
class Kome1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("何個*を表示しますか:");
int n = stdIn.nextInt();
int i = 0;
while (i < n) {
System.out.print('*');
i++;
}
System.out.println();
}
}
何個*を表示しますか:5
*****
※オレンジは入力した値
書き方は違いますが、実行結果は同じになります。for文とwhile文は相互に書き換えられるように、 今回のプログラムではほぼ同等です。

for文のプログラムの流れは、まず「A」部分の前処理が評価・実行され、「B」部分の条件式がtrueで ある限り実行され、文の実行後は次の繰り返しの準備として「C」部分が実行されます。
また、for文は以下のように多重ループにしてプログラムを書くこともできます。
// 読み込んだ個数だけ*を表示
import java.util.Scanner;
class Tsankaku {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("左下直角の三角形を表示します。");
System.out.print("段数は:");
int n = stdIn.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++)
System.out.print('*');
System.out.println();
}
}
}
左下直角の三角形を表示します。
段数は:3
*
**
***
※オレンジは入力した値
このプログラムにはfor文が2つ使われており、このように繰り返しの中で繰り返しを行う 文を多重ループと言います。まずはこの解説動画を見て下さい。
動画にあるように、外側のfor文(行ループ)ではiからnまで、今回の場合は3までインクリメントします。 これは、三角形の各行に対応する縦方向の繰り返しです。その各行実行される内側のfor文(列ループ)はjの値を1からiまで インクリメントしながら表示を行います。これは各行における横方向の繰り返しです。 図にすると以下のようになります。
