3.1 综合案例:群主发普通红包
群主发普通红包。某群有多名成员,群主给成员发普通红包。普通红包的规则:
1、群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取。
2、成员领取红包后,保存到成员余额中。
请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作。
3.2 案例分析
根据描述分析,得出如下继承体系:
3.2 案例实现
定义用户类:
package demo09;
public class User {
//成员变量
private String username;//用户名
private double leftMoney;//余额
//构造方法
public User(){}
public User(String username, double leftMoney) {
this.username = username;
this.leftMoney = leftMoney;
}
//get.set方法
public String getUsername() {
return username;
}
public double getLeftMoney() {
return leftMoney;
}
public void setUsername(String username) {
this.username = username;
}
public void setLeftMoney(double leftMoney) {
this.leftMoney = leftMoney;
}
//展示信息的方法
public void show(){
System.out.println("用户名:"+username+",余额为:"+leftMoney+"元");
}
}
定义群主类:
package demo09;
import java.util.ArrayList;
public class QunZhu extends User {
//添加构造方法
public QunZhu(){}
public QunZhu(String username, double leftMoney) {
//通过super 调用父类构造方法
super(username, leftMoney);
}
/*
群主发红包,就是把一个整数的金额,分成若干等份。
1、获取群主余额,是否够发红包。
不能则返回null,并提示
能则继续
2、修改群主余额
3、拆分红包
3.1、如果能整除,那么就平分
3.2、如果不能整除,那么就把余数分给最后一份。
* */
public ArrayList<Double> send(int money,int cnt){
//获取群主余额
double leftMoney=getLeftMoney();
if(money>leftMoney){
return null;
}
//修改群主余额
setLeftMoney(leftMoney-money);
//创建一个集合,保存等份金额
ArrayList<Double> list=new ArrayList<>();
//扩大100倍,相当于折算成‘分’为单位,避免小数运算损失精度的问题
money=money*100;
//每份的金额
int m=money/cnt;
//不能整除的余数
int l=money%cnt;
//无论是否整除,n-1份,都是每份的等额金额
for(int i=0;i<cnt-1;i++){
//缩小100倍,折算成元
list.add(m/100.0);
}
//判断能否整除
if(l==0){
//能整除,最后一份金额,与之前每份金额一致
list.add(m/100.0);
}else{
//不能整除,最后一份的金额,是之前每份金额+余数金额
list.add((m+l)/100.00);
}
//返回集合
return list;
}
}
定义成员类:
package demo09;
import java.util.ArrayList;
import java.util.Random;
public class Member extends User {
public Member() {
}
public Member(String username, double leftMoney) {
super(username, leftMoney);
}
//打开红包,就是从集合中,随机取出一份,保存到自己的余额中
public void openHongbao(ArrayList<Double> list){
//创建Random对象
Random r=new Random();
//随机生成一个角标
int index= r.nextInt(list.size());
//移除一个金额
Double money=list.remove(index);
//直接调用父类方法,设置到余额
setLeftMoney(money);
}
}
定义测试类:
package demo09;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//创建一个群主对象
QunZhu qz=new QunZhu("群主",200);
//创建一个键盘录入
Scanner sc=new Scanner(System.in);
System.out.println("请输入金额:");
int money=sc.nextInt();
System.out.println("请输入个数:");
int cnt=sc.nextInt();
//发送红包
ArrayList<Double> sendList=qz.send(money,cnt);
//判断,如果余额不足
if(sendList==null){
System.out.println("余额不足...");
return;
}
//创建三个成员
Member m=new Member();
Member m2=new Member();
Member m3=new Member();
//打开红包
m.openHongbao(sendList);
m2.openHongbao(sendList);
m3.openHongbao(sendList);
//展示信息
qz.show();
m.show();
m2.show();
m3.show();
}
}