黑马day03

今天内容安排:
1、猜数字小游戏
1、超市购物小票加入业务逻辑

01猜数字游戏需求.avi
02随机数Random类.avi
03if简介.avi
04循环简介.avi
05猜数字小游戏代码实现.avi

01猜数字游戏需求

* A: 猜数字小游戏
    * a: 分析完成功能所用的知识点
        * 1:生成随机数
        * 2: if语句进行条件判断
        * 3: for循环结构
* B:超市购物小票
    * a: 添加新的业务逻辑

02随机数Random类

* A: Random类
    * a: 功能
        * 生成随机数需要使用到引用类型随机数Random类
    * b: 使用方式
        * import导包:所属包java.util. Random
        * 创建实例格式:Random  random = new Random ();
        * 调用方法
            * nextInt(int maxValue)    产生[0,maxValue)范围的随机数,包含0不包含maxValue
            * nextDouble()  产生[0,1)范围的随机数
            如:
                Random  random = new Random ();
                int  myNumber = random.nextInt(100);//结果为0-99的一个数
* B: 案例代码
    /*
        引用数据类型:Random随机数
        
        java.util.Random
        方法:
        nextInt(int maxValue)    产生[0,maxValue)范围的随机数
        nextDouble()  产生[0,1)范围的随机数

        求1-100的随机数:random.nextInt(100)+1
        附加题:求m到n的随机数
    */
    //导包
    import java.util.Random;
    public class Demo01Random {
        public static void main(String[] args) {
            //创建对象
            Random random = new Random();
            
            //调用方法
            int randomNumber = random.nextInt(100)+1;
            System.out.println(randomNumber);
            
            double randomNumber2 = random.nextDouble();
            System.out.println(randomNumber2);
        }
    }

03if简介

* A: if条件判断语句
    * a: 方式一
        * 1: 书写格式
            if(比较表达式) {
                语句体;
            }
        * 2:执行流程:
            * 先计算比较表达式的值,看其返回值是true还是false。
            * 如果是true,就执行语句体;
            * 如果是false,就不执行语句体;
    * b: 方式二
        * 1: 书写格式
            if(比较表达式) {
                语句体1;
            }else {
                语句体2;
            }
        * 2:执行流程:
            * 首先计算比较表达式的值,看其返回值是true还是false。
            * 如果是true,就执行语句体1;
            * 如果是false,就执行语句体2;
    * c: 方式三
        * 1: 书写格式
            if(比较表达式1) {
                语句体1;
            }else if(比较表达式2) {
                语句体2;
            }else if(比较表达式3) {
                语句体3;
            }
            ...
            else {
                语句体n+1;
            }
        * 2:执行流程:
            * 首先计算比较表达式1看其返回值是true还是false,
            * 如果是true,就执行语句体1,if语句结束。
            * 如果是false,接着计算比较表达式2看其返回值是true还是false,
            
            * 如果是true,就执行语句体2,if语句结束。
            * 如果是false,接着计算比较表达式3看其返回值是true还是false,
            
            * 如果都是false,就执行语句体n+1。
* B: 案例代码
    /*
        if语句:条件判断语句
        
        格式:满足条件就执行对应的语句
        if(条件表达式){
          执行语句;
        }else if(条件表达式){
            执行语句;
        }else {
            执行语句;
        }
    */
    import java.util.Random;
    public class Demo02If{
        //判断小明的得分情况,如果是90-100分,就打印太棒了
        //如果60-89分,就打印还不错
        //其他情况,就打印 什么情况?~
        public static void main(String[] args) {
            
            //产生随机分数
            Random random = new Random();
            int score = random.nextInt(101);
            System.out.print(score);
            
            //开始条件判断
            if(score>=90&&score<=100){
                System.out.println("太棒了");
            }else if(score>=60&&score<=89){
                System.out.println("还不错");
            }else {
                System.out.println("什么情况?!");
            }
        }
    } 

04循环简介

* A: 循环
    * a:  需求:我们需要在用户输错时,让用户再次输入,让用户输入的动作循环执行。这时需要使用到循环语句
    * b: 分类
        * for循环结构
        * while循环结构
        * do while循环结构
    * c: 循环的重要组成部分
        * 循环变量初始化 (初始化表达式)
        * 循环出口(布尔表达式)
        * 循环增量(步进表达式)
        * 循环逻辑内容(循环体)
* B: for循环
    * a: 书写格式
        for(初始化表达式①;布尔表达式②;步进表达式④){
            循环体③
        }
    * b: 执行顺序
        * ①②③④>②③④>②③④… ②不满足为止。
        * ①负责完成循环变量初始化
        * ②负责判断是否满足循环条件,不满足则跳出循环
        * ③具体执行的语句
        * ④循环后,循环条件所涉及变量的变化情况
    * 举例:
        for(int i=0; i<10; i++) {
            System.out.println(“我爱Java”+i);
        }
        //会从0-9输出10次“我爱Java”
