JAVA

第三章 抢红包小程序设计1


文章目录

  • JAVA
  • 一、简要要求
  • 二、实现
    • 1.定义工具类RedPacketUtil
    • 2.自定义异常类,继承Exception,简单抛出提示信息
    • 3.编写模拟人员抢红包,并展示红包领取详情
    • 4.编写一个测试类,生成产生红包类对象
  • 总结

一、简要要求

编写一个将红包金额按一定数量随机分配的小程序。红包金额最大不能超过 200 元,每个人分到的红包最小不能少于 1 分钱,红包的最小单位是分

二、实现

1.定义工具类RedPacketUtil

类中定义类属性:最小红包额度,最大红包额度,每个红包最大金额是平均值的倍数等;
定义isRight()函数检查红包金额的合法性,如平均值小于最小金额,总金额大于红包金额的最大值等都判断为不合法。
定义List splitRedPackets(int money, int count) 方法:参数分别为红包总金额(单位:分)和红包数量,将分配好的红包放入 List 集合。首先调用检查函数,如果金额不合法,抛出:“红包金额不合法”的自定义异常;根据红包数,红包总金额,红包最大金额和最小金额,循环调用随机产生每个红包值的函数randomVal(),返回值存入list集合。
定义随机产生单个红包值函数randomVal():首先进行判断,如果红包数量为1,直接返回金额;最大金额和最小金额相等,直接返回金额。随机产生一个红包值,(int)Math.rint(Math.random() * (每个红包的最大值 - 每个红包的最小值) + 每个红包的最小值)) % 每个红包的最大值 + 1(单位都是分)。判断是否合法isRight(剩余金额,剩余红包数),合法就返回。否则,如果下一轮红包平均值比最小值小,将此轮产生的红包值作为最大值,递归调用随机生成函数;如果下一轮红包平均值比最大值大,将此轮产生的红包值作为最小值,递归调用随机生成函数。
自定义异常类,继承Exception,简单抛出提示信息即可。

代码如下:

import java.util.List;
import java.util.ArrayList;
public class RedPacketUtil {List<Integer> list = new ArrayList();public RedPacketUtil() {}public RedPacketUtil(double money,int count) {this.money=money;this.count=count;}double min=0.01;//最小红包额度double maxmoney=200;//最大红包额度double money;int count;//红包数量double minMoney=0.01;boolean isRight() {boolean a=true;if(money/count<min||money>200||money<0.01) {a=false;}return a;}public List<Integer> splitRedPackets(int money, int count) throws MyException{this.money=money;this.count=count;boolean b=isRight();if(b==false) { throw new MyException("红包金额不合法");}for (int i = 1; i <=count; i++) {//生成count个100内的随机数double r=randomVal();list.add((int) r);//存入list集合}for(int i=0;i<list.size();i++) {System.out.printf(list.get(i)+"  ");}System.out.print("\n");return list;}public double randomVal() {if(count==1||money==min) {return money;}double max=2*money/count;double x=Math.random();//System.out.print(x+" ");double m=Math.rint((x*(max-min)+min)%max+1);//System.out.println(m);money=money-m;count--;if(isRight()==false) {if(money/count<min) {min=m;randomVal();}if(money/count>max) {min=m;randomVal();}//红包数额分配}return m;}
}

2.自定义异常类,继承Exception,简单抛出提示信息

代码如下:

public class MyException extends Exception{public MyException() {}public MyException(String s) {System.out.println(s);}
}

3.编写模拟人员抢红包,并展示红包领取详情

定义RedEnvelope 类,可能用到的属性: 红包金额(分),红包数目 ,发送日期,第一个人抢红包的开始时间,红包抢完后的结束时间,List bag; // 分配到的红包列表(分),Map<String,Double> info; // 红包领取信息。
定义一个 open 的方法,该方法携带一个参数 name,表明是这个人打开了红包,在该方法中实现以下功能:如果超过 5 秒没人领取,红包过期,当再打开红包时,输出:“红包已经过期”;如果未过期,且第一个人打开红包时,将 start 设为当前时间,记录下红包开始领取的时间,将红包列表的最后一个值给该人,第二个人打开时就将红包列表的倒数第二位的值给他,输出:“恭喜xx,领取到了xx元”,并将姓名作为 key,红包金额作为 value 存到集合HashMap中(注意:输出和存储是需要将分转换为元,除以 100.0),将红包数量减去一,并判断红包数量是否为零,如果为零则获取当前时间为红包领取完的时间,计算红包几秒领取完毕,输出:“红包被抢完,一共用了xx秒”,后面的人领取红包时依次类推;如果红包领完后,且红包未过期,输出:“xx手速慢了,红包都没啦”;
showInfo():该方法实现打印红包领取详情,输出格式为:“xx抢到了xx元”,当所有红包领取详情输出完毕后,最后输出谁是运气王,输出格式为:“其中,xx是运气王,抢到了xx元”。

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.HashMap;
public class RedEnvelope {int redmoney;int num;Date setdate;long star;long end;List<Integer> bag;Map<String,Double> info;public RedEnvelope() {}public void RedEnvelope(int m,int b,List<Integer> bag) {this.num=b;this.redmoney=m;this.bag=bag;{info=new HashMap<>();setdate=new Date();}}public void open(String name) {int second = (int)((new Date().getTime()- setdate.getTime()) / (1000));if (second < 5){if ( info.size() == 0 ){star= new Date().getTime();}if (num > 0 ){double nowMoney = bag.get(num - 1)/100.0;info.put(name, nowMoney);System.out.println("恭喜" + name + ",抢到了" + nowMoney + "元");num--;}if (num == 0){end = new Date().getTime();System.out.println("红包被抢完,一共用了" + ((int)((end - star) / (1000))) + "秒");num = -1;return;}if(num == -1){System.out.println( name + "手速慢了,红包都没啦");}}else {System.out.println( name + ":红包已经过期");} }public void showInfo(){double max=0;for(Entry<String, Double> entry : info.entrySet()){max = entry.getValue() > max ? entry.getValue() : max;System.out.printf( "%s抢到了%.2f元\n", entry.getKey(),entry.getValue());}for(Entry<String, Double> entry : info.entrySet()){if (entry.getValue() == max){System.out.printf( "其中,%s是运气王,抢到了%.2f元\n", entry.getKey(),entry.getValue());break;}}}
}

