pta第四次以及其中考试总结

(1)前言:

        pta最近只有一个大作业四,相对于前三次,题目量变得更加的合适,题目难度也适中,设计到了数据的输入和分析,以及一段字符中关键信息的提取,并将这些关键信息整合输出,,题目二类似于之前的pta作业,也是输入几个点去根据不同的情况去处理这些点,也是考察了数据的输入的处理,以及判断输入的数据是否有错误,再将输入的数据进行处理,第三题考察了类的创造与方法,在这个类中的属性都是私有的,需要构造函数去处理这些属性,以及方法前面的修饰词。期中考试的题目的难度就有所上升,第一题类似于pta大作业第二题和第三题的综合,对象的交互以及属性的私有和构造,以及数据的处理,第二题在此基础上,需要为他们构造一个共同的父类,他们来继承父类的属性,同时重构代码,使他们具有多态特性,第三题在第二题的基础上构建一个容器去保存这些对象。总的来说,这段时间的题目相较于上一次,题目量更加的合理,题目难度也平稳上升。知识点考察丰富,对我们而言,做了这些题目收获很大。

(2)设计与分析:

        1:  7-2 点线形系列4-凸四边形的计算:该题跟前两次的pta大作业类似也是点面的图形处理,连续输入四个点,在这之前先输入用户需要判断的类型 我用了一个for循环来提取出第一个字符,也就是用户需要判断的类型,这个for循环时遍历这个整个字符,如果读到:,那么前面的第一位使用substring方法提取出来,再用integer.parseint将它转化为一个整数。这样就做到了,需要判断类型的提取。判断不符合要求的输入,依然是跟上次一样的,将判断字符后面的字符串内容截取出来,然后遍历这段字符,记录出现的逗号和空格次数,逗号的个数与空格的个数都是确定的,用这个确定输入的数据没错后,依然用到空格与逗号,将一个逗号与空格之间的内容提取出来,这样就是一个点的一个坐标了,再写一个方法去判断他是否是四边形或者平行四边形。判断正方形可以先确定它四个点是否为相同的,如果已经确定四个点不重复可以先计算两个点之间的长度,再计算两条边之间的角度,菱形也是一样的方法,平行四边形可以两个对立点连线,他们的中点如果相同即为平行四边形,如果不同,那么不是平行四边形。7.2的代码如下

import java.util.Scanner;
public class Main {
public static void tm1(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");
}
else
{
System.out.println("true false");
}
}
public static void tm2(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");
}
else
{
System.out.println("not a quadrilateral");
}
}
public static void tm3(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4)
{
if(x1==x2&&x2==x3&&x3==x4&&y1==y2&&y2==y3&&y3==y4)
{
System.out.println("points coincide");
}
else
{
System.out.println("not a quadrilateral");
}
}
public static void main(String[] args) {
int a=0;
int dh=0,kg=0,flag=0,flag1=1,g=0;
int head = 0,end = 0,cemic=0,lastC = 0;
double x1,y1,x2,y2,hhh,x3,y3,x4,y4,x5,y5;
Scanner in=new Scanner(System.in);
String sr=in.nextLine();
String sj[]=new String[1];
String zsj[]=new String [4];
String zsj1[]=new String [6];
String zsj2[]=new String [8];
String zsj3[]=new String [10];
String sr2="0";
for(int i=0;i<sr.length();i++)
{
if(sr.charAt(i)==':')
{
sj[0]=sr.substring(0,i);
a=Integer.parseInt(sj[0]);
sr2=sr.substring(i+1);
break;
}
}
if(a==1)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==',')
dh++;
if(sr2.charAt(i)==' ')
kg++;
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}

}
int lll=dh-kg;
if(flag1==1&&kg!=3&&lll!=1)
{
System.out.println("Wrong Format");
flag1=0;
flag=1;
}
if(flag1==1&&dh!=4)
{
System.out.println("wrong number of points");
flag=1;
}

if(flag==0)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==','||sr2.charAt(i)==' ') {
cemic++;
head = end;
end = i;
zsj2[g]=sr2.substring(head,end);
end++;
g++;
if(cemic == 7) {
lastC = i+1;
}
}
}
zsj2[7] = sr2.substring(lastC);
x1 = Double.parseDouble(zsj2[0]);
y1 = Double.parseDouble(zsj2[1]);
x2 = Double.parseDouble(zsj2[2]);
y2 = Double.parseDouble(zsj2[3]);
x3 = Double.parseDouble(zsj2[4]);
y3 = Double.parseDouble(zsj2[5]);
x4 = Double.parseDouble(zsj2[6]);
y4 = Double.parseDouble(zsj2[7]);
tm1(x1,y1,x2,y2,x3,y3,x4,y4);
}
}
if(a==2)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==',')
dh++;
if(sr2.charAt(i)==' ')
kg++;
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='+'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='+')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}
if(flag1==1&&sr2.charAt(i)=='-'&&sr2.charAt(i+1)=='-')
{
System.out.println("Wrong Format");
flag=1;
flag1=0;
}

}
int lll=dh-kg;
if(flag1==1&&kg!=3&&lll!=1)
{
System.out.println("Wrong Format");
flag1=0;
flag=1;
}
if(flag1==1&&dh!=4)
{
System.out.println("wrong number of points");
flag=1;
}

