第二次bolg 作业总结

对于前三次pta作业的分析总结

目录

  1.前言

   2.设计与分析

   3.踩坑心得

   4.改进建议

   5.总结

 

1.前言

       首先经过这段时间的作业完成情况,我知道自己还是有很多地方不足,知识点的运用,思维的方式,以及结构的构建,都很不会。

      1)知识点.第一次作业比较简单,知识点也是一些最基本的java的语法,如if ,swtich,while,基本的语句,一些最基本的输入输出计算,就是有一些题目的一些细节没有处理到,会造成扣分,题目审题很重要,就比如说第一次作业的最后一题,要判断好是什么三角形,你需要进行构思,从一般到特殊,慢慢缩小范围,最终确定自己筛选出来的三角形。构思完以后还要去运行,去操作,不能漏下某种情况,以免造成扣分。第二次作业难度稍有提升,第一题运用到了字符串中访问某个字节的函数charAt.(),对字符串输入后的操作,访问判断,第三题的学号显示输入后操作也用到了对字符操作的一些函数,equals.(),String.valueOf(),还用到了二维数组等等。第二次作业的第二题就比较难,我也很遗憾没有做出来。不过这个题的代码量和相关的计算构思还是很多的。第三次作业用到的知识点就比较多了,最主要的是第三次作业要用到类的创建与调用,相关的格式输入还要用到正则表达式,例如第一题输入两个点的格式要用到的正则表达式来判断,如:if(str.matches("^[+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\s][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?")),第三次作业的第二题还是主要考察对类的创建以及运用

      2)题量,第一次题量偏多,但是难度简单点,第二次感觉和第一次差不多,就是第三次需要思考很久,可能是第一次要用那么多类,对以往的编码方式改变了有点不适应

 

2.设计与分析

     

 

    拿到这个题是一步步来的,先要了解三条边满足什么条件才能构成三角形,然后是三条边满足什么条件能构成什么类型的三角形,这就是最开始的思路。有了思路就好做了,通过if语句来判断输入满足        那种情况。以下部分代码是判断输入的三边能构成三角形时三角形的类型

 

  

 

复制代码
复制代码
if(a+b>c){
//判断三角形类型 if(a==b&&b==c) System.out.print("Equilateral triangle"); else if(a==b&&(c*c-a*a+b*b-c*c<0.01)) System.out.print("Isosceles right-angled triangle"); else if(a==b||b==c||a==c) System.out.print("Isosceles triangle"); else if(a*a+b*b-c*c<0.01) System.out.print("Right-angled triangle"); else System.out.print("General triangle");
}
复制代码
复制代码

 

   

 

     编写这部分代码是遇到的问题就是在判断能构成直角三角形时及等腰直角三角形的条件,因为输入的三条边的数值为double型,所以不能用两直角边的平方和等于斜边平方,而是

 

以“a*a+b*b-c*c<0.01”这种差值的形式来判断。
    下面给出一些数据的输入以及输出结果
以下为输入样例:

 

1
50 50 50.0

 


 

 以下为输出样例:

 

1
Equilateral triangle

 

            

类图:                                  

 

 

 

 

 

 

2.期中考试第一题

 

 

分析:这个题是要我们做一点线类的设计,还是比较简单的

