wang BLOG-2
作者:互联网
前言
经过这四周的学习学习了封装、多态、继承、异常处理和文本、抽象类和接口。知识点有点冗杂、繁多,学习过后使用比较困难有很多漏洞。题量有点多代码压力大,使用软件缺少剪切板使用耗时久,题目难度大设计并且实现功能复杂不容易实现。
农夫过河问题
设计与分析
农夫过河问题:将之前的代码进行如下改进: 为之前的类添加合适的父类。 为父类添加适合的属性和方法。并以此为基础修改原有的类,使之与添加的类构成继承关系。 使用多态改进整个代码,提高代码的复用性。
public class Animal{ public boolean crossRiver=false; public boolean isAlive =true; private String name=""; public Animal(){ } public void setname(String name){ this.name=name; } public String getname(){ return name; } public void showStatus(){ System.out.println(this.name); } public void eatanimal(Animal a){ int i=0; } public void eatplant(Plant a){ int i=0; } }
这是我添加的父类这个父类提供很多种方法使得子类能够继承并采用重写而不是重载的方法实现定义父类的一个引用完成子类的对象的申请完成多态的使用。父类定义的引用只能使用父类中存在大的方法申请的子类对象对所需要使用的父类方法进行重写完成多态的使用提升代码的复用性。另外的父类就不展示了。
设计类showStatus方法完成对格式输出,子类重写完成格式输出。设计eatanimal类避免eat方法有多个对象使用,子类会进行该方法的重载从而避免对父类方法使用而不是子类的重写方法的使用,将eat方法分为eatanimal方法和eatplant方法实现多态的使用而不单单只有继承,当然吃这个功能的使用最好用接口来完成更加合适。
踩坑心得
多态的使用有点不熟练向上转型和向下转型 例如:A a =new B();B a1=(B)a;\\B继承A类
向下转型主要是如上面A a=new B();使用a对象方法只能使用class A里的方法,子类重写就可以调用子类的重写后的代码,而重载就不可以只能使用父类的方法。
这个坑踩了很久对多态的使用生疏。
改进建议
对于功能泛用性功能采用接口,对于其他功能,子类继承父类功能,对父类方法最好进行重写,这样更好,完成多肽的使用,实现代码的复用性。
把大象装进冰箱
把大象装进冰箱这题包含了很多知识的使用
设计与分析
先把输入功能代码
String regex = "Put\\s+the\\s+(\\w+)\\s+(\\w+)\\s+into\\s+the\\s+(\\w+)\\s+(\\w+)"; Pattern pattern = Pattern.compile(regex); String tmp; //接收命令串,格式:Put the动物类名动物名字 into the 电器类名电器名字 //命令串中的有名字都不能使用中文 while (true) { System. out.println("请按格式输入命令串: quit退出"); tmp = input.nextLine(); if (tmp.equals( "quit")) break; Matcher mathcer = pattern.matcher(tmp); if (mathcer.find()) { String animalClass = mathcer.group(1); String animalName = mathcer.group(2); String electricClass = mathcer.group( 3); String electricName = mathcer.group(4); Electric electric = getElectric(electricList,electricClass, electricName); Animal animal=getAnimal(electricList,animalClass, animalName);
主要是按照类图来完成类的设计和功能设计两个父类电器类和动物类分为两大类在设计大象狮子等子类来继承父类。
踩坑心得
对继承的使用有点不规范继承实现出现了问题,数组链表的使用陌生。
四边形类的设计以及相关功能的实现
判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。
设计与分析
将建立的点坐标对象,通过参传参的方式传达该方法里,可以判断,将四边形分为两个三角形,求取面积,将第一个点和第三个点连起来,分为两个三角形,将第二个点和第四个点连起来,也分为两个三角形,判断两个三角形相加是否相等,如果相等,这是凸四边形,否则是凹四边形。这个方法还是比较好实现判断凹凸四边形。当然还有另外的方法例如:
public void judgeAotu(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ double z1, z2, z3, z4; z1 = ((x2 - x1) * (y4 - y1) - (x4 - x1) * (y2 - y1)); z2 = ((x4 - x1) * (y3 - y1) - (x3 - x1) * (y4 - y1)); z3 = ((x4 - x2) * (y3 - y2) - (x3 - x2) * (y4 - y2)); z4 = ((x3 - x2) * (y1 - y2) - (x1 - x2) * (y3 - y2)); if(z1*z2*z3*z4>=0) System.out.print("true "); else System.out.print("false "); }
判断四个点是否构成四边形这个功能还是比较难实现我采用了以下的方法
如:
public void judgeQuadrilateral(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ if(((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))&&((y3-y1)*(x4-x1)!=(y4-y1)*(x3-x1))&&((y3-y2)*(x4-x2)!=(y4-y2)*(x3-x2))&&((y3-y1)*(x4-x2)!=(y4-y2)*(x3-x1))) { int i=0; } else { System.out.print("not a quadrilateral"); System.exit(0); } }
这个判断还是非常冗杂的,对于判断是否为四边形不够熟练,没能设计更好的判断方法。
输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。
这个要求是很难实现的,主要是两点之间连成的线段,有区间判定,可能第一条直线和构成三角形或四边形的边的延长线要交点,这点是不好判断的。所以这个功能的实现,要添加很多条件。还有,这个直线与三角形或四边形相交,分割成两部分的面积,分割后的图形是不知道的,对分割后的图形求面积的实现很困难。
踩坑心得
对于判断四边形设计出很多不符合要求判断不合理的四边形,对于其他功能造成了很大的影响。
改进建议
将点坐标的对象完成一个数组链表可以减少很多重复的操作。
期中考试三道题目
第一道
设计与分析
本题主要按照类图设计来完成要求的实现,有对输入的要求完成要求即可
首先,要完成对两个类的设计,point和line,line中的方法,会通过传参的方式,将point类对象,传进去完成线的构造,要建立一个点,获取它的xy坐标,设计有返回值的,获取xy坐标,设计一个,展示的方法,将该点的坐标按格式输出。再完成线的构造,线的构造,就是获取两个点。在使用静态方法sqrt power完成,求取两个点的距离,这也就是求线长度的方法,再建立一种颜色,string,主函数获得输入,通过主函数传参的方法建立,再设计一个获取颜色的方法,最后,按照格式输出。
第二道
设计与分析
本题主要将第一题联系起来,定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。本题主要是抽象类的构造,和声明一个抽象方法,再设计一个plane类,然后继承该方法,point line plane类继承抽象类element再分别对point line plane 的display进行重写。
public static void main (String[] args) { Scanner input = new Scanner(System.in); double x1=input.nextDouble(); double y1=input.nextDouble(); double x2=input.nextDouble(); double y2=input.nextDouble(); String color=input.next(); Element point1=new Point(x1,y1); Element point2=new Point(x2,y2); Line line1=new Line((Point)point1,(Point)point2); Element plane1=new Plane(color); line1.setColor(color); point1.display(); point2.display(); line1.display(); plane1.display(); }
第三道
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
本题不会使用泛型类对于容器类的设计与构造不知如何下手。要实现add方法和delete方法和遍历方法主要是对于arraylist数组链表的使用对它进行一部分重写。
pta 大作业四
设计一个银行业务类
题目要求设计一个银行类完成创建用户、存款、取款等方法,同时创建时,要完成用户名和密码的创建,在存款或取款的同时,要核对用户名和密码是否对应,存款要添加他存了多少的金额,取款要对应减少他,他存了多少的金额。取款时,存款注意他的金额够不够。
import java.util.Scanner; public class Main{ public static void main (String[] args) { Scanner input = new Scanner(System.in); String name=input.next(); String password=input.next(); String password1=input.next(); double balance2=input.nextDouble(); String password2=input.next(); double balance3=input.nextDouble(); String password3=input.next(); double balance4=input.nextDouble(); String password4=input.next(); double balance5=input.nextDouble(); BankBusiness.welcome(); BankBusiness account =new BankBusiness(name,password); account.deposit(password1,balance2); account.withdraw(password2,balance3); account.withdraw(password3,balance4); account.withdraw(password4,balance5); BankBusiness.welcomeNext(); } } class BankBusiness{ public static String bankName="中国银行"; private String name; private String password; private double balance; public static void welcome(){ System.out.println(bankName+"欢迎您的到来!"); } public static void welcomeNext(){ System.out.print("请收好您的证件和物品,欢迎您下次光临!"); } public BankBusiness(String name,String password){ this.name=name; this.password=password; this.balance=0; } public void deposit(String password,double balance6){ double a=this.balance; if(this.password.equals(password)==true) { //this.ba1ance=this.balance+balance6; a=a+balance6; this.balance=a; System.out.println("您的余额有"+a+"元。"); } else System.out.println("您的密码错误!"); } public void withdraw(String password,double balance1){ double b=this.balance; if(this.password.equals(password)==true) { if(b>=balance1) { //this.balance=this.banlance-banlance1; b=b-balance1; this.balance=b; System.out.println("请取走钞票,您的余额还有"+b+"元。"); } else System.out.println("您的余额不足!"); } else System.out.println("您的密码错误!"); } }
踩坑心得
对于静态方法的使用是不需要对象直接类.静态方法的不了解,和本题的格式化输出的要求。
sdut-String-2 识蛟龙号载人深潜,立科技报国志
设计与要求
import java.util.Scanner; import java.util.Arrays; public class Main{ public static void main (String[] args) { Scanner input = new Scanner(System.in); while(true) { String result=input.nextLine(); if(result.equals("end")) break; String[] s=result.split("\\D+"); int sum=0; for(int i=0;i<s.length;i++) { if(!s[i].equals("")) { int a=Integer.parseInt(s[i]); sum=sum+a; } } System.out.println(sum); } } }
通过正则表达,对输入内容进行筛选,对筛选出的几个数分隔。在通过统计它构成的数组的长度,对他进行相加。完成题目的要求对出现的数字进行相加。
踩坑心得
对于正则表达式的使用有点不好,会使用不满足需求。
五.总结
在第二阶段的学习中。对于类以及对象有了更深的了解,并在基础的语法下可以使用继承、多态、抽象类、包装类进行编写代码。
1.多态的使用有点问题,对于代码的复用性不是很好。
2.封装的作用域等。
3.对于多边形的判定不了解,不知怎样使用代码去判断。
老师教学时建议多注意网络状况。
标签:wang,double,System,BLOG,四边形,input,public,String 来源: https://www.cnblogs.com/wangSKJ/p/16250330.html