流程控制语句

流程控制语句

概述

在一个程序执行的过程中,各条语句的执行顺序对于程序的结果是有直接影响的。也就是说程序执行的流程对于结果有影响。

所以我们必须清楚每条语句的执行流程,而且我们可以通过流程控制语句来控制程序的执行顺序。

  • 分类
    • 顺序结构
    • 选择结构
    • 循环结构

1 顺序结构

是程序中最基本最简单的流程控制,没有特点的语法结构,按照代码编写的先后顺序,依次执行。程序中大部分代码都是这样执行的。

public static void main(String[] args) {
        System.out.println("一天晚上");
        System.out.println("两个和尚");
        System.out.println("三更半夜");
        System.out.println("四处流浪");
        System.out.println("误入洞房");
    }

2 选择结构

2.1 概述

  • 选择结构也称之为分支结构

  • 选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,可以根据结果执行不同的代码。

  • Java语言中提供了两种选择结构的语句

    • if语句
    • switch语句

2.2 if语句

if语句分为三种格式

  • 格式一
if (关系表达式){
     语句体;
}

执行流程:

​ 首先判断关系表达式的结果是true还是false

​ 如果是true就执行语句体中的代码

​ 如果是false就不执行语句体中的代码

注意点:如果{}中只有一条代码,{}可以省略

public static void main(String[] args) {
        // 格式一
        System.out.println("晚上闲的没事在大街游荡");
        System.out.println("发现一个成人娱乐场所");
        int age = 19;
        if (age >= 18)  //判断是否成年
            System.out.println("刷身份证");


        System.out.println("回家睡觉...");
    }
  • 格式二
if (关系表达式){
    语句体1;
}else{
	语句体2;
}

执行流程:

​ 首先判断关系表达式看其结果是true还是false

​ 如果是true就执行语句体1

​ 如果是false就执行语句体2

public static void main(String[] args) {

        // true:男  false:女
        boolean sex = false;
        if (sex){
            System.out.println("去男老八快乐屋");
        }else {
            System.out.println("去女老八快乐屋");
        }
    }
  • 格式三
if (关系表达式1){
    执行语句1;
}else if (关系表达式2){
    执行语句2;
}else if (关系表达式3){
	执行语句3;
}
...
else{
	执行语句n;
}

执行流程:

​ 首先判断关系表达式1,看其结果是true还是false。

​ 如果是true,就执行语句1;然后if语句结束

​ 如果是false,继续判断关系表达式2是true还是false。

​ 如果是true,就执行语句2;然后if语句结束

​ 如果是false,就继续判断关系表达式3是true还是false。

​ 如果是true,就执行语句3;然后if语句结束

​ 如果是false,继续判断

​ …

​ 如果没有任何关系表达式为true,就执行else中的语句n

public static void main(String[] args) {
        // 结构三
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入您的年龄:");
        int age = scanner.nextInt();
        if (age >= 3 && age <= 7){
            System.out.println("爸爸妈妈去上班,我去幼儿园");
        }else if (age > 7 && age < 13){
            System.out.println("上小学,带红领巾");
        }else if (age >= 13 && age < 16){
            System.out.println("上初中,开始早恋");
        }else if (age >= 16 && age < 19){
            System.out.println("上高中,开始苦读");
        }else if (age >= 19 && age < 25){
            System.out.println("上大学,公开谈恋爱");
        }else {
            System.out.println("开始挣钱...");
        }
    }
课堂练习
  • 1.用户输入一个整数,判断是奇数还是偶数
public static void main(String[] args) {
        // 用户输入一个整数,判断是奇数还是偶数
        /**
         * 获取用户输入的整数 Scanner
         * 偶数:如果对2取余,结果是0,就是偶数,否则就是奇数
         */
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        if (i % 2 == 0){
            System.out.println("您输入的是一个偶数");
        }else {
            System.out.println("您输入的是一个奇数");
        }
    }
  • 2.x和y的关系满足如下:
x >= 3    y= 2x +1
-1<x<3    y=2x;
x<=-1     y=2x - 1;

根据给定的x的值,计算出y的值并输出到控制台。

