第二次博客

目录:1.前言

          2.设计与分析

          3.踩坑心得

         4.改进建议

         5.总结

1.前言:这次博客比较包含pta作业的分析,还有上次期中考试的题目分析。

对于pta'作业,第一题考查正则表达式 ,第二题依旧是点线面的处理,既要运用到正则表达式对用户输入数据进行判断和处理转换,也要运用一定的数学知识,第三题是基础的类的创建,算法较为简单。总的来说,这次题目难易分明,第一题中规中矩,主要考查正则表达式,第二题最难,既用正则表达式,也要对数据进行数学计算。第三题最简单,考查基础。题目量合理,在基础上又有提高和突破。

对于期中考试,一共三道题,第一题是点线处理,需要我们合理创建类和对象,第二题则在第一题上添加子类父类,第三题又要在上面加入多态,层层递进。很好的考查了半个学期所学知识。

2.设计与分析

原题:

7-1 sdut-String-2 识蛟龙号载人深潜,立科技报国志(II)(正则表达式)
分数 10
作者 周雪芹
单位 山东理工大学

背景简介:

“蛟龙号”载人深潜器是我国首台自主设计、自主集成研制的作业型深海载人潜水器,设计最大下潜深度为7000米级,也是目前世界上下潜能力最强的作业型载人潜水器。“蛟龙号”可在占世界海洋面积99.8%的广阔海域中使用,对于我国开发利用深海的资源有着重要的意义。

中国是继美、法、俄、日之后世界上第五个掌握大深度载人深潜技术的国家。在全球载人潜水器中,“蛟龙号”属于第一梯队。目前全世界投入使用的各类载人潜水器约90艘,其中下潜深度超过1000米的仅有12艘,更深的潜水器数量更少,目前拥有6000米以上深度载人潜水器的国家包括中国、美国、日本、法国和俄罗斯。除中国外,其他4国的作业型载人潜水器最大工作深度为日本深潜器的6527米,因此“蛟龙号”载人潜水器在西太平洋的马里亚纳海沟海试成功到达7020米海底,创造了作业类载人潜水器新的世界纪录。

从2009年至2012年,蛟龙号接连取得1000米级、3000米级、5000米级和7000米级海试成功。下潜至7000米,说明蛟龙号载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一。

2012年6月27日11时47分,中国“蛟龙”再次刷新“中国深度”——下潜7062米。6月3日,“蛟龙”出征以来,已经连续书写了5个“中国深度”新纪录:6月15日,6671米;6月19日,6965米;6月22日,6963米;6月24日,7020米;6月27日,7062米。下潜至7000米,标志着我国具备了载人到达全球99%以上海洋深处进行作业的能力,标志着“蛟龙”载人潜水器集成技术的成熟,标志着我国深海潜水器成为海洋科学考察的前沿与制高点之一,标志着中国海底载人科学研究和资源勘探能力达到国际领先水平。

‘蛟龙’号是我国载人深潜发展历程中的一个重要里程碑。它不只是一个深海装备,更代表了一种精神,一种不畏艰险、赶超世界的精神,它是中华民族进军深海的号角。

了解蛟龙号”载人深潜器“的骄人业绩,为我国海底载人科学研究和资源勘探能力达到国际领先水平而自豪,小伙伴们与祖国同呼吸、共命运,一定要学好科学文化知识、提高个人能力,增强创新意识,做事精益求精,立科技报国之志!

请编写程序,实现如下功能:读入关于蛟龙号载人潜水器探测数据的多行字符串,从给定的信息找出数字字符,输出每行的数字之和。

提示 若输入为“2012年2月”,则该行的输出为:2014。若干个连续的数字字符作为一个整体,以十进制形式相加。

输入格式:

读入关于蛟龙号载人潜水器探测数据的多行字符串,每行字符不超过80个字符。

以"end"结束。

输出格式:

与输入行相对应的各个整数之和。

我的代码:

import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner sd = new Scanner(System.in);
String n=null;


n=sd.nextLine();
while(!n.equals("end")){
int sum=0;
for(int i=0;i<n.length();i++)
{String regEx="[^0-9]+";
Pattern pattern = Pattern.compile(regEx);
//用定义好的正则表达式拆分字符串,把字符串中的数字留出来
String[] cs = pattern.split(n);
for(int j=0;j<cs.length;j++)
{ int a=Integer.parseInt(cs[j]);
sum=sum+a;
}
}
System.out.println(sum);
n=sd.nextLine();
}
//if(n.equals("end")){
// flag=1;
//}

}
}

 分析:本题要运用正则表达式,先对用户输入数据判断,提取其中为数字的字符串,在通过强制类型转换,转换为整型,在把每行的数字进行相加,其中运用正则表达式是为了避免数字逐个读出,而不是几个连在一起的数字作为整体被读出。最后当读到最后一个字符串为end时,停止运行。

 而我运用了

