第三次博客作业

1.前言

习题集总结

知识点总结

1)掌握类的继承、多态性使用方法以及接口的应用。

2)习题中的代码类结构该如何完善才能使得系统具有较好的可复用性 。

3)深入理解面向对象设计原则中的“单一职责”原则和“开-闭”原则,面向对象设计原则中的“开-闭”原则的实现方法及其作用。

4)Comparable、Comparator 接口的应用,ArrayList 工具类的使用;

5)务必注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。

6)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。

7)编程时考虑面向对象中的封装性的应用以及是否有能够扩展 的衍生需求。

2.设计与分析

题目情况

第七次题目集7-1题目情况

题目要求

  • 首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
  • 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

第七次题目集7-1设计思路

按照题目的要求设计类,设计Card 类 implements 接口Comparable,设计父类Shape 及其子类Circle, Rectangle, Triangle ,Trapezoid,设计DealCardList类,其属性为ArrayList<Card> cardList = new ArrayList<Card>(); 在DealCardList的带参构造方法中对属性cardlist添加内容。

DealCardList的属性如下

ArrayList<Card> cardList = new ArrayList<Card>();

 

DealCardList的带参构造方法如下

 1 public DealCardList(ArrayList<Integer> List) {
 2         super();
 3         double zhi1, zhi2, zhi3; // 临时的,用于存储输入的数值
 4         Card card;
 5         for (int i = 0; i < List.size(); i++) {
 6             if(List.get(i)==1) {  // 此处对输入的数字构建相对应的Shape类型卡片
 7                 Circle circle = new Circle();
 8                 zhi1 = Main.input.nextDouble();
 9                 circle.setRadius(zhi1);
10                 card = new Card(circle);
11                 cardList.add(card);
12         }
13         if(List.get(i) == 2) {
14                 Rectangle rectangle = new Rectangle();
15                 zhi1 = Main.input.nextDouble();
16                 zhi2 = Main.input.nextDouble();
17                 rectangle.setLength(zhi1);
18                 rectangle.setWidth(zhi2);
19                 card = new Card(rectangle);
20                 cardList.add(card);
21         }
22         if(List.get(i) == 3) {
23                 Triangle triangle = new Triangle();
24                 zhi1 = Main.input.nextDouble();
25                 zhi2 = Main.input.nextDouble();
26                 zhi3 = Main.input.nextDouble();
27                 triangle.setSide1(zhi1);
28                 triangle.setSide2(zhi2);
29                 triangle.setSide3(zhi3);
30                 card = new Card(triangle);
31                 cardList.add(card);
32         }
33         if(List.get(i) == 4) {
34                 Trapezoid Trapezoid = new Trapezoid();
35                 zhi1 = Main.input.nextDouble();
36                 zhi2 = Main.input.nextDouble();
37                 zhi3 = Main.input.nextDouble();
38                 Trapezoid.setToSide(zhi1);
39                 Trapezoid.setBottomSide(zhi2);
40                 Trapezoid.setHeight(zhi3);
41                 card = new Card(Trapezoid);
42                 cardList.add(card);
43             }
44         }
45     }

 

在主方法进行DealCardList的创建和使用。

 1 public class Main {
 2 
 3     public static Scanner input = new Scanner(System.in);
 4 
 5     public static void main(String[] args) {
 6         ArrayList<Integer> list = new ArrayList<Integer>();
 7         int num = Main.input.nextInt();
 8         while (num != 0) {
 9             if (num < 0 || num > 4) {
10                 System.out.println("Wrong Format");
11                 System.exit(0);
12             }
13             list.add(num);    // 此处添加数据
14             num = Main.input.nextInt();
15         }
16         DealCardList dealCardList = new DealCardList(list); // 此处创建一个新的DealCardList,利用的带参构造方法
17         if (!dealCardList.validate()) {             // 此处判断数据合法性
18             System.out.println("Wrong Format");
19             System.exit(0);
20         }
21         dealCardList.showResult();
22         input.close();
23     }
24 }

