JAVA基础【day04】:选择/循环结构

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦。 --------史蒂夫.乔布斯

选择结构(if语句)

(1)三种格式
        A:格式1
            if(比较表达式) {
                语句体;
            }
            
            执行流程:
                判断比较表达式的值,看是true还是false
                如果是true,就执行语句体
                如果是false,就不执行语句体
        
        B:格式2
            if(比较表达式) {
                语句体1;
            }else {
                语句体2;
            }
            
            执行流程:
                判断比较表达式的值,看是true还是false
                如果是true,就执行语句体1
                如果是false,就执行语句体2
                
        C:格式3
            if(比较表达式1) {
                语句体1;
            }else if(比较表达式2){
                语句体2;
            }
            ...
            else {
                语句体n+1;
            } 
执行流程:
    判断比较表达式1的值,看是true还是false
    如果是true,就执行语句体1
    如果是false,就继续判断比较表达式2的值,看是true还是false
    如果是true,就执行语句体2
    如果是false,就继续判断比较表达式3的值,看是true还是false
            ...
如果都不满足,就执行语句体n+1

(2)注意事项
    A:比较表达式无论简单还是复杂,结果是boolean类型
    B:if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。
      建议:永远不要省略。
    C:一般来说,有左大括号,就没有分号,有分号,就没有左大括号。
    D:else后面如果没有if,是不会出现比较表达式的。
    E:三种if语句其实都是一个语句,只要有一个执行,其他的就不再执行。
(3)案例:
    A:比较两个数是否相等
    B:获取两个数中的最大值
    C:获取三个数中的最大值(if语句的嵌套)
    D:根据成绩输出对应的等级
    E:根据月份,输出对应的季节
    F:根据x计算对应y的值并输出
(4)三元运算符和if语句第二种格式的关系
    所有的三元运算符能够实现的,if语句的第二种格式都能实现。
    反之不成立。
    如果if语句第二种格式控制的语句体是输出语句,就不可以。
    因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
/*
    if语句的注意事项:
        A:比较表达式无论简单还是复杂,结果必须是boolean类型
        B:if语句控制的语句体如果是一条语句,大括号可以省略;
          如果是多条语句,就不能省略。建议永远不要省略。
        C:一般来说:有左大括号就没有分号,有分号就没有左大括号
*/
class IfDemo2 {
    public static void main(String[] args) {
        int x = 10;
        
        if(x == 10) {
            System.out.println("x等于10");
        }
        
        if((x > 5) || (x == 10)) {
            System.out.println("x大于或者等于10");
        }
        System.out.println("-------------------");
        
        int a = 100;
        
        /*
        if(a == 100) {
            System.out.println("a的值是100");
        }
        */
        
        if(a != 100) {
            System.out.println("a的值是100");
            System.out.println("over");
        }
        System.out.println("-------------------");
        int b = 100;
        if(b != 100);  //这里其实是有语句体的,只不过是空语句体。
        //代码块
        {
            System.out.println("b的值是100");
            System.out.println("over");
        }
    }
}

选择结构(switch语句)

(1)格式:
        switch(表达式) {
            case 值1:
                语句体1;
                break;
            case 值2:
                语句体2;
                break;
            ...
            default:
                语句体n+1;
                break;
        }
        
    格式解释说明:
        switch:说明这是switch语句。
        表达式:可以是byte,short,int,char
            JDK5以后可以是枚举
            JDK7以后可以是字符串
        case:后面的值就是要和表达式进行比较的值
        break:表示程序到这里中断,跳出switch语句
        default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else
(2)面试题
        switch语句的表达式可以是byte吗?可以是long吗?可以是String吗?
            可以,不可以,JDK7以后可以
(3)执行流程:
        A:首先计算表达式的值
        B:和每一个case进行匹配,如果有就执行对应的语句体,看到break就结束。
        C:如果没有匹配,就执行default的语句体n+1。
(4)注意事项:
    A:case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
    B:default可以省略吗?
        可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
        特殊情况:
            case就可以把值固定。
            A,B,C,D
    C:break可以省略吗?
        可以省略,但是结果可能不是我们想要的。
        会出现一个现象:case穿透。
        最终我们建议不要省略
    D:default一定要在最后吗?
        不是,可以在任意位置。但是建议在最后。
    E:switch语句的结束条件
        a:遇到break就结束了
        b:执行到末尾就结束了