* C: 案例代码
    /*
        循环:
            for/while/doWhile
        循环满足条件:
            初始化表达式
            布尔表达式
            步进表达式
            循环体
            
        for(初始化表达式;布尔表达式;步进表达式){
            循环体
        }
        
        初始化表达式执行一次
        布尔表达式   循环体   步进表达式   循环执行  直到布尔表达式条件不满足
        
        break:直接跳出循环
    */
    public class Demo03For {
        public static void main(String[] args) {
            //使用for循环,循环10次
            for(int i=0; i<10; i++){
                //每次打印我爱java字符串并且打印当前次数
                System.out.println("i love java!"+i);
                //使用break关键字,在第六次打印结束后跳出循环
                if(i == 5) {
                    break;
                }
            }
        }
    }

05猜数字小游戏代码实现

* A: 猜数字小游戏        
    * a: 分析
        * 用户给的数可能大于、小于、或等于被猜的数,这样就会出现三种情况,用前面讲的三元运算符可以实现,
            但是得用三元运算符的嵌套,比较麻烦!可以用更简单的方式if条件判断,可以有三个以上的条件
    * b: 需求分析
        * 后台预先生成一个随机数1-100,用户键盘录入猜数字
        * 如果猜对了,打印“恭喜您,答对了”
        * 如果猜错了
        * 猜大了:打印“sorry,您猜大了!”
        * 猜小了:打印“sorry,您猜小了!”
                直到数字猜到为止
                最多只能猜5次,否则提示“sorry,您没有机会了!”
* B: 案例代码
    /*
        猜数字小游戏
        
        完成猜数字小游戏:
        1、产生随机数
        后台预先生成一个随机数1-100,用户键盘录入猜数字
        2、通过if语句对用户猜的数与随机数进行比较
        如果猜对了,打印“恭喜您,答对了”
        如果猜错了
        猜大了:打印“sorry,您猜大了!”
        猜小了:打印“sorry,您猜小了!”
        3、通过for循环完成用户猜数的循环
        直到数字猜到为止
        最多只能猜5次,否则提示“sorry,您没有机会了!”

    */
    import java.util.Random;
    import java.util.Scanner;
    //通过*的方式可以一次导入该包下所有的类,但是不建议使用。建议使用哪个导哪个。
    //import java.util.*;
    public class GuessNumber{
        public static void main(String[] args) {
            //1、产生随机数
            //后台预先生成一个随机数1-100,用户键盘录入猜数字
            //创建随机数对象
            Random random = new Random();
            //产生一个1-100的随机数
            int randomNumber = random.nextInt(100)+1;
            //System.out.println("我产生的随机数是:"+randomNumber+"你猜猜是多少?");  作弊专用

            //产生控制台录入的Scanner对象
            Scanner sc = new Scanner(System.in);
            //3、通过for循环完成用户猜数的循环
            //通过for循环完成猜数字逻辑
            for(int i=1; i<=5; i++){
                //提示用户输入要猜的数,用变量接收
                System.out.println();
                System.out.println("请您输入一个1-100的数:");
                int guessNumber = sc.nextInt();
                
                //2、通过if语句对用户猜的数与随机数进行比较
                //如果猜对了
                if(guessNumber==randomNumber) {
                    //打印猜对后的提示
                    System.out.println("恭喜您,猜对了!");
                    //跳出循环,不用再猜了
                    break;
                }else {//如果猜错了
                    //如果猜大了
                    if(guessNumber>randomNumber) {
                        System.out.println("sorry,您猜大了!");
                    }else {//如果猜小了
                        System.out.println("sorry,您猜小了!");
                    }
                }
                //如果猜到了最后的第5次仍然没有猜对就跳出循环
                if(i==5) {
                    System.out.println("对不起,点太背,下次再来吧!");
                    break;
                }
                //每次猜错后,都提示还有多少次机会
                System.out.println("请注意,您还有"+(5-i)+"次机会,请慎重作答!");
            }
        }
    }

======================================第一阶段===========================================
06if介绍.avi
07for循环注意事项.avi
08while与dowhile循环.avi
09break与continue.avi

06if介绍

