三次題目集總結

(1)前言:總結三次題目集的知識點、題量、難度等情況

  第一次題目集

  1,計算兩個數的和—-數據的輸入及運算

  2,電話鍵盤字母數字轉換—-數字與字元的相互轉化,以及數據合法性檢驗

  3,成績分級管理 —-java中選擇語句的運用

  4,計算稅率—-java中選擇語句的運用

  5,計算錢幣—-數據運算

  6,使用一維數組求平均值—-數組的用法

  7,對多個整數進行排序—-對一維數組進行排序

  8,判斷三角形類型—-double類型轉化為int型,產生誤差

 

  難度分析:第一次題目集,較為簡單,已經經過C語言的學習,java中很多語法都與之相似。

 

  第二次題目集

  1,IP地址轉換 —-二進位轉化為十進位

  2,合併兩個有序數組為新的有序數組 —-合併數組並排序

  3,判斷閏年及星期幾—-合理使用數組代替if

  4,求下一天—-對方法的調用

  5,求前N天—-合理利用數組及方法

 

  難度分析:第二次題目集,並不難,並且該題目集中,後4題都十分類似。在合理利用數組的情況下,並沒有非常大的問題。

 

  第三次題目集

  1,創建賬戶類Account —-類的創建及使用、類中方法的調用

  2,定義日期類—-類的創建及使用、類中方法的調用

  3,一元多項式求導(類設計)—-字元串的處理(截取、連接)

 

  難度分析:第三次題目集,前兩題只是增加了一個對類的處理,較為簡單。

       最後一題,考察的是對字元串的處理,很多高效的方法沒有掌握熟練(正則表達式、split方法),因此該題對我而言十分吃力。

(2)設計與分析:

7-8判斷三角形類型

  因為初期沒有學習關於類的知識,此題沒有使用到類

  此題在對三個數比較大小時,我使用for循環和if,並且後續還使用if判斷三角形的類型(可以改進使用switch),導致複雜度太高。

  另外,沒有寫注釋,也沒有使用方法,直接在Main方法中寫完程式碼。

 

SourceMonitor的報表:

  

 

7-4 求下一天

  此題也沒有使用到類。

  該題是求日期的下一天,因此要考慮的問題就包括數據的合法,以及跨年、跨月、閏年。均使用if判斷語句解決。

  將各月份的天數存入數組,更為簡便,在數組中將月份+1,即可得到該月對應天數。省去了每月份都用if判斷,提高效率。

 SourceMonitor的報表:

 

 

7-5 求前N天

  沒有使用類

  該題完全可以借鑒上一題7-4求下一天,將方法nextDate(),多傳入一個參數n。

將day++   改為day-=n

  與上題類似,將各月份的天數存入數組,便於使用。

 SourceMonitor的報表:

 

7-2  定義日期類

  該題主要是要理解對類的使用,而非前面題目集中,直接調用方法解決問題。

  借鑒7-4中求下一天的方法,將年月日作為日期的私有屬性,將輸入的資訊參數傳入類中,再在類中調用方法,輸入結果。

  複雜度與7-4類似,但使用類,做到了對數據的保護。

類圖

 

 SourceMonitor的報表:

 

7-3  一元多項式求導(類設計)

     沒有使用類

  通篇使用if、for循環,導致複雜度太高,變成垃圾程式碼。

  首先,拆分每一項,我是用if依次對每個字元進行判斷後截取,完全可以用正則表達式或split的方法代替,因為掌握不熟練,沒有使用。因此複雜度極高。

  提取每一項的係數及指數,也是使用if判斷後,提取字元,然後轉化為int型,再進行求導運算。同樣也可用正則表達式或split的方法代替,減少複雜度。

  對於每一項,可以創建一個類來儲存,因為對類的使用不熟練,而沒有使用。

SourceMonitor的報表:

  

 

 

(3)采坑心得:                                         

 

  第一次題目集最後一題判斷三角形類型中,涉及到根號的運算(判斷等腰直角三角形,斜邊為腰長的√2倍),此時在電腦中,就應考慮到誤差值,從而不能用

1    if( max*max==mid*mid+min*min ) 

  而應改為

1     if( max*max-(mid*mid+min*min)<1e-5 )

                                                                                                                                                                                                         

(4)改進建議 :

 

  第一次題目集中最後一題–判斷三角形類型,對三角形三條邊比較大小,我使用for循環一個一個比較 非常複雜,且效率極低

1   double min=a[0],max=a[0],mid=a[0];
2         for(i=0;i<3;i++) {
3             if(a[i]>max) max=a[i];
4             if(a[i]<min) min=a[i];
5             num=num+a[i];
6         }
7         mid=num-max-min;

  對此,可以用Java中的Math類進行快速比較,

  改進程式碼

1     double max,min,mid;
2         max=Math.max(Math.max(a[0],a[1]), a[2]);
3         min=Math.min(Math.min(a[0], a[1]), a[2]);
4         mid=a[0]+a[1]+a[2]-max-min;

                                                                                                                                                                                                                                                                                                                                                            

 

  第二次題目集 第一題 IP地址轉換,對八位二進位數字轉化為十進位。

  我從後往前,依次求出各個二進位所對應的十進位數後,相加。每次循環都進行了if判斷,且還調用了Math類中的方法,增加了複雜度

1         for(i=7;i>=0;i--) {
2             if(a[i]==1) {
3                 num1+=Math.pow(2, j);
4             }
5             j++;
6         }       

  改進程式碼

  因為二進位中只有0和1,完全可以減少if語句的判斷,減低複雜度。

1     for(i=0;i<8;i++) {
2                 num=num*2+a[i]; 
3         }

                                                                                                                                                                                                                                                                                                                                                                                                                                 

(5)總結: 

  學到了什麼:順序、選擇、循環、方法(函數)在java中的使用。

  了解複雜度的概念,盡量減少使用if,以及加註釋,增加程式可維護性。

  對字元串的處理,字元串的連接、截取。

 

  需要進一步學習及研究

   BigInteger的使用(當整型數據超過了整數的最大類型長度long的話,數據無法裝入,因此要使用BigInteger類進行操作)

  對類的使用(創建、調用)極其不熟練

  java中的鏈表 Linked list  

  正則表達式