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

news2024/11/16 23:34:50

微信图片_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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Nginx】nginx入门

文章目录 一、Web服务器二、Nginx三、Nginx的作用Web服务器正向代理反向代理 四、CentOS上安装Nginx(以CentOS 7.9为例) 一、Web服务器 Web 服务器&#xff0c;一般是指“网站服务器”&#xff0c;是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户…

[开源]基于野火指南者的MQTT框架+FreeRTOS移植(使用板载esp8266模块)

MQTT移植 项目地址 实际使用 基于野火指南者开发板 移植大佬的MQTT框架, 参考韦东山的课程 实际移植的项目: mqttclient 主要实现的是使用开发板上面的ESP8266连接MQTT服务器, 目前使用的是ip地址进行连接(FreeRTOS版本) 测试程序在mqtt/at/at_comment.c文件里面, 需要改…

Vivado MIG IP使用配置

目录 1 MIG 基本配置 1 MIG 基本配置 配置如下图所示 图1 图2 图3 图4 图5 图6 图8 图9 在设立只讲解共同配置&#xff0c;这是所有DDR3中配置通用部分。

2024年【低压电工】复审考试及低压电工作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 低压电工复审考试参考答案及低压电工考试试题解析是安全生产模拟考试一点通题库老师及低压电工操作证已考过的学员汇总&#xff0c;相对有效帮助低压电工作业考试题库学员顺利通过考试。 1、【单选题】()是保证电气作…

CSS常用动画网站(纯css echarts等 建议经常阅读 积累素材)

CSS动画代码集合 https://www.webhek.com/post/css3-animation-sniplet-collection/#/ 这个网站中将常见的css动画都进行了集合,并且有详细的代码,可以直接使用 echarts图表 https://www.isqqw.com/ echarts也是前端常用的,虽然官方文档已经给出了很多的案例,但是有时候产品还…

OpenHarmony—Gradle工程适配为Hvigor工程

该适配场景适用于开发者希望将原OpenHarmony API 7的工程升级到OpenHarmony API 9的工程。 原OpenHarmony API 7的工程采用的是Gradle自动化构建工具&#xff0c;而OpenHarmony API 9的工程则采用Hvigor自动化构建工具&#xff0c;由于Gradle构建工具和Hvigor构建工具的配置文…

【PyQt】03-信号与槽

文章目录 前言一、信号与槽二、Demo接收信号代码运行结果 自定义信号【重点】代码运行结果 总结 前言 我认为&#xff0c;信号就是触发&#xff0c;槽就是触发的事件。 一、信号与槽 信号(signal) 其实就是事件&#xff08;按钮点击 、内容发生改变 、窗口的关闭事件&#xf…

无人机在消防领域的应用及其优势

无人机在消防领域的应用及其优势 随着科技的不断发展&#xff0c;无人机正以其独特的优势&#xff0c;逐渐在各个领域得到广泛应用。在消防领域中&#xff0c;无人机的应用也越来越受到关注。无人机在消防工作中具有独特的优势&#xff0c;可以帮助消防人员更好地开展任务&…

背景点击监督的时序动作定位 Background-Click Supervision for Temporal Action Localization

该论文介绍了 BackTAL,这是一种利用背景点击监督进行弱监督时序动作定位的新方法。 它将焦点从动作帧转移到背景帧,通过强调背景错误来改进定位。 BackTAL 包含分数分离模块和亲和力模块,增强了位置和特征建模。 Background-Click的说明 Click 点击级别监督的说明…

shell中脚本参数传递的两种方式

一、接在脚本后面输入参数值&#xff0c;多个参数间用空格隔开 采用$0,$1,$2..等方式获取脚本命令行传入的参数&#xff0c;值得注意的是&#xff0c;$0获取到的是脚本路径以及脚本名&#xff0c;后面按顺序获取参数&#xff0c;当参数超过10个时(包括10个)&#xff0c;需要使用…

探索网络定位与连接:域名和端口的关键角色

目录 域名 域名的作用 域名的结构 域名的解析配置 父域名、子域名​编辑 https的作用 端口 图解端口 端口怎么用 判断网站是否存活 端口的作用 域名 域名是互联网上用于标识网站的一种易于记忆的地址。 域名是互联网基础架构的一个重要组成部分&#xff0c;它为网…

029 命令行传递参数

1.循环输出args字符串数组 public class D001 {public static void main(String[] args) {for (String arg : args) {System.out.println(arg);}} } 2.找打这个类的路径&#xff0c;打开cmd cmd C:\Users\Admin\IdeaProjects\JavaSE学习之路\scanner\src\com\yxm\demo 3. 编译…

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…

Android Display显示框架整体流程

一.Android Display显示框架整体流程图

一篇文章了解系统眼中的键盘--以一个简单的系统分析从按键的输入到字符的显示

键盘输入 实现使用的设备 intel架构32位CPU, 思路为嵌入式系统工程师,使用的操作系统是《30天自制操作系统》里面的系统进行讲解 硬件实现 按键 使用单片机等的引脚可以获取电平状态从而获得按键的状态(单片机是一种集成到一块硅片上构成的一个小而完善的微型计算机系统, 用…

Linux系统卸载重装JDK

CentOS 系统是开发者常用的 Linux 操作系统&#xff0c;安装它时会默认安装自带的旧版本的 OpenJDK&#xff0c;但在开发者平时开发 Java 项目时还是需要完整的 JDK&#xff0c;所以我们部署 CentOS 开发环境时&#xff0c;需要先卸载系统自带的 OpenJDK&#xff0c;再重新安装…

《国色芳华》爆红网络,杨紫的“唐妆”惊艳四座。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在中国的电视剧市场近几年的趋势中&#xff0c;仙侠剧的热度逐…

real-time-emotion-detection 排坑记录

real-time-emotion-detection 排坑记录 任务踩坑回顾CV2包版本问题症状描述解决方法 模型文件路径问题症状描述解决办法 tensorflow版本问题症状描述解决办法 其他 任务 我之前跑了一个CNN情绪识别的开源代码&#xff0c;现在我想尝试把他用到我的另一个项目里。但当时那个项目…

lava学习-多态-final-抽象类

一.多态 1.什么是多态&#xff1f; 现象&#xff1a;对象多态&#xff1a;比如说一个人 类&#xff0c;他可以是一个老师&#xff0c;也可以是一个同学 行为多态&#xff1a;多个对象同一类行为的不同表现形式&#xff0c;比如两个人&#xff0c;一个人跑得快&#xff0c;另一个…

1895_分离进程的能力

1895_分离进程的能力 全部学习汇总&#xff1a; g_unix: UNIX系统学习笔记 (gitee.com) 有些理念可能在控制类的嵌入式系统中不好实施&#xff0c;尤其是没有unix这样的系统搭载的情况下。如果是考虑在RTOS的基础上看是否有一些理念可以做尝试&#xff0c;我觉得还是可以有一定…