public class Main {

static class Point {
private double x;
private double y;

public double getX() {
return x;
}

public double getY() {
return y;
}

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

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

public Point() {

}

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public void display() {
String str = String.format("%.2f,%.2f", x, y);
System.out.println("(" + str + ")");
}

上面是按照要求定义一个点类,初始化,get ,set,return,两个点的坐标还是比较简单。

 


}
static class Line {
private Main.Point point1;
private Main.Point point2;
private String color;

public Line() {

}

public Line(Main.Point point1, Main.Point point2) {
this.point2 = point2;
this.point1 = point1;
}
public Main.Point getPoint1() {
return point1;
}

public Main.Point getPoint2() {
return point2;
}

public String getColor() {
return color;
}

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

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

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

 

 

上面的定义的是一个线类,就是多了一个颜色的显示方法;

public void display() {
System.out.println("The line's color is:" + 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();
double xL = Math.abs(point2.getX() - point1.getX());
double yL = Math.abs(point2.getY() - point1.getY());
double length = Math.sqrt(xL*xL + yL*yL);
String str = String.format("%.2f", length);
System.out.println("The line's length is:" + str);
}
}

相关调用之前定义的类和方法;


public static void main(String[] args) {
double x1, x2, y1, y2;
Scanner scan = new Scanner(System.in);
x1 = scan.nextDouble();
y1 = scan.nextDouble();
x2 = scan.nextDouble();
y2 = scan.nextDouble();
if (x1 > 0 && x1 <= 200 && x2 > 0 && x2 <= 200 && y1 > 0 && y1 <= 200 && y2 > 0 && y2 <= 200 ) {

判断输入范围
String color = scan.next();
Point point1 = new Point(x1, y1);
Point point2 = new Point(x2, y2);
Line l = new Line(point1, point2);
l.setColor(color);
l.display();
} else {
System.out.println("Wrong Format");
}
}
}

总结:第一题还是没啥设计技巧的

下面是第二题:

 

 这里需要我们在原来基础上添加一个类Element,

  • 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
  • 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色

 

我的代码如下:

import java.util.Scanner;


public class Main {

static abstract class Element {
void display() {

}
}
static class Plane extends Element {
private String color;

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

 

定义抽象类ELement 的子类Plane

public String getColor() {
return color;
}

public void display() {
System.out.println("The Plane's color is:" + color);
}
}
static class Point extends Element {
private double x;
private double y;

public double getX() {
return x;
}

public double getY() {
return y;
}

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

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

public Point() {

}

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public void display() {
String str = String.format("%.2f,%.2f", x, y);
System.out.println("(" + str + ")");
}
}
static class Line extends Element {
private Main.Point point1;
private Main.Point point2;
private String color;

public Line() {

}

新添加地抽象的类Element;

 

public Line(Main.Point point1, Main.Point point2) {
this.point2 = point2;
this.point1 = point1;
}
public Main.Point getPoint1() {
return point1;
}

public Main.Point getPoint2() {
return point2;
}

public String getColor() {
return color;
}

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

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

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

public void display() {
System.out.println("The line's color is:" + 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();
double xL = Math.abs(point2.getX() - point1.getX());
double yL = Math.abs(point2.getY() - point1.getY());
double length = Math.sqrt(xL*xL + yL*yL);
String str = String.format("%.2f", length);
System.out.println("The line's length is:" + str);
}
}


public static void main(String[] args) {
double x1, x2, y1, y2;
Scanner scan = new Scanner(System.in);
x1 = scan.nextDouble();
y1 = scan.nextDouble();
x2 = scan.nextDouble();
y2 = scan.nextDouble();
if (x1 > 0 && x1 <= 200 && x2 > 0 && x2 <= 200 && y1 > 0 && y1 <= 200 && y2 > 0 && y2 <= 200 ) {
Plane p = new Plane();   具体创建一个Plane 类
String color = scan.next();
Point point1 = new Point(x1, y1);
Point point2 = new Point(x2, y2);
Line l = new Line(point1, point2);
Element elemnt = new Point();
elemnt = point1;
elemnt.display();
elemnt = point2;
elemnt.display();
p.setColor(color);
l.setColor(color);
l.display();
p.display();
} else {
System.out.println("Wrong Format");
}
}
}

 

2.第四题目集第二题

 

