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
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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)方法数出

浙公网安备 33010602011771号