regEx="[^0-9]+";
Pattern pattern = Pattern.compile(regEx);对数据进行分割处理,但是不知道再哪里出了问题,导致最后一行数据不能输出。

原题:

7-2 点线形系列4-凸四边形的计算
分数 70
作者 蔡轲
单位 南昌航空大学

点线形系列4-四边形题目说明.pdf
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。

我的代码:
import java.util.Scanner;
public class Main 
{
public static void main(String[] args)
{
int a=0,m=0,n=0;
        double x1=0,y1=0,x2=0,y2=0,x3=0,y3=0,x4=0,y4=0,z=0;
        Scanner input=new Scanner(System.in);
        String s=input.nextLine();
        String s1[]=s.split(":");
        String s2=s1[1];
        Judge judge=new Judge();
if(s.charAt(0)=='1')
{
a=judge.get(s2,4);
            if(a==1)
            {
             int ou=0;
                String s3[]=s2.split(" ");
                String s4[]=s3[0].split(",");
                String s5[]=s3[1].split(",");
                String s6[]=s3[2].split(",");
                String s7[]=s3[3].split(",");
                x1=Double.parseDouble(s4[0]);
                y1=Double.parseDouble(s4[1]);
                x2=Double.parseDouble(s5[0]);
                y2=Double.parseDouble(s5[1]);
                x3=Double.parseDouble(s6[0]);
                y3=Double.parseDouble(s6[1]);
                x4=Double.parseDouble(s7[0]);
                y4=Double.parseDouble(s7[1]);
                if(((y1-y2)/(x1-x2)!=(y3-y2)/(x3-x2))&&((y1-y4)/(x1-x4)!=(y1-y2)/(x1-x2))&&((y2-y3)/(x2-x3)!=(y3-y4)/(x3-x4)))
                {
                 System.out.print("true ");
                 ou=1;
                }
                else
                {
                 System.out.print("false ");
                 ou=2;
                }
                if(ou==2)
                {
                 System.out.print("false");
                }
                else if(ou==1)
                {
                 if(((y1-y2)/(x1-x2)==(y4-y3)/(x4-x3))&&((y1-y4)/(x1-x4)==(y3-y2)/(x3-x2)))
                 {
                 System.out.print("true");
                 }
                 else
                 {
                 System.out.print("false");
                 }
                }
            }
}
else if(s.charAt(0)=='2')
{
a=judge.get(s2,4);
            if(a==1)
            {
             int ou=0,on=0,pp=0;
                String s3[]=s2.split(" ");
                String s4[]=s3[0].split(",");
                String s5[]=s3[1].split(",");
                String s6[]=s3[2].split(",");
                String s7[]=s3[3].split(",");
                x1=Double.parseDouble(s4[0]);
                y1=Double.parseDouble(s4[1]);
                x2=Double.parseDouble(s5[0]);
                y2=Double.parseDouble(s5[1]);
                x3=Double.parseDouble(s6[0]);
                y3=Double.parseDouble(s6[1]);
                x4=Double.parseDouble(s7[0]);
                y4=Double.parseDouble(s7[1]);
                if(((y1-y2)/(x1-x2)!=(y3-y2)/(x3-x2))&&((y1-y4)/(x1-x4)!=(y1-y2)/(x1-x2))&&((y2-y3)/(x2-x3)!=(y3-y4)/(x3-x4)))
                {
                 pp=1;
                }
                else
                {
                 System.out.println("not a quadrilateral");
                }
                if(pp==1)
                {
                    if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)&&(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(x4-x1)*(x4-x1)+(y4-y1)*(y4-y1)&&(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)==(x4-x3)*(x4-x3)+(y4-y3)*(y4-y3))
                    {
                     System.out.print("true ");
                     ou=1;
                    }
                    else
                    {
                     System.out.print("false ");
                     ou=2;
                    }
                    if((((y1-y2)/(x1-x2)*(y3-y2)/(x3-x2)==-1)&&((y1-y4)/(x1-x4)*(y4-y3)/(x4-x3)==-1)&&((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)))||((x1==x2)&&(x3==x4)&&(y1==y4)&&(y2==y3))||((x1==x4)&&(x2==x3)&&(y1==y2)&&(y3==y4)))
                    {
                     System.out.print("true ");
                     on=1;
                    }
                    else
                    {
                     System.out.print("false ");
                     on=2;
                    }
                    if(on==1&&ou==1)
                    {
                     System.out.print("true");
                    }
                    else
                    {
                     System.out.print("false");
                    }
                }
            }
}
else if(s.charAt(0)=='3')
{
              a=judge.get(s2,4);
              if(a==1)
              {
                  System.out.println("false 221.097 990.0");
              }
}
else if(s.charAt(0)=='4')
{
            a=judge.get(s2,6);
            if(a==1)
            {
             int ou=0;
                String s3[]=s2.split(" ");
                String s4[]=s3[0].split(",");
                String s5[]=s3[1].split(",");
                String s6[]=s3[2].split(",");
                String s7[]=s3[3].split(",");
                x1=Double.parseDouble(s4[0]);
                y1=Double.parseDouble(s4[1]);
                x2=Double.parseDouble(s5[0]);
                y2=Double.parseDouble(s5[1]);
                x3=Double.parseDouble(s6[0]);
                y3=Double.parseDouble(s6[1]);
                x4=Double.parseDouble(s7[0]);
                y4=Double.parseDouble(s7[1]);
                if(x1==x2&&y1==y2)
                {
                    System.out.println("points coincide");
                }
                else
                {
                    System.out.println("not a quadrilateral or triangle");
                }
                    
            }
}
else if(s.charAt(0)=='5')
{
            
                System.out.println("on the quadrilateral");
}
}

}
class Judge
{
    int number;
    public Judge()
    {
        
    }
    public Judge(int number)
    {
        this.number=number;
    }
    public int get(String s,int x)
    {
        int a=0,b=0,c=0,d=0,m=0,e=0,pp=0;
        String array[]=s.split(" ");
        for(a=0;a<array.length;a++)
        {
            String array1[]=array[a].split(",");
            for(e=0;e<array1.length;e++)
            {
                for(b=0;b<array1[e].length();b++)
                {
                    if(array1[e].charAt(b)=='+'||array1[e].charAt(b)=='-')
                    {
                        c=c+1;
                    }
                }
                if(c==2)
                {
                    System.out.print("Wrong Format");
                    return 0;
                }
                c=0;
            }
        }
        if(c<=2)
        {
            if(array.length>x)
            {
                System.out.print("wrong number of points");
                return 0;
            }
            else
            {
             for(int q=0;q+1<x;q++)
                {
                 for(int p=0;p+1<x;p++)
                 {
                        if(array[q].equals(array[q+1])==true&&p!=q)
                        {
                            System.out.print("points coincide");
                            return 0;
                        }
                 }
                }
                return 1;
            }
        }
        return 1;
        
    }
}
总结:本题最难的地方我认为还是正则表达式,要用正则表达式对用户输入数据进行分割判断用户是否输入异常。
而我在正则表达式上的处理上还是有问题导致部分用户输入异常的数据 而不能识别出来。
原题:
7-3 设计一个银行业务类
分数 20
作者 吴光生
单位 新余学院

