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中数组其实是一个对象,存的事元素的引用,通过这个来操作元素。