程序控制结构

SOBER大约 9 分钟

程序控制结构

顺序控制

介绍

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

举例和注意事项

Java中定义变量时采用合法的前向引用。

// 正确
public class Testf{
    int num1 = 12:
	int num2 = num1 + 2:
}

// 错误
public class Test{
    int num2 = num1 + 2;
    int num1 = 12;
}

分支控制

介绍

让程序有选择的执行,分支控制有三种

  1. 单分支

    基本语法

    if(条件表达式){
        执行代码块;
    }
    // 说明:当条件表达式为ture 时,就会执行》的代码。如果为false ,就不执行, 如果 {} 中只有一条语句,则可以不用 {},建议写上 {}
    
  2. 双分支

    基本语法

    if(条件表达式){
        执行代码块1;
    }else {
        执行代码块2;
    }
    // 说明:当条件表达式成立,即执行代码块1,否则执行代码块2.如果执行代码块 只有一条语句,则{}可以省略,否则,不能省略
    
  3. 多分支

    基本语法

    if(条件表达式1){
        执行代码块1;
    }else if(条件表达式2) {
        执行代码块2;
    }else {
        执行代码块3;
    }
    
  4. 嵌套分支

    在一个分支结构中又完整的嵌套了另个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。

    规范: 不要超过3层 (可读性不好)

    基本语法

    if(){
        if(){}else{}
    }else {}
    

    案例练习

    /**
     * 案例说明: 
     * 参加歌手比赛,如果初赛成绩大于8.0进入决赛,否则提示淘汰。并且根据性别提示
     * 进入男子组或女子组。
     * 输入成绩和性别, 进行判断和输出信息。
     * 提示: double score; char gender;
     * 接收字: char gender = scanner.next().charAt(0)
     * scanner.next().charAt(0); 取字符串的第一个字符
     **/
    
    /**
     * 思路分析:
     *	1. 创建 scanner 对象,接受用户输入
     *	2. 接收 成绩保存到 double score
     *	3. 使用 if-else 判断 如果初赛成绩大于8.0进入决赛,否则提示淘汰
     *	4. 如果进入到 决赛,再接收 char gender,使用 if-else 输出信息
     **/
    import java.util.Scanner;
    public class Hello {
        public static void main(String[] args){
            Scanner myScanner = new Scanner(System.in);
            System.out.println("请输入该歌手的成绩");
            double score = myScanner.nextDouble();
            if( score > 8.0 ){
                System.out.printIn("请输入性别");
                char gender = myScanner.next() .charAt(0);
                if( gender == '男' ){
                   System.out.println("进入男子组");
                   }else if( gender == '女' ) {
                    System.out.println("进入女子组");
                   }else {
                    System.out.println("你的性别有误,不能参加决赛~");
                   }
                }else {
                    System.out.println("sorry ,你被淘汰了~");
                }
            }
    }
    
  5. switch 分支结构

    基本语法

    1. switch 关键字,表示 **swtich **分支
    2. 表达式 对应一个值
    3. case 常量1 : 当表达式的值等于常量1,就执行 语句块1
    4. break:表示退出 swtich
    5. 如果和 case 常量1 匹配,就执行语句块1,如果没有匹配,就继续匹配 case 常量2
    6. 如果一个都没有匹配上,执行 default
    switch(表达式){
        case 常量1:
            执行语句1;
            break;
        case 常量2:
            执行语句2;
            break;
        default:
            执行语句;
            break;
    }
    

    演示

    // 例一
    double c1 = 'a';
    switch(c1) {
        case "a":
            System.out.println("今天星期一");
            break;
        case "b":
            System.out.println("今天星期二");
            break;
        default:
            System.out.println("今天星期三");
            break;
    }
    
    // 例二
    int c1 = 3;
    switch(c1) {
        case 3:
        case 4:
        case 5:
            System.out.println("这是春季");
            break;
        case 6:
        case 7:
        case 8:
            System.out.println("这是夏季");
            break;
        default:
            System.out.println("今天星期三");
            break;
    }
    

    switch 注意事项和细节讨论

    1. 表达式数据类型,应和 case 后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是 int
    2. switch (表达式)中表达式的返回值必须是:(byte,short,int,char,enum(枚举),String)
    3. case 子句中的值必须是常量,而不能是变量
    4. default 子句是可选的,当没有匹配的 case 时,执行 default
    5. break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果没有写 break,程序会顺序执行到 switch 结尾

