6.程序流程控制

流程控制语句是用来控制程序中各个语句执行顺序的语句,也就是控制程序流程走向,可以把语句组合成完成一定功能的小逻辑模块。

流程控制方式采用结构化程序设计中规定的三种基本流程结构:

  • 顺序结构

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

  • 分支结构

    • 根据条件选择性地执行某段代码。

    • 有if-else和switch-case两种分支语句。

  • 循环结构

    • 根据循环条件,重复执行某段代码。

    • 有while、do-while、for三种循环语句。

    • JDK1.5提供了foreach循环,方便的遍历集合、数组。

顺序结构

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

 

分支结构

if-else结构

if语句三种格式:

  • // 如果条件表达式结果为true则执行代码块,否则跳过if语句
    if (条件表达式) {
        执行代码块;
     } 
  • // 条件表达式1为true执行代码块1,否则执行代码块2
    if (条件表达式1) {
        执行代码块1;
    } else {
        执行代码块2;
    }
  • // 条件表达式1为true执行代码块1,否则跳过if,判断else if
    // 条件表达式2为true执行代码块2,否则跳过该else-if,判断下个else-if
    // 判断if和所有的else-if没有成立的就执行else
    if (条件表达式1) {
        执行代码块1;
    } else if (条件表达式2) {
        执行代码块2;
    }
    .....
      else {
          执行代码块N;
      }

if-else使用:

  • 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量。

  • 语句块只有一条执行语句时,大括号{}可以省略,但建议保留。

  • if-else语句结构,根据需要可以嵌套使用。

  • 当if-else结构是“多选一”时,最后的else时可选的,根据需要可以省略。

练习:

1、由键盘输入三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。

public class Test {
    public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
        System.out.print("请输入第一个整数:");
        int num1 = scanner.nextInt();
        System.out.print("请输入第二个整数:");
        int num2 = scanner.nextInt();
        System.out.print("请输入第三个整数:");
        int num3 = scanner.nextInt();
        if (num1 >= num2) {
            if (num2 >= num3) {
                System.out.println(num3 + "," + num2 + "," + num1);
            } else if (num3 >= num1) {
                System.out.println(num2 + "," + num1 + "," + num3);
            } else {
                System.out.println(num2  + "," + num3 + "," + num1);
            }
        } else {
            if (num2 <= num3) {
                System.out.println(num1 + "," + num2 + "," + num3);
            } else if (num3 <= num1) {
                System.out.println(num3 + "," + num1 + "," + num2);
            } else {
                System.out.println(num2 + "," + num3 + "," + num1);
            }
        }
    }
}

2、狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加4岁。编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄,如果用户输入负数,显示一个提示信息。

// 当换成人类的岁数为xx.0时转成int型,否则用double型。
public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入狗的年龄:");
        double humanAge1 = 0.0;
        int humanAge2 = 0;
        int dogAge = scanner.nextInt();
        if (dogAge <= 2) {
            humanAge1 = 10.5 * dogAge;
            humanAge2 = (int)humanAge1;
            if (humanAge1 % humanAge2 != 0) {
                System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge1 + "岁");
            } else {
                System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge2 + "岁");
            }
        } else if (dogAge > 2){
            humanAge1 = (dogAge - 2) * 4 + 10.5 * 2;
            humanAge2 = (int)humanAge1;
            if (humanAge1 % humanAge2 != 0) {
                System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge1 + "岁");
            } else {
                System.out.println("狗狗" + dogAge + "岁,换算成人类为" + humanAge2 + "岁");
            }
        } else {
            System.out.println("输入有误,请重新输入");
        }
    }
}

3、假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,提示用户输入

一个两位数,然后按照下面的规则判定用户是否能赢。

1)如果用户输入的数匹配彩票的实际顺序,奖金10000美元。

2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3000美元。

3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1000美元。

4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。

5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。

