# Java第14週
>範圍 **JPA506~508**
>==三維陣列元素之和==[color=#EA0000]
>==停車費用計算==[color=#EA0000]
>==泡沫排序法== (泡泡排序法)[color=#EA0000]
#### 複習用
>:::spoiler **文章目錄**
>[TOC]
>:::
## 開始解題
### 💡==第一題== (JPA506)
### <font color=#984B4B>三維陣列元素之和</font>
>使用 **陣列宣告+for迴圈用運**
#### 陣列宣告
>一維陣列
```java=1
int []A=new int[4];//陣列標準寫法 (記憶體空間[長度]為4)
int []A={1,2,3,4}; //指定初始值寫法
A[0]=1;
A[1]=2;
A[2]=3;
A[3]=4;
```
>二維陣列
```java=1
int [][]A=new int[4][2];//陣列標準寫法 (記憶體空間[長度]為4、[寬度]為2)
int [][]A={{1,2},{3,4},{5,6},{7,8}}; //指定初始值寫法
A[0][0]=1; A[0][1]=2;
A[1][0]=3; A[1][1]=4;
A[2][0]=5; A[2][1]=6;
A[3][0]=7; A[3][1]=8;
```
>三維陣列
```java
//陣列標準寫法 (記憶體空間[長度]為4、[寬度]為2、[高度]為3)
int [][][]A=new int[4][2][3];
//指定初始值寫法
int [][][]A={ { {1,2,3},{4,5,6} },{ {7,8,9},{10,11,12} },{ {13,14,15},{16,17,18} },{ {19,20,21},{22,23,24} } };
A[0][0][0]=1; A[0][0][1]=2; A[0][0][2]=3;
A[0][1][0]=4; A[0][1][1]=5; A[0][1][2]=6;
A[1][0][0]=7; A[1][0][1]=8; A[1][0][2]=9;
A[1][1][0]=10; A[1][1][1]=11; A[1][1][2]=12;
A[2][0][0]=13; A[2][0][1]=14; A[2][0][2]=15;
A[2][1][0]=16; A[2][1][1]=17; A[2][1][2]=18;
A[3][0][0]=19; A[3][0][1]=20; A[3][0][2]=21;
A[3][1][0]=22; A[3][1][1]=23; A[3][1][2]=24;
```
>**結論**[color=#EA0000]
以 ==二維陣列== 為例
如果是 **指定初始值寫法**
可以這樣看
```java=1
// 00 01 10 11 20 21 30 31
int [][]A={{1,2},{3,4},{5,6},{7,8}};
```
如果 **從後面往前看** (算括號)
```java=1
int [][]A=new int[4][2]
//[2]後面 代表 {}最裡面 個數
//[4]前面 代表 {}最外面 個數
int [][]A={ {1,2},{3,4},{5,6},{7,8} };
// 1 2 1 2 1 2 1 2
// 1 2 3 4
```
>由此可知,==最後一個維度== 即為 =={ }最內部的值==[color=#EA0000]
---
### 📌==題目==

**:paperclip: 解答:**
```java
public class JPA051
{
public static void main(String[] argv)
{
int sum =0;//宣告一個整數,計算總和
int A[][][] = {{{1,2,3},{4,5,6}}, //宣告一個三維陣列(4*2*3)
{{7,8,9},{10,11,12}}, //並指定初值,共24個元素
{{13,14,15},{16,17,18}}, //指定值宣告要記得三個{}(最外層再一個{})
{{19,20,21},{22,23,24}}};
// A[0][0][0]=1;
// A[0][0][1]=2;
//...
//A[3][1][2]=24;
//A[4][2][3] 不存在(超出存取範圍) outofbound
//搭配3層for loop存取整個陣列
for(int i=0;i<A.length;i++) //4 A.length第一個維度
{
for(int j=0;j<A[i].length;j++) //2 A[i].length第二個維度
{
for(int k=0;k<A[i][j].length;k++) //3
{ //A[i][j].length第三個維度
sum+=A[i][j][k]; //累加
}
}
}
System.out.printf("sum = %d\n", sum);
}
}
```
:::spoiler **速解**
```java=1
public class JPA05
{
public static void main(String args[])
{
//注意別變成 int [4][2][3]A 指定空間!!!
int [][][]A={{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}},{{13,14,15},{16,17,18}},{{19,20,21},{22,23,24}}};
int sum=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<3;k++)
{
sum+=A[i][j][k];
}
}
}
System.out.println("sum = "+sum);
}
}
```
:::
---
### 💡==第二題== (JPA507)
### <font color=#984B4B>停車費用計算</font>
>使用 **???**
#### [改寫:](https://happyplayblogs.blogspot.com/2015/05/tqc-java6-507.html)
##### 原先
```java=1
for(int i=0;i<3;i++)
{
if(hours<=(hourTable[i+1]-hourTable[i]))
{
fee+=hours*feeTable[i];
hours=0;
}
else
{
fee+=(hourTable[i+1]-hourTable[i])*feeTable[i];
hours-=hourTable[i+1]-hourTable[i];
}
}
fee+=hours*feeTable[3];
```
##### 簡寫
```java=1
for(int i=3;i>=0;i--)
{
if(hours>hourTable[i])
{
fee+=(hours-hourTable[i])*feeTable[i];
hours=hourTable[i];
}
}
```
---
### 📌==題目==

:paperclip: **原先解答:**
```java
public class JPA051
{
public static void main(String[] argv)
{
int hours = 0; //停車時數
hours = 2; //2*30
park(hours);
System.out.println("--------------------");
hours = 3; //2*30+1*50
park(hours);
System.out.println("--------------------");
hours = 5; //2*30+2*50+1*80
park(hours);
System.out.println("--------------------");
hours = 8;
park(hours);
}
public static void park(int hours)
{
int[] hourTable = {0, 2, 4, 6}; // 時段(不同的區間)
int[] feeTable = {30, 50, 80, 100}; // 時段費率
System.out.println("停車時數:"+hours+"小時");
int fee = 0; //停車費用 (用來計算費用)
for(int i=0;i<3;i++)
{
if(hours<=(hourTable[i+1]-hourTable[i]))
{
fee+=hours*feeTable[i];
hours=0;
}
else
{
fee+=(hourTable[i+1]-hourTable[i])*feeTable[i];
hours-=hourTable[i+1]-hourTable[i];
}
}
fee+=hours*feeTable[3];
System.out.println("應繳費用:" + fee + "元整");
}
}
```
:::spoiler **速解、簡寫解答**
```java
public class JPA051
{
public static void main(String[] argv)
{
int hours = 0; //停車時數
hours = 2; //2*30
park(hours);
System.out.println("--------------------");
hours = 3; //2*30+1*50
park(hours);
System.out.println("--------------------");
hours = 5; //2*30+2*50+1*80
park(hours);
System.out.println("--------------------");
hours = 8;
park(hours);
}
public static void park(int hours)
{
int[] hourTable = {0, 2, 4, 6}; // 時段(不同的區間)
int[] feeTable = {30, 50, 80, 100}; // 時段費率
System.out.println("停車時數:"+hours+"小時");
int fee = 0; //停車費用 (用來計算費用)
for(int i=3;i>=0;i--)
{
if (hours>hourTable[i])
{
fee+=(hours-hourTable[i])*feeTable[i];
hours=hourTable[i];
}
}
System.out.println("應繳費用:" + fee + "元整");
}
}
```
:::
---
### 第三題(JPA508)-泡沫排序法(泡泡排序法)[使用]:
#### [泡沫排序法](https://ced425.pixnet.net/blog/post/3252509)
兩兩相比,**較大的數往右移動**
* **左右**左右**比較完一輪**(左小右大)
##### 舉例:
未排序資料 24357691 **[八個元素,需要7輪(n、n-1輪)]**
第一輪:23456719 (4、3 Swap)(7、6 Swap)(9、1 Swap)
第二輪:23456179 (7、1 Swap)
第三輪:23451679 (6、1 Swap)
第四輪:23415679 (5、1 Swap)
第五輪:23145679 (4、1 Swap)
第六輪:21345679 (3、1 Swap)
第七輪:12345679 (2、1 Swap)
未排序資料 857193246 **[九個元素,需要8輪]**
第一輪:571832469
(8、5 Swap)(8、7 Swap)(8、1 Swap)(9、3 Swap)(9、2 Swap)(9、4 Swap)(9、6 Swap)
第二輪:517324689 (7、1 Swap)(8、3 Swap)(8、2 Swap)(8、6 Swap)(8、6 Swap)
第三輪:153246789 (5、1 Swap)(7、3 Swap)(7、2 Swap)(7、4 Swap)(7、6 Swap)
第四輪:132456789 (5、3 Swap)(5、2 Swap)(5、4 Swap)
第五輪:123456789 (3、2 Swap)
第六輪:123456789
第七輪:123456789
第八輪:123456789

解答:
```java
public class JPA051
{
public static void main(String[] argv)
{
int[] data = {2, 4, 3, 5, 7, 6, 9, 1}; // 為排序的資料
int Temp=0;
//泡泡排序法 兩兩相比,大的泡泡往上浮(較大的數往右移動)
for(int i=0;i<data.length-1;i++) //7 //代表第幾輪
{ //8個值共7輪
for(int j=0;j<data.length-1-i;j++) //7
{
if(data[j]>data[j+1]) //一輪比較7次
{
Temp=data[j];
data[j]=data[j+1]; //兩個元素交換
data[j+1]=Temp; //SWAP,標準寫法
}
}
//交換完一次,列印一輪
for(int k=0;k<data.length;k++)
{ //列印整個陣列,每一輪皆作列印的動作
System.out.print(data[k] );
}
System.out.printf("\n");
}
}
}
```
---
:::spoiler 最後更新日期
>==第一版==[time=2021 6 17 , 1:45 AM][color=#786ff7]
>第二版[time=2021 9 6 , 7:23 PM][color=#ce770c]
>**最後版[time=2021 9 16 , 3:57 PM]**[color=#EA0000]
:::
###### tags: `JAVA課堂學習` `複習用` `高科大`