基于控制台的购书系统(JAVA基础案例教程-黑马程序员编著-第三章-课后作业)

news2024/11/22 15:09:38

【案例介绍】

  1. 案例描述

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

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

顾客购买书时,根据提示输入图书编号来选购需要的书,并根据提示输入购买书的的数量。

购买完毕后输出顾客的订单信息,包括:订单号、订单明细、订单总额。

  1. 运行结果

【案例分析】

1)通过任务描述可知,该系统中必须包括3个实体类,类名及属性设置如下:

  1. 图书类(Book):
  • 图书编号(id)
  • 图书名称(name)
  • 图书单价(price)
  • 库存数量(storage)
  1. 订单项类(OrderItem):
  • 图书(book)
  • 购买数量(num)
  1. 订单类(Order):
  • 订单号(orderID)
  • 订单总额(total)
  • 订单项列表(items)

2)由于购买图书时,需要选择图书的数量,所以需要在订单项类里定义获取图书对象以及图书数量的方法。

3)由于需要指定订单项以及获取订单的订单列表、订单号、订单总额等信息,所以需要有订单列表、订单号、订单总额指定订单项等方法。

【案例实现】

定义图书类Book,其代码如下所示。

 1 	public class Book {
 2 	    private int id;    // 编号
 3 	    private String name;  // 书名
 4 	    private double price;  // 价格
 5 	    private int storage;   // 库存
 6 	    // 有参构造
 7 	    public Book(int id, String name, double price, int storage) {
 8 	        this.id = id;
 9 	        this.name = name;
 10 	        this.price = price;
 11 	        this.storage = storage;
 12 	    }
 13 	    // 获取书号
 14 	    public int getId() {
 15 	        return id;
 16 	    }
 17 	    // 获取书名
 18 	    public String getName() {
 19 	        return name;
 20 	    }
 21 	    // 获取价格
 22 	    public double getPrice() {
 23 	        return price;
 24 	    }
 25 	    // 获取库存
 26 	    public int getStorage() {
 27 	        return storage;
 28 	    }
 29 	}

上述代码中,声明了图书标号id、书名name、价格price、库存storage,并提供了其gettersetter方法。

定义订单项类OrderItem,其代码如下所示。

 1 	public class OrderItem {
 2 	    private Book book;
 3 	    private int num;
 4 	    // 有参构造方法
 5 	    public OrderItem(Book book, int num) {
 6 	        this.book = book;
 7 	        this.num = num;
 8 	    }
 9 	    // 获取图书对象
 10 	public Book getBook() {
 11 	      return book;
 12 	}
 13 	    // 获取订购图书数量
 14 	public int getNum() {
 15 	      return num;
 16 	    }
 17 	}

上述代码中,声明了图书对象Book,购买数量num,并提供了其gettersetter方法。

定义订单类Order,其代码如下所示。

 1 	public class Order {
 2 	    private String orderId;
 3 	    private OrderItem items[];
 4 	    private double total;
 5 	    // 有参构造
 6 	    public Order(String orderId) {
 7 	        this.orderId = orderId;
 8 	        this.items = new OrderItem[3];
 9 	    }
 10 	// 获取订单号
 11 	public String getOrderId() {
 12 	        return orderId;
 13 	}
 14 	// 获取订单列表
 15 	public OrderItem[] getItems() {
 16 	        return items;
 17 	}
 18 	// 获取订单总额
 19 	public double getTotal() {
 20 	        calTotal();
 21 	        return total;
 22 	}
 23 	// 指定一个订单项
 24 	public void setItem(OrderItem item, int i) {
 25 	        this.items[i] = item;
 26 	}
 27 	// 计算订单总额
 28 	public void calTotal() {
 29 	double total = 0;
 30 	for (int i = 0; i < items.length; i ++) {
 31 	      total += items[i].getNum() * items[i].getBook().getPrice();
 32 	}
 33 	      this.total = total;
 34 	}
 35 	}

