2016.4.20【i码邦】每日一练——对象和类

编程实现:下图问题。  不限形式,不限格局,百花齐放才是编程的春天!!


tu0420.jpg



我们只直播每日一练的编程实战,动手才是王道!
每日一练直播群号:476036218
 

QQ截图20160406102536.png

 

--来自网页客户端
已邀请:

未探索的星球 - まあ、どうせ俺は醜いものだろう

赞同来自: lanlan2501

可能可以改进的地方:
  1.使用反射的方式来完成 set 方法完成的操作,使得不用暴露 set 方法?
  2.使用Map,可以直接通过 Id 来获得对象,而不是使用循环来获取
  。。。。
留下的疑问:
  1.单例模式产生的对象,在其它类中作为私有类对象初始化能否改进? (有什么方法能让它不重复初始化,虽然只有一个对象)
  2.对于 Bank、Acount、Depositor是否有更好的设计模式
  3.对于 不愿暴露的 set 方法,可否屏蔽。或者用反射的方式在其它方法中赋值会不会更好

--来自网页客户端

a513470086 - G i码邦(爱码邦) --没理由!

赞同来自: admin 刀郎

不完整也发发。求指正。

package i码邦;

public class MyRank {
    private String number;   //帐号
    private String name;     //姓名
    private String address;  //地址
    private long money;      //余额
    private double rate;     //利率

    //不带参数的构造方法
    public MyRank() {
        this(null, null, null, 0, 0.0);
    }

    //带参数的构造方法
    public MyRank(String number, String name, String address, long money, double rate) {
        this.number = number;
        this.name = name;
        this.address = address;
        this.money = money;
        this.rate = rate;
    }

    //存款
    public void addMoney(long money) {
        this.money += money;
    }

    //取款
    public void getMoney(long money) {
        this.money -= money;
    }

    //查询余额
    public long selectMoney() {
        return this.money;
    }

    //利息
    public double getAccrual() {
        return this.money * this.rate;
    }

    //取得帐号
    public String getNumber() {
        return number;
    }

    //设置帐号
    public void setNumber(String number) {
        this.number = number;
    }

    //取得名字
    public String getName() {
        return name;
    }


    //设置名字
    public void setName(String name) {
        this.name = name;
    }

    //取得地址
    public String getAddress() {
        return address;
    }

    //设置地址
    public void setAddress(String address) {
        this.address = address;
    }

    //取得利率
    public double getRate() {
        return rate;
    }

    //设置利率
    public void setRate(double rate) {
        this.rate = rate;
    }


    public static void main(String[] args) {
        MyRank rank = new MyRank("2016", "左岸", "黄石", 0, 0.05);

        System.out.println("帐号为:" + rank.getNumber());
        System.out.println("名字为:" + rank.getName());
        System.out.println("地址为:" + rank.getAddress());
        System.out.println("余额为:" + rank.selectMoney());
        System.out.println("利率为:" + rank.getRate());
        System.out.println("利息为:" + rank.getAccrual());

        //存进1000元
        rank.addMoney(10000);
        System.out.println("————————存款后结果如下————————");
        System.out.println("余额为:" + rank.selectMoney());
        System.out.println("利率为:" + rank.getRate());
        System.out.println("利息为:" + rank.getAccrual());
        
        
        rank.addMoney(8000);
        System.out.println("————————存款后结果如下————————");
        System.out.println("余额为:" + rank.selectMoney());
        System.out.println("利率为:" + rank.getRate());
        System.out.println("利息为:" + rank.getAccrual());


        //取出500元
        rank.getMoney(0);
        System.out.println("————————取款后结果如下————————");
        System.out.println("余额为:" + rank.selectMoney());
        System.out.println("利率为:" + rank.getRate());
        System.out.println("利息为:" + rank.getAccrual());

        //修改利率
        rank.setRate(0.15);
        System.out.println("————————修改利率后结果如下——————");
        System.out.println("余额为:" + rank.selectMoney());
        System.out.println("利率为:" + rank.getRate());
        System.out.println("利息为:" + rank.getAccrual());

    }

}

==============================================================

帐号为:2016
名字为:左岸
地址为:黄石
余额为:0
利率为:0.05
利息为:0.0
————————存款后结果如下————————
余额为:10000
利率为:0.05
利息为:500.0
————————存款后结果如下————————
余额为:18000
利率为:0.05
利息为:900.0
————————取款后结果如下————————
余额为:18000
利率为:0.05
利息为:900.0
————————修改利率后结果如下——————
余额为:18000
利率为:0.15
利息为:2700.0

--来自网页客户端

fengyun12

