第三次BLOG

1)前言:

后面几次作业都综合性比较高,目的是把学的知识都串联起来起来。

第七次作业两道题都是图形卡片分组游戏,只是第二道题增加了些内容,在于考察类设计的合理性和独立性,内容和题量都还好,难度也不大。

 

 

 第八次和第九次两道题也是一样的只是第九次作业执行加了些内容,都是ATM类结构设计,题量比第七次大,在设计类时考虑的东西比较多。

 

 

 

 

 

 

(2)设计与分析:

①题目集7(7-1)、(7-2)两道题目的递进式设计分析总结

题目7(7-1)

对代码生成类图的简要分析: 

可以在类图中看到Shape的子类包括Circle、Triangle、Rectangle、Trapezoid一共四个子类。

card对象用来储存shape的几种子类,而DealCardList用Arraylist来储存Card对象,形成card的对象数组。

具体的思路就是,将输入的数字转化成形状存入Card的对象数组中,将出入的各个形状的相应数据(如边长,半径等),再利用每一个形状中的方法来计算面积和周长。

源代码如下:

import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {
//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner input = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = input.nextInt();
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = input.nextInt();
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
input.close();
for(int xx=0;xx<100;) {
xx++;
}
}
}
class DealCardList{
ArrayList<Card> cardList=new ArrayList<>();
DealCardList(){}
DealCardList(ArrayList<Integer> card){
for(Integer integer : card) {
for(int xx=0;xx<100;) {
xx++;
}
if(integer==0)
break;
switch(integer) {
case 1:
Card card1=new Card(new Circle(Main.input.nextDouble()));
card1.getShape().setShapeName("Circle");
cardList.add(card1);
break;
case 2:
Card card2=new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
card2.getShape().setShapeName("Rectangle");
cardList.add(card2);
break;
case 3:
Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
card3.getShape().setShapeName("Triangle");
cardList.add(card3);
break;
case 4:
Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
card4.getShape().setShapeName("Trapezoid");
cardList.add(card4);
break;
}
}
}
public boolean validate(){
boolean ret=true;
for(Card card:cardList) {
if (!card.getShape().validate()){
ret=false;
break;
}
}
return ret;
}
public void cardSort() {
TreeSet<Card> cards = new TreeSet<>(cardList);
for (Card card : cards) {
System.out.print(card.getShape());
}
}
public double getAllArea(){
double sum=0;
for(int xx=0;xx<100;) {
xx++;
}
for (Card card : cardList) {
sum+=card.getShape().getArea();
}
return sum;
}
public void showResult(){
System.out.println("The original list:");
for (Card card : cardList) {
System.out.print(card.getShape());
}
System.out.println();
System.out.println("The sorted list:");
cardSort();
System.out.println();
System.out.printf("Sum of area:%.2f\n",getAllArea());
}
}
class Card implements Comparable<Card>{
private Shape shape;

public Card() {
}

public Card(Shape shape) {
this.shape = shape;
}

public Shape getShape() {
return shape;
}

public void setShape(Shape shape) {
this.shape = shape;
}

@Override
public int compareTo(Card card) {
for(int xx=0;xx<100;) {
xx++;
}
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape{
private String shapeName;

public Shape() {
}

public Shape(String shapeName) {
this.shapeName = shapeName;
}

public String getShapeName() {
return shapeName;
}

public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public abstract double getArea();
public abstract boolean validate();

@Override
public String toString() {
for(int xx=0;xx<100;) {
xx++;
}
return getShapeName()+":"+String.format("%.2f ",getArea());
}
}

class Circle extends Shape{
private double radius;

public Circle() {
}

public Circle(double radius) {
this.radius = radius;
}

public double getRadius() {
return radius;
}

public void setRadius(double radius) {
this.radius = radius;
}

@Override
public double getArea() {
return Math.PI*radius*radius;
}

@Override
public boolean validate() {
return this.radius>0;
}
}

class Rectangle extends Shape{
private double width,height;

public Rectangle() {
}

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

public double getWidth() {
return width;
}

public void setWidth(double width) {
this.width = width;
}

public double getHeight() {
return height;
}

public void setHeight(double height) {
this.height = height;
}

@Override
public double getArea() {
return height*width;
}

@Override
public boolean validate() {
return width>0&&height>0;
}
}

class Triangle extends Shape{
private double side1,side2,side3;

public Triangle() {
}

public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}

@Override
public double getArea() {
double p=(side1+side2+side3)/2;
return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
}

@Override
public boolean validate() {
boolean ret=true;
if (!(side1>0&&side3>0&&side2>0))ret=false;
else{
if (!(side1+side2>side3&&side1+side3>side2&&side2+side3>side1))ret=false;
}
return ret;
}
}

class Trapezoid extends Shape{
private double topSide,bottomSide,height;

public Trapezoid() {
}

public Trapezoid(double topSide, double bottomSide, double height) {
this.topSide = topSide;
this.bottomSide = bottomSide;
this.height = height;
}

@Override
public double getArea() {
return (topSide+bottomSide)*height/2;
}

@Override
public boolean validate() {
return topSide>0&&height>0&&bottomSide>0;
}
}

题目7(7-2)

 

 

 

可以从这张类图上看得到,总体上与上一题目没有多大的改变,只是在有一些算法的设计上与原来的有一些区别,具体是在输出的时候,要将Rectangle、Triangle、Circle和Trapezoid这几种形状按类型排号,而且还要注意要将输出的每个形状的面积按照大小顺序排序,其实说实话也没又加上多少的难度,可以理解为老师是为了锻炼我们对代码理解的能力。这些额外的加上去的东西就是我们在算法上要考虑的问题,在设计上考虑代码的排版问题。 

源代码如下:

import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {
//在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
//使用Main.input.next…即可(避免采坑)
public static Scanner input = new Scanner(System.in);
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
int num = input.nextInt();
while(num != 0){
if(num < 0 || num > 4){
System.out.println("Wrong Format");
System.exit(0);
}
list.add(num);
num = input.nextInt();
}
DealCardList dealCardList = new DealCardList(list);
if(!dealCardList.validate()){
System.out.println("Wrong Format");
System.exit(0);
}
dealCardList.showResult();
input.close();
for(int xx=0;xx<100;) {
xx++;
}
}
}
class DealCardList{
ArrayList<Card> cardList=new ArrayList<>();
ArrayList<Card> CircleList=new ArrayList<>();
ArrayList<Card> RectangleList=new ArrayList<>();
ArrayList<Card> TriangleList=new ArrayList<>();
ArrayList<Card> TrapezoidList=new ArrayList<>();
DealCardList(){}
DealCardList(ArrayList<Integer> card){
for(Integer integer : card) {
for(int xx=0;xx<100;) {
xx++;
}
if(integer==0)
break;
switch(integer) {
case 1:
Card card1=new Card(new Circle(Main.input.nextDouble()));
card1.getShape().setShapeName("Circle");
cardList.add(card1);
break;
case 2:
Card card2=new Card(new Rectangle(Main.input.nextDouble(),Main.input.nextDouble()));
card2.getShape().setShapeName("Rectangle");
cardList.add(card2);
break;
case 3:
Card card3=new Card(new Triangle(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
card3.getShape().setShapeName("Triangle");
cardList.add(card3);
break;
case 4:
Card card4=new Card(new Trapezoid(Main.input.nextDouble(),Main.input.nextDouble(),Main.input.nextDouble()));
card4.getShape().setShapeName("Trapezoid");
cardList.add(card4);
break;
}
}
}
public boolean validate(){
boolean ret=true;
for(Card card:cardList) {
if (!card.getShape().validate()){
ret=false;
break;
}
}
return ret;
}
public void cardSort(ArrayList<Card> cardList) {
TreeSet<Card> cards = new TreeSet<>(cardList);
System.out.print("[");
for (Card card : cards) {
System.out.print(card.getShape());
}
System.out.print("]");
}
public double getMaxArea(ArrayList<Card> a,ArrayList<Card> b,ArrayList<Card> c,ArrayList<Card> d){
double sum1=0,sum2=0;
for (Card card : a) {
sum1+=card.getShape().getArea();
}
for (Card card : b) {
sum2+=card.getShape().getArea();
}
if(sum2>sum1)
sum1=sum2;
for (Card card : c) {
sum2+=card.getShape().getArea();
}
if(sum2>sum1)
sum1=sum2;
for (Card card : d) {
sum2+=card.getShape().getArea();
}
if(sum2>sum1)
sum1=sum2;
return sum1;
}
public void show(ArrayList<Card> cardList) {
System.out.print("[");
for (Card card : cardList) {
System.out.print(card.getShape());
}
System.out.print("]");
}
public void showResult(){
System.out.println("The original list:");
show(cardList);
System.out.println();
fenzu();
System.out.println("The Separated List:");
//输出圆分组
show(CircleList);
//输出矩形分组
show(RectangleList);
//输出三角分组
show(TriangleList);
//输出梯形分组
show(TrapezoidList);
System.out.println();
System.out.println("The Separated sorted List:");
cardSort(CircleList);
cardSort(RectangleList);
cardSort(TriangleList);
cardSort(TrapezoidList);

System.out.println();
System.out.printf("The max area:%.2f",getMaxArea(CircleList,RectangleList,TriangleList,TrapezoidList));
}
public void fenzu() {
for(Card card:cardList) {
if(card.getShape().getShapeName().equals("Circle"))
CircleList.add(card);
if(card.getShape().getShapeName().equals("Rectangle"))
RectangleList.add(card);
if(card.getShape().getShapeName().equals("Triangle"))
TriangleList.add(card);
if(card.getShape().getShapeName().equals("Trapezoid"))
TrapezoidList.add(card);
}
}
}
class Card implements Comparable<Card>{
private Shape shape;

public Card() {
}

public Card(Shape shape) {
this.shape = shape;
}

public Shape getShape() {
return shape;
}

public void setShape(Shape shape) {
this.shape = shape;
}

@Override
public int compareTo(Card card) {
for(int xx=0;xx<100;) {
xx++;
}
return -(int)(shape.getArea()-card.getShape().getArea());
}
}
abstract class Shape{
private String shapeName;

public Shape() {
}

public Shape(String shapeName) {
this.shapeName = shapeName;
}

public String getShapeName() {
return shapeName;
}

public void setShapeName(String shapeName) {
this.shapeName = shapeName;
}
public abstract double getArea();
public abstract boolean validate();

@Override
public String toString() {
for(int xx=0;xx<100;) {
xx++;
}
return getShapeName()+":"+String.format("%.2f ",getArea());
}
}

class Circle extends Shape{
private double radius;

public Circle() {
}

public Circle(double radius) {
this.radius = radius;
}

public double getRadius() {
return radius;
}

public void setRadius(double radius) {
this.radius = radius;
}

@Override
public double getArea() {
return Math.PI*radius*radius;
}

@Override
public boolean validate() {
return this.radius>0;
}
}

class Rectangle extends Shape{
private double width,height;

public Rectangle() {
}

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

public double getWidth() {
return width;
}

public void setWidth(double width) {
this.width = width;
}

public double getHeight() {
return height;
}

public void setHeight(double height) {
this.height = height;
}

@Override
public double getArea() {
return height*width;
}

@Override
public boolean validate() {
return width>0&&height>0;
}
}

class Triangle extends Shape{
private double side1,side2,side3;

public Triangle() {
}

public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}

@Override
public double getArea() {
double p=(side1+side2+side3)/2;
return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
}

@Override
public boolean validate() {
boolean ret=true;
if (!(side1>0&&side3>0&&side2>0))ret=false;
else{
if (!(side1+side2>side3&&side1+side3>side2&&side2+side3>side1))ret=false;
}
return ret;
}
}

class Trapezoid extends Shape{
private double topSide,bottomSide,height;

public Trapezoid() {
}

public Trapezoid(double topSide, double bottomSide, double height) {
this.topSide = topSide;
this.bottomSide = bottomSide;
this.height = height;
}

@Override
public double getArea() {
return (topSide+bottomSide)*height/2;
}

@Override
public boolean validate() {
return topSide>0&&height>0&&bottomSide>0;
}
}

②题目集8和题目集9两道ATM机仿真题目的设计思路分析总结

题目集8

 

 

 

