题目集7-9总结性blog
作者:互联网
题目集7-9总结性blog
1、 前言
这三次作业并没有什么新的知识点,都是对之前学习的东西进行应用,主要有:1、继承、多态的应用;2、ArrayList泛型的应用方法;3、Comparable接口及泛型的应用;4、单一职责原则的应用; 5、“开-闭”原则的应用。还有一些银行、ATM机、银行卡的相关课外知识,我是我之前没了解过的。
题量也是比较少,三次作业只有四道题,当然难度也是有的,像设计第八次作业的类,
要使得程序的可维护性高,这样第九次作业才好写,这得花点功夫。
2、 设计与分析
(1) 题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
题目7(7-1)详情:
7-1 图形卡片排序游戏 (40 分)
掌握类的继承、多态性使用方法以及接口的应用。详见作业指导书 2020-OO第07次作业-1指导书V1.0.pdf
输入格式:
首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形 需要\ 输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
排序后的各图形类型及面积,格式同排序前的输出;
所有图形的面积总和,格式为Sum of area:总面积值。
类图:
复杂度:
源代码:
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util.Map; import java.text.DecimalFormat; import java.util.TreeMap; public class Main { public static void main(String[] args) { Scanner input=new Scanner(System.in); DecimalFormat df2 = new DecimalFormat("####0.00"); ArrayList<Integer> cz = new ArrayList<Integer>(); Circle circle=new Circle(); Rectangle rectangle=new Rectangle(); Triangle triangle=new Triangle(); Trapezoid trapezoid=new Trapezoid(); for(int i=0;;i++) { int x=input.nextInt(); if(x==0&&i==0) { System.out.println("The original list:"+"\n"); System.out.println("The sorted list:"+"\n"); System.out.println("Sum of area:0.00"); System.exit(0); break; } if(x==0&&i!=0) break; else if(x>0&&x<=4) cz.add(x); else { System.out.println("Wrong Format"); System.exit(0); } } ArrayList<Double> area1 = new ArrayList<Double>(); ArrayList<Double> area2 = new ArrayList<Double>(); ArrayList<Double> area3 = new ArrayList<Double>(); ArrayList<Double> area4 = new ArrayList<Double>(); for(int i=0;i<cz.size();i++) { switch(cz.get(i)) { case 1:circle.r=input.nextDouble(); if(circle.r<0) { System.out.println("Wrong Format"); System.exit(0); } area1.add(circle.getArea()); break; case 2:rectangle.length=input.nextDouble(); rectangle.width=input.nextDouble(); if(rectangle.length<0||rectangle.width<0) { System.out.println("Wrong Format"); System.exit(0); } area2.add(rectangle.getArea()); break; case 3:triangle.side1=input.nextDouble(); triangle.side2=input.nextDouble(); triangle.side3=input.nextDouble(); if(triangle.side1+triangle.side2<=triangle.side3||triangle.side1+triangle.side3<=triangle.side2||triangle.side2+triangle.side3<=triangle.side1) { System.out.println("Wrong Format"); System.exit(0); } area3.add(triangle.getArea()); break; case 4:trapezoid.sd=input.nextDouble(); trapezoid.xd=input.nextDouble(); trapezoid.h=input.nextDouble(); if(trapezoid.sd<0||trapezoid.xd<0||trapezoid.h<0) { System.out.println("Wrong Format"); System.exit(0); } area4.add(trapezoid.getArea()); break; } } System.out.println("The original list:"); for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break; case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break; case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break; case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break; } } System.out.println("\n"+"The sorted list:"); Map map = new TreeMap(); for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:map.put(area1.get(i),"Circle:");i++;break; case 2:map.put(area2.get(j),"Rectangle:");j++;break; case 3:map.put(area3.get(k),"Triangle:");k++;break; case 4:map.put(area4.get(l),"Trapezoid:");l++;break; } } ArrayList<Double> mj = new ArrayList<Double>(); for(int i = 0,j = 0,k = 0,l=0;i+j+k+l<cz.size();) { switch(cz.get(i+j+k+l)) { case 1:mj.add(area1.get(i));i++;break; case 2:mj.add(area2.get(j));j++;break; case 3:mj.add(area3.get(k));k++;break; case 4:mj.add(area4.get(l));l++;break; } } Collections.sort(mj); for(int i=cz.size()-1;i>=0;i--) { System.out.print(map.get(mj.get(i))); System.out.print(df2.format(mj.get(i))+" "); } double sum=0; for(int i=0;i<cz.size();i++) { sum=sum+mj.get(i); } System.out.println("\n"+"Sum of area:"+df2.format(sum)); } } class Circle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double r; public double getArea() { return Math.PI*r*r; } public void show() { System.out.print("Circle:"+df2.format(this.getArea())+" "); } } class Rectangle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double length; double width; public double getArea() { return length*width; } public void show() { System.out.print("Rectangle:"+df2.format(this.getArea())+" "); } } class Triangle{ DecimalFormat df2 = new DecimalFormat("####0.00"); double side1; double side2; double side3; public double getArea() { return Math.sqrt(((side1+side2+side3)/2)*(((side1+side2+side3)/2)-side1)*(((side1+side2+side3)/2)-side2)*(((side1+side2+side3)/2)-side3)); } public void show() { System.out.print("Triangle:"+df2.format(this.getArea())+" "); } } class Trapezoid{ DecimalFormat df2 = new DecimalFormat("####0.00"); double sd; double xd; double h; public double getArea() { return (sd+xd)*h*0.5; } public void show() { System.out.print("Trapezoid:"+df2.format(this.getArea())+" "); } }
题目7(7-2)详情:
7-2 图形卡片分组游戏 (60 分)
掌握类的继承、多态性使用方法以及接口的应用。 具体需求参考作业指导书。
输入格式:
在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如:1 3 4 2 1 3 4 2 1 3 0
根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。
输出格式:
如果图形数量非法(<=0)或图形属性值非法(数值<0以及三角形三边不能组成三角形),则输出Wrong Format。
如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
1、排序前的各图形类型及面积,格式为[图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ],注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格,在结束符“]”之前;
2、输出分组后的图形类型及面积,格式为[圆形分组各图形类型及面积][矩形分组各图形类型及面积][三角形分组各图形类型及面积][梯形分组各图形类型及面积],各组内格式为图形名称:面积值。按照“Circle、Rectangle、Triangle、Trapezoid”的顺序依次输出;
3、各组内图形排序后的各图形类型及面积,格式同排序前各组图形的输出;
4、各组中面积之和的最大值输出,格式为The max area:面积值。
类图:
复杂度:
第一题是输入几个不同的图形,然后算出其面积,先输出按输入顺序的面积,再输出按面积从大到小的顺序,最后输出面积最大的;而第二题是在第一题的基础上,可以输入多个相同的图形,但是 可以有不同的面积,而且要把不同的图形分为不同的组,组的顺序是固定的,但是组内图形面积需要排序,最后输出最大的一组面积之和。
由于第二题是在第一题的基础上进行的,所以第一题的四个图形类和存面积的方法可以完全用在第二题中,第二题比第一题多的用来分组代码:
System.out.print("["); for(int i=area1.size()-1;i>=0;i--) { System.out.print("Circle:"+df2.format(area1.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area2.size()-1;i>=0;i--) { System.out.print("Rectangle:"+df2.format(area2.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area3.size()-1;i>=0;i--) { System.out.print("Triangle:"+df2.format(area3.get(i))+" "); } System.out.print("]"); System.out.print("["); for(int i=area4.size()-1;i>=0;i--) { System.out.print("Trapezoid:"+df2.format(area4.get(i))+" "); } System.out.print("]");
(2)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目8详情:
7-1 ATM机类结构设计(一) (100 分)
设计ATM仿真系统,具体要求参见作业说明。 OO作业8-1题目说明.pdf
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
存款、取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔), 其中,当金额大于0时,代表取款,否则代表存款。
查询余额功能输入数据格式: 卡号
输出格式:
① 输入错误处理
如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
如果检测为跨行存取款,则输出Sorry,cross-bank withdrawal is not supported.。
② 取款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③ 存款业务输出
输出共两行,格式分别为:
[用户姓名]在[银行名称]的[ATM编号]上存款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
④ 查询余额业务输出
¥[金额]
金额保留两位小数。
类图:
题目9详情:
7-1 ATM机类结构设计(二) (100 分)
设计ATM仿真系统,具体要求参见作业说明。 OO作业9-1题目说明.pdf
输入格式:
每一行输入一次业务操作,可以输入多行,最终以字符#终止。具体每种业务操作输入格式如下:
取款功能输入数据格式: 卡号 密码 ATM机编号 金额(由一个或多个空格分隔)
查询余额功能输入数据格式: 卡号
输出格式:
①输入错误处理
如果输入卡号不存在,则输出Sorry,this card does not exist.。
如果输入ATM机编号不存在,则输出Sorry,the ATM's id is wrong.。
如果输入银行卡密码错误,则输出Sorry,your password is wrong.。
如果输入取款金额大于账户余额,则输出Sorry,your account balance is insufficient.。
②取款业务输出
输出共两行,格式分别为:
业务:取款 [用户姓名]在[银行名称]的[ATM编号]上取款¥[金额]
当前余额为¥[金额]
其中,[]说明括起来的部分为输出属性或变量,金额均保留两位小数。
③查询余额业务输出
业务:查询余额 ¥[金额]
金额保留两位小数。
类图:
这两次作业的关键点是题目八,因为题目九是在第八题的基础上做的,那就先看题目八,第一步要做的是存数据,因为这里有大量的衍生关系,比如中国银联有中国建设银行,中国工商银行等,然后每个银行又有一些用户,每个用户有一个或多个银行账号,每个银行账号又有一个或多个银行卡号。要做好这个题目,如何把这些关系有机联系起来是至关重要的。
我用的是map集合将这些关系联系起来,这样就可以通过任何对象找到与其相关的信息,然后相关的输出方法是放在ATM类里面,判断是否合法操作的方法在Bankcard类里面。
源代码:
import java.util.Scanner; import java.util.HashMap; import java.util.Map; import java.text.DecimalFormat; public class Main{ Scanner input=new Scanner(System.in); public static void main(String[] args) { UnionPay unionpay=new UnionPay(); Bank bank=new Bank(); User user=new User(); Account account=new Account(); Bankcard bankcard=new Bankcard(); ATM atm=new ATM(); Scanner input=new Scanner(System.in); StringBuilder sb = new StringBuilder(); String b=input.nextLine(); while(!b.equals("#")) { sb.append(b).append("\n"); b=input.nextLine(); } String ss= String.valueOf(sb); String rows[]=ss.split("\n"); for(int i=0;i<rows.length;i++) { String dan[]=rows[i].split(" "); bankcard.put(i,rows); bankcard.check(user,dan.length); if(bankcard.flag!=0) System.exit(0); else { if(dan.length!=1) atm.showcz(bankcard,bank); else atm.showmoney(bankcard); } } } } class UnionPay{ Map<String, String> yl = new HashMap<String, String>();{ this.yl.put("中国工商银行","银联"); this.yl.put("中国建设银行","银联"); this.yl.put("中国农业银行","银联"); } } class Bank extends UnionPay{ Map<String, String> jsyh = new HashMap<String, String>();{ this.jsyh.put("杨过","中国建设银行"); this.jsyh.put("郭靖","中国建设银行"); this.jsyh.put("张三丰","中国建设银行"); this.jsyh.put("张无忌","中国工商银行"); this.jsyh.put("韦小宝","中国工商银行"); this.jsyh.put("令狐冲","中国工商银行"); this.jsyh.put("乔峰","中国农业银行"); this.jsyh.put("洪七公","中国农业银行"); } Map<String, String> kind = new HashMap<String, String>();{ this.kind.put("6217000010041315709","借记账号"); this.kind.put("6217000010041315715","借记账号"); this.kind.put("6217000010041315718","借记账号"); this.kind.put("6217000010051320007","借记账号"); this.kind.put("6222081502001312389","借记账号"); this.kind.put("6222081502001312390","借记账号"); this.kind.put("6222081502001312399","借记账号"); this.kind.put("6222081502001312400","借记账号"); this.kind.put("6222081502051320785","借记账号"); this.kind.put("6222081502051320786","借记账号"); this.kind.put("6640000010045442002","贷记账号"); this.kind.put("6640000010045442003","贷记账号"); this.kind.put("6640000010045441009","贷记账号"); this.kind.put("6630000010033431001","贷记账号"); this.kind.put("6630000010033431008","贷记账号"); } Map<String, String> sxf = new HashMap<String, String>();{ this.sxf.put("中国建设银行","0.02"); this.sxf.put("中国工商银行","0.03"); this.sxf.put("中国农业银行","0.04"); } } class User extends Bank{ Map<String, String> yangguo = new HashMap<String, String>();{ this.yangguo.put("6217000010041315709","杨过"); this.yangguo.put("6217000010041315715","杨过"); this.yangguo.put("6217000010041315718","杨过"); this.yangguo.put("6217000010051320007","郭靖"); this.yangguo.put("6222081502001312389","张无忌"); this.yangguo.put("6222081502001312390","张无忌"); this.yangguo.put("6222081502001312399","张无忌"); this.yangguo.put("6222081502001312400","张无忌"); this.yangguo.put("6222081502051320785","韦小宝"); this.yangguo.put("6222081502051320786","韦小宝"); this.yangguo.put("6640000010045442002","张三丰"); this.yangguo.put("6640000010045442003","张三丰"); this.yangguo.put("6640000010045441009","令狐冲"); this.yangguo.put("6630000010033431001","乔峰"); this.yangguo.put("6630000010033431008","洪七公"); } } class ATM extends User{ Map<String, String> giao = new HashMap<String, String>();{ this.giao.put("01","中国建设银行"); this.giao.put("02","中国建设银行"); this.giao.put("03","中国建设银行"); this.giao.put("04","中国建设银行"); this.giao.put("05","中国工商银行"); this.giao.put("06","中国工商银行"); this.giao.put("07","中国农业银行"); this.giao.put("08","中国农业银行"); this.giao.put("09","中国农业银行"); this.giao.put("10","中国农业银行"); this.giao.put("11","中国农业银行"); } DecimalFormat df2 = new DecimalFormat("####0.00"); public void showcz(Bankcard bankcard,Bank bank) { if(bankcard.money>0) { System.out.println("业务:取款 "+super.yangguo.get(bankcard.card)+"在"+giao.get(bankcard.bh)+"的"+bankcard.bh+"号ATM机上取款¥"+df2.format(bankcard.money)); System.out.println("当前余额为¥"+df2.format(bankcard.yue())); } else { System.out.println("业务:存款 "+super.yangguo.get(bankcard.card)+"在"+giao.get(bankcard.bh)+"的"+bankcard.bh+"号ATM机上存款¥"+df2.format(-bankcard.money)); System.out.println("当前余额为¥"+df2.format(bankcard.yue())); } } public void showmoney(Bankcard bankcard) { System.out.println("业务:查询余额 "+"¥"+df2.format(bankcard.yue())); } } class Account{ } class Bankcard extends ATM{ Map<String, String> qian = new HashMap<String, String>();{ this.qian.put("杨过","1"); this.qian.put("郭靖","2"); this.qian.put("张无忌","3"); this.qian.put("韦小宝","4"); this.qian.put("张三丰","5"); this.qian.put("令狐冲","6"); this.qian.put("乔峰","7"); this.qian.put("洪七公","8"); } String card; String mima; String bh; double money; double[] startmoney={10000.00,10000.00,10000.00,10000.00,10000.00,10000.00,10000.00,10000.00}; int flag=0; public void put(int i,String rows[]) { rows[i]=rows[i].replaceAll("\\s+", " "); String dan[]=rows[i].split(" "); int length=dan.length; if(length!=1) { card=dan[0]; mima=dan[1]; bh=dan[2]; money=Double.parseDouble(dan[3]); } else { card=dan[0]; mima="88888888"; bh="01"; money=0; } } public void check(User user,int length) { if(user.yangguo.get(card)==null) { System.out.println("Sorry,this card does not exist."); flag++; } else if(!mima.equals("88888888")) { System.out.println("Sorry,your password is wrong."); flag++; } else if(!bh.equals("11")&&!bh.equals("10")&&!bh.equals("09")&&!bh.equals("08")&&!bh.equals("07")&&!bh.equals("06")&&!bh.equals("05")&&!bh.equals("04")&&!bh.equals("03")&&!bh.equals("02")&&!bh.equals("01")) { System.out.println("Sorry,the ATM's id is wrong."); flag++; } else if((kind.get(card).equals("借记账号")&&money>startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])||(kind.get(card).equals("借记账号")&&sfkh()&&money==startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])||(yue1(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1],money)<-50000)) { System.out.println("Sorry,your account balance is insufficient."); flag++; } else flag=0; } public double yue() { if(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<money&&startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]>0) { startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-(money-startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1])*0.05; } if(startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<money&&startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]<=0) { startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money*0.05; } if(sfkh()) startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money-money*Double.parseDouble(sxf.get(giao.get(bh))); else startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]=startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]-money; return startmoney[Integer.valueOf(qian.get(yangguo.get(card)))-1]; } public double yue1(double a,double money1) { if(a<money1&&a>0) { a=a-(money1-a)*0.05; } if(a<money1&&a<=0) { a=a-money1*0.05; } if(sfkh()) a=a-money1-money1*Double.parseDouble(sxf.get(giao.get(bh))); else a=a-money1; return a; } public boolean sfkh() { if(jsyh.get(yangguo.get(card)).equals(giao.get(bh))) return false; else return true; } }
3、 踩坑心得
1、题目集7:for(int i = 0,j = 0,k = 0,l=0;i+k+j+l<cz.size();) {
switch(cz.get(i+j+k+l)) {
case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;
case 2:System.out.print("Rectangle:"+df2.format(area2.get(j))+" ");j++;break;
case 3:System.out.print("Triangle:"+df2.format(area3.get(k))+" ");k++;break;
case 4:System.out.print("Trapezoid:"+df2.format(area4.get(l))+" ");l++;break;
}
}
这样输出才是对的,但是我之前是这样写的:
for(int i = 0,;i <cz.size();) {
switch(cz.get(i+j+k+l)) {
case 1:System.out.print("Circle:"+df2.format(area1.get(i))+" ");i++;break;
case 2:System.out.print("Rectangle:"+df2.format(area2.get(i))+" ");i++;break;
case 3:System.out.print("Triangle:"+df2.format(area3.get(i))+" ");i++;break;
case 4:System.out.print("Trapezoid:"+df2.format(area4.get(i))+" ");i++;break;
}
}
这就是犯了把四个数组看成一个数组的错误,这样就得不到正确答案。
2、题目集8、9:余额没有用多个10000元,导致取钱全是取一张卡里面的钱
4、 改进建议
题目集7:这题给的类图太详细了,就连主方法的模板都给出了,我觉得没必要这样,这样我感觉大部分人的代码都比较相似,学生会缺乏创新。
5、 总结
这三次题目集虽然题量少,但是写起来也花了挺多时间,也学到了很多,现在我可以更好地运用正则表达式来分割数据,这是题目集8和9都要用到的;还学到了如何用map集合来处理数据;还有一些课外的,但是在现实生活中很常见的知识,比如ATM机;由于这几道题目都要设计类,于是我现在对类的理解进一步深刻了,这就是Java面向对象的魅力,将一个大问题逐步分割成互相关联的小问题。但是我对接口的运用还不是很好,还有我不知道接口的用处在哪;希望以后能有更多与现实生活相关的题目。
标签:总结性,题目,get,System,blog,yangguo,put,new,out 来源: https://www.cnblogs.com/0108061X/p/14897702.html