3-4. 繰り返し文For


繰り返し:For


▶基本構造:for(初期式;条件式;増減式){実行する文;}
▶初期式では、for文で使用する変数を初期化します.
▶条件式は繰り返しの条件を決めます.文と同様に、条件式がtrueの場合は実行する文を繰り返し、条件式がfalseの場合は繰り返し文の実行を停止します.
▶増減式で繰り返し回数を設定します.(主な増加/減少変数1)
▶主にfor文を使う場合?重複回数が確定したら!
package loop;

public class ForTest {
    public static void main(String[] args) {
        /**
         * 1부터 100까지의 합을 계산하는 프로그램
         */
        int sum = 0;

        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        
        System.out.println("1부터 100까지의 합은 " + sum + "입니다.");
    }
}

[실행 결과]
1부터 100까지의 합은 5050입니다.
▶上記の例題のfor文では、以下の手順を行います.
(1)for文で使用する変数iを1に初期化する.(初期式)
(2)iが100以下であるか否かを判定する.(条件式)
(3)iが100未満の場合はnum値をsumに代入する.(本文)
(4)numを1つ増やします.(増減式)
(5)iが100以下であることを再確認する.(条件式)
(...)
▶(2)~(5)の過程を繰り返し、numから101の瞬間に条件式がfalseとなり、for文から脱出し、sumは1から100の総和を含む.
❗for文で最も使用される変数名はiです.英語の単語iteratorの前のアルファベットを繰り返し文字の変数名として使用し、2文字で疑問を表し、iの次のアルファベットj、3文字で疑問を表し、jの次のアルファベットkが主です!

重複複文


重複文には他の重複文を重ねて使う場合もあります.
package loop;

public class NestedForTest {
    public static void main(String[] args) {
        /**
         * 2단부터 5단까지의 구구단을 출력하는 프로그램
         */
        for (int i = 2; i <= 5; i++){
            for (int j = 1; j <= 9; j++){
                System.out.println(i + " X " + j + " = " + (i * j));
            }
            System.out.println(); // 단이 바뀔때 마다 줄바꿈
        }
    }
}

[실행 결과]
2 X 1 = 2
2 X 2 = 4
2 X 3 = 6
2 X 4 = 8
2 X 5 = 10
2 X 6 = 12
2 X 7 = 14
2 X 8 = 16
2 X 9 = 18

3 X 1 = 3
3 X 2 = 6
3 X 3 = 9
3 X 4 = 12
3 X 5 = 15
3 X 6 = 18
3 X 7 = 21
3 X 8 = 24
3 X 9 = 27

4 X 1 = 4
4 X 2 = 8
4 X 3 = 12
4 X 4 = 16
4 X 5 = 20
4 X 6 = 24
4 X 7 = 28
4 X 8 = 32
4 X 9 = 36

5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
▶(ただし)X(数字)=(結果)が繰り返されます.1つのセグメントのすべての結果を出力し、次のセグメントに移動するため、外部から文に「セグメント」を出力し、内側に「数値」を出力します.
▶「ただし」を表す変数iは2から.i=2の間、内側for文で「数字」を表す変数jが1から9、jが10に増加した瞬間、内側for文の条件式がfalseとなり終了する.その後,外部for文の増減式を実行し,iは3とし,上記の手順を繰り返す.iから6までの瞬間,外部for文の条件式はfalseであるため,二重for文はいずれも終了する.
▶可読性を高めるために、外のドアが一回り(=1つの「セグメント」の「結果」がすべて出力される場合)すると、システムになります.out.println()で改行を実行します.
▶上記二層for文は、外部for文を1回実行しながら内部for文を9回実行するので、合計4*9=36回for文を実行します.
👉 ここで待って!
'3-3. リペア文Whileで述べたように、システム.out.printlnは自動的に改行します.それを利用して、システム.out.println()のように、カッコに値を入力しない場合は、単純な改行しか実行できません.😊

オーバーラップ


▶重複文でbreakを使用している場合は、break文を包む重複文からしか抜けません.
package loop;

import java.util.Scanner;

