"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友。您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!"

代码

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怎么判断,我想到的只能是写出三个构造函数,但这又违背了代码的复用性,三个相同的功能点我就想用一个整体来解决学习无止境......,,如有不正确不恰当之处 望老师同学不吝赐教!

Java实现控制台购书系统的更多相关文章

  1. Java初学者作业——为某超市设计管理系统,需要在控制台展示系统菜单,菜单之间可以完成跳转。

    返回本章节 返回作业目录 需求说明: 为某超市设计管理系统,需要在控制台展示系统菜单,菜单之间可以完成跳转. 实现思路: 定义mainMenu方法,用于显示主菜单. 主菜单主要负责显示4个选项,分别是 ...

  2. JAVA中获取当前系统时间及格式转换

    JAVA中获取当前系统时间   一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...

  3. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  4. [JAVA] java_实例 获得系统字体

    这个代码可以帮助理解java是如何获取系统字体并设置文字字体: import java.awt.*; import java.awt.event.*; import javax.swing.JComb ...

  5. 使用apache daemon让java程序在unix系统上以服务方式运行

    通过使用apache_commons_daemon,可以让Java程序在unix系统上以服务器的方式运行. 当然,通过wrapper也是可以达到这样的目的,wrapper还可以指定java应用中用到的 ...

  6. Java电器商场小系统--简单的java逻辑

    //商场类public class Goods { int no; //编号 String name; //商品名称 double price; //商品价格 int number; //商品数量 / ...

  7. Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE

    初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...

  8. C++购书系统

    C++购书系统——来自班里某位同学的小学期作业 这是一个购书系统,模拟网上购书的流程.用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作. 以 ...

  9. 《Java程序设计》win10系统学前准备

    <Java程序设计>win10系统学前准备 Git的安装 在https://gitforwindows.org/中下载git for windows,下载完成后进行安装.当安装进行到这一步 ...

  10. Java中在java.sql.Date的系统时间上加上30天并写入oracle

    在java.sql.Date的系统时间上加上30天,并写入oracle 思路:通过 Calendar.getInstance() 获得对象,然后 add() 方法添加 时间,再通过 new java. ...

随机推荐

  1. Springboot中-全局异常处理类用法示例

    使用springboot搭建web项目的时候,一般都会添加一个全局异常类,用来统一处理各种自定义异常信息, 和其他非自定义的异常信息,以便于统一返回错误信息.下面就是简单的示例代码, 自定义异常信息. ...

  2. IDEA导入项目jar包=来自本地仓库-一直报红线的解决办法

    一.问题由来 现在开发的Java项目全部都是再内网进行开发,和互联网是完全物理隔绝的,所以在最开始配置IDEA的时候,项目中需要导入的Jar包 都是从本地仓库中进行导入,在maven的配置文件里面配置 ...

  3. C# 常用特性(Attribute)

    目录 指定方法实现的属性MethodImplAttribute 标记不再使用的程序元素ObsoleteAttribute 指定属性或事件的说明DescriptionAttribute 未完待续... ...

  4. 超低功耗mcu芯片AMA3B 开发备忘之初串口打印

    一 前言   对于软件工程师来说,没什么比看到一个hello world的打印更让人感觉兴奋了.调试芯片,很多人都知道,hello world这个打印意味着什么.   二 软硬件准备   1 一个AM ...

  5. Android使用poi遇到的问题

    原文:Android使用poi遇到的问题 关于Poi使用可以看这一篇[开源库推荐]#4 Poi-办公文档处理库 本篇主要讲些在Android上使用出现的问题 问题 原本是需要一个导出xlsx表格文件的 ...

  6. 一个简单的百万并发的TCP服务器的实现。

    我们紧接着上篇文章,看看我们上节课的代码有什么问题? 可以明显的看出来上节课的代码公用了一个同样的缓冲区进行读写,正常的情况下我们需要封装一个结构体,让每个对应的客户端的FD都有独立的结构进行读写还有 ...

  7. FFmpeg介绍与编译

    目录 FFmpeg FFmpeg核心模块 FFmpeg编译 FFmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制 ...

  8. 【K8S】Kubernetes中暴露外部IP地址来访问集群中的应用

    本文是Kubernetes.io官方文档中介绍如何创建暴露外部IP地址的Kubernetes Service 对象. 学习目标 运行Hello World应用程序的五个实例. 创建一个暴露外部IP地址 ...

  9. 分享本人依照NOI大纲整理的CSPJ复习资料

    2023 CSP-J 复习文件 考纲 复习好 : 基础知识与编程环境 难度 计算机的基本构成 计算机的组成及功能 - 知乎 (zhihu.com) 操作系统的基本概念与常见操作 操作系统基础知识大汇总 ...

  10. 面试题,关于int类型转byte类型结果溢出

    1 package com.atguigu.chapter03 2 /* 3 byte:-128~127 4 128 : Int类型,占4个字节,32位 5 计算机中的整型数据都以补码的形式存储,正数 ...