public class Test1 {
    public static void main(String[] args) {
        Random random = new Random();
        // 返回0-90整数,不包括90 [0,90)再加10 = [10,100)
        int result = random.nextInt(90) + 10;
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入您的彩票号码:");
        int number = scanner.nextInt();
​
        // /10得到十位 %10得到个位
        if (number == result) {
            System.out.println("您中奖了!奖金为10000美元!开奖号码为:" + result);
            // 将输入的数字倒转过来匹配
        } else if ((number % 10) * 10 + (number / 10) == result) {
            System.out.println("您中奖了!奖金为3000美元!开奖号码为:" + result);
            // 十位与十位对比,个位与个位对比
        } else if (number / 10 == result / 10 || number % 10 == result % 10) {
            System.out.println("您中奖了!奖金为1000美元!开奖号码为:" + result);
            // 不按顺序的匹配一个数字
        } else if (number / 10 == result / 10 || number / 10 == result % 10 || number % 10 == result / 10 || number % 10 == result % 10) {
            System.out.println("您中奖了!奖金为500美元!开奖号码为:" + result);
        } else {
            System.out.println("很遗憾您没有中奖!开奖号码为:" + result);
        }
    }
}

switch-case语句

结构:

switch(表达式/变量) {
    case 常量1:
         语句1;
         break;
    case 常量2:
         语句2;
         break;
    ..........
    case 常量N:
         语句N;
         break;
    default:
         语句;
         break;
}

注意:

  • switch(表达式/变量)中表达式的值必须是byte、shrot、char、int、枚举(JDK1.5)、String(JDK1.7)之一。

  • case子句中的值必须是常量,不能为变量或不确定值得表达式。

  • 同一个switch语句,所有case子句得常量值不相同。

  • break语句用来执行完一个case分支后使程序跳出switch语句块,如果没有break语句,程序会顺序执行到switch结尾。

  • default子句是可有可无得,当没有匹配得case子句时会执行defalut。

switch和if使用费场景

  • 如果判断的具体数值不多,而且符合byte、short、char、int、String、枚举等几种类型,建议使用switch,效率高一点。使用switch-case的都可以改写为if-else。

  • 对区间判断,对结果为boolean类型判断,使用if。反之不成立。

练习:

1、使用switch把小写类型的char型转为大写。只转换 a, b, c, d, e。其它的输出 “other”。

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("输入a、b、c、d、e其中一个需要转换大写的字母:");
        String result = scanner.next();
        char c = result.charAt(0);
        switch (c) {
            case 'a':
                c = 'a'- 32;
                System.out.println(c);
                break;
            case 'b':
                c = 'b'- 32;
                System.out.println(c);
                break;
            case 'c':
                c = 'c'- 32;
                System.out.println(c);
                break;
            case 'd':
                c = 'd'- 32;
                System.out.println(c);
                break;
            case 'e':
                c = 'e'- 32;
                System.out.println(c);
                break;
            default:
                System.out.println("other");
        }
    }
}

2、从键盘分别输入年、月、日,判断这一天是当年的第几天。

public class Test1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("年:");
        int year = scan.nextInt();
        System.out.print("月:");
        int month = scan.nextInt();
        System.out.print("日:");
        int day = scan.nextInt();
        int allday = 0;
            switch (month) {
                case 12:
                    allday += 30;
                case 11:
                    allday += 31;
                case 10:
                    allday += 30;
                case 9:
                    allday += 31;
                case 8:
                    allday += 31;
                case 7:
                    allday += 30;
                case 6:
                    allday += 31;
                case 5:
                    allday += 30;
                case 4:
                    allday += 31;
                case 3:
                    if (year % 4 == 0 && year % 100 != 0) allday += 29;
                    else allday += 28;
                case 2:
                    allday += 31;
                case 1:
                    allday += day;
            }
        System.out.println("" + year + "/" + month + "/" + day + "是当年的第" + allday + "天");
    }
}

3、编写一个程序,为一个给定的年份找出其对应的中国生肖。中国的生肖基于12年一个周期。

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年份,得出当年生肖属相");
        int year = scanner.nextInt();
        year = year % 12;
        switch (year) {
            case 0:
                System.out.println("猴");
                break;
            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;
            case 8:
                System.out.println("龙");
                break;
            case 9:
                System.out.println("蛇");
                break;
            case 10:
                System.out.println("马");
                break;
            case 11:
                System.out.println("羊");
                break;
        }
    }
}