public static void main(String[] args) {
        // x >= 3    y= 2x +1
        // -1<x<3    y=2x;
        // x<=-1     y=2x - 1;
        // 创建Scanner
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入x的值");
        int x = scanner.nextInt();
        int y;
        if (x >= 3){
            y = 2 * x + 1;
        }else if(x > -1 && x < 3){
            y = 2 * x;
        }else{
            y = 2 * x - 1;
        }
        System.out.println("y = " + y);
    }
  • 3.根据用户输入的月份,显示正确的季节 345春天 678夏天 91011秋天 12 1 2 冬天
		Scanner scanner = new Scanner(System.in);
        System.out.println("请输入月份:");
        int month = scanner.nextInt();
        if (month >= 3 && month <= 5){
            System.out.println("浅草才能没马蹄");
        }else if (month >=6 && month <= 8){
            System.out.println("夏天夏天...");
        }else if (month >= 9 && month <= 11){
            System.out.println("我言秋日胜春朝");
        }else if (month == 12 || month == 1 || month == 2){
            System.out.println("梅花香自苦寒来");
        }else {
            System.out.println("您输入的月份有误,别用我的软件");
        }
  • 4.键盘录入学生成绩,判断学生的等级

90-100 优秀

80-90 好

70 -80 良

60- 70 及格

60以下 希望之星

public static void main(String[] args) {
        /**
         * - 键盘录入学生成绩,判断学生的等级
         * 90-100    优秀
         * 80-90    好
         * 70 -80  良
         * 60- 70 及格
         * 60以下 希望之星
         */
        // 创建
        Scanner scanner = new Scanner(System.in);
        System.out.println("请录入学生成绩:");
        double score = scanner.nextDouble();

        // 根据成绩判断学生等级
        if (score >= 90 && score <= 100){
            System.out.println("学生成绩是优秀");
        }else if (score >= 80 && score < 90){
            System.out.println("学生成绩是好");
        }else if (score >= 70 && score < 80){
            System.out.println("学生成绩是良");
        }else if (score >=60 && score < 70){
            System.out.println("学生成绩是及格");
        }else if (score >=0 && score < 60){
            System.out.println("学生是希望之星");
        }else {
            System.out.println("成绩不合理!!");
        }
    }

2.3 switch语句

  • 格式
switch(表达式){
    case 目标值1:
         语句体1;
         break;
    case 目标值2:
         语句体2;
         break;
    ...
    case 目标值n:
         语句体n;
         break;
    default:
          语句体n+1;
          break;

}

switch的格式解释:

switch中的表达式的取值可以是:byte,short,int,char 

JDK5之后表达式的取值也可以是枚举

JDK7以后可以放String。

case中放入的是要和表达式进行比较的值。
语句体中可以放多行代码 
public static void main(String[] args) {
        int a = 5;
        switch (a){
            case 1:
                System.out.println("匹配到1");
                break;
            case 2:
                System.out.println("匹配到2");
                break;
            case 3:
                System.out.println("匹配到3");
                break;
            default:
                System.out.println("不是123的数字");
                break;
        }
    }
  • 根据用户输入的数字,输出是周几
public static void main(String[] args) {
        // 根据用户输入的数字,输出是周几
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入1-7的数字:");
        int weekDay = scanner.nextInt();
        switch (weekDay){
            case 1:
                System.out.println("星期一");
                break;
            case 2:
                System.out.println("星期二");
                break;
            case 3:
                System.out.println("星期三");
                break;
            case 4:
                System.out.println("星期四");
                break;
            case 5:
                System.out.println("星期五");
                break;
            case 6:
                System.out.println("星期六");
                break;
            case 7:
                System.out.println("星期日");
                break;
            default:
                System.out.println("傻X");
                break;
        }
    }

注意事项:

default的break如果是在switch语句的最后一行,可以省略不写,但是不建议省略。

switch中的语句,顺序不影响最终的结果。

case具有穿透效果,如果没有break的影响,那么会一直向下执行。

课堂练习
  • 根据用户输入的月份,显示正确的季节 345春天 678夏天 91011秋天 12 1 2 冬天
public static void main(String[] args) {
        // 根据用户输入的月份,显示正确的季节 345春天  678夏天 91011秋天 12 1 2 冬天
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入月份:");
        int month = scanner.nextInt();
        // shift + alt + 上下
        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("没有这个月份");
                break;
        }
    }

3 循环结构

3.1 概述

循环结构可以在满足循环条件的情况下,反复执行某一段代码。这段被重复执行的代码称之为循环体语句

当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环。如果一直是true,就会一直执行下去,形成死循环

3.2 循环语句的组成

  • 循环变量的初始化(初始化表达式) 类似于笔墨伺候 初始化表达式只需要执行一次

