PTA大作业四和期中考试总结

面对对象程序设计————PTA前三次作业总结

期中考试——题目集1   

整体总结:

                     题目集01-03考察的是继承与多肽,以及抽象类函数的使用,并且考察了对类图的理解。

 

题目集1   7-1 点与线(类设计)

整体思路分析 :

    1.本题逻辑十分清晰,无十分严重的踩坑;

         2.本题主要要求实现对类Point,类Line的创建;

              3.对于私有数据的使用,要注意其使用范围只能在类中使用;

核心代码分析:

1.类Point

class Point
{
    private double x=0;
    private double y=0;
    
    Point(double x,double y)
    {
        if(x>0&&x<=200&&y>0&&y<=200)//判断数据是否符合要求
        {
            this.x=x;
            this.y=y;
        }
    }
    
    public double getX()//获取私有数据y
    {
        return x;
    }
    
    public void setX(double x0)//修改私有数据y
    {
        x=x0;
    }
    
    public double getY()//获取私有数据y
    {
        return y;
    }
    
    public void setY(double y0)//修改私有数据y
    {
        y=y0;
    }
    
    public void display()//展示x,y
    {
        System.out.printf("%.2f %.2f", x,y);
    }
}

2.类Line

class Line 
{
    
    private Point point1;
    private Point point2;
    private String color;
    
    Line(Point p1,Point p2,String color)//构造函数
    {
        point1=p1;
        point2=p2;
        this.color=color;
    }
    
    public Point getPoint1()//获取私有数据
    {
        return point1;
    }
    
    public void setPoint1(Point p)//修改私有数据
    {
        point1=p;
    }
    
    public Point getPoint2()//获取私有数据
    {
        return point2;
    }
    
    public void setPoint2(Point p)//修改私有数据
    {
        point2=p;
    }
    
    public String getColor()//获取私有数据
    {
        return color;
    }
    
    public void setColor(String p)//修改私有数据
    {
        color=p;
    }
    
    public double getDistance()//返还距离
    {
        return Math.sqrt(Math.pow(point1.getX()-point2.getX(),2)+Math.pow(point1.getY()-point2.getY(),2));
    }
    
    public void display()//展示
    {
        
        if(point1.getX()!=0&&point1.getY()!=0&&point2.getX()!=0&&point2.getY()!=0)
        {
            System.out.println("The line's color is:"+color);
            System.out.println("The line's begin point's Coordinate is:");
            System.out.println("("+String.format("%.2f", point1.getX())+","+String.format("%.2f", point1.getY())+")");
            System.out.println("The line's end point's Coordinate is:");
            System.out.println("("+String.format("%.2f", point2.getX())+","+String.format("%.2f", point2.getY())+")");
            System.out.print("The line's length is:");        
            System.out.printf("%.2f", Math.sqrt(Math.pow(point1.getX()-point2.getX(),2)+Math.pow(point1.getY()-point2.getY(),2)));
        }
        else
            System.out.print("Wrong Format");
            
    }
}

 

 

缺陷:

    1.在进行展示的时候没有理清Point中display的作用,把要求的展示全部集中于Line中了;

改进建议:

    1.类中获取私有数据的方法重复度高,需要采取方法降低其复杂度。

题目集1  7-2 点线面问题重构(继承与多态)

整体思路分析:

    1.本题主要要求实现对类Point,类Line,类Plane,以及抽象类Element的创建;

    2.主要需要注意抽象类方法的使用;

度量分析

    圈复杂度分析使用 SourceMonitor 软件

 

 

 

 

 

 

核心代码分析

1.抽象类Element的建立

abstract class Element
{
    public abstract void display();//抽象方法的建立
}

2.类Plane的建立

class Plane extends Element//继承抽象类
{
    private String color;

    
    Plane(String color)//构造函数
    {
        this.color=color;
    }
    
    public String getcolor()//获取私有数据
    {
        return color;
    }
    
    public void setcolor(String c)//改变私有数据
    {
        color=c;
    }
    
    public void display()//展示
    {
        System.out.println("The Plane's color is:"+color);
    }
}

类Point,以及类Line与7-1中基本一样,不作分析

 

踩坑点:

    1.抽象类的使用不熟练,需要翻书才能确定其使用的正确方式。

改进建议:

    多尝试一些复杂的抽象类题目,增强自己对其了解程度。

 