 一定要坚持独立性原则,一个事物一个类,不然要对代码进行优化的时候会很艰难。

如上类图内容包括ATM继承并且关联Agent类,然后Agent关联Bank类最后用main类将ATM类,Agent类,User类Account类,Bank类集合起来处理。

可能类中还有一些关系没有表示出来,可能是因为生成类图工具的原因

源代码如下:

import java.util.Scanner;
import java.util.ArrayList;

//Bank类
class Bank {
private String bankname;
private ArrayList<String> ATMList;
//创建无参构造方法
public Bank(){
}
//创建带参构造方法
public Bank(String bankname,ArrayList<String> ATMList)
{
this.bankname=bankname;
this.ATMList=ATMList;
}
//getter
public String getBankname() {
return bankname;
}
public ArrayList<String> getATMList() {
return ATMList;
}
//setter
public void setBankname(String bankname){
this.bankname=bankname;
}
public void setATMList(ArrayList<String> tATMList){
this.ATMList=ATMList;
}
}
//Account类
class Account {
private String name;
private String account;
private String password;
private double balance;
Bank bank;
private ArrayList<String> cardList;
//创建无参构造方法
public Account(){
}
//创建带参构造方法
public Account(String name,String account,String password,double balance,Bank bank,ArrayList<String> cardList){
this.name=name;
this.account=account;
this.password=password;
this.balance=balance;
this.bank=bank;
this.cardList=cardList;
}
//getter
public String getName() {
return name;
}
public String getAccount() {
return account;
}
public String getPassword() {
return password;
}
public double getBalance() {
return balance;
}
public ArrayList<String> getCardList() {
return cardList;
}
//setter
public void setName(String name) {
this.name = name;
}
public void setAccount(String account) {
this.account = account;
}
public void setPassword(String password) {
this.password = password;
}
public void setBalance(double balance) {
this.balance = balance;
}
public void setCardList(ArrayList<String> cardList) {
this.cardList = cardList;
}
}
class Check{
String card;
String passport;
String ATMId;
double digit;
ArrayList<Account> accountList;
int flag=0;
int i,j,k;
boolean z=true;
public Check(ArrayList<Account> accountList,String card,String passport,String ATMId,double digit){
this.ATMId=ATMId;
this.card=card;
this.digit=digit;
this.passport=passport;
this.accountList=accountList;
}
public Check(ArrayList<Account> accountList,String card){
this.card=card;
this.accountList=accountList;
}
void AllCheck() {
//验证输入卡号是否存在
for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j))) {
flag = 1;
k = i;
}
}
}
if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
flag = 0;
//验证输入ATM号是否存在
if (ATMId.equals("01") || ATMId.equals("02") || ATMId.equals("03") || ATMId.equals("04") || ATMId.equals("05") || ATMId.equals("06")) {
flag = 1;
}
if (flag == 0) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}
flag = 0;
//验证银行卡密码是否存在
if (!passport.equals("88888888")) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}
//验证取款金额是否大于余额
if (digit>0&&digit >= accountList.get(k).getBalance()) {
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
//检测是否为跨行存取款
for (i = 0; i < accountList.get(k).bank.getATMList().size(); i++) {
if (ATMId.equals(accountList.get(k).bank.getATMList().get(i))) {
flag=1;
}
}
if(flag==0){
System.out.println("Sorry,cross-bank withdrawal is not supported.");
System.exit(0);
}
}
void CardExist(){
for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j))) {
flag = 1;
}
}
}
if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
}
}
class Operation{
String card;
double digit;
String ATM;
ArrayList<Account> accountList;
int i,j,t;
public Operation(ArrayList<Account> accountList,String card){
this.accountList=accountList;
this.card=card;
}
public Operation(ArrayList<Account> accountList,String card,String ATM,double digit){
this.accountList=accountList;
this.card=card;
this.ATM=ATM;
this.digit=digit;
}
void CunQU(){

for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j))) {
t=i;

}
}
}
if(digit>0){
accountList.get(t).setBalance(accountList.get(t).getBalance()-digit);
System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.getBankname()+"的"+ATM+"号ATM机上取款¥%.2f\n",digit);
System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());
}
else{
double digit1=-digit;
accountList.get(t).setBalance(accountList.get(t).getBalance()-digit);
System.out.printf(accountList.get(t).getName()+"在"+accountList.get(t).bank.getBankname()+"的"+ATM+"号ATM机上存款¥%.2f\n",digit1);
System.out.printf("当前余额为¥%.2f\n",accountList.get(t).getBalance());
}
}
void show(){
for(i=0;i<accountList.size();i++){
for(j=0;j<accountList.get(i).getCardList().size();j++){
if(card.equals(accountList.get(i).getCardList().get(j))){
t=i;
break;
}
}
}
System.out.printf("¥%.2f\n",accountList.get(t).getBalance());
}
}
public class Main {
public static void main(String[] args){
//ATM机编号数组
ArrayList<String> ATMList1 = new ArrayList<>();
ATMList1.add("01");
ATMList1.add("02");
ATMList1.add("03");
ATMList1.add("04");
Bank jsyh = new Bank("中国建设银行", ATMList1);
ArrayList<String> ATMList2 = new ArrayList<>();
ATMList2.add("05");
ATMList2.add("06");
Bank gsyh = new Bank("中国工商银行", ATMList2);
//用户数组
ArrayList<String> cardList1 = new ArrayList<>();
cardList1.add("6217000010041315709");
cardList1.add("6217000010041315715");
Account account1 = new Account("杨过", "3217000010041315709", "88888888", 10000.00, jsyh,cardList1);

ArrayList<String> cardList2 = new ArrayList<>();
cardList2.add("6217000010041315718");
Account account2 = new Account("杨过", "3217000010041315715", "88888888", 10000.00, jsyh,cardList2);

ArrayList<String> cardList3 = new ArrayList<>();
cardList3.add("6217000010051320007");
Account account3 = new Account("郭靖", "3217000010051320007", "88888888", 10000.00, jsyh,cardList3);

ArrayList<String> cardList4 = new ArrayList<>();
cardList4.add("6222081502001312389");
Account account4 = new Account("张无忌", "3222081502001312389", "88888888", 10000.00,gsyh,cardList4);

ArrayList<String> cardList5 = new ArrayList<>();
cardList5.add("6222081502001312390");
Account account5 = new Account("张无忌", "3222081502001312390", "88888888", 10000.00,gsyh,cardList5);

ArrayList<String> cardList6 = new ArrayList<>();
cardList6.add("6222081502001312399");
cardList6.add("6222081502001312400");
Account account6 = new Account("张无忌", "3222081502001312399", "88888888", 10000.00, gsyh,cardList6);

ArrayList<String> cardList7 = new ArrayList<>();
cardList7.add("6222081502051320785");
Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", 10000.00, gsyh,cardList7);

ArrayList<String> cardList8 = new ArrayList<>();
cardList8.add("6222081502051320786");
Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", 10000.00, gsyh,cardList8);
//用户总数组
ArrayList<Account> accountList = new ArrayList<>();
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
accountList.add(account4);
accountList.add(account5);
accountList.add(account6);
accountList.add(account7);
accountList.add(account8);
Scanner xx=new Scanner(System.in);
String s=xx.nextLine();
while(!s.equals("#")){
String[] input=s.split("\\s+");
if(input.length!=1){
double money=Double.parseDouble(input[3]);
Check check=new Check(accountList,input[0],input[1],input[2],money);
check.AllCheck();
Operation operation=new Operation(accountList,input[0],input[2],money);
operation.CunQU();
}
else{
Check check=new Check(accountList,input[0]);
check.CardExist();
Operation operation=new Operation(accountList,input[0]);
operation.show();
}
s=xx.nextLine();
}
}
}

 

 题目集9

 

 

 整体代码综合性高,考察的方面较为广泛,对学生的各方面考察较为具体。主要考查的是与题目集8一样的类与类之间的关系,搞清楚类与类之间的关系来这种题目就迎刃而解了。与题目集8最大的不同就是,题目集9在题目及8的基础上加上了一些再类关系处理上的复杂性,因为加入了关于借记卡和贷记卡的账户样式,加入了关于跨行取款利息与超额取款利息的细节,准确理解老师的意图,在类的关系上加上这样的一些东西。 

