pta题目集,超星作业及集中考试的总结

PTA大作业2--7-3

    题目集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"

 

整理思路:1.首先得判断输入是不是合法的,构造判断类judged来判断

     2.再跟据length1方法得出三个坐标得出的线段的长度是否构成三角形(用triangle方法)

    3.再判断其是否为等边三角形或者等腰三角型

判断是否合法:

class judged{
private static String df= "[1-5]:([+-]?\\d+(\\.\\d+)?,[+-]?\\d+(\\.\\d+)?\\s?)+";

public static void judge1(String number,String[] tokens) {
Double n = Double .parseDouble(tokens[0]);
if(tokens.length==7&&number.matches(df)&&(n==1||n==2||n==3)){
threepoints1.three(tokens);
}
else if(tokens.length!=7&&number.matches(df)&&(n==1||n==2||n==3))
System.out.println("wrong number of points");
else if(tokens.length==11&&number.matches(df)&&n==4){
fivepoints1.five(tokens);
}
else if(tokens.length!=11&&number.matches(df)&&n==4)
System.out.println("wrong number of points");
else if(tokens.length==9&&number.matches(df)&&n==5) {
fourpoints1.four(tokens);
}
else if(tokens.length!=9&&number.matches(df)&&n==5)
System.out.println("wrong number of points");
else
System.out.println("Wrong Format");
}
}

判断其是否为等边三角形或者等腰三角形,

A=triangle1.cos(a,b,c);
B=triangle1.cos(b,a,c);
C=triangle1.cos(c,b,a);

构造上面三种方法,判断三条边的长度对比,最后判断是否为等边三角形或者等腰三角形

核心代码:

class threepoints1{
public static void three(String[] tokens) {
Double n = Double .parseDouble(tokens[0]);
Double x1 = Double.parseDouble(tokens[1]);
Double y1 = Double.parseDouble(tokens[2]);
Double x2 = Double.parseDouble(tokens[3]);
Double y2 = Double.parseDouble(tokens[4]);
Double x3 = Double.parseDouble(tokens[5]);
Double y3 = Double.parseDouble(tokens[6]);
double a,b,c,A,B,C;
double meter,area;
double[] core;
boolean judge1=false,judge2=false;
double k1,k2;
k1=(y1-y2)/(x1-x2);
k2=(y3-y2)/(x3-x2);
a=length1.longth(x1,x2,y1,y2);
b=length1.longth(x1,x3,y1,y3);
c=length1.longth(x2,x3,y2,y3);
if(n==1)
{
if(k1==k2||(y2-y1)*(x1-x3)-(y1-y3)*(x2-x1)==0||(x1-x2==0&&y1-y2==0)||(x1-x3==0&&y1-y3==0)||(x2-x3==0&&y2-y3==0))
System.out.println("data error");
else
{
if(a==b&&b==c)
judge1=true;
if(a==b||a==c||b==c)
judge2=true;
System.out.println(judge2+" "+judge1);
}
}
else if(n==2)
{
if(k1==k2||(y2-y1)*(x1-x3)-(y1-y3)*(x2-x1)==0||(x1-x2==0&&y1-y2==0)||(x1-x3==0&&y1-y3==0)||(x2-x3==0&&y2-y3==0))
System.out.println("data error");
else
{
DecimalFormat df1 = new DecimalFormat("0.0#####");
meter=a+b+c;
area=0.5*b*c*triangle.sin(a,b,c);
core=nodical.nod(x1,y1,(x2+x3)/2,(y2+y3)/2,x2,y2,(x1+x3)/2,(y1+y3)/2);
System.out.println(df1.format(meter)+" "+df1.format(area)+" "+df1.format(core[0])+","+df1.format(core[1]));
}
}
else if(n==3)
{
if(k1==k2||(y2-y1)*(x1-x3)-(y1-y3)*(x2-x1)==0||(x1-x2==0&&y1-y2==0)||(x1-x3==0&&y1-y3==0)||(x2-x3==0&&y2-y3==0))
System.out.println("data error");
else
{
boolean judge3=false,judge4=false,judge5=false;
A=triangle1.cos(a,b,c);
B=triangle1.cos(b,a,c);
C=triangle1.cos(c,b,a);
if(A>0||B>0||C>0)
{
if(A>0||B>0||C>0)
{
if(A<0||B<0||C<0)
judge3=true;
else if(A==0||B==0||C==0)
judge4=true;
else
judge5=true;
}
}
System.out.println(judge3+" "+judge4+" "+judge5);
}
}
}
}

}