* A: if语句详细解释        
    * a: 单条件判断
        * 1: 书写格式
            if(判断条件){
                执行语句体;
            }
            * 满足if条件即执行,不满足不执行。如年龄大于18岁可以注册婚恋网站
        * 2:执行流程:
            * 先计算比较表达式的值,看其返回值是true还是false。
            * 如果是true,就执行语句体;
            * 如果是false,就不执行语句体;
    * b: 互斥条件判断
        * 1: 书写格式
            if(条件表达式){
                执行语句体1;
            }else{
                执行语句体2;
            }
            * 满足条件执行if语句体,不满足执行else语句体。如60分以上及格,60分以下不及格,需要重考

        * 2:执行流程:
            * 首先计算比较表达式的值,看其返回值是true还是false。
            * 如果是true,就执行语句体1;
            * 如果是false,就执行语句体2;
    * c: 多条件判断
        * 1: 书写格式
            if(比较表达式1) {
                语句体1;
            }else if(比较表达式2) {
                语句体2;
            }else if(比较表达式3) {
                语句体3;
            }
            ...
            else {
                语句体n+1;
            }
            * 在多个条件中选择满足条件的if语句体执行,如12月份对应四季
        * 2:执行流程:
            * 首先计算比较表达式1看其返回值是true还是false,
            * 如果是true,就执行语句体1,if语句结束。
            * 如果是false,接着计算比较表达式2看其返回值是true还是false,
            
            * 如果是true,就执行语句体2,if语句结束。
            * 如果是false,接着计算比较表达式3看其返回值是true还是false,
            
            * 如果都是false,就执行语句体n+1。
    * d: 多层条件判断(if语句的嵌套)
        * 1: 书写格式
                if(比较表达式1){
                    if(比较表达式2){
                        语句体1;
                    } 
                }
                
                if(比较表达式1){
                    if(比较表达式2){
                        语句体1;
                    } else {
                        语句体2;
                    }
                } else {
                    语句体3;
                }

                * 在复杂的业务逻辑中,可以使用多层的条件判断代码是否执行。如60分以下的同学不及格重考,60分以上的同学分优秀、良好、及格三个等级。
        * 2:执行流程:
            * 首先计算比较表达式1看其返回值是true还是false,
            * 如果是false,就执行语句体3                
            
            
            * 如果是true,接着计算比较表达式2看其返回值是true还是false,
                * 如果为true,就执行语句体1
                * 如果为false,就执行语句体2
* B: if语句注意事项
    * a:当只有一条语句时,if或else后边的{}可以省略
    * b: 多条件判断区间一般不会重复
    * c:通过if与具体代码块限定了变量作用域,此例还可以进一步验证java编译时只检查语法错误,不检查变量值。    
    * d: 三元运算符类似互斥条件判断语句。不同处在于:三元运算符必然会产生一个数值,该值必须被使用。
        而if语句可以产生数值,也可以不产生,仅完成相应业务逻辑,如打印语句。 
    * e:案例代码
        public class  Demo02If
        {
            public static void main(String[] args) 
            {
                int a = 10;
                if(a==10) {
                    System.out.println(a);
                    int b = 20;
                    System.out.println(b);
                }

                //System.out.println(b);

                boolean c = true;
                int d;

                if(c) {
                    System.out.println("测试代码");
                    d = 100;
                    System.out.println(d);
                }else {
                    d = 200;
                }
                System.out.println(d);
            }
        }
* C: 案例代码
    /*
        if的详细解释:
            单条件判断,满足执行,不满足不执行
            互斥条件判断,if与else选择一个执行
            多条件判断
    */
    import java.util.Random;
    public class Demo04If{
        public static void main(String[] args) {
            //满足18岁,注册百合网
            int age = 16;
            if(age>=18) {
                System.out.println("实名注册,更放心!百合网欢迎您!");
            }
            
            //满足18岁,注册百合网
            if(age>=18) {
                System.out.println("实名注册,更放心!百合网欢迎您!");
            }else {
                System.out.println("别着急,以后机会很多!");
            }
            System.out.println("=========================================");
            //判断小明的得分情况,
            //如果90-100分,就打印太棒了
            //如果80-89分,就打印还不错
            //如果60-79分,就打印过得去
            //其他情况,就打印 什么情况?~
            
            //产生随机分数
            Random random = new Random();
            //int score = random.nextInt(101);
            int score = 250;
            System.out.print(score);
            
            //开始条件判断
            if(score>=90&&score<=100){
                System.out.println("太棒了");
            }else if(score>=80&&score<=89){
                System.out.println("还不错");
            }else if(score>=60&&score<=79){
                System.out.println("过得去");
            }else if(score>=0&&score<=59){
                System.out.println("什么情况?!");
            }else {
                System.out.println("你要上天啊,这分也敢改!");
            }
        }
    }

07for循环注意事项

* A: for循环注意事项
    * a: for循环格式
        for(初始化表达式①;布尔表达式②;步进表达式④){
            循环体③
        }
        执行顺序: ①②③④>②③④>②③④… ②不满足为止。
        ①负责完成循环变量初始化
        ②负责判断是否满足循环条件,不满足则跳出循环
        ③具体执行的语句
        ④循环后,循环条件所涉及变量的变化情况
    * b: 注意事项
        * 1:①②③④四个部分均可以为空
            * 当①为空时,注意变量作用域的范围变化
            * 当②为空时,为条件永远为true的死循环
            * 当③为空时,通常没有意义
            * 当④为空时,可以将其加入到循环体中,或同样成为死循环
        * 2:初始化表达式①的部分可以同时定义多个变量,步进表达式可以同时将多个循环相关变量改变,控制循环条件
