购物小票打印程序设计

【问题描述】
在超市或其它小店消费后,都会打印小票。小票的中间打印消费明细,每行包括品名、数量、单价、小计,最后一行打印合计。如果有折扣,在合计的下面打印折扣率、折扣和实际消费。根据需要可以在明细的上部灵活地装饰一些小票标题、欢迎词、广告词等。账单底部也可以灵活地装饰一些联系电话、店址信息等。要求打印小票只能通过一次调用打印小票的方法来完成(如类图中的printBill方法,在主类TestBill的main函数中,调用一次即可完成打印购物小票任务)。类的设计如下所示:

请输入折扣率[0-1):0
请输入商品数量:3
请输入3种商品(品名、数量、单价)
鱼香肉丝 1 15
三鲜汤 1 12
米饭 2 1
账单顶部信息行数:0
账单底部信息行数:0

【输出样例1】

          打印日期:2021-05-27 10:22:32
-----------------------------------------------------------------------------------品名                         数量      单价        小计
-----------------------------------------------------------------------------------鱼香肉丝                         1     15.00     15.00三鲜汤                        1     12.00     12.00米饭                             2      1.00      2.00
------------------------------------------------------------------------------------合计:  29.00

【输入样例2】

请输入折扣率[0-1):0
请输入商品数量:2
请输入2种商品(品名、数量、单价)
肯德基套餐 1 48
可乐 1 6
账单顶部信息行数:1
XXX账单明细
账单底部信息行数:0

【输出样例2】

   XXX账单明细打印日期:2021-05-27 10:22:32
-----------------------------------------------------------------------------------品名                         数量      单价        小计
-----------------------------------------------------------------------------------肯德基套餐                        1     48.00     48.00可乐                         1      6.00      6.00
------------------------------------------------------------------------------------合计:  54.00

【输入样例3】

请输入折扣率[0-1):0.9
请输入商品数量:3
请输入3种商品(品名、数量、单价)
鱼香肉丝 1 15
三鲜汤 1 12
米饭 2 1
账单顶部信息行数:1
XXX账单明细
账单底部信息行数:1
店址:北京市XXX街道XXX号
【输出样例3】

  XXX账单明细打印日期:2021-05-27 10:35:15
-----------------------------------------------------------------------------------品名                         数量      单价        小计
-----------------------------------------------------------------------------------鱼香肉丝                         1     15.00     15.00三鲜汤                        1     12.00     12.00米饭                             2      1.00      2.00
------------------------------------------------------------------------------------合计:  29.00折扣率:0.9  折扣:  2.90 实际消费:  26.10店址:北京市XXX街道XXX号

【输入样例4】

请输入折扣率[0-1):0.8
请输入商品数量:5
请输入5种商品(品名、数量、单价)
鱼香肉丝 1 15
宫保鸡丁 1 18
红烧甲鱼 1 65
麻辣小龙虾 2 100
手撕包菜 1 8
账单顶部信息行数:3
小麻辣烫开业酬宾,进店人人有惊喜。
欢迎惠顾**
XXX账单明细
账单底部信息行数:2
店址:北京市XXX街道XXX号
联系电话:0714-6528888

【输出样例4】

                          XXX账单明细*****欢迎惠顾*******小麻辣烫开业酬宾,进店人人有惊喜。打印日期:2021-05-27 10:44:13
