# Java第13週[JPA503~505 %02d、陣列指定初始值+函數運用、費氏數列、反轉陣列] #### 複習用 ## 開始解題(JPA503~505): ### 第一題(JPA503)-矩陣之和[使用 %02d、陣列指定初始值+函數運用]: #### [A.length 和 A[i].length 的差別](https://blog.csdn.net/qq_40723205/article/details/79763534) ```java=1 int [][]A=new int [2][3]; //矩陣: int [][]A={{1,2,3},{4,5,6}}; //1 2 3 {} // 00 01 02 10 11 12 //4 5 6 {} A.length=2; //看大{}內的小{}有多少個,代表兩列 A[i].length //第i列的有多少元素 A[0]=3; //{1,2,3},共3個 A[1]=3; //{4,5,6},共3個 ``` #### [%02d是什麼?](https://www.796t.com/post/ZmF2eQ==.html) **[個位數字補0]** 至少2位十進制整數,如果數字小於或等於9 則第一個為零,不夠就補0 ```java=1 System.out.printf("%02d ",i); 輸出結果: 01、02、03...09 //簡單來說就是 [個位數字補0] 10、11... ``` ![](https://i.imgur.com/ieA0L1u.png) 解答: ```java public class JPA051 { //宣告兩個整數變數[全域型變數=>在主程式、函數也可以使用] // final static int ROW = 2; //宣告二維陣列的[列數] final常數 // final static int COL = 3; //宣告二維陣列的[行數] final常數 public static void main(String args[]) { int A[][] = {{1,2,3}, {4,5,6}}; //兩列三行 int B[][] = {{7,8,9}, {10,11,12}}; int C[][] = new int[2][3]; System.out.printf("陣列A的內容為(3x3):\n"); show(A); System.out.printf("\n陣列B的內容為(3x3):\n"); show(B); add(A, B, C); System.out.printf("\n陣列A+B=C,陣列C的內容為(3x3):\n"); show(C); } public static void add(int[][] A,int[][] B,int[][] C) { for(int i=0;i<2;i++) //A.length(列數) { for(int j=0;j<3;j++) //A[i].length(行數)第i列有多少元素 { //{{},{}}每一個{}內部有幾個元素 C[i][j]=A[i][j]+B[i][j]; } } } public static void show(int [][]N) //列印陣列(A、B、C陣列都會進來) { for(int i=0;i<2;i++) { for(int j=0;j<3;j++) { System.out.printf("%02d ",N[i][j]); //%02d代表2bits輸出 } //自動補0 System.out.printf("\n"); } } } ``` --- ### 第二題(JPA504)-費氏數列F[使用陣列+迴圈]: #### [費氏數列](https://gn00466269.pixnet.net/blog/post/46545504) 程式語言中常見的遞迴 他的每一項分別是: A0=0 A1=1 AN=A(N-1)+A(N-2) 也就是**A2以後**,**每一項的值**就是**前兩項的值相加** 使用**遞迴的方法**可以把費式數列的值做出來 ![](https://i.imgur.com/uNkuU7Z.png) 解答: ```java public class JPA051 { public static void main(String[] args) { int[] F=new int[10]; //F[0]~F[9],共10個 F[0]=0; F[1]=1; //注意迴圈 初始i是2 for(int i=2;i<F.length;i++) //計算 { F[i]=F[i-1]+F[i-2]; //F[2]=F[1]+F[0] } for(int i=0;i<F.length;i++) //輸出 { System.out.printf("%d\n",F[i]); } } } ``` 加上**例外處理**的解答: ```java public class JPA051 { public static void main(String[] args) throws ArrayIndexOutOfBoundsException { try { int[] F=new int[10]; F[0]=0; F[1]=1; for(int i=2;i<F.length;i++) //計算 { F[i]=F[i-1]+F[i-2]; } for(int i=0;i<=F.length;i++) //輸出 { System.out.printf("%d\n",F[i]); //OutOfBoundsException } //迴圈範圍錯誤 } //代表陣列存取超出範圍 catch(ArrayIndexOutOfBoundsException ie) //改成i <= F.length會產生OutofBound例外訊息 { System.out.println("陣列存取超出範圍,迴圈範圍錯誤"+ie); } } } ``` --- ### 第三題(JPA505)-反轉陣列[使用陣列交換]: #### 反轉: ![](https://i.imgur.com/LBo3KZe.png) ```java=1 public static void reverse(String[]N) { String temp; for(int i=0;i<N.length/2;i++) //做5次交換(看上圖的線,代表5次交換) { temp=N[i]; //temp=A //原先N[0]的值會被蓋掉 N[i]=N[(N.length-1)-i]; //N[0]=J //所以用Temp先接住 N[(N.length-1)-i]=temp; //N[9]=A //達到A、J交換 } } ``` ![](https://i.imgur.com/VqNTQOO.png) 解答: ```java public class JPA051 { public static void main(String[] argv) { String[] data = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"}; //宣告一維字元陣列data,共10個元素 System.out.print("反轉陣列資料之前: "); for(int i=0;i<data.length;i++) { System.out.printf("%s ",data[i]); } System.out.printf("\n"); reverse(data); System.out.print("反轉陣列資料之後: "); for(int i=0;i<data.length;i++) { System.out.printf("%s ",data[i]); } System.out.printf("\n"); } public static void reverse(String[]N) { String temp; for(int i=0;i<N.length/2;i++) //做5次交換 { temp=N[i]; //temp=A N[i]=N[(N.length-1)-i]; //N[0]=J N[(N.length-1)-i]=temp; //N[9]=A } } } ``` ### 額外延伸 #### 泡沫排序法: 將數字 **由小排到大** 或 **由大排到小** [[泡沫排序法1]](https://www.itread01.com/content/1546396767.html) [[泡沫排序法2]](https://pjchender.blogspot.com/2017/09/bubble-sort.html) --- 最後編輯時間:2021/5/23 9:48pm. ###### tags: `JAVA課堂學習` `複習用` `高科大`