1. 程式人生 > 其它 >第二次總結性blog

第二次總結性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,double
y2,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行程式碼左右,因為裡面包含很多演算法和方法。

   期望:

  在這半個學期我學到了很多東西,例如一些函式的運用,同時也吸取了教訓,積累了經驗。