  第四次作业我是没有写出来的很遗憾,四边形的设计还是做不出来,但同时也清楚地认识到了自己的与别人的差距,以及一些自己对知识点的掌握不牢,不能熟悉运用,我觉得我应该多去看看相关内容的教学视频,

但是同时我一开始也有一些自己的思路见解也就是一些简单的IF ELSE输入判断,没有什么特别的,就一个格式输入,需要用到正则表达式,其他的根据的 题目要求来判断即可,自己的一些尝试的部分代码如下:

        


import java.util.Scanner;

 

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

String a = in.next();

if(a.length()<11) {
System.out.print("null data");
return;
}
//正则表达式判断输入合法性

然后自己的一些if 语句的判断:

 

 

if(a.charAt(start+10)=='0') {
validate = false;
}else {
validate = true;
sum = 0;
for(i=start+1;i<start+9;i++) {//奇偶位判断(奇判断)
if(a.charAt(i)=='1') {
sum++;
}
}
if(sum%2==0) {
if(a.charAt(start+9)=='1') {
parity = true;
}else {
parity = false;
}
}else {
if(a.charAt(start+9)=='0') {
parity = true;
}else {
parity = false;
}
}
}
if(validate == true) {
if(parity == true) {
for(i=start+1;i<start+9;i++) {
System.out.print(a.charAt(i));
}
System.out.print("\n");

不过当时自己没有好好思考,一看到48分的题就害怕了,现在看看其实也就那样吧。

第五次作业的二道题


第一题还是比较好计算的,

import java.util.Scanner;

 

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
if(num(str)==false)
{
System.out.print("wrong number of points");
}
else{
if(str.matches("^[+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\s][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?"))

这里运用正则表达式判断输的格式

将输入的内容先看做字符串然后用indexOf进行返回
{
int index = str.indexOf(' ');
String str0 = str.substring(0,index);
String str1 = str.substring(index+1,str.length());
Distance dis = new Distance(str0,str1);
dis.distance();
}
else
{
System.out.print("Wrong Format");
}
}
}
public static boolean num(String args) {

布偶类判断输入的合法性
int count=0;
for(int i=0;i<args.length();i++) {
{
if(args.charAt(i) == ' ')
count++;
}
if(count>=2)
return false;
}
return true;
}
}

 

class Distance

单独创建一个距离类来进行运算方便后面题目的运用{
String str1;
String str2;
public Distance(String str1, String str2)
{
this.str1 = str1;
this.str2 = str2;
}
//double num = Integer.parseInt(str1);
public double[] change(String s) {
double num[]= {0,0};
String str1="";
String str2="";
int index = s.indexOf(',');
for(int i=0;i<index;i++) {
if(s.charAt(i)>=48 && s.charAt(i)<=57||s.charAt(i)=='-'||s.charAt(i)=='.')
{
str1+=s.charAt(i);再创建一个类来将输入的代码提取出来,转化成我们需要的两个点
}
}
for(int i=index+1;i<s.length();i++) {
if(s.charAt(i)>=48 && s.charAt(i)<=57||s.charAt(i)=='-'||s.charAt(i)=='.')
{
str2+=s.charAt(i);
}
}
num[0] = Double.parseDouble(str1);这里就是进行把字符串的类型转化为浮点类型
num[1] = Double.parseDouble(str2);
return num;
}
public void distance() {
double d=0;
double[] sum1=change(str1);
double[] sum2=change(str2);
d = Math.sqrt(Math.pow(sum1[0]-sum2[0],2)+Math.pow(sum1[1]-sum2[1],2));//这里就是进行实际的计算操作返回值

System.out.print(d);
}
}

 

这题的大概思路就是你要创建一个点类,把输入的字符串按照格式要求后筛选,在把其转化成浮点类,在进行计算。

后面的第二题要求多一点,但是也要用到点类,我因为时间不够没有写出来,不过要创建好几个类, 点类,线类,然后进行判断平行的垂直,平行,当然,这三题是层层递进的,所以第三题也没有写出来,我觉得还是自己对类的定义调用,包括他们之间的关系,对成员变量,本地变量也不不够熟悉了解,还是得加强学习,而且时间也没有把控好,下次应该在发布后就写有时间思考

 

3.踩坑心得

1.我觉得我的踩坑心得就是要好好审题,并且多思考,根据题目要求一步步来,就说第一次题目的最后一题,自己没有好好推导,于是就没拿到所有的分,那个等腰三角形和直角三形的判断还没处理好,先筛选等腰三角形,再在等腰三角形中找直角三角形。