(5)案例:
    A:键盘录入一个数字(1-7),输出对应的星期几。
    B:单项选择题
    C:键盘录入一个字符串的问题
        String s = sc.nextLine();
    D:根据给定的月份,输出对应的季节
(6)if语句和switch语句各自的场景
    A:if
        针对boolean类型的判断
        针对一个范围的判断
        针对几个常量的判断
    B:switch
        针对几个常量的判断
import java.util.Scanner;

class SwitchDemo {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        
        //控制键盘录入数据
        System.out.println("请输入一个数据(1-7):");
        int week = sc.nextInt(); //3
        
        //switch判断语句
        switch(week) {
            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;
        }
    }
}

循环语句(for循环)

A:格式
    for(初始化语句;判断条件语句;控制条件语句){
        循环体语句;
    }
            
    执行流程:
        a:执行初始化语句
        b:执行判断条件语句
           如果这里是true,就继续
           如果这里是false,循环就结束
        c:执行循环体语句
        d:执行控制条件语句
        e:回到b
B:注意事项
            a:判断条件语句无论简单还是复杂,结果是boolean类型
            b:循环体语句如果是一条,可以省略大括号,但是不建议
            c:有分号就没有左大括号,有左大括号就没有分号
C:案例
    a:输出10次HelloWorld
    b:输出1-10的数据
    c:输出10-1的数据
    d:求1-10的和
    e:求1-100的和,求1-100的偶数和,求1-100的奇数和
    f:求5的阶乘
    g:在控制台打印水仙花数
    h:统计水仙花个数
    i:改进版的回文数
        一个五位数
        个位 = 万位
        十位 = 千位
        个位 + 十位 + 千位 + 万位 = 百位
    j:统计1-1000之间同时满足如下条件的数据有多少个
        x%3==2
        x%5==3
        x%7==2
/*
    需求:在控制台输出所有的”水仙花数”
    分析:
        我们都不知道什么叫"水仙花数",你让我怎么做呢?
        
        所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
        举例:153就是一个水仙花数。
        153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153

        A:三位数其实是告诉了我们范围。
        B:通过for循环我们就可以实现获取每一个三位数
          但是麻烦是如何获取这个三位数的个,十,百位上的数据
          
          我们如何获取一个数据的个,十,百呢?
            假设有个一个数据:153
            ge: 153%10 = 3
            shi: 153/10%10 = 5
            bai:153/10/10%10 = 1
            qian:x/10/10/10%10
            wan:  x/10/10/10/10%10
            ...

        C:让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
          如果相同,就把该数据在控制台输出。
*/
class ForDemo6 {
    public static void main(String[] args) {
        //三位数其实是告诉了我们范围。
        for(int x=100; x<1000; x++) {
            int ge = x%10;
            int shi = x/10%10;
            int bai = x/10/10%10;
            
            //让ge*ge*ge+shi*shi*shi+bai*bai*bai和该数据比较
            if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) {
                //如果相同,就把该数据在控制台输出。
                System.out.println(x);
            }
        }
    }
}

循环语句(while循环)

A:基本格式
        while(判断条件语句) {
            循环体语句;
        }
            
        扩展格式:
        初始化语句;
        while(判断条件语句){
            循环体语句;
            控制条件语句;
        }
        
        通过查看这个格式,我们就知道while循环可以和for循环等价转换。
B:while的练习
            把for语句的练习用while改进
C:for和while的区别
        a:使用上的区别
            for语句的那个控制条件变量,在循环结束后不能在使用了。
            而while的可以继续使用。
        b:理解上的区别
            for适合于一个范围的判断
            while适合次数不明确的
                举例:吃葡萄
D:案例:
        a:珠穆朗玛峰问题
        b:小芳存钱问题(break以后才能做)
/*
    我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
    请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?

    分析:
        A:定义一个统计变量,默认值是0
        B:最高山峰是珠穆朗玛峰:8848m这是最终的厚度
          我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
        C:我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
          折叠一次有什么变化呢?就是厚度是以前的2倍。
        D:只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
        E:输出统计变量。
*/