Comparable的实现和使用

Card类实现接口Comparable,并重写compareTo() 方法

 1 class Card  implements Comparable<Card>{
 2     private Shape shape;
 3 
 4     public Card() {
 5         super();
 6         // TODO Auto-generated constructor stub
 7     }
 8     
 9     public Card(Shape shape) {
10         super();
11         this.shape = shape;
12     }
13 
14     public Shape getShape() {
15         return shape;
16     }
17     
18     public void setShape(Shape shape) {
19         this.shape = shape;
20     }
21     
22     public int compareTo(Card card) { // 重写compareTo方法
23         return this.getShape().getArea() > card.getShape().getArea()?-1:this.getShape().getArea()==card.getShape().getArea()?0:1;
24     }
25 }

实现接口Comparable后的对Card的排序

 1     public void cardSort() {
 2         Collections.sort(cardList);
 3     }
 4 

 

第七次题目集7-1类图

 

 

 

第七次题目集7-1 SourceMonitor的生成报表内容

 

 

 

 

 

 

第七次题目集7-2题目情况

题目要求

 

沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生, 卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组, 所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片 的面积之和,最后求出每组卡片面积之和中的最大值。

输出要求:

  1. 排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
  2. 输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
  3. 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
  4. 各组中面积之和的最大值输出,格式为The max area:面积值

第七次题目集7-2设计思路

与第七次题目集7-1题目相同对输出不同,第七次题目集7-2需要进行分组和排序,按照题目的要求设计类,设计Card 类 implements 接口Comparable,设计父类Shape 及其子类Circle, Rectangle, Triangle ,Trapezoid,设计DealCardList类,其属性为ArrayList<Card> cardList = new ArrayList<Card>(); 在DealCardList的带参构造方法中对属性cardlist添加内容。

 

在第七次题目集7-2中添加了新的方法,用于排序和分组展示

 1     public void SeparatedShow() {
 2         System.out.println("The Separated List:");
 3         ArrayList<Card> cardList1 = new ArrayList<Card>();
 4         ArrayList<Card> cardList2 = new ArrayList<Card>();
 5         ArrayList<Card> cardList3 = new ArrayList<Card>();
 6         ArrayList<Card> cardList4 = new ArrayList<Card>();
 7         for (Card temp: cardList) {
 8             if(temp.getShape().getShapeName().equals("Circle")) {
 9                 cardList1.add(temp);
10                 continue;
11             }
12             if(temp.getShape().getShapeName().equals("Rectangle")) {
13                 cardList2.add(temp);
14                 continue;
15             }
16             if(temp.getShape().getShapeName().equals("Triangle")) {
17                 cardList3.add(temp);
18                 continue;
19             }
20             if(temp.getShape().getShapeName().equals("Trapezoid")) {
21                 cardList4.add(temp);
22                 continue;
23             }
24         }
25         showArrayList(cardList1);
26         showArrayList(cardList2);
27         showArrayList(cardList3);
28         showArrayList(cardList4);
29         System.out.println();
30         Collections.sort(cardList1);
31         Collections.sort(cardList2);
32         Collections.sort(cardList3);
33         Collections.sort(cardList4);
34         System.out.println("The Separated sorted List:");
35         showArrayList(cardList1);
36         showArrayList(cardList2);
37         showArrayList(cardList3);
38         showArrayList(cardList4);
39         System.out.println();
40         System.out.print("The max area:");
41         double[] shuzu = new double[4];
42         shuzu[0] = getAllArea(cardList1);
43         shuzu[1] = getAllArea(cardList2);
44         shuzu[2] = getAllArea(cardList3);
45         shuzu[3] = getAllArea(cardList4);
46         double max = 0;
47         for(int i = 0 ; i < 4 ; i ++) {
48             if(shuzu[i] > max) {
49                 max = shuzu[i];
50             }
51         }
52         System.out.printf("%.2f",max);
53         
54     }

 

第七次题目集7-2 SourceMonitor的生成报表内容

 

 

第八次题目集7-1题目情况   ATM机类结构设计(一)

