循环结构

一、循环的概念

在程序中,有条件的重复执行一段代码的过程叫做循环。

循环需要满足以下几个条件:

  • 1、有循环执行的内容
  • 2、有循环终止的条件
  • 3、在每次循环过程中能够对条件所涉及的变量值进行改变

二、while循环

2.1 循环的语法

语法:

while(条件){

// 代码块

}

执行流程:

  • 先判断条件是否成立,如果成立则执行代码块
  • 代码块执行完毕后,再次判断条件是否成立,如果成立则再次执行代码块
  • 重复上面两个步骤,直到条件不成立则结束循环
  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. byte n = 5;
  4. while(n > 1) {
  5. System.out.println("我很好,很厉害" + n);
  6. n--;
  7. }
  8. }
  9. }

2.2 循环的组成
  1. public class Demo2 {
  2. public static void main(String[] args) {
  3. // 定义一个初始变量,来控制循环
  4. // 1、初始变量
  5. int n = 0;
  6. // 目标是循环一百次
  7. // 2、循环条件
  8. while(n < 100) {
  9. // 打印100次Hello, world
  10. // 3、循环的业务(内容)
  11. System.out.println("hello, world==" + n);
  12. // 4、条件变量的改变
  13. n++;
  14. }
  15. }
  16. }

2.3 案例
  1. public class Demo4 {
  2. public static void main(String[] args) {
  3. // 求1...10的乘积,结果是
  4. // 循环的初始变量
  5. int n = 1;
  6. int sum = 1;
  7. while(n <= 10) {
  8. sum = sum * n;
  9. System.out.println("第"+n+"次=" + sum);
  10. n++;
  11. }
  12. System.out.println(sum);
  13. }
  14. }
  15. public class Demo5 {
  16. public static void main(String[] args) {
  17. // 求1...100的偶数之和,结果是
  18. // 循环的初始变量
  19. // 从1到100,判断是否偶数,偶数就加
  20. int n = 1;
  21. int sum = 0;
  22. while(n <= 100) {
  23. System.out.println("第"+n+"次");
  24. if(n % 2 == 0) {
  25. sum += n;
  26. System.out.println("计算结果相加为: " + sum);
  27. }
  28. n++;
  29. }
  30. System.out.println(sum);
  31. // 使用简单算法,减少循环次数
  32. // int n = 2;
  33. // int sum = 0;
  34. // while(n <= 100) {
  35. // sum += n;
  36. // n += 2;
  37. // }
  38. // System.out.println(sum);
  39. }
  40. }
  41. public class Demo6 {
  42. public static void main(String[] args) {
  43. // 求1...100以内与7无关的数字之和
  44. int n = 1;
  45. int sum = 0;
  46. while(n <= 100) {
  47. /****此处写逻辑start****/
  48. if(!(n % 7 == 0 || n % 10 == 7 || n / 10 == 7)) {
  49. sum += n;
  50. }
  51. /****此处写逻辑end*****/
  52. n++;
  53. }
  54. System.out.println(sum);
  55. }
  56. }

三、do-while循环

3.1 基本语法

语法:

do{

// 代码块

}while(条件);

执行流程:

  • 先执行一次代码块
  • 再判断条件是否成立,如果成立,再执行一次代码块
  • 再判断条件是否成立,如果成立,再执行一次代码块,再次判断,直到条件不成立则循环终止。
  1. public class Demo7 {
  2. public static void main(String[] args) {
  3. // 求1...100之和
  4. int n = 1;
  5. int sum = 0;
  6. do{
  7. sum += n;
  8. n++;
  9. }while(n<=100);
  10. System.out.println(sum);
  11. }
  12. }

3.2 使用场景

简单的一个使用场景:

如果需要先执行一次,才有判断条件的情况下,需要使用do-while

  1. public class Demo9 {
  2. public static void main(String[] args) {
  3. Scanner input = new Scanner(System.in);
  4. char answer; // 先不赋值
  5. do{
  6. System.out.println("抄写一次代码");
  7. System.out.println("请老师输入评语:y/n");
  8. // 在执行过程中赋值
  9. answer = input.next().charAt(0);
  10. }while(answer != 'y');
  11. }
  12. }

注意:一般情况下,while和do-while更适用于循环次数不固定的业务。

四、for循环

4.1 基本语法

语法:

for(初始化变量; 条件; 迭代部分){

// 代码块

}

执行流程:

  • 初始化变量,仅执行一次
  • 判断条件,成立则执行代码块
  • 执行迭代部分,再判断条件,成立则再执行代码块,再执行迭代部分,再判断条件,直到条件不成立则循环终止。
  1. public class Demo10 {
  2. public static void main(String[] args) {
  3. // 输出100次Hello, world
  4. for(int n = 0; n<100; n++) {
  5. System.out.println("hello, world" + n);
  6. }
  7. }
  8. }