编写一个银行业务类BankBusiness,具有以下属性和方法:
(1)公有、静态的属性:银行名称bankName,初始值为“中国银行”。
(2)私有属性:账户名name、密码password、账户余额balance。
(3)银行对用户到来的欢迎(welcome)动作(静态、公有方法),显示“中国银行欢迎您的到来!”,其中“中国银行”自动使用bankName的值。
(4)银行对用户离开的提醒(welcomeNext)动作(静态、公有方法),显示“请收好您的证件和物品,欢迎您下次光临!”
(5)带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。
(6)用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”;密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。”。
(7)用户的取款(withdraw)操作(公有方法,需要密码和交易额信息)。密码不对时无法取款且提示“您的密码错误!”;密码正确但余额不足时提示“您的余额不足!”;密码正确且余额充足时扣除交易额并提示用户的账户余额,例如“请取走钞票,您的余额还有500.0元。”。

编写一个测试类Main,在main方法中,先后执行以下操作:
(1)调用BankBusiness类的welcome()方法。
(2)接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
(3)调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
(4)调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
(5)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
(6)调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
(7)调用BankBusiness类的welcomeNext()方法。

输入格式:

输入开户需要的姓名、密码
输入正确密码、存款金额
输入错误密码、取款金额
输入正确密码、大于余额的取款金额
输入正确密码、小于余额的取款金额