题目集1  7-3 点线面问题再重构(容器类)

整体思路分析:

    1.本题主要要求实现对类Point,类Line,类Plane,以及抽象类Element的创建,与7-2一致,但多了一个容器类GeometryObject的创建和使用

    2.主要需要注意抽象类方法的使用;

    3.本题考察了对ArrayList类方法的使用;

度量分析

    圈复杂度分析使用 SourceMonitor 软件

 

核心代码分析

1.Main函数

public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        GeometryObject t=new GeometryObject();
        Point p1=new Point(in.nextDouble(),in.nextDouble());
        t.add(p1);
        Point p2=new Point(in.nextDouble(),in.nextDouble());
        t.add(p2);
        Point m1=new Point(in.nextDouble(),in.nextDouble());
        t.add(m1);
        Point m2=new Point(in.nextDouble(),in.nextDouble());
        t.add(m2);
        String color=in.next();
        
        Line line=new Line(p1,p2,color);
        t.add(line);
        Plane plane=new Plane(color);
        t.add(plane);

        int choice = in.nextInt();
        while(choice != 0) {
        switch(choice) {
            case 1:
                Point p3=new Point(in.nextDouble(),in.nextDouble());
                t.add(p3);
                break;
            case 2:
                Point p4=new Point(in.nextDouble(),in.nextDouble());
                Point p5=new Point(in.nextDouble(),in.nextDouble());
                String color0=in.next();
                Line line1=new Line(p4,p5,color0);
                t.add(line1);
                break;
            case 3:
                String color1=in.next();
                Plane plane1=new Plane(color1);
                t.add(plane1);
                break;
            case 4:
                int index = in.nextInt();
                t.remove(index);
            }
            choice = in.nextInt();
        }
        t.list();
    }

 

2.类GeometryObject的建立

class GeometryObject
{
    private ArrayList<Element> list=new ArrayList<Element>() ;//建立列表
    
    int dex=0;

    public void add(Element ele)//添加新对象
    {
        list.add(ele);
        dex++;
    }
    public void remove(int dex)//删除对象
    {
        list.remove(dex-1);
    }
    
    public void list()展示列表对象
    {
        for( Element element : list)
        {
            element.display();
       }
    }
}

 

类abstract,类Point,类Plane以及类Line与7-2中基本一样,不作分析

 

踩坑点:

    1.抽象类的使用不熟练,需要翻书才能确定其使用的正确方式。

    2.忘记了将选择前确立的点,线,面数据加入列表中,而导致没有拿到全分

改进建议:

    1.多尝试一些复杂的抽象类题目,增强自己对其了解程度。

    2.写代码时遇到问题要冷静分析,不能因为时间而慌了手脚。

 

 

PTA大作业四——题目集2

整体总结

                    此题目集难度陡然上升,每个题难度都很大,测试样例少并且测试点达到50之多,许多测试点都不能根据题目退出,得自己寻找边界数据测试然后进行修改,耗时很长。

题目集2 7-1 sdut-String-2 识蛟龙号载人深潜,立科技报国志 

整体分析

    1.这一题的内容较简单,测试样例较少,仅需要简单的截取每排的数据进行相加在展示即可;

度量分析

    圈复杂度分析使用 SourceMonitor

  核心代码分析

import  java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s =in.nextLine();
        while(s!="end")
        {
            int sum=0;
            for (int i=0;i<s.length();i++)
            {
                if(s.charAt(i)>='0'&&s.charAt(i)<='9')
                {
                    int j=i,k;
                    for (k=j;k<s.length();k++)
                    {
                        if(s.charAt(k)<'0'||s.charAt(k)>'9')
                        {
                            i=k;
                            String m =s.substring(j, k);
                            sum=sum+Integer.parseInt(m);
                            break;
                        }
                        else if(k==s.length()-1)
                        {
                            i=k;
                            String m =s.substring(j, k+1);
                            sum=sum+Integer.parseInt(m);
                            break;
                        }
                    }
                }
            }
            s=in.nextLine();
            System.out.println(sum);
        }
    }
}

 

踩坑心得:

    1.由于通过一个非0-9来判断截取数据的起点,另一个非0-9来判断结束的原因,导致一排最后的数据无法截取(最后没有字了);

 

改进建议:

    1.无

 

