今天内容安排:
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_总结
- 把今天的知识点总结一遍。