循环结构

循环结构:在某些条件满足的情况下,反复执行特定代码的功能。

循环语句分类:

  • for循环

  • while循环

  • do-while循环

循环语句的四个组成部分:

  • 初始化部分

  • 循环条件部分

  • 循环体部分

  • 迭代部分

for循环

  • 语法格式:

    • for(①初始化部分;②循环条件部分;④迭代部分) {
          ③循环体部分;
      }
  • 执行过程

    • ①-②-③-④-②-③-④-②-③-④-.....-②

  • 说明:

    • ②循环条件部分为boolean类型表达式,当值为false时,退出循环

    • ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔

    • ④可以有多个变量更新,用逗号分隔

练习:

1、编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行 上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的倍数行上打印 输出“baz”。

public class Test1 {
    public static void main(String[] args) {
//        编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行
//        上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的倍数行上打印输出“baz”。
        for (int i = 1; i <= 150; i++) {
            System.out.print(i);
            if (i % 3 == 0) {
                System.out.print("foo");
            } else if (i % 5 == 0) {
                System.out.print("biz");
            } else if (i % 7 == 0){
                System.out.print("baz");
            }
            System.out.println();
        }
    }
}

2、输入两个正整数m和n,求其最大公约数和最小公倍数。

public class Test1 {
    public static void main(String[] args) {
//        输入两个正整数m和n,求其最大公约数和最小公倍数。
//        最小公倍数:两个数共同的最小的倍数
//        最大公约数:两个数共同的最大的因子
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入第一个数:");
        int m = scanner.nextInt();
        System.out.println("输入第二个数:");
        int n = scanner.nextInt();
        int min = m >= n ? n : m;
        int max = m >= n ? m : n;
        // 最大公约数
        for (int i = min; i >= 1; i--) {
            if (m % i == 0 && n % i == 0) {
                System.out.println("" + m + "和" + n + "的最大公约数为:" + i);
                break;
            }
        }
        // 最小公倍数
        for (int i = max; i <= m * n; i++) {
            if (i % m == 0 && i % n == 0) {
                System.out.println("" + m + "和" + n + "的最小公倍数为:" + i);
                break;
            }
        }
    }
}

3、打印1-100的奇数和。

public class Test1 {
    public static void main(String[] args) {
        // 1-100的奇数和
        int num = 0;
        for (int i = 1; i < 100; i++) {
            if (i % 2 != 0) {
                num += i;
                i++;
            }
        }
        System.out.println(num);
    }
}

4、打印1-100间的所有是7的倍数的整数个数及总和。

public class Test1 {
    public static void main(String[] args) {
        // 打印1~100之间所有是7的倍数的整数的个数及总和
        int num = 0;
        int count = 0;
        for (int i = 1; i < 100; i++) {
            if (i % 7 == 0) {
                num += i;
                count++;
            }
        }
        System.out.println("1-100所有7的倍数的个数为" + count + ",总和为:" + num);
    }
}

5、输出所有的水仙花数,所谓水仙花数就是一个3位数,各个位数的立方和等于这个数的本身。

public class Test1 {
    public static int num(int number) {
        number = number * number * number;
        return number;
    }
​
    public static void main(String[] args) {
        // 输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。
        for (int i = 100; i < 1000; i++) {
            if (num((i / 100)) + num((i / 10 % 10)) + num((i % 10)) == i) {
                System.out.println(i);
            }
        }
    }
}

while循环

  • 语法格式:

    • ①初始化部分
      while(②循环条件部分) {
          ③循环体部分; 
          ④迭代部分; 
      }
  • 执行过程:

    • ①-②-③-④-②-③-④-②-③-④-...-②

  • 注意:

    • 注意不要忘记声明④迭代部分。否则循环将不能结束,变成死循环。

    • for循环和while循环可以相互转换。