 2.对于一些报错,比如说声明定义啊,最好就是在全局中声明所要用的变量,避免到时候运用的时候未定义,还有一个是逻辑一定要能够行的去,因为逻辑错误不好改,所以在一开始就要构思好

3.对于知识点的漏洞和盲区,还是要多看网课,多学习,并且学习完后要进行自主的实践加深影响

我觉得能够做到知识点的把握,正确的逻辑思路,作业应该不是啥难,认真审题,勤思考。

 

4.改进建议

 

1》随着代码行数的增多,让我越来越意识到打代码时格式规范性的必要,在我写代码时常常忽视这点,我认为若写代码时只是一味的按自己意愿乱写,不仅会增加代码错误的概率,同时会加大你在检查代码时的难度,尤其是括号的使用,在这方面我还有很大的进步空间。

 

2》关于代码的复杂度问题,好的代码的复杂度应该较低,且效率较高,例如需要写一大串的if-else嵌套语句时,可以用switch语句进行替代,提高代码的效率。

3》对于类的创建一定要清晰,不要混乱,要明白作用,不要造成代码累赘

 

 

5.总结

 

        这三次作业学到不少东西,当然这也只是皮毛,但是基础要打牢,慢慢来,我相信我可以学到更多好的东西。

  因为上个学期已经学过C语言,所以这个学期弄JAVA觉得轻松一些,是有许多相似的方式,但还是有很大的不同。我学到了方法和类的区别,也了解到了写代码时不应该只顾着写出来,更应该对其进行优化。而且不管题目有多难我们都应该努力克服,而不是逃避。当然最大的体悟就是靠自己,靠自学,自己才能帮自己,一定不能抄袭。

我对于JAVA语法有个初步熟悉,学习到了简单的输入输出,将C语言一些陈规与JAVA语言互通。学会了使用一维数组,for循环等,并且学会了在创建类并在类中创建私有属性来实现JAVA语言特有的封装性,使用set和get语句来帮助实现。但对于一些题目的处理不恰当,例如可以用switch语句处理的日期问题,还是喜欢无脑使用if语句,这样不仅对于程序编写不利,还会使复杂度上升,加大程序运行难度。

   自己也总结了一些重要的知识点:

1.== :比较的是栈内存中的值(地址)

2.equals : 比较的是内容,重写该方法才有意义

四、函数传参是:基本类型是值的拷贝的传递;引用类型是引用的传递

五、String的理解:

new出来的对象与直接写的的区别

String s1 = new String("abc");       

String s2 = new String("abc");    

System.out.println("s1 == s2 : " + (s1 == s2));//false

System.out.println("s1.equals(s2) : " + s1.equals(s2));//true

String s3 = "abc";9 String s4 = "abc";10

System.out.println("s3 == s4 : " + (s3 == s4));//true

System.out.println("s3.equals(s4) : " + s3.equals(s4));//true

六、getClass:

Class字节码的获取:

1.通过对象获取;对象.getClass()

2.通过类获取;类.Class

3.Class的forName方法获取。  Class.forName("com.westos.javase.lesson04_2.Person");  ------->  注意全名

以上就是对于前三次作业的总结,还是有很长的路要走,总而言之,经过这三次PTA作业,我对Java的学习和了解有了很大的变化,从完全不懂到可以分析解题写代码优化,但是我发现自己的的编程能力和独立思考的能力还是不够并且我的思维方式也不够严谨简便,在后续的学习中,我会与同学多多交流,去CSDN查找有关资料,相信自己以后会对Java及其语法的使用进行更深入的认知与学习

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2022-05-15 22:18  相信光好嘛?  阅读(56)  评论(0编辑  收藏  举报

导航