一条或者多条语句,这些语句完成一些初始化操作

  • 循环出口(布尔表达式)

这是一个boolean表达式,这个表达式能决定是否执行循环体。

  • 循环逻辑内容(循环体)

这个部分是循环体语句,也就是我们要多次执行的代码。

  • 循环增量(步进表达式)

这个部分是在一次循环体结束后,下一次循环判断条件执行前执行,用于控制循环条件中的变量,以在合适时候结束循环。

3.3 循环结构for

  • 格式:
for (初始化表达式1;布尔表达式2;步进表达式4){
     循环体;3
}
  • 执行顺序

1 2 3 4 2 3 4 2 3 4…2 3 4 2

当布尔表达式结果是true时,循环会继续执行。当布尔表达式结果是false时,就会结束循环。

课堂练习
  • 在控制台输出100次HelloWorld
// 在控制台输出100次HelloWorld
        // 1  2 3  4 2 3 4 2 3 4... 2
        for (int i = 1;i <= 100;i++){
            System.out.println("HelloWorld" + i);
        }
  • 打印输出1-5 和 5-1
        for (int i = 1;i <= 5;i++){
            System.out.println(i);
        }
        for (int i = 5;i >= 1;i--){
            System.out.println(i);
        }
  • 求出1-100之间的偶数和
		// 求出1-100之间的偶数和
        int sum = 0;
        for (int i = 1;i <= 100;i++){
            // 判断i是否是偶数
            if (i % 2 == 0){
                // 偶数
                sum += i;
            }
        }
        System.out.println("偶数和是" + sum);
        for (int i = 2;i <= 100;i+=2){
            sum += i;
        }
        System.out.println("偶数和是" + sum);
  • 统计"水仙花数"共有多少个
    • "水仙花数"是一个三位数,其中个位的立方+十位的立方+百位的立方正好等于其本身。
//        统计"水仙花数"共有多少个
        int count = 0;
        for (int i = 100;i < 1000;i++){
            // 判断三位数是否是水仙花数
            // 获取个位
            int ge = i % 10;
            // 获取十位
            int shi = i / 10 % 10;
            // 获取百位
            int bai = i / 100 % 10;
            int num = ge * ge * ge + shi * shi * shi + bai * bai * bai;
            boolean flag = (num == i);
            if (flag){
                // 水仙花数
                System.out.println("水仙花数是" + i);
                count++;
            }
        }
        System.out.println("水仙花数总共有" + count + "个");
    }

3.4 while循环

  • 格式:
基本格式:
while(布尔表达式){
  循环体语句;
}

扩展格式:
初始化表达式1
while(布尔表达式2){
   循环体3;
   步进表达式4;
}
  • 执行顺序

1 2 3 4 2 3 4 … 2

  • 当布尔表达式的结果是true时,循环继续执行,当布尔表达式的结果是false时,循环结束。
课堂练习
  • 输出100次HelloWorld
		int i = 1;
        while (i <= 100){
            System.out.println("HelloWorld" + i);
            i++;
        }
  • 求出1-100之间的奇数和
	// 求出1-100的奇数和
        int i = 1;
        int sum = 0;
        while (i <= 100){
            // 判断i是否是奇数
            if (i % 2 != 0){
                sum += i;
                System.out.println(i);
            }
            i++;
        }
        System.out.println("1-100的奇数和是" + sum);

第二种写法

		int i = 1;
        int sum = 0;
        while (i <= 100){
            sum += i;
            i += 2;
        }
        System.out.println("1-100的奇数和是" + sum);
  • 统计水仙花数有多少个
		// 统计水仙花数有多少个
        int i = 100;
        int count = 0;
        while (i < 1000){
            // 获取i的个位十位和百位
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            int num = (ge * ge * ge + shi * shi * shi + bai * bai * bai);
            if (num == i){
                System.out.println(i);
                count++;
            }
            i++;
        }
        System.out.println("水仙花数总共有" + count + "个");

3.5 do-while循环

  • 格式
初始化表达式1;
do{
   循环体3;
   步进表达式4;
}while(布尔表达式2);
  • 执行顺序

1 3 4 2 3 4 2 3 4 2…2

  • 布尔表达式如果结果是true,那么就继续执行循环,如果是false,就结束循环