for 循环控制

基本语法

for(循环变量初始化; 循环条件; 循环变量迭代){
    循环操作(语句);
}
例如:
    for(int i = 1; i <= 10; i++){
        System.out.println("你好!")
    }

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式

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

int i = 1;
for( ; i <= 10 ; ){
    System.out.println("你好");
    i++;
}
  1. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。

  2. 使用内存分析法,

    int count = 3;
    for(int i = 0, j = 0; i < count; i++, j+= 2){
        System.out.println("i=" + i + " j=" + j);
    }
    输出:
        i=0 j=0
        i=1 j=2
        i=2 j=4
    

练习

  1. 打印1~100之间所有是9的倍数的整数,统计个数 及 总和

  2. 完成下面的表达式输出

    0 + 5 = 5

    1 + 4 = 5

    2 + 3 = 5

    3 + 2 = 5

    4 + 1 = 5

    5 + 0 = 5

    // 练习一
    int count = 0; // 统计个数的变量
    int sum = 0; // 总和
    for(int i = 1; i <= 100; i++){
        if(i % 9 == 0){
            System.out.println("i=" + i);
            count++;
            sum += i;
        }
    }
    System.out.println("个数:" + count + " 总和" + sum);
    
    // 练习二
    for(int i = 0; i <= 5; i++){
        System.out.println(i + "+" + (5 - i) + "=5");
    }
    

while循环控制

基本语法

循环变量初始化;
while (循环条件){
    循环体(语句);
    循环变量迭代;
}

案例

int i = 1; // 循环变量初始化
while(i <= 10){ // 循环条件
     System.out.println("你好!" + i); // 执行语句
    i++; // 循环迭代器
}
System.out.println("你好!" + i);

练习

  1. 打印1-100之间所有能被3整除的数(使用while)
  2. 打印40-200之间所有的偶数(使用while)
// 练习一
int i = 1;
while(i <= 100){
    if(i % 3 == 0){
        System.out.println("i=" + i);
    }
    i++; // 迭代器
}

// 练习二
int j = 40;
while(j <= 200){
    if(j % 2 == 0){
        System.out.println("j=" + j);
    }
    j++;
}

do while 循环控制

基本语法

do{
    循环体(语句);
    循环变量迭代;
}while(循环条件)
/**
 * do while 与 while 的区别
 * do while:先执行,在判断;
 * while:先判断在执行
 **/

案例

int i =1; // 循环变量初始化
do {
    // 循环执行语句
    System.out.println("你好!");
    // 循环变量迭代
    i++;
}while(i <= 10);

练习

  1. 统计1---200之间能被5整除但不能被3整除的 个数

    int i = 1;
    do {
        if(i % 5 == 0 && i % 3 != 0){
            System.out.println("i=" +i);
        }
        i++;
    }while(i <= 200);
    

多重循环

介绍

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

案例

for(int i = 1; i<= 20; i++){
    for(int n = 0; i <= 30; n++){
        
    }
}

