用Java对C++程序进行改写过程中的心得体会

C++源码:https://pan.baidu.com/s/1AU9kRFCW5TMwO3gkTPQ_tA
提取码:moex

Date类

public class Date
{
    private int year,month,day,totalDays;
    private final int[] DAYS_BEFORE_MONTH={0,31,59,90,120,151,181,212,243,273,304,334,365};
    public Date(int year,int month,int day)
    {
        this.year=year;
        this.month=month;
        this.day=day;
        if(day<=0||day>getMaxDay())
        {
            System.out.print("Invalid date:");
            show();
            System.out.println("");
            System.exit(1);
        }
        int years=year-1;
        totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTH[month-1]+day;
        if(isLeapYear()&&month>2)
            totalDays++;
    }

    public final int getMaxDay()
    {
        if(isLeapYear() && month==2)
            return 29;
        else
            return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
    }

    public final void show()
    {
        System.out.print(getYear()+"-"+getMonth()+"-"+getDay());
    }

    public final int getYear()
    {
        return year;
    }

    public final int getMonth()
    {
        return month;
    }

    public final int getDay()
    {
        return day;
    }

    public final boolean isLeapYear()
    {
        return year%4==0&&year%100!=0||year%400==0;
    }

    public final int distance(final Date date)
    {
        return totalDays-date.totalDays;
    }
}

Accumulator类

public class Accumulator
{
    private Date lastDate;
    private double value;
    private double sum;
    public Accumulator(final Date date, double value)
    {
        lastDate=date;
        this.value=value;
        sum=0;
    }

    public final double getSum(final Date date)
    {
        return sum+value * date.distance(lastDate);
    }
    public void change(final Date date, double value)
    {
        sum = getSum(date);
        lastDate = date;
        this.value = value;
    }

    public void reset(final Date date, double value)
    {
        lastDate = date;
        this.value = value;
        sum = 0;
    }
}

Account类

import java.text.DecimalFormat;
abstract class Account
 {
    private String id;
    private double balance;
    private static double total = 0;

    protected Account(final Date date, final String id) 
    {
        this.id = id;
        balance = 0;
        date.show();
        System.out.println("\t#" + id + " created");
    }

    protected final void error(final String msg)
    {
        System.out.println("Error(#" + id + "):" + msg);
    }

    protected void record(final Date date, double amount, final String desc){
        amount = Math.floor(amount * 100 + 0.5) / 100;
        total += amount;
        balance += amount;
        date.show();
        System.out.println("\t#" + id + "\t" + amount + "\t" + balance + "\t" + desc);
    }

    public final String getId() {
        return id;
    }

    public final double getBalance() { return balance;}

    public static double getTotal() {
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println(df.format(total));
        return total;
    }

    abstract public void deposit(final Date date, double amount, final String desc);

    abstract public void withdraw(final Date date, double amount, final String desc);

    abstract public void settle(final Date date);

    public void show()
    {
        System.out.print(id + "\tBalance: " + balance);
    }
}

SavingAccount类

class SavingAccount extends Account
{
    private Accumulator acc;
    private double rate;
    public SavingAccount(final Date date,final String id,double rate)
    {
        super(date,id);
        this.rate=rate;
        acc=new Accumulator(date,0);
    }

    public final double getRate()
    {
        return rate;
    }

    public void deposit(final Date date,double amount,final String desc)
    {
        record(date,amount,desc);
        acc.change(date, getBalance());
    }

    public void withdraw(final Date date,double amount,final String desc)
    {
        if(amount>getBalance())
            System.out.println("not enough money");
        else
            {
                record(date,-amount,desc);
                acc.change(date, getBalance());
            }
    }

    public void settle(final Date date)
    {
        if(date.getMonth()==1)
        {
            double interest=acc.getSum(date)*rate/date.distance(new Date(date.getYear()-1,1,1));
            if(interest!=0)
                record(date,interest,"interest");
            acc.reset(date,getBalance());
        }
    }
}~

Credit Account类

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
class CreditAccount extends Account
{
    private Accumulator acc;
    private double credit;
    private double rate;
    private double fee;
    private final double getDebt()
    {
        double balance=getBalance();
        return (balance<0?balance:0);
    }

    public CreditAccount(final Date date,final String id,double credit,double rate,double fee)
    {
        super(date,id);
        this.credit=credit;
        this.rate=rate;
        this.fee=fee;
        acc=new Accumulator(date,0);
    }

    public final double getCredit()
    {
        return credit;
    }

    public final double getRate()
    {
        return rate;
    }

    public final double getFee()
    {
        return fee;
    }

