基于控制台的购书系统(Java 语言实现)

简介: 基于控制台的购书系统(Java 语言实现)


1. 设计背景

伴随互联网的蓬勃发展,网络购书系统作为电子商务的一种形式, 正以其高效、低成本的优势逐步成为新兴的经营模式,互联网的用途也不再局限于信息的浏览和发布,人们能够充分享受互联网带来的更多便利。网络购书系统正是适应了当今社会快节奏的生活,使顾客足不出户便可以方便、快捷、轻松地选购自己喜欢的图书。

2.要求

本案例要求使用所学知识编写一个基于控制台的购书系统, 实现购书功能。程序输出所有图书的信息,包括每本书的编号、书名、单价、库存。

顾客购书时,根据提示输人图书编号选购需要的书,并根据提示输人需要购买的书的数量。购买完毕输出顾客的订单信息,包括订单号、订单明细、订单总额。

3. 设计思路

由题可知,我们需要先创建3个类:分别是书类、订单类,以及订单中的订单信息(购买的书名、购买的数量、书的单价)——订单项类

  1. 书类(Book)
    属性:书的编号、书名、书的价格、书的库存
  2. 订单类(Order)
    属性:订单号、订单总额、订单项数组
  3. 订单项类(OrderItem)
    属性:购买的数量、购买的书名、所购图书的价格

另外,我们在系统中还需要将订单项里的内容添加到订单中,还需要在订单中获取所购买的书的各项信息,因此我们需要在订单类里构造以上这些方法。

4. 代码演示

4.1 Book类的实现

书籍类的属性有:图书的编号,书名、图书价格、图书库存, 我们结合封装性,将属性设置为private权限,并提供相应的get方法和set方法,空参构造器,以及带有全部参数的构造器。代码实现如下:

package book;
// 图书类
public class Book {
    private String id;// 图书编号
    private String name;// 书名
    private double price;// 价格
    private int nums;// 库存
    public Book() {
    }
    public Book(String id, String name, double price, int nums) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.nums = nums;
    }
    // get方法和set方法
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getNums() {
        return nums;
    }
    public void setNums(int nums) {
        this.nums = nums;
    }
}

4.2 OrderItem类实现

订单项类的属性有:购买的书名,购买书籍的数量,书籍的价格,我们结合封装性,将属性设置为private权限,并提供相应的get方法和set方法,空参构造器,以及带有全部参数的构造器。代码实现如下:

package order;
// 订单项类
public class OrderItem {
    private String name;// 购买的书名
    private int nums;// 购买的数量
    private double price;// 价格
    public OrderItem() {
    }
    public OrderItem(String name, int nums, double price) {
        this.name = name;
        this.nums = nums;
        this.price = price;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getNums() {
        return nums;
    }
    public void setNums(int nums) {
        this.nums = nums;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
}

4.3 Order类实现

订单类的属性有:订单号,订单总价,订单项数组(对添加的订单进行存储)

订单类主要提供:添加订单项的方法以及打印订单信息的方法,具体代码实现如下:

package order;
// 订单类
public class Order {
    private String OrderId; // 订单号
    private double total; // 订单总价
    OrderItem[] items = new OrderItem[100];
    public Order() {
    }
    public Order(String OrderId) {
        this.OrderId = OrderId;
    }
    
    // 添加订单项的方法
    public void AddOrderItem(OrderItem item){
        // 在数组空的位置插入
        for (int i = 0; i < items.length; i++) {
            // 找数组中空的位置插入
            if (items[i] == null){// 当前位置为空
                items[i] = item;
                return;
            }
        }
    }
    // 打印订单信息
    public void printOrder() {
        System.out.println("=====================");
        System.out.println("订单号:" + OrderId);
        System.out.println("书名\t\t单价\t\t数量");
        for (OrderItem item: items) {
            if (item != null) {
                System.out.println(item.getName()+"\t\t" +
                        item.getPrice() + "\t\t" + item.getNums());
                // 计算总价
                total = total + item.getPrice() * item.getNums();
            }
        }
        System.out.println("总价:" + total);
    }
}

4.4 Main类

此时,我们所有的框架都已经搭建好了,只需要在Main类中添加main方法进行测试即可,代码如下:

import book.Book;
import order.Order;
import order.OrderItem;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Book[] books = new Book[3];
        books[0] = new Book("001","数据结构",59.80,20);
        books[1] = new Book("002","程序设计",48.80,2);
        books[2] = new Book("003","信息技术",25.4,12);
        Order order = new Order("2023001");// 生成订单号
        Scanner input = new Scanner(System.in);
        while (true) {
            // 打印订单信息
            System.out.println("编号\t\t书名\t\t\t单价\t\t库存\t");
            for (int i = 0; i < books.length; i++) {
                System.out.println(books[i].getId() + "\t\t" + books[i].getName() + "\t\t"+
                        books[i].getPrice() + "\t"+ books[i].getNums());
            }
            System.out.println("请输入您要购买书的编号");
            String inputId = input.next();
            System.out.println("请输入购买数量");
            int inputNum = input.nextInt();
            switch (inputId) {
                case "001":
                    if (inputNum > books[0].getNums()){ // 购买的的数量大于库存
                        System.out.println("库存不足,请重新输入!");
                        System.out.println("当前库存为:" + books[0].getNums());
                        break;
                    }else {
                        books[0].setNums(books[0].getNums() - inputNum);// 剩余库存
                        //
                        order.AddOrderItem(new OrderItem(books[0].getName(),
                                inputNum,books[0].getPrice()));
                        break;
                    }
                case "002":
                    if (inputNum > books[1].getNums()){ // 购买的的数量大于库存
                        System.out.println("库存不足,请重新输入!");
                        System.out.println("当前库存为:" + books[1].getNums());
                        break;
                    }else {
                        books[1].setNums(books[1].getNums() - inputNum);
                        order.AddOrderItem(new OrderItem(books[1].getName(),
                                inputNum,books[1].getPrice()));
                        break;
                    }
                case "003":
                    if (inputNum > books[2].getNums()){ // 购买的的数量大于库存
                        System.out.println("库存不足,请重新输入!");
                        System.out.println("当前库存为:" + books[2].getNums());
                        break;
                    }else {
                        books[2].setNums(books[2].getNums() - inputNum);// 剩余库存
                        order.AddOrderItem(new OrderItem(books[2].getName(),
                                inputNum,books[2].getPrice()));
                        break;
                    }
            }
            System.out.println("是否继续购书?请选择Yes/No");
            String  next = input.next();
            if (next.equals("No")){
                break;
            }
        }
        order.printOrder();
    }
}

5. 整体效果测试

   

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
84 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
60 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
21天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
41 4
|
25天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
60 3
|
29天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
27 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
52 1
|
2月前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
50 3