-----------------------------------------------------------------------------------品名                         数量      单价        小计
-----------------------------------------------------------------------------------鱼香肉丝                       1     15.00     15.00宫保鸡丁                       1     18.00     18.00红烧甲鱼                       1     65.00     65.00麻辣小龙虾                     2    100.00    200.00手撕包菜                       1      8.00      8.00
-----------------------------------------------------------------------------------合计: 306.00折扣率:0.8  折扣: 61.20 实际消费: 244.80店址:北京市XXX街道XXX号联系电话:0714-6528888
商品信息类Goods
public class Goods {private    String Iterm;private   int quantity;private    float price;public static float num=0;public Goods(String iterm, int quantity, float price) {Iterm = iterm;this.quantity = quantity;this.price = price;num=num+(quantity*price);}public String getIterm() {return Iterm;}public int getQuantity() {return quantity;}
public float getPrice() {return price;}@Overridepublic String toString() {//重写toString方法改格式return ("    "+getIterm()+"\t\t\t\t\t\t  "+getQuantity()+"\t  " +getPrice()+  "\t    "+  getQuantity()*getPrice());
}}
抽象账单类Bill
abstract class Bill {abstract void printBill();}
具体账单类(账单明细类)ConcreteBill
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class ConcreteBill extends Bill{Date date=new Date();SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic void printBill() {System.out.println("                          打印日期:"+format.format(date));System.out.println("----------------------------------------------------------------------------");System.out.println(" 品名\t\t\t\t\t\t  数量\t  单价\t    小计");  System.out.println("----------------------------------------------------------------------------");
for (int i=0;i<list.size();i++)
{System.out.println(list.get(i));
}    System.out.println("----------------------------------------------------------------------------");System.out.println("合计: "+Goods.num);}ArrayList list=new ArrayList<Goods>();public void addBill(Goods a){list.add(a);}}
含有打折的账单明细类DiscountBill
public class DiscountBill extends ConcreteBill{private float discountRate;//折扣率public void printBill(){while (discountRate<1&&discountRate>0) {super.printBill();System.out.println("折扣率:" + discountRate + "  折扣:  " + Goods.num * (1 - discountRate) + " 实际消费:  " + Goods.num * (discountRate));
break; }  }public DiscountBill(float discountRate) {this.discountRate = discountRate;}
}
抽象的账单装饰类BillDecorator
abstract class BillDecorator extends Bill{private Bill bill;public BillDecorator(Bill bill) {this.bill = bill;@Overridepublic void printBill() {bill.printBill();
}
}
顶部装饰类HeaderBill
public class HeaderBill extends BillDecorator{public String header;public HeaderBill(Bill bill, String header) {super(bill);this.header = header;}@Overridepublic void printBill() {System.out.println(header);super.printBill();}
}
底部装饰类FooterBill
public class FooterBill extends BillDecorator{public String footer;public FooterBill(Bill bill, String footer) {super(bill);this.footer = footer;}@Overridepublic void printBill() {super.printBill();System.out.println(footer);}
}
测试类TestBill
import java.util.Scanner;
public class TestBill {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入折扣率[0-1):");float discountRate = input.nextFloat();DiscountBill discountBill=new DiscountBill(discountRate);System.out.print("请输入商品数量:");int  number = input.nextInt();System.out.println("请输入"+number+"种商品(品名、数量、单价)");float num=0;for (int i = 0; i<number; i++){String Iterm= input.next();int quantity=input.nextInt();float price=input.nextFloat();Goods goods=new Goods(Iterm,quantity,price);discountBill.addBill(goods);}System.out.print("账单顶部信息行数:");int ktxx=input.nextInt();String db,tou = "";for (int i=0;i<ktxx;i++){db=input.next();tou=db+"\n"+tou;}input.nextLine();System.out.print("账单底部信息行数:");int wbxx=input.nextInt();String wb,wei="";for (int k=0;k<wbxx;k++){wb=input.next();wei=wb+"\n"+wei;}HeaderBill headerBill=new HeaderBill(discountBill,tou);FooterBill footerBill=new FooterBill(headerBill,wei);footerBill.printBill();}}

代码详解:
共有8各个类:
1.商品信息类Goods,包含三个成员变量品名、数量、单价,有带三个参数的构造方法以及各成员变量的get方法。
2.抽象账单类Bill,有一个抽象方法打印账单printBill。
3.具体账单类(账单明细类)ConcreteBill,继承抽象账单类Bill。有一个成员变量list,用动态数组保存这笔消费的各个商品信息。有往账单添加商品的addBill方法,还要重写打印账单printBill方法,实现打印账单明细。
4.含有打折的账单明细类DiscountBill ,继承账单明细类ConcreteBill。有一个成员变量discountRate(折扣率),有一个带一个参数的构造方法,并重写打印账单明细方法printBill。在printBill方法中,先打印正常消费明细,然后打印折扣信息。
5.抽象的账单装饰类BillDecorator,继承账单类Bill。有一个成员变量账单,装饰类允许在成员变量账单的基础上,加装顶部装饰或底部装饰。有一个带一个参数的构造方法,并重写打印账单明细方法printBill。在printBill方法中调用成员变量账单的printBill方法。
6.顶部装饰类HeaderBill,继承装饰类BillDecorator。有一个成员变量保存头部信息。有一个带2个参数的构造方法(父类账单:被加装的账单,头部信息),重写打印账单方法printBill(先打印头部信息,再打印账单中的信息)。
7.底部装饰类FooterBill,继承装饰类BillDecorator。有一个成员变量保存头部信息。有一个带2个参数的构造方法(父类账单:被加装的账单,底部信息),重写打印账单方法printBill(先打印账单中的信息,再打印底部信息)。
8.测试类TestBill。先输入折扣率、消费商品的数量n。接着输入n行,每行输入品名、数量、单价。紧接着输入顶部信息行数headerLines,后面跟着输入headerLines行,每行都是账单的头部信息。再接着输入底部信息行数footerLines,后面跟着输入footerLines行,每行都是账单的底部信息。最后打印修饰后的账单信息。

测试:

java小项目之打印账单相关推荐