    public final double getAvailableCredit()
    {
        if(getBalance()<0)
            return credit+getBalance();
        else
            return credit;
    }

    public void deposit(final Date date,double amount,final String desc)
    {
        record(date,amount,desc);
        acc.change(date, getDebt());
    }

    public void withdraw(final Date date,double amount,final String desc)
    {
        if(amount-getBalance()>credit)
            error("not enough credit");
        else
            {
                record(date,-amount,desc);
                acc.change(date, getDebt());
            }
    }

    public void settle(final Date date)
    {
        double interest=acc.getSum(date)*rate;
        if(interest!=0)
            record(date,interest,"interest");
        if(date.getMonth()==1)
            record(date,-fee,"annual fee");
        acc.reset(date, getDebt());
    }

    public final void show()
    {
        super.show();
        System.out.print("\tAvailable credit: "+getAvailableCredit());
    }

    public static void main(String args[])throws IOException
    {

        Date date=new Date(2008,11,1);
        ArrayList<Account> accounts=new ArrayList<Account>(0);
        System.out.println("(a)add account(d)deposit (w)withdraw (s)show (c)change day (n) next month (e) exit");
        char cmd;
        Scanner s = new Scanner(System.in);
        do {
            date.show();
            System.out.print("\tTotal:" + getTotal() + "\tcommand");
            char type;
            int index, day;
            double amount, credit, rate, fee;
            String id, desc;
            Account account;
            //String ss = s.next();
            cmd = s.next().charAt(0);  //cmd=ss.charAt(0);
            switch (cmd) {
                case 'a'://增加账户
                    type = s.next().charAt(0);
                    id = s.next();
                    if (type == 's') {
                        rate = s.nextDouble();
                        account = new SavingAccount(date, id, rate);
                    } else {
                        credit = s.nextDouble();
                        rate = s.nextDouble();
                        fee = s.nextDouble();
                        account = new CreditAccount(date, id, credit, rate, fee);
                    }
                    accounts.add(account);
                    accounts.trimToSize();
                    break;

                case 'd':
                    index = s.nextInt();
                    amount = s.nextDouble();
                    desc = s.nextLine();
                    accounts.get(index).deposit(date, amount, desc);
                    break;

                case 'w':
                    index = s.nextInt();
                    amount = s.nextDouble();
                    desc = s.nextLine();
                    accounts.get(index).withdraw(date, amount, desc);
                    break;

                case 's':
                    for (int i = 0; i < accounts.size(); i++) {
                        System.out.print("[" + i + "]");
                        accounts.get(i).show();
                        System.out.println("");
                    }
                    break;

                case 'c':
                    day = s.nextInt();
                    if (day < date.getDay())
                        System.out.print("You cannot specify a previous day");
                    else if (day > date.getMaxDay())
                        System.out.print("Invalid day");
                    else
                        date = new Date(date.getYear(), date.getMonth(), day);
                    break;

                case 'n':
                    if (date.getMonth() == 12)
                        date = new Date(date.getYear() + 1, 1, 1);
                    else
                        date = new Date(date.getYear(), date.getMonth() + 1, 1);
                    for (int i = 0; i < accounts.size(); i++)
                    {
                        accounts.get(i).settle(date);
                    }
                    break;
            }
        }
        while (cmd != 'e') ;
        for (int i = 0; i < accounts.size(); i++)
            accounts.remove(i);
    }
}~
* 对比 C++与Java发现的一些区别*

1.运算符重载

 public final int distance(final Date date)
    {
        return totalDays-date.totalDays;
    }
}

C++源码中对"-"进行了重载,但在Java中摒弃了运算符重载这种做法,这使得Java语言更轻便,简洁。

2.回收机制
C++中需要使用析构函数而Java中会自动进行垃圾回收,这省去了许多麻烦。

3.Java中可谓万物皆对象,这一点与C++有很大区别。

4.Java中没有头文件,但是可以用关键字import导入包,Python也是类似这样。

5.C++里可以有.h文件等,通过头文件的方式进行调用,Java文件则是包内,包之间的调用。

6.输入方面,Java通过扫描器类Scanner中的方法,next(),nextInt(),nextDouble()…但要注意,Scanner中没有nextchar()方法,若要读取一个字符,可采用(举一例):

Scanner s = new Scanner(System.in);
char ss=s.next().charAt(0);

7.Java没有指针。

8.Java里输出语句结束会自动换行(System.out.print除了这个)。

9.数组。C++中数组就是直接申请一块连续的空间,而Java中数组其实是一个对象,存的事元素的引用,通过这个来操作元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值