* B: 案例代码
    public class Demo05For{
        public static void main(String[] args) {
            //初始化表达式可为空
            int i=0;
            for(; i<10; i++){
                System.out.println("我爱java"+i);
            }
            System.out.println(i);
            System.out.println("===============================");
            //布尔表达式可为空,但是循环将变为死循环,无法跳出循环
            //for(int j=0; ; j++){
            //    System.out.println("我爱java"+j);
            //}
            
            //步进表达式可为空,但是通常会转移到循环体最后
            for(int k=0; k<10; ){
                System.out.println("我爱java"+k);
                k++;
            }
            //初始化表达式、步进表达式军可以同时操作多个变量
            for(int k=0,m=0; k<10; k++,m+=2){
                System.out.println(m+"我爱java"+k);
            }
        }
    }

08while与dowhile循环

* A: while循环结构
    * a: 使用格式
        初始化表达式①
        while(布尔表达式②){
            循环体③
            步进表达式④
        }
    * b: 执行顺序
        ①②③④>②③④>②③④… ②不满足为止。
        ①负责完成循环变量初始化。
        ②负责判断是否满足循环条件,不满足则跳出循环。
        ③具体执行的语句。
        ④循环后,循环变量的变化情况。
    * c: 注意事项
        与for循环的循环变量作用域不同,for循环的循环变量其作用域仅限于循环体内,
        而while循环的循环变量作用域不局限在循环体内。
        与for循环的循环条件为空是是死循环不同,while循环的循环条件不能为空
* B: do-while循环结构
    * a: 使用格式
        初始化表达式①
        do{
            循环体③
            步进表达式④
        }while(布尔表达式②);    

    * b: 执行顺序
         ①③④>②③④>②③④… ②不满足为止。
        ①负责完成循环变量初始化。
        ②负责判断是否满足循环条件,不满足则跳出循环。
        ③具体执行的语句
        ④循环后,循环变量的变化情况
    * c: 注意事项
        do while循环的使用特点为无论是否满足条件,均至少会执行一次。
* C: 案例代码
    public class Demo06While_Dowhile{
        
        public static void main(String[] args) {    
            int i=1;
            while(i<10){
                System.out.println("i love baby!"+i);
                i++;
            }
            
            
            int j=1;
            do{
                System.out.println("i love baby!"+j);
                j++;
            }while(j<10);
        }
    }

09break与continue

* A: break语句
    * a: 作用
            * 跳出所在的循环体
    * b: 书写位置
            * 必须出现在循环或选择结构内
    * c: 举例
        for(int i=0; i<10; i++) {
            if(i>5) {
            break;
        }
            System.out.println(“我爱Java”+i);
        }
        //会从0-5输出6次“我爱Java”
    * d: 案例代码
        public class  Demo04Break
        {
            public static void main(String[] args) 
            {
                /*
                    打印10次i love java
                */
                for(int i = 0; i<10; i++) {
                    System.out.println("i love java!"+i);

                    if(i==8) {
                        break;
                    }
                }
                System.out.println("我已真爱!");
            }
        }
* B: break详细解释
    * a: 作用
        * 在loop/switch选择或者循环过程中,我们总是满足布尔表达条件才能执行对应的代码,然而在这些逻辑过程中,
            可以使用一些关键字直接跳出正在执行的代码,去执行后边或者指定位置的代码,
            这些关键字一旦出现就可以跳转语句执行顺序。
    * b: 使用方式
        * 无法单独使用,必须将break关键字置于switch或循环语句中
    * c: 运行规律
        * 不需要判断任何条件,只要遇到break变直接跳出执行后续代码。会完全跳出选择或者循环结构
        * 只能跳出最近的代码块,不能跨越多级代码块
    * d: 案例代码
    public class Demo07Break{
        public static void main(String[] args) {
            /*
            xiaoY:
            for(int j=0;j<5;j++){
                //使用for循环,循环10次
                for(int i=0; i<10; i++){
                    //每次打印我爱java字符串并且打印当前次数
                    System.out.println(j+"i love java!"+i);
                    //使用break关键字,在第六次打印结束后跳出循环
                    if(i == 5) {
                        break xiaoY;
                    }
                }
            }
            */
            
            xiaoY:
            for(int j=0;j<5;j++){
                //使用for循环,循环10次
                for(int i=0; i<10; i++){

                    //使用break关键字,在第六次打印结束后跳出循环
                    if(i == 5) {
                        //break xiaoY;
                        //continue;
                        continue xiaoY;
                    }
                    
                    //每次打印我爱java字符串并且打印当前次数
                    System.out.println(j+"i love java!"+i);
                    //System.out.println("i love java!"+i);
                }
            }
        
        }
    }