课堂练习
  • 输出打印100次HelloWorld
  • 求出1-100之间的奇数和
		int i = 1;
        int sum = 0;
        do{
            if (i % 2 == 1){
                sum += i;
            }
            i++;
        }while (i <= 100);

        System.out.println("奇数和是" + sum);
		int i = 1;
        int sum = 0;
        do{
            sum += i;
            i += 2;
        }while (i <= 100);

        System.out.println("奇数和是" + sum);
  • 统计水仙花数有多少个
// 统计水仙花数有多少个
        int i = 100;
        int count = 0;
        do {
            // 获取个位十位和百位
            int ge = i % 10;
            int shi = i / 10 % 10;
            int bai = i / 100 % 10;
            // 求个位十位百位的立方和
            int num = ge * ge * ge + shi * shi * shi + bai * bai * bai;
            if (num == i){
                count++;
            }
            i++;
        }while (i < 1000);

        System.out.println("水仙花数总共有" + count + "个");

3.6 三种循环的区别

这三种循环在大部分情况下都可以通用,但是还是有一些小区别:

  • do…while循环至少会执行一次循环体

  • for循环和while循环的小区别:

    • 使用区别:控制条件语句所控制的那个变量,在for循环结束后就已经不能再次访问,在内存中消失。在while循环结束后,内存中依然存在。
    • for循环内存的使用效率更高。
  • 使用推荐:for --while – dowhile

3.7 跳转控制语句

  • 概述
    • 让循环在某一步的时候结束或者跳过某些数据。
    • 在java中提供了2个关键字break和continue来实现跳转控制语句。
  • break(中断)
    • break的应用场景
      • 在选择结构的switch语句中
      • 在循环语句中表示立即结束当前循环
      • 注意:离开使用场景的存在是没有意义的
  • continue(继续)
    • continue的应用场景
      • 只能用在循环语句中
      • 表示跳出当前循环,继续执行下一次循环
      • continue一般都用在for循环中,这样不会影响步进表达式的执行

3.8 死循环

死循环又称为无限循环,也称为永真循环。就是永远不会结束的循环。

        while (true){}
        for (;true;){}
        for (;;){}

作业

分支作业:

    1. 现要求⽤户输⼊两个数a、b,如果a能被b整除或a加b⼤于1000,则输出a,否则输出b
		Scanner scanner = new Scanner(System.in);
        System.out.println("请您输入两个整数");
        long a = scanner.nextLong();
        long b = scanner.nextLong();
        if (a % b == 0 || a + b > 1000){
            System.out.println("a = " + a);
        }else {
            System.out.println("b = " + b);
        }
    1. 动态录⼊3个数,请使⽤条件结构/三元运算符求3个数的最值
//        
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入3个整数");
        // alt + 鼠标左键
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        int max;//最大值
        if (a > b){
            max = a;
        }else {
            max = b;
        }

        if (max > c){
            System.out.println("最大值是" + max);
        }else {
            System.out.println("最大值是" + c);
        }

第二种写法

		Scanner scanner = new Scanner(System.in);
        System.out.println("请输入3个整数");
        // alt + 鼠标左键
        int a = scanner.nextInt();// 10
        int b = scanner.nextInt();// 5
        int c = scanner.nextInt();// 20
        int max;//最大值
        if (a > b){
            if (a > c){
                System.out.println("最大值是" + a);
            }else {
                // a <= c
                System.out.println("最大值是" + c);
            }
        }else {
            // a <= b
            if (b > c){
                System.out.println("最大值是" + b);
            }else {
                System.out.println("最大值是" + c);
            }
        }
    1. 输⼊⼀个数,判断它是否能被3、5、7整除,注意考虑同时整除的情况
		Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数字");
        int num = scanner.nextInt();
        boolean flag1 = (num % 3 == 0);//能够被3整除
        boolean flag2 = (num % 5 == 0);//能够被5整除
        boolean flag3 = (num % 7 == 0);//能够被7整除
        if (flag1 && flag2 && flag3){
            System.out.println("能够被3,5,7整除");
        }else if (flag1 && flag2){
            System.out.println("能够被3,5整除");
        }else if (flag1 && flag3){
            System.out.println("能够被3,7整除");
        }else if (flag2 && flag3){
            System.out.println("能够被5,7整除");
        }else if (flag1){
            System.out.println("能够被3整除");
        }else if (flag2){
            System.out.println("能够被5整除");
        }else if (flag3){
            System.out.println("能够被7整除");
        }else {
            System.out.println("不能被3,5,7整除");
        }
  • 超市为了促销,规定:购物不⾜50元的按原价付款,超过50不⾜100的按九折付款,超过100元 的,超过部分按⼋折付款。编程序完成超市的⾃动计费的⼯作。
        Scanner scanner = new Scanner(System.in);
        double money = scanner.nextDouble();
        if (money > 50 && money <= 100){
            money *= 0.9;
        }else if (money > 100){
            money = (money - 100) * 0.8 + 90;
        }

        System.out.println("实际支付的金额是" + money);
    5. 商场实⾏新的抽奖规则:会员号的百位数字等于产⽣的随机数字即为幸运会员。实现如下功能:
            1、从键盘接收4位数会员号 1234
            2、⽣成随机数
            提示:int random = (int) (Math.random() * 10);
            3、算出会员号中在百位的数字号码
          提示:int baiwei = custNo / 100 % 10;

        //  Math.random() 是获取伪随机数 范围是 [0,1)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请录入一个4位数的会员号码:");
        // 会员号
        int memberCardNo = scanner.nextInt();
        // 获取会员号的百位的数字
        int bai = memberCardNo / 100 % 10;
        // 生成一个 0-9 的随机数   一个小数强转成整数,是把整个小数部分全部舍弃
        int randomNum = (int)(Math.random() * 10);
        System.out.println(randomNum);
        if (randomNum == bai){
            System.out.println("恭喜你,中奖了!充值1000立减5元!");
        }