赞同来自: admin 易米八五 小茗樣

public class EveryDayEx {


/**
* 每日一练 20160420
* 设计一个银行账户类
* 属性:账号,姓名,存款余额,年利率
* 方法:存款,取款,查询余额
*/public static void main(String[] args) {
System.out.println("第一年创建账号,并存入10000元");
BankAccount zs=new BankAccount("ba001", "张三", 10000);
zs.checkMoney();
System.out.println("第二年存入5000元");
zs.toNextYear();
zs.insertMoney(5000);
zs.checkMoney();
System.out.println("第三年取出8000元");
zs.toNextYear();
zs.getMoney(8000);
zs.checkMoney();
System.out.println("第四年");
zs.toNextYear();
zs.checkMoney();
System.out.println("第五年");
zs.toNextYear();
zs.checkMoney();

}
}

/**
* @description 每日一练 20160420
* @author lsf
* @date 20160429
*/
class BankAccount{
String account; //账号
String userName; //姓名
double balance; //余额
static double annualInterest=0.05; //利率
/**
* @description 构造函数
* @param account 账号
* @param userName 姓名
* @param balance 余额
*/
public BankAccount(String account,String userName,double balance){
this.account=account;
this.userName=userName;
this.balance=balance;
}
/**
* 取款
*/
public void getMoney(double money){
if(money>0){
this.balance-=money;
}
else{
System.out.println("取出银行的钱必须大于零");
}

}
/**
* 存款
*/
public void insertMoney(double money){
if(money>0){
this.balance+=money;
}
else{
System.out.println("存入银行的钱必须大于零");
}
}
/**
* 过去一年
*/
public void toNextYear(){
this.balance=this.balance*(1+annualInterest);
}
/**
* 查询余额
*/
public void checkMoney(){
System.out.println("账号:"+this.account);
System.out.println("所属人姓名:"+this.userName);
System.out.println("账户余额:"+this.balance);
System.out.println("银行年利率:"+annualInterest);
}
}

--来自移动客户端

未探索的星球 - まあ、どうせ俺は醜いものだろう

赞同来自: 燕燕

// 呼。。。写了1个小时
// 具体还有很多不完善的,不是完全按照题目来 确实有点恶心
// 可以修改的地方:
// 存钱现使用 set 方法来模拟, 其实不能暴露 set 方法。。。 得另想办法(我笨还没想出来)
// 时间的变化现使用 方法加参数的方法来模拟, 实际操作应该是 任务调度方法?
// 每个储户可以拥有多个账户。。。未完成
// 还有很多很多可以修改的地方,不过至少写出来了
// 可以参照如下代码
 
import java.text.NumberFormat;
import java.util.ArrayList;

public class Test0420 {
    // 设计一个类实现银行账户的概念
    // 包括的变量有“账户”、“姓名”、“存款余额”和一个类变量“年利率”
    // 包括的方法有“存款”、“取款”和“查询余额”
    // 定义一个主类的对象,并完成相应的操作。(年利率初始化为 5%)
    //
    // 张三:
    //        第一年存了10000元
    //        第二年存了5000元
    //        第三年取出8000元
    // 问:
    //         第五年张三的账上有多少余额
    // 
    // 李四:
    //        第一年存了8000元
    //        第二年存了8000元
    //        第三年取出5000元    
    // 问:
    //        第五年李四的账上有多少余额

    /**
     * 程序分析:
     *     1. 储户类拥有账户, 储户可以完成 存款、 取款操作
     *  2. 账户类拥有账户编号、余额、年利率
     *  2.1银行类拥有所有人的账户
     *  3. 年利率类拥有年利率
     *  4. 银行类可以完成 每年余额变化的操作(根据账号和当前余额来操作)
     *  4.1 则需要根据账号来获得账户余额,即为获得账户类对象
     *  4.2 默认银行只有一个,使用单例模式
     * @param args
     */

    public static void main(String[] args) {
        // 我们需要一个银行
        Bank bank = Bank.getInstance();

        // 抽象一个时间变化类(实际操作时会使用调度任务?)
        TimeSkip ts = new TimeSkip();
        
        Depositor depositor1 = new Depositor("张三", new Acount(bank, 0));
        System.out.println("张三的账户:");
        System.out.println("\t原有账户: \n\t " + depositor1.getAcount());
        depositor1.depositMoney(10000);
        System.out.println("\t第一年存入10000: \n\t " + depositor1.getAcount());
        ts.passyearToChangeBalance(depositor1.getAcount().getId(), 1);
        System.out.println("\t过了一年(第二年): \n\t " + depositor1.getAcount());
        depositor1.depositMoney(5000);
        System.out.println("\t第二年存入5000: \n\t " + depositor1.getAcount());
        ts.passyearToChangeBalance(depositor1.getAcount().getId(), 1);
        System.out.println("\t过了一年(第三年): \n\t " + depositor1.getAcount());
        depositor1.drawMoney(8000);
        System.out.println("\t第三年取出8000: \n\t " + depositor1.getAcount());
        ts.passyearToChangeBalance(depositor1.getAcount().getId(), 2);
        System.out.println("\t过了两年(第五年): \n\t " + depositor1.getAcount());

    }
}