* C:循环标号
    * a: 为什么使用循环标号
        * 当在双层循环或者循环内有switch选择语句时,我们发现,使用break或者continue所作用的对象均是内层语句,
            无法直接跳出外层循环,这时就需要使用标号语句跳转了
    * b: 使用方式
        * 在外层循环外的某行前边,使用后边跟有冒号”:”的标识符,即定义完毕。
            使用时当在内层循环使用break或continue时后边紧跟之前定义的标号即可
    * c: 运行规律
        * 当外层循环外定义了标号
            内层使用break,终止内外双层循环。
            内层使用continue,终止内层循环,继续外层循环。
    * d: 案例代码
        public class Demo09Break3 
        {
            public static void main(String[] args) 
            {

                out:
                for(int i=0; i<10; i++) {
                    for(int j=0; j<5; j++) {
                        System.out.println("i:"+i+" j:"+j);

                        if(j==2){
                            //break out;
                            continue out;
                        }
                    }
                }
            }
        }    
* D: continue介绍
    * a: 作用
        * 提前结束本次循环,继续进行下次循环
    * b: 使用方式
        * 无法单独使用,必须将continue关键字置于循环语句中
    * c:运行规律
        * 不需要判断任何条件,只要遇到continue变直接跳出本轮循环进行下次循环
    * d:举例
        for(int i=0; i<10; i++) {
            if(i==5) {
                continue;
        }
            System.out.println(“我爱Java”+i);
        }
        //会从0-4、6-9输出9次“我爱Java”
    * e: 案例代码
        public class Demo08Continue 
        {
            public static void main(String[] args) 
            {
                for(int i=0; i<10; i++) {
                    if(i==5) {
                        continue;
                    }
                    System.out.println("我爱Java"+i);
                }
            }
        }

============================第二阶段=======================================
10小票追加需求.avi
11switch.avi
12小票追加需求重构代码分析.avi
13if重构三元运算符代码.avi
14打折逻辑实现.avi
15选择与循环购物实现.avi
16购物小票追加需求案例代码总结.avi

10小票追加需求

* A: 购物小票添加需求
    * a: 新的打折需求(判断结果并重新为变量赋值)
        * 如果商品总价超过300元,打95折
        * 如果商品总价超过600元,打9折
        * 如果商品总价超过1000元,打8折
        * 如果商品总价超过1000元,并且少林寺酥饼核桃购买超过30份, 则总价打8折后,立减20
    * b: 操作字符串数据
        * 如果商品名称超过7个字,则截取前7个字加…完成小票商品名
    * c: 使用户操作输入数据后可重新购买
        * 1: 代表开始购物,每次运行购买次数不得超过3次,否则直接打印小票
        * 2: 代表结账(打印小票)
        * 3: 代表不想买了,直接退出

11switch

* A: switch简介
    * a: 需求分析
        * 上面的新增需求中,根据用户的不同选择,完成不同的操作购买、结账、退出,这样的话,就需要用switch来完成
    * b: 使用格式
        * 根据一个变量值,对比多个可选值,当变量值匹配到对应可选值时,执行该值对应的语句
    * c: switch注意事项
        * 变量可选择的类型一共六种:byte,short,int,char,String(JDK1.7后),枚举(JDK1.5后)
        * 如同if语句当中的else,default不是必须存在的
        * break用来跳出选择结构,没有break语句则在某种情况执行后,会忽略剩余case关键字,顺序继续执行剩余代码
        * 与if语句不同,switch语句只能完成具体值的选择,而不能指定取值区间

* B: 案例代码
    /*
        选择结构switch:从几个具体的值当中选择一个,执行对应值后边的代码
        
        格式:如代码
        
        会在第一次执行switch时,对比变量与给定的值是否匹配,匹配后,执行对应给定值后边代码。
        只进行一次匹配,在第一次匹配后,忽略所有的case
        break可以省略,省略后会直接执行后续代码
        所有的case没有顺序限制
    */
    public class Demo08Switch{
        public static void main(String[] args) {
            //根据不同的数字,打印不同的星期 1-7  一~日
            int number = 3;
            
            switch(number){
                case 1:
                    System.out.println("星期一");
                    break;
                case 2:
                    System.out.println("星期二");
                    break;
                case 4:
                    System.out.println("星期四");
                    break;
                case 3:
                    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;
            }
        }
    }

12小票追加需求重构代码分析

