美文网首页
黑马day03

黑马day03

作者: 苗超 | 来源:发表于2016-07-03 22:14 被阅读32次

    今天内容安排:
    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_总结

    • 把今天的知识点总结一遍。

    相关文章

      网友评论

          本文标题:黑马day03

          本文链接:https://www.haomeiwen.com/subject/epjcjttx.html