do-while循环

  • 语法格式:

    • ①初始化部分;
      do{
          ③循环体部分
          ④迭代部分
      }while(②循环条件部分);
  • 执行过程:

    • ①-③-④-②-③-④-②-③-④-...②

  • 注意:do-while是先执行,再判断,也就是说即使循环条件部分不成立也会执行一次循环语句。

练习:

从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。

public class Test1 {
    public static void main(String[] args) {
//      从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
        Scanner scanner = new Scanner(System.in);
        int zhengshu = 0;
        int fushu = 0;
        // 死循环,无限输入正数负数计算个数,直到输入0退出循环
        while (true) {
            System.out.println("请输入整数:");
            int num = scanner.nextInt();
            if (num > 0) {
                zhengshu++;
            } else if (num < 0) {
                fushu++;
            } else if (num == 0) {
                System.out.println("正数个数:" + zhengshu + ",负数个数:" + fushu);
                return;
            }
        }
    }
}

嵌套循环(多重循环)

  • 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while,do-while都可以作为外层循环或内层循环。

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

  • 设置外层循环次数为m,内层循环次数为n,实际上内层需要循环m * n次。

练习: 1、九九乘法表

public class Test1 {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("" + j + "*" + i + "=" + (j * i));
                System.out.print("\t");
            }
            System.out.println();
        }
    }
}

2、100以内的所有质数

// 第一种
public class Test1 {
    public static void main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i == 3 || i == 2 || i == 5) {
                System.out.println(i);
            } else if (i != 1 & i % 2 != 0 & i % 3 != 0 & i % 5 != 0 & i % 7 != 0 & i % 9 != 0) {
                System.out.println(i);
            }
        }
    }
}
// 第二种
public class Test1 {
    public static void main(String[] args) {
        boolean flag = true;
        for (int i = 2; i <= 100; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j ==0) {
                    flag = false;
                    break;
                }
            }
            if (flag == true) {
                System.out.println(i);
            }
            flag = true;
        }
    }
}

特殊流程控制语句

  • break语句

    • break语句用于终止某个语句块的执行。

    • break语句出现在多层嵌套的语句块时,break在哪层就终止哪层语句块。

  • continue语句

    • continue语句只能在循环结构中使用。

    • continue语句用于跳出所在循环语句块的本次循环,继续下次循环。 

  • return语句

    • 并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到return语句时,该方法将被结束。

    • 与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环内。

标号语句

可以给语句块加标号赋予它们名称,标号位于语句之前。标号只能被continue和break引用。

语句前只允许加一个标号,标号后面不能跟大括号。通过用break后加标号对处于标号中的语句进行控制。往往标号后是for.while.do-while等循环。

1、通过标号对外层循环进行控制(continue):

public class Test1 {
    public static void main(String[] args) {
        System.out.println("i j");
        search:
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 50; j++) {
                if (j == 3)
                    continue search;
                System.out.println(i+" "+j);
            }
        }
    }
}
​
// 结果
i j
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2

可以看到内层循环并没有执行50次,而是j == 3的时候就通过标号跳出到外层循环,此时执行之前的i++;

2、通过标号对外层循环进行控制(break):

public class Test1 {
    public static void main(String[] args) {
        System.out.println("i j");
        search:
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 50; j++) {
                if (j == 3)
                    break search;
                System.out.println(i+" "+j);
            }
        }
    }
}
​
// 结果
i j
0 0
0 1
0 2

可以看出内层循环也没有执行50次,而且break后循环就再也没执行。break跳出的是最外层循环,跳出了标号的范围。

break跳出标号对查询一条记录来说比较有用,当查出自己想要的一条记录时,就可以跳出循环了,不用再执行了。

注意:

  • break只能用于switch语句和循环语句中。

  • continue只能用于循环语句。

  • break与continue功能类似,但continue是终止本次循环,break是终止本层循环

  • break和continue之后不能有其他的语句,因为程序永远不会执行其后面的语句。

  • 标号语句必须紧接在循环的头部且后面不能跟大括号,不能用在非循环语句的前面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值