A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zm292326 初级黑马   /  2018-7-19 22:45  /  900 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zm292326 于 2018-7-19 22:49 编辑

抢红包是基础班视频里面的一个视频习题。
在课后尝试着写了一下,由于快要点招考试了,又不知道要写什么发帖,果断就把它发出来与大家分享讨论一下
首先简单说一下我的思路:
1、由于是随机抢红包,那就需要抢红包的人和发红包的人,就需要定义两个类,由于是自己练习果断就又给自己再了加点戏,把这两个类抽取了一个父类。
2、抢红包和发红包的都是人,都有自己的姓名和自己的余额,所以一个简单的父类就定了下来,在学习中大家应该知道父类其实就是一个标准的普通类。
3、然后发红包的人是一个类,这个类继承了父类之后还要加上一个自己的方法(发红包的方法)。
4、收红包的人是一个类,这个类继承了父类之后还要加上一个自己的方法(收红包的方法)。
5、最后还有一个测试类,用来测试各个类的编写是否正确。
首先定义一个父类(Person):
public class Person {//定义两个成员变量分别为人的名字和余额
    private String name;
    private double money;

    public Person() {
    }
//这里为了测试的方便定义一个show方法显示各个对象的余额和姓名
    public void show(){
        System.out.println(name+"余额为"+money);
    }
    public Person(String name, double money) {
        this.name = name;
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

}


然后定义一个发红包的人的类,因为发红包的都是领导就叫他Messager类。
public class Messager extends Person {
    //群主会发红包
public ArrayList<Double> sendMoney() {
        //初始化要发红包的总金额和红包个数
double sendMoney = 0;
        int count = 0;
        //建立需要用到的键盘输入,集合以及随机数对象
Scanner input = new Scanner(System.in);
        Random r = new Random();
        ArrayList<Double> list = new ArrayList<>();
        //群主输入要发的钱数
for (; ; ) {
            System.out.print("请输入要发的红包总金额:");
            sendMoney = input.nextDouble();
            System.out.print("请输入要发的红包个数:");
            count = input.nextInt();
            //如果输入的金额大于群主的余额,则提示余额不足。
if (sendMoney > super.getMoney()) {
                System.out.println("余额不足,请重新输入!");
            }
            //如果符合规则,跳出。
break;
        }
        //发完红包后群主的余额
super.setMoney(super.getMoney()-sendMoney);
        //循环遍历输入集合中各个红包中的金额数
for (int i = 0; i < count-1; i++) {
            //随机生成一个红包的大小,用*100在/100的方式完成“元角分”的随机
int temp2 = r.nextInt((int) (sendMoney * 100));
            double red = temp2/100.0;
            if(red == 0 || red == sendMoney){
                i--;
                continue;
            }
            list.add(red);
            //剩余的钱数是原来的钱减去发出去的钱
sendMoney -= red;
        }
        //对发了总数-1个红包之后剩下的钱进行同样的操作后放入集合中
double d = Math.round(sendMoney*100)/100.0;
        list.add(d);
        return list;

    }
}



然后定义一个收红包的类,就叫他Member类

public class Member extends Person{
    //有收红包的方法
public void getRedPackage(ArrayList<Double> list){
        //每当调用这个方法的时候都随机一个索引,随机数的大小由剩余的红包决定
Random r = new Random();
        int index = r.nextInt(list.size());
        //把得到的红包与抢红包的人原来的余额相加并赋值给这个人的余额
super.setMoney(super.getMoney()+list.get(index));
        //删除已经被抢走的红包,否则有可能出现索引重复导致某一个红包重复被抢
list.remove(index);
    }
}



现在随机抢红包的程序就写完了,就只剩下测试了。定义一个测试类。


public class Test {
    public static void main(String[] args) {
        Messager messager = new Messager();
        messager.setMoney(200);
        messager.setName("0");
        //定义四个Member对象
Member one = new Member();
        Member two = new Member();
        Member three = new Member();
        Member four = new Member();
        //分别给四个对象赋值,由于本人比较懒所以赋值比较随意
one.setName("1");
        one.setMoney(0);
        two.setName("2");
        two.setMoney(0);
        three.setName("3");
播妞在线
        three.setMoney(0);
        four.setName("4");
        four.setMoney(0);
        //用一个集合保存发红包方法的返回值
ArrayList<Double> list = messager.sendMoney();
        System.out.println(list);
        //以返回值为参数分别调用收红包的方法
one.getRedPackage(list);
        two.getRedPackage(list);
        three.getRedPackage(list);
        four.getRedPackage(list);
        //分别调用Person类的show方法查看余额
messager.show();
        one.show();
        two.show();
        three.show();
        four.show();

    }
}



这些就是我做这道题的一些思路和想法,请各位大神多多指教。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马