题目集 7-2 点线形系列4-凸四边形的计算

整体分析

    1.本题考察判断输入数据是否合法,以及判断是否是四边形、平行四边形,判断是否是菱形、矩形、正方形,判断是凹四边形(false)还是凸四边形(true),以及交点相关问题等平面问题;

    2.此题涉及内容较多,且很多地方用到重复判断,所以采用建立各种方法进行判断, K(计算斜率),coinside(判断点重叠),Correct(判断是否合法输入)

    3.判断输入数据是否合法:

    题目明面上给的要求非常简单,但由于关于是否合法的要求没有完全给出,导致许多测试点都过不去。经过多次尝试,得出一下输入格式:

    合法输入:(1)1,1 1,2  (2)+1,1 1,2  (3)1,1 1.0 1  

    非法输入:(1)++1,1 1,2      (2)+1+,1 1,2  (3)+01,1 1,2  (4).1,1 1,2  (5)1.,1 1,2  (6).,1 1,2  (7)+++,1 1,2  (8)000,1 1,1

    点的数量坐标过多:(1)1,1 1,2 1,3

    4.计算斜率:直接计算两直线斜率。斜率相同,返还0,斜率不同,返还1;

    5.通过线段斜率以及线段长度来判断各种形状的判断;

    6.coinside:通过Double.parseDouble(a[i])方法将传入的字符串转换为整数型,便于判断是否为同一点。

度量分析

    6.选项1-4的主函数部分较简略,且无踩坑点,5的逻辑判断较为复杂;

    圈复杂度分析使用 SourceMonitor

 

 

核心代码分析

    斜率计算:

复制代码

public static int K(double x1,double y1,double x2, double y2,double x3,double y3,double x4,double y4)
{
if((x2-x1==0&&y2-y1==0)||(x3-x4==0&&y3-y4==0))
return 0;
if((x2-x1==0&&x4-x3!=0)||(x2-x1!=0&&x4-x3==0))
return 1;
if(x2-x1==0&&x4-x3==0)
return 0;
double k1=(y2-y1)*1.0/(x2-x1);
double k2=(y4-y3)*1.0/(x4-x3);
if(k1!=k2)
return 1;
return 0;
}复制代码

    重合点判断:

复制代码

public static int coinside(int x,String s)
{
int flag=1,i=0,j=0;
String[] a=s.split(" |,");
for(i=0;i<2*(x-1);i+=2)
{
double m1=Double.parseDouble(a[i]);
double n1=Double.parseDouble(a[i+1]);
for (j=i+2;j<2*x-1;j+=2)
{
double m2=Double.parseDouble(a[j]);
double n2=Double.parseDouble(a[j+1]);
if(m1==m2&&n1==n2)
flag=0;
}
}
return flag;
}

复制代码

    选项1:判断是否是四边形、平行四边形

 

if(flag2==0)
System.out.println("points coincide");//判断点重合
else
{
if(K(x1,y1,x2,y2,x2,y2,x3,y3)==1&&K(x2,y2,x3,y3,x3,y3,x4,y4)==1&&K(x3,y3,x4,y4,x1,y1,x4,y4)==1&&flag3==1)//判断相邻边斜率是否一致
{
System.out.print(true+" ");
if(K(x1,y1,x2,y2,x3,y3,x4,y4)==0&&K(x1,y1,x4,y4,x2,y2,x3,y3)==0)
System.out.print(true);
else
System.out.print(false);
}
else
System.out.print(false+" "+false);
}

    选项2:判断是否是菱形、矩形、正方形

                if(K(x1,y1,x2,y2,x2,y2,x3,y3)==1&&K(x2,y2,x3,y3,x3,y3,x4,y4)==1&&K(x3,y3,x4,y4,x1,y1,x4,y4)==1&&flag2==1&&flag3==1)
                            {
                                double c1=Math.pow(y2-y1, 2)+Math.pow(x2-x1, 2);
                                double c2=Math.pow(y3-y2, 2)+Math.pow(x3-x2, 2);
                                double c3=Math.pow(y4-y3, 2)+Math.pow(x4-x3, 2);
                                double c4=Math.pow(y1-y4, 2)+Math.pow(x1-x4, 2);
                                if(c1==c2&&c2==c3&&c3==c4)
                                    System.out.print(true+" ");
                                else
                                    System.out.print(false+" ");
                                if(K(x1,y1,x2,y2,x3,y3,x4,y4)==0&&c1==c3&&isvertical(x1,y1,x4,y4,x4,y4,x3,y3)==1)
                                    System.out.print(true+" ");
                                else
                                    System.out.print(false+" ");
                                if(c1==c2&&c2==c3&&c3==c4&&isvertical(x1,y1,x4,y4,x4,y4,x3,y3)==1)
                                    System.out.print(true);
                                else
                                    System.out.print(false);
                            }
                            else
                                System.out.print("not a quadrilateral");

 

    选项3:判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔    