循环作业:

  1. 要求⽤户输⼊⼀个0到2之间的整数
    // 如果⽤户输⼊0输出“你出的是⽯头”,
    // 如果⽤户输⼊1就输出“你出的是剪⼑”,
    // 如果⽤户输⼊的是2就输出“你出的是布”,
    // 然后再问是否要继续出拳,
    // 如果回答“y”就重复以上过程,
    // 否则结束程序
 		Scanner scanner = new Scanner(System.in);
        String answer = "y";
        while ("y".equals(answer)){
            System.out.println("请输入一个0到2之间的整数");
            int num = scanner.nextInt();
            switch (num){
                case 0:
                    System.out.println("你出的是⽯头");
                    break;
                case 1:
                    System.out.println("你出的是剪⼑");
                    break;
                case 2:
                    System.out.println("你出的是布");
                    break;
                default:
                    System.out.println("输入的数字有误");
            }

            System.out.println("是否要继续出拳?y/n");
            // 获取用户输入的字符串
            answer = scanner.next();
        }
  1. 求1到100之间所有能被3整除的整数的总和
		int sum = 0;
        for (int i = 1;i <= 100;i++){
            if (i % 3 == 0){
                sum += i;
            }
        }
        System.out.println("和是" + sum);
  1. 计算⽤户输⼊的⽇期离1900年1⽉1⽇相距多少天
        // 1900 6 1  31 + 28 + 31 +30 + 31
        Scanner scanner = new Scanner(System.in);
        // 年  
        int year = scanner.nextInt();
        // 月
        int month = scanner.nextInt();
        // 日
        int day = scanner.nextInt();

        // 1901 1 3
        // totalDay代表的是总天数
        // 计算 天
        int totalDay = day - 1;

        // 计算 年  循环的添加每一年的天数
        for (int y = 1900;y < year;y++){
            // 判断是否是闰年
            // 闰年  能被4整除并且不能被100整除
            // 闰年  能够被400整除
            if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
                totalDay += 366;
            }else {
                totalDay += 365;
            }
        }

        // 计算月  循环的添加每个月的天数
        for (int m = 1; m < month;m++){
            switch (m){
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                    totalDay += 31;
                    break;
                case 2:
                    // 闰年
                    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
                        totalDay += 29;
                        break;
                    }
                    totalDay += 28;
                    break;
                default:
                    totalDay += 30;
                    break;
            }
        }
        System.out.println("距离1900年1月1日的天数是" + totalDay + "天");
    1. 打印出所有0到100之间 带3和3的倍数的数
		int count = 0;
        for (int num = 100; num >= 0;num--){
            int bai = num / 100 % 10;
            int shi = num / 10 % 10;
            int ge = num % 10;
            if (num % 3 == 0 || bai == 3 || shi == 3 || ge == 3){
                count++;
                // println 输出并且换行
                // print 输出但是不换行
                if (count == 1){
                    System.out.print(num);
                    continue;
                }
                System.out.print("," + num);
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值