Java基础语法02-流程控制

Java基础语法2

1 流程控制

1.1 概述

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。

  • 顺序结构

    • 程序从上到下逐行地执行,中间没有任何判断和跳转
  • 分支结构

    • 根据条件,选择性地执行某段代码。
    • 有if…else和switch-case两种分支语句。
  • 循环结构

    • 根据循环条件,重复性的执行某段代码。
    • 有while、do…while、for三种循环语句。
    • 注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。

2 判断语句之if

2.1 if

语法:

if(关系表达式){
    语句体;//当只有一个一条语句体时,{}可以省略

执行流程

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

  • 如果是true就执行语句体

  • 如果是false就不执行语句体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hEcLvC9-1605359354907)(./images/if.png)]

2.2 if…else

语法:

if(关系表达式) { 
    语句体1; 
}else { 
    语句体2; 
}

执行流程

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS6Hvymt-1605359354910)(./images/ifelse.png)]

2.3 if…else if…else

语法:

if (判断条件1) { 
    执行语句1; 
} else if (判断条件2) { 
    执行语句2; 
}... 
}else if (判断条件n) { 
    执行语句n; 
} else { 
    执行语句n+1; 
}

执行流程

  • 首先判断关系表达式1看其结果是true还是false
  • 如果是true就执行语句体1
  • 如果是false就继续判断关系表达式2看其结果是true还是false
  • 如果是true就执行语句体2
  • 如果是false就继续判断关系表达式…看其结果是true还是false
  • 如果没有任何关系表达式为true,就执行语句体n+1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihAQtoUz-1605359354915)(./images/if3.png)]

2.4 if语句与三元运算符

在某些简单的应用中,if语句是可以和三元运算符互换使用的。

  • 三元运算符可简化if-else语句

  • 三元运算符要求必须返回一个结果。

  • if后的代码块可有多个语句

课堂练习:

小明参加高考,他和父亲达成承诺:
如果:
成绩为100分时,奖励一台笔记本电脑;
成绩为(8099]时,奖励一部手机;
当成绩为[60,80]时,奖励一块电话手表;
其它时,什么奖励也没有。
请从键盘输入小明的期末成绩,并加以判断
// 1.新建java文件,用模板把结构补充完整
// 2.Scanner接受成绩  int score = nextInt();
// 3.使用if...else if...else...进行判断
// 4.编译并运行程序,查看结果

public class Text {
    public static void main(String[] args) {
        System.out.println("输入分数:");
        Scanner input =new Scanner(System.in);
        int score =input.nextInt();
        if(score==100){
            System.out.println("奖励一台电脑");
        }
        else if (score>80){
            System.out.println("奖励一部手机");
        }
        else if (score>=60){
            System.out.println("奖励一块电话手表");
        }
       else{
           System.out.println("没有奖励");
        }

//        String b=score==100?"奖励一台电脑":(score>80)?"奖励一部手机":(score>60)?"奖励一块电话手表":"没有奖励";
//        System.out.println(b);
    }
}


2.5 if…else练习

练习1

编写程序:在程序中定义三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。
num1 = 19;
num2 = 23;
num3 = -10;

        int num1=19;
        int num2=23;
        int num3=-10;
        int num=0;
        if (num1>num2){
            num=num1;
            num1=num2;
            num2=num;
        }
        else if(num2>num3){
            num=num2;
            num2=num3;
            num3=num;
        }
        if(num1>num2){
            num=num1;
            num1=num2;
            num2=num;
        }
        System.out.println("result="+num1+" num2="+num2+" num3="+num3);

练习2

编写程序,声明2个int型变量并赋值。判断两数之和,如果大于等于50,打印“hello world!”
// int i1 = 10, i2 = 20;   (i1 + i2) > 50

		int i1=10,i2=20;
        if (i1+i2>=50){
            System.out.println("hello word!");
        }
        else {
            System.out.println("总和小于50");
        }

练习3

编写程序,声明2double型变量并赋值。判断第一个数大于10.0,且(&&)2个数小于20.0,打印两数之和。否则,打印两数的乘积。
 double a=15.0,b=2.0;
        if (a>10.0 && b<20.0){
            System.out.println(a+b);
        }
        else {
            System.out.println(a*b);
        }
    

练习4

我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗相当于人类多少年龄呢?应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人类的年龄。如果用户输入负数,请显示一个提示信息。
        double peopleYear=0;
        System.out.println("输入狗的年龄:");
        Scanner input=new Scanner(System.in);
        double yaer= input.nextDouble();
        if (yaer<=2.0){
            yaer= yaer*10.5;
            System.out.println(yaer);
        }
        else {
            double a=2.0*10.5;
            yaer=yaer-2.0;
            yaer= yaer*4;
            yaer+=a;
            System.out.println(yaer);
        }

练习5