所用方法:

//得出长度

class length1{
public static double longth(double x1,double x2,double y1,double y2) {
double l1,l;
l1=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
l=Math.sqrt(l1);
return l;
}

//判断长度是否可以构成三角形

class triangle{
public static double sin(double a,double b,double c) {
double num,num1;
num=(b*b+c*c-a*a)/(2*b*c);
num1=Math.sqrt(1-num*num);
return num1;
}
}

//判断三条边是否构成等腰三角形或者等边三角形

class triangle1{
public static double cos(double a,double b,double c) {
double num;
num=(b*b+c*c-a*a)/(2*b*c);
return num;
}
}

 输出周长,面积,以及重心坐标

首先利用triangle方法判断这利用length1得到的三条边可不可以构成三角形,如果能,再通过写代码来得出他的周长,面积,以及重心坐标

判断构造出三角形后通过以下代码

DecimalFormat df1 = new DecimalFormat("0.0#####");
meter=a+b+c;
area=0.5*b*c*triangle.sin(a,b,c);
core=nodical.nod(x1,y1,(x2+x3)/2,(y2+y3)/2,x2,y2,(x1+x3)/2,(y1+y3)/2);
System.out.println(df1.format(meter)+" "+df1.format(area)+" "+df1.format(core[0])+","+df1.format(core[1]));

输出周长,面积,以及重心坐标

踩坑心得:开始不知道要判断三条边是否构成三角形,盲目就写,导致后面老运行出错,一定要分析好题目在做题

 

PTA大作业4--7-2

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

用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入四个点坐标,判断是否是四边形、平行四边形,判断结果输出true/false,结果之间以一个英文空格符分隔。
2:输入四个点坐标,判断是否是菱形、矩形、正方形,判断结果输出true/false,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
3:输入四个点坐标,判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
4:输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。若后四个点不符合四边形或三角形的输入,输出"not a quadrilateral or triangle"。
后四个点构成三角形的情况:假设三角形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z 不与xy都相邻,如z x y s、x z s y、x s z y
5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。

输出格式:

基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0

选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。
选项4中,若前两个输入线的点重合,输出"points coincide"。

整理思路:1.首先得判断输入是不是合法的,构造判断类judged来判断

     2.再跟据judge2方法得出是否构成四边

判断是否合法:

class Judge1{
private static String df= "[1-5]:([+-]?\\d+(\\.\\d+)?,[+-]?\\d+(\\.\\d+)?\\s?)+";

public static void judge1(String number,String[] tokens) {
Double n = Double .parseDouble(tokens[0]);
if(tokens.length==9&&number.matches(df)&&(n==1||n==2||n==3))
Qua.quadrangle(tokens);
else if(tokens.length!=9&&number.matches(df)&&(n==1||n==2||n==3))
System.out.println("wrong number of points");
else if(tokens.length==13&&number.matches(df)&&n==4)
sixpoints.six(tokens);
else if(tokens.length!=13&&number.matches(df)&&n==4)
System.out.println("wrong number of points");
else if(tokens.length==11&&number.matches(df)&&n==5)
fivepoints.five(tokens);
else if(tokens.length!=11&&number.matches(df)&&n==5)
System.out.println("wrong number of points");
else if (!number.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?"))
System.out.println("Wrong Format");
else if (!number.matches("[1-5]:.+"))
System.out.println("Wrong Format");
}
}

//判断是否为四边形

class Judge2{
public static boolean judge2(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){
double[] core;
core=nodical.nod(x1, y1, x4, y4, x3, y3, x2, y2);
if ((y4 - y3) * (x4 - x2) == (y4 - y2) * (x4- x3))
return false;
else if ((y4- y3) * (x4 - x1) == (y4 - y1) * (x4 - x3))
return false;
else if ((y4 - y2) * (x4 - x1) == (y4 - y1) * (x4 - x2))
return false;
else if ((y3 - y2) * (x3 - x1) == (y3 - y1) * (x3 - x2))
return false; //任意三个顶点成直线,非四边形
else if((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2)==0&&(y2-y3)*(x3-x4)-(y3-y4)*(x2-x3)==0)
return false;
if(( ((core[0]>x1&&core[0]<x2)||(core[0]>x2&&core[0]<x1)) &&((core[1]>y1&&core[1]<y2)||(core[1]>y2&&core[1]<y1)))&&( ((core[0]>x3&&core[0]<x4)||(core[0]>x4&&core[0]<x3)) &&((core[1]>y3&&core[1]<y4)||(core[1]>y4&&core[1]<y3))))
return false;
else
return true;
}
}

核心代码

//判断是否为平行四边形

class Test1{
public static boolean t1(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {
double l1,l2,l3,l4;
l1=length.longth(x1, y1, x2, y2);
l2=length.longth(x3, y3, x4, y4);
l3=length.longth(x2, y2, x3, y3);
l4=length.longth(x1, y1, x4, y4);
if(l1==l2&&l3==l4)
return true;
else
return false;
}
}

//判断是否为菱形

class Test2{
public static boolean t2(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {
double l1,l2;
boolean f=false;
l1=length.longth(x1, y1, x4, y4);
l2=length.longth(x1, y1, x2, y2);
f=Test1.t1(x1, y1, x2, y2, x3, y3, x4, y4);
if(f==true) {
if(l1-l2==0)
return true;
else
return false;
}
else
return false;
}
}

//判断是否为矩形

class Test3{
public static boolean t3(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {
double l1,l2;
boolean f=false;
l1=length.longth(x1, y1, x3, y3);
l2=length.longth(x2, y2, x4, y4);
f=Test1.t1(x1, y1, x2, y2, x3, y3, x4, y4);
if(f==true)
{
if(l1-l2==0)
return true;
else
return false;
}
else
return false;
}
}

踩坑心得:这题里面需要判断的情况有和多种,比如判断点是否在线上,判断两点的距离等,因为要构造一个四边形,要考虑是不是点会在直线上,如果三点一线,则四个点构成不了一个四边形。然后还得判菱形,矩形,正方形,则要通过线段长度以及两条线构成的角度来判断其形状。