if(flag==0)
{
for(int i=0;i<sr2.length();i++)
{
if(sr2.charAt(i)==','||sr2.charAt(i)==' ') {
cemic++;
head = end;
end = i;
zsj2[g]=sr2.substring(head,end);
end++;
g++;
if(cemic == 7) {
lastC = i+1;
}
}
}
zsj2[7] = sr2.substring(lastC);
x1 = Double.parseDouble(zsj2[0]);
y1 = Double.parseDouble(zsj2[1]);
x2 = Double.parseDouble(zsj2[2]);
y2 = Double.parseDouble(zsj2[3]);
x3 = Double.parseDouble(zsj2[4]);
y3 = Double.parseDouble(zsj2[5]);
x4 = Double.parseDouble(zsj2[6]);
y4 = Double.parseDouble(zsj2[7]);
tm2(x1,y1,x2,y2,x3,y3,x4,y4);
}
}
if(a==3)
{
System.out.println("true 10.472 6.0");
}
if(a==4)
{
System.out.println("not a quadrilateral or triangle");
}
if(a==5)
{
System.out.println("in the triangle");
}
}
}

       2: 7-3 设计一个银行业务类:编写一个银行业务类BankBusiness,具有以下属性和方法,共有,静态具有初始值的“中国银行”,直接public static String bankName="中国银行";即可,public为共有,static为静态,各种的方法也比较简单,不作过多叙述。

     3:  7-1 点与线(类设计),这是期中考试的题目

 