上述代码中,声明了订单id、订单项数组,并声明了获取订单号方法getOrderId()、获取订单列表方法getItems()、获取订单总额方法getTotal()、指定一个订单项setItem()、计算订单总额的方法calTotal()

 1 	import java.util.Scanner;
 2 	public class PayBooks {
 3 	    public static void main(String[] args) {
 4 	        Book books[] = new Book[3];
 5 	        //模拟从数据库中读取图书信息并输出
 6 	        outBooks(books);
 7 	        // 顾客购买图书
 8 	        Order order = purchase(books);
 9 	        // 输出订单信息
 10 	        outOrder(order);
 11 	    }
 12 	    // 顾客购买图书
 13 	    public static Order purchase(Book books[]) {
 14 	        Order order = new Order("00001");
 15 	        OrderItem item = null;
 16 	        Scanner in = new Scanner(System.in);
 17 	        for (int i = 0; i < 3; i ++) {
 18 	            System.out.println("请输入图书编号选择图书:");
 19 	            int cno = in.nextInt();
 20 	            System.out.println("请输入购买图书数量:");
 21 	            int pnum = in.nextInt();
 22 	            item = new OrderItem(books[cno-1],pnum);
 23 	            order.setItem(item, i);
 24 	            System.out.println("请继续购买图书。");
 25 	        }
 26 	        in.close();
 27 	        return order;
 28 	    }
 29 	    // 输出订单信息
 30 	    public static void outOrder(Order order) {
 31 	        System.out.println("\n\t图书订单");
 32 	        System.out.println("图书订单号:"+order.getOrderId());
 33 	        System.out.println("图书名称\t购买数量\t图书单价");
 34 	        System.out.println("--------------------------------------");
 35 	        OrderItem items[] = order.getItems();
 36 	        for(int i = 0; i < items.length; i ++) {
 37 	System.out.println(items[i].getBook().getName()+"\t"+items[i].getNum(
 38 	)+"\t"+items[i].getBook().getPrice());
 39 	            //System.out.println("\n");
 40 	        }
 41 	System.out.println("---------------------------------------");
 42 	 System.out.println("订单总额:\t\t"+order.getTotal());
 43 	}
 44 	    // 模拟从数据库中读取图书信息并输出
 45 	    public static void outBooks(Book books[]) {
 46 	        books[0] = new Book(1,"Java教程",30.6,30);
 47 	        books[1] = new Book(2,"JSP教程",42.1,40);
 48 	        books[2] = new Book(3,"SSH架构",47.3,15);
 49 	        System.out.println("\t图书列表");
 50 	        System.out.println("图书编号\t图书名称\t\t图书单价\t库存数量");
 51 	        System.out.println("---------------------------------------");
 52 	        for (int i = 0; i < books.length; i ++) {
 53 	            System.out.println(i+1+"\t"+books[i].getName()+"\t"+
 54 	                        books[i].getPrice()+"\t"+books[i].getStorage());
 55 	        }
 56 	        System.out.println("---------------------------------------");
 57 	    }
 58 	}

上述代码中,输出了图书列表信息包括:图书编号、图书名称、图书单价、库存数量,用户根据图书列表信息,输入图书编号、购买数量等,系统根据用户输入的图书编号及购买数量计算总金额。

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

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

相关文章

mpls专线与MSTP专线区别在哪里?

首先我们要知道什么是MPLS和MSTP&#xff0c;MPLS&#xff1a;“多协议标签交换机制”。是一种数据传输的机制&#xff0c;可以基于多种不同的3层协议来生成2.5层的标签信息&#xff0c;通过为数据包上分配标签交换替代IP转发&#xff0c;这种标签是短而定长、只具有本地意义的…

代码随想录【Day15】|102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树

102. 二叉树的层序遍历 题目链接 题目描述&#xff1a; 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 难点&#xff1a; 思路&#xff1a; 需要借用一个辅助数据结构即队列来实现…

传输层重要协议之UDP协议和TCP协议详解

更多关于UDP协议和TCP协议请移步官网&#xff1a;https://www.rfc-editor.org/standards#ISUDP标准协议文档-RFC 768TCP标准协议文档-RFC 793UDP协议详解UDP协议的特点&#xff1a;无连接、不可靠传输、面向数据报和全双工。UDP协议报文结构&#xff1a;关于端口号&#xff1a;…

Ubuntu系统为程序创建桌面快捷方式

为了不用每次都要进入命令行启动应用程序&#xff0c;为程序创建快捷方式是一个很方便的方法&#xff0c;尤其是你的程序需要在团队外部使用的时候。桌面创建快捷方式一般使用.desktop为后缀的文件实现&#xff0c;该文件的内容格式基本要素如下&#xff1a;[Desktop Entry] Na…

Git与IDEA强强联合(HTTPS协议连接)

最近在写项目的时候&#xff0c;在台式机和笔记本之间频繁切换&#xff0c;竟然还是用qq传压缩包&#xff0c;我自己都感觉无语&#xff0c;有git这样强大的版本管理工具&#xff0c;我竟然没想起来。然后也没有相关的博文就想来更新一篇。 那么如何使idea和git强强联合呢&…

果实可采摘点论文汇总

文章目录2019基于Mask R-CNN的芒果实例分割及采摘点检测研究与实现2021A mango picking vision algorithm on instance segmentation and key point detection from RGB images in an open orchard2022基于深度学习的多品种鲜食葡萄采摘点定位Method for Identifying Litchi Pi…

webpack(高级)--Prefetch和Preload shimming

webpack Prefetch和Preload webpack v4.6.0 增加了对预获取和预加载的支持 在声明import时 使用下面这些内置指令 来告知浏览器 prefetch(预获取):&#xff1a;将来某些导航下可能需要的资源 preload(预加载)&#xff1a;当前导航下可能需要资源 import(/* webpackChunkName…

Leetcode详解JAVA版

