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

微信图片_20231214093055

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》|《数据结构与算法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 1. 设计背景
  • 2.要求
  • 3. 设计思路
  • 4. 代码演示
    • 4.1 Book类的实现
    • 4.2 OrderItem类实现
    • 4.3 Order类实现
    • 4.4 Main类
  • 5. 整体效果测试

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. 整体效果测试

image-20231118112007428 image-20231118111832188 image-20231118111649978

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/369061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Llama2大模型开源,大模型的Android时代来了?

就昨天凌晨,微软和Meta宣布Llama2大模型开源且进一步放开商用,一下朋友圈刷屏。要知道,开源界最强大的模型就是过去Meta开源的Llama,而现在Llama2更强大,又开放商用,更有微软大模型霸主企业撑腰(微软既投资大模型界的IOS——ChatGPT,又联合发布大模型的Android——Llam…

【DDD】学习笔记-什么是模型

从领域驱动的战略设计进入战术设计&#xff0c;简单说来&#xff0c;就是跨过系统视角的限界上下文边界进入它的内部&#xff0c;从分层架构的逻辑分层进入到每一层的内部。在思考内部的设计细节时&#xff0c;首先需要思考的问题就是&#xff1a;什么是模型&#xff08;Model&…

Leaf——美团点评分布式ID生成系统

0.普通算法生成id的缺点 1.Leaf-segment数据库方案 第一种Leaf-segment方案&#xff0c;在使用数据库的方案上&#xff0c;做了如下改变&#xff1a; - 原方案每次获取ID都得读写一次数据库&#xff0c;造成数据库压力大。改为利用proxy server批量获取&#xff0c;每次获取一…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

网络流数据集处理(深度学习数据处理基础)

一、数据集处理 处理数据集是一个文件夹 一个文件夹处理的&#xff0c;将原网络流数据集 放入一个文件夹 处理转换成 Json文件。&#xff08;数据预处理&#xff09;然后将这些文件处理成目标文件格式 再分割成训练集和测试集。每次运行只会处理一个文件夹。 运行train.py 导入…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中&#xff0c;provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别 目录 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现G…

26条prompt规则应用于大模型

1、引入动机 llm大模型在回答一些问题上表现出了惊人的能力&#xff0c;例如数学逻辑推理&#xff0c;代码生成&#xff0c;问题答复等。提词工程是和大预言模型交流的一门艺术。 大模型的返回结合和用户的指令和输入直接相关prompts是用户和大模型沟通的一种编码方式 一般地…

python计算两个DataFrame的指定两列中,相同的数据有多少

目的&#xff1a;查询数据1和数据2中&#xff0c;red与red列相同 并且blue与blue列相同的&#xff0c;情况有多少。 &#xff08;备注&#xff1a;两个数据中格式不一致&#xff0c;需要经过json提取等处理步骤&#xff09; 思路步骤&#xff1a; 1、读取数据1&#xff0c;筛选…

12种算法优化CNN-BiLSTM-Attention多特征输入单步预测,机器学习预测全家桶,持续更新,MATLAB代码...

截止到本期&#xff0c;一共发了12篇关于机器学习预测全家桶MATLAB代码的文章。参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测之BiGRU、BiLSTM、GRU、LSTM&#xff0c;LSSVM、TCN、CNN&…

Vue工程引入Element-ui

npm 安装ELement-ui npm i element-ui -S 于package.json中发现有“element-ui”版本号即可 引入 Element 在 main.js 中写入以下内容&#xff1a; import element-ui/lib/theme-chalk/index.css; import ElementUI from element-ui;Vue.use(ElementUI);之后根据自己的需求设计…

《动手学深度学习(PyTorch版)》笔记6.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

考研/计算机二级数据结构刷题之顺序表

目录 第一题 顺序表的初始化&#xff0c;销毁&#xff0c;头插&#xff0c;尾插&#xff0c;头删&#xff0c;尾删&#xff0c;指定位置插入&#xff0c;指定删除以及打印 第二题 移除元素 题目链接&#xff1a; OJ链接 题目详解&#xff1a;移除元素 第三题&#xff1a;删…

这种学习单片机的顺序是否合理?

这种学习单片机的顺序是否合理&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01…

动态内存管理 智能指针 shared_ptr、unique_ptr、weak_ptr + 定制删除器

动态内存管理常出现的两种问题&#xff1a; 1.忘记释放内存,造成内存泄漏 2.这块内存还有其他指针指向的情况下&#xff0c;就释放了它&#xff0c;会产生引用非法内存的指针&#xff0c;例如 如果类中有属性指向堆区&#xff0c;做赋值操作时会出现浅拷贝的问题 内存泄漏分…

Node.js版本管理工具之_Volta

Node.js包管理工具之_Volta 文章目录 Node.js包管理工具之_Volta1. 官网1. 官网介绍2. 特点1. 快( Fast)2. 可靠(Reliable)3. 普遍( Universal) 2. 下载与安装1. 下载2. 安装3. 查看 3. 使用1. 查看已安装的工具包2. 安装指定的node版本3.切换项目中使用的版本 1. 官网 1. 官网…

CVEMap:用于查询、浏览和搜索 CVE 的开源工具

CVEMap 是一个开源命令行界面 (CLI) 工具&#xff0c;可让您探索常见漏洞和暴露 (CVE)。它旨在提供一个简化且用户友好的界面来导航漏洞数据库。 尽管 CVE 对于查明和讨论安全漏洞至关重要&#xff0c;但它们的快速增长和偶尔夸大的严重性往往会导致误导性信息。 安全专家必须…

存算一体:架构创新,打破算力极限

1 需求背景 在全球数据量呈指数级暴涨&#xff0c;算力相对于AI运算供不应求的现状下&#xff0c;存算一体技术主要解决了高算力带来的高能耗成本矛盾问题&#xff0c;有望实现降低一个数量级的单位算力能耗&#xff0c;在功耗敏感的百亿级AIoT设备上、高能耗的数据中心、自动驾…

typecho 在文章中添加 bilibili 视频

一、获取视频来源&#xff1a; 可以有2种方式来定位一个 bilibili 视频&#xff1a; 第一种是使用 bvid 参数定位第二种是使用 aid 参数定位 如何获取这两个参数&#xff1f; 首先我们可以看看 bilibili 网站中的视频页面链接其实可以分为两种&#xff1a; 第一种是类似&a…

Ps:旋转视图工具

旋转视图工具 Rotate View Tool允许在不实际更改图像本身的情况下&#xff0c;旋转画布视图&#xff0c;从而提高绘画、修图或任何需要特定角度操作的任务的舒适度和效率。 快捷键&#xff1a;R 当使用绘图板进行绘画时&#xff0c;可以轻松旋转画布&#xff0c;找到最舒适的绘…