/**
 * 储户类
 * 拥有:
 *  名字
 *     账户
 *  存钱方法
 *  取钱方法
 * @author Zbmrs
 *
 */
class Depositor {
    private String name;
    private Acount acount;

    public Depositor(String name, Acount acount) {
        super();
        this.name = name;
        this.acount = acount;
    }
    
    public void depositMoney(long money){
        acount.setBalance(acount.getBalance() + money);
    }
    
    public void drawMoney(long money) {
        if(money > acount.getBalance()){
            System.out.println("无此金额");
            return;
        }
        acount.setBalance(acount.getBalance() - money);
    }
    

    public String getName() {
        return name;
    }

    public Acount getAcount() {
        return acount;
    }

}

/**
 * 账户类
 * 拥有:
 *     账户Id
 *  账户余额
 *  年利率
 * @author Zbmrs
 *
 */
class Acount {
    private long id;
    private double balance;
    private APRannual apr;
    
    private Bank bank = Bank.getInstance();
    private static long next = 100000;

    /**
     * 可以在新开账户时存入金额
     * 
     * @param balance
     */
    public Acount(Bank bank, double balance) {
        this.id = next++;
        this.balance = balance;
        this.apr = new APRannual(0.05);
        bank.addAcount(this);
    }
    

    public double getBalance() {
        return balance;
    }
    
    public void setBalance(double balance){
        this.balance = balance;
    }

    public long getId() {
        return id;
    }

    public APRannual getAPRannual() {
        return apr;
    }

    @Override
    public String toString() {
        
        //需要格式化金额,使其不产生很多位小数
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        return "Acount [id=" + id + ", balance=" + nf.format(balance) + ", apr=" + apr.getRate() + "]";
    }
}

/**
 * 年利率类
 * @author Zbmrs
 *
 */
class APRannual {
    private double rate;

    public APRannual(double rate) {
        this.rate = rate;
    }

    public double getRate() {
        return rate;
    }
}

/**
 * 银行类
 * 1.  拥有所有的账户信息
 * 1.1 因此需要一个根据Id获得账户的方法
 * 1.2 因此需要一个添加账户的方法
 * 2.  限制问题
 * 2.1 只有一个,因此使用单例模式
 * 2.2 懒汉式单例,可能有线程安全问题,因此使用同步锁
 */
class Bank {
    private static Bank bank;
    private ArrayList<Acount> acounts = new ArrayList<>();

    private Bank() {
    }

    public static synchronized Bank getInstance() {
        if (bank == null) {
            bank = new Bank();
        }
        return bank;
    }

    public void changeBalanceForRate(long id, int year) {
        Acount acount = getAcountForId(id);
        Double currentRate = acount.getAPRannual().getRate();
        if(year > 0){
            while(year != 0){
                acount.setBalance((currentRate + 1) * acount.getBalance());
                year--;
            }
        }
    }

    public void addAcount(Acount acount) {
        acounts.add(acount);
    }

    private Acount getAcountForId(long id) {
        for (int i = 0; i < acounts.size(); i++) {
            Acount acountTemp = acounts.get(i);
            if (acountTemp.getId() == id) {
                return acountTemp;
            }
        }
        return null;
    }
}

/**
 * 模拟时间变更
 * @author Zbmrs
 *
 */
class TimeSkip {    
    private static Bank bank =  Bank.getInstance();
    public void passyearToChangeBalance(long id, int year){
        bank.changeBalanceForRate(id, year);
    }
}


0420.png


 

--来自网页客户端

admin

赞同来自:

这个每日一练确实不简单,学到这里的同学可以做做,不要偷懒,偷懒是学不好的!
 
有人出题,这是多么好的学习机会。。向球球同学学习,大家都能成为编程达人!

--来自网页客户端

Cyx294176957

赞同来自:

image.png

image.png

image.png


--来自移动客户端

xiedaima001 - 一切的现在都是最好的安排!

赞同来自: admin

为大神们点赞

--来自移动客户端

要回复问题请先登录注册

Template error, template file not found