面向对象程序设计三次大作业总结
前言:
通过这轮大作业的学习,我清楚了java与c语言的差别所在。java比c语言更清晰明了,是直接面向对象的编程性语言,对很多代码的复用性要强于c语言,比c语言难懂但是实用。Java是一门面向对象的语言,如果想要运用好java,不能用常规思维去进行思考,要学着掌握面向对象的方向来思考问题,所以在一些相同情况下,java的篇幅可能会比c语言多,不过当条件变多时,java便会比c语言更清晰,不容易出错。对比下来,c语言是基础类编程语言,java需要一定的基础学习起来会更方便
三次大作业中所涉及的知识点:
第一次大作业:
第一次大作业的内容就很基础,创建类,区别主类与副类,有参构造和无参构造,这些都是初学Java需要理解的东西,普遍倾向于培养养成面向对象思维的学习。主要目的是培养学生养成用面向对象思维解决问题,很适合初学者进行学习。
第二次大作业:
第二次大作业内容难度上升,有类与类之间的关系,单一职责原则,compareTo方法的运用,toString方法的运用,正则表达式的运用和ArrayList与HashMap与LinkedList的使用。第二次大作业的难度比第一次要难很多,但是运用合理其实也不算难,如果面向对象思维没有弄清楚,那么就会很难掌握。
第三次大作业:
第三次大作业内容难度上升很多,相当于巩固前面所学的内容,主要运用正则表达式进行编码。如果正则表达式运用得当,那就不会很吃力。
刚开始学习java,面临着面向对象思维的转变,我很难掌握,对编码的理解不够透彻,这轮大作业从c语言到java的转变很突然,刚开始会很有压力,感觉哪里都不是很明白,总是不理解为什么这么去编码。通过在学堂在线的学习和自己线下的沟通也就勉强跟上进度,但是很多时候编码的不细节会出现很多错误。刚开始对toString的运用总是不够透彻,很多时候只是知道这段代码是什么意思,并不清楚其中的指向意思,这导致在第一次大作业中,很长一段时间构思不出怎样编码。
第二次大作业学习的时候,由于第一次大作业进度勉强追上。但突然增加的难度让我很没有防备,我复用第一次大作业的部分代码,还是很难做出全部要求,所以出现的错误很多,后面通过看学堂在线,清楚了一些,又重新编码,将原代码改了又改,很耗费时间。
第三次大作业相比第二次,差的就是时间上面了,难度增加很多,其中的第二题,这道题的难度很高,需要判断输入格式,很难掌握,我一度认为我的代码没有出错,后来向同学求助才改进。最后一题附加了很多条件,难度非常大,所以很难掌握第三次大作业的内容,我也是事后才慢慢掌握的。
设计与分析:
第一次大作业第一题:
本题很基础很容易掌握,我根据题意创建了一个主类和一个风扇类,其中主类用来接收控制台中的指令,将其传入风扇类对风扇的属性进行修改。
第一次大作业最后一题:
本题难度是第一次上升,对输入的试卷信息进行存储并给出输出,我是创建了一个主类和三个副类,主类用来接收所需要的信息。one类用来接收及储存输入的题目信息,包括题目内容,序号和正确答案。two类用来将one类储存,使数据有序存储。three类是储存回答的答案,判断是否回答正确并输出相应结果。
第二次大作业最后一题:
本题与第一次大作业有很多联系,我是在基础上增加了试卷与答卷的内容及其之间的匹配和答卷总分的计算。通过同学介绍我第一次增加了Multiple类,用此来储存多张试卷及多张答卷的信息,并且输出数据时使用其中的数据。
第三次大作业最后一题:
本题难度变化很大,增加了些许条件判断和限制。增加了学号及姓名和题目的删除。所以这道题不存在多张答卷的情况,老师上课的讲解,我增加了AnswerQuestion类,其中AnswerQuestion类用来储存试卷的试卷号及题目顺序,所要删除的题号,答题人的学号,出现过的学生学号,以及试卷。我也运用了TheOther类。TheOther类用来存储题目的分数,答题的顺序以及题号。
踩坑心得:
第一次大作业的最后一题,我在初步提交时候,只得到了半对,有几个测试点未通过,我一直没有发现我哪里出现错误,通过向同学询问,我发现是我在运用ArrayList的时候没有完全透彻,只有输入没给出相应的输出于是,我在存入数据时加了一段ArrayListanswerOrder=new ArrayList<>();第二类设计没有清晰,放在了主类里面,也产生了错误又重新设计了第二类Subject(){}
void setScore(int score)
{
this.score=score;
}
int getScore()
{
return score;
}
int getOrder()
{
return order;
}
String getContent()
{
return content;
}
改进建议:
在设计类的时候清晰主类和副类,不要在主类里面运用副类,要通过类之间的关系调用副类
例如:
String getterName()
{
return name;
}
String getterSex()
{
return sex;
}
String getterStudentID()
{
return studentID;
}
int getterAge()
{
return age;
}
String getterMajor()
{
return major;
}
public Student(String studentID,String name,int chineseGrade,int mathGrade,int physicalGrade)
{
this.studentID=studentID;
this.name=name;
this.chineseGrade=chineseGrade;
this.mathGrade=mathGrade;
this.physicalGrade=physicalGrade;
this.totalGrade=calculateTotalGrade();
this.coverage=calculateCoverage();
}
tatic class Circle {
private int radius;
public Circle() {
this.radius = 2;
System.out.println("This is a constructor with no para.");
}
public Circle(int radius) {
if (radius <= 0) {
this.radius = 2;
} else {
this.radius = radius;
}
System.out.println("This is a constructor with para.");
}
public void setRadius(int radius) {
if (radius <= 0) {
this.radius = 2;
} else {
this.radius = radius;
}
}
public int getRadius() {
return radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
public String toString() {
return "Circle [radius=" + radius + "]";
}
}
public static void main(String[] args) {
Circle c1 = new Circle();
System.out.println(c1.toString());
System.out.printf("%.2f\n", c1.getArea());
Circle c2 = new Circle();
System.out.println(c2.toString());
System.out.printf("%.2f\n", c2.getArea());
Scanner scanner = new Scanner(System.in);
int radius = scanner.nextInt();
c2.setRadius(radius);
System.out.println(c2.toString());
System.out.printf("%.2f\n", c2.getArea());
radius = scanner.nextInt();
Circle c3 = new Circle(radius);
System.out.println(c3.toString());
System.out.printf("%.2f\n", c3.getArea());
}
}public class Main{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
LinkedList
String type;
int price;
for(int i=0;i<3;i++)
{
type=input.next();
price=input.nextInt();
input.nextLine();
MobilePhone mobilePhone=new MobilePhone();
mobilePhone.setType(type);
mobilePhone.setPrice(price);
phone.add(mobilePhone);
}
System.out.println("排序前,链表中的数据:");
for(int i=0;i<3;i++)
{
System.out.println("型号:"+phone.get(i).getType()+",价格:"+phone.get(i).getPrice());
}
type=input.next();
price=input.nextInt();
Collections.sort(phone);
System.out.println("排序后,链表中的数据:");
for(int i=0;i<3;i++)
{
System.out.println("型号:"+phone.get(i).getType()+",价格:"+phone.get(i).getPrice());
}
MobilePhone a=new MobilePhone(type,price);
int d=0;
int index=0;
for(int i=0;i<3;i++)
{
if(phone.get(i).compareTo(a)0)
{
d=1;
index=i;
}
}
if(d1)
System.out.println(type+"与链表中的"+phone.get(index).getType()+"价格相同");
else
System.out.println("链表中的对象,没有一个与"+type+"价格相同的");
}
}
class MobilePhone implements Comparable
private String type;
private int price;
public int compareTo(MobilePhone phone)
{
return this.price-phone.price;
}
MobilePhone(String type,int price)
{
this.type=type;
this.price=price;
}
MobilePhone()
{}
void setType(String type)
{
this.type=type;
}
void setPrice(int price)
{
this.price=price;
}
String getType()
{
return type;
}
int getPrice()
{
return price;
}
}
对可见性修饰符也需要多注意。
通过在csdn上学习
可以使用import java.util.*这样不容易遗漏需要的类的声明。
总结:
通过这轮大作业的学习,我学会了运用面向对象思维去编码问题,对ArrayList,HashMap等存储数据类的使用,初步掌握正则表达式的运用。对于Java的理解上提升很多。但是我仍然存在很多不足,没有同步学堂在线的学习让我在很多编码上出现很多问题,后来通过老师讲解和同学点拨,我又补看学堂在线才了解到,这对代码编程过程来讲很费时间,我总是不够理解类之间的各种作用。很多都是同学讲解我才能勉强跟上,我觉得我需要总结学习方法,Java学习的节奏与c语言差别很大,需要一定的线上线下结合方式学习。