public class BreakTest {
    public static void main(String[] args) {
        /**
         * 사용자로부터 정수를 입력 받아, 1부터 해당 정수까지의 합을 출력한다.
         * (단, 사용자가 콘솔 창에 0을 입력하기 전까지 무한히 프로그램을 반복한다.)
         */
        Scanner scanner = new Scanner(System.in);
        int sum = 0; // 합을 담을 변수
        int num = 0; // 사용자로부터 입력 받는 정수

        while (true){
            System.out.print("정수를 입력하세요: ");
            num = scanner.nextInt();
            if (num == 0)
                break;

            for (int i = 1; ; i++) {
                if (i > num)
                    break;
                sum += i;
            }
            System.out.println("1부터 " + num + "까지의 합은 " + sum + "입니다.");

            sum = 0; // 변수 sum 을 0으로 다시 초기화
        }

        scanner.close();
    }
}

[실행 예시]
정수를 입력하세요: 10
1부터 10까지의 합은 55입니다.
정수를 입력하세요: 5
1부터 5까지의 합은 15입니다.
정수를 입력하세요: 0

Process finished with exit code 0
▶ユーザーは、コンソールウィンドウに0を入力する前に、プログラムを無限に繰り返しなければならないので、外部の繰り返し文はwhile文からなり、1からnまでの和を計算する内部の繰り返し文はfor文からなる.
▶ユーザーがコンソールウィンドウに0を入力した場合は、重複する文全体から飛び出す必要があります.最初のbreak文はwhile文に属するため、for文にアクセスするのではなく、while文から直接プログラムを終了します.
▶for文に条件式を記入せずに省略すると、iがnumに等しくなるまで無限に繰り返されるfor文となり、sum+=iとなる.儀式を行う.したがって、iがnumより大きい場合は、break文を使用して内部for文から終了し、while文の残りの文を実行する必要があります.
▶ユーザーは新しい整数を入力するたびに新しい加算を行うため、クエリの最後に加算を0に再初期化する必要があります.
▶この例では、内側の繰り返し文にダッシュ文を使うと外側の繰り返し文から離れられないことがわかります.
👉 ここで待って!
実際には、内部for文をfor(inti=1;i<=num;i++)に構成すると、コード数を減らして可読性を高めることができますが、break文の動作原理を理解するために、より複雑なコードを構成しました.😊

星図


👉 ここで待って!
星図は二重forゲートをよく練習した例です!コードと注釈を参考にしてください.理解できないところがあれば、メッセージを残してください.😊
1)右階段
package make_star;

import java.util.Scanner;

public class Star1 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *   *
         *   **
         *   ***
         *   ****
         *   *****  를 출력하시오.
         *
         *   Hint. 별의 개수 = 줄 번호
         */
        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            for (int star = 1 ; star <= line; star++)
                System.out.print("*");
            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
*
**
***
****
*****
2)左側方向段差
package make_star;

import java.util.Scanner;

public class Star2 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *       *
         *      **
         *     ***
         *    ****
         *   *****  를 출력하시오.
         *
         *   Hint1. 별의 개수 = 줄 번호
         *   Hint2. 공백의 개수 = (줄의 총 개수) - (별의 개수)
         */
        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            for (int blank = 1; blank <= (total - line); blank++)
                System.out.print(" ");
            for (int star = 1 ; star <= line; star++)
                System.out.print("*");
            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
    *
   **
  ***
 ****
*****
3)ピラミッド
package make_star;

import java.util.Scanner;

public class Star3 {
    public static void main(String[] args) {
        /**
         *   사용자로부터 정수를 입력 받아, 해당 정수의 줄 개수 만큼
         *      *
         *     ***
         *    *****
         *   ******* 를 출력하시오.
         *
         *   Hint. 별의 개수 = 2 * (line) - 1
         *   Hint. 공백의 개수 = (마지막 줄의 별 개수) - (해당 줄의 별 개수)
         */

        Scanner scanner = new Scanner(System.in);

        System.out.print("별을 출력할 줄의 개수를 입력하세요: ");
        int total = scanner.nextInt(); // 줄의 총 개수
        int numberOfStar = 0; // 각 줄의 별 개수
        int numberOfBlank = 0; // 각 줄의 공백 개수
        scanner.close();

        for (int line = 1; line <= total; line++){
            numberOfStar = 2 * line - 1;
            numberOfBlank = (2 * total - 1) - numberOfStar;

            for (int blank = 1; blank <= numberOfBlank / 2; blank++)
                System.out.print(" ");
            for (int star = 1 ; star <= (2 * line - 1); star++)
                System.out.print("*");
            for (int blank = 1; blank <= numberOfBlank / 2; blank++)
                System.out.print(" ");

            System.out.println();
        }
    }
}

[실행 예시]
별을 출력할 줄의 개수를 입력하세요: 5
    *    
   ***   
  *****  
 ******* 
*********