4.编写一个测试类,生成产生红包类对象

代码如下:

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class text4 {public static void main(String[] args) throws MyException { Scanner in=new Scanner(System.in);System.out.println("请输入红包金额:");int a=in.nextInt();System.out.println("请输入红包个数:");int b=in.nextInt();RedPacketUtil c=new RedPacketUtil();c.splitRedPackets(a,b);RedEnvelope d=new RedEnvelope();d.RedEnvelope(a,b,c.list);System.out.println("请输入抢红包人名:");d.open(in.next());d.open(in.next());d.open(in.next());d.open(in.next());d.open(in.next());d.showInfo();}
}

总结

调出来了

自己输入人名啥的就能抢了

JAVA-抢红包小程序设计相关推荐

  1. Java抢红包小程序

    程序要求 1:任意输入金额和红包个数 2:输出每个红包的金额,并标记手气最佳 3:1键模拟抢红包过程  4:2键列出当前红包情况(总金额.总红包数.剩余红包数等) 5:3键取消发红包 代码如下: pa ...

  2. CoreJava 笔记总结-第三章 Java的基本程序设计结构

    CoreJava 笔记总结 文章目录 CoreJava 笔记总结 第三章 Java的基本程序设计结构 数据类型 1. 整型 2. 浮点类型 3. char类型 4. boolean类型 变量与常量 1 ...

  3. JAVA高并发程序设计(葛一鸣著)读书笔记

    本文为JAVA高并发程序设计(葛一鸣著)读书笔记.这本书对于刚刚入门的童鞋来讲可能有点深,我推荐可以先看看Java多线程编程核心技术(高洪岩著)一书. 第一章 走入并行世界 什么是同步和异步? 同步就 ...

  4. Java高并发程序设计入门

    转自:http://blog.csdn.net/johnstrive/article/details/50667557 说在前面 本文绝大部分参考<JAVA高并发程序设计>,类似读书笔记和 ...

  5. JavaSE-Adventure(VII) Java OOP 面向对象程序设计

    JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 CONTENTS JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 ...

  6. 《实战Java高并发程序设计》github笔记和源码

    笔记 <实战Java高并发程序设计>中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了 笔者做了相关笔记并整理源代码,欢迎 ...

  7. 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库

     源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...

  8. 第2章(Java 的基本程序设计结构)

    第2章(Java 的基本程序设计结构) 文章目录 第2章(Java 的基本程序设计结构) 2.1一个简单的 Java 应用程序 2.2注 释 2.3数据类型 2.3.1整型 2.3.2浮点型 2.3. ...

  9. java个人小管家代码_Java程序设计基础—Java小管家系统构建

    课题一 Java桌面小管家项目分析 任务1 Java桌面小管家项目分析 课题二 了解Java语言 任务2 编写第一个Java程序 课题三 面向对象程序设计思想 任务3 为小管家设计类 任务4 实现小管 ...

最新文章

  1. java基础小总结(2)
  2. [保护模式]PAE模式
  3. 反问疑问_句子练习大全(反问、疑问、设问、病句等练习)
  4. linux下利用C或C++语言调用需要root权限的函数
  5. Codeforces1142D
  6. JDK 10:FutureTask获取一个toString()
  7. 关于操作系统I/O的一些基础知识
  8. SqlDataReader的用法(重点:访问字段的值)
  9. 【QT】QT事件处理
  10. IP路由原理 直连路由和静态路由 路由协议
  11. PostgreSQL中with和without time zone两者有什么区别
  12. java gwt开发_java – 如何启动GWT超级开发模式
  13. Spring源码系列(十二)Spring创建Bean的过程(二)
  14. 横版射击,王者归来|Cocos精品《合金弹头OL》
  15. 计算机网络安全工作室介绍,计算机网络技术专业 “网络工作室”做法简介
  16. STM32闭环步进电机驱动器方案,原理图,源码,PCB
  17. c语言闯关考试题讲解,程序员面试闯关(二):数据结构考点与细节分析
  18. RuntimeError: non-empty 3D or 4D input tensor expected but got ndim: 4
  19. 微信商城开源版二次开发(二)
  20. UI设计都需要学什么呢?零基础如何学UI设计?

热门文章

  1. nginx 屏蔽恶意请求
  2. Maven构建 —— groupId、artifactId、version概念
  3. 阿里云服务器ECS共享型和企业级是什么?
  4. 张子阳的文章-写给毕业生
  5. 组件化开发的优点和缺点(简述)
  6. 第11章 受限玻尔兹曼机
  7. 解决flutter 依赖版本冲突的n种方法
  8. Django博客开发5----xadmin
  9. 2021年高考佛山成绩查询,2021年佛山高考各高中成绩及本科升学率数据排名及分析...
  10. 安防相机的宽动态(WDR—WideDynamicRange)