---
# System prepended metadata

title: Java第14週
tags: [複習用, JAVA課堂學習, 高科大]

---

# 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]


---

### 📌==題目==
![](https://i.imgur.com/XNce2w1.png)
**: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];
    }           
}    
```

---

### 📌==題目==
![](https://i.imgur.com/DOg3iG2.png)
: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

![](https://i.imgur.com/Mxx8T99.png)
解答:
```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課堂學習` `複習用` `高科大`