题目要求

编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能,每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:

  • 存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
  • 查询余额功能输入数据格式: 卡号

设计要求

尝试使用面向对象技术对银行用户在 ATM 机上进行相关操作的模拟系统设 计,上述的相关概念均要设计为实体类,业务(控制)类请自行根据实际需要进 行扩充和完善。

 

第八次题目集7-1设计思路

按照题目的要求设计类,按照题目要求设计的类设计中国银联(ChinaUnionPay), 银行(Bank) ,银行用户(User), 银行账户(Account), 银行卡(Card), ATM(ATM),根据情况所需自行设计了Agent类为业务类,

 

Agent业务类代码如下

  1 class Agent {
  2     ChinaUnionPay c1 = new ChinaUnionPay();
  3 
  4     public Agent() {
  5         super();
  6         // TODO Auto-generated constructor stub
  7     }
  8 
  9     public Agent(ChinaUnionPay c1) {
 10         super();
 11         this.c1 = c1;
 12     }
 13 
 14     public void calculate() { //  
 15         Scanner input = new Scanner(System.in);
 16         String string = input.nextLine();
 17         ATM atm = new ATM();
 18         
 19         
 20         Pattern pattern = Pattern.compile("(-+)?\\d{1,19}(\\.\\d{1,6})?"); //  正则分割
 21         Matcher matcher = pattern.matcher(string);
 22         int i = 1;
 23         while(matcher.find()) {
 24             switch(i) {
 25             case 1:
 26                 atm.setCardid(matcher.group()); i ++; break;
 27             case 2:
 28                 atm.setCardkey(matcher.group()); i ++; break;
 29             case 3:
 30                 atm.setId(matcher.group()); i ++; break;
 31             case 4:
 32                 atm.setMoney(Double.parseDouble(matcher.group()));i ++; break;
 33             }
 34         }
 35         
 36         while (!string.equals("#")) {
 37             if(i == 2) {
 38                 handle(atm.getCardid());
 39             }
 40             if(i == 5){
 41                 handle(atm.getCardid(), atm.getCardkey(), atm.getId(), atm.getMoney(),atm);
 42             }
 43             atm.setzero();
 44             
 45             string = input.nextLine();
 46             matcher = pattern.matcher(string);
 47             i = 1;
 48             
 49             while(matcher.find()) {
 50                 switch(i) {
 51                 case 1:
 52                     atm.setCardid(matcher.group()); i ++; break;
 53                 case 2:
 54                     atm.setCardkey(matcher.group()); i ++; break;
 55                 case 3:
 56                     atm.setId(matcher.group()); i ++; break;
 57                 case 4:
 58                     atm.setMoney(Double.parseDouble(matcher.group()));i ++; break;
 59                 }
 60             }
 61             
 62             
 63         }
 64     }
 65 
 66     private void handle(String str) {  //  处理查余额操作
 67         if(lookforcard(str) == null) {
 68             System.out.print("Sorry,this card does not exist.");
 69         }
 70         
 71         System.out.println("¥" + String.format("%.2f", lookforaccount(str).getBalance()));
 72     }
 73 
 74     public int handle(String str, String strkey, String ATMid, double balance,ATM atm) {  // 处理存取款操作
 75         
 76         if(lookforcard(str) == null) {
 77             System.out.println("Sorry,this card does not exist.");
 78             return 0;
 79         }
 80         if(!validateKey(strkey)) {
 81             System.out.println("Sorry,your password is wrong.");
 82             return 0;
 83         }
 84         if(lookforATM(ATMid) == null) {
 85             System.out.println("Sorry,the ATM's id is wrong.");
 86             return 0;
 87         }
 88         
 89         
 90         if(lookforcard(str).equals(lookforATM(ATMid)) && lookforcard(str) != null && lookforATM(ATMid) != null) {
 91             if(atm.Money(lookforaccount(str)) == 0){
 92                 return 0;
 93             }
 94         }else {
 95             System.out.println("Sorry,cross-bank withdrawal is not supported.");
 96             return 0;
 97         }
 98         
 99         System.out.println(lookforuser(lookforaccount(str)).getName()+"在" + lookforcard(str) + "的" + atm.getId() + "号ATM机上" + atm.Money() + "¥" + atm.MoneytoString());
100         System.out.println("当前余额为¥" + String.format("%.2f", lookforaccount(str).getBalance()));
101         return 0;
102     }
103 
104     public String lookforcard(String str) { //  通过卡号查找相对应的卡所属银行名称
105         Iterator<Bank> bankItr = c1.getList().iterator();
106         while (bankItr.hasNext()) {
107             Bank bank = (Bank) bankItr.next();
108             Iterator<User> userItr = bank.getList().iterator();
109             while (userItr.hasNext()) {
110                 Iterator<Account> accountItr = userItr.next().getList().iterator();
111                 while (accountItr.hasNext()) {
112                     Iterator<Card> cardItr = accountItr.next().getList().iterator();
113                     while (cardItr.hasNext()) {
114                         if (cardItr.next().getId().toString().equals(str)) {
115                             return bank.getName();
116                         }
117                     }
118                 }
119             }
120         }
121         return null;
122     }
123 
124     public String lookforATM(String str) {  //  通过ATM号码查找对应的银行名称
125         Iterator<Bank> bankItr = c1.getList().iterator();
126         while (bankItr.hasNext()) {
127             Bank bank = (Bank) bankItr.next();
128             Iterator<ATM> atmItr = bank.getATMlist().iterator();
129             while (atmItr.hasNext()) {
130                 if (atmItr.next().getId().toString().equals(str)) {
131                     return bank.getName();
132                 }
133             }
134         }
135         
136         return null;
137     }
138     
139     public Account lookforaccount(String str) {  //  通过账户号码查找账户
140         Iterator<Bank> bankItr = c1.getList().iterator();
141         while (bankItr.hasNext()) {
142             Iterator<User> userItr = bankItr.next().getList().iterator();
143             while (userItr.hasNext()) {
144                 Iterator<Account> accountItr = userItr.next().getList().iterator();
145                 while (accountItr.hasNext()) {
146                     Account account = (Account) accountItr.next();
147                     Iterator<Card> cardItr = account.getList().iterator();
148                     while (cardItr.hasNext()) {
149                         if (cardItr.next().getId().toString().equals(str)) {
150                             return account;
151                         }
152                     }
153                 }
154             }
155         }
156         return null;
157     }
158     
159     public User lookforuser(Account account) {  //  通过账户查找用户
160         Iterator<Bank> bankItr = c1.getList().iterator();
161         while (bankItr.hasNext()) {
162             Iterator<User> userItr = bankItr.next().getList().iterator();
163             while (userItr.hasNext()) {
164                 User user = userItr.next();
165                 Iterator<Account> accountItr = user.getList().iterator();
166                 while (accountItr.hasNext()) {            
167                         if (accountItr.next().getId().toString().equals(account.getId())) {
168                             return user;
169                         }
170                 }
171             }
172         }
173         return null;
174     }
175     
176     public boolean validateKey(String str) {  //  检验卡密码是否正确
177         if(str.equals("88888888")) {
178             return true;
179         }
180         return false;
181     }
182 }

 

 

 

3.采坑心得

心得

粗心,在类中经常忘记使用私有属性,更为重要的是对题目的理解不够透彻,有时会没有思考头绪,日后要对所有所学的知识多多巩固,加强训练,深刻透彻理解。

4.改进建议

在类中全部使用私有属性,

5.总结

掌握类的继承、多态性使用方法以及接口的应用。

完善类的结构能使得系统具有较好的可复用性。

Comparator 接口的应用,compareTo()方法的重写。

实体类之间的关系,处理好一对多,多对多的组合关系。

对实体类的设计要做到单一职责原则。

编程时考虑面向对象中的封装性。

posted @ 2021-06-20 18:05  wendying  阅读(55)  评论(0)    收藏  举报