OO课程第三阶段(实验和pta试题)总结Blog3

2023-03-15,,

OO课程第三阶段(实验和pta试题)总结Blog3

前言:学习OOP课程的第三阶段已经结束了,在此进行对于知识点,题量,难度的个人看法。

学习OOP课程的第三阶段已经结束了,较第一次阶段学习难度加大,学习的内容更多,但收获也更多。第三阶段通过三次题目集落下帷幕,第三次阶段总结的最高潮是类设计,而本次的几次题目集基本所有的题目都以类设计为基础,完成题目的构建。在类设计的基础上,通过对继承,多态,接口等多方面学习,认识到类设计不是单一的去设计一个方法完成功能。面向对象编程的思想,也在本次学习真正拉开了序幕。面向对象编程不同于面向过程编程,在创立一个对象后便有明确的功能性,通过继承,多态,接口可以实现不同对象实现不同的功能。其中在类设计上,通过学习类属性的访问权限,初步了解了四种访问权限:public,private,protected,default;以及不同类的类型:实体类,业务类,接口类;对于类设计上,学习的多,代表思路与编程思想变得更为开阔且严谨,开始真正考虑到如何将一个题目设计到恰如其分,不同的设计思路带来的不同效果。

各题目:设计与分析、采坑心得、改进建议 。

设计与分析

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point point1 = new Point(x1,y1);
Point point2 = new Point(x2,y2); Line line = new Line();
line.setColor(input.nextLine());
line.display();
} } class Point{
private double x = 0;
private double y = 0; Point(){} //无参构造
Point(double a,double b){
this.x = a;
this.y = b;
} 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;
}
}
class Line{
private Point point1;
private Point point2;
private String color ; Line(){} Line(Point p1,Point p2,String color){
this.point1 = p1;
this.point2 = p2;
this.color = color;
} public Point getPoint1() {
return point1;
} public void setPoint1(Point point1) {
this.point1 = point1;
} public Point getPoint2() {
return point2;
} public void setPoint2(Point point2) {
this.point2 = point2;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public void display(){
double result = Math.sqrt(this.point2.getX()*this.point2.getX()-this.point1.getX()*this.point1.getX())+Math.sqrt(this.point2.getY()*this.point2.getY()-this.point1.getY()*this.point1.getY());
if(this.getColor() != null ){
System.out.println("Wrong Format");
}else {
System.out.println("("+this.getPoint1()+")");
System.out.println("("+this.getPoint2()+")");
System.out.println("The line's color is:"+this.getColor());

该题较简单,不需要构建多个类去完成,仅仅是通过简单的主函数便可以完成全部的功能,虽然形式简单,但是还是出现了对bug的不断调试。以下阐述我的采坑心得:

1)定义两个Point对象p1,p2;

2)写出有参构造方法,传递两个对象值给p1,p2

3)为p1,p2写出setters,和getters方法

4)为Line写出一个getLength方法求直线中两点的长度

5) 为LIne写一个ToString方法,方法如下所示:

public String toString() { return "Line [p1=" + p1 + ", p2=" + p2 + "]"; }