if(K(x1,y1,x2,y2,x2,y2,x3,y3)==1&&K(x2,y2,x3,y3,x3,y3,x4,y4)==1&&K(x3,y3,x4,y4,x1,y1,x4,y4)==1&&flag2==1&&flag3==1)
                            {
                                    System.out.print(concave_convex(x1,y1,x2,y2,x3,y3,x4,y4)+" ");
                                    double C,S1,S2,p1,p2,p3,p4;
                                    double len1=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
                                    double len2=Math.sqrt(Math.pow(x2-x3, 2)+Math.pow(y2-y3, 2));
                                    double len3=Math.sqrt(Math.pow(x3-x4, 2)+Math.pow(y3-y4, 2));
                                    double len4=Math.sqrt(Math.pow(x4-x1, 2)+Math.pow(y4-y1, 2));
                                    double len5=Math.sqrt(Math.pow(x1-x3, 2)+Math.pow(y1-y3, 2));
                                    double len6=Math.sqrt(Math.pow(x2-x4, 2)+Math.pow(y2-y4, 2));
                                    p1=(len1+len2+len5)/2;
                                    p2=(len3+len4+len5)/2;
                                    p3=(len1+len4+len6)/2;
                                    p4=(len3+len2+len6)/2;
                                    S1=Math.sqrt(p1*(p1-len1)*(p1-len2)*(p1-len5))+Math.sqrt(p2*(p2-len3)*(p2-len4)*(p2-len5));
                                    S2=Math.sqrt(p3*(p3-len1)*(p3-len4)*(p3-len6))+Math.sqrt(p4*(p4-len2)*(p4-len3)*(p4-len6));
                                    C=len1+len2+len3+len4;
                                    prinf(C);
                                    System.out.print(" ");
                                    if(S1<=S2)
                                        prinf(S1);
                                    else
                                        prinf(S2);
                            }
                            else
                                System.out.print("not a quadrilateral");

    选项4:

            if(x1==x2&&y1==y2)
                        System.out.println("points coincide");
                    else
                    {
                        double[] k=new double[5];
                        int num=0;
                        k[1]=K(m[0],n[0],m[1],n[1],m[1],n[1],m[2],n[2]);
                        k[2]=K(m[1],n[1],m[2],n[2],m[2],n[2],m[3],n[3]);
                        k[3]=K(m[2],n[2],m[3],n[3],m[3],n[3],m[0],n[0]);
                        k[4]=K(m[3],n[3],m[0],n[0],m[0],n[0],m[1],n[1]);
                        for (int j=1;j<5;j++)
                            if(k[j]==0)
                                num++;
                        if(lines_coincidence(x1,y1,x2,y2,m[0],n[0],m[1],n[1])||lines_coincidence(x1,y1,x2,y2,m[1],n[1],m[2],n[2])||lines_coincidence(x1,y1,x2,y2,m[2],n[2],m[3],n[3])||lines_coincidence(x1,y1,x2,y2,m[3],n[3],m[0],n[0]))
                            System.out.println("The line is coincide with one of the lines");
                        else
                        {
                            if(num==0)
                            {        
                                if(isquad(m[0],n[0],m[1],n[1],m[2],n[2],m[3],n[3])==0)
                                    System.out.println("not a quadrilateral or triangle");
                                else
                                {    
                                    double S0=calculateS(m[0],n[0],m[1],n[1],m[2],n[2],m[3],n[3]);                                            
                                    double[] p=new double[4];
                                    double[] q=new double[4];
                                    int G=0,G0;
                                    for (int i=0;i<4;i++)
                                    {    
                                        if(K(x1,y1,x2,y2,m[i],n[i],m[(i+1)%4],n[(i+1)%4])==1)
                                        {
                                            double z1,z2;
                                            z1=cross(1,x1,y1,x2,y2,m[i],n[i],m[(i+1)%4],n[(i+1)%4]);
                                            z2=cross(2,x1,y1,x2,y2,m[i],n[i],m[(i+1)%4],n[(i+1)%4]);
                                            if(z1>=Math.min(m[i],m[(i+1)%4])&&z1<=Math.max(m[i],m[(i+1)%4])&&z2>=Math.min(n[i],n[(i+1)%4])&&z2<=Math.max(n[i],n[(i+1)%4]))
                                            {
                                                p[G]=z1;
                                                q[G]=z2;
                                                G++;
                                            }
                                        }
                                    }
                                    G0=G;
                                    for (int i=0;i<G0;i++)
                                    {
                                        for (int j=i+1;j<G0;j++)
                                            if(p[i]==p[j]&&q[i]==q[j])
                                                G--;
                                    }
                                    if(G<=1)
                                        System.out.print(G);
                                    else 
                                    {
                                        double x0=p[0],y0=q[0],xt=0,yt=0;
                                        for (int i=0;i<G0;i++)
                                            if(x0!=p[i]||y0!=q[i])
                                            {
                                                xt=p[i];yt=q[i];break;
                                            }
                                        if(G0-G==0)
                                        {
                                            int f=-1;
                                            for (int i=0;i<4;i++)
                                                if(K(m[i],n[i],x0,y0,x0,y0,m[(i+1)%4],n[(i+1)%4])==0)
                                                {
                                                    f=i;
                                                    break;
                                                }                                        
                                            double S=calculateS(m[f],n[f],m[(f+3)%4],n[(f+3)%4],xt,yt,x0,y0);
                                            double s0=S0-S;
                                            if(S<s0)
                                            {
                                                double o=S;
                                                S=s0;
                                                s0=o;
                                            }
                                            System.out.print(G+" ");
                                            prinf(s0);
                                            System.out.print(" ");
                                            prinf(S);
                                        }
                                        if(G0-G==1||G0-G==2)
                                        {
                                            int f=-1;
                                            for (int i=0;i<4;i++)
                                                if((x0==m[i]&&x0==n[i])||(xt==m[i]&&xt==n[i]))
                                                {
                                                    f=i;
                                                    break;
                                                }
                                            double S=calculateS(m[f],n[f],m[(f+3)%4],n[(f+3)%4],xt,yt,x0,y0);
                                            double s0=S0-S;
                                            if(S<s0)
                                            {
                                                double o=S;
                                                S=s0;
                                                s0=o;
                                            }
                                            System.out.print(G+" ");
                                            prinf(s0);
                                            System.out.print(" ");
                                            prinf(S);
                                        }
                                    }    
                                }
                            }
                            else if(num==1||num==2)
                            {
                                int fg=0,dex=-1;
                                for (int i=0;i<4;i++)
                                {
                                    int j=(i+1)%4;
                                        if(m[i]==m[j]&&n[i]==n[j]&&K(m[i],n[i],m[(i+1)%4],n[(i+1)%4],m[i],n[i],m[(i+3)%4],n[(i+3)%4])==1)
                                        {
                                            fg=1;
                                            dex=i;
                                            break;
                                        }
                                }
                                int t=-1;
                                for(int i=0;i<4;i++)
                                {
                                    if(T(m[i],n[i],m[(i+1)%4],n[(i+1)%4],m[(i+1)%4],n[(i+1)%4],m[(i+2)%4],n[(i+2)%4])==0)
                                        t=0;
                                }
                                if(t==0&&fg==0)
                                    System.out.println("not a quadrilateral or triangle");
                                else
                                {
                                    double[] r=new double[3];
                                    double[] u=new double[3]; 
                                    if(fg==1)
                                    {                
                                        for(int i=0,j=0;i<4;i++)
                                        {
                                            if(i==dex)
                                                continue;
                                            r[j]=m[i];
                                            u[j]=n[i];
                                            j++;
                                        }
                                    }
                                    else
                                    {
                                        dex=0;
                                        for(int i=0;i<4;i++)
                                        {
                                            if(K(m[(i+3)%4],n[(i+3)%4],m[i],n[i],m[i],n[i],m[(i+1)%4],n[(i+1)%4])==0)
                                            {
                                                dex=i;
                                                break;
                                            }
                                        }
                                        for(int i=0,j=0;i<4;i++)
                                        {
                                            if(i==dex)
                                                continue;
                                            r[j]=m[i];
                                            u[j]=n[i];
                                            j++;
                                        }
                                    }
                                        double[] p=new double[4];
                                        double[] q=new double[4];
                                        int G=0,G0;
                                        for (int i=0;i<3;i++)
                                        {    
                                            if(K(x1,y1,x2,y2,r[i],u[i],r[(i+1)%3],u[(i+1)%3])==1)
                                            {
                                                double z1,z2;
                                                z1=cross(1,x1,y1,x2,y2,r[i],u[i],r[(i+1)%3],u[(i+1)%3]);
                                                z2=cross(2,x1,y1,x2,y2,r[i],u[i],r[(i+1)%3],u[(i+1)%3]);
                                                if(z1>=Math.min(r[i],r[(i+1)%3])&&z1<=Math.max(r[i],r[(i+1)%3])&&z2>=Math.min(u[i],u[(i+1)%3])&&z2<=Math.max(u[i],u[(i+1)%3]))
                                                {
                                                    p[G]=z1;
                                                    q[G]=z2;
                                                    G++;
                                                }
                                            }
                                        }
                                        G0=G;
                                        for (int i=0;i<G0;i++)
                                        {
                                            for (int j=i+1;j<G0;j++)
                                                if(p[i]==p[j]&&q[i]==q[j])
                                                    G--;
                                        }
                                        if(G<=1)
                                            System.out.print(G);
                                        else 
                                        {
                                            double S0=der(r[0],u[0],r[1],u[1],r[2],u[2]);
                                            double x0=p[0],y0=q[0],xt=0,yt=0;
                                            for (int i=0;i<G0;i++)
                                                if(x0!=p[i]||y0!=q[i])
                                                {
                                                    xt=p[i];yt=q[i];break;
                                                }
                                            if(G0-G==0)
                                            {
                                                int f=-1;
                                                for (int i=0;i<3;i++)
                                                    if(K(r[i],u[i],x0,y0,x0,y0,r[(i+1)%3],u[(i+1)%3])==0&&K(r[(i+1)%3],u[(i+1)%3],xt,yt,xt,yt,r[(i+2)%3],u[(i+2)%3])==0)
                                                    {
                                                        f=i;
                                                        break;
                                                    }
                                                double S=calculateS(r[f],u[f],r[(f+2)%3],u[(f+2)%3],xt,yt,x0,y0);
                                                double s0=S0-S;
                                                if(S<s0)
                                                {
                                                    double o=S;
                                                    S=s0;
                                                    s0=o;
                                                }
                                                System.out.print(G+" ");
                                                prinf(s0);
                                                System.out.print(" ");
                                                prinf(S);
                                            }
                                            if(G0-G==1)
                                            {
                                                int f=-1;
                                                double S=0;
                                                for (int i=0;i<3;i++)
                                                {
                                                    if(x0==r[i]&&y0==u[i])
                                                    {
                                                        S=der(r[i],u[i],r[(i+1)%3],u[(i+1)%3],xt,yt);
                                                        break;
                                                    }
                                                    if(xt==r[i]&&yt==u[i])
                                                    {
                                                        S=der(r[i],u[i],r[(i+1)%3],u[(i+1)%3],x0,y0);
                                                        break;
                                                    }
                                                }
                                                double s0=S0-S;
                                                if(S<s0)
                                                {
                                                    double o=S;
                                                    S=s0;
                                                    s0=o;
                                                }
                                                System.out.print(G+" ");
                                                prinf(s0);
                                                System.out.print(" ");
                                                prinf(S);
                                            }
                                        }                                    
                                }
                            }
                            else
                                System.out.println("not a quadrilateral or triangle");        
                        }
                    }
                }
                    
            }

 

    选项4所用函数:判断点的位置