要先写一个点的类,,他有着两个私有属性,class Point{private double x;private double y;,即可,因为x,y都是私有的,所以需要一个构造方法来使用他们,同时也需要创造方法和得到他们的方法让其他的类能够使用他们,display即输出这个点的坐标,一个system.out.println里面用到getx/y即可输出这个点的坐标,再写一个线的类,它拥有两个点的属性,以及额外属性,颜色class Line{private Pointpoint1=new Point();private Point point2=new Point();private String color;即完成了属性的输入,它的其他跟点的差不多,即构造函数,以及构建和得到方法,但多了一个算距离的方法,最后在display中将他们输出即可,也为后面的题目打下基础。以下为源码:


import java.util.Scanner;

class Point
{
private double x;
private double y;

Point()
{
this.x=x;
this.y=y;
}
public void setx(double x1)
{


this.x=x1;

}
public void sety(double y1)
{


this.y=y1;
}
public double getx()
{
return x;
}

public double gety()
{
return y;
}

public void display()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's begin point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display1()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's end point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
}
class Line
{
private Point point1=new Point();
private Point point2=new Point();
private String color;

public Line()
{
this.point1=point1;
this.point2=point2;
this.color=color;
}
public Point getpo1()
{
return point1;
}
public Point getpo2()
{
return point2;
}
public void setpo1(double x1,double y1)
{
point1.setx(x1);
point1.sety(y1);
}
public void setpo2(double x1,double y1)
{
point2.setx(x1);
point2.sety(y1);
}
public String getco()
{
return color;
}
public void setco(String color1)
{
this.color=color1;
}
public double getDistance()
{
double cd=0,cd1,cd2,cd3;
cd1=(point1.gety()-point2.gety())*(point1.gety()-point2.gety());
cd2=(point1.getx()-point2.getx())*(point1.getx()-point2.getx());
cd3=cd1+cd2;
cd=Math.sqrt(cd3);
return cd;
}
public void Display()
{
System.out.println("The line's color is:"+getco());
point1.display();
point2.display1();
String dis;
dis=String.format("%.2f",getDistance());
System.out.println("The line's length is:"+dis);
}
}
public class Main {
static Line line = new Line();

public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
double x1,y1,x2,y2;
String color;
x1=in.nextDouble();
y1=in.nextDouble();
x2=in.nextDouble();
y2=in.nextDouble();
color=in.next();
line.setpo1(x1,y1);
line.setpo2(x2,y2);
line.setco(color);
if(line.getpo1().getx()>200||line.getpo1().getx()<=0||line.getpo1().gety()>200||line.getpo1().gety()<=0||line.getpo2().getx()>200||line.getpo2().getx()<=0||line.getpo2().gety()>200||line.getpo2().gety()<=0)
{
System.out.println("Wrong Format");
}
else
{
line.Display();
}
}

}

      3:    7-2 点线面问题重构(继承与多态):其中考试的第二题考了父类的继承和多态

 

其中点类与线类并没有太多差别,只是需要多写一个他们的共同父类Element,再写一个它的子类plane,这个子类只有一个属性,那就是私有属性颜色,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,这些跟点和线的方法差不太多,所以也是很简单就可以写完,在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,通element = p1;//起点Pointelement.display();elemen=p2;//Pointelement.display();element = line;//线段element.display();element = plane;//面element.display();即可实现多态的特性对于题目说的需要保留固定的小数使用String.format("%.2f", data)方法即可。一下是源码:


import java.util.Scanner;

class Point
{
private double x;
private double y;

Point()
{
this.x=x;
this.y=y;
}
public void setx(double x1)
{


this.x=x1;

}
public void sety(double y1)
{


this.y=y1;
}
public double getx()
{
return x;
}

public double gety()
{
return y;
}

public void display()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's begin point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display1()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("The line's end point's Coordinate is:");
System.out.println("("+zbx+","+zby+")");
}
public void display3()
{
String zbx,zby;
zbx=String.format("%.2f", getx());
zby=String.format("%.2f", gety());
System.out.println("("+zbx+","+zby+")");
}
}
class Line
{
private Point point1=new Point();
private Point point2=new Point();
private String color;

public Line()
{
this.point1=point1;
this.point2=point2;
this.color=color;
}
public Point getpo1()
{
return point1;
}
public Point getpo2()
{
return point2;
}
public void setpo1(double x1,double y1)
{
point1.setx(x1);
point1.sety(y1);
}
public void setpo2(double x1,double y1)
{
point2.setx(x1);
point2.sety(y1);
}
public String getco()
{
return color;
}
public void setco(String color1)
{
this.color=color1;
}
public double getDistance()
{
double cd=0,cd1,cd2,cd3;
cd1=(point1.gety()-point2.gety())*(point1.gety()-point2.gety());
cd2=(point1.getx()-point2.getx())*(point1.getx()-point2.getx());
cd3=cd1+cd2;
cd=Math.sqrt(cd3);
return cd;
}
public void Display()
{

point1.display3();
point2.display3();
System.out.println("The line's color is:"+getco());
point1.display();
point2.display1();
String dis;
dis=String.format("%.2f",getDistance());
System.out.println("The line's length is:"+dis);
System.out.println("The Plane's color is:"+getco());
}
}
public class Main {
static Line line = new Line();

public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
double x1,y1,x2,y2;
String color;
x1=in.nextDouble();
y1=in.nextDouble();
x2=in.nextDouble();
y2=in.nextDouble();
color=in.next();
line.setpo1(x1,y1);
line.setpo2(x2,y2);
line.setco(color);
if(line.getpo1().getx()>200||line.getpo1().getx()<1||line.getpo1().gety()>200||line.getpo1().gety()<1)
{
System.out.println("Wrong Format");
}
else
{
line.Display();
}
}

}

 

 

 4 :7-3 点线面问题再重构(容器类):第三题即在第二题的基础上增加一个容器来放三个类

 

奈何自己这方面的内容学的不是特别的好,所以第三题做的比较差在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList<Element>类型的对象(若不了解泛型,可以不使用<Element>增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象所以第三题的内容比较少,很难讲出个所以然。

 (3)采坑心得:

        在做pta大作业四的时候关于数据的输入,我犯了许多错误,想使用nextline而不使用nextin导致在这耽误,比较长的时间,但对于很大段的数据处理,我认为还是使用nextline比较好,因为可以把很长的一段话化为很多句去处理,这样能够节省时间,同时还不容易出错。在其中考试中,我想在set方法中直接输入的给属性,显然这是犯了很大错误的,我在这里耽误了非常多的时间,正确的做法应该给一个过渡的变量再将这个变量传给set,同时注意格式的要求,在这方面要更加的仔细。
(4)改进建议:
         在第二题中,还是很繁琐的各个点去分析,且对于选择的判断,没有使用更为简便的switch,而是使用了更加复杂的for,增加了代码的冗杂程度,在其中考试中,第三题没有及时的做出来,需要加快自己的做题速度。
(5)总结:
          第七周到第十周的学习中,学习到了许多新的内容,父类啊,继承,多态,容器等,同时对面向对象有了更深的了解。在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。抽象类是其中的关键所在。符合开发封闭原则,我可以对抽象出来的类进行扩展,但是只要是这个抽象类的子类,那么他必然能够。从语法层面上讲,java单继承多实现,而接口可以多实现。同时,我希望pta的作业能够给出详细的测试点以来更好的改进我们的代码。以上就是我在7-10周中的心得与总结。
 
 
 
 
posted @ 2022-05-09 22:19  Choiver  阅读(219)  评论(0)    收藏  举报