在Main类的main方法中,定义一个Line数组,数组长度通过键盘给出,然后通过键盘为每线段的两个Point对象的坐标赋值,并生成相应Line对象放入数组中,循环数组,输出每条直线的信息,以及两个点之间的距离。

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point point1 = new Point(x1,y1);
Point point2 = new Point(x2,y2); Line line = new Line();
line.setColor(input.nextLine());
line.display();
} } class Point{
private double x = 0;
private double y = 0; Point(){} //无参构造
Point(double a,double b){
this.x = a;
this.y = b;
} 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;
}
}
class Line{
private Point point1;
private Point point2;
private String color ; Line(){} Line(Point p1,Point p2,String color){
this.point1 = p1;
this.point2 = p2;
this.color = color;
} public Point getPoint1() {
return point1;
} public void setPoint1(Point point1) {
this.point1 = point1;
} public Point getPoint2() {
return point2;
} public void setPoint2(Point point2) {
this.point2 = point2;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public void display(){
double result = Math.sqrt(this.point2.getX()*this.point2.getX()-this.point1.getX()*this.point1.getX())+Math.sqrt(this.point2.getY()*this.point2.getY()-this.point1.getY()*this.point1.getY());
if(this.getColor() != null ){
System.out.println("Wrong Format");
}else {
System.out.println("("+this.getPoint1()+")");
System.out.println("("+this.getPoint2()+")");
System.out.println("The line's color is:"+this.getColor());

以下是我的踩坑心得:

继承的作用:

(1)使用继承可以有效实现代码复用,避免重复代码的出现。

(2)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。

(3)继承可以更方便程序的维护和更新,像老师所说的那样,我们分成多个模块要是需要更新只需要更新对应模块的内容。

(4)继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。

多态的作用:

(1)可以增强程序的可扩展性及可维护性,使代码更加简洁。

(2)不但能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。

(3)应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
Point point1 = new Point(x1,y1);
Point point2 = new Point(x2,y2); Line line = new Line();
line.setColor(input.nextLine());
line.display();
} } class Point{
private double x = 0;
private double y = 0; Point(){} //无参构造
Point(double a,double b){
this.x = a;
this.y = b;
} 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;
}
}
class Line{
private Point point1;
private Point point2;
private String color ; Line(){} Line(Point p1,Point p2,String color){
this.point1 = p1;
this.point2 = p2;
this.color = color;
} public Point getPoint1() {
return point1;
} public void setPoint1(Point point1) {
this.point1 = point1;
} public Point getPoint2() {
return point2;
} public void setPoint2(Point point2) {
this.point2 = point2;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public void display(){
double result = Math.sqrt(this.point2.getX()*this.point2.getX()-this.point1.getX()*this.point1.getX())+Math.sqrt(this.point2.getY()*this.point2.getY()-this.point1.getY()*this.point1.getY());
if(this.getColor() != null ){
System.out.println("Wrong Format");
}else {
System.out.println("("+this.getPoint1()+")");
System.out.println("("+this.getPoint2()+")");
System.out.println("The line's color is:"+this.getColor());

我的踩坑心得如下:

1、针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。

2、题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到。

3、题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。

4、输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述内容,并使界面所示方案清晰简洁。

改进建议 :

对于技能上的学习,在对字符串的校验处理上,通过对正则表达式的深入学习,掌握对复杂数据的校验,截取,替换等,作为一项工具使用,在程序复杂度上大大降低。以及对于list的学习,可以对多对象处理上更为便捷可观,多对象处理上更为有效。还有对于hashmap的学习,对于其中遍历的运用进行了学习,对于多字符校验上有了更广阔的思路。不仅于此,题目集中许多边边角角运用的技能,也是会通过学习得以利用。

总结:

对于课程的学习建议,个人认为目前的pta便是不错的,有难有易,好上手,若想拿满分则必须要去自我学习。自我学习上,课程自带的SPOC课程则是选择之一,我们仍可自己去选择去论坛学习或者其他网课上学习。在实验上,目前进行的农夫过河的迭代性编程,面对同一个问题随着技术加深,我们需要运用更为上层的知识解决同一个问题,这是有趣也充满挑战的。线下课程中,希望老师不仅可以有对知识的讲解,与编程思想的演练,更可以对pta或者实验的难题加以点评与讲解,让作业不会得过且过,而是让我们更为深刻的了解一道题目应该如何去设计。作为学生自身,已经了解到这是一门需要自我探究,自我学习的课程。时间,精力,投入,缺一不可,不去假大空,而是去真正的做。

第二阶段于此就告一段落了,首先感谢OOP课程的老师与助教的付出,再而感谢还在学习的自己。希望有更好的心态迎接以后的学习!

OO课程第三阶段(实验和pta试题)总结Blog3的相关教程结束。

《OO课程第三阶段(实验和pta试题)总结Blog3.doc》

下载本文的Word格式文档,以方便收藏与打印。