复制代码
        
根据线性代数的知识计算交点坐标
          double a1 = y2- y1; double b1 = x1 - x2; double c1 = x1*y2 - x2*y1; double a2 = y4 - y3; double b2 = x3 - x4; double c2 = x3*y4 - x4*y3; double det= a1*b2 - a2*b1; double x0 = (c1*b2 - c2*b1)/det; double y0 = (a1*c2 - a2*c1)/det; if((x0==x1&&y0==y1)||(x0==x2&&y0==y2)||(x0==x3&&y0==y3)||(x0==x4&&y0==y4)) { System.out.println(x0+","+y0+" "+"false"); }
          从网上学习的判断交点是否在线段内的函数用法 else if(!java.awt.geom.Line2D.linesIntersect(x1, y1, x2, y2, x3, y3, x4, y4)) { if(x1==Math.max(Math.max(x2, x3),Math.max(x2, x4))||x1==Math.min(Math.min(x2, x3),Math.min(x2, x4))) System.out.println(x0+","+y0+" "+"false"); else System.out.println(x0+","+y0+" "+"true"); } else { System.out.println(x0+","+y0+" "+"true");
复制代码

     选项5:判断点的位置

double[] k=new double[5];
                    int num=0;
                    k[1]=K(m[0],n[0],m[1],n[1],m[1],n[1],m[2],n[2]);
                    k[2]=K(m[1],n[1],m[2],n[2],m[2],n[2],m[3],n[3]);
                    k[3]=K(m[2],n[2],m[3],n[3],m[3],n[3],m[0],n[0]);
                    k[4]=K(m[3],n[3],m[0],n[0],m[0],n[0],m[1],n[1]);
                    //k[5]=K(m[2],n[2],m[0],n[0],m[0],n[0],m[1],n[1]);
                    for (int j=1;j<5;j++)
                        if(k[j]==0)
                        {
                            num++;
                        }    
                    if(num==0)
                    {
                        if(isquad(m[0],n[0],m[1],n[1],m[2],n[2],m[3],n[3])==0)
                            System.out.println("not a quadrilateral or triangle");
                        else
                        {
                            int on=0;
                            for (int i=0;i<4;i++)
                                if(onorout(x,y,m[i],n[i],m[(i+1)%4],n[(i+1)%4])==1)
                                    on=1;
                            if(on==1)
                                System.out.println("on the quadrilateral");
                            else
                            {
                                double sum=0;
                                for (int i=0;i<4;i++)
                                {
                                    double sum0=der(x,y,m[i],n[i],m[(i+1)%4],n[(i+1)%4]);
                                    sum=sum+sum0;
                                }
                                double S=calculateS(m[0],n[0],m[1],n[1],m[2],n[2],m[3],m[3]);
                                if(S==sum)
                                    System.out.println("in the quadrilateral");
                                else
                                    System.out.println("outof the quadrilateral");
                            }
                        }
                    }
                    else if(num==1||num==2)
                    {
                        int fg=0,dex=-1;
                        for (int i=0;i<4;i++)
                        {
                            for (int j=i+1;j<4;j++)
                                if(m[i]==m[j]&&n[i]==n[j]&&K(m[i],n[i],m[(i+1)%4],n[(i+1)%4],m[i],n[i],m[(i+3)%4],n[(i+3)%4])==1)
                                {
                                    fg=1;
                                    dex=i;
                                    break;
                                }
                        }
                        int t=-1;
                        for(int i=0;i<4;i++)
                        {
                            if(T(m[i],n[i],m[(i+1)%4],n[(i+1)%4],m[i],n[i],m[(i+2)%4],n[(i+2)%4])==0)
                                t=0;
                        }
                        if(t==0&&fg==0)
                            System.out.println("not a quadrilateral or triangle");
                        else
                        {
                            double[] r=new double[3];
                            double[] u=new double[3]; 
                            if(fg==1)
                            {                    
                                for(int i=0,j=0;i<4;i++)
                                {
                                    if(i==dex)
                                        continue;
                                    r[j]=m[i];
                                    u[j]=n[i];
                                    j++;
                                }
                            }
                            else
                            {
                                dex=0;
                                for(int i=0;i<4;i++)
                                {
                                    if(K(m[(i+3)%4],n[(i+3)%4],m[i],n[i],m[i],n[i],m[(i+1)%4],n[(i+1)%4])==0)
                                    {
                                        dex=i;
                                        break;
                                    }
                                }
                            }
                            for(int i=0,j=0;i<4;i++)
                            {
                                if(i==dex)
                                    continue;
                                r[j]=m[i];
                                u[j]=n[i];
                                j++;
                            }
                            int on=0;
                            for (int i=0;i<3;i++)
                                if(onorout(x,y,r[i],u[i],r[(i+1)%3],u[(i+1)%3])==1)
                                    on=1;
                            if(on==1)
                                System.out.println("on the triangle");
                            else
                            {
                                double sum=0;
                                for (int i=0;i<3;i++)
                                {
                                    double sum0=der(x,y,r[i],u[i],r[(i+1)%3],u[(i+1)%3]);
                                    sum=sum+sum0;
                                }
                                double S=der(r[0],u[0],r[1],u[1],r[2],u[2]);
                                if(S==sum)
                                    System.out.println("in the triangle");
                                else
                                    System.out.println("outof the triangle");
                            }
                        }
                    }
                    else
                        System.out.println("not a quadrilateral or triangle");        
                }
            }
            else
                System.out.println("Wrong Format");
        }

 