  1. java小项目家庭记账程序

    文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...

  2. java小项目影院系统

    java小项目,影院管理系统 http://download.csdn.net/detail/github_32658299/9632276 下面是两个关键的类 1.这是电影院测试类,用来读取用户输入 ...

  3. java小项目租车系统_Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...

  4. java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  5. 我是一只小僵尸java,Java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材...

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  6. Java小项目中WEB-INF下jsp页面如何访问?

    Java小项目中WEB-INF下jsp页面如何访问? - 今天又是充满希望的一天 - CSDN博客 关闭 今天又是充满希望的一天 目录视图 摘要视图 订阅 var username = "H ...

  7. Java小项目——家庭记账项目

    学习Java已经过了半个月左右了,所学的知识已经能够写一些小程序或者小项目,虽然它可能没有那么高级,但是也能检验你之前所学的全部内容.所以今天就与大家分享一下我的小项目经验. 一.需求说明 该软件能够 ...

  8. Java小项目-银行用户管理系统

    文章目录 前言 一. 功能 二. 代码 银行卡数据 转账流水数据 用户数据 BanksController UserController BanksDao RecordDao UserDao Bank ...

  9. 学生成绩查询系统(Java实现),你第一个Java小项目

    一.学生成绩查询系统(Java实现) 项目要求(我们可以做的更面向对象一点,灵活处理): 具体思路如下: 1.引入程序需要调用的包 2.创建总程序包 "stuScoreInquirySyst ...

最新文章

  1. P4887 第十四分块(前体) 莫队
  2. 自学python推荐书籍同时找哪些来实践-机器学习:Python实践 PDF 原书完整版
  3. java分页模板_java 分页模型的模板
  4. 802.11b标准简介
  5. XSS-Game level 12
  6. Git常用命令的使用方法
  7. Problem 2128 最长子串
  8. CentOS 7 service systemnctl
  9. CodeVS 1014 装箱问题(DP)
  10. 【优化算法】混合增强灰狼优化布谷鸟搜索算法(AGWOCS)【含Matlab源码 1331期】
  11. 前言:电商产品经理必修课-如何打造实战型商品系统
  12. 2009年下半年 系统集成项目管理工程师 下午试卷
  13. vmware虚拟机添加物理网卡与虚拟网卡
  14. Powerdesigner pdm视图看不到表注释comment问题
  15. VS2019 ClaudiaIDE更换背景图片
  16. 晶品特装在科创板上市:总市值约为48亿元,前三季度收入下滑12%
  17. html 剩余时间 自动减,HTML+CSS+JS实现今天的日期和今天剩余的时间
  18. 戴尔T640服务器使用nvidia显卡风扇转速百分之百解决方案
  19. 新概念2 课文和单词(9)
  20. 一文概览2D人体姿态估计

热门文章

  1. Editplus打开关联文件缓慢的问题解决
  2. 2013年4月14日 22:46:03
  3. 【板绘练习】天使恶魔ヾ(゚∀゚○)ツ线稿练习
  4. redis 管理工具比对
  5. 一些免费计算机书籍网站
  6. 重庆大学计算机学院刘然,建设委员会-生物感知与智能信息处理重庆市重点实验室...
  7. 云渲染动画价格一般多少?
  8. latex 中添加Springer LNCS 模板的\bibitem{}格式参考文献方法
  9. IT | Bootmgr is missing 解决方法
  10. 上周热点回顾(7.13-7.19)