4.2 简单案例
  1. // 求1-100的和
  2. public class Demo11 {
  3. public static void main(String[] args) {
  4. // 求1-100的和
  5. int sum = 0;
  6. for (int i = 1; i <= 100; i++) {
  7. sum += i;
  8. }
  9. System.out.println(sum);
  10. }
  11. }
  12. public class Demo12 {
  13. public static void main(String[] args) {
  14. // 求1-10的乘积
  15. Scanner input = new Scanner(System.in);
  16. System.out.println("请输入一个数字:");
  17. int n = input.nextInt();
  18. int sum = 1;
  19. for (int i = 1; i <= n; i++) {
  20. sum *= i;
  21. }
  22. System.out.println(sum);
  23. }
  24. }
  25. public class Demo13 {
  26. public static void main(String[] args) {
  27. // 求5个人的平级成绩
  28. Scanner input = new Scanner(System.in);
  29. int sum = 0;
  30. for (int i = 0; i < 5; i++) {
  31. System.out.println("请输入第"+(i+1)+"个同学的成绩:");
  32. int score = input.nextInt();
  33. sum += score;
  34. }
  35. System.out.println(sum);
  36. double avg = (double)sum / 5;
  37. System.out.println("平均分为:" + avg);
  38. }
  39. }
  40. public class Demo14 {
  41. public static void main(String[] args) {
  42. // 输出所有5位回文数
  43. for (int n = 10000; n < 100000; n++) {
  44. if(n / 10000 == n % 10 && n / 1000 % 10 == n / 10 % 10) {
  45. System.out.println(n);
  46. }
  47. }
  48. }
  49. }

五、流程控制

5.1 break

break:表示在循环过程中,终止循环。

public class Demo15 {
    public static void main(String[] args) {
        // 流程终止
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
            System.out.println(i + "====" + sum);
            if(sum > 1000) {
                // 终止循环
                break;
            }
        }
    }
}

public class Demo16 {
    public static void main(String[] args) {
        // 求两个数的最小公倍数
        int n = 15;
        int m = 20;
        for (int i = 1; i <= n * m; i++) {
            // 判断数字是否公倍数
            if(i % n == 0 && i % m == 0) {
                System.out.println(i);
                break;
            }
        }
    }
}

public class Demo17 {
    public static void main(String[] args) {
        // 求两个数的最大公约数
        int n = 12980;
        int m = 21200;
        for (int i = n; ; i--) {
            if(n % i == 0 && m % i == 0) {
                System.out.println(i);
                break;
            }
        }
    }
}

5.2 continue

表示跳过当次循环,继续下一次循环。

public class Demo18 {
    public static void main(String[] args) {
        // 打印所有偶数
        for (int i = 0; i < 100; i++) {
            // 当为奇数时,continue表示跳过当次循环(即当次循环中continue后面的代码不再执行),继续下一次循环
            if(i % 2 != 0) {
                continue;
            }
            System.out.println(i);
        }
    }
}
public class Demo19 {
    public static void main(String[] args) {
        // 求100以内所有奇数之和,使用continue
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            if(i % 2 == 0) {
                continue;
            }
            sum += i;
        }
        System.out.println(sum);
    }
}

六、嵌套循环

public class Demo20 {
    public static void main(String[] args) {
        // 10个班,每班10个学生,输出学生编号
        for (int i = 1; i <= 10; i++) {
            System.out.println(i + "班");
            for (int j = 1; j <= 10; j++) {
                System.out.println(j + "号学生");
            }
        }
    }
}

public class Demo21 {
    public static void main(String[] args) {
        // 百钱百鸡问题,100文钱要买100只鸡,公鸡5文,母鸡3文,小鸡3只1文,请问公鸡母鸡小鸡各几何。
        for (int i = 0; i <= 100 / 5; i++) {
            for (int j = 0; j <= 100 / 3; j++) {
                for (int k = 0; k <= 100; k+= 3) {
                    if(i + j + k == 100 && i * 5 + j * 3 + k / 3 == 100) {
                        System.out.println("公鸡"+i+"只,母鸡"+j+"只,小鸡"+k+"只");
                    }
                }
            }
        }
    }
}

public class Demo22 {
    public static void main(String[] args) {
        // 打印100以内所有的质数
        for (int i = 2; i < 100; i++) {
            boolean b = false;
            for (int j = 2; j < i; j++) {
                if(i % j == 0) {
                    b = true;
                    break;
                }
            }
            if(b == false) {
                System.out.println(i + "是质数");
            }
        }

//        int i = 11;
//        boolean b = false;
//        for (int j = 2; j < i; j++) {
//            if(i % j == 0) {
//                b = true;
//                break;
//            }
//        }
//        if(b == false) {
//            System.out.println(i + "是质数");
//        }
    }
}

public class Demo23 {
    public static void main(String[] args) {
        // 3个班,每个班5个同学,求该班的平级成绩
        Scanner input = new Scanner(System.in);

        for (int n = 0; n < 3; n++) {
            System.out.println("第"+(n+1)+"个班");
            // 求5个人的平级成绩
            int sum = 0;
            for (int i = 0; i < 5; i++) {
                System.out.println("请输入第"+(n+1)+"个班第"+(i+1)+"个同学的成绩:");
                int score = input.nextInt();
                sum += score;
            }
            System.out.println(sum);
            double avg = (double)sum / 5;
            System.out.println("第"+(n+1)+"个班平均分为:" + avg);
        }
    }
}