* A: 小票追加需求重构代码分析
    * a: 需求分析
        * 使用前两天内容完成购物小票的基本内容。
        * 判断结果并重新为变量赋值均是对总价进行不同条件的判断与赋值
        * 字符串获取长度并截取字符串判断,这里使用if语句替代三元运算符,更为灵活。
        * 使用户操作输入数据后可重新判断是否重新购买时,使用循环语句完成,而在此过程中,我们依据用户输入的1、2、3的过程可是使用switch语句完成。
    * b: 代码重构
        * 用更好的方式,将之前写好的代码重新写一遍,加入新的需求
    * c:根据需求在原有代码上分析应该添加代码的地方,标注为TODO的地方为要添加代码的地方
        /*
            超市管理系统

            基本小票完成后加入业务逻辑:
                判断结果并重新为变量赋值
                如果商品总价超过300元,打95折
                如果商品总价超过600元,打9折
                如果商品总价超过1000元,总价打8折
                如果商品总价超过1000元,并且少林寺酥饼核桃购买超过30份, 则总价打8折后,立减20

                操作字符串数据
                如果商品名称超过7个字,则截取前7个字加…完成小票商品名

                使用户操作输入数据后可重新购买:
                1代表开始购物 (用户输入数量的过程)
                2代表结账(打印小票) (打印小票 票头,票体,票脚)
                3代表不想买了,直接退出 (break跳出选择)
                一次完整的购物逻辑:
                    直接退出
                    购买后...退出
                    购买后...结账
            隐藏:
                将所有代码放到循环中,使多个人可以重复购买
                让一个用户,反复购买,之后结账或退出购买
            */
            import java.util.Scanner;
            public class Supermarket {
                public static void main(String[] args) {
                    //通过变量打印商品报价单
                    //定义每个商品的变量
                    String slsName = "少林寺酥饼核桃";  //名称
                    String slsID = "090115";            //编号
                    double slsPrice = 15.5;                //单价
                    String slsUnit = "个";                //单位
                    int slsNumber;                        //数量
                    double slsMoney;                    //金额
                    
                    String skName = "皇家特供尚康杂粮牡丹饼(复合营养型)";
                    String skID = "090027";
                    double skPrice = 14.5;
                    String skUnit = "个";
                    int skNumber;
                    double skMoney;
                    
                    System.out.println("                        欢迎光临");
                    System.out.println();
                    System.out.println("商品编号        商品名称         商品单价     商品计价单位");
                    System.out.println(slsID+"       "+slsName+"       "+slsPrice+"           "+slsUnit);
                    System.out.println(skID+"       "+skName+"       "+skPrice+"           "+skUnit);
                    
                    //让用户输入每种货物的购买数量
                    //创建Scanner对象,调用nextInt方法
                    Scanner sc = new Scanner(System.in);
                    //提示用户输入
                    System.out.println();
                    System.out.println("请输入您要购买的"+slsName+"数量:");
                    //使用用户输入的数量为已有的数量变量赋值
                    slsNumber = sc.nextInt();
                    slsMoney = slsPrice * slsNumber;
                    System.out.println("请输入您要购买的"+skName+"数量:");
                    //使用用户输入的数量为已有的数量变量赋值
                    skNumber = sc.nextInt();
                    skMoney = skPrice * skNumber;
                    
                    //打印购物小票
                    //票头
                    //直接字符串常量打印
                    System.out.println("            欢  迎  光  临    ");
                    System.out.println("        品名            售价     数量     金额");
                    System.out.println("-------------------------------------------------------");
                    //票体
                    //如果商品名称超过7个字,就截取前7个字+...
                    //TODO 使用if替换掉三元运算符号的实现
                    int slsNameLenght = slsName.length();
                    slsName = slsNameLenght>7 ? slsName.substring(0,7)+"...":slsName;
                    
                    int skNameLenght = skName.length();
                    skName = skNameLenght>7 ? skName.substring(0,7)+"...":skName;
                    
                    System.out.println(slsName+"("+slsID+")   "+slsPrice+"  *  "+slsNumber+"   =  "+slsMoney);
                    System.out.println(skName+"("+skID+")   "+skPrice+"  *  "+skNumber+"   =  "+skMoney);
                    System.out.println("-------------------------------------------------------");
                    
                    //票脚
                    //计算汇总的变量
                    int totalItemsNumber = 2;  //商品项数
                    int  totalNumber = slsNumber+skNumber; //商品件数
                    double totalMoney = slsMoney+skMoney; //商品总金额
                    //判断总金额和少林寺两种数据是否满足打折条件,满足就打折
                    //TODO 打折 
                    double afterTotalMoney = (totalMoney >= 1000&&slsNumber>=30) ? totalMoney*0.9:totalMoney;
                    
                    System.out.println(totalItemsNumber+"项商品   共计:"+totalNumber+"件");
                    //在打印总金额时,超市显示四舍五入后的整数,不包含小数点,需要用到Math类四舍五入方法,及强制类型转换
                    afterTotalMoney = Math.round(afterTotalMoney);
                    System.out.println("总计:"+(int)afterTotalMoney+"元");
                    System.out.println("您真的太幸运了,本次打折活动为您节省了"+(totalMoney-(int)afterTotalMoney));
                    System.out.println("凭此小票换取发票");
                    
                }
            }

