nchu-java 1-3次大作业总结

一、前言

1.知识点:

第一次题目集:一共有九道题目,主要考察了Java浮点数的运用,if-else语句,switch语句的运用,一维数组等的运用。

第二次题目集:一共有三道题,主要考察字符串,数组等内容。

第三次题目集:题目共三道题,主要运用的是创建以及运用点类,线类和三角类。

2.题量与难度:

题目的数量与难度互相契合,很便于对Java的学习与运用,从第一次作业到第三次,通过具体的题目要求,逐步引导我们从面向过程的思维过渡到面向对象的思维。并且题目类型也比较的基础,所涉及到的知识点和基础语法也是以前C语言中的,第一次作业相对容易,第二次题目集题目难度则更多体现在复杂上。算法的设计都大同小异,但是第三次作业的题目的要求大了许多,涉及到的条件判断也更多。从第三次题目集开始,才迈向面向对象程序设计的大门,对类的创建以及运用,算法的逻辑与实现,都上升了一个台阶,对与新手的我而言,多多少少感觉到了题目的难度,但花了时间思考了问题并学习后,也收获了很多不一样的东西。

二、设计与分析

第一次作业

题目级一 7-1身体质量指数(BMI)测算
体重是反映和衡量一个人健康状况的重要标志之一,过胖和过瘦都不利于健康,BMI(身体质量指数)计算方法:体重(以千克为单位)除以身高(以米为单位)的平方。中国成人正常的BMI应在18.5-24之间,如果小于18.5为体重不足,如果大于等于24为超重,大于等于28为肥胖。请编写程序,测算身体状态。

输入格式:
两个数值:体重(以千克为单位),身高(以米为单位),数值间以空格分隔。例如:65.5 1.75。
注意:体重的世界纪录是727公斤,身高的世界纪录是2.72米。输入数据上限不得超过纪录,下限不得小于等于0;

输出格式:
输入数值超出范围 :输出“input out of range”。例如:-2 3或者125 5。
BMI小于18.5 :输出“thin”。
BMI大于等于18.5小于24 :输出“fit”。
BMI大于等于24小于28 :输出“overweight”。
BMII大于等于28 :输出“fat”。

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double weight = input.nextDouble();
        double height = input.nextDouble();
        double BMI=0;
        BMI = weight / (height * height);
        if(weight>727||weight<=0||height>2.72||height<=0){
         System.out.println("input out of range");
         return;  
        }
            if (BMI < 18.5)
                System.out.println("thin");
            else if (BMI >= 18.5 && BMI < 24)
                System.out.println("fit");
            else if (BMI >= 24 && BMI < 28)
                System.out.println("overweight");
            else if (BMI >= 28)
                System.out.println("fat");
    }
}

此题主要是对java输入输出及简单计算的练习。

7-2 长度质量计量单位换算
长度、质量的计量有多重不同的计算体系,有标准的国际单位制:千克与米,也有各个国家自己的计量方法如:磅、英寸;1磅等于0.45359237千克,1英寸等于0.0254米,请编写程序实现国际单位制与英制之间的换算。

输入格式:
两个浮点数,以空格分隔,第一个是质量(以千克为单位)、第二个是长度(以米为单位)。例如:0.45359237 0.0254。

输出格式:
两个浮点数,以空格分隔,第一个是质量(以磅为单位)、第二个是长度(以英寸为单位)。例如:1.0 1.0。

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double quality = input.nextDouble();
double length = input.nextDouble();
double pounds = quality/0.45359237;
double inch = length/0.0254;
System.out.println((float)pounds+" "+(float)inch);
}
}

此题主要是对浮点数的练习。

7-3 奇数求和

计算一个数列中所有奇数的和。

输入格式:
十个整数,以空格分隔。例如:1 2 3 4 5 6 7 8 9 0。

输出格式:
输入数列中所有奇数之和。例如:25。

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int number, sum = 0;
for(int sorce = 0; sorce < 10; sorce++){
number = input.nextInt();
if(number % 2 == 1||number % 2 == -1)
sum += number;
}
System.out.println(sum);
}
}

