第三次博客作业

第三次博客作业

一、前言

第七次题目集知识点涉及:

类的封装与设计、类的无参构造、类的有参构造、类的继承、重写父类、多态性使用方法以Comparable 接口的应用。共有两道题,其中第二道题与第一道题类似,只是要求稍微有些许不同。

第八次题目集知识点涉及:

类的封装与设计、类的无参构造、类的有参构造、类的继承、重写父类、多态性使用方法以及接口的应用。共有一道题,设计ATM机的存取款功能,给定用户,用户存取款功能。题目具有一定难度

第九次题目集知识点涉及:

类的封装与设计、类的无参构造、类的有参构造、类的继承、重写父类、多态性使用方法以及接口的应用。共有一道题,与第八次题目一样也是设计一个ATM存储款功能,但是增加了借记卡和信用卡,部分用户可以透支取款,然后跨行取款并且有相应的手续费。

二、设计与分析:

题目集7(7-1)、(7-2)递进式设计:

7-1的任务是制作卡片排序游戏,卡片的形状有四种,分别是圆形、矩形、三角形及梯形,程序输入各个图形代表的数字然后输入各个图形相关的参数,根据输入的图形以及图形的参数,程序输出不同的值。如果图形数量非法或者图形属性值非法,输出“Wrong Format”,如果输入合法,输出各个图形的面积,然后按照排序输出并输出所有图形的面积总和。
类图的设计如下:

程序的主要方法有:

排序方法:

各个图形的继承父类的代码过长,此处不一一列出。
7-2的任务与7-1的任务有关联,但是规则有改变。沿袭作业 7-1,本次作业主要对卡片(Card)进行分组游戏,其规则为随机发放一些卡片给学生,
卡片仍然分为四种形状:圆形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),
并给出各种卡片的相应参数,要求学生首先根据卡片类型将所有卡片进行分组(一个类型分为一组,
所以最多四组),然后能够对每组内的卡片根据面积值从大到小进行排序,同时求出该组内所有卡片
的面积之和,最后求出每组卡片面积之和中的最大值。
实验指导要求对输入的图形类型进行分组输出,如下图所示:
此外还需要实现的功能有:
1、对各图形信息进行输入并输出。
2、输入数据的正确性校验。
3、对每组内的图形按照面积值降序排序并输出。
4、求出每组内图形面积的总和。
5、求出所有组的面积总和的最大值并输出。
输入输出规则与7-1大致相同,并无大的区别,因此不作详细分析。
下面给出部分实现代码:
fenge()方法,实现对图形的分类:
`public void fenge(){
ArrayList list1=new ArrayList<>();
ArrayList list2=new ArrayList<>();
ArrayListlist3=new ArrayList<>();
ArrayListlist4=new ArrayList<>();
System.out.println("The Separated List:");
for(int i=0;i<cardList.size();i++) {
if (cardList.get(i).getShape().getShapeName() == "Circle") {
list1.add(cardList.get(i).getShape().getArea());
}
if (cardList.get(i).getShape().getShapeName() == "Rectangle") {
list2.add(cardList.get(i).getShape().getArea());
}
if (cardList.get(i).getShape().getShapeName() == "Triangle") {
list3.add(cardList.get(i).getShape().getArea());
}
if (cardList.get(i).getShape().getShapeName() == "Trapezoid") {
list4.add(cardList.get(i).getShape().getArea());
}}
System.out.print("[");
for (int i = 0; i < list1.size(); i++) {
System.out.printf("Circle:%.2f ",list1.get(i));
}
System.out.print("]");

        System.out.print("[");
        for (int i = 0; i < list2.size(); i++) {
            System.out.printf("Rectangle:%.2f ",list2.get(i));
        }
        System.out.print("]");
        System.out.print("[");
        for (int i = 0; i < list3.size(); i++) {
            System.out.printf("Triangle:%.2f ",list3.get(i));
        }
        System.out.print("]");
    
        System.out.print("[");
        for (int i = 0; i < list4.size(); i++) {
            System.out.printf("Trapezoid:%.2f ",list4.get(i));
        }
        System.out.print("]");
    
    System.out.println("");
    Collections.sort(list1, Collections.reverseOrder());Collections.sort(list2, Collections.reverseOrder());Collections.sort(list3, Collections.reverseOrder());Collections.sort(list4, Collections.reverseOrder());
    System.out.println("The Separated sorted List:");
        System.out.print("[");
        for (int i = 0; i < list1.size(); i++) {
            System.out.printf("Circle:%.2f ",list1.get(i));
        }
        System.out.print("]");
        System.out.print("[");
        for (int i = 0; i < list2.size(); i++) {
            System.out.printf("Rectangle:%.2f ",list2.get(i));
        }System.out.print("]");
        System.out.print("[");
        for (int i = 0; i < list3.size(); i++) {
            System.out.printf("Triangle:%.2f ",list3.get(i));
        }System.out.print("]");

        System.out.print("[");
        for (int i = 0; i < list4.size(); i++) {
            System.out.printf("Trapezoid:%.2f ",list4.get(i));
        }System.out.print("]");
    System.out.println("");
  double a=0;double b=0;double c=0;double d=0;int i;double t=0;
    for(i=0;i<list1.size();i++){
        a=a+list1.get(i);}
            for(i=0;i<list2.size();i++){
        b=b+list2.get(i);}
            for(i=0;i<list3.size();i++){
        c=c+list3.get(i);}
            for(i=0;i<list4.size();i++){
        d=d+list4.get(i);}
   double x[]={a,b,c,d};for(i=0;i<4;i++){
       for(int j=0;j<3-i;j++){
           if(x[j]>x[j+1]){
               t=x[j];x[j]=x[j+1];x[j+1]=t;
           }}}
    System.out.printf("The max area:%.2f",x[3]);
}`

输出方法:
public void showResult() { System.out.println("The original list:"); ArrayList<String> list = new ArrayList<>(); System.out.print("[");for (int i = 0; i < cardList.size(); i++) { list.add(cardList.get(i).getShape().getShapeName()+":"+String.format("%.2f",cardList.get(i).getShape().getArea())+" ");System.out.print(list.get(i)); } System.out.println("]"); }
题目7-1与7-2的代码分析:

题目集8:

题目集8是需要编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。在实验指导书中给出了用户的详细信息:

但是由于在一开始没有设计好类的框架,因此在后期出现了积重难返的问题,部分测试点无法通过,如果要修改代码就需要推倒重来,在时间上来不及,因此最终代码存在漏洞,有两个测试点还没有通过:

程序的主要设计逻辑如下:

在Main方法中先定义好所有的用户详细信息,如果有用户有两张卡,就需要建立两个该用户信息,但是该用户的余额进行绑定。通过Getshuju类来进行所有的处理。其中的部分判断逻辑如代码所示:

if(!password.equals("88888888")) {
				{
					if(cardnumber.equals("6217000010041315709")||cardnumber.equals("6217000010041315715")) {
						System.out.print("¥"+String.format("%.2f", yangguo1.balance));
						System.exit(0);
					}
					else if(cardnumber.equals("6217000010041315718")) {
						System.out.print("¥"+String.format("%.2f", yangguo3.balance));
						System.exit(0);
					}
if(money<=yangguo1.balance) {
							//取款金额小于等于账户余额
							//进行取款操作
							yangguo1.balance = yangguo1.balance - money;
							yangguo2.balance = yangguo1.balance - money;
							//杨过卡1卡2金额保持一致
							System.out.println(yangguo1.Username+"在"+yangguo1.Bankname+"的"+ATMnum+"号ATM机上取款¥"+String.format("%.2f", money));
							System.out.println("当前余额为¥"+String.format("%.2f", yangguo1.balance));
				
						}
						else {
							//存款金额大于账户余额
							System.out.print("Sorry,your account balance is insufficient.");
							System.exit(0);
						}
					}
					else {
						//存款
						yangguo1.balance = yangguo1.balance - money;
						yangguo2.balance = yangguo1.balance - money;
						
						System.out.println(yangguo1.Username+"在"+yangguo1.Bankname+"的"+ATMnum+"号ATM机上存款¥"+String.format("%.2f", -money));
						System.out.println("当前余额为¥"+String.format("%.2f", yangguo1.balance));
						
					}

题目集8代码分析:

题目集9:编写一个银行 ATM 机的模拟程序,能够完成用户的取款以及查询余额功能,虽然功能类似,但是题集9相较于题集8增加了新的要求,银行账户分为了借记账户和贷记账户两种,借记账户不能透支取款,而贷记账户可以透支取款,同时还有手续费的计算。

详细的银行表和用户表如下表所示:

设计逻辑如下:

关键类的初始化:

输入的拆分:

while(!hunhe.equals("#")) {
			String[] shuju=hunhe.split("\\s+");
			cardnumber = shuju[0];//卡号
			if(shuju.length != 1) {
				password = shuju[1];//密码
				ATMnum = shuju[2];//ATM编号
				money = Double.parseDouble(shuju[3]);//金额,大于0代表取款,小于0或等于0代表存款
			}

查询余额的部分代码:

if(shuju.length == 1) {
				//查询余额
				if(cardnumber.equals("6217000010041315709")||cardnumber.equals("6217000010041315715")) {
					System.out.print(String.format("业务:查询余额 "+"¥"+"%.2f", yangguo1.balance));
					System.exit(0);
				}
				else if(cardnumber.equals("6217000010041315718")) {
					System.out.print(String.format("业务:查询余额 "+"¥"+"%.2f", yangguo3.balance));
					System.exit(0);
				}

判断是谁的卡:

public static User whoCard(User yangguo1,User yangguo2,User yangguo3,User guojing1,User zhangwuji1,User zhangwuji2,
				User zhangwuji3,User zhangwuji4,User weixiaobao1,User weixiaobao2,
				User zhangsanfeng1,User zhangsanfeng2,User linghuchong1,
				User qiaofeng1,User hongqigong1,User cuowu,String cardnumber) {
			
			if(cardnumber.equals("6217000010041315709")||cardnumber.equals("6217000010041315715") ) {
				//杨过的1,2张卡
				return yangguo1;
			}
			else if(cardnumber.equals( "6217000010041315718")) {
				//杨过的3张卡
				return yangguo3;
			}
......

判断密码是否正确:

public static boolean mima(String password) {
		
		if(password.equals("88888888")) {
			return true;
		}
		else {
			return false;
		}
	}
	

判断是否跨行:

public static int kuahan(User member,String ATMnum) {
		//判断是否跨行,没跨行,返回0,跨到中国建设银行返回1,
		//跨到中国工商银行返回2,跨到中国农业银行返回3
		//atm机不存在则返回4
		if(member.Bankname.equals("中国建设银行")) {
			if(ATMnum.equals("01")||ATMnum.equals("02")||ATMnum.equals("03")||ATMnum.equals("04")) {
				return 0;
			}
			else if(ATMnum.equals("05")||ATMnum.equals("06")){
				return 2;
			}
			else if(ATMnum.equals("07")||ATMnum.equals("08")||ATMnum.equals("09")||ATMnum.equals("10")||ATMnum.equals("11")) {
				return 3;
			}
			else
				return 4;
		}
		else if(member.Bankname.equals("中国工商银行")) {
			if(ATMnum.equals("05")||ATMnum.equals("06")) {
				return 0;
			}
			else if(ATMnum.equals("01")||ATMnum.equals("02")||ATMnum.equals("03")||ATMnum.equals("04")){
				return 1;
			}
			else if(ATMnum.equals("07")||ATMnum.equals("08")||ATMnum.equals("09")||ATMnum.equals("10")||ATMnum.equals("11")) {
				return 3;
			}
			else
				return 4;
		}
......

题集9代码分析:

改进建议:

第八第九次试验的代码量偏大,程序要求实现的功能较为复杂,因此过测试点的时候不能判断出具体出了什么问题,有时候明明和题目要求输出的东西是一样的,但是就是通过不了那个测试点,这样就会花费大量的时间和精力去排查bug,题目集可以给出更加详细的测试点。

总结:

由于后期的题目需要实现的功能较多,程序复杂性比刚开始的几次实验复杂许多,因此代码长度会比较长,达到了五六百行甚至七八九百行,尤其是第八第九次,但是这两次的代码长度限制控制在了22kb,这就需要进行代码长度的优化,这对代码优化能力的提升十分有帮助。
通过这三次的题目集,对接口与多态继承有了更加深入的了解,用面向对象的思想去思考问题。虽然有些题目最终无法通过全部的测试点,但是从写题目的过程中,加深了自己对各个知识点的理解,未来能够将这些更好地运用。

正则表达式是一个大的命题,掌握好正则表达式远远不是这几题就能够熟练掌握了,这需要我课后查找更多的资料去进行学习。正则表达式是一个很好的工具,能够让我们解决一些实际问题更加方便,未来我会针对正则表达式进行一些深入学习。

要学会用面向对象的思维去思考问题。将问题模块化,采用合适的算法,对其逐一解决。

posted @ 2021-12-18 18:14  就想睡懒觉  阅读(88)  评论(0)    收藏  举报