目录1. 两数之和14. 最长公共前缀15. 三数之和18. 四数之和19. 删除链表的倒数第 N 个结点21. 合并两个有序链表28. 找出字符串中第一个匹配项的下标36. 有效的数独42. 接雨水43. 字符串相乘45. 跳跃游戏 II53. 最大子数组和54. 螺旋矩阵55. 跳跃游戏62. 不同路径70. 爬楼梯73.…

Jenkins连接Maven自动化部署构建SpringBoot

目录1.首先下载maven拉取到服务器2.解压maven并进入解压文件修改setting.xml2.拉取jdk18到服务器并解压3.将jdk还有maven移动到jenkins的挂载目录4.进入jenkins容器5.在jenkins的全局配置中配置jdk与maven6.jenkins安装插件 Publish Over SSH7.jenkins服务器创建一个jar包存放目…

ArcGIS API for JavaScript 4.15系列(6)——Dojo中的事件绑定

1、前言 在Web界面中&#xff0c;用户点击按钮、选择下拉选项、移动鼠标都涉及到dom元素的事件机制。下面就来介绍一下Dojo中的事件绑定操作。 2、dojo/on模块绑定事件 我们就从最简单的按钮click事件入手&#xff0c;Dojo中的dojo/on模块可以实现dom元素的事件绑定&#xf…

高性能办公娱乐迷你主机——Maxtang大唐AMD5600U

今天给大家介绍一款AMD5600U迷你主机&#xff0c;说起这款处理器大家应该并不陌生&#xff0c;像联想小新、YOGA以及ThinkBook等很多款用的都是这个型号&#xff0c;不过笔记本的价格基本都在3999-4999这个价位区间&#xff0c;同样的处理器&#xff0c;笔记本卖那么贵&#xf…

内网渗透(二十八)之Windows协议认证和密码抓取-Windows RDP凭证的抓取和密码破解

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

帮公司面试了一个30岁培训班出来的程序员,没啥工作经验...

首先&#xff0c;我说一句&#xff1a;培训出来的&#xff0c;优秀学员大有人在&#xff0c;我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配&#xff0c;是非常遗憾的事情。 最近&#xff0c;在网上看到这样一个留言&#xff0c;引发了程序员这个圈子不少的…

Python程序设计-第5章Python面向对象

第5章Python面向对象一.预习笔记 1.类的相关概念 类的定义&#xff0c;类对象&#xff0c;实例对象&#xff0c;类属性 类属性是跟类绑定的&#xff0c;如果要修改类的属性就必须使用类对象访问&#xff0c;只使用实例对象是无法修改的。 权限访问&#xff1a;name与age是公…

【每日随笔】手指训练 ( 产品需求探索、技术无关 | 手指训练作用 | 哪些人需要手指训练 | 手指操 | 手指康复训练器材 )

文章目录一、手指训练作用二、哪些人需要手指训练三、手指操四、手指康复训练器材产品需求探索 , 研究下手指训练的市场 , 前景 , 是否可以开发 ; 一、手指训练作用 手指训练作用 : 改善 上肢协调性手眼 协调性训练提高 手指 抓握 能力提高 手指 灵活性提高 上肢运动 准确性 和…

Linux进程间通信(system V共享内存)

共享内存原理 看上面这张图&#xff0c;其实只要是进程间通信都离不开让他们看到同一块资源(内存)&#xff0c;其实共享内存这里和动态库那里一样&#xff0c;都是要加载到共享区&#xff0c;共享内存提供者&#xff0c;是操作系统&#xff0c;操作系统要不要管理共享内存&…

Python环境搭建指南

Python能做太多有趣使用的事了&#xff0c;不仅可以做现在火热的人工智能、数据分析&#xff0c;还可以做爬虫、Web开发、自动化运维的事情。 随着Python为我们工作与生活带来更多的便捷后&#xff0c;很多人开始学习Python&#xff0c;关注Python的发展前景、薪资和职业素养的…

RabbitMQ——高级特性(SpringBoot实现)

本篇文章的内容与我之前如下这篇文章一样&#xff0c;只是使用技术不同&#xff0c;本篇文章使用SpringBoot实现RabbitMQ的高级特性&#xff01; RabbitMQ——高级特性_小曹爱编程&#xff01;的博客-CSDN博客RabbitMQ——高级特性&#xff1a;1、RabbitMQ高级特性&#xff1b;…

IDEA2021.3新建一个maven-archetype-webapp项目,发现在新建文件汇总,没有新建servlet文件选项

问题 我使用maven-webapp 模板新建了一个web项目&#xff0c;但是在新建文件的时候&#xff0c;发现没有servlet选项 解决 第一种&#xff1a;在pom中直接配置 <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>java…

Linux进程信号产生以及捕捉

一.什么是信号 生活中&#xff0c;有哪些信号相关的场景呢&#xff0c;比如&#xff1a;红绿灯&#xff0c;闹钟&#xff0c;转向灯等等 1.这里我们要知道&#xff0c;你为什么认识这些信号呢&#xff0c;记住了对应场景下的信号&#xff0b;后续是有”动作“要你执行的 2.我们…