三、流程控制

1.条件分支

1.1 单条件分支

语法结构:

if(逻辑运算){
一段代码
}

当逻辑运算结果为true时,执行{}中的代码
当逻辑运算结果为false时,什么都不做
如果"一段代码"只有一行,可以写成(省略花括号)

if(逻辑运算)
一行代码

示例1:如果张浩的Java考试成绩大于98分,张浩就能获得一个MP4作为奖励

public class SimpleIf {
    public static void main(String[] args) {
        int score = 91;    //张浩的Java成绩
        if ( score > 98 ) {
            System.out.println("老师说:不错,奖励一个MP4!");
        } 
    }
}

1.2 多条件分支

由多个if组成的分支,每个if都是独立的

public class SimpleIf {
    public static void main(String[] args) {
        int score = 91;    //张浩的Java成绩
        if ( score > 98 ) {
            System.out.println("老师说:不错,奖励一个MP4!");
        } 
        if ( score <= 98 )  {
            System.out.println("老师说:惩罚进行编码!");
        }
    }
}
1.3 互斥条件分支(二选一)

语法结构:

if(逻辑运算){
一段代码
}else{
一段代码
}
if...else...两个分支一定会执行其中一个
示例3:判断输入的数字是否为偶数

/**
 * 使用if-else结构实现幸运抽奖
 */
public class GoodLuck {

    public static void main(String[] args) {
        /* 产生随机数 */
        int random = (int) (Math.random() * 10);

        /* 从控制台接收一个4位会员号 */
        System.out.println("我行我素购物管理系统 > 幸运抽奖\n");
        System.out.print("请输入4位会员号: ");
        Scanner input = new Scanner(System.in);
        int custNo = input.nextInt();

        /* 分解获得百位 */
        int baiwei = custNo / 100 % 10;

        /* 判断是否是幸运会员 */
        if (baiwei == random) {
            System.out.println(custNo + "是幸运客户,获精美Mp3一个。");
        } else {
            System.out.println(custNo + "  谢谢您的支持!");
        }
    }
}
1.4 多条件互斥条件分支(多选一)
1.4.1 if...else if...else...

语法结构

if(逻辑运算1){
一段代码
}else if(逻辑运算2){
一段代码
} ...
}else if(逻辑运算n){
一段代码
}else{
一段代码
}

if和else..if和else组成了多个分支,程序只能进入第一个符合条件的分支

public class CalcDiscount2 {
    public static void main(String[] args){
        /* 输入会员积分 */
        System.out.print("请输入会员积分: ");
        Scanner input = new Scanner(System.in);
        int custScore = input.nextInt();
        double discount;

        /* 判断折扣 */
        if (custScore < 2000) {
            discount = 0.9;
        } else if ( custScore>=2000 && custScore < 4000) {
            discount = 0.8;
        } else if ( custScore>=4000 && custScore < 8000) {
            discount = 0.7;
        } else {
            discount = 0.6;
        }
        System.out.println("该会员享受的折扣是:" + discount);
    }
}
1.4.2 switch(n)...case...语法

示例4:显示我行我素购物管理系统的登录菜单

public class LoginMenu {
    /**
     * 显示我行我素购物管理系统的登录菜单
     */
    public static void main(String[] args) {
        System.out.println("\n\t\t欢迎使用我行我素购物管理系统1.0版\n");
        System.out.println("\t\t\t 1. 登 录 系 统\n");
        System.out.println("\t\t\t 2. 退 出\n");
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * *\n");
        System.out.print("请选择,输入数字:");

        /* 从键盘获取信息,并执行相应操作---新加代码 */
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        switch (num) {
          case 1:
            /* 显示系统主菜单 */
            System.out.println("\n\t\t欢迎使用我行我素购物管理系统\n");
            System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * \n");
            System.out.println("\t\t\t\t 1. 客 户 信 息 管 理\n");
            System.out.println("\t\t\t 2. 购 物 结 算\n");
            System.out.println("\t\t\t 3. 真 情 回 馈\n");
            System.out.println("\t\t\t 4. 注 销\n");
            System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * \n");
            System.out.print("请选择,输入数字:");
            break;
          case 2:
            /* 退出系统 */
            System.out.println("谢谢您的使用!");
            break;
          default:
            System.out.println("输入错误。");
            break;
        }
    }
}

如果符合某个分支,从某个分支开始执行
如果某个case分支不写break,继续执行下一个分支,直至遇到break或者所有分支全都执行完毕。
swith句式不能用于区间的判断,switch(n)中n的数据类型是有限制的,常规意义上只能是“byte,short,int,char”,当前的JDK1.8版本又支持了"String"类型

