java实现控制台购书系统
面向对象实现相信看了对你理解更为透彻
目录
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友。您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!🚀✨"
代码
import java.util.Random;
import java.util.Scanner;
class Book{
// 存放图书的基本信息
private int id; // 编号
private String name; // 书名
private double price; // 价格
private int storage ; // 库存
// 有参构造函数 传入图书参数
public Book(int id,String name,double price,int storage){
this.id = id;
this.name = name;
this.price = price;
this.storage = storage;
}
public void setStorage(int storage) {
this.storage = storage;
}
public int getId() {return id;}
public String getName() {return name;}
public double getPrice() {return price;}
public int getStorage() {return storage;}
}
public class saber {
public static void main(String[] args) {
Book[] books = new Book[3]; // 类型是数组那么就是可以这样
outbooks(books); // 传入参数到方法中
while (true){
System.out.println("请输入你选择的编号,如无需购买 6 键退出");
Scanner sc = new Scanner(System.in); // if判断输入值 1 2 3
int number = sc.nextInt();
if (number == 1){
System.out.println("输入您的购买数量");
int input = sc.nextInt();
promotion(number,input,books);
}else if (number == 2){
System.out.println("输入您的购买数量");
int input = sc.nextInt();
promotion(number,input,books);
}else if(number == 3){
System.out.println("输入您的购买数量");
int input = sc.nextInt();
promotion(number,input,books);
} else if (number == 6) {
System.out.println("结束购买");
break;
}else {
System.out.println("非法字符自动结束");
break;
}
}
}
public static void promotion(int id,int quantity,Book[] books){
id-=1; // 索引-1
if (quantity > books[id].getStorage()){
System.out.println("选择的数量大于实际数量,现有"+books[id].getStorage()+"本");
}else {// 更新编号方法
Random r = new Random();
int data = r.nextInt(); // 随机编号
System.out.println("订单信息================================\n编号:"+data+"\n选购图书:"+books[id].getName()+
"\n选购数量:"+quantity+"\n订单总价:"+books[id].getPrice()*quantity);
books[id].setStorage(books[id].getStorage()-quantity); // 更新库存set方法
System.out.println("图书"+books[id].getName()+"库存还有"+books[id].getStorage()+"本");
System.out.println("==================请继续选购=================\n");
}
}
// 读取图书的方法
public static void outbooks(Book[] books){
books[0] = new Book(1,"Java教程",30,10);
books[1] = new Book(2,"JSP教程",42,10);
books[2] = new Book(3,"SSH架构",47,10);
System.out.println("\t\t\t图书列表");
System.out.println("图书编号\t图书名称\t\t图书单价\t库存数量");
System.out.println("---------------------------------------");
for(Book book : books) // 遍历数组
{
System.out.println(book.getId()+"\t\t"+book.getName()+"\t\t"+book.getPrice()+"\t\t"+
book.getStorage());
}
System.out.println("---------------------------------------");
}
}
实现思路
就是增删改查,定义图书为class类,但是图书Bokk class的有参构造函数为数组类型实例化。,这样可以将书籍的编号名称,单击库存依次存入,使用就通过数组books[]的索引来拿到每一项的值,通过遍历数组依次打印出所有数据, 而后判断用户输入的书籍编号还有书籍数量,传递到写好的promotion()方法中,在方法里完成我们对于图书的价格计算库存计算......总价计算通过拿到单击的get方法*=数量,库存也是通过拿到get和set方法进行判断,没有库存也会进行提示,购买成功。会输出订单的信息
0x1 创建Book图书
第一步我们创建所需要的图书Book类,写入4个私密成员变量保存我们所需的数据,并在 6-10 行入有参构造参数,后续我们的图书都是通过这个有参构造方法传入。 12-17 是属于库存的set方法 因为四个变量中编号 、书名、价格都是不需要改变的,只有 storage库存是在变化,所以需要拿到set方法 进行重新赋值 21-24 是4个变量的get方法
0X2 读取图书
回到mian方法中,我们将图书Book类进行实例化,但是我们实例化的类型是一个数组类型,此写法是浏览文章学习到了,通过这种写法可以将数据存储,我一开始想的是利用二维数组来存储书籍的信息,但是忽略了一个非常重要的问题,那就是数组的类型只能定义为一种,但是书籍的信息不同,书名只能是String,价格则是int 所以行不通就利用了这种写法,手动输出又太过多余,利用数组类型的对象来存储刚刚好,3个数组数据对应三本书
我们定义好读取图书的方法othbooks 这个方法存储了我们的数组输出,可以将书籍信息打印出来。传入的形参类型为数组Book[] 值则是对象名称books ,通过实例化从0-2从有参构造器中传入书籍的各项信息。通过for依次打印出各项的get方法。最终输出的效果图1-4
0x3 书籍判断
传入好图书后来到最重要的判断环节,通过 if 配合 Scanner语句来判断编号 1 2 3,是何本书,判断到正确数字则接受,进入下一步购买数量,选择多少本 而后对于书籍购买另写了promotion() 方法, 里面有三个需要传入的参数分别是 书籍编号 购买数量 对象books,同时利用while循环购买一次还可以继续购买,只有按 6 键 才会 break 结束进程。 做了一点点微不足道的安全措施,只能输入白名单类的数字,只接受 1 2 3 6,输入别的非法字符直接终止 51-54。
0x4 订单计算
库存计算
promotion() 用于计算购买后的情况,形参中的3个参数上文也已经解释, 58 则是将编号 - 1,因为我们的数组是从0为索引开始,1则是2,那么我们我们的1编号其实就是2,所以要通过索引id-1 才能拿到正确的书籍,如果没有很明白可以去回顾一下数组
quantity 是我们的购买的书籍数量,拿到后我们需要去和现有的书籍库存进行判断在 59-60 就是判断库存的情况,通过books[id].getStorage()
通过数组索引拿到其中的库存getStorage 里面存放的此本书的库存数量,进行对比,如果购买的quantity 数量是大于现有库存的则输出getStorage() 显示目前有多少本 结束本次购买回到 while 语句中再次提示购买 如图 1-7
成功购买
购买成功实现非常简单,对现有库存做-=操作, 62 是随机编号,利用 Random 随机数 将编号值传递给变量 data存储使用。
64-65 输入订单信息,利用数组索引拿到各项数据,订单总价就是单价price* quantity,其余就是正常的拿到打印即可。
66 更新库存,减去购买数量利用setStotage 赋值
67 打印出现有库存
68 分割线,进行下次购买,因为是while 循环,只要不是退出或者是非法字符可以一直运行!
总结
以上就是程序全部代码,但仍有很多不足之处,面向对象还是很初级的状态,没有做到代码的复用性,利用更少的代码写出更完整的功能,实现时也想过很多种方式, 数据传入进构造方法直接判断编号和购买数量在class类里面完成,不需要额外的if语句,一切在类中完成,但是又考虑到类中如何判断的问题,,不通过if怎么判断,我想到的只能是写出三个构造函数,但这又违背了代码的复用性,三个相同的功能点我就想用一个整体来解决学习无止境......,,如有不正确不恰当之处 望老师同学不吝赐教!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)