13if重构三元运算符代码

* A: if重构三元运算符代码
    * a: 将"###12小票追加需求重构代码分析"中案例代码中的"//TODO 使用if替换掉三元运算符号的实现"位置后面的以下代码:
        int slsNameLenght = slsName.length();
        slsName = slsNameLenght>7 ? slsName.substring(0,7)+"...":slsName;
        
        int skNameLenght = skName.length();
        skName = skNameLenght>7 ? skName.substring(0,7)+"...":skName;
        
        替换为:
        
        if(slsName.length() > 7) {
            //截取前7个字,连接...赋值给slsName
            slsName = slsName.substring(0,7) + "..."; 
        }
            
        if(skName.length() > 7) {
            //截取前7个字,连接...赋值给skName
            skName = skName.substring(0,7) + "..."; 
        }        

14打折逻辑实现

* A: 打折逻辑实现
    * a: 将"###12小票追加需求重构代码分析"中案例代码中的"//TODO 打折逻辑"位置后面的以下代码:
            double afterTotalMoney = (totalMoney >= 1000&&slsNumber>=30) ? totalMoney*0.9:totalMoney;
        替换为:
            //判断总金额和少林寺两种数据是否满足打折条件,满足就打折
            /*
                如果商品总价超过300元,打95折
                如果商品总价超过600元,打9折
                如果商品总价超过1000元,总价打8折
                如果商品总价超过1000元,并且少林寺酥饼核桃购买超过30份, 则总价打8折后,立减20
            */
            double afterTotalMoney = totalMoney;
            //满300打95折
            if(totalMoney>=300&&totalMoney<600) {
                afterTotalMoney = totalMoney*0.95;
            }else if(totalMoney>=600&&totalMoney<1000) {//满600打9折
                afterTotalMoney = totalMoney*0.9;
            }else if(totalMoney>=1000) {//满1000打8折
                afterTotalMoney = totalMoney*0.8;
            }
            //满1000且少林寺超过30,打8折再立减20
            if(totalMoney>=1000&&slsNumber>=30) {
                afterTotalMoney = totalMoney*0.8-20;
            }

15选择与循环购物实现

* A: 超市购物小票新增需求分析
    * a: 确定循环位置
        * 用户操作输入数据过程为修改变量的过程,而不是定义变量的过程。
           所以,所有定义变量的动作均可以定义在循环之前。
    * b: 循环条件
        * 用户打印小票或者不再购买时跳出。(一次完整的购物逻辑)
    * c: 循环体内容
        * 循环体内包含内容为一个switch选择,根据用户选择结果,完成不同的操作逻辑。
        * 购物逻辑:为变量赋值,计算次数
        * 打印小票逻辑:打印小票常量内容与变量值,一次购物完成
        * 跳出逻辑:跳出循环,一次购物完成
        * 用户输入错误逻辑:重新输入购物清单,计算次数
