07-控制结构(顺序控制、分支控制、循环控制)

程序流程控制介绍

在程序中,程序运行的流程控制决定程序是如何运行的。

主要有三大流程控制语句:顺序控制、分支控制和循环控制。

1. 顺序控制

程序从上到下,逐行地执行,中间没有任何判断和跳转。

 

2. 分支控制(if , else , switch)

if-else 分支结构

让程序有选择的执行,分支控制有三种:单分支、双分支和多分支。

a) 单分支

基本语法:

if(条件表达式){

  执行代码块;  //(可以有多条语句)

}

说明:当条件表达式为true时,就会执行{}里面的代码;如果为false,则不执行。

这里需要特别注意:如果{}里面只有一条语句,则可以不用{},但建议加上{}。

//需求:编写一个程序,可以输入年龄,如果该同志的年龄大于18岁,则输出"你年龄大于18,要对自己的行为负责,送入监狱!"
import java.util.Scanner;

public class If01{
    public static void main(String[] args){
        //思路分析
        //1.定义一个Scanner对象,接收输入的年龄
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年龄:");

        //2.把年龄保存到一个变量 int age
        int age = sc.nextInt();
        
        //3.使用 if 判断,是否输出对应信息
        if(age > 18){
            System.out.println("你年龄大于18,要对自己的行为负责,送入监狱!");
        }

        System.out.println("程序继续...");
    }
}

b) 双分支

基本语法:

if(条件表达式){

  执行代码块1;  

}

else{

  执行代码块2;  

}

说明:当条件表达式成立时,即执行代码块1,否则执行代码块2。

//需求:编写一个程序,可以输入年龄,如果该同志的年龄大于18岁,则输出"你年龄大于18,要对自己的行为负责,送入监狱!"
//否则,输出"你的年龄不大,这次放过你了!"

import java.util.Scanner;

public class If02{
    public static void main(String[] args){
        //思路分析
        //1.定义一个Scanner对象,接收输入的年龄
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年龄:");

        //2.把年龄保存到一个变量 int age
        int age = sc.nextInt();
        
        //3.使用 if-else 判断,是否输出对应信息
        if(age > 18){
            System.out.println("你年龄大于18,要对自己的行为负责,送入监狱!");
        }else{
            System.out.println("你年龄不大,这次放过你了!");
        }

        System.out.println("程序继续...");
    }
}

c) 多分支

基本语法:

if(条件表达式1){

  执行代码块1;  

}

else if(条件表达式2){

  执行代码块2;  

}

...

else{

  执行代码块n;

}

说明:当条件表达式1成立时,即执行代码块1;如果条件表达式1不成立时,才去判断表达式2是否成立,如果条件表达式2成立时,就执行代码块2;以此类推,如果所有的表达式都不成立时,则执行else代码块。

import java.util.Scanner;

public class NestedIf{
    public static void main(String[] args){

        /**
         * 参加歌手比赛,如果初赛成绩大于8.0,则进入决赛,否则提示淘汰。
         * 并且根据性别提示进入男子组或女子组。
         *
         * 提示:double score; char gender;
         * 接收字符:char gender = Scanner.next().CharAt(0);
         *
         * 思路分析
         * 1.创建Scanner对象,接收用户输入
         * 2.接收 成绩 保存到 double score
         * 3.使用 if-else 判断,如果初赛成绩大于8.0进入决赛,否则提示淘汰
         * 4.如果进入到决赛,再接收 char gender ,使用 if-else 输出信息
         * 
         */
        
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入该歌手的初赛成绩:");
        double score = sc.nextDouble();

        if(score > 8.0){
            System.out.println("请输入该歌手的性别:");
            String gender1 = sc.next();
            //String类型转char类型,调用getChar(0)方法将单个字符串转换为char
            char gender2 = gender1.charAt(0);

            if(gender2 == '男'){
                System.out.println("恭喜您,进入男子组决赛!");
            }else if(gender2 == '女'){
                System.out.println("恭喜您,进入男子组决赛!");
            }else{
                System.out.println("抱歉,性别输入错误!");
            }

        }else{
            System.out.println("抱歉,您未进入决赛!");
        }

    }
}

switch 分支结构

基本语法:

switch(表达式){

  case 常量1: //当表达式的值与case 常量1匹配,则执行语句块1

  语句块1;

  break; //表示退出switch

  case 常量2: //如果没有匹配case 常量1,则继续判断是否与case 常量2匹配

  语句块2;

  break;

  ...

  case 常量n:

  语句块n;

  break;

  default: //如果一个都没有匹配上,则执行default语句块

  default 语句块;

}

这里需要注意:

a) 表达式的数据类型,应和case后的常量类型一致,或者是自动转成可以相互比较的类型(比如表达式是char,而常量是int)

b) switch中表达式的返回值,必须是byte,short,int,char,enum,String类型

c) case子句中的值必须是常量,而不是变量

d) default子句是可选的,当没有匹配的case时,执行default语句

e) break语句,是用来执行完一个case分支后,使程序跳出switch分支结构,如果没有写break,程序会顺序执行到下一个case分支,直到switch结尾

 

import java.util.Scanner;

public class Switch01{
    public static void main(String[] args){

        /**
         *
         * 需求:编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
         * a 表示 星期一,b 表示 星期二,...
         * 根据用户的输入,显示相应的信息
         *
         * 思路分析
         * 1. 接收一个字符,创建Scanner对象
         * 2. 使用 switch 来完成匹配,并输出对应信息
         * 
         */
        
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符(a-g):");
        //String类型转char类型,调用getChar(0)方法将单个字符串转换为char
        char c1 = sc.next().charAt(0);

        switch(c1){
            case 'a':
                System.out.println("今天星期一,猴子穿新衣");
                break;
            case 'b':
                System.out.println("今天星期二,猴子肚子饿");
                break;
            case 'c':
                System.out.println("今天星期三,猴子去爬山");
                break;
            case 'd':
                System.out.println("今天星期四,猴子看电视");
                break;
            case 'e':
                System.out.println("今天星期五,猴子爱跳舞");
                break;
            case 'f':
                System.out.println("今天星期六,猴子去烤肉");
                break;
            case 'g':
                System.out.println("今天星期天,猴子不吸烟");
                break;
            default:
                System.out.println("抱歉,您输入的字符有误,不在a-g范围内!");
        }

        System.out.println("已退出switch语句,继续执行程序...");
    }
}

if-else和switch的比较

a) 如果判断的具体数值不多,而且符合byte、short、int、char、enum、String这六个类型。虽然两个语句都可以使用,但建议使用switch语句

b) 其它情况,需要对区间进行判断,或者对结果类型为boolean类型进行判断,则使用if-else,使用范围更广 

3.循环控制

for 循环控制

基本语法:

for(循环变量初始化;循环条件;循环变量迭代){

  循环操作(可以多条语句);

}

这里需要注意:

a) for循环控制四个要素的顺序:(1)循环变量初始化 (2)循环条件 (3)循环操作 (4)循环变量迭代

b) 循环条件是返回一个boolean值的表达式

c) for(;循环条件;) 中的循环变量初始化和循环变量迭代,可以写到其它地方,但是分号不能省略

e) 如果 循环操作(语句) 只有一条语句,可以省略{},但建议不要省略

public class For01{
    public static void main(String[] args){
        //for(循环变量初始化;循环条件;循环变量迭代)
        for(int i = 1; i <= 10; i++){
            System.out.println("你好,这是第" + i + "次循环...");
        }
        // System.out.println("i = " + i); 错误: 找不到符号i,这是因为方法内声明的局部变量

        //for(;循环条件;)中的循环变量初始化和循环变量迭代,可以写到其它地方
        //但是分号不能省略
        int j = 1;
        for(; j <= 10;){
            System.out.println("你好,这是第" + j + "次循环...");
            j++;
        }
        System.out.println("j = " + j); //j = 11
    }
}

while 循环控制

基本语法:

循环变量初始化;

while(循环条件){

  循环体(语句);

  循环变量迭代;

}

这里需要注意:

a) while循环控制也有四个要素,只是四要素放的位置不一样:(1)循环变量初始化 (2)循环条件 (3)循环体 (4)循环变量迭代

b) 循环条件也是返回一个boolean值的表达式

c) while循环是先判断循环条件,再执行循环体语句(先判断再执行)