假设你想开发一个玩彩票的游戏,程序随机地产生一个两位数的彩票,提示用户输入一个两位数,然后按照下面的规则判定用户是否能赢。
1)如果用户输入的数匹配彩票的实际顺序,奖金10 000美元。
2)如果用户输入的所有数字匹配彩票的所有数字,但顺序不一致,奖金 3 000美元。
3)如果用户输入的一个数字仅满足顺序情况下匹配彩票的一个数字,奖金1 000美元。
4)如果用户输入的一个数字仅满足非顺序情况下匹配彩票的一个数字,奖金500美元。
5)如果用户输入的数字没有匹配任何一个数字,则彩票作废。
提示1:使用(int)(Math.random() * 90 + 10)产生随机数。
Math.random() : [0,1) * 90 -> [0,90) + 10 -> [10,100) -> [10,99]
提示2:十位与各位分开比较

        int one=0,ten=0;
        int targetNumber=(int)(Math.random() * 90 + 10);
        System.out.println("目标数:"+targetNumber);
        int targetOne=targetNumber/10,targetTen=targetNumber%10;

        System.out.println("请输入一个两位数:");
        Scanner input=new Scanner(System.in);
        int myNumber=input.nextInt();
        int myOne=myNumber/10,myTen=myNumber%10;

        if (myOne==targetOne&myTen==targetTen){
            System.out.println("奖金10000美元!\nPS:匹配彩票的实际顺序");
        }
        else if (myOne==targetTen&myTen==targetOne){
            System.out.println("奖金3000美元!\nPS:所有数字匹配彩票的所有数字,但顺序不一致.");
        }
        else if (myOne==targetOne | myTen==targetTen){
            System.out.println("奖金1000美元!\nPS:一个数字仅满足顺序情况下匹配彩票的一个数字");
        }
        else if (myOne==targetNumber | myTen==targetOne){
            System.out.println("奖金500美元!\nPS:一个数字仅满足非顺序情况下匹配彩票的一个数字");
        }
        else {
            System.out.println("彩票作废!");
        }

3 判断语句之switch-case

3.1 语法

switch(表达式) { 
    case 常量值1: 
        语句体1; 
        break; 
    case 常量值2: 
        语句体2; 
        break; 
    ... 
    default: 
        语句体n+1; 
        break; 
}

3.2 执行流程

  • 首先计算出表达式的值
  • 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
  • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d91wbUKK-1605359354918)(\assets\swich.png)]

使用switch语句的有关规则

  • switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);

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

  • 同一个switch语句,所有case子句中的常量值互不相同;

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

  • default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default

示例

public static void main(String[] args) { 
    //定义变量,判断是星期几 
    int weekday = 6; 
    //switch语句实现选择 
    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("你输入的数字有误"); 
            break; 
    } 
} 

3.3 case的穿透性

在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。

public static void main(String[] args) { 
    int i = 5; 
    switch (i){ 
        case 0: 
            System.out.println("执行case0"); 
            break; 
        case 5: 
            System.out.println("执行case5"); 
        case 10: 
            System.out.println("执行case10"); 
        default: 
            System.out.println("执行default"); 
    } 
}

上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,直接运行完整体switch。

由于case存在穿透性,因此初学者在编写switch语句时,必须要写上break。

课堂练习1:

从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除
或 2)可以被400整除
    
    (year % 4 == 0 && year % 100 != 0) || year % 400 == 0
    
    
从键盘分别输入月、日,判断这一天是当年的第几天22862031+28+31+30+31+20
    int month = 6;
	int day = 20;

        Scanner input =new Scanner(System.in);
        System.out.println("输入年月日");
        int year=input.nextInt();
        int Month=input.nextInt();
        int day=input.nextInt();
        int [] isLeapyear={31,29,31,30,31,30,31,31,30,31,30,31};
        int [] noLeapyear={31,28,31,30,31,30,31,31,30,31,30,31};
//        System.out.println(""+year+Month+day);
        int sum=0;
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
            for (int i=0;i<Month;i++){
                sum+=isLeapyear[i];
            }
            System.out.println(""+year+"年"+Month+"月"+day+"日"+"是"+year+"年第"+sum+"天");
        }
        else {
            for (int i=0;i<Month;i++){
                sum+=noLeapyear[i];
            }
            System.out.println(""+year+"年"+Month+"月"+day+"日"+"是"+year+"年第"+sum+"天");
        }

课堂练习2:

编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级:
score>=90 等级: A
70<=score<90 等级: B 
60<=score<70 等级: C
score<60 等级: D
方式一:使用if-else
方式二:使用switch-case: score / 10: 0 - 10

课堂练习3:

编写一个程序,为一个给定的年份找出其对应的中国生肖。中国的生肖基于12年一个周期,
每年用一个动物代表:rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、
rooster、dog、pig。
提示:2019年:猪 2019 % 12 == 3

switch和if语句的对比

if和switch语句很像,具体什么场景下,应用哪个语句呢?

  • 如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几 种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。

  • 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。 也就是说,使用switch-case的,都可以改写为if-else。反之不成立。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值