第二次總結性blog
第二次總結性blog
一、前言
1.第四次大作業中主要考察的是類的設計,呼叫類裡的各種方法以及增值表示式的運用,總共三道題,7-1、7-2的難度適中,花費的時間大概每道題半小時。7-3中點線性系列中關於對凸四邊形的計算難度比較大,耗時很久,花了幾天都沒有弄到滿分,其中對於數學的計算比較令人頭疼與難以理解。希望自己以後能解決好圖形類的題目叭!
2.期中考試一共有三道題,題量不大,三道題是一個漸進的過程,其中第一道題最為簡單基礎,最後一道題最難。每道題都有給設計類圖,按照設計類圖完成程式設計。題目總體來說不太難,思路比較清晰,但是因為我的基礎不太紮實,所以我在期中考試中並沒有拿到滿分。每道題大概費時半個小時,其中我關於容器類的掌握不夠紮實,導致我最後一道題並沒有拿滿分。今後一定要穩紮穩打,將自己的面向物件程式設計的能力提高,不要再出現簡單的題目寫不出來的情況了。
3.目前做了兩次實驗,實驗的難度總體偏大,每次實驗都要寫好幾天,但是能夠很好的鍛鍊自己的程式設計能力,很好的鞏固自己所學的知識。
二、設計與分析
第四次大作業——7-2 點線型系列4—凸四邊形的計算
1.思路
1.通過charAt的運用對字串進行分析,
2.判斷空閒、起始、結束以及奇偶校驗位的數字是否存在和正確,
3.用if語句再對相應的情況進行不同的分析,輸出不同的結論。
2.重要程式碼分析
1.//判斷是否為四邊形
1 class Judge2{ 2 3 public static boolean judge2(double x1,double y1,double x2,doubley2,double x3,double y3,double x4,double y4){ 4 double[] core; 5 core=nodical.nod(x1, y1, x4, y4, x3, y3, x2, y2); 6 if ((y4 - y3) * (x4 - x2) == (y4 - y2) * (x4- x3)) 7 return false; 8 else if ((y4- y3) * (x4 - x1) == (y4 - y1) * (x4 - x3)) 9 return false; 10 else if((y4 - y2) * (x4 - x1) == (y4 - y1) * (x4 - x2)) 11 return false; 12 else if ((y3 - y2) * (x3 - x1) == (y3 - y1) * (x3 - x2)) 13 return false; //任意三個頂點成直線,非四邊形 14 else if((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2)==0&&(y2-y3)*(x3-x4)-(y3-y4)*(x2-x3)==0) 15 return false; 16 if(( ((core[0]>x1&&core[0]<x2)||(core[0]>x2&&core[0]<x1)) &&((core[1]>y1&&core[1]<y2)||(core[1]>y2&&core[1]<y1)))&&( ((core[0]>x3&&core[0]<x4)||(core[0]>x4&&core[0]<x3)) && ((core[1]>y3&&core[1]<y4)||(core[1]>y4&&core[1]<y3)))) 17 return false; 18 else 19 return true; 20 } 21 }
2.//四邊形判斷點是否在四邊形內
1 class Judge4{ 2 public static int judge4(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double x5,double y5) { 3 double s1,s2,s3,s4,area,area1; 4 double l1,l2,l3,l4,l5; 5 double n1,n2,n3,n4,n5; 6 l1=length.longth(x2, y2, x5, y5); 7 l2=length.longth(x2, y2, x3, y3); 8 l3=length.longth(x3, y3, x4, y4); 9 l4=length.longth(x4, y4, x5, y5); 10 l5=length.longth(x2, y2, x4, y4); 11 n1=length.longth(x1, y1, x2, y2); 12 n2=length.longth(x1, y1, x3, y3); 13 n3=length.longth(x1, y1, x4, y4); 14 n4=length.longth(x1, y1, x5, y5); 15 area=0.5*l1*l4*triangle.sin(l5, l1, l4)+0.5*l2*l3*triangle.sin(l5, l2, l3); 16 s1=0.5*n1*n2*triangle.sin(l2, n1, n2); 17 s2=0.5*n2*n3*triangle.sin(l3, n3, n2); 18 s3=0.5*n3*n4*triangle.sin(l4, n3, n4); 19 s4=0.5*n1*n4*triangle.sin(l1, n1, n4); 20 n5=(float)(s1+s2+s3+s4); 21 area1=(float)area; 22 if(area1-n5!=0) 23 return 0; 24 else 25 { 26 if(n1+n2-l2==0||n2+n3-l3==0||n3+n4-l4==0||n4+n1-l1==0)//判斷點是否在線上 27 return 2; 28 else 29 return 1; 30 } 31 32 } 33 }
3.類圖
4.踩坑心得
因為我倒在了判斷錯誤格式上了,但是我覺得我將點輸入多了的情況判斷,正確的格式判斷,其餘的就是格式錯誤的格式了,但是這樣交上去仍然不行。
5.改進建議
我們可以將一些數學計算做一個類,再引用。否則圈複雜度過高,不利於下次迭代和維護。其實只寫了一下合併同類項,因為怕寫得多了反而出錯,權衡一下收益並沒有深入(然後還是出錯了QAQ)
對於每一個表示式,我們如果可以定義其雜湊值,那麼sin(x)與sin((x^2+1))便顯然可以以x和x^2+1作為兩個sin的鍵,其指數作為值,這樣鍵值關係就出現了,便依然可以做到對於每個三角函式迅速找到與其對應的cos^2 sin^2 與 1。於是就可以用類似第二次的方法進行優化。但是考慮到巢狀因子的存在,這個優化所需的時間開銷應當是會比第二次大不少的。
期中考試第一題——點與線(類設計)
1.思路
通過題目所給的類圖和題目要求去完成程式碼,通過對類圖的分析我解剖去了解思路,然後完成程式碼。
2.重要程式碼分析
關於點的設計
1 class Point { 2 3 private double x; 4 private double y; 5 6 public Point() { 7 8 } 9 10 public Point(double x,double y) { 11 this.x=x; 12 this.y=y; 13 } 14 15 public double getX() 16 { 17 return x; 18 } 19 20 public void setX(double x) { 21 this.x=x; 22 } 23 24 public double getY() 25 { 26 return y; 27 } 28 29 public void setY(double y) { 30 this.y=y; 31 } 32 public void display() { 33 34 } 35 36 }
3.類圖
期中考試第二題——7-2 點線面問題重構(繼承與多型)
1.思路
通過題目所給的類圖和題目要求去完成程式碼,通過對類圖的分析我解剖去了解思路,然後完成程式碼。
2.重要程式碼分析
1 Scanner in = new Scanner(System.in); 2 Element element=new Element(); 3 4 double x1 = in.nextDouble(); 5 double y1 = in.nextDouble(); 6 double x2 = in.nextDouble(); 7 double y2 = in.nextDouble(); 8 String color = in.next(); 9 10 Point p1 = new Point(x1,y1); 11 Point p2 = new Point(x2,y2); 12 Line L1=new Line(p1,p2,color); 13 Plane c = new Plane(color); 14 15 element=p1; 16 element.display(); 17 18 element=p2; 19 element.display(); 20 21 element=L1; 22 element.display(); 23 24 element=c; 25 element.display();
3.類圖
期中考試第三題——7-3 點線面問題再重構(容器類)
1.思路
通過題目所給的類圖和題目要求去完成程式碼,通過對類圖的分析我解剖去了解思路,然後完成程式碼。
2.重要程式碼分析
1 Scanner input = new Scanner(System.in); 2 int choice = input.nextInt(); 3 double x; 4 double y; 5 double z; 6 double w; 7 int number; 8 String color; 9 10 11 GeometryObject g = new GeometryObject(); 12 while(choice != 0) { 13 switch(choice) { 14 case 1:{ 15 x=input.nextDouble(); 16 y=input.nextDouble(); 17 Point p = new Point(x,y); 18 g.add(p); 19 } 20 break; 21 case 2:{ 22 x=input.nextDouble(); 23 y=input.nextDouble(); 24 Point p1 = new Point(x,y); 25 z=input.nextDouble(); 26 w=input.nextDouble(); 27 Point p2 = new Point(z,w); 28 color = input.next(); 29 Line L = new Line(p1,p2,color); 30 g.add(L); 31 32 } 33 break; 34 case 3:{ 35 color = input.next(); 36 Plane p = new Plane(color); 37 g.add(p); 38 } 39 break; 40 case 4:{ 41 42 number = input.nextInt(); 43 if(g.getList().size()>=number) 44 g.remove(number-1); 45 } 46 47 } 48 choice = input.nextInt(); 49 } 50 ArrayList<Element> list = g.getList(); 51 for(int i=0;i<list.size();i++) { 52 list.get(i).display(); 53 }
3.類圖
4.踩坑心得
可能在按照類圖寫題目是漏看了abstract或者返回的型別,導致錯誤,類圖對不上,通過對類圖的仔細分析,才能找出錯誤。
5.改進建議
對於在這次的實驗我覺得沒有什麼可以改進的,因為我們是按照類圖來寫的,所以一切都是比較完美的,沒有那麼多彎路,第一次感覺有類圖去寫題目是多麼的nice。
三、總結
對於自己寫的程式來說bug還是有很多的,但形成的原因也是有很多的,比如類的混亂,還有隨機數的產生導致有些點可以過,但隨機數可能使那些點不能過。還有那些正則表示式超級長,看到就腦闊疼,今後我個人會盡量避免寫出這樣的程式碼,除非真的萬不得已。
當然在寫第四次大作業的時候7-2中的第4次情況寫了一大段,但是當執行的時候就不能執行,一開始以為時是單純的進不了迴圈,當測試幾個樣例的時候發現可以進入,那個時候就快崩潰了,當時程式碼寫的太雜了,而且都是很混亂的,導致自己根本改不好,只能無奈的全刪了,去騙分。當時就後悔了,應該講那些程式碼寫進一個類,在類裡面進行判斷,這樣程式碼既不會寫錯,到時候改的時候也會更清晰明瞭一點。不會像這樣氣急敗壞的刪除了。
期中的做題目,我雖然沒有取得滿分,但是最後我在下面看了看,我覺得我會,可能是當時太緊張了,學的知識不牢固。通過這次的期中考試我知道了容器怎麼用,對於類的分類也更清晰了。
面向物件不一定比面向過程,面向結果優越,但是優秀的封裝和類一定好太多了,第四次作業能寫滿分,我相信他的封裝和程式碼一定比別人更清晰明瞭,也更容易看的懂。
展望:
經過這半個學期的洗禮,我覺得我的程式碼能力有明顯的提升,當然有些地方也有些不足,同時自我學習能力也會更強,因為那些正則表示式是自己在網路上找的資料學習的,當然大家的進步速度也是迅猛的,我也要加把勁。
在後面兩次作業中,能明顯感受到程式碼量增加,第一次全部加起來都沒有400行,但是現在,一個題目就會有200-350行程式碼左右,因為裡面包含很多演算法和方法。
期望:
在這半個學期我學到了很多東西,例如一些函式的運用,同時也吸取了教訓,積累了經驗。