順次制御
プログラムは、通常、上から下へ、左から右へと順番に実行されます。これが順次制御です。
分岐制御
分岐制御は、特定の条件に基づいて異なるコードブロックを実行するために使用されます。主に単一分岐、二分岐、および多分岐に分類されます。
if-else文
if-else文は、条件が真であるか偽であるかに基づいてコードを実行します。if-else文の中に別のif-else文をネストすることもできますが、可読性を維持するためにネストは3層以内に留めることを推奨します。
switch文
switch文は、式の値に基づいて複数のケースから一つを選択して実行します。
3つの重要な使用上の注意点
特に、注意点2に注目してください。
注意点1: 文字型の使用
文字型(char)は、内部的に整数型(int)として扱われるため、caseラベルに文字リテラルまたは整数値を指定できます。
char inputChar = scanner.next().charAt(0);
switch (inputChar) {
case 65: // 'A'のASCIIコード
System.out.println("大文字Aです");
break;
case 'b':
System.out.println("小文字bです");
break;
default:
System.out.println("その他の文字です");
}
練習問題: 季節の判定
ユーザーが入力した月に基づいて、季節を表示するプログラムを作成します。
Scanner scanner = new Scanner(System.in);
System.out.print("月を入力してください (1-12): ");
int month = scanner.nextInt();
switch (month) {
case 3:
case 4:
case 5:
System.out.println("春");
break;
case 6:
case 7:
case 8:
System.out.println("夏");
break;
case 9:
case 10:
case 11:
System.out.println("秋");
break;
case 12:
case 1:
case 2:
System.out.println("冬");
break;
default:
System.out.println("無効な月です");
}
ループ制御
ループ制御は、特定の条件が満たされるまで、または指定された回数だけコードブロックを繰り返し実行するために使用されます。
forループ
forループは、繰り返し回数が事前にわかっている場合に適しています。
プログラミング思想(先固定後柔軟)
「先固定後柔軟」とは、開発の初期段階では具体的な値(例: 1から100まで)を直接使用し、後で変数に置き換えて柔軟性を高めるという考え方です。これはコードの再利用性と保守性を向上させる重要な概念です。
int counter = 0;
int startNumber = 1;
int endNumber = 100;
for (int currentNumber = startNumber; currentNumber <= endNumber; currentNumber++) {
if (currentNumber % 9 == 0) {
System.out.println(currentNumber);
counter++;
}
}
System.out.println("9の倍数の個数: " + counter);
whileループ
whileループは、ループの先頭で条件を評価します。条件が真の間、ループは継続されます。
do-whileループ
do-whileループは、ループの末尾で条件を評価します。そのため、ループ本体は少なくとも1回は必ず実行されます。
多重ループ
多重ループは、ループの中に別のループをネストすることを指します。これにより、多次元データの処理や複雑なパターンの描画が可能になります。
練習問題: 中空のピラミッド
ユーザーが指定した行数の中空のピラミッドをコンソールに出力するプログラムです。
package ControlStructuresDemo;
import java.util.Scanner;
public class PyramidDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("ピラミッドの高さを入力してください: ");
int rows = scanner.nextInt();
for (int i = 1; i < rows; i++) {
// スペースを出力して中央揃えにする
for (int j = 1; j <= rows - i; j++) {
System.out.print(" ");
}
// 最初の行は1つのアスタリスク
if (i == 1) {
System.out.println("*");
} else {
// 最初と最後のアスタリスク
System.out.print("*");
// 中間のスペース
for (int k = 1; k <= (i - 2) * 2 + 1; k++) {
System.out.print(" ");
}
// 最後のアスタリスク
System.out.println("*");
}
}
// ピラミッドの底辺
for (int i = 0; i < 2 * rows - 1; i++) {
System.out.print("*");
}
}
}
break文
break文は、最も内側のループまたはswitch文から即座に抜け出すために使用されます。ラベル付きbreak文も存在しますが、可読性を損なう可能性があるため、実際の開発では注意して使用する必要があります。
outerLoop:
for (int i = 0; i < 5; i++) {
innerLoop:
for (int j = 0; j < 5; j++) {
if (i == 2 && j == 2) {
System.out.println("ループを中断します");
break outerLoop; // outerLoopラベルで指定されたループを中断
}
System.out.println("i: " + i + ", j: " + j);
}
}
continue文
continue文は、ループの残りの部分をスキップし、次の繰り返しに進むために使用されます。break文と同様に、ラベルを使用して特定のループを指定することもできます。
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 偶数の場合、以降の処理をスキップして次の繰り返しに進む
}
System.out.println("奇数: " + i);
}
return文
return文は、メソッドの実行を終了し、呼び出し元に戻ります。メソッドが値を返す場合、return文の後にその値を指定します。