class WhileDemo5 {
    public static void main(String[] args) {
        //定义一个统计变量,默认值是0
        int count = 0;
        
        //最高山峰是珠穆朗玛峰:8848m这是最终的厚度
        //我现在有一张足够大的纸张,厚度为:0.01m这是初始厚度
        //为了简单,我把0.01变成1,同理8848就变成了884800
        int end = 884800;
        int start = 1;
        
        while(start<end) {
            //只要每次变化的厚度没有超过珠穆朗玛峰的高度,就折叠,统计变量++
            count++;
            
            //折叠一次有什么变化呢?就是厚度是以前的2倍。
            start *= 2;
            
            System.out.println("第"+count+"次厚度是"+start);
        }
        
        //输出统计变量。
        System.out.println("要叠"+count+"次");
    }
}

循环语句(do...while循环)

A:基本格式
            do {
                循环体语句;
            }while(判断条件语句);
            
            扩展格式:
            初始化语句;
            do {
                循环体语句;
                控制条件语句;
            }while(判断条件语句);
            
            通过查看格式,我们就可以看出其实三种循环的格式可以是统一的。
B:三种循环的区别
            a:do...while循环至少执行一次循环体
            b:for和while必须先判断条件是否是true,然后后才能决定是否执行循环体
/*
    循环语句的区别:
        do...while循环至少执行一次循环体。
        而for,while循环必须先判断条件是否成立,然后决定是否执行循环体语句。
        
    那么,我们一般使用哪种循环呢?
        优先考虑for,其次考虑while,最后考虑do...while
*/
class DoWhileDemo2 {
    public static void main(String[] args) {
        int x = 3;
        while(x < 3) {
            System.out.println("我爱林青霞");
            x++;
        }
        
        System.out.println("--------------");
        
        int y = 3;
        do {
            System.out.println("我爱林青霞");
            y++;
        }while(y < 3);
    }
}

循环使用的注意事项(死循环)

A:一定要注意修改控制条件,否则容易出现死循环。
B:最简单的死循环格式
        a:while(true){...}
        b:for(;;){}

控制跳转语句

(1)break:中断的意思
    A:用在循环和switch语句中,离开此应用场景无意义。
    B:作用
        a:跳出单层循环
        b:跳出多层循环,需要标签语句的配合
(2)continue:继续
    A:用在循环中,离开此应用场景无意义。
    B:作用
        a:跳出单层循环的一次,可以继续下一次
    C:填空题
        for(int x=1; x<=10; x++) {
            if(x%3 == 0) {
                //补齐代码
            }
            System.out.println("Java基础班");
        }
        如何让控制台输出2次:Java基础班
        如何让控制台输出7次:Java基础班
        如何让控制台输出13次:Java基础班
(3)return:返回
    A:用于结束方法的,后面还会在继续讲解和使用。
    B:一旦遇到return,程序就不会在继续往后执行。
/*
    需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,
          每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,
          请问,经过多少天,小芳才可以存到100元钱。

    分析:
        A:小芳的妈妈每天给她2.5元钱
            double dayMoney = 2.5;
        B:她都会存起来
            double daySum = 0;
        C:从第一天开始存储
            int dayCount = 1;
        D:经过多少天,小芳才可以存到100元钱。
            double result = 100;
        E:这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,
            说明要判断dayCount的值,如果对5整除就减去6元钱。
                daySum -= 6;
          由此还隐含了一个问题,就是如果不是5的倍数天的话,钱要累加
                daySum += dayMoney;
        F:因为不知道是多少天,所以我用死循环,一旦超过100元我就退出循环。
*/
class WhileDemo {
    public static void main(String[] args) {
        //每天要存储的钱是2.5元
        double dayMoney = 2.5;
        
        //存钱的初始化值是0
        double daySum = 0;
        
        //从第一天开始存储
        int dayCount = 1;
        
        //最终存储不小于100就不存储了
        int result = 100;
        
        //因为不知道是多少天,所以我用死循环,
        while(true) {
            //累加钱
            daySum += dayMoney;
            
            //一旦超过100元我就退出循环。
            if(daySum >= result) {
                System.out.println("共花了"+dayCount+"天存储了100元");
                break;
            }
            
            if(dayCount%5 == 0) {
                //花去6元钱
                daySum -= 6;
                System.out.println("第"+dayCount+"天花了6元钱");
            }
            
            //天数变化
            dayCount++;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容