 //判断两点的距离

class length{
public static double longth(double x1,double y1,double x2,double y2) {
double l1,l;
l1=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
l=Math.sqrt(l1);
return l;
}
}

//三角形的正弦值(判断其角度)

class triangle{
public static double sin(double a,double b,double c) {
double num,num1;
num=(b*b+c*c-a*a)/(2*b*c);
num1=Math.sqrt(1-num*num);
return num1;
}
}

期中考试第一题

7-1 点与线(类设计)

  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:

整理思路:1.先构造出四个数,分别为两个点的坐标点。

    2.主类里调用其他类的非private方法

核心代码

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in = new Scanner(System.in);
double x1 = in.nextDouble();
double y1 = in.nextDouble();
double x2 = in.nextDouble();
double y2 = in.nextDouble();
String color = in.next();

Point p1 = new Point(x1,y1);
Point p2 = new Point(x2,y2);
Line L1=new Line(p1,p2,color);
L1.display();


}

}
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 x;
}

public void setX(double x) {
this.x=x;
}

public double getY()
{
return y;
}

public void setY(double y) {
this.y=y;
}
public void display() {

}

}

class Line {

private Point p1;
private Point p2;
private String color;

public Line(Point p1, Point p2, String color) {
super();
this.p1 = p1;
this.p2 = p2;
this.color = color;
}

public Point getPoint1() {
return p1;
}

public void setPoint1(Point p1) {
this.p1=p1;
}

public Point getPoint2() {
return p2;
}

public void setPoint2(Point p2) {
this.p2=p2;
}

public String getColor() {
return color;
}

public void setColor(String color) {
this.color=color;
}

public double getDistance() {
return Math.sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));
}

public void display() {
if(p1.getX()<=200&&p1.getX()>0&&p1.getY()<=200&&p1.getY()>0&&p2.getX()<=200&&p2.getX()>0&&p2.getY()<=200&&p2.getY()>0) {
System.out.println("The line's color is:"+getColor());
System.out.println("The line's begin point's Coordinate is:"+"\n"+"("+String.format("%.2f",p1.getX() )+","+String.format("%.2f",p1.getY() )+")");
System.out.println("The line's end point's Coordinate is:"+"\n"+"("+String.format("%.2f",p2.getX() )+","+String.format("%.2f",p2.getY() )+")");
System.out.println("The line's length is:"+String.format("%.2f",getDistance()));

}
else
{
System.out.println("Wrong Format");
System.exit(0);
}
}
}

本题最主要就是构造一个point类以及line类·,point类里用display()来显示坐标位置,line类里面用display来显示两坐标点之间的距离i级输入的颜色数出来,最后在主类里调用point.display()以及line.play()。

踩坑心得:类里面有私有属性,必须用private。输出距离时得用String.format("%.2f", data)方法数出

posted @ 2022-06-01 08:39  不乂氼  阅读(288)  评论(0)    收藏  举报