踩坑点:

    1.错误的理解了点重叠在选项4中的应用,错误的认为4个点均不能重复,而导致许多测试点无法通过;

    2.第一题的格式是否合法在第二题不完全适用,但由于测试点无法给出具体问题所在,而一直无法发现错误;

      3.选项4中有关三角形能否构成的条件不是很理解,不能get到跟测试点符合的要求;

改进建议:

    由于代码中多次运用Double.parseDouble(a[i])方法,而导致代码复杂度较高,建议将其在代码初始位置就转换完成,而不是每个选项都转换一次。

 

题目集 7-3 设计一个银行业务类

整体思路分析:     

    1.这一题考察了对类的创建和使用,总体较为基础。

度量分析

   

 

 

 

 

 核心代码分析

    1.银行类的创建

class BankBusiness
{
    public static String bankname = "中国银行";
    private String name,password;
    private double balance;
    
    BankBusiness(String n,String p)
    {
        name=n;
        password=p;
        balance =0;
    }
    
    public static void welcome()
    {
        System.out.println(bankname+"欢迎您的到来!");
    }
    
    public static void welcomeNext()
    {
        System.out.print("请收好您的证件和物品,欢迎您下次光临!");
    }
    
    public void deposit(String p,double b)
    {
        if(p.equals(password))
        {
            balance+=b;
            System.out.println("您的余额有"+balance+"元。");
        }
        else
            System.out.println("您的密码错误!");
    }
    