public class While01{
    public static void main(String[] args){
        //for 循环控制
        for(int i = 1; i <= 10; i++){
            System.out.println("你好,这是for循环的第" + i + "次循环...");
        }

        //while 循环控制
        int j = 1;
        while(j <= 10){
            System.out.println("你好,这是while循环的第" + j + "次循环...");
            j++;
        }
    }
}

do while 循环控制

基本语法:

循环变量初始化;

do{

  循环体(语句);

  循环变量迭代;  

}while(循环条件);

这里需要注意:

a) do while 是关键字

b) do while循环控制也有四个要素,只是四要素放的位置不一样:(1)循环变量初始化 (2)循环体 (3)循环变量迭代 (4)循环条件

c) do while循环是先执行循环体语句,再判断循环条件(先执行再判断,也就是说至少会执行一次)

 

public class DoWhile01{
    public static void main(String[] args){
        //while 循环控制
        int j = 1;
        while(j <= 10){
            System.out.println("你好,这是while循环的第" + j + "次循环...");
            j++;
        }

        //dowhile 循环控制
        int i = 1;
        do{
            //循环执行语句
            System.out.println("你好,这是do...while循环的第" + i + "次循环...");
            //循环变量迭代
            i++;
        }while(i <= 10);

        System.out.println("退出do...while,继续执行...");

    }
}

多重循环控制(嵌套循环)

将一个循环放在另一个循环体内,就形成了嵌套循环。

实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的外层循环。

import java.util.Scanner;

public class MulForExercise01{
    public static void main(String[] args){
        /**
         * 需求1:统计3个班级成绩情况,每个班有五名同学
         * 求出各个班的平均分和所有班级的平均分【学生成绩从键盘输入】
         * 
         *
         * 思路分析:
         * (1) 先计算一个班的情况,5个学生的成绩,使用for循环
         * 1.1 创建Scanner对象,接收用户输入的学生成绩
         * 1.2 得到该班级的平均分,定义一个 double sum 变量,把该班级的5个学生成绩累计计算
         * 
         * (2) 统计三个班(每个班5个学生)的平均分,再外面嵌套一个for循环
         *
         * (3) 统计所有班级的平均分,定义一个 double totalScore变量,把三个班级的学生成绩累计计算
         * 
         */
        
        //创建Scanner对象,接收用户输入的学生成绩
        Scanner sc = new Scanner(System.in);

        //定义一个 double sum 变量
        double sum = 0.0;
        //定义一个 double totalScore 变量
        double totalScore = 0.0;

        for(int i = 1; i <= 3; i++){
            for(int j = 1; j <= 5; j++){
                //接收用户输入的学生成绩
                String tip = String.format("请输入第%d个班的第%d个学生的成绩:",i,j);
                System.out.println(tip);
                double score = sc.nextDouble();

                //把该班级的5个学生成绩累计计算
                sum += score;
            }
            //输出各个班的平均分
            System.out.println("第" + i + "个班的总成绩 = " + sum + "\t平均分 = " + (sum/5.0));
            //把三个班级的学生成绩累计计算
            totalScore += sum;
        }
        //所有班级的平均分
        System.out.println("三个班的总成绩 = " + totalScore + "\t平均分 = " + (totalScore/15.0));
            
    }
}

扩展:break 和 continue

break和continue都是用来控制循环结构的,主要作用是停止循环。

break语句的作用是跳出一个循环体或者完全结束一个循环

a) 结束本次循环,并停止下次循环条件判断(在多重嵌套循环中,break默认跳出最近循环体)

b) 可以作用于switch语句

continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定

a) 结束本次循环,继续下次循环,并进行条件判断(在多重嵌套循环中,continue默认跳过最近循环体的本次循环)

b) 不可作用于switch语句

public class Break01{
    public static void main(String[] args){

        // break 使用
        for(int i =1; i <= 5; i++){
            if(i == 3){
                break;
            }
            System.out.println("i = " + i); //当i = 3时,结束循环
        }

        // continue 使用
        for(int i =1; i <= 5; i++){
            if(i == 3){
                continue;
            }
            System.out.println("i = " + i); //当i = 3时,只是跳出本次循环
        }
    }
}

 

posted @ 2023-07-10 15:04  马铃薯1  阅读(86)  评论(0编辑  收藏  举报