源代码如下:

import java.util.Scanner;
import java.util.ArrayList;

class Card{
double balance;
String name;

Card(String name,double balance) {
this.balance = balance;
this.name = name;
}
}
//Bank类
class Bank {
private String bankname;
private ArrayList<String> ATMList;
private double khCharge;
private double tzCharge=0.05;
private double tzMax=50000;
//创建无参构造方法
public Bank(){
}
//创建带参构造方法
public Bank(String bankname,ArrayList<String> ATMList,double khCharge)
{
this.bankname=bankname;
this.ATMList=ATMList;
this.khCharge=khCharge;
}
//getter
public String getBankname() {
return bankname;
}
public ArrayList<String> getATMList() {
return ATMList;
}
//setter
public void setBankname(String bankname){
this.bankname=bankname;
}
public void setATMList(ArrayList<String> tATMList){
this.ATMList=ATMList;
}

public double getKhCharge() {
return khCharge;
}

public void setKhCharge(double khCharge) {
this.khCharge = khCharge;
}
}
//Account类
class Account {
private String name;
private String account;
private String password;
private int Accounttype;//1是借记 2是贷记
Bank bank;
private ArrayList<Card> cardList;
private ArrayList<Bank> BankList;
//创建无参构造方法
public Account(){
}
//创建带参构造方法
public Account(String name,String account,String password,Bank bank,ArrayList<Card> cardList,int Accounttype,ArrayList<Bank> BankList){
this.name=name;
this.account=account;
this.password=password;
this.bank=bank;
this.cardList=cardList;
this.Accounttype=Accounttype;
this.BankList=BankList;
}
//getter
public String getName() {
return name;
}
public String getAccount() {
return account;
}
public String getPassword() {
return password;
}
public ArrayList<Card> getCardList() {
return cardList;
}
public int getAccounttype(){return Accounttype;}
//setter
public void setName(String name) {
this.name = name;
}
public void setAccount(String account) {
this.account = account;
}
public void setPassword(String password) {
this.password = password;
}

public void setCardList(ArrayList<Card > cardList) {
this.cardList = cardList;
}
public void getAccounttype(int Accounttype){this.Accounttype=Accounttype;}

public ArrayList<Bank> getBankList() {
return BankList;
}

public void setBankList(ArrayList<Bank> bankList) {
BankList = bankList;
}
}
class Check{
String card;
String passport;
String ATMId;
double digit;
ArrayList<Account> accountList;
ArrayList<Bank> BankList;
int flag=0;
int i,j,k;
boolean z=true;
public Check(ArrayList<Account> accountList,String card,String passport,String ATMId,double digit,ArrayList<Bank> BankList){
this.ATMId=ATMId;
this.card=card;
this.digit=digit;
this.passport=passport;
this.accountList=accountList;
this.BankList=BankList;
}
public Check(ArrayList<Account> accountList,String card,ArrayList<Bank> BankList){
this.card=card;
this.accountList=accountList;
}
void AllCheck() {
//验证输入卡号是否存在
for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j).name)) {
flag = 1;
k = i;
}
}
}
if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
flag = 0;
//验证输入ATM号是否存在
for(i=0;i<BankList.size();i++){
for(j=0;j<BankList.get(i).getATMList().size();j++){
if(ATMId.equals(BankList.get(i).getATMList().get(j)))
flag=1;
}
}
if (flag == 0) {
System.out.println("Sorry,the ATM's id is wrong.");
System.exit(0);
}
flag = 0;
//验证银行卡密码是否存在
if (!passport.equals("88888888")) {
System.out.println("Sorry,your password is wrong.");
System.exit(0);
}
}
void CardExist(){
for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j).name)) {
flag = 1;
}
}
}
if (flag == 0) {
System.out.println("Sorry,this card does not exist.");
System.exit(0);
}
}
}
class Operation{
String card;
double digit;
String ATM;
ArrayList<Account> accountList;
ArrayList<Bank> BankList;
int i,j,t,x,z,h;
double y;
double money;
public Operation(ArrayList<Account> accountList,String card,ArrayList<Bank> BankList){
this.accountList=accountList;
this.card=card;
this.BankList=BankList;
}
public Operation(ArrayList<Account> accountList,String card,String ATM,double digit,ArrayList<Bank> BankList){
this.accountList=accountList;
this.card=card;
this.ATM=ATM;
this.digit=digit;
this.BankList=BankList;
}
void CunQU(){

for (i = 0; i < accountList.size(); i++) {
for (j = 0; j < accountList.get(i).getCardList().size(); j++) {
if (card.equals(accountList.get(i).getCardList().get(j).name)) {
t=i;
h=j;
}
}
}
for(i=0;i<accountList.get(t).bank.getATMList().size();i++){
if(ATM.equals(accountList.get(t).bank.getATMList().get(i)))
x=1;
}
for(i=0;i<BankList.size();i++){
for(j=0;j<BankList.get(i).getATMList().size();j++){
if(ATM.equals(BankList.get(i).getATMList().get(j))) {
y = BankList.get(i).getKhCharge();
z = i;
}
}
}
if(digit>0){
if(x==1) {//没跨行
if(accountList.get(t).getAccounttype()==1){//借记
money=accountList.get(t).getCardList().get(h).balance-digit;
if(money<0){
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
for(i=0;i<accountList.get(t).getCardList().size();i++){
accountList.get(t).getCardList().get(i).balance=money;
} System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" +BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
}
else if(accountList.get(t).getAccounttype()==2){//贷记
if(accountList.get(t).getCardList().get(h).balance<0){
money=accountList.get(t).getCardList().get(h).balance-digit*(0.05+1);
}

else {
if(accountList.get(t).getCardList().get(h).balance-digit<0)
money=accountList.get(t).getCardList().get(h).balance-digit-(digit-accountList.get(t).getCardList().get(h).balance)*0.05;
else
money = accountList.get(t).getCardList().get(h).balance - digit;
}
if(money<-50000){
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
for(i=0;i<accountList.get(t).getCardList().size();i++){
accountList.get(t).getCardList().get(i).balance=money;
}
System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
}
}
else{//跨行
if(accountList.get(t).getAccounttype()==1){//借记
money=accountList.get(t).getCardList().get(h).balance-digit*(1+y);
if(money<0){
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
for(i=0;i<accountList.get(t).getCardList().size();i++){
accountList.get(t).getCardList().get(i).balance=money;
} System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
}
else if(accountList.get(t).getAccounttype()==2){//贷记
if(accountList.get(t).getCardList().get(h).balance<0){
money=accountList.get(t).getCardList().get(h).balance-digit*(0.05+1+y);
}

else {
if(accountList.get(t).getCardList().get(h).balance-digit<0)
money=accountList.get(t).getCardList().get(h).balance-digit*(1+y)-(digit-accountList.get(t).getCardList().get(h).balance)*0.05;
else
money = accountList.get(t).getCardList().get(h).balance - digit*(1+y);
}
if(money<-50000){
System.out.println("Sorry,your account balance is insufficient.");
System.exit(0);
}
for(i=0;i<accountList.get(t).getCardList().size();i++){
accountList.get(t).getCardList().get(i).balance=money;
}
System.out.printf("业务:取款 "+accountList.get(t).getName() + "在" + BankList.get(z).getBankname() + "的" + ATM + "号ATM机上取款¥%.2f\n", digit);
System.out.printf("当前余额为¥%.2f\n", accountList.get(t).getCardList().get(h).balance);
}
}
}
}
void show(){
for(i=0;i<accountList.size();i++){
for(j=0;j<accountList.get(i).getCardList().size();j++){
if(card.equals(accountList.get(i).getCardList().get(j).name)){
t=i;
h=j;
}
}
}
System.out.printf("业务:查询余额 ¥%.2f\n",accountList.get(t).getCardList().get(h).balance);
}
}
public class Main {
public static void main(String[] args){
//ATM机编号数组
ArrayList<String> ATMList1 = new ArrayList<>();
ATMList1.add("01");
ATMList1.add("02");
ATMList1.add("03");
ATMList1.add("04");
Bank jsyh = new Bank("中国建设银行", ATMList1,0.02);
ArrayList<String> ATMList2 = new ArrayList<>();
ATMList2.add("05");
ATMList2.add("06");
Bank gsyh = new Bank("中国工商银行", ATMList2,0.03);
ArrayList<String> ATMList3 = new ArrayList<>();
ATMList3.add("07");
ATMList3.add("08");
ATMList3.add("09");
ATMList3.add("10");
ATMList3.add("11");
Bank nyyh = new Bank("中国农业银行", ATMList3,0.04);
ArrayList<Bank> BankList=new ArrayList<>();
BankList.add(jsyh);
BankList.add(gsyh);
BankList.add(nyyh);

//用户数组
Card card1=new Card("6217000010041315709",10000.00);
Card card2=new Card("6217000010041315715",10000.00);
ArrayList<Card> cardList1 = new ArrayList<>();
cardList1.add(card1);
cardList1.add(card2);
Account account1 = new Account("杨过", "3217000010041315709", "88888888", jsyh,cardList1,01,BankList);

Card card3=new Card("6217000010041315718",10000.00);
ArrayList<Card> cardList2 = new ArrayList<>();
cardList2.add(card3);
Account account2 = new Account("杨过", "3217000010041315715", "88888888", jsyh,cardList2,01,BankList);

Card card4=new Card("6217000010051320007",10000.00);
ArrayList<Card> cardList3 = new ArrayList<>();
cardList3.add(card4);
Account account3 = new Account("郭靖", "3217000010051320007", "88888888", jsyh,cardList3,01,BankList);

Card card5=new Card("6222081502001312389",10000.00);
ArrayList<Card> cardList4 = new ArrayList<>();
cardList4.add(card5);
Account account4 = new Account("张无忌", "3222081502001312389", "88888888", gsyh,cardList4,01,BankList);

Card card6=new Card("6222081502001312390",10000.00);
ArrayList<Card> cardList5 = new ArrayList<>();
cardList5.add(card6);
Account account5 = new Account("张无忌", "3222081502001312390", "88888888", gsyh,cardList5,01,BankList);

Card card7=new Card("6222081502001312399",10000.00);
Card card8=new Card("6222081502001312400",10000.00);
ArrayList<Card> cardList6 = new ArrayList<>();
cardList6.add(card7);
cardList6.add(card8);
Account account6 = new Account("张无忌", "3222081502001312399", "88888888", gsyh,cardList6,01,BankList);

Card card9=new Card("6222081502051320785",10000.00);
ArrayList<Card> cardList7 = new ArrayList<>();
cardList7.add(card9);
Account account7 = new Account("韦小宝", "3222081502051320785", "88888888", gsyh,cardList7,01,BankList);

Card card10=new Card("6222081502051320786",10000.00);
ArrayList<Card> cardList8 = new ArrayList<>();
cardList8.add(card10);
Account account8 = new Account("韦小宝", "3222081502051320786", "88888888", gsyh,cardList8,01,BankList);

Card card11=new Card("6640000010045442002",10000.00);
Card card12=new Card("6640000010045442003",10000.00);
ArrayList<Card> cardList9 = new ArrayList<>();
cardList9.add(card11);
cardList9.add(card12);
Account account9 = new Account("张三丰", "3640000010045442002", "88888888", jsyh,cardList9,02,BankList);

Card card13=new Card("6640000010045441009",10000.00);
ArrayList<Card> cardList10 = new ArrayList<>();
cardList10.add(card13);
Account account10 = new Account("令狐冲", "3640000010045441009", "88888888", gsyh,cardList10,02,BankList);

Card card14=new Card("6630000010033431001",10000.00);
ArrayList<Card> cardList11 = new ArrayList<>();
cardList11.add(card14);
Account account11 = new Account("乔峰", "3630000010033431001", "88888888", nyyh,cardList11,02,BankList);

Card card15=new Card("6630000010033431008",10000.00);
ArrayList<Card> cardList12 = new ArrayList<>();
cardList12.add(card15);
Account account12 = new Account("洪七公", "3630000010033431008", "88888888", nyyh,cardList12,02,BankList);
//用户总数组
ArrayList<Account> accountList = new ArrayList<>();
accountList.add(account1);
accountList.add(account2);
accountList.add(account3);
accountList.add(account4);
accountList.add(account5);
accountList.add(account6);
accountList.add(account7);
accountList.add(account8);
accountList.add(account9);
accountList.add(account10);
accountList.add(account11);
accountList.add(account12);
Scanner xx=new Scanner(System.in);
String s=xx.nextLine();
while(!s.equals("#")){
String[] input=s.split("\\s+");
if(input.length!=1){
double money=Double.parseDouble(input[3]);
Check check=new Check(accountList,input[0],input[1],input[2],money,BankList);
check.AllCheck();
Operation operation=new Operation(accountList,input[0],input[2],money,BankList);
operation.CunQU();
}
else{
Check check=new Check(accountList,input[0],BankList);
check.CardExist();
Operation operation=new Operation(accountList,input[0],BankList);
operation.show();
}
s=xx.nextLine();
}
}
}

(3)采坑心得:

在卡片分组问题上我分的吧各个图片分在同一个数组里面,呈现出来的也是散乱的,可以说是没有分组。这也是我应该提升的地方,没有看实验报告的要求随便分组,导致我后面几个点也因为我随便分组,导致面积求和也是错误的,也就是说我刚开始就没对相应图形进行分组。剩下的功能和上一道题基本实现的是一个功能,进行的还算顺利。

(4)改进建议:

对于第三阶段的作业代码,每一道题基本上都在两百行以上,题目量大,考验的就是一个思路以及对代码的理解。

1.我对基础知识掌握不牢固,比如说抽象类接口应用不熟练,面向对象类设计的思想大概有所训练,但还是很难写出所谓的好代码。

2.这几次作业都是对面向对象设计原则的具体体现,比如说可拓展性维护性开闭性等,而自己不是那么深刻了解其应用,导致还是存在面向过程编程。

(5)总结:

  这是本学期的最后一次Blog总结,从刚开始接触写博客感觉很拘谨,到目前写过三次,每次Blog总结都有不同的心情,从第一次的自我反思,刚接触JAVA的初学者,到第二次感慨JAVA难学的悲愤大学生,到目前第三次对JAVA算是刚入门的学生,每次写博客的心情都都不同。回顾之前两次的Blog作业每次都有不小的收获。代码量难度也是从每次作业中不断提升,这也正是考验我们编程能力的鉴证。博客也是我们每次阶段性总结的笔记,在这里能看到我们的不足和收获。第三次博客作业总结也是前面作业的基础,到最后总结的大作业,虽然有些艰难但是怎么说也算活这出来了。经过一个学期的JAVA学习,真正算理解我们学习的专业与生活是哪么密不可分,面向对象的思维是JAVA学习中所学到的。总之JAVA学习还是挺折磨的,等完成一道题或多或少也有一些成就感,但是折磨占一大部分。希望自己日后还能在提高自己的编程水平,在生活上也要学习敲PTA的精神,真是逼到不行才能知道自己原来不吃饭也能挺能坚持的。

posted @ 2021-12-18 19:25  NCHSH  阅读(59)  评论(0)    收藏  举报