    public void withdraw(String p,double b)
    {
        if(p.equals(password)&&b<=balance)
        {
            balance-=b;
            System.out.println("请取走钞票,您的余额还有"+balance+"元。");
        }
        else if(p.equals(password)&&b>balance)
        {
            System.out.println("您的余额不足!");
        }
        else
            System.out.println("您的密码错误!");
    }
}

踩坑点:

    1.私有数据不能直接访问,需要用set方法进行调用;

    2.密码的字符串不能直接比较,需要用equals方法判断密码是否正确。

 

改进建议:题目要求较简单,无改进建议。

 

总结

    1.对于第四次大作业的编写,除了7-1,7-2还能静下心来减少代码的复杂度,7-3只完全执着于过测试点,而忽略了代码的复杂度问题,最终造成了900行代码的“惨烈壮举”(甚至在写的过程中,由于代码过多而出现无法提交的情况),希望以后能引以为戒,追求结果的同时也不能忽视质量的好坏,将其养成习惯,持之以恒;

    2.这次作业和考试让我了解到,光靠上课听老师讲,看老师举例子,去理解,是完全不够的,必须需要自己勤加练习,经过这考试,我发现自己对列表和抽象类的使用有很多不熟悉和了解的地方,需要多看书,多敲代码,才能弥补这方面的不足;

    3.这次作业唯一的缺陷还是类的建立和使用太少,一是不够熟练,二是类的建立可能会大幅度减少我的代码行数和复杂度;

    4.这次大作业让我意识到,难度较高的代码如果出现错误,很难凭借眼力找出,这时,debug的重要性就显现了,通过debug,大幅度减少了我找bug的时间,所以,掌握每门语言、每种软件的debug技巧十分重要;

    5.通过这次考试和作业,我更加体会到类的使用以及继承与多肽的使用带来的便利,非常值得学习;

    6.希望老师能够多出一些继承与类的题目,而不是一些复杂的数学题,更希望自己能练习一些上课学的知识的题目。

posted @ 2022-05-09 13:42  沦落之影  阅读(114)  评论(0)    收藏  举报