循环输入十次,利用sorce判断输入,为奇数时加入累加器sum;

7-4 房产税费计算2022

房屋交易在日常生活中非常常见的事情,房屋交易时要额外支付各种税费,按2022年房产交易新政策的规定买房人应缴纳税费包括:

1、契税:首次购房评估额90平(含)内1%、90平-144平(含)内1.5%,超过144平或非首 次3%,买方缴纳。

2、印花税:房款的0.05%。

3、交易费:3元/平方米。

4、测绘费:1.36元/平方米。

5、权属登记费及取证费:一般情况是在200元内。

输入格式:
四个数据,以空格分隔:
1、第几次购房(整数)
2、房款(整数/单位万元)
3、评估价(整数/单位万元)
4、房屋面积(浮点数/单位平方米)。
例如:1 100 100 90。

输出格式:
契税、印花税、交易费、测绘费(以元为单位),以空格分隔。例如:10000.0 500.0 270.0 122.4

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int times = input.nextInt();
        int money = input.nextInt();
        int pinggu = input.nextInt();
        double area = input.nextDouble();
        double qishui=0,yinhua,jiaoyi,cehui;
        if(times==1&&area<=90){
            qishui=pinggu*100;
        }
        if(times==1&&area<=144&&area>90){
            qishui=pinggu*150;
        }
        if(times!=1||area>144){
            qishui=pinggu*300;
        }
        yinhua=money*5;
        jiaoyi=area*3;
        cehui=area*1.36;
        System.out.println((float)qishui+" "+(float)yinhua+" "+(float)jiaoyi+" "+(float)cehui);
    }
}

7-7 判断三角形类型

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:
在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:
(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。


import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        double l1 = input.nextDouble();
        double l2 = input.nextDouble();
        double l3 = input.nextDouble();
        if (l1<1||l1>200||l2<1||l2>200||l3<1||l3>200)
        {System.out.println("Wrong Format");
            return;}
        else if (l1+l2<=l3||Math.abs(l1-l2)>=l3)
        {System.out.println("Not a triangle");
            return;}
        else if (l1*l1+l2*l2==l3*l3||l1*l1+l3*l3==l2*l2||l2*l2+l3*l3==l1*l1){
            System.out.println("Right-angled triangle");
            return;}
        else if (l1==l2&&l2==l3) {
            System.out.println("Equilateral triangle");
            return;}
        else if ((Math.abs((l1*l1+l2*l2)-l3*l3)<0.000001&&l1==l2)||(Math.abs((l1*l1+l3*l3)-l2*l2)<0.000001&&l1==l3)||(Math.abs((l2*l2+l3*l3)-l1*l1)<0.000001&&l2==l3)){
            System.out.println("Isosceles right-angled triangle");
            return;}
        else if (l1==l2||l1==l3||l2==l3){
            System.out.println("Isosceles triangle");
            return;}

        else{
            System.out.println("General triangle");
            return;
        
        }
    }
}

等边三角形有a = b = c ;
等腰三角形有a = b || b = c;
直角三角形有: pow(a,2) + pow(b,2) = pow(c,2);

第二次作业

7-2 串口字符解析

RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送58位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(58位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111

输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error

import java.util.Scanner;
public class Main {
    public static int jiou(String a){
        int cnt=0;
        for(int i=0;i<a.length();i++){
            if(a.charAt(i)=='1')
                cnt+=1;
        }
        if(cnt%2==1)
            return 0;
        else
            return 1;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = input.nextLine();
        int le;
        int start;
        int head=0;
        int a=0;
        le = s.length();
        if (le < 11) {
            System.out.print("null data");
            return;
        }
        for (int i = 0; i < le; i++) {
            if (s.charAt(i) == '1'){
                a+=1;
            }
            if(a==le){
                System.out.print("null data");
                return;
            }
        }
        for (int i = 0; i < le; i++) {
            if (s.charAt(i) == '0') {
                start = i;

                if (s.charAt(start + 10) != '1') {
                    System.out.printf("%d:validate error\n",++head);
                }
                else if (jiou(s.substring(start+1,start+9))!=s.charAt(start+9)-'0') {
                    System.out.printf("%d:parity check error\n",++head);
                }
                     else {
                         System.out.printf("%d:%s\n",++head,s.substring(start+1,start+9));
                    }
                i += 10;
                     if(s.length()<start+20) {
                         return;
                     }
                }

            }
        }
    }


这题只用了一个main函数,并没有创建类,而且考察的知识是奇偶校验,主要是逻辑的判断与分析。

第三次作业

7-1 点线形系列1-计算两点之间的距离

输入连个点的坐标,计算两点之间的距离

输入格式:
4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。


import java.util.Scanner;
public class Main {
    public static boolean check(String tmp){
        return tmp.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$");
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double[] num=new double[100];
        int cnt=0;
        String s = input.nextLine();
        String[] ret = s.split(" |,");
        for (String a : ret) {
            check(a);
            if (!check(a)) {
                System.out.println("Wrong Format");
                return;
            }
            num[cnt++]=Double.parseDouble(a);
        }
        if(cnt!=4){
            System.out.println("wrong number of points");
            return;
        }
        System.out.println(Math.sqrt(Math.pow(num[0]-num[2],2)+Math.pow(num[1]-num[3],2)));
    }
}


先采用正则表达式对数组中的每一个进行判断,有不满足的就输出“Wrong format”
采用String.split函数将输入串分割;
采用Double.parsedouble函数将数组中的每一个转换为double型的num数组
输出num数组

7-2 点线形系列2-线的计算

用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",

输出格式:
见题目描述。

import java.util.Scanner;
public class Main {
    public static boolean check(String tmp){
        return tmp.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$");}

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double[] num = new double[100];
        int cnt = 0;
        String s = input.nextLine();
       
        if(!s.matches("^[1-5][:](([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))[,]([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))\\s?)+$")){
            System.out.println("Wrong Format");
            return;
        }
        String[] ret = s.split(" |,|:");
        for (String a : ret) {
            check(a);
            if (!check(a)) {
                System.out.print("Wrong Format");
                return;
            }
            num[cnt++] = Double.parseDouble(a);
        }
        if (num[0] == 1) {
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            Point p1 = new Point(x1, y1);
            Point p2 = new Point(x2, y2);
            if (cnt != 5) {
                System.out.print("wrong number of points");
                return;
            }
            if (p2.getX().equals(p1.getX()) && p2.getY().equals(p1.getY())) {
                System.out.print("points coincide");
                return;
            }
            if (p2.getX().equals(p1.getX())) {
                System.out.print("Slope does not exist");
                return;
            }
            System.out.print((p2.getY() - p1.getY()) / (p2.getX() - p1.getX()));
        }
        if (num[0] == 2) {
            if (cnt != 7) {
                System.out.print("wrong number of points");
                return;
            }
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            double x3 = num[5];
            double y3 = num[6];
            Point p1 = new Point(x1, y1);
            Point p2 = new Point(x2, y2);
            Point p3 = new Point(x3, y3);
            System.out.println(Math.abs((p3.getY() - p2.getY()) * (p1.getX() - p2.getX()) - (p3.getX() - p2.getX()) * (p1.getY() - p2.getY())) /
                    Math.sqrt(Math.pow(p2.getY() - p3.getY(), 2) + Math.pow(p2.getX() - p3.getX(), 2)));
        }
        if (num[0] == 3) {
            if (cnt != 7) {
                System.out.print("wrong number of points");
                return;
            }
            for (int j = 1; j < 4; j++) {
                if (num[j] == num[j + 2]) {
                    if (num[j + 1] == num[j + 3]) {
                        System.out.print("points coincide");
                        return;
                    }
                }
            }

            if (num[1] == num[5] && num[2] == num[6]) {
                System.out.print("points coincide");
                return;
            }
            if ((num[6] - num[2]) * (num[3] - num[1]) == (num[4] - num[2]) * (num[5] - num[1])) {
                System.out.print("true");
                return;
            }
            System.out.print("false");
            return;
        }
        if (num[0] == 4) {
            if (cnt != 9) {
                System.out.print("wrong number of points");
                return;
            }
            for (int k = 1; k < 5; k++) {
                if (num[k] == num[k + 2]) {
                    if (num[k + 1] == num[k + 3]) {
                        System.out.print("points coincide");
                        return;
                    }
                }
            }
            if (num[1] == num[7] && num[2] == num[8] || num[1] == num[5] && num[2] == num[6] || num[3] == num[7] && num[4] == num[8]) {
                System.out.print("points coincide");
                return;
            }
            if(num[5]==num[7]&&num[6]==num[8]){
                System.out.print("points coincide");
                return;
            }
            if (Math.abs((num[4] - num[2]) / (num[3] - num[1])) == Math.abs((num[8] - num[6]) / (num[7] - num[5]))) {
                System.out.print("true");
                return;
            }
             System.out.print(Math.abs((num[4] - num[2]) / (num[3] - num[1])));
             System.out.print(Math.abs((num[8] - num[6]) / (num[7] - num[5])));
            System.out.print("false");
        }
        if (num[0] == 5) {
            if (cnt != 9) {
                System.out.print("wrong number of points");
                return;
            }
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            double x3 = num[5];
            double y3 = num[6];
            double x4 = num[7];
            double y4 = num[8];
            Point p1 = new Point(x1, y1);
            Point p2 = new Point(x2, y2);
            Point p3 = new Point(x3, y3);
            Point p4 = new Point(x4, y4);
            if (p2.getX().equals(p1.getX()) && p2.getY().equals(p1.getY())||p4.getX().equals(p3.getX()) && p4.getY().equals(p3.getY())) {
                System.out.print("points coincide");
                return;
            }
            if ((p4.getY() - p3.getY()) / (p4.getX() - p3.getX()) == (p2.getY() -p1.getY()) / (p2.getX() - p1.getX()))
                System.out.print("is parallel lines,have no intersection point");
            else {
                double yz = ((p1.getY() - p2.getY()) * (p4.getY() - p3.getY()) * p1.getX() + (p4.getY() - p3.getY()) * (p2.getX() - p1.getX()) * p1.getY()
                        + (p2.getY() - p1.getY()) * (p4.getY() - p3.getY()) * p3.getX() + (p3.getX() - p4.getX()) * (p2.getY() - p1.getY()) * p3.getY())
                        / ((p2.getX() - p1.getX()) * (p4.getY() - p3.getY()) + (p1.getY() - p2.getY()) * (p4.getX() - p3.getX()));
                double xz = p3.getX() + (p4.getX() - p3.getX()) * (yz - p3.getY()) / (p4.getY() - p3.getY());
                System.out.print(xz + "," + yz + " ");
                if ((p2.getY() - p1.getY()) / (xz - p1.getX()) == (yz - p1.getY()) / (p2.getX() - p1.getX())
                        || (p4.getY() - p3.getY()) / (xz - p3.getX()) == (yz - p3.getY()) / (p4.getX() - p3.getX())){
                    if(xz!=p1.getX()&&yz!=p1.getY()||xz!=p2.getX()&&yz!=p2.getY()||xz!=p3.getX()&&yz!=p3.getY()||xz!=p4.getX()&&yz!=p4.getY()){
                        System.out.print("true");
                    }


                }
                else{
                    System.out.print("false");
                }
            }

        }
    }
}
class Point {
    private Double x;
    private Double y;
    public Point() {}
    public Point(Double x, Double y) {
        super();
        this.x = x;
        this.y = y;
    }
    public Double getX() {
        return x;
    }
    public Double getY() {
        return y;
    }
}


创建一个point类,设计传参数,返回计算所得到的值。首先用split函数用空格分割一次后再用split函数将每组坐标中的x,y坐标用逗号分割开。再通过创建的方法进行计算。
num[0] == 1:要特判斜率不存在
num[0] == 2:特判输入点重合的情况
num[0] == 4:特判两条线平行

7-3 点线形系列3-三角形的计算

用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"

import java.text.DecimalFormat;
import java.util.Scanner;
class Point
{
    double x;double y;
    public Point(double  x,double y)
    {
        this.x=x;
        this.y=y;
    }
    public static double distance(Point x, Point y) {
        double s;
        s = Math.sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
        return s;
    }
    public static boolean same(Point a,Point b){
        return (a.x==b.x&&a.y==b.y);
    }
    public Point (){}
    public static double area(Point x, Point y,Point z) {
        double s;
        double ab;
        double ac;
        double bc;
        s=(Math.sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y))+Math.sqrt((x.x - z.x) * (x.x - z.x) + (x.y - z.y) * (x.y - z.y))+
                Math.sqrt((y.x - z.x) * (y.x - z.x) + (y.y - z.y) * (y.y - z.y)))/2;
        ab=Math.sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
        ac=Math.sqrt((x.x - z.x) * (x.x - z.x) + (x.y - z.y) * (x.y - z.y));
        bc=Math.sqrt((y.x - z.x) * (y.x - z.x) + (y.y - z.y) * (y.y - z.y));
        return Math.sqrt(s*(s-ab)*(s-ac)*(s-bc));

    }
   public static double jiaodian(Point a, Point b, Point c, Point d) {
        double yz = ((a.y - b.y) * (d.y - c.y) * a.x + (d.y - c.y) * (b.x - a.x) * a.y
                + (b.y - a.y) * (d.y - c.y) * c.x + (c.x - d.x) * (b.y - a.y) * c.y)
                / ((b.x - a.x) * (d.y - c.y) + (a.y - b.y) * (d.x - c.x));
        double xz = c.x + (d.x - c.x) * (yz - c.y) / (d.y - c.y);
        if (xz != a.x && yz != a.y || xz != b.x && yz != b.y || xz != c.x && yz != c.y || xz != d.x && yz != d.y) {
            return 1;
        } else
            return 0;

    }
    public static double jiaodiany(Point a, Point b, Point c, Point d) {
        double yz = ((a.y - b.y) * (d.y - c.y) * a.x + (d.y - c.y) * (b.x - a.x) * a.y
                + (b.y - a.y) * (d.y - c.y) * c.x + (c.x - d.x) * (b.y - a.y) * c.y)
                / ((b.x - a.x) * (d.y - c.y) + (a.y - b.y) * (d.x - c.x));
        return yz;
    }
    public static double jiaodianx(Point a, Point b, Point c, Point d) {
        double yz = ((a.y - b.y) * (d.y - c.y) * a.x + (d.y - c.y) * (b.x - a.x) * a.y
                + (b.y - a.y) * (d.y - c.y) * c.x + (c.x - d.x) * (b.y - a.y) * c.y)
                / ((b.x - a.x) * (d.y - c.y) + (a.y - b.y) * (d.x - c.x));
        double xz = c.x + (d.x - c.x) * (yz - c.y) / (d.y - c.y);
        return xz;
    }
}
public class Main {
    public static boolean check(String tmp) {
        return tmp.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$");
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double[] num = new double[100];
        int cnt = 0;
        String s = input.nextLine();
        if(!s.matches("^[1-5][:](([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))[,]([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))\\s?)+$")){
            System.out.println("Wrong Format");
            return;
        }
        String[] ret = s.split(" |,|:");
        for (String a : ret) {
            check(a);
            if (!check(a)) {
                System.out.print("Wrong Format");
                return;
            }
            num[cnt++] = Double.parseDouble(a);
        }
        if (num[0] == 1) {
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            double x3 = num[5];
            double y3 = num[6];
            Point a = new Point(x1, y1);
            Point b = new Point(x2, y2);
            Point c = new Point(x3, y3);
            if (cnt != 7) {
                System.out.print("wrong number of points");
                return;
            }
            if (x1 == x3 && y1 == y3 || x3 == x2 && y3 == y2 || x1 == x2 && y1 == y2) {
                System.out.print("points coincide");
                return;
            }
            if (Point.distance(a, b) == Point.distance(a, c) || Point.distance(a, b) == Point.distance(b, c) || Point.distance(b, c) == Point.distance(a, c)) {
                System.out.print("true ");
                if (Point.distance(a, b) == Point.distance(a, c) && Point.distance(a, b) == Point.distance(b, c)) {
                    System.out.print("true");
                } else {
                    System.out.print("false");
                }
            } else {
                System.out.print("false false");
            }
        }
        if (num[0] == 2) {
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            double x3 = num[5];
            double y3 = num[6];
            Point a = new Point(x1, y1);
            Point b = new Point(x2, y2);
            Point c = new Point(x3, y3);
            double zc;
            double ar;
            DecimalFormat dt = new DecimalFormat("0.0#####");
            if (cnt != 7) {
                System.out.print("wrong number of points");
                return;
            }
            if (x1 == x3 && y1 == y3 || x3 == x2 && y3 == y2 || x1 == x2 && y1 == y2) {
                System.out.print("points coincide");
                return;
            }
            zc = Point.distance(a, b) + Point.distance(b, c) + Point.distance(a, c);
            ar=Point.area(a,b,c);
            System.out.printf(dt.format(zc));
            System.out.printf(" " + dt.format(ar));
            System.out.printf(" " + dt.format((x1 + x2 + x3) / 3));
            System.out.printf("," + dt.format((y1 + y2 + y3) / 3));
        }
        if (num[0] == 3) {
            double x1 = num[1];
            double y1 = num[2];
            double x2 = num[3];
            double y2 = num[4];
            double x3 = num[5];
            double y3 = num[6];
            Point a = new Point(x1, y1);
            Point b = new Point(x2, y2);
            Point c = new Point(x3, y3);
            if (cnt != 7) {
                System.out.print("wrong number of points");
                return;
            }
            if (x1 == x3 && y1 == y3 || x3 == x2 && y3 == y2 || x1 == x2 && y1 == y2) {
                System.out.print("points coincide");
                return;
            }
            if (Math.pow(Point.distance(a, b), 2) > Math.pow(Point.distance(b, c), 2) + Math.pow(Point.distance(a, c), 2) || Math.pow(Point.distance(b, c), 2) > Math.pow(Point.distance(a, b), 2) + Math.pow(Point.distance(a, c), 2) || Math.pow(Point.distance(a, c), 2) > Math.pow(Point.distance(a, b), 2) + Math.pow(Point.distance(b, c), 2)) {
                System.out.print("true false false");
                return;
            }
            if (Math.pow(Point.distance(a, b), 2) < Math.pow(Point.distance(b, c), 2) + Math.pow(Point.distance(a, c), 2) && Math.pow(Point.distance(b, c), 2) < Math.pow(Point.distance(a, b), 2) + Math.pow(Point.distance(a, c), 2) && Math.pow(Point.distance(a, c), 2) < Math.pow(Point.distance(a, b), 2) + Math.pow(Point.distance(b, c), 2)) {
                System.out.print("false false true");
                return;
            }
            System.out.print("false true false");
             return;
        }
        if (num[0] == 4) {
                double xo1 = num[1];
                double yo1 = num[2];
                double xo2 = num[3];
                double yo2 = num[4];
                double x1 = num[5];
                double y1 = num[6];
                double x2 = num[7];
                double y2 = num[8];
                double x3 = num[9];
                double y3 = num[10];
                Point o1 = new Point(xo1, yo1);
                Point o2 = new Point(xo2, yo2);
                Point a = new Point(x1, y1);
                Point b = new Point(x2, y2);
                Point c = new Point(x3, y3);
                if (cnt != 11) {
                    System.out.print("wrong number of points");
                    return;
                }
                if (Point.same(o1, o2)) {
                    System.out.print("points coincide");
                    return;
                }
                if (Point.distance(a, b) + Point.distance(b, c) < Point.distance(a, c) || Point.distance(a, c) + Point.distance(b, c) < Point.distance(a, b)
                        || Point.distance(a, c) + Point.distance(a, b) < Point.distance(b, c)) {
                    System.out.print("data error");
                    return;
                }
                if (x1 == x2 && x2 == x3 || y1 == y2 && y2 == y3) {
                    System.out.print("data error");
                    return;
                }
                double xo3;
                double yo3;
                double xo4;
                double yo4;
                if(Point.jiaodian(o1,o2,a,b)==1&&Point.jiaodian(o1,o2,a,c)==1&&Point.jiaodian(o1,o2,b,c)==0){
                 double area1=Point.area(a,o1,o2);
                 double area3=Point.area(a,b,c);
                 double area2=area3-area1;
                 if(area1>=area2){
                     System.out.print("2 "+area2+" "+area1);
                     return;
                 }
                 else{
                     System.out.print("2 "+area1+" "+area2);
                     return;
                 }
                }
                if(Point.jiaodian(o1,o2,a,b)==0&&Point.jiaodian(o1,o2,a,c)==1&&Point.jiaodian(o1,o2,b,c)==1){
                    double area1=Point.area(c,o1,o2);
                    double area3=Point.area(a,b,c);
                    double area2=area3-area1;
                    if(area1>=area2){
                        System.out.print("2 "+area2+" "+area1);
                        return;
                    }
                    else{
                        System.out.print("2 "+area1+" "+area2);
                        return;
                    }
                }
                if(Point.jiaodian(o1,o2,a,b)==1&&Point.jiaodian(o1,o2,a,c)==0&&Point.jiaodian(o1,o2,b,c)==1){
                    double area1=Point.area(b,o1,o2);
                    double area3=Point.area(a,b,c);
                    double area2=area3-area1;
                    if(area1>=area2){
                        System.out.print("2 "+area2+" "+area1);
                        return;
                    }
                    else{
                        System.out.print("2 "+area1+" "+area2);
                        return;
                    }
                }
                System.out.print("1");
            }
        if (num[0] == 5) {
            double xo = num[1];
            double yo = num[2];
            double x1 = num[3];
            double y1 = num[4];
            double x2 = num[5];
            double y2 = num[6];
            double x3 = num[7];
            double y3 = num[8];
            Point o = new Point(xo,yo);
            Point a = new Point(x1, y1);
            Point b = new Point(x2, y2);
            Point c = new Point(x3, y3);
            if (cnt != 9) {
                System.out.print("wrong number of points");
                return;
            }
            if (Point.distance(a,b)+ Point.distance(b,c)< Point.distance(a,c)|| Point.distance(a,c)+ Point.distance(b,c)< Point.distance(a,b)
                    || Point.distance(a,c)+ Point.distance(a,b)< Point.distance(b,c))
            {System.out.println("data error");
                return;
            }
            if(x1==x2&&x2==x3||y1==y2&&y2==y3)
            {System.out.println("data error");
                return;
            }
            double ww=Point.area(o,a,b)+Point.area(o,b,c)+Point.area(o,a,c)-Point.area(a,b,c);
            double obc=Point.distance(o,b)+ Point.distance(o,c)-Point.distance(b,c);
            double oac=Point.distance(o,a)+ Point.distance(o,c)-Point.distance(a,c);
            double oab=Point.distance(o,b)+ Point.distance(o,a)-Point.distance(a,b);
            if (Math.abs(ww)<0.0000001){
                if(obc<0.00001||oac<0.00001||oab<0.00001){
                    System.out.print("on the triangle");
                    return; 
                }
                System.out.print("in the triangle");
                return;
            }
            if (ww>0){
                System.out.print("outof triangle");
                return;
            }
        }
    }
}


