设计 Account1 类,包含:
■ 一个名为 id 的 int 类型的私有数据域(默认值为 0),长度为 6 位。
■ 一个名为 balance 的 double 类型的私有数据域(默认值为0)。
■ 一个名为 annualInterestRate 的 double 类型的私有数据域存储当前利率(默认值为 0)。 假设所有的账户都有相同的利率。
■ 一个名为 dateCreated 的 Date 类型的私有数据域存储账户的开户日期。
■ 一个能创建默认账户的无参构造方法。
■ 一个能创建带特定 id 和初始余额的构造方法,初始余额不能为负数。
■ id、balance 和 annualInterestRate 的访问器和修改器。
■ dateCreated 的访问器。
■ 一个名为 getMonthlyInterestRate 的方法返回月利率。
■ 一个名为 withDraw 的方法从账户提取特定金额。
■ 一个名为 deposit 的方法向账户存人特定金额。
■ double 类型的数据域保留 2 位小数。
■ 成员方法和数据域应进行基本的合理性检查。
设计测试类 ATMMachine1:
创建一个有 100 个账户的数组,其 id 为 0,1,2,…99, 并初始化收支为 1000 美元。
主菜单如下:
Main menu
1: check balance
2: withdraw
3: deposit
4: exit
根据题目要求,我们首先需要创建一个Account1类,其中包含一个名为id的int类型的私有数据域;一个名为balance的double类型的私有数据域;一个名为annualInterestRated的double类型的私有数据域;一个名为dateCreated的Date类型的数据域;一个无参构造方法和一个带特定id和余额的构造方法,设置的余额不能为负数,所以我自定义了一个异常,当余额为负数的时候,会抛出异常;其中还包含了id、balance、annualInterestRated的访问器和修改器,dateCreated的访问器,一个名为getMonthlyInterestRate的方法,用于获取月利率,一个名为 withDraw 的方法从账户提取特定金额,一个名为 deposit 的方法向账户存人特定金额。题目要求double类型的数据域保留两位小数,我这里创建BigDecimal对象,调用其中的setScale()方法使其转化为两位小数进行输出。由此我将Account1类创建完毕,然后进行测试。
测试类:
首先我创建了一个名为numList的int类型的数组,里面按顺序存放0到99的数字,其目的是为了判断用户输入的id是否在0到99中,如果在的话,则用户登录成功,否则提示用户输入一个正确的id。同时创建一个名为accounts类型为Account1的列表,里面存放id从0到99,余额为1000的Account1的对象。在这里我想的是可以进行无数次的使用的测试类,所以使用while(true)语句,用户进行输入id符合要求,进行菜单展示,用户可以输入1、2、3、4,分别进行查询余额、取款、存款和退出功能,每一个操作中,我先从列表中获取输入id对应的账户,在查询余额时,我直接通过账户中的getBalance()方法获取余额、取款时,通过账户中的withDraw()方法从余额中取出、取款时,通过账户中的deposit()方法向余额存入、退出时我设置isLogin变量为false.
相关函数:
displayMenu():展示菜单
processMenu():执行1.创建账户 2.取款 3.存款 4.退出相关的操作
withDraw():取款 deposit():存款
输入数据 id=66 存款200 取款400
预期输出 账户余额为800
实际输出
Account1类
package version1;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
/**
* @Auther: paradise
* @Date: 2021/6/24 - 06 - 24 - 15:46
*/
public class Account1 {
private int id = 0;
private double balance = 0;
private double annualInterestRate = 0;
private Date dateCreated;
/**Constructing a parameter-less construction method*/
public Account1() {
}
/**Constructing a construction method with special id and balance*/
public Account1(int id, double balance) throws InvalidBalanceException{
this.id = id;
setBalance(balance);
}
/**Return the id*/
public int getId() {
return id;
}
/**Set the id*/
public void setId(int id){
this.id = id;
}
/**Return the balance*/
public double getBalance() {
BigDecimal bigDecimal = new BigDecimal(balance).setScale(2, RoundingMode.HALF_UP);
return bigDecimal.doubleValue();
}
/**Set the balance*/
public void setBalance(double newBalance) throws InvalidBalanceException{
if (newBalance >= 0){
balance = newBalance;
}
else{
throw new InvalidBalanceException(newBalance);
}
}
/**Return the annual Interest Rate*/
public double getAnnualInterestRate() {
BigDecimal bigDecimal = new BigDecimal(annualInterestRate / 100).setScale(2, RoundingMode.HALF_UP);
return bigDecimal.doubleValue();
}
/**Set the annual interest rate*/
public void setAnnualInterestRate(double annualInterestRate) {
this.annualInterestRate = annualInterestRate;
}
/**Return the date*/
public Date getDateCreated() {
dateCreated = new Date();
return dateCreated;
}
/**Return the monthly interest rate*/
public double getMonthlyInterestRate(){
BigDecimal bigDecimal = new BigDecimal(annualInterestRate / 1200).setScale(2, RoundingMode.HALF_UP);
return bigDecimal.doubleValue();
}
/**Return the monthly interest*/
public double getMonthlyInterest()
{
return balance * getMonthlyInterestRate();
}
/**Enter the number of money you withdraw*/
public void withDraw(double withdrawalAmount) throws InvalidBalanceException {
balance -= withdrawalAmount;
}
/**Enter the number of money you deposit*/
public void deposit(double depositAmount) throws InvalidBalanceException {
balance += depositAmount;
}
}
InvalidBalanceException类
package version1;
/**
* @Auther: paradise
* @Date: 2021/6/24 - 06 - 24 - 15:47
*/
public class InvalidBalanceException extends Exception{
private double balance;
/**Construct an exception*/
public InvalidBalanceException(double balance){
super("Invalid balance " + balance);
this.balance = balance;
}
public double getBalance(){
return balance;
}
}
ATMMachine1类
package version1;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @Auther: paradise
* @Date: 2021/6/24 - 06 - 24 - 15:48
*/
public class ATMMachine1 {
private static Scanner scanner;
private static boolean isLogin = false;
private static ArrayList<Account1> accounts = new ArrayList<Account1>();
/**Display the menu*/
public static void displayMenu(){
System.out.print("\nMain menu\n" + "1: check balance\n" + "2: withdraw\n" + "3: deposit\n" + "4: exit\n");
System.out.print("Enter a choice: ");
}
/**Display the process menu*/
public static void processMenu(int id, int command) throws InvalidBalanceException {
switch (command) {
case 1:
System.out.print("The balance is " + accounts.get(id).getBalance() + "\n" );
break;
case 2:
System.out.print("Enter an amount to withdraw: ");
double withdrawMoney = scanner.nextDouble();
accounts.get(id).withDraw(withdrawMoney);
break;
case 3:
System.out.print("Enter an amount to deposit:" );
double depositMoney = scanner.nextDouble();
accounts.get(id).deposit(depositMoney);
break;
case 4:
isLogin = false;
break;
default:
System.out.println("please enter a right command:");
break;
}
}
//这是一个main方法,是程序的入口
public static void main(String[] args) throws InvalidBalanceException {
int[] numList = new int[100];
for(int i = 0; i < numList.length; i++){
numList[i] = i;
}
for(int i = 0; i < numList.length; i++){
Account1 account = new Account1(i, 1000);
accounts.add(account);
}
while (true) {
System.out.print("Enter an id: ");
Scanner input = new Scanner(System.in);
int id = input.nextInt();
for (int num : numList) {
if (id == num) {
isLogin = true;
}
}
if (!isLogin) {
System.out.println("Please enter a correct id: ");
}
while (isLogin) {
displayMenu();
scanner = new Scanner(System.in);
int command = scanner.nextInt();
processMenu(id, command);
}
}
}
}