嵌套if

什么时候使用嵌套if?
例如:
学校举行运动会,百米赛跑跑入10秒内的学生有资格进决赛,根据性别分别进入男子组和女子组
分析:
1.要判断是否能够进入决赛
2.在确定进入决赛的情况下,还要判断是进入男子组,还是进入女子组

if(score<=10){
        if(gender.equals("男")){
                System.out.println("进入男子组决赛!");
            }else if(gender.equals("女")){
                System.out.println("进入女子组决赛!");
            }
        }else{
            System.out.println("淘汰!");
        }  

例如:

public class CalcDiscount {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入是否是会员:是(y)/否(其他字符)");
        String identity = input.next();
        System.out.println("请输入购物金额:");
        double money = input.nextDouble();
        if(identity.equals("y")){ //会员
            if(money>200){
                money = money * 0.75;
            }else{
                money = money * 0.8;
            }
        }else{ //非会员
            if(money>100){
                money = money * 0.9;
            }
        }
        System.out.println("实际支付:" + money);
    }
}
综合应用
题目:
image.png
public class ConsumeSavePlan {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自动生成方法存根
        Scanner input = new Scanner(System.in);
        System.out.print("请输入消费金额:");
        double money = input.nextDouble();
        double extra = 0;   //换购付款
        int choice = 0; //换购项目
        if(money>=50){
            System.out.println("是否参加优惠换购活动:");
            System.out.println("1:满50元,加2元换购百事可乐饮料1瓶");
            System.out.println("2:满100元,加3元换购500ml可乐一瓶");
            System.out.println("3:满100元,加10元换购5公斤面粉");
            System.out.println("4:满200元,加10元可换购1个苏波尔炒菜锅");
            System.out.println("5:满200元,加20元可换购欧莱雅爽肤水一瓶");
            System.out.println("0:不换购");
            System.out.print("请选择:");
            if(input.hasNextInt()==true){
                choice = input.nextInt();
                switch(choice){
                    case 1:
                        if(money>=50){
                            extra = 2;
                        }
                        break;
                    case 2:
                        if(money>=100){
                            extra = 3;
                        }
                        break;
                    case 3:
                        if(money>=100){
                            extra = 10;
                        }
                        break;
                    case 4:
                        if(money>=200){
                            extra = 10;
                        }
                        break;
                    case 5:
                        if(money>200){
                            extra = 20;
                        }
                        break;
                    default:
                        break;
                }
            }else{
                System.out.println("请输入正确的数字!");
            }
        }
        
        //结账
        double total = money + extra;
        System.out.println("本次消费总金额:"+ total);
        if(choice == 1){
            System.out.println("成功换购:" + "百事可乐饮料1瓶。");
        }else if(choice ==2 ){
            System.out.println("成功换购:" + "500ml可乐一瓶。");
        }else if(choice == 3){
            System.out.println("成功换购:" + "5公斤面粉。");
        }else if(choice == 4){
            System.out.println("成功换购:" + "1个苏波尔炒菜锅。");
        }else if(choice == 5){
            System.out.println("成功换购:" + "欧莱雅爽肤水一瓶。");
        }else {
            System.out.println("无换购项目!");
        }
    }
}

2.循环

简单理解:一件事重复做很多次,一段代码重复执行了N次
复杂理解:一段代码重复执行了N次,其中的变量每次都有变化

2.1 循环的要素

(1) 循环的开始边界
(2) 循环的结束边界
(3) 循环的增量

(1) 循环的条件
(2) 循环的增量

2.2 for循环

遵循规则:
(1) 循环的开始边界
(2) 循环的结束边界
(3) 循环的增量
适用于有明确循环次数的代码(执行多少次)
语法规则:

for(int i = 1; i <= 50; i++){
    需要重复执行的代码
}

示例1:显示50以内所有符合“敲7”规则的数字

for(int i = 1; i <= 50; i++) {
    int g = i % 10; //个位
    int s = i / 10 ; //十位 
    if(i % 7 == 0 || (g == 7 || s == 7)) {
        System.out.print(i);
        System.out.print("\t");
    }
}

for循环的执行顺序

image

for的死循环

  • 没有开始边界,结束边界和增量
for(;;) {
}

  • 没有增量
for(int i  = 0; i <= 3;) {
}

  • 没有结束边界
for(int i  = 0;;i++) {
}

2.3 while循环/do...while循环
2.3.1 while循环

遵循规则:
(1) 循环的条件
(2) 循环的增量
适用于有明确循环条件的代码(什么情况下执行)
语法规则:

while(逻辑表达式){
    需要重复执行的代码
}

当逻辑表达式为true时,会一直执行{}中的代码

示例2:商品价格查询

public class PriceLookup {

    /**
     * 商品价格查询
     */
    public static void main(String[] args) {
        String name = "";       //商品名称
        double price = 0.0;     //商品价格
        int goodsNo = 0;        //商品编号
        System.out.println("MyShopping管理系统  > 购物结算\n");
        //商品清单
        System.out.println("*******************************************");
        System.out.println("请选择购买的商品编号:");
        System.out.println("1.T 恤        2.网球鞋        3.网球拍");
        System.out.println("*******************************************");
        
        Scanner input = new Scanner(System.in);
        String answer = "y";    //标识是否继续
        
        while("y".equals(answer)){
            System.out.print("请输入商品编号:");
            goodsNo = input.nextInt();
            switch(goodsNo){
            case 1:
                name = "T 恤";
                price = 245.0;
                break;
            case 2:
                name = "网球鞋";
                price = 570.0;
                break;
            case 3:
                name = "网球拍";
                price = 320.0;
                break;
            }
            System.out.println(name+ "\t" + "¥" + price +"\n");
            System.out.print("是否继续(y/n)");
            answer = input.next();
        }
        System.out.println("程序结束!");
    }
}

将敲7程序改成while循环实现

int i = 1;
while(i <= 50) {
    int g = i % 10; //个位
    int s = i / 10 ; //十位 
    if(i % 7 == 0 || (g == 7 || s == 7)) {
        System.out.print(i);
        System.out.print("\t");
    }
    i++;
}

2.3.2 do...while循环 (了解)

语法规则

do{
  重复执行的代码
}while(逻辑表达式);

例如:

public class MainMenu {

    /**
     * 升级菜单切换
     */
    public static void main(String[] args) {
        System.out.println("欢迎使用MyShopping管理系统\n");
        System.out.println("*******************************");
        System.out.println("\t1.客 户 信 息 管 理");
        System.out.println("\t2.购 物 结 算");
        System.out.println("\t3.真 情 回 馈");
        System.out.println("\t4.注 销");
        System.out.println("*******************************\n");
        int choice;     //用户选择
        boolean isRight;    //输入是否正确
        System.out.print("请选择,输入数字:");
        Scanner input = new Scanner(System.in);
        do{
            isRight = true;
            choice = input.nextInt();
            if(choice == 1){
                System.out.println("执行客户信息管理");
            }else if(choice == 2){
                System.out.println("执行购物结算");
            }else if(choice == 3){
                System.out.println("执行真情回馈");
            }else if(choice == 4){
                System.out.println("执行注销");
            }else{
                System.out.print("输入错误,请重新输入数字:");
                isRight = false;
            }
        }while(!isRight);
        System.out.println("\n程序结束");
    }
}

while与do...while的区别
while循环,先判断,再尝试执行。可能一次都不执行。
do...while循环,先执行,再判断。至少执行一次

2.4 循环的控制
2.4.1 继续(轮空) continue

某些情况下,我们希望多轮循环中,某轮循环轮空,使用continue
示例3: 打印[1,10]的所有整数,不包括能被3整除的数字

for(int i = 1; i <= 10; i++) {
    if(i % 3 == 0) {
        continue;
    }
    System.out.println(i);
}

2.4.2 中断(结束) break

某些情况下,我们希望循环在中途结束整个循环
示例4: 打印[1,10]的所有整数,直到遇到第一个能被3整除的数字

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

continue与break的区别?
continue:结束该轮循环,继续执行下一轮循环
break: 结束整个循环

2.4.3 循环嵌套

当两个循环发生嵌套关系时
外部循环i执行1轮,内部循环j完整地执行了5轮

for(int i = 1; i <= 3; i++) {
    for(int j = 1; j <= 5; j++) {
        System.out.println(i+"\t"+j);
    }
}

2.4.4 死循环

当循环无法自动执行完毕,无限执行时,程序就是死循环

while(true){
}

上述代码之后,编写任何其他代码都会报错

综合题目

模拟注册登录幸运抽奖全过程
主要功能
1.注册 2.登录 3.幸运抽奖

实现菜单的输出显示
image.png
实现循环执行功能
image.png
实现注册功能

需求说明
输入用户名和密码,系统产生4位随机数作为卡号。
注册成功,显示注册信息并修改注册标识为true

image.png

实现登录功能

需求说明
输入注册时的用户名和密码,登录成功,系统提示欢迎信息
如果用户名和密码输入错误,提示用户继续输入,最多有3次输入机会

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容