这道题更加复杂,要考虑的数据更多
1,2,3都是根据点边关系进行判断,然后创建方法进行计算输出,要注意2中的小数点要保留几位,如果后面有数保留六位,没数的话只留一位小数即可。
4,5则是线与三角形的关系,需要创建三角形类,而4更是要判断几种情况:
要特判线与三角形无交点
要特判线与三角形一边重合
有一个交点的情况就是交点为三角形顶点
有两个交点则又分两种情况,交点其一是否为顶点
根据以上进行分析,写出方法进行计算。

三、踩坑心得

其实第一次作业考察的内容相对来说比较简单,但是让我踩坑的是刚开始九道题我只有一道是完全正确的,其他的八道题目都有测试点没过,非常难受,并且绞尽脑汁觉得自己的代码没有任何的问题,但实际上是被一个小细节给害惨了,把我所有题目中定义变量的的double全部改为了float,测试点大部分就过去了,真的是人生无常,大肠包小肠~ 吸取教训,正确地运用并把握审题精度是处理细节非常重要的手段之一。

还有第三次作业真的三道题目一个大连贯,从点到线再到形类,初步推测应该是需要设计的类变多了,分割字符串,并且从最初的两个点的坐标到三个点以及四个点五个点的坐标,一步步地复杂化,但主要地一些基础还是没有变化的。老师上课讲了正则表达式,但没有认真的听,所以踩坑了。