练习

  1. 统计3个班成绩情况,每个班有5名同学

    求出各个班的平均分和所有班级的平均分(学生的成绩从键盘输入)。

    统计3个班及格人数,每个班有5名同学。

    import java.util.scanner;
    public class forDome{
        public static void main(String[] args) {
            Scanner myScanner = new Scanner(System.in);
            double total = 0; // 累计所有学生的成绩 
            for(int i = 1; i <= 3; i++){
                int sum = 0; // 累加每个班每个学生的成绩
                for(int n = 1; n <= 5; n++){
                    System.out.println("请输入第" + i + "个班的第" + j + "个学生的成绩");
                    double score = myScanner.nextDouble();
                    sum += score;
                    System.out.println("成绩为" + score);
                }
                System.out.println("总成绩为:" + score + " 平均分=" + (sum / 5));
                total += sum;
            }
            System.out.println("三个班的成绩=" + total + "平均分=" + total / 15);
        }
    }
    
  2. 打印出九九乘法表

    ??????
    
  3. 使用for循环打印金字塔

    public class Hello {
        public static void main(String[] args){
            // i 表示层数
            for(int i = 1; i <= 5; i++){ 
                // 在输出 * 之前,还要输出对应空格 = 总层数 - 当前层
                for(int k = 1; k <= 5 - i; k++){
                    System.out.print(" ");
                }
                // n 表示没每层打印 * 的个数
                for(int n = 1; n <= 2 * i - 1; n++){ 
                    System.out.print("*");
                }
                System.out.println("");
                // 每打印完一层的*后,就换行 println本身会换行  
            }
        }
    }
    // 输出如下金字塔
        *
       ***
      *****
     *******
    *********
    
  4. 打印空心金字塔

    public class Hello {
        public static void main(String[] args){
            // i 表示层数
            int tatol = 20
            for(int i = 1; i <=tatol; i++){ 
                // 在输出 * 之前,还要输出对应空格 = 总层数 - 当前层
                for(int k = 1; k <= tatol - i; k++){
                    System.out.print(" ");
                }
                // n 表示没每层打印 * 的个数
                for(int n = 1; n <= 2 * i - 1; n++){ 
                    if(n == 1 || n == 2 * i -1 || i == tatol){
                        System.out.print("*");
                    }else {
                        System.out.print(" ");
                    }
                }
                System.out.println("");
                // 每打印完一层的*后,就换行 println本身会换行  
            }
        }
    }
    // 输出效果
        *
       * *
      *   *
     *     *
    *********
    

跳转控制语句 (break)

介绍

break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环 [for,while,do-while]

语法

for(int i = 1; i <= 10; i++){
    if(i == 3){
        break;
    }
    System.out.println("ok" + i);
}

注意事项及细节说明:

  1. break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪 层语句块

  2. 标签的基本使用

    1. break 语句可以指定退出哪层

    2. label1 是标签,由程序员指定

    3. break 后指定到哪个label 就退出到哪里

    4. 在实际的开发中,尽量不要使用标签

    5. 如果没有指定 break,默认退出最近的循环体

      public class BreakDetail {
          public static void main(String[] args) {
              abc1:
              for(int j = 0; j< 4; j++){ //外层for
                  abc2:
                  for(int i = ; i< 1; i++){ //内层for
                      if(i == 2){
                          break ; //等价 break abc2
                          // break abc1 ;
                          // break abc2 ;
                      }
                      System.out.println("i = " + i);
                  }
              }
          }
      }
      

需求

  1. 随机生成1-100的一个数,直到生成了97这个数,看看你一共用了几次? 提示使用(int)(Math.random() * 100) + 1
int n = 0;
for(int i =1; i <= 100; i++){
    sum += i;
    if(sum > 20){
        System.out.println("和>20 当数i=" + i);
        n = i;
        break;
    }
}
System.out.println("当前数=" + n);
  1. 实现登录验证,有3次机会,如果用户名为"杨胜军”否则提示还有几次机会,请使用for+break完成
Scanner myScanner = new Scanner(System.in);
String name = "";
String passwd = "";
int chance = 3; // 记录登录次数
for(int i = 1; i <= 3; i++){
    System.out.println("请输入名字");
    name = myScanner.next();
    System.out.println("请输入密码");
    passwd = myScanner.next();
    if('杨胜军'.equais(name) && '123456'.equals(passwd)){
        System.out.println("登录成功!");
        break;
    }
    chance--;
    System.out.println("你还有" + chance + "次登录机会");
}

跳转控制语句(continue)

介绍

  1. continue语句用于结束本次循环,继续执行下一次循环
  2. continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的标签的使用的规则一样.

语法

int i = 1;
while (i <= 4) {
    i++;
    if(i == 2){
        continue;
    }
    System.out.println("i=" + i);
}

带标签使用 continue

label1:
for(int i = 1; i <= 20; i++){
    label2:
    for(int n = 0; n < 10; n++){
        // continue label2; 等价于  continue;
        continue label1; 
    }
}

跳转控制语句 (return)

介绍

return使用在方法,表示跳出所在的方法,注意: 如果 return 写在 main方法,退出程序..