* B: 选择与循环购物实现
    /*
        加入了
            通过用户输入的不同数字,判断用户的操作
            使用for循环的方式完成一个用户一次完整的购买动作
            使用switch语句,完成用户的不同操作
            1:购买:  购买完毕后跳出switch,让用户选择其他操作
            2:付账:  付账完毕后,一次购买完毕,跳出循环(完成一次完整的购买动作)
            3:退出:  选择退出后,一次购买完毕,跳出循环(完成一次完整的购买动作)
        
        的购物小票
    */
    * a: 案例代码(实现了今天新加的所有需求)

            import java.util.Scanner;
            public class Supermarket {
                public static void main(String[] args) {
                    //通过变量打印商品报价单
                    //定义每个商品的变量
                    String slsName = "少林寺酥饼核桃";  //名称
                    String slsID = "090115";            //编号
                    double slsPrice = 15.5;                //单价
                    String slsUnit = "个";                //单位
                    int slsNumber = 0;                        //数量
                    double slsMoney = 0;                    //金额
                    
                    String skName = "皇家特供尚康杂粮牡丹饼(复合营养型)";
                    String skID = "090027";
                    double skPrice = 14.5;
                    String skUnit = "个";
                    int skNumber = 0;
                    double skMoney = 0;
                    
                    //创建Scanner对象,调用nextInt方法
                    Scanner sc = new Scanner(System.in);
                    
                    //将用户的一次操作放到循环中循环执行
                    while(true) {
                    
                        //通过switch完成一次完整的购物动作:
                        /*
                            1代表开始购物 (用户输入数量的过程)
                            2代表结账(打印小票) (打印小票 票头,票体,票脚)
                            3代表不想买了,直接退出 (break跳出选择)
                        */
                        //用户输入要做的动作代码
                        System.out.println();
                        System.out.println("欢迎光临!");
                        System.out.println("请选择您的操作:1代表开始购物、2代表结账(打印小票)、3直接退出");
                        
                        int choose = sc.nextInt();
                        switch(choose) {
                            case 1: //购物,就是为数量变量赋值
                                //打印商品报价单
                                System.out.println("                        欢迎光临");
                                System.out.println();
                                System.out.println("商品编号        商品名称         商品单价     商品计价单位");
                                System.out.println(slsID+"       "+slsName+"       "+slsPrice+"           "+slsUnit);
                                System.out.println(skID+"       "+skName+"       "+skPrice+"           "+skUnit);
                                
                                //让用户输入每种货物的购买数量

                                //提示用户输入
                                System.out.println();
                                System.out.println("请输入您要购买的"+slsName+"数量:");
                                //使用用户输入的数量为已有的数量变量赋值
                                slsNumber = sc.nextInt();
                                slsMoney = slsPrice * slsNumber;
                                System.out.println("请输入您要购买的"+skName+"数量:");
                                //使用用户输入的数量为已有的数量变量赋值
                                skNumber = sc.nextInt();
                                skMoney = skPrice * skNumber;
                                break;
                                
                            case 2://打印购物小票
                                //票头
                                //直接字符串常量打印
                                System.out.println("            欢  迎  光  临    ");
                                System.out.println("        品名            售价     数量     金额");
                                System.out.println("-------------------------------------------------------");
                                
                                //票体
                                //如果商品名称超过7个字,就截取前7个字+...
                                //使用if替换掉三元运算符的实现
                                //slsName的名字是否超过了7个字
                                if(slsName.length() > 7) {
                                    //截取前7个字,连接...赋值给slsName
                                    slsName = slsName.substring(0,7) + "..."; 
                                }
                                    
                                if(skName.length() > 7) {
                                    //截取前7个字,连接...赋值给skName
                                    skName = skName.substring(0,7) + "..."; 
                                }
                                
                                System.out.println(slsName+"("+slsID+")   "+slsPrice+"  *  "+slsNumber+"   =  "+slsMoney);
                                System.out.println(skName+"("+skID+")   "+skPrice+"  *  "+skNumber+"   =  "+skMoney);
                                System.out.println("-------------------------------------------------------");
                                
                                //票脚
                                //计算汇总的变量
                                int totalItemsNumber = 2;  //商品项数
                                int  totalNumber = slsNumber+skNumber; //商品件数
                                double totalMoney = slsMoney+skMoney; //商品总金额
                                //判断总金额和少林寺两种数据是否满足打折条件,满足就打折
                                /*
                                    如果商品总价超过300元,打95折
                                    如果商品总价超过600元,打9折
                                    如果商品总价超过1000元,总价打8折
                                    如果商品总价超过1000元,并且少林寺酥饼核桃购买超过30份, 则总价打8折后,立减20
                                */
                                double afterTotalMoney = totalMoney;
                                //满300打95折
                                if(totalMoney>=300&&totalMoney<600) {
                                    afterTotalMoney = totalMoney*0.95;
                                }else if(totalMoney>=600&&totalMoney<1000) {//满600打9折
                                    afterTotalMoney = totalMoney*0.9;
                                }else if(totalMoney>=1000) {//满1000打8折
                                    afterTotalMoney = totalMoney*0.8;
                                }
                                //满1000且少林寺超过30,打8折再立减20
                                if(totalMoney>=1000&&slsNumber>=30) {
                                    afterTotalMoney = totalMoney*0.8-20;
                                }
                                
                                System.out.println(totalItemsNumber+"项商品   共计:"+totalNumber+"件");
                                //在打印总金额时,超市显示四舍五入后的整数,不包含小数点,需要用到Math类四舍五入方法,及强制类型转换
                                afterTotalMoney = Math.round(afterTotalMoney);
                                System.out.println("总计:"+(int)afterTotalMoney+"元");
                                System.out.println("您真的太幸运了,本次打折活动为您节省了"+(totalMoney-(int)afterTotalMoney));
                                System.out.println("凭此小票换取发票");
                                
                                //每次结账后,将数据重置
                                slsNumber = 0;
                                slsMoney = 0;
                                skNumber = 0;
                                skMoney = 0;
                                
                                break;
                            case 3:
                                System.out.println("欢迎下次带着钱来光临!");
                                //每次退出后,将数据重置
                                slsNumber = 0;
                                slsMoney = 0;
                                skNumber = 0;
                                skMoney = 0;
                                break;
                            default:
                                System.out.println("您输入的选择有误,请重新输入");
                        }
                    }
                }
            }

16购物小票追加需求案例代码总结

* A: 购物小票追加需求案例代码总结
    * a: 分析今天水果超市案例的代码流程        

day03.17_总结

  • 把今天的知识点总结一遍。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容