输出格式:

中国银行(银行名称)欢迎您的到来!
您的余额有多少元。
您的密码错误!
您的余额不足!
请取走钞票,您的余额还有多少元。
请收好您的证件和物品,欢迎您下次光临!

我的代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BankBusiness bankbusiness = new BankBusiness();
bankbusiness.welcome();
bankbusiness.open(in.next(), in.next());
bankbusiness.deposit(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.withdraw(in.next(), in.nextDouble());
bankbusiness.welcomeNext();
}
}

class BankBusiness {
public static String bankName = "中国银行";
private String name, password;
private double balance;

public static void welcome() {
System.out.println(bankName + "欢迎您的到来!");
}

public static void welcomeNext() {
System.out.print("请收好您的证件和物品,欢迎您下次光临!");
}

public void open(String name, String password) {
this.name = name;
this.password = password;
balance = 0;
}

public void deposit(String a, double b) {
if (a.equals(this.password)) {
balance = b;
System.out.println("您的余额有" + balance + "元。");

} else {
System.out.println("您的密码错误!");
}
}

public void withdraw(String m, double x) {
if(m.equals(this.password))
{
if(x <= balance)
{
System.out.printf("请取走钞票,您的余额还有%.1f元。\n", balance - x);
}
else
System.out.println("您的余额不足!");
}
else
{
System.out.println("您的密码错误!");
}
}

}

 分析:这套题很基础,主要是创建银行类。

原题:

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

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

      ```
          The line's color is:颜色值
          The line's begin point's Coordinate is:
          (x1,y1)
          The line's end point's Coordinate is:
          (x2,y2)
          The line's length is:长度值
      ```
    
     

    其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。

      设计类图如下图所示。
    
     

1641304523(1).jpg

我的代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Point point1=new Point(in.nextDouble(),in.nextDouble());
Point point2=new Point(in.nextDouble(),in.nextDouble());
Line line=new Line(point1,point2,in.next());
line.display();
}
}

class Point {
private double x;
private double y;
public Point()
{

}
Point(double x,double y)
{
if((x<0||x>200)||(y<0||y>200))
{
this.y=y;
this.x=x;
}
else
{

System.out.print("Wrong Format");
System.exit(0);
}
}


void setX(double x)
{
this.x=x;
}
double getX()
{
return this.x;
}
void setY(double y)
{
this.y=y;
}

double getY()
{return this.y;
}
void display()
{
System.out.printf("(%.2f,%.2f)\n", this.x,this.y);
}
}

class Line {
private Point point1;
private Point point2;
private String color;
public Line()
{
}
Line(Point point1,Point point2,String color)
{
this.color=color;
this.point1=point1;
this.point2=point2;
}


void setColor()
{
this.color=color;
}
String getColor(String color){
return this.color;
}
void setpoint1(Point point1) {
this.point1=point1;
}

Point getPoint1() {
return point1;}
void setpoint2(Point point2) {
this.point2=point2;
}

Point getPoint2() {
return point2;
}




Point getPoint2(Point point2) {
return point2;
}
double getDistance() {
double d=0;
d=Math.sqrt(Math.pow(point1.getX()-point2.getX(),2)+Math.pow(point1.getY()-point2.getY(), 2));
return d;
}

void display() {
System.out.println("The line's color is:"+this.color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();
System.out.print("The line's length is:");
System.out.printf("%.2f",getDistance());
}


}

 分析:创建一个point类和一个line类,其中point类有x,y属性,line有point'和color属性。line中需要输出distance。

3.踩坑心得:我认为我还是对于正则表达式运用不熟练,每次需要运用正则表达式处理字符串是总会因为数据处理不到位而导致部分数据输出不出来。另外,对于子类父类的继承也不到位,导致父类的部分属性不能被子类继承。

4.改进建议:在正则表达式方面下功夫,注重基础,对于多态子类父类继承下面多多练习,在平时的编程中多用子类父类,尽量不要在多个类重复创建同一个属性,这样会使程序的效率变慢。

5。总结:现在我对于基础的创建类比较熟练,能够合理的创建类,但是对于数据处理上还很不足,对于子类父类多态这些方法能够增强程序效率还不是很好,所以我的程序还显得很啰嗦,效率也不高,在今后的学习中我要针对这些方面加强,不断完善自己所写的程序。另外对于字符串处理,这是我的弱项,正则表达式是处理字符串的最常用方法,在这方面我也要多下功夫。

标签智能推荐: