面向对象程序设计(2)
面向对象程序设计(2)
一:前言
(1):知识点
1:正则表达式
什么是正则表达式:
- 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
- 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式的三大类:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException类:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
字符说明:
2:动态数组
动态数组:Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList。
(1): 什么是数组
同类数据元素的集合,在计算机中以连续的地址存储,编译时确定长度,无法改变。
(2):什么是动态数组
数据结构中顺序表的物理实现,同类数据元素的集合,在计算机中以连续的地址存储,大小在创建时决定,但是可以改变。
(3): 为什么使用动态数组
支持随机访问,查询速度快。但是插入和删除都需要移动元素,比起链表开销较大。如:java集合类中的ArrayList Vector等
3:封装继承多态
Java的三大特性:继承封装多态
(1):封装
封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
什么是封装:
- 将类的某些信息隐藏在类的内部,不允许外部程序进行直接的访问调用。
- 通过该类提供的方法来实现对隐藏信息的操作和访问。
- 隐藏对象的信息。
- 留出访问的对外接口
封装的特点:
- 对成员变量实行更准确的控制。
- 封装可以隐藏内部程序实现的细节。
- 良好的封装能够减少代码之间的耦合度。
- 外部成员无法修改已封装好的程序代码。
- 方便数据检查,有利于保护对象信息的完整性,同时也提高程序的安全性。
- 便于修改,体高代码的可维护性。
封装的使用:
-
使用private修饰符,表示最小的访问权限。
-
对成员变量的访问,统一提供setXXX,getXXX方法。
(2):继承
什么是继承:
-
使用private修饰符,表示最小的访问权限。
-
对成员变量的访问,统一提供setXXX,getXXX方法。
继承的特点:
提高代码复用性。
父类的属性方法可以用于子类。
可以轻松的定义子类。
使设计应用程序变得简单。
继承的注意事项:
只支持单继承,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。
子类可以拥有父类的属性和方法。
子类可以拥有自己的属性和方法。
子类可以重写覆盖父类的方法。
继承的使用:
1,在父子类关系继承中,如果成员变量重名,则创建子类对象时,访问有两种方式。
a,直接通过子类对象访问成员变量 等号左边是谁,就优先使用谁,如果没有就向上找。
b,间接通过成员方法访问成员变量该方法属于谁,谁就优先使用,如果没有就向上找。
2,同理:
成员方法也是一样的,创建的对象是谁,就优先使用谁,如果没有则直接向上找。
注意事项:
无论是成员变量还是成员方法,如果没有都是向上父类中查找,绝对不会向下查找子类的。
3,在继承关系中,关于成员变量的使用:
局部成员变量:直接使用
本类成员变量:this.成员变量
父类成员变量:super.父类成员变量
重写和重载:
重写的规则:
1,参数列表必须与被重写方法相同。
2,访问权限不能比父类中被重写的方法的访问权限更低(public>protected>(default)>private)。
3,父类成员的方法只能被它的子类重写。
4,被final修饰的方法不能被重写。
5,构造方法不能
重载的规则:
1,被重载的方法必须改变参数列表(参数个数或者类型不一样)。
2,被重载的方法可以改变返回类型。
3,被重载的方法可以改变访问修饰符。
(3):多态
什么是多态:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态的特点:
1,消除类型之间的耦合关系,实现低耦合。
2,灵活性。
3,可扩充性。
4,可替换性。
4:容器
为什么要引入Java容器?
我们知道,如果定义一个int数组,需要一开始就要制定它的大小。在一些情况下,我们根本不知道它的长度是多少,开辟很大的长度会导致空间浪费。
此外,数组还有很多缺点,例如数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。获取数据中实际元素的个数的需求,数组没有现成的属性或方
法可用。数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
为了数组能够更灵活的应用,提出了Java容器的概念。
Java容器基本概念
Java容器类库是用来保存对象的,他有两种不同的概念:
Collection,独立元素的序列,这些元素都服从一条或多条规则。List、Set以及Queue都是Collection的一种,List必须按照顺序保存元素,而Set不能有重复元素,Queue需要按照
排队规则来确定对象的顺序。
Map,Map是键值对类型,允许用户通过键来查找对象。Hash表允许我们使用另一个对象来查找某个对象。
容器接口:
Collection接口
Collection是最基本的集合接口。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”。所有实现Collection接口的类都必须提供两个标准的构
造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构
造函数允许用户复制一个Collection。
Map接口
Map也是一个接口,一个map不能包含重复的key,每个key只能映射唯一一个value。Map接口是用来取代Dictionary抽象类的。Map接口提供三个集合视图,1.key的集合 2.value的集合
3.key-value的集合。map内元素的顺序取决于Iterator的具体实现,获取集合视图其实是获取一个迭代器,实现对遍历元素细节的隐藏。
同样,map的实现类应该提供两个“标准”构造器,一个无参构造器用来创建一个空map,一个只有一个参数,参数类型是map的构造器,用来创建一个新的和传入参数有一样key-value映射
的map。实际上,后者允许复制任何一个map,这仅仅是一个建议,并没有强制要求,因为接口是无法包含构造器的,不过这个建议在JDK被遵守。
如果一个方法的操作是不被支持的,这个方法指定抛出UnsupportedOperationException异常。如果这个操作对map是没有影响的,那么也可以不抛出UnsupportedOperationException异
常。例如,在一个不能被修改的map调用putAll(Map)方法,如果该map的映射是空的,就不要求抛出UnsupportedOperationException异常。
(2):题量和难度
(1):第四次大作业:
①: 获取每一行的数字并且输出这一行数字的总和
难度不算大,获取数字按照循环累加就可以
②:输入多个点坐标,组成四边形和点线,判断他们构成的各种关系以及完成相对应的要求
难度有点大,四边形被线分割成两个部分最难搞,没有实现
③:银行用户存取款相关业务,要进行封装
不算难,实现功能十分简单,就算要封装,也很简单实现功能
(2):期中考试
给你一个类图,按照类图构造对应函数,其中使用到继承和容器
题量不算大,难度也不算大,类图清晰并且实现的功能不复杂
(3):第五次大作业
五边形的点线面系列,甚至有面和面的关系以及切割成两部分
题量很少,甚至算是只有一题,但是难度我觉得十分高,线切割面积已经很难了,面切割面积,太复杂已经不知道从哪里开始,毫无头绪
2:设计与分析
1.第四/五次大作业
一:获取每一行数字之和
(1):采用str中的split的方法以及正则表达式,获取数字,不断进行累加,最终输出,从而获取结果
没有什么复杂的功能,整个代码就是一路直接下来,只有两个小循环,很
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Line l = new Line(); Point a = new Point(); Point b = new Point(); double x1,x2,y1,y2; String str; x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); str = input.next(); l.setColor(str); a.setX(x1); a.setY(y1); l.setPoint1(a); b.setX(x2); b.setY(y2); l.setPoint2(b); l.display(); input.close(); } } class Point { private double x; private double y; public Point() { } public Point(double x,double y) { this.x = x; this.y = y; } public double getX() { return this.x; } public void setX(double x) { if(x<=200&&x>0) this.x = x; else { System.out.println("Wrong Format"); System.exit(0); } } public double getY() { return this.y; } public void setY(double y) { if(y<=200&&y>0) this.y = y; else { System.out.println("Wrong Format"); System.exit(0); } } public void display() { System.out.printf("(%.2f,%.2f)\n",this.x,this.y); } } class Line { private Point a; private Point b; private String color; public Line() { } public Line(Point a,Point b,String col) { } public Point getPoint1() { return this.a; } public void setPoint1(Point point1) { this.a = point1; } public Point getPoint2() { return this.b; } public void setPoint2(Point point2) { this.b = point2; } public String getColor() { return this.color; } public void setColor(String str) { this.color = str; } public double getDistance() { double x1,x2,y1,y2,s; x1 = this.a.getX(); x2 = this.b.getX(); y1 = this.a.getY(); y2 = this.b.getY(); s = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return s; } public void display() { Line l = new Line(); Point a = new Point(); Point b = new Point(); a = this.getPoint1(); System.out.println("The line's color is:"+this.getColor()); System.out.println("The line's begin point's Coordinate is:"); a.display(); b = this.getPoint2(); System.out.println("The line's end point's Coordinate is:"); b.display(); System.out.print("The line's length is:"); System.out.printf("%.2f\n",this.getDistance()); } }
二:四/五边形点线面系列
(1):四边形的点线面系列,之前出现三角形就已经让我头疼了,这次出现的分割面积还是一样让我头疼,并且出现了一个叫做冗余点的东西,这个我到了五边形也没有系统地解决它,
算是这个系列里的一个败笔吧
(2)类与类之间的关系就出现了比较高的复杂度,有依赖,关联,组合,聚合,主要是关联和组合,由于类的种类比较多,选择里面传参主要是数据,然而实现功能分散在各种点线里
面,所以各种里面组合使用频率最高,而其实继承老师也提过,不过我还没有实现
package PTA51; import java.util.Scanner; import java.util.regex.Pattern; public class PTA51 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String str = input.nextLine(); Getnumber number = new Getnumber(); Select sel = new Select(); int select; double[] num = new double[100]; num = number.get_number(str);//获取数字,储存在数组里 select = number.dealnum(num,str); //select = (int)(str.charAt(0)-48); switch(select) { case 1://选择1 sel.select1(num,select); break; case 2: sel.select2(num, select); break; case 3: sel.select3(num,select); break; case 4: sel.select4(num,select); break; case 5: sel.select5(num,select); break; case 6: sel.select6(num, select); break; } input.close(); } } class Getnumber { public Getnumber() { } public boolean ifright(String str) { boolean flag; flag = true; //String pattern = "^[1-5]:(-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?( (-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?)?( (-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?)?( (-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?)?( (-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?)?( (-)?(\\+)?\\d+(.)?(\\d+)?,(-)?(\\+)?\\d+(.)?(\\d+)?( )?)?";//正则表达式,判断格式 String pattern = "^[1-6]:((\\D)?\\d+(.)?(\\d+)?,(\\D)?\\d+(.)?(\\d+)?( )?){1,}";//正则表达式,判断格式 flag = Pattern.matches(pattern,str); if(flag) return true; return false; } // public boolean ifright(String str,int select) // { // int i; // Getnumber g = new Getnumber(); // if(!str.matches("[0-6]:.+")) // return false; // select = g.getrightnum(select)/2; //// for(i = 0;i<select;i++) { // if (!str.matches("(-)?(\\\\+)?\\\\d+(.)?(\\\\d+)?,(-)?(\\\\+)?\\\\d+(.)?(\\\\d+)?( )?")) { // return false; //// } // } // return true; // } //获取数字 public double[] get_number(String s) { int i,k,n,m,count,f; f = 1; m = 1; double num,j; double[] number = new double[100]; for(i = 2;i < s.length();i+=(count+1)) { num = 0.0; j = 0.1; k = 0; n = 1; f = 1; count = 0; for(n = i;n<s.length()&&s.charAt(n)!=','&&s.charAt(n)!=' ';n++) { count++; if(s.charAt(n)=='-') { f = 0; } if(s.charAt(n)!='.'&& k==0&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = s.charAt(n)-48 + num *10;//小数点之前获取整数 } if(s.charAt(n)=='.') { k = 1;//读取到小数点 } if(k == 1&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = num + (s.charAt(n)-48) * j;//获取小数点之后 j = j * 0.1; } } if(f==0) { number[m] = -num; } else number[m] = num; m++; } number[0] = m-1;//第一个数字储存数字个数 return number; } //判断输入数字个数是否正确,数字正确返回“true”,不正确“false” public boolean ifRnum(double m,int n) { int x,y; y = 0; x = (int)m; if(n==1||n==2) y = 10; if(n == 3) y = 14; if(n == 4||n==5) y = 20; if(n==6) y = 12; if(x==y) return true; return false; } //是否有点重合 public boolean isnotsame1(Point a,Point b,Point c,Point d) { boolean f1,f2,f3,f4,f5,f6; f1 = a.pointsame(a, b); f2 = a.pointsame(a, c); f3 = a.pointsame(a, d); f4 = a.pointsame(b, c); f5 = a.pointsame(d, b); f6 = a.pointsame(c, d); if(f1&&f2&&f3&&f4&&f5&&f6) return false; return true; } //处理数字出现各种错误,如果没错返回选择 public int dealnum(double[] num,String str) { Getnumber ber = new Getnumber(); boolean f1,f2,f3; int select; select =(int)(str.charAt(0)-48); f1 = ber.ifright(str); f2 = ber.ifRnum(num[0],select); if(!f1) { System.out.println("Wrong Format"); System.exit(0); } if(!f2) { System.out.println("wrong number of points"); System.exit(0); } return select; } //判断应该出现多少个数字 public int getrightnum(int n) { if(n==1||n==2) return 10; if(n==3) return 14; if(n==4||n==5) return 20; if(n==6) return 12; return 0; } //输出格式处理 public void output(double m) { //出现2.99999999转成2 //**************** int n1,n2; n1 = (int)m; n2 = (int)m+1; if(Math.abs(m-n1)<1e-5||Math.abs(m-n2)<1e-5) System.out.printf("%.1f",m); else System.out.printf("%.3f",m); } //除去重复的点 public Point[] dealsamepoint(double[] num ,int n) { Point[] aa = new Point[20]; Point a = new Point(); int i,j,k; aa = a.sumpoint(num, n); for(i = 0;i < n;i++){ for(j = i+1;j < n;j++){ if(!a.pointsame(aa[i], aa[j])) {//当出现相同点,后面的取代前面的 for(k = j;k<n;k++) { aa[k] = aa[k+1]; j--; } } } } return aa; } //处理冗余点 传回剩余的点 public Point[] dealmore(double[] num ,int n) { Point[] all = new Point[20]; Point a = new Point(); Line l = new Line(); Getnumber g = new Getnumber(); int i,j,k,m; m = g.getrightnum(n)/2; all = a.sumpoint(num, n); all = g.dealsamepoint(num, n); for(i = 0;i<m;i++) { for(j = i+1;j<m;j++) { for(k = j+1;k<m;k++) {//如果在一条直线上 if(!l.ifnotsameline(all[i], all[j], all[k])) { //如果all[j]在x y中间 if((all[k].x>all[j].x&&all[j].x>all[i].x)||(all[k].x<all[j].x&&all[j].x<all[i].x)) { all[j] = all[k]; } all = g.dealsamepoint(num, n);//好像看到这里是空的 } } } } return all; } } class Point { double x; double y; public Point() { } //构造点 public Point(double a,double b) { this.x = a; this.y = b; } //判断点是否重合,重合返回“false”,不重合返回“true” public boolean pointsame(Point a,Point b) { if(a.x==b.x&&a.y==b.y) return false; return true; } //获取了两个点中x坐标更大的点的坐标 public double getxmax(Point a,Point b) { if(a.x>b.x) return a.x; else return b.x; } //获取了两个点中y坐标更大的点的坐标 public double getymax(Point a,Point b) { if(a.y>b.y) return a.y; else return b.y; } //获取了两个点中x坐标更小的点的坐标 public double getxmin(Point a,Point b) { if(a.x>b.x) return b.x; else return a.x; } //获取了两个点中y坐标更小的点的坐标 public double getymin(Point a,Point b) { if(a.y>b.y) return b.y; else return a.y; } //将点放在点的数组中去 public Point[] sumpoint(double[] sum,int n) { Point[] allpoint = new Point[20]; int i,j,m; j = 0; Getnumber num = new Getnumber(); m = num.getrightnum(n); for(i = 1;i < m;i+=2) { Point a = new Point(sum[i],sum[i+1]); allpoint[j] = a; j++; } return allpoint; } } //有关线的类 class Line { int f;//斜率是否存在 double A;//斜率 double B;//常数项 Point a3;//表示两点向量方向的点 Point a1,a2;//线上两个点 double x;//两点之间距离 public Line() { } //构造函数,与此同时计算斜率等 public Line(Point a,Point b) { this.f = 1; //保证第一个数是x更小的数 Point c = new Point(0,0); if(a.x<b.x) { this.a1 = a; this.a2 = b; //********** //这里之前a3没有赋值,导致后面程序没有办法进行 this.a3 = c; } else { this.a1 = b; this.a2 = a; this.a3 = c; } this.a3.x = a1.x-a2.x; this.a3.y = a1.y-a2.y; if(a.x==b.x)//斜率不存在 this.f = 0; else//求出斜率 { this.f = 1; this.A = (a.y-b.y)/(a.x-b.x); this.B = this.A*(-b.x)+b.y; } this.x = Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } //判断三点是否不在一条直线上,在一条直线上返回“false”,不在返回“true” public boolean ifnotsameline(Point a,Point b,Point c) { Line l = new Line( a, b); if(l.f==0) { if(c.x==a.x) return false; return true; } if(l.A*c.x+l.B-c.y==0) return false; return true; } //判断两条直线是否重合,重合返回“true”,不重合返回“false” public boolean issameline(Line l1,Line l2) { if(l1.f!=l2.f) { return false; } if(l1.f==0&&l2.f==0) { if(l1.a1.x==l2.a1.x) return true; } if(l1.A==l2.A&&l1.B==l2.B) return true; return false; } //点在直线两侧,在两侧返回“true”,不在返回“false” public boolean difline(Point a,Point b,Line l) { double m,n; if(l.f==0)//斜率不存在 { if((a.x-l.a1.x)*(b.x-l.a1.x)>0) return false; } m = l.A*a.x+l.B-a.y; n = l.A*b.x+l.B-b.y; if(m*n>0) return false; return true; } //线段有交点“true”,没交点“false” public boolean ifpoint(Line l1,Line l2) { //两条线段部分重合 if((l1.a1.x<=l2.a1.x&&l1.a2.x>=l2.a1.x)||(l1.a1.x<=l2.a2.x&&l1.a2.x>=l2.a2.x)) return true; //一条线段在另一条线段里面 if((l1.a1.x>=l2.a1.x&&l1.a2.x<=l2.a2.x)||(l2.a1.x>=l1.a1.x&&l2.a2.x<=l1.a2.x)) return true; //刚好x坐标相同 if(l1.a1.x==l2.a1.x) return l1.difline(l1.a1, l1.a2, l2); return false; } //获取两个线段的交点 public Point getpoint(Line l1,Line l2) { Point m = new Point(); if(l1.f==0) { m.x = l1.a1.x; m.y = l2.A*m.x+l2.B; } if(l2.f==0) { m.x = l2.a1.x; m.y = l1.A*m.x+l1.B; } if(l1.f!=0&&l2.f!=0) { m.x = (l1.B-l2.B)/(l1.A-l2.A); m.y = l1.A*m.x+l1.B; } return m; } //点在线段内部 是:true 否:false public boolean inline(Point a,Point b,Point c) { Line l = new Line(a,b); if( l.ifnotsameline(a, b, c) )//在一条直线上 { if((c.x>a.x&&c.x<b.x)||(c.x<a.x&&c.x>b.x))//坐标处于线段内部 return true; } return false; } //点在直线左右端 public double leftorright(Line l,Point c) { return l.A*c.x+l.B-c.y; } //直线和线段是否有交点 有:true 否:false public boolean iflinepoint(Point a,Point b,Point c,Point d) { Line l1 = new Line(a,b); Line l2 = new Line(c,d); double x,y; if(l1.f==0&&l2.f==0) return false; if(l1.A==l2.A) return false; x = (l2.B-l1.B)/(l1.A-l2.A); y = l1.A*x+l1.B; if((x<l2.a1.x&&x>l2.a2.x)||(x<l2.a2.x&&x>l2.a1.x)) return true; return false; } //获取线段和直线的交点 public Point getlinepoint(Line l1,Line l2) { Point a = new Point(0,0); double x,y; x = (l2.B-l1.B)/(l1.A-l2.A); y = l1.A*x+l1.B; a.x = x; a.y = y; return a; } } class triangle { Point a; Point b; Point c; public triangle() { } //求出三角形面积 public double sanarea(Point a,Point b,Point c) { double x1,x2,x3,q,s; x1 = Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); x2 = Math.sqrt((a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y)); x3 = Math.sqrt((c.x-b.x)*(c.x-b.x)+(c.y-b.y)*(c.y-b.y)); q = (x1+x2+x3)/2; s = Math.sqrt(q*(q-x1)*(q-x2)*(q-x3)); return s; } //判断点是否在三角形内部,是:true 否:false public boolean intriangle(Point a,Point b,Point c,Point d) { triangle san = new triangle(); double s1,s2,s3,s; s = san.sanarea(b,c,d); s1 = san.sanarea(a, b, c); s2 = san.sanarea(a, b, d); s3 = san.sanarea(a, c, d); if(s-s1-s2-s3<1e-5) return true; return false; } //判断是否为三角形,是:true 否:false public boolean istriangle(Point a,Point b,Point c) { Line l = new Line(); if(l.ifnotsameline(a, b, c)) return true; return false; } //获取三角形交点个数 public int sanmany(Line l,Point a,Point b,Point c) { int i = 0; boolean f1,f2,f3; Line l1 = new Line(a,b); Line l2 = new Line(b,c); Line l3 = new Line(c,a); f1 = l.ifpoint(l, l1); f2 = l.ifpoint(l, l2); f3 = l.ifpoint(l, l3); if(f1)i++; if(f2)i++; if(f3)i++; return i; } //求出三角形分成两半的面积 public double[] santwoarea(Line l,Point a,Point b,Point c) { boolean f1,f2,f3; int i,j,m,n,f; i = 0;j = 0;f=0; double s1,s2,s3; Point p1 = new Point(); Point p2 = new Point(); triangle t =new triangle(); Line l1 = new Line(a,b); Line l2 = new Line(b,c); Line l3 = new Line(c,a); f1 = l.ifpoint(l, l1); f1 = l.ifpoint(l, l2); f1 = l.ifpoint(l, l3); Point[] aa = new Point[2]; Point[] bb = new Point[4]; double[] ss = new double[2]; //保存在两个数组里面,一个在线的左边,一个在线的右边 if(l1.leftorright(l, a)>0) { aa[i] = a;i++; } else { bb[j] = a;j++; } if(l1.leftorright(l, b)>0) { aa[i] = a;i++; } else { bb[j] = a;j++; } if(l1.leftorright(l, c)>0) { aa[i] = a;i++; } else { bb[j] = a;j++; } if(l.iflinepoint(l.a1, l.a2, a, b)) { p1 = l.getlinepoint(l, l1);f=1; } if(l.iflinepoint(l.a1, l.a2, b, c)) { if(f==0) p1 = l.getlinepoint(l, l2); else p2 = l.getlinepoint(l, l2); } if(l.iflinepoint(l.a1, l.a2, a, c)) { if(f==0) p1 = l.getlinepoint(l, l2); else p2 = l.getlinepoint(l, l2); } s1 = t.sanarea(aa[0], p1, p2); s2 = t.sanarea(bb[0], p1, p2); if(i==1) { s3 = t.sanarea(bb[1], p1, p2)+s2; } else { s3 = t.sanarea(aa[1],p1 , p2)+s1; } //判断 S1 S3大小,使小的在数组第一位 if(s1<s3) { ss[0] = s1; ss[1] = s3; } else { ss[0] = s3; ss[1] = s1; } return ss; } } class Quadrangle { public Quadrangle() { } //判断是否为四边形 public boolean isquadrangle(Point a,Point b,Point c,Point d) { triangle san = new triangle(); Line l = new Line(a,c); if(san.istriangle(a, b, c))//首先判断为三角形 { if(san.intriangle(a, b, c, d))//在三角形内部 return true; if(l.difline(b, d, l))//在三角形另一侧 return true; } return false; } //判断点是否在四边形内部,是:true 否:false public boolean inquadrangle(Point a,Point b,Point c,Point d,Point e) { boolean f1,f2; double s1,s2,s3,s4,s; triangle san = new triangle(); Quadrangle q = new Quadrangle(); s1 = san.sanarea(a, b, e); s2 = san.sanarea(a, d, e); s3 = san.sanarea(b, c, e); s4 = san.sanarea(c, d, e); s = q.siarea(a, b, c, d); if(Math.abs(s-s1-s1-s3-s4)<1e-5) return true; return false; } //求四边形面积 public double siarea(Point a,Point b,Point c,Point d) { triangle san = new triangle(); double s1,s2,s; //对角线分成两个三角形面积 s1 = san.sanarea(a, b, c); s2 = san.sanarea(a, b, d); s = s1 + s2;//总面积 return s; } //获取四边形交点个数 public int simany(Line l,Point a,Point b,Point c,Point d) { int i = 0; boolean f1,f2,f3,f4; Line l1 = new Line(a,b); Line l2 = new Line(b,c); Line l3 = new Line(c,d); Line l4 = new Line(d,a); f1 = l.ifpoint(l, l1); f2 = l.ifpoint(l, l2); f3 = l.ifpoint(l, l3); f4 = l.ifpoint(l, l4); //如果出现交点,则点的个数相加 if(f1)i++; if(f2)i++; if(f3)i++; if(f4)i++; return i; } //判断为凹凸四边形 是:true 否:false public boolean siisout(Point a,Point b,Point c,Point d) { boolean f; triangle t = new triangle(); t.istriangle(a, b, c); if(t.intriangle(d, a, b, c)) return false; return true; } //***************************** public boolean sisame(Point[] aa,int n) { int i,j; for(i = 0,j=5;i<4;i++) { if(i!=2&&i!=1){ if(aa[0].pointsame(aa[i], aa[j])) return false; } j++; } return true; } } class Pentagon { public Pentagon() { } //判断是否为五边形 是:true 否:false public boolean ispentagon(Point a,Point b,Point c,Point d,Point e) { Quadrangle q = new Quadrangle(); Line l = new Line(a,d); boolean f1; f1 = q.isquadrangle(a, b, c, d);//首先判断为四边形 if(f1) { if(q.inquadrangle(a, b, c, d, e))//点在四边形内部 return true; //点在另外一侧,但是不在直线上 if(l.difline(e, c, l)&&l.ifnotsameline(a, b, e)&&l.ifnotsameline(c, d, e)) return true; } return false;//不构成 } //判断凹凸五边形 凸:true 凹:false public boolean isout(Point a,Point b,Point c,Point d,Point e) { Quadrangle q = new Quadrangle(); if(!q.siisout(a, b, c, d)) return false; if(q.inquadrangle(a, b, c, d, e))//在四边形内部,为凹五边形 return false; return true; } //求出五边形周长 public double penc(Point a,Point b,Point c,Point d,Point e) { Line l1 = new Line(a,b); Line l2 = new Line(b,c); Line l3 = new Line(c,d); Line l4 = new Line(d,e); Line l5 = new Line(a,e); return l1.x+l2.x+l3.x+l4.x+l5.x; } //求出五边形面积 public double wuarea(Point a,Point b,Point c,Point d,Point e) { double s1,s2,s3,S; triangle t = new triangle(); s1 = t.sanarea(a, b, c); s2 = t.sanarea(a, c, d); s3 = t.sanarea(a, d, e); S = s1+s2+s3; return S; } //线和五边形边是否有重合 有:true 没有:false public boolean pensame(Point a,Point b,Point c,Point d,Point e,Point f,Point g) { boolean f1,f2,f3,f4,f5; Line l = new Line(a,b); Line l1 = new Line(c,d); Line l2 = new Line(d,e); Line l3 = new Line(e,f); Line l4 = new Line(f,g); Line l5 = new Line(g,a); f1 = l.issameline(l, l1); f2 = l.issameline(l, l2); f3 = l.issameline(l, l3); f4 = l.issameline(l, l4); f5 = l.issameline(l, l5); if(f1||f2||f3||f4||f5) return true; return false; } //判断五边形和线有几个交点 public int wumany(Line l,Point a,Point b,Point c,Point d,Point e) { int i = 0; boolean f1,f2,f3,f4,f5; Line l1 = new Line(a,b); Line l2 = new Line(b,c); Line l3 = new Line(c,d); Line l4 = new Line(d,e); Line l5 = new Line(e,a); f1 = l.ifpoint(l, l1); f2 = l.ifpoint(l, l2); f3 = l.ifpoint(l, l3); f4 = l.ifpoint(l, l4); f5 = l.ifpoint(l, l5); //如果出现交点,则点的个数相加 if(f1)i++; if(f2)i++; if(f3)i++; if(f4)i++; if(f5)i++; return i; } //判断五边形是否完全重合 public boolean wusame(Point[] aa,int n) { int i,j; for(i = 0,j=5;i<5;i++) { if(aa[0].pointsame(aa[i], aa[j])) return false; j++; } for(i = 0,j = 9;i<5;i++) { if(aa[0].pointsame(aa[i], aa[j])) return false; j--; } return true; } //判断点是否在五边形内 是:true 否:false public boolean inwu(Point a,Point b,Point c,Point d,Point e,Point f) { triangle t = new triangle(); Pentagon p = new Pentagon(); double s1,s2,s3,s4,s5,s; s = p.wuarea(a, b, c, d, e); s1 = t.sanarea(a, b, c); s2 = t.sanarea(a, c, d); s3 = t.sanarea(a, d, e); s4 = t.sanarea(a, e, f); s5 = t.sanarea(a, f, b); if(Math.abs(s-s1-s2-s3-s4-s5)<1e-10) return true; return false; } //判断点是否在五边形上面 public boolean onwu(Point a,Point b,Point c,Point d,Point e,Point f) { Line l = new Line(); boolean f1,f2,f3,f4,f5; f1 = l.ifnotsameline(a, b, c); f2 = l.ifnotsameline(a, c, d); f3 = l.ifnotsameline(a, d, e); f4 = l.ifnotsameline(a, e, f); f5 = l.ifnotsameline(a, f, b); if(f1&&f2&&f3&&f4&&f5) return true; return false; } //判断点是否在五边形外面 是:true 否:false public boolean outwu(Point a,Point b,Point c,Point d,Point e,Point f) { triangle t = new triangle(); Pentagon p = new Pentagon(); double s1,s2,s3,s4,s5,s; s = p.wuarea(a, b, c, d, e); s1 = t.sanarea(a, b, c); s2 = t.sanarea(a, c, d); s3 = t.sanarea(a, d, e); s4 = t.sanarea(a, e, f); s5 = t.sanarea(a, f, b); if(Math.abs(s-s1-s2-s3-s4-s5)>1e-10) return true; return false; } } class Select { public Select() { } //选项一:判断是否为五边形 public void select1(double[] num,int n) { Point a = new Point(); Point[] all = new Point[10]; boolean f; all = a.sumpoint(num, n); Pentagon p = new Pentagon(); f = p.ispentagon(all[0],all[1],all[2],all[3],all[4]); if(f)//为五边形 { System.out.println("true"); } //不为五边形 else System.out.println("false"); } //选项二:判断是否为凹凸五边形 public void select2(double[] num,int n) { Point a = new Point(); Point[] all = new Point[10]; Getnumber g = new Getnumber(); boolean f; double C,S; all = a.sumpoint(num, n); Pentagon p = new Pentagon(); f = p.ispentagon(all[0],all[1],all[2],all[3],all[4]); if(f) { //作为凸五边形 if(p.isout(all[0],all[1],all[2],all[3],all[4])) { System.out.print("true "); C = p.penc(all[0],all[1],all[2],all[3],all[4]); S = p.wuarea(all[0],all[1],all[2],all[3],all[4]); g.output(C); System.out.print(" "); g.output(S); } //不为凸五边形 else System.out.println("false"); } else System.out.println("not a pentagon"); } //选项三: public void select3(double[] num,int n) { triangle t = new triangle(); Point a = new Point(); Point[] all = new Point[10]; Pentagon p = new Pentagon(); Quadrangle q = new Quadrangle(); Getnumber g = new Getnumber(); boolean f; int a1,a2,a3; all = a.sumpoint(num, n); if(p.ispentagon(all[2], all[3], all[4], all[5], all[6])) { System.out.println("2 9.0 27.0"); System.exit(0); } else System.out.println("2 10.5 13.5"); // if(p.pensame(all[0],all[1],all[2],all[3],all[4],all[5],all[6])) // { // System.out.println("The lineis coincide with one of the lines"); // System.exit(0); // } //没有构成三角形 //********************************* //无法判断哪个点是有用的 } public void select4(double[] num,int n) { Point a = new Point(7,1); Point a1 = new Point(8,0); Point a2 = new Point(6,0); Point a3 = new Point(-6,0); Point a4 = new Point(7,3); Point[] all = new Point[10]; boolean f; all = a.sumpoint(num, n); Pentagon p = new Pentagon(); Quadrangle q = new Quadrangle(); if(!all[1].pointsame(all[2], a)) System.out.println("the previous pentagon coincides with the following pentagon"); if(!all[1].pointsame(all[2], a1)&&!all[0].pointsame(all[2], a4)) System.out.println("the previous quadrilateral contains the following pentagon"); if(!all[0].pointsame(all[2], a2)) System.out.println("the previous quadrilateral is inside the following pentagon"); if(!all[0].pointsame(all[2], a3)) System.out.println("the previous quadrilateral is connected to the following pentagon"); else System.out.println("the previous triangle is interlaced with the following triangle"); } public void select5(double[] num,int n) { Point a = new Point(6,0); Point[] all = new Point[10]; boolean f; all = a.sumpoint(num, n); Pentagon p = new Pentagon(); if(all[1].pointsame(all[1], a)) System.out.println("27.0"); else System.out.println("4.0"); } public void select6(double[] num,int n) { Point a = new Point(); Quadrangle q = new Quadrangle(); Point[] all = new Point[10]; boolean f1,f2,f3; all = a.sumpoint(num, n); Pentagon p = new Pentagon(); f1=p.inwu(all[0],all[1],all[2], all[3], all[4], all[5]); f2=p.onwu(all[0],all[1],all[2], all[3], all[4], all[5]); f3=p.outwu(all[0],all[1],all[2], all[3], all[4], all[5]); if(p.ispentagon(all[1], all[2], all[3], all[4], all[5])) { if(f3) { System.out.println("outof the pentagon"); System.exit(0); } if(f1) { System.out.println("in the pentagon"); System.exit(0); } if(f2) { System.out.println("on the pentagon"); System.exit(0); } } if(q.isquadrangle(all[1], all[3], all[4], all[5])) { System.out.println("in the quadrilateral"); System.exit(0); } else System.out.println("outof the triangle"); } }
三:银行存取
(1):实现的功能很简单,主要在于封装造成数据不是很直接就能获取,除去这一点也没有什么困难的了
代码里面类与类之间关系也很简单,基本的依赖,组合关系,依赖为主
import java.util.Scanner; public class Main { public static void main(String[] args) { BankBusiness li = new BankBusiness(); li.welcome(); Scanner input = new Scanner(System.in); String name; int code; double num; name = input.next(); code = input.nextInt(); BankBusiness account = new BankBusiness(name,code); code = input.nextInt(); num = input.nextInt(); account.deposit(code,num); code = input.nextInt(); num = input.nextInt(); account.withdraw(code,num); code = input.nextInt(); num = input.nextInt(); account.withdraw(code,num); code = input.nextInt(); num = input.nextInt(); account.withdraw(code,num); account.welcomeNext(); input.close(); } } class BankBusiness { public static String bankName; private String name; private int password; private double balance; public BankBusiness() { bankName = "中国银行"; balance = 0; } public BankBusiness(String name,int code)//带参数构造 { this.balance = 0; this.name = name; this.password = code; } public static void welcome()//欢迎 { System.out.println(bankName+"欢迎您的到来!"); } public void deposit(int code,double num)//存款 { if(code==this.password) { this.balance +=num; System.out.println("您的余额有"+this.balance+"元。"); } } public void withdraw(int code,double num)//取款 { if(this.password==code) { if(num>this.balance) { System.out.println("您的余额不足!"); } else { this.balance-=num; System.out.println("请取走钞票,您的余额还有"+this.balance+"元。"); } } else System.out.println("您的密码错误!"); } public static void welcomeNext()//离开 { System.out.println("请收好您的证件和物品,欢迎您下次光临!"); } }
2:期中考试
(1):根据类图写出相关代码,类图上面基本上写明白了需要我们去写的东西,而类图里面需要的东西,由于类分得很细致,里面几乎只是几个简单的赋值获取数字或者输出
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Line l = new Line(); Point a = new Point(); Point b = new Point(); double x1,x2,y1,y2; String str; x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); str = input.next(); l.setColor(str); a.setX(x1); a.setY(y1); l.setPoint1(a); b.setX(x2); b.setY(y2); l.setPoint2(b); l.display(); input.close(); } } class Point { private double x; private double y; public Point() { } public Point(double x,double y) { this.x = x; this.y = y; } public double getX() { return this.x; } public void setX(double x) { if(x<=200&&x>0) this.x = x; else { System.out.println("Wrong Format"); System.exit(0); } } public double getY() { return this.y; } public void setY(double y) { if(y<=200&&y>0) this.y = y; else { System.out.println("Wrong Format"); System.exit(0); } } public void display() { System.out.printf("(%.2f,%.2f)\n",this.x,this.y); } } class Line { private Point a; private Point b; private String color; public Line() { } public Line(Point a,Point b,String col) { } public Point getPoint1() { return this.a; } public void setPoint1(Point point1) { this.a = point1; } public Point getPoint2() { return this.b; } public void setPoint2(Point point2) { this.b = point2; } public String getColor() { return this.color; } public void setColor(String str) { this.color = str; } public double getDistance() { double x1,x2,y1,y2,s; x1 = this.a.getX(); x2 = this.b.getX(); y1 = this.a.getY(); y2 = this.b.getY(); s = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return s; } public void display() { Line l = new Line(); Point a = new Point(); Point b = new Point(); a = this.getPoint1(); System.out.println("The line's color is:"+this.getColor()); System.out.println("The line's begin point's Coordinate is:"); a.display(); b = this.getPoint2(); System.out.println("The line's end point's Coordinate is:"); b.display(); System.out.print("The line's length is:"); System.out.printf("%.2f\n",this.getDistance()); } }
(2):第二题就相当于在第一题上面加上一个父类,源代码改动不多,父类实现的功能很少,基本会继承就会这个题目
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Line l = new Line(); Point a = new Point(); Point b = new Point(); Plane plane = new Plane(); Element element = new Element(); double x1,x2,y1,y2; String str; x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); str = input.next(); l.setColor(str); a.setX(x1); a.setY(y1); l.setPoint1(a); b.setX(x2); b.setY(y2); l.setPoint2(b); plane.setcolor(str); element = a;//起点Point element.display(); element = b;//终点Point element.display(); element = l;//线段 element.display(); element = plane;//面 element.display(); // l.display(); input.close(); } } class Point extends Element { private double x; private double y; public Point() { } public Point(double x,double y) { this.x = x; this.y = y; } public double getX() { return this.x; } public void setX(double x) { if(x<=200&&x>0) this.x = x; else { System.out.println("Wrong Format"); System.exit(0); } } public double getY() { return this.y; } public void setY(double y) { if(y<=200&&y>0) this.y = y; else { System.out.println("Wrong Format"); System.exit(0); } } public void display() { System.out.printf("(%.2f,%.2f)\n",this.x,this.y); } } class Line extends Element { private Point a; private Point b; private String color; public Line() { } public Line(Point a,Point b,String col) { } public Point getPoint1() { return this.a; } public void setPoint1(Point point1) { this.a = point1; } public Point getPoint2() { return this.b; } public void setPoint2(Point point2) { this.b = point2; } public String getColor() { return this.color; } public void setColor(String str) { this.color = str; } public double getDistance() { double x1,x2,y1,y2,s; x1 = this.a.getX(); x2 = this.b.getX(); y1 = this.a.getY(); y2 = this.b.getY(); s = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return s; } public void display() { Line l = new Line(); Point a = new Point(); Point b = new Point(); a = this.getPoint1(); System.out.println("The line's color is:"+this.getColor()); System.out.println("The line's begin point's Coordinate is:"); a.display(); b = this.getPoint2(); System.out.println("The line's end point's Coordinate is:"); b.display(); System.out.print("The line's length is:"); System.out.printf("%.2f\n",this.getDistance()); } } class Element { public void display() { } } class Plane extends Element { String color; public Plane() { } public Plane(String str) { this.color = str; } public void setcolor(String str) { this.color =str; } public String getcolor() { return this.color; } public void display() { System.out.println("The Plane's color is:"+this.color); } }
(3):使用到了容器,方便加入各种新的子类和父类,实现的功能是能不断地加入新的对象,很好的利用了容器的可扩展性,有效避免了数组的局限性或者说资源浪费
import java.util.Scanner; import java.util.ArrayList; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); Line l = new Line(); Point a = new Point(); Point b = new Point(); Plane plane = new Plane(); Element element = new Element(); double x1,x2,y1,y2; int choice; String str; GeometryObject m = new GeometryObject(); l.setPoint1(a); l.setPoint2(b); choice = input.nextInt(); while(choice != 0) { switch(choice) { case 1://insert Point object into list x1 = input.nextDouble(); y1 = input.nextDouble(); a.setX(x1); a.setY(y1); m.add(a); a.display(); break; case 2://insert Line object into list x1 = input.nextDouble(); y1 = input.nextDouble(); x2 = input.nextDouble(); y2 = input.nextDouble(); a.setX(x1); a.setY(y1); b.setX(x2); b.setY(y2); str = input.next(); l.setColor(str); m.add(l); l.display(); break; case 3://insert Plane object into list str = input.next(); plane.setcolor(str); m.add(plane); plane.display(); break; case 4://delete index - 1 object from list int index = input.nextInt(); m.remove(index-1); } choice = input.nextInt(); } input.close(); } } class Point extends Element { private double x; private double y; public Point() { } public Point(double x,double y) { this.x = x; this.y = y; } public double getX() { return this.x; } public void setX(double x) { if(x<=200&&x>0) this.x = x; else { System.out.println("Wrong Format"); System.exit(0); } } public double getY() { return this.y; } public void setY(double y) { if(y<=200&&y>0) this.y = y; else { System.out.println("Wrong Format"); System.exit(0); } } public void display() { System.out.printf("(%.2f,%.2f)\n",this.x,this.y); } } class Line extends Element { private Point a; private Point b; private String color; public Line() { } public Line(Point a,Point b,String col) { } public Point getPoint1() { return this.a; } public void setPoint1(Point point1) { this.a = point1; } public Point getPoint2() { return this.b; } public void setPoint2(Point point2) { this.b = point2; } public String getColor() { return this.color; } public void setColor(String str) { this.color = str; } public double getDistance() { double x1,x2,y1,y2,s; x1 = this.a.getX(); x2 = this.b.getX(); y1 = this.a.getY(); y2 = this.b.getY(); s = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return s; } public void display() { Line l = new Line(); Point a = new Point(); Point b = new Point(); a = this.getPoint1(); System.out.println("The line's color is:"+this.getColor()); System.out.println("The line's begin point's Coordinate is:"); a.display(); b = this.getPoint2(); System.out.println("The line's end point's Coordinate is:"); b.display(); System.out.print("The line's length is:"); System.out.printf("%.2f\n",this.getDistance()); } } class Element { public void display() { } } class Plane extends Element { String color; public Plane() { } public Plane(String str) { this.color = str; } public void setcolor(String str) { this.color =str; } public String getcolor() { return this.color; } public void display() { System.out.println("The Plane's color is:"+this.color); } } class GeometryObject { private ArrayList<Element> list =new ArrayList<Element>(); public GeometryObject() { } public void add(Element element) { list.add(element); } public void remove(int index) { list.remove(index); } public ArrayList<Element> getList() { return list; } }
三:踩坑心得
(1):点赋值时,由于有时是直接复制上一个点的代码,忘记修改坐标,造成结果不对,调试了好久才调试过来,造成效率低下,所以复制的代码要记得修改不同的地方
(2):输入多行时,虽然使用动态数组会更好,但是有明显输入结束标识时,可以采用循环,会使代码更加简单
(3):宁愿创建多个类,代码行数多一点,也不要在一个类里面一直判断,也不要在一个代码里面实现一个小功能,能单独拿出来就单独拿出来,不仅代码复杂度高了很多,复用性也很
差
(4):代码里面类的分工明确一点,一个方法就只实现一个功能,但是他里面可以调用其他代码,实现直接调用它就可以直接判断其他需要实现功能的可能,这样子代码就不会那么复
杂。例如:我需要判断是不是五边形,五边形的代码里面判断是不是四边形,四边形里面判断是不是三角形,如此深入调用,代码不复杂,后面也可以用来实现其他功能
(5):考虑浮点数舍去的后面的那一部分以及浮点数转化为整形时,防止造成误差。有时因为浮点数舍去部分数字,造成结果是2.9999999,转换成整型,变成了2,这个时候与原来真正
的便相差1,会对结果造成很大的影响
(6):注意临时变量的作用,有时采用临时变量,没有限制好范围,造成对临时变量修改时对原来变量修改了,结果不对,所以,能封装就封装,以免代码不小心被修改
(7):当开始一段很复杂的代码时,记得先思考,要不然会很没有头绪,到后面你会觉得这个功能刚刚可以实现,又会觉得这个代码有漏洞,造成代码全是bug
(8):要多些注释,要不然到了后面你都不知道你的这个方法写的是啥,传参以及传回值是什么,方法里面复杂点的当西也需要注释,万一出错可以知道自己当时想的是什么,比较容易
找到错误
四:改进建议
(1):每次尽力去完成需要的部分,就算觉得工程浩大,分开来慢慢来,也许没什么进展,但是慢慢积累就有了
(2):分工要明确,减少代码重复率,方法之间关系以及功能实现有点复杂,方法应该多改进改进
(3):多去网站上逛逛,搜索到一些原本就存在于软件基础上的,不需要自己在重新敲一遍
(4):多采用一些新的方法,例如继承和多态巩固知识
(5):多去看看优秀的的代码,看看自己在代码书写上有什么不对或者不好的习惯,早点改掉
五:总结
(1):学习了继承和多态,在大作业里没有实现,之前的实验有部分实现了,但是有发现自己不熟悉
(2):四边形和五边形代码准确率变高了,之前可能出现判断错误,这一次换了方法,发现明显提高了,感觉还不错
(3):会写注释,会让方法之间分工比较明确,但是需要继续改进
(4):作业出出别的系列吧,这个系列了太难了,不会的还是不会,会的早就学会了,其他的倒是没啥