物件導向程式設計三次大作業總結

ypxad發表於2024-04-21

前言:
透過這輪大作業的學習,我清楚了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);
LinkedListphone=new 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(d
1)
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語言差別很大,需要一定的線上線下結合方式學習。

相關文章