第三次博客作业
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图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前; - 输出分组后的图形类型及面积,格式为
[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出; - 各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
- 各组中面积之和的最大值输出,格式为
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()方法的重写。
实体类之间的关系,处理好一对多,多对多的组合关系。
对实体类的设计要做到单一职责原则。
编程时考虑面向对象中的封装性。

浙公网安备 33010602011771号