四、改进建议

对第二次作业我认为我函数内的代码行数还是太长,而且不是很清晰明了,希望自己以后条件判断还是多用switch case的条件语句,少用if else语句,让自己的代码变得更可读一些。类似的性质也可以做成类函数,就不会让代码那么长一串,用相应的英文函数名表示就明白多了。

对第三次作业我认为我需要去更多的了解类的设计和有关正则的方式。我在最后一题使用的合法性判断很杂是混合在各个功能中的,这样不仅大程度的提高了代码的复杂度而且可读性很低,大概只有我自己能弄的清楚的程度。老师在课上介绍了正则的方法去限定合法性,我还需要对其更深的了解直到能够熟练运用。具体要做的改进首先是用正则的方法写合法测试,再将多次项的分类作为一个类,此类中含整数项判断函数、一次项判断函数和多次项判断函数,主函数在进行筛选时就可以直接调用类中的函数,这样可以大幅的的减少重复代码,减少查重降低复杂度。

五、总结

目前,我认为自己在Java方法的运用中仍存在不足,对其运用的具体场景和条件以及具体的内部原理了解不够透彻,仍需要进一步学习和实践。除此之外,我对于多个类的程序设计仍比较陌生,需要更进一步的学习。另外,自己在编程过程中需要养成更好的习惯,首先要习惯用面向对象的思维去思考问题、设计算法;其次,代码的书写要规范、美观、简略,这也方便自己查找错误,避免了很多不必要的麻烦。对老师就是希望老师能把上课用于讲课的那个知识点文件发给我让我瞅瞅研究研究,然后课程实验作业什么的能够更多的要求类上面的设计以及可读程度。三次作业逐步引导我从面向对象程序设计的思维过渡到面向对象的程序设计思维我认为Java中的类和C语言中的函数有些联系,Java中的类就好像把好几个函数包在一个大函数里,然后主函数可以去调用这个大函数,但是它们之间的区别又是很明显的Java中的类是有性质和方法的是可以拥有实体的,C语言中的函数并不能。还有Java在多人合作项目中确实更方便,因为每个类都可以拥有它们自身的变量,而且可以分好几个文件运行只要在一个包下就行,而且Java类如果写的好的话就很容易让别人去解读。所以我觉得在Java的学习中要学会对类的合理设计,让自己的代码变得看起来舒服可读性高。而且我觉得老师可以在布置pta作业的时候少量多次,从简到易,逐步深入,时长也可以缩短一些。

posted @   我好蔡  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示