32-打造一个小超市
0. 目录
- 小超市例程
- Java 的世界是一个类和对象的世界
1. 小超市例程
- Java 就是使用类来描述世界,用类的实例(对象)让世界运转起来
- 各种操作数据的代码太乱了怎么办?
小超市需要:
超市名称
超市地址
停车位数量
收入总和
商品列表
商品名称
商品 id
商品库存
销售价格
进货成本「购买价格」
商品销售「销售数量」
客户
顾客名字
顾客带了多少钱
顾客是否开车过来
2. 代码实现
(base) ➜ SuperMarket git:(main) ✗ tree .
.
├── SuperMarket.iml
└── src
└── com
└── bornforthis
├── RunLittleSupperMarketAppMain.java
├── person
│ └── Customer.java
└── supermarket
├── LittleSuperMarket.java
└── Merchandise.java
6 directories, 5 files
/*
* @Time : 2024/12/19 08:22
* @Author : AI悦创
* @FileName: LittleSuperMarket.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis.supermarket;
/**
* 小超市:LittleSuperMarket
*/
public class LittleSuperMarket {
public String superMarketName; // 超市名称
public String address; // 超市地址
public int parkingCount; // 停车位数量
public double incomingSum; // 收入总和
public Merchandise[] merchandises; // 商品列表
public int[] merchandiseSold; // 商品销售
}
/*
* @Time : 2024/12/19 08:32
* @Author : AI悦创
* @FileName: Merchandise.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis.supermarket;
/**
* 商品列表
*/
public class Merchandise {
public String name; // 商品名称
public String id; // 商品 ID
public int count; // 商品数量、库存
public double soldPrice; // 销售价格
public double purchasePrice; // 购买价格「成本」「进货价」
}
/*
* @Time : 2024/12/19 08:39
* @Author : AI悦创
* @FileName: Customer.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis.person;
/**
* 顾客
*/
public class Customer {
public String name; // 顾客名字
public double money; // 顾客带了多少钱
public boolean isDrivingCar; // 是否开车过来说,我们 supermarket 有停车位
}
接下来编写 RunLittleSupperMarketAppMain.java 学习具体的类的使用:
/*
* @Time : 2024/12/19 08:43
* @Author : AI悦创
* @FileName: RunLittleSupperMarketAppMain.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis;
import com.bornforthis.person.Customer;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
import java.util.Scanner;
public class RunLittleSupperMarketAppMain {
public static void main(String[] args) {
// 创建一个超市类
LittleSuperMarket littleSuperMarket = new LittleSuperMarket();
// 依次给超市的名字,地址,停车位赋值
littleSuperMarket.superMarketName = "AI悦创·超市";
littleSuperMarket.address = "莆田新世纪大道1888号";
littleSuperMarket.parkingCount = 100;
// 给超市 200 中商品
littleSuperMarket.merchandises = new Merchandise[200];
// 统计用的数组
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 每个商品的销售情况
// 为了使用方便,创建一个商品数组引用,和 littleSuperMarket.merchandises 指向同一个数组对象
Merchandise[] all = littleSuperMarket.merchandises;
/**
* Question 1: 为什么要写上面的一行?
* Solution:
* 我们每次要使用 merchandises 的商品时需要如何使用?———— littleSuperMarket.merchandises.name「又臭又长!」
* 而写了上面的代码后,只需要:all.name「苗条又好看🤩」
* TODO: 思考部分👇
* Question 2: 这样套娃,那为什么不能直接 Merchandise[] all = new Merchandise[200];——Why?
* Solution: 如果直接赋值,就意味着没有使用 littleSuperMarket 中的 merchandises,也就是没有存储在 littleSuperMarket.merchandises;
* 1. 弱化了我们的模块化、对象化;
* 2. 使 littleSuperMarket 中的 merchandises 失效,没有存在的意义,数据直接存储在 RunLittleSupperMarketAppMain 中,也就没有面向对象开发的意义。
* */
// 遍历并给 200 种商品赋值
for (int i = 0; i < all.length; i++) {
// 创建并给商品的属性赋值
all[i] = new Merchandise();
all[i].name = "商品" + i;
all[i].count = 200;
all[i].purchasePrice = Math.random() * 200;
all[i].soldPrice = all[i].purchasePrice * (1 + Math.random());
all[i].id = "ID" + i;
}
// 为了证明数据也会同步存储在 littleSuperMarket.merchandises 所以使用 littleSuperMarket.merchandises.length
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
System.out.println(littleSuperMarket.merchandises[i].name);
}
}
}
运行结果:
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=57780:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/huangjiabao/GitHub/iMac/JavaCode/SuperMarket/out/production/SuperMarket com.bornforthis.RunLittleSupperMarketAppMain
商品0
商品1
商品2
商品3
商品4
商品5
商品6
...
商品196
商品197
商品198
商品199
Process finished with exit code 0
方法一
for (int i = 0; i < all.length; i++) { // 创建并给商品的属性赋值 all[i] = new Merchandise(); all[i].name = "商品" + i; all[i].count = 200; all[i].purchasePrice = Math.random() * 200; all[i].soldPrice = all[i].purchasePrice * (1 + Math.random()); all[i].id = "ID" + i; }
方法二
for (int i = 0; i < all.length; i++) { // 创建并给商品的属性赋值 Merchandise m = new Merchandise(); m.name = "商品" + i; m.count = 200; m.purchasePrice = Math.random() * 200; m.soldPrice = m.purchasePrice * (1 + Math.random()); m.id = "ID" + i; // 用创建的商品,给商品数组的第 i 个引用赋值,all 和小超市的商品数组引用指向的是同一个数组对象 all[i] = m; }
all[i] = m;
不一定只能写末尾for (int i = 0; i < all.length; i++) { // 创建并给商品的属性赋值 Merchandise m = new Merchandise(); all[i] = m; m.name = "商品" + i; m.count = 200; m.purchasePrice = Math.random() * 200; m.soldPrice = m.purchasePrice * (1 + Math.random()); m.id = "ID" + i; }
/*
* @Time : 2024/12/19 08:43
* @Author : AI悦创
* @FileName: RunLittleSupperMarketAppMain.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis;
import com.bornforthis.person.Customer;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
import java.util.Scanner;
public class RunLittleSupperMarketAppMain {
public static void main(String[] args) {
// 创建一个超市类
LittleSuperMarket littleSuperMarket = new LittleSuperMarket();
// 依次给超市的名字,地址,停车位赋值
littleSuperMarket.superMarketName = "AI悦创·超市";
littleSuperMarket.address = "莆田新世纪大道1888号";
littleSuperMarket.parkingCount = 100;
// 给超市 200 中商品
littleSuperMarket.merchandises = new Merchandise[200];
// 统计用的数组
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 每个商品的销售情况
// 为了使用方便,创建一个商品数组引用,和 littleSuperMarket.merchandises 指向同一个数组对象
Merchandise[] all = littleSuperMarket.merchandises;
/**
* Question 1: 为什么要写上面的一行?
* Solution:
* 我们每次要使用 merchandises 的商品时需要如何使用?———— littleSuperMarket.merchandises.name「又臭又长!」
* 而写了上面的代码后,只需要:all.name「苗条又好看🤩」
* TODO: 思考部分👇
* Question 2: 这样套娃,那为什么不能直接 Merchandise[] all = new Merchandise[200];——Why?
* Solution: 如果直接赋值,就意味着没有使用 littleSuperMarket 中的 merchandises,也就是没有存储在 littleSuperMarket.merchandises;
* 1. 弱化了我们的模块化、对象化;
* 2. 使 littleSuperMarket 中的 merchandises 失效,没有存在的意义,数据直接存储在 RunLittleSupperMarketAppMain 中,也就没有面向对象开发的意义。
* */
// 遍历并给 200 种商品赋值
// for (int i = 0; i < all.length; i++) {
// // 创建并给商品的属性赋值
// all[i] = new Merchandise();
//
// all[i].name = "商品" + i;
// all[i].count = 200;
// all[i].purchasePrice = Math.random() * 200;
// all[i].soldPrice = all[i].purchasePrice * (1 + Math.random());
// all[i].id = "ID" + i;
// }
for (int i = 0; i < all.length; i++) {
// 创建并给商品的属性赋值
Merchandise m = new Merchandise();
m.name = "商品" + i;
m.count = 200;
m.purchasePrice = Math.random() * 200;
m.soldPrice = m.purchasePrice * (1 + Math.random());
m.id = "ID" + i;
// 用创建的商品,给商品数组的第 i 个引用赋值,all 和小超市的商品数组引用指向的是同一个数组对象
all[i] = m;
}
// for (int i = 0; i < all.length; i++) {
// // 创建并给商品的属性赋值
// Merchandise m = new Merchandise();
// all[i] = m;
// m.name = "商品" + i;
// m.count = 200;
// m.purchasePrice = Math.random() * 200;
// m.soldPrice = m.purchasePrice * (1 + Math.random());
// m.id = "ID" + i;
// }
// 为了证明数据也会同步存储在 littleSuperMarket.merchandises 所以使用 littleSuperMarket.merchandises.length
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
System.out.println(littleSuperMarket.merchandises[i].name);
}
}
}
/*
* @Time : 2024/12/19 08:43
* @Author : AI悦创
* @FileName: RunLittleSupperMarketAppMain.java
* @Software: IntelliJ IDEA
* @Version: V1.0
* @Blog : https://bornforthis.cn/
* Code is far away from bugs with the god animal protecting
* I love animals. They taste delicious.
*/
package com.bornforthis;
import com.bornforthis.person.Customer;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
import java.util.Scanner;
public class RunLittleSupperMarketAppMain {
public static void main(String[] args) {
// 创建一个超市类
LittleSuperMarket littleSuperMarket = new LittleSuperMarket();
// 依次给超市的名字,地址,停车位赋值
littleSuperMarket.superMarketName = "AI悦创·超市";
littleSuperMarket.address = "莆田新世纪大道1888号";
littleSuperMarket.parkingCount = 100;
// 给超市 200 中商品
littleSuperMarket.merchandises = new Merchandise[200];
// 统计用的数组
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 每个商品的销售情况
// 为了使用方便,创建一个商品数组引用,和 littleSuperMarket.merchandises 指向同一个数组对象
Merchandise[] all = littleSuperMarket.merchandises;
/**
* Question 1: 为什么要写上面的一行?
* Solution:
* 我们每次要使用 merchandises 的商品时需要如何使用?———— littleSuperMarket.merchandises.name「又臭又长!」
* 而写了上面的代码后,只需要:all.name「苗条又好看🤩」
* TODO: 思考部分👇
* Question 2: 这样套娃,那为什么不能直接 Merchandise[] all = new Merchandise[200];——Why?
* Solution: 如果直接赋值,就意味着没有使用 littleSuperMarket 中的 merchandises,也就是没有存储在 littleSuperMarket.merchandises;
* 1. 弱化了我们的模块化、对象化;
* 2. 使 littleSuperMarket 中的 merchandises 失效,没有存在的意义,数据直接存储在 RunLittleSupperMarketAppMain 中,也就没有面向对象开发的意义。
* */
// 遍历并给 200 种商品赋值
// for (int i = 0; i < all.length; i++) {
// // 创建并给商品的属性赋值
// all[i] = new Merchandise();
//
// all[i].name = "商品" + i;
// all[i].count = 200;
// all[i].purchasePrice = Math.random() * 200;
// all[i].soldPrice = all[i].purchasePrice * (1 + Math.random());
// all[i].id = "ID" + i;
// }
for (int i = 0; i < all.length; i++) {
// 创建并给商品的属性赋值
Merchandise m = new Merchandise();
m.name = "商品" + i;
m.count = 200;
m.purchasePrice = Math.random() * 200;
m.soldPrice = m.purchasePrice * (1 + Math.random());
m.id = "ID" + i;
// 用创建的商品,给商品数组的第 i 个引用赋值,all 和小超市的商品数组引用指向的是同一个数组对象
all[i] = m;
}
// for (int i = 0; i < all.length; i++) {
// // 创建并给商品的属性赋值
// Merchandise m = new Merchandise();
// all[i] = m;
// m.name = "商品" + i;
// m.count = 200;
// m.purchasePrice = Math.random() * 200;
// m.soldPrice = m.purchasePrice * (1 + Math.random());
// m.id = "ID" + i;
// }
// 为了证明数据也会同步存储在 littleSuperMarket.merchandises 所以使用 littleSuperMarket.merchandises.length
// for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
// System.out.println(littleSuperMarket.merchandises[i].name);
// }
System.out.println("超市开张啦!");
boolean open = true;
Scanner scanner = new Scanner(System.in);
while (open) {
System.out.println("本店叫做" + littleSuperMarket.superMarketName);
System.out.println("地址在" + littleSuperMarket.address);
System.out.println("共有停车位" + littleSuperMarket.parkingCount + "个");
System.out.println("今天的营业额为" + littleSuperMarket.incomingSum);
System.out.println("共有商品" + littleSuperMarket.merchandises.length + "种");
Customer customer = new Customer();
customer.name = "顾客编号" + ((int) (Math.random() * 10000000));
customer.money = (1 + Math.random()) * 1000;
customer.isDrivingCar = Math.random() > 0.5;
//----------------迎客进门---------
//开车来的给分配车位,没车位就不让进了
if (customer.isDrivingCar) {
if (littleSuperMarket.parkingCount > 0) {
System.out.println("欢迎" + customer.name + "驾车而来。本店已经为您安排了车位,停车免费哦。车位编号为" + littleSuperMarket.parkingCount);
littleSuperMarket.parkingCount -= 1;
} else {
System.out.println("不好意思,本店车位已满。欢迎您下次光临");
continue;
}
} else {
System.out.println("欢迎" + customer.name + "光临本店");
}
// 接待此顾客
double totalCost = 0;
while (true) {
// 顾客选商品
System.out.println("本店提供" + littleSuperMarket.merchandises.length + "种商品,请输入您要购买的商品编号:");
int merchandiseId = scanner.nextInt();
// 输入负数表示买好了。
if (merchandiseId < 0) {
System.out.println("您本次购买了" + totalCost + "元的商品。欢迎您再次光临。");
break;
}
// 商品没有,让顾客继续选择
if (merchandiseId >= littleSuperMarket.merchandises.length) {
System.out.println("次商品本店没有,欢迎继续挑选");
continue;
}
// 商品有,问顾客要购买多少个
Merchandise toBuy = littleSuperMarket.merchandises[merchandiseId];
System.out.println(toBuy.name + "单价" + toBuy.soldPrice + "。请问购买几个?");
int numToBuy = scanner.nextInt();
// 不想买,看看也欢迎
if (numToBuy <= 0) {
System.out.println("不买看看也好,欢迎继续选购");
continue;
}
// 买的太多,库存不够
if (toBuy.count < numToBuy) {
System.out.println(toBuy.name + "只有" + toBuy.count + "件了,不够" + numToBuy + "。欢迎继续选购。");
continue;
}
// 顾客钱不够
if (numToBuy * toBuy.soldPrice + totalCost > customer.money) {
System.out.println("您带的钱不够结账,请您理智消费。");
continue;
}
// 钱也够,货也够
// 更新顾客此次消费的总额
// 应该是 numToBuy * m.soldPrice 而不是 numToBuy * m.purchasePrice . 鸣谢 @Geek_421d56 帮忙活捉bug一只.
// totalCost += numToBuy.count * toBuy.soldPrice;
totalCost += numToBuy * toBuy.soldPrice;
// 更新商品库存
toBuy.count -= numToBuy;
// 更新今日销货数据
littleSuperMarket.merchandiseSold[merchandiseId] += numToBuy;
}
// 归还车位
if (customer.isDrivingCar) {
littleSuperMarket.parkingCount++;
}
// 更新数据
customer.money -= totalCost;
littleSuperMarket.incomingSum += totalCost;
System.out.println(customer.name + "共消费" + totalCost + "。欢迎再次光临。");
System.out.println("请问继续营业吗?");
open = scanner.nextBoolean();
}
System.out.println("超市关门啦!");
System.out.println("今日销售额为" + littleSuperMarket.incomingSum + "。营业统计如下:");
for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) {
int sold = littleSuperMarket.merchandiseSold[i];
if (sold > 0) {
Merchandise m = littleSuperMarket.merchandises[i];
double netIncoming = sold * (m.soldPrice - m.purchasePrice);
double incoming = sold * m.soldPrice;
System.out.println(littleSuperMarket.merchandises[i].name + "售出" + sold + "个。销售额" + incoming + "。毛利润" + netIncoming);
}
}
}
}
3. 代码解析
3.1 step1 code
package com.bornforthis;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
/**
* @ClassName: step1
* @Description: TODO
* @Author: AndersonHJB
* @date: 2022/12/10 14:57
* @Version: V1.0
* @Blog: https://bornforthis.cn
*/
public class step1 {
public static void main(String[] args) {
// 实例化我们的小超市
LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 实例化我们的超市,创建一个具体的超市
littleSuperMarket.address = "世纪大道9999号"; // 超市的地址
littleSuperMarket.superMarketName = "有家超市"; // 超市名称
littleSuperMarket.parkingCount = 200; // 停车位,小超市有多少个停车位
littleSuperMarket.merchandises = new Merchandise[200]; // 小超市有200种商品「200种元素,之后要对200种元素初始化商品」
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 商品销售
// 相同下标的数据,merchandises and merchandiseSold 每个商品对应的销售数量
/*
* 两百个商品,意味着:Merchandise 类型数组,元素共有 200 个
* */
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
littleSuperMarket.merchandises[i] = new Merchandise();
}
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
littleSuperMarket.merchandises[i].count = 200;
littleSuperMarket.merchandises[i].id = "ID" + i;
littleSuperMarket.merchandises[i].name = "商品" + i;
littleSuperMarket.merchandises[i].purchasePrice = Math.random() * 200;
littleSuperMarket.merchandises[i].soldPrice = (1 + Math.random()) * 200;
// System.out.println(Math.random()*200);
}
// 输出 name 查看是否商品添加成功
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
System.out.println(littleSuperMarket.merchandises[i].name);
;
}
}
}
3.2 问题
- 代码可读性较低
- 太长,编写太累了;
优化方法:声明一个新数组,然后来代替:littleSuperMarket.merchandises
3.3 step2 code
package com.bornforthis;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 实例化我们的超市,创建一个具体的超市
littleSuperMarket.address = "世纪大道9999号"; // 超市的地址
littleSuperMarket.superMarketName = "有家超市"; // 超市名称
littleSuperMarket.parkingCount = 200; // 停车位,小超市有多少个停车位
littleSuperMarket.merchandises = new Merchandise[200]; // 小超市有200种商品「200种元素,之后要对200种元素初始化商品」
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 商品销售
// 相同下标的数据,merchandises and merchandiseSold 每个商品对应的销售数量
/*
* 两百个商品,意味着:Merchandise 类型数组,元素共有 200 个
* */
Merchandise[] all = littleSuperMarket.merchandises;
System.out.println(all == littleSuperMarket.merchandises); // 判断是否是同一个,true 为同一个物理地址
}
}
返回为 true。所以可以等价操作,在 Java 中直接用 ==
是判断物理地址。所以,可以直接实现:
package com.bornforthis;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
/**
* @ClassName: step2
* @Description: TODO
* @Author: AndersonHJB
* @date: 2022/12/10 14:57
* @Version: V1.0
* @Blog: https://bornforthis.cn
*/
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 实例化我们的超市,创建一个具体的超市
littleSuperMarket.address = "世纪大道9999号"; // 超市的地址
littleSuperMarket.superMarketName = "有家超市"; // 超市名称
littleSuperMarket.parkingCount = 200; // 停车位,小超市有多少个停车位
littleSuperMarket.merchandises = new Merchandise[200]; // 小超市有200种商品「200种元素,之后要对200种元素初始化商品」
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 商品销售
// 相同下标的数据,merchandises and merchandiseSold 每个商品对应的销售数量
/*
* 两百个商品,意味着:Merchandise 类型数组,元素共有 200 个
* */
Merchandise[] all = littleSuperMarket.merchandises;
// System.out.println(all == littleSuperMarket.merchandises); // 判断是否是同一个,true 为同一个物理地址
for (int i = 0; i < all.length; i++) {
all[i] = new Merchandise();
}
for (int i = 0; i < all.length; i++) {
all[i].count = 200;
all[i].id = "ID" + i;
all[i].name = "商品" + i;
all[i].purchasePrice = Math.random() * 200; // 进货价格
all[i].soldPrice = (1 + Math.random()) * 200; // 销售价格
}
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
System.out.println(all[i].name);
}
}
}
上面编写的方法,至少需要两个循环,我能不能只用一个 for 实现呢。看下面的代码实现:
package com.bornforthis;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
/**
* @ClassName: step2
* @Description: TODO
* @Author: AndersonHJB
* @date: 2022/12/10 14:57
* @Version: V1.0
* @Blog: https://bornforthis.cn
*/
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 实例化我们的超市,创建一个具体的超市
littleSuperMarket.address = "世纪大道9999号"; // 超市的地址
littleSuperMarket.superMarketName = "有家超市"; // 超市名称
littleSuperMarket.parkingCount = 200; // 停车位,小超市有多少个停车位
littleSuperMarket.merchandises = new Merchandise[200]; // 小超市有200种商品「200种元素,之后要对200种元素初始化商品」
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 商品销售
// 相同下标的数据,merchandises and merchandiseSold 每个商品对应的销售数量
/*
* 两百个商品,意味着:Merchandise 类型数组,元素共有 200 个
* */
Merchandise[] all = littleSuperMarket.merchandises;
// System.out.println(all == littleSuperMarket.merchandises); // 判断是否是同一个,true 为同一个物理地址
for (int i = 0; i < all.length; i++) {
Merchandise m = new Merchandise();
m.count = 200;
m.id = "ID" + i;
m.name = "商品" + i;
m.purchasePrice = Math.random() * 200; // 进货价格
m.soldPrice = (1 + Math.random()) * 200; // 销售价格
all[i] = m;
}
for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
System.out.println(all[i].name);
}
}
}
好了,到此我们继续往下编写剩余部分代码。
package com.bornforthis;
import com.bornforthis.person.Customer;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
import java.util.Scanner;
/**
* @ClassName: step2
* @Description: TODO
* @Author: AndersonHJB
* @date: 2022/12/10 14:57
* @Version: V1.0
* @Blog: https://bornforthis.cn
*/
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 实例化我们的超市,创建一个具体的超市
littleSuperMarket.address = "世纪大道9999号"; // 超市的地址
littleSuperMarket.superMarketName = "有家超市"; // 超市名称
littleSuperMarket.parkingCount = 200; // 停车位,小超市有多少个停车位
littleSuperMarket.merchandises = new Merchandise[200]; // 小超市有200种商品「200种元素,之后要对200种元素初始化商品」
littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 商品销售,销售数量
// 相同下标的数据,merchandises and merchandiseSold 每个商品对应的销售数量
/*
* 两百个商品,意味着:Merchandise 类型数组,元素共有 200 个
* */
Merchandise[] all = littleSuperMarket.merchandises;
// System.out.println(all == littleSuperMarket.merchandises); // 判断是否是同一个,true 为同一个物理地址
for (int i = 0; i < all.length; i++) {
Merchandise m = new Merchandise();
m.count = 200;
m.id = "ID" + i;
m.name = "商品" + i;
m.purchasePrice = Math.random() * 200; // 进货价格
m.soldPrice = (1 + Math.random()) * 200; // 销售价格
all[i] = m;
}
// for (int i = 0; i < littleSuperMarket.merchandises.length; i++) {
// System.out.println(all[i].name);
// }
System.out.println("超市开门啦");
boolean open = true; // 是不是在营业
// TODO: this
Scanner scanner = new Scanner(System.in);
while (open) {
// 营业就自报家门
System.out.println("本店叫做" + littleSuperMarket.superMarketName);
System.out.println("本店地址" + littleSuperMarket.address);
System.out.println("共有停车位" + littleSuperMarket.parkingCount + "个");
System.out.println("今天的营业额为" + littleSuperMarket.incomingSum);
System.out.println("共有商品" + littleSuperMarket.merchandises.length + "种");
// 顾客
Customer customer = new Customer(); // 新的顾客
customer.name = "顾客编号" + ((int) (Math.random() * 10000));
// Math.random() 0~1 之间的随机数
// 1 + Math.random(); 1~2 之间随机整数
customer.money = (1 + Math.random()) * 1000; // 1k~2k 之内的随机数
customer.isDrivingCar = Math.random() > 0.5; // 大于 0.5 就是开车了。
// 到此,顾客已经编写好。接下来是顾客要逛超市买东西
// Scanner scanner = new Scanner(System.in); // TODO:>>>因为 Scanner 是不断要用的,只要超市不关门,就要不停的使用,所以移动到上面👆while 循环外面
// 判断顾客是否是开车来的:
if (customer.isDrivingCar) { // todo:如果开车
if (littleSuperMarket.parkingCount > 0) {
// todo: 判断剩余车位是否大于 0
// littleSuperMarket.parkingCount--; // 为了让读取的编号准确,我们移动到下面👇
System.out.println("欢迎" + customer.name + "驾车而来。本店已经为您安排了车位,停车免费哦。车位编号为" + littleSuperMarket.parkingCount);
littleSuperMarket.parkingCount--;
} else {
System.out.println("不好意思,本店车位已满。欢迎您下次光临");
continue;
}
} else { // 不是开车来,走路来就直接欢迎
System.out.println("欢迎" + customer.name + "光临本店");
}
// 写在这里,总价
double totalCost = 0;
while (true) {
System.out.println("本店提供" + all.length + "种商品,欢迎选购。请输入商品编号");
int index = scanner.nextInt();
// 怎么结束呢?
if (index < 0) {
break;
}
Merchandise m = all[index]; // 取出商品数据,相较于之前的是逆向思维
// System.out.println(m.name);
System.out.println("您选购的商品名字" + m.name + "。单价是" + m.soldPrice + "。请问您要购买多少个?");
int numToBuy = scanner.nextInt(); // 要买多少个
// todo:>>>接下来算花了多少钱,可以写在下面吗?👇
// double totalCost = 0;
// TODO: 显然不行,总价会被一直初始化为 0
totalCost += numToBuy * m.soldPrice;
// 更新商品剩余货存
m.count -= numToBuy;
littleSuperMarket.merchandiseSold[index] += numToBuy;
}
// 结账
customer.money -= totalCost;
// 结账之后,恢复停车位数量
if (customer.isDrivingCar) {
littleSuperMarket.parkingCount++;
}
System.out.println("顾客" + customer.name + "共消费了" + totalCost);
// 计算收入总和
littleSuperMarket.incomingSum = totalCost; // 顾客花了多少就是收入多少
// 到此基本上也是购物一次了
// 错误注释 接下来就是要询问是否继续购买 // 这个留作扩张作业
// 问我:还继续营业吗?
System.out.println("还继续营业吗?");
open = scanner.nextBoolean();
System.out.println("超市关门了!");
System.out.println("今天总的营业额为:" + littleSuperMarket.incomingSum + "。营业情况如下");
for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) {
// Merchandise m = littleSuperMarket.merchandises[i];
Merchandise m = all[i]; // 商品信息
int numSold = littleSuperMarket.merchandiseSold[i]; // 得到商品销售数量
if (numSold > 0) {
double incomming = m.soldPrice * numSold; // 本商品的销售额
double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; // 纯利润
System.out.println(m.name + "售出了" + numSold + "个。销售额为"
+ incomming + "。净利润为" + netIncomming);
}
}
}
}
}
接下来,我们来运行看看效果,然后看看补充一些代码,来完善我们的小超市。
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=54962:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/huangjiabao/GitHub/SourceCode/Java_Coder/Coder39/out/production/Coder39 com.bornforthis.step2
超市开门啦
本店叫做有家超市
本店地址世纪大道9999号
共有停车位200个
今天的营业额为0.0
共有商品200种
欢迎顾客编号7366光临本店
本店提供200种商品,欢迎选购。请输入商品编号
99
您选购的商品名字商品99。单价是225.87109318146204。请问您要购买多少个?
3
本店提供200种商品,欢迎选购。请输入商品编号
-1
顾客顾客编号7366共消费了677.6132795443862
还继续营业吗?
false
超市关门了!
今天总的营业额为:677.6132795443862。营业情况如下
商品99售出了3个。销售额为677.6132795443862。净利润为464.11526201583166
Process finished with exit code 0
目前代码其实是不够强壮的,比如:
/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=55404:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/huangjiabao/GitHub/SourceCode/Java_Coder/Coder39/out/production/Coder39 com.bornforthis.step2
超市开门啦
本店叫做有家超市
本店地址世纪大道9999号
共有停车位200个
今天的营业额为0.0
共有商品200种
欢迎顾客编号6568光临本店
本店提供200种商品,欢迎选购。请输入商品编号
200
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 200 out of bounds for length 200
at com.bornforthis.step2.main(step2.java:95)
Process finished with exit code 1
输出超出目标范围,就报错了。所以对于数组的输入要做检查。
解决:
package com.bornforthis;
import com.bornforthis.person.Customer;
import com.bornforthis.supermarket.LittleSuperMarket;
import com.bornforthis.supermarket.Merchandise;
import java.util.Scanner;
/**
* @ClassName: step2
* @Description: TODO
* @Author: AndersonHJB
* @date: 2022/12/10 14:57
* @Version: V1.0
* @Blog: https://bornforthis.cn
*/
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
......
// 怎么结束呢?
if (index < 0) {
break;
}
if (index >= all.length) {
System.out.println("本店没有这种商品,请叙述编号在0到" + (all.length - 1) + "之内的商品编号。");
continue;
}
......
System.out.println("超市关门了!");
System.out.println("今天总的营业额为:" + littleSuperMarket.incomingSum + "。营业情况如下");
for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) {
// Merchandise m = littleSuperMarket.merchandises[i];
Merchandise m = all[i]; // 商品信息
int numSold = littleSuperMarket.merchandiseSold[i]; // 得到商品销售数量
if (numSold > 0) {
double incomming = m.soldPrice * numSold; // 本商品的销售额
double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; // 纯利润
System.out.println(m.name + "售出了" + numSold + "个。销售额为"
+ incomming + "。净利润为" + netIncomming);
}
}
}
}
}
还有一种情况,虽然程序不会出错,但是逻辑是错的,就是用户输入想买商品的个数的时候「0 或 小于 0」
public class step2 {
public static void main(String[] args) {
// 实例化我们的小超市
......
System.out.println("您选购的商品名字" + m.name + "。单价是" + m.soldPrice + "。请问您要购买多少个?");
int numToBuy = scanner.nextInt(); // 要买多少个
// todo:>>>接下来算花了多少钱,可以写在下面吗?👇
// double totalCost = 0;
// TODO: 显然不行,总价会被一直初始化为 0
// TODO:还有一种情况,虽然程序不会出错,但是逻辑是错的,就是用户输入购买的数量小于等于0,那其实不就好像,店向顾客买东西么😂倒贴
if (numToBuy <= 0) {
System.out.println("不买看看也好,欢迎继续挑选。");
continue;
}
totalCost += numToBuy * m.soldPrice;
......
System.out.println("超市关门了!");
System.out.println("今天总的营业额为:" + littleSuperMarket.incomingSum + "。营业情况如下");
for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) {
// Merchandise m = littleSuperMarket.merchandises[i];
Merchandise m = all[i]; // 商品信息
int numSold = littleSuperMarket.merchandiseSold[i]; // 得到商品销售数量
if (numSold > 0) {
double incomming = m.soldPrice * numSold; // 本商品的销售额
double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; // 纯利润
System.out.println(m.name + "售出了" + numSold + "个。销售额为"
+ incomming + "。净利润为" + netIncomming);
}
}
}
}
}
如果买的太多,带的钱不够呢?
public class step2 {
public static void main(String[] args) {
......
// TODO:还有一种情况,虽然程序不会出错,但是逻辑是错的,就是用户输入购买的数量小于等于0,那其实不就好像,店向顾客买东西么😂倒贴
if (numToBuy <= 0) {
System.out.println("不买看看也好,欢迎继续挑选。");
continue;
}
if (numToBuy * m.purchasePrice > customer.money) {
System.out.println("您带的钱不够,欢迎继续挑选");
continue;
}
......
if (numSold > 0) {
double incomming = m.soldPrice * numSold; // 本商品的销售额
double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; // 纯利润
System.out.println(m.name + "售出了" + numSold + "个。销售额为"
+ incomming + "。净利润为" + netIncomming);
}
}
}
}
}
还有一种情况,就是顾客要买的超过库存了。
public class step2 {
public static void main(String[] args) {
......
// double totalCost = 0;
// TODO: 显然不行,总价会被一直初始化为 0
// TODO:还有一种情况,虽然程序不会出错,但是逻辑是错的,就是用户输入购买的数量小于等于0,那其实不就好像,店向顾客买东西么😂倒贴
if (numToBuy <= 0) {
System.out.println("不买看看也好,欢迎继续挑选。");
continue;
}
if (numToBuy > m.count) {
System.out.println("本店库存没有这么多,欢迎继续挑选");
continue;
}
if (numToBuy * m.purchasePrice > customer.money) {
System.out.println("您带的钱不够,欢迎继续挑选");
continue;
}
......
if (numSold > 0) {
double incomming = m.soldPrice * numSold; // 本商品的销售额
double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; // 纯利润
System.out.println(m.name + "售出了" + numSold + "个。销售额为"
+ incomming + "。净利润为" + netIncomming);
}
}
}
}
}
优化:
if (numToBuy * m.purchasePrice + totalCost > customer.money) {
System.out.println("您带的钱不够,欢迎继续挑选");
continue;
}
4. Java 的世界是一个类和对象的世界
- Java 就是使用类来描述世界,用类的实例(对象)让世界运转起来
- 各种操作数据的代码太乱了怎么办?
详情
语雀
package com.bornforthis; import com.bornforthis.person.Customer; import com.bornforthis.supermarket.LittleSuperMarket; import com.bornforthis.supermarket.Merchandise; import java.util.Scanner; public class RunLittleSupperMarketAppMain { public static void main(String[] args) { // 创建一个小超市类 LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 依次给超市的名字,地址,停车位赋值 littleSuperMarket.superMarketName = "有家小超市"; littleSuperMarket.address = "浦东新区世纪大道666号"; littleSuperMarket.parkingCount = 100; // 给超市200种商品 littleSuperMarket.merchandises = new Merchandise[200]; // 统计用的数组 littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 为了使用方便,创建一个商品数组引用,和littleSuperMarket.merchandises指向同一个数组对象 Merchandise[] all = littleSuperMarket.merchandises; // 遍历并给200种商品赋值 for (int i = 0; i < all.length; i++) { // 创建并给商品的属性赋值 Merchandise m = new Merchandise(); m.name = "商品" + i; m.count = 200; m.purchasePrice = Math.random() * 200; m.soldPrice = m.purchasePrice * (1 + Math.random()); m.id = "ID" + i; // 用创建的商品,给商品数组的第i个引用赋值,all和小超市的商品数组引用指向的是同一个数组对象 all[i] = m; } System.out.println("超市开张啦!"); boolean open = true; Scanner in = new Scanner(System.in); while (open) { System.out.println("本店叫做" + littleSuperMarket.superMarketName); System.out.println("地址在" + littleSuperMarket.address); System.out.println("共有停车位" + littleSuperMarket.parkingCount + "个"); System.out.println("今天的营业额为" + littleSuperMarket.incomingSum); System.out.println("共有商品" + littleSuperMarket.merchandises.length + "种"); Customer customer = new Customer(); customer.name = "顾客编号" + ((int) (Math.random() * 10000000)); customer.money = (1 + Math.random()) * 1000; customer.isDrivingCar = Math.random() > 0.5; //----------------迎客进门--------- //开车来的给分配车位,没车位就不让进了 if (customer.isDrivingCar) { if (littleSuperMarket.parkingCount > 0) { System.out.println("欢迎" + customer.name + "驾车而来。本店已经为您安排了车位,停车免费哦。车位编号为" + littleSuperMarket.parkingCount); littleSuperMarket.parkingCount -= 1; } else { System.out.println("不好意思,本店车位已满。欢迎您下次光临"); continue; } } else { System.out.println("欢迎" + customer.name + "光临本店"); } // 接待此顾客 double totalCost = 0; while (true) { // 顾客选商品 System.out.println("本店提供" + littleSuperMarket.merchandises.length + "种商品,请输入您要购买的商品编号:"); int merchandiseId = in.nextInt(); // 输入负数表示买好了。 if (merchandiseId < 0) { System.out.println("您本次购买了" + totalCost + "元的商品。欢迎您再次光临。"); break; } // 商品没有,让顾客继续选择 if (merchandiseId >= littleSuperMarket.merchandises.length) { System.out.println("次商品本店没有,欢迎继续挑选"); continue; } // 商品有,问顾客要购买多少个 Merchandise toBuy = littleSuperMarket.merchandises[merchandiseId]; System.out.println(toBuy.name + "单价" + toBuy.soldPrice + "。请问购买几个?"); int numToBuy = in.nextInt(); // 不想买,看看也欢迎 if (numToBuy <= 0) { System.out.println("不买看看也好,欢迎继续选购"); continue; } // 买的太多,库存不够 if (toBuy.count < numToBuy) { System.out.println(toBuy.name + "只有" + toBuy.count + "件了,不够" + numToBuy + "。欢迎继续选购。"); continue; } // 顾客钱不够 if (numToBuy * toBuy.soldPrice + totalCost > customer.money) { System.out.println("您带的钱不够结账,请您理智消费。"); continue; } // 钱也够,货也够 // 更新顾客此次消费的总额 // 应该是 numToBuy * m.soldPrice 而不是 numToBuy * m.purchasePrice . 鸣谢 @Geek_421d56 帮忙活捉bug一只. // totalCost += numToBuy.count * toBuy.soldPrice; totalCost += numToBuy * toBuy.soldPrice; // 更新商品库存 toBuy.count -= numToBuy; // 更新今日销货数据 littleSuperMarket.merchandiseSold[merchandiseId] += numToBuy; } // 归还车位 if (customer.isDrivingCar) { littleSuperMarket.parkingCount++; } // 更新数据 customer.money -= totalCost; littleSuperMarket.incomingSum += totalCost; System.out.println(customer.name + "共消费" + totalCost + "。欢迎再次光临。"); System.out.println("请问继续营业吗?"); open = in.nextBoolean(); } System.out.println("超市关门啦!"); System.out.println("今日销售额为" + littleSuperMarket.incomingSum + "。营业统计如下:"); for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) { int sold = littleSuperMarket.merchandiseSold[i]; if (sold > 0) { Merchandise m = littleSuperMarket.merchandises[i]; double netIncoming = sold * (m.soldPrice - m.purchasePrice); double incoming = sold * m.soldPrice; System.out.println(littleSuperMarket.merchandises[i].name + "售出" + sold + "个。销售额" + incoming + "。毛利润" + netIncoming); } } } }
GitHub 1
package com.geekbang; import com.geekbang.person.Customer; import com.geekbang.supermarket.LittleSuperMarket; import com.geekbang.supermarket.Merchandise; import java.util.Scanner; public class RunLittleSupperMarketAppMain { public static void main(String[] args) { // 创建一个小超市类 LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); // 依次给超市的名字,地址,停车位赋值 littleSuperMarket.superMarketName = "有家小超市"; littleSuperMarket.address = "浦东新区世纪大道666号"; littleSuperMarket.parkingCount = 100; // 给超市200种商品 littleSuperMarket.merchandises = new Merchandise[200]; // 统计用的数组 littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; // 为了使用方便,创建一个商品数组引用,和littleSuperMarket.merchandises指向同一个数组对象 Merchandise[] all = littleSuperMarket.merchandises; // 遍历并给200种商品赋值 for (int i = 0; i < all.length; i++) { // 创建并给商品的属性赋值 Merchandise m = new Merchandise(); m.name = "商品" + i; m.count = 200; m.purchasePrice = Math.random() * 200; m.soldPrice = m.purchasePrice * (1 + Math.random()); m.id = "ID" + i; // 用创建的商品,给商品数组的第i个引用赋值,all和小超市的商品数组引用指向的是同一个数组对象 all[i] = m; } System.out.println("超市开张啦!"); boolean open = true; Scanner in = new Scanner(System.in); while (open) { System.out.println("本店叫做" + littleSuperMarket.superMarketName); System.out.println("地址在" + littleSuperMarket.address); System.out.println("共有停车位" + littleSuperMarket.parkingCount + "个"); System.out.println("今天的营业额为" + littleSuperMarket.incomingSum); System.out.println("共有商品" + littleSuperMarket.merchandises.length + "种"); Customer customer = new Customer(); customer.name = "顾客编号" + ((int) (Math.random() * 10000000)); customer.money = (1 + Math.random()) * 1000; customer.isDrivingCar = Math.random() > 0.5; //----------------迎客进门--------- //开车来的给分配车位,没车位就不让进了 if (customer.isDrivingCar) { if (littleSuperMarket.parkingCount > 0) { System.out.println("欢迎" + customer.name + "驾车而来。本店已经为您安排了车位,停车免费哦。车位编号为" + littleSuperMarket.parkingCount); littleSuperMarket.parkingCount -= 1; } else { System.out.println("不好意思,本店车位已满。欢迎您下次光临"); continue; } } else { System.out.println("欢迎" + customer.name + "光临本店"); } // 接待此顾客 double totalCost = 0; while (true) { // 顾客选商品 System.out.println("本店提供" + littleSuperMarket.merchandises.length + "种商品,请输入您要购买的商品编号:"); int merchandiseId = in.nextInt(); // 输入负数表示买好了。 if (merchandiseId < 0) { System.out.println("您本次购买了" + totalCost + "元的商品。欢迎您再次光临。"); break; } // 商品没有,让顾客继续选择 if (merchandiseId >= littleSuperMarket.merchandises.length) { System.out.println("次商品本店没有,欢迎继续挑选"); continue; } // 商品有,问顾客要购买多少个 Merchandise toBuy = littleSuperMarket.merchandises[merchandiseId]; System.out.println(toBuy.name + "单价" + toBuy.soldPrice + "。请问购买几个?"); int numToBuy = in.nextInt(); // 不想买,看看也欢迎 if (numToBuy <= 0) { System.out.println("不买看看也好,欢迎继续选购"); continue; } // 买的太多,库存不够 if (toBuy.count < numToBuy) { System.out.println(toBuy.name + "只有" + toBuy.count + "件了,不够" + numToBuy + "。欢迎继续选购。"); continue; } // 顾客钱不够 if (numToBuy * toBuy.soldPrice + totalCost > customer.money) { System.out.println("您带的钱不够结账,请您理智消费。"); continue; } // 钱也够,货也够 // 更新顾客此次消费的总额 // 应该是 numToBuy * m.soldPrice 而不是 numToBuy * m.purchasePrice . 鸣谢 @Geek_421d56 帮忙活捉bug一只. totalCost += numToBuy.count * toBuy.soldPrice; // 更新商品库存 toBuy.count -= numToBuy; // 更新今日销货数据 littleSuperMarket.merchandiseSold[merchandiseId] += numToBuy; } // 归还车位 if (customer.isDrivingCar) { littleSuperMarket.parkingCount++; } // 更新数据 customer.money -= totalCost; littleSuperMarket.incomingSum += totalCost; System.out.println(customer.name + "共消费" + totalCost + "。欢迎再次光临。"); System.out.println("请问继续营业吗?"); open = in.nextBoolean(); } System.out.println("超市关门啦!"); System.out.println("今日销售额为" + littleSuperMarket.incomingSum + "。营业统计如下:"); for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) { int sold = littleSuperMarket.merchandiseSold[i]; if (sold > 0) { Merchandise m = littleSuperMarket.merchandises[i]; double netIncoming = sold * (m.soldPrice - m.purchasePrice); double incoming = sold * m.soldPrice; System.out.println(littleSuperMarket.merchandises[i].name + "售出" + sold + "个。销售额" + incoming + "。毛利润" + netIncoming); } } } }
Github 2
package com.geekbang; import com.geekbang.person.Customer; import com.geekbang.supermarket.LittleSuperMarket; import com.geekbang.supermarket.Merchandise; import java.util.Scanner; public class RunLittleSupperMarketAppMain2 { public static void main(String[] args) { LittleSuperMarket littleSuperMarket = new LittleSuperMarket(); littleSuperMarket.address = "世纪大道666号"; littleSuperMarket.superMarketName = "有家超市"; littleSuperMarket.parkingCount = 200; littleSuperMarket.merchandises = new Merchandise[200]; littleSuperMarket.merchandiseSold = new int[littleSuperMarket.merchandises.length]; Merchandise[] all = littleSuperMarket.merchandises; for (int i = 0; i < all.length; i++) { Merchandise m = new Merchandise(); m.count = 200; m.id = "ID" + i; m.name = "商品" + i; m.purchasePrice = Math.random() * 200; m.soldPrice = (1 + Math.random()) * 200; all[i] = m; } System.out.println("超市开门啦!"); boolean open = true; Scanner scanner = new Scanner(System.in); while (open) { System.out.println("本店叫做" + littleSuperMarket.superMarketName); System.out.println("本店地址" + littleSuperMarket.address); System.out.println("共有停车位" + littleSuperMarket.parkingCount + "个"); System.out.println("今天的营业额为" + littleSuperMarket.incomingSum); System.out.println("共有商品" + littleSuperMarket.merchandises.length + "种"); Customer customer = new Customer(); customer.name = "顾客编号" + ((int) (Math.random() * 10000)); customer.money = (1 + Math.random()) * 1000; customer.isDrivingCar = Math.random() > 0.5; if (customer.isDrivingCar) { if (littleSuperMarket.parkingCount > 0) { System.out.println("欢迎" + customer.name + "驾车而来。本店已经为您安排了车位,停车免费哦。车位编号为" + littleSuperMarket.parkingCount); littleSuperMarket.parkingCount--; } else { System.out.println("不好意思,本店车位已满。欢迎您下次光临"); continue; } } else { System.out.println("欢迎" + customer.name + "光临本店"); } double totalCost = 0; while (true) { System.out.println("本店提供" + all.length + "种商品,欢迎选购。请输入商品编号"); int index = scanner.nextInt(); if (index < 0) { break; } if (index >= all.length) { System.out.println("本店没有这种商品,请叙述编号在0到" + (all.length - 1) + "之内的商品编号。"); continue; } Merchandise m = all[index]; System.out.println("您选购的商品名字" + m.name + "。单价是" + m.soldPrice + "。请问您要购买多少个?"); int numToBuy = scanner.nextInt(); if (numToBuy <= 0) { System.out.println("不买看看也好,欢迎继续挑选。"); continue; } if (numToBuy > m.count) { System.out.println("本店此商品库存没有这么多,欢迎继续选购。"); continue; } // 视频中此处有错误, 应该是 numToBuy * m.soldPrice 而不是 numToBuy * m.purchasePrice . 鸣谢 @时间是最真的答案 帮忙活捉bug一只. if (numToBuy * m.soldPrice + totalCost > customer.money) { System.out.println("您带的钱不够,欢迎继续挑选"); continue; } totalCost += numToBuy * m.soldPrice; m.count -= numToBuy; littleSuperMarket.merchandiseSold[index] += numToBuy; } customer.money -= totalCost; if (customer.isDrivingCar) { littleSuperMarket.parkingCount++; } System.out.println("顾客" + customer.name + "共消费了" + totalCost); littleSuperMarket.incomingSum += totalCost; System.out.println("还继续营业吗?"); open = scanner.nextBoolean(); } System.out.println("超市关门了!"); System.out.println("今天总的营业额为" + littleSuperMarket.incomingSum + "。营业情况如下"); for (int i = 0; i < littleSuperMarket.merchandiseSold.length; i++) { Merchandise m = all[i]; int numSold = littleSuperMarket.merchandiseSold[i]; if (numSold > 0) { double incomming = m.soldPrice * numSold; double netIncomming = (m.soldPrice - m.purchasePrice) * numSold; System.out.println(m.name + "售出了" + numSold + "个。销售额为" + incomming + "。净利润为" + netIncomming); } } } }
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh
