---
# System prepended metadata

title: Java 程式設計課程

---

# Java 程式設計課程

**目錄**:
[TOC]

## CH0
### Hello Java!
```java=
public class A0
{
	public static void main(String A[])
	{
		System.out.println("Hello Java!");
	}
}
```
Output

    Hello Java!

## CH1 
### 資料型態

* 基本資料型態


| 資料型態|名稱| 記憶體| 資料型態|名稱| 記憶體|
| -------- | -------- | -------- |-------- | -------- | -------- |
| 字元 |char|2 |浮點數 |float|4 |
| 整數|byte|1  |浮點數|double|8 |
| 整數|short|2 |布林 |boolean|1 |
| 整數|int|4 |
| 整數|long|8|

* 參考資料型態

| 資料型態|名稱|
| -------- | -------- |
|字串|String|
|陣列|Array|
|物件|Object|

```java=
public class A1_1
{
	public static void main(String A[])
	{
		char c1='Z',c2=97;    //字元
		System.out.println("c1="+c1+" c2="+c2);
		int i1=5,i2='A',i3=(int)2.5;    //整數
		System.out.println("i1="+i1+" i2="+i2+" i3="+i3);
		float f1=5,f2='W',f3=2.5f;    //浮點數
		System.out.println("f1="+f1+" f2="+f2+" f3="+f3);
		double d1=2.5,d2='a',d3=5;    //浮點數
		System.out.println("d1="+d1+" d2="+d2+" d3="+d3);
		boolean b1=true,b2=false;    //布林
		System.out.println("b1="+b1+" b2="+b2);
	}
}
```
Output

    c1=Z c2=a
    i1=5 i2=65 i3=2
    f1=5.0 f2=87.0 f3=2.5
    d1=2.5 d2=97.0 d3=5.0
    b1=true b2=false

### 溢位事件



|資料型態|範圍 |
| -------- | -------- |
|byte|-128 ~ 127|
|short|-32768 ~ 32767|
|int|-2147483648 ~2147483647|
|long|-9223372036854775808 ~9223372036854775807|

```java=
import java.lang.*;
public class A1_2
{
	public static void main (String A[])
	{
		int imax = java.lang.Integer.MAX_VALUE;
		int imin = java.lang.Integer.MIN_VALUE;
		System.out.println("imin="+imin+" imax="+imax);
		System.out.println("溢位發生，imin-1="+(imin-1)+" imax+1="+(imax+1));		//int+int -->int
		System.out.println("錯誤處理，(long)imin-1="+(long)(imin-1)+" (long)imax+1="+(long)(imax+1));	//int+int -->(long)int
		System.out.println("正確處理，((long)imin-1)="+((long)imin-1)+" ((long)imax+1)="+((long)imax+1));	//(long)int+int -->long
	}
}
```
Output

    imin=-2147483648 imax=2147483647
    溢位發生，imin-1=2147483647 imax+1=-2147483648
    錯誤處理，(long)imin-1=2147483647 (long)imax+1=-2147483648
    正確處理，((long)imin-1)=-2147483649 ((long)imax+1)=2147483648

## CH2
### 基本輸入、輸出

    輸入:
        String 變數名稱=br.readLine();    //輸入訊息存入變數(字串型態)
    輸出:
        System.out.print("字串");    //輸出後不換行
        System.out.println("字串");    //輸出後換行
```java= 
import java.io.*;
public class A2_1
{
	public static void main (String A[])throws IOException //丟擲異常
	{
		InputStreamReader isr=new InputStreamReader(System.in);    //是位元組流通向字元流的橋樑
		BufferedReader br=new BufferedReader(isr);                //緩衝區
		
		System.out.print("1.請輸入姓名: ");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績: ");
		String s1=br.readLine();
		System.out.print("3.請輸入英文成績: ");
		String s2=br.readLine();
		System.out.print("4.請輸入數學成績: ");
		String s3=br.readLine();
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ (Integer.parseInt(s1)+Integer.parseInt(s2)+Integer.parseInt(s3)));    //將s1，s2，s3(String)強制轉型成整數(int)型態
		System.out.println("平均:"+ (Integer.parseInt(s1)+Integer.parseInt(s2)+Integer.parseInt(s3))/3);
	}
}
```
Output

    1.請輸入姓名: Lin
    2.請輸入國文成績: 90
    3.請輸入英文成績: 80
    4.請輸入數學成績: 70
    -------------------------
    姓名:Lin
    國文:90
    英文:80
    數學:70
    總分:240
    平均:80


### 加、減法運算
* 四則運算:

| 四則運算 | 算數運算子 |
| -------- | ---------- |
| 加法     | +          |
| 減法     | -          |
| 乘法     | *          |
| 除法     | /          |
| 取餘數   | %          |


```java=
import java.io.*;
public class A2_2
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入a: ");
		String s1=br.readLine();
		int a=Integer.parseInt(s1);    //將s1強制轉型成整數(int)後，存入變數a
		System.out.print("2.請輸入b: ");
		String s2=br.readLine();    
		int b=Integer.parseInt(s2);    //將s2強制轉型成整數(int)後，存入變數b
		
		System.out.println("a++="+(a++)+" a="+a);    //a++ 是先輸出後+1
		System.out.println("++b="+(++b)+" b="+b);    //++b 是先+1後輸出
		
		System.out.println("a+=b:"+(a+=b)+" a="+a+" b="+b);		//a=a+b
		System.out.println("a+=b--:"+(a+=b--)+" a="+a+" b="+b);		//a=a+b，b=b-1
		System.out.println("a+=--b:"+(a+=--b)+" a="+a+" b="+b);		//b=b-1，a=+1
	}
}		

```

Output

    1.請輸入a: 1
    2.請輸入b: 1
    a++=1 a=2
    ++b=2 b=2
    a+=b:4 a=4 b=2
    a+=b--:6 a=6 b=1
    a+=--b:6 a=6 b=0


### [練習]:成績計算
    輸入說明:
        依序輸入姓名、國文成績、英文成績、數學成績
    輸出說明:
        輸出三科成績並計算出該生的總分和平均
```java=
import java.io.*;
public class A2_3
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入姓名:");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績:");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("3.請輸入英文成績:");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		System.out.print("4.請輸入數學成績");
		String s3=br.readLine();
		int n3=Integer.parseInt(s3);
		int sum=n1+n2+n3;       //計算總分
		double avg=(n1+n2+n3)/3.0;    //計算平均  int+double --> double
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ sum);
		System.out.println("平均"+ avg);
        }
}
```
Output

    1.請輸入姓名:Lin
    2.請輸入國文成績:90
    3.請輸入英文成績:80
    4.請輸入數學成績70
    -------------------------
    姓名:Lin
    國文:90
    英文:80
    數學:70
    總分:240
    平均80.0


## CH3 
### if 語法
    if(判斷條件){
        條件成立時，執行內容
    }
    if(判斷條件){
        條件成立時，執行內容
    }
        .
        .
        .
    if(判斷條件){
        條件成立時，執行內容
    }
        
```java=
import java.io.*;
public class A3_1
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入姓名:");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績:");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("3.請輸入英文成績:");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		System.out.print("4.請輸入數學成績");
		String s3=br.readLine();
		int n3=Integer.parseInt(s3);
		int sum=n1+n2+n3;
		double avg=(n1+n2+n3)/3.0;
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ sum);
		System.out.println("平均"+ avg);
         //if 語法
		if(avg>100)
			System.out.println("輸入錯誤!平均不可大於100");
		if(avg>=90 && avg<=100)
			System.out.println("成績等級:A");
		if(avg>=80 && avg<90)
			System.out.println("成績等級:B");
		if(avg>=70 && avg<80)
			System.out.println("成績等級:C");
		if(avg>=60 && avg<70)
			System.out.println("成績等級:D");
		if(avg>=0 && avg<60)
			System.out.println("成績等級:E");
		if(avg<0)
			System.out.println("輸入錯誤!平均不可小於0");
        }
}
```

### if - else 語法
    if(判斷條件){
        條件成立時，執行內容
    }
    else if(判斷條件){
        條件成立時，執行內容
    }
        .
        .
        .
    else{
        以上條件皆不成立時，執行內容
    }
    
```java=
import java.io.*;
public class A3_2
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入姓名:");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績:");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("3.請輸入英文成績:");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		System.out.print("4.請輸入數學成績");
		String s3=br.readLine();
		int n3=Integer.parseInt(s3);
		int sum=n1+n2+n3;
		double avg=(n1+n2+n3)/3.0;
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ sum);
		System.out.println("平均"+ avg);
        //if else 語法
		if(avg>100)
			System.out.println("輸入錯誤!平均不可大於100");
		else if(avg>=90 && avg<=100)
			System.out.println("成績等級:A");
		else if(avg>=80)
			System.out.println("成績等級:B");
		else if(avg>=70)
			System.out.println("成績等級:C");
		else if(avg>=60)
			System.out.println("成績等級:D");
		else if(avg>=0)
			System.out.println("成績等級:E");
		else
			System.out.println("輸入錯誤!平均不可小於0");
        }
}
```

### switch case 語法
    switch(變數名稱或運算式){
        case 符合數字或字元:
            條件成立時，執行內容
            break;
        case 符合數字或字元:
            條件成立時，執行內容
            break; 
            .
            .
            .
        default:
            以上條件皆不成立時，執行內容

```java=
import java.io.*;
public class A3_3
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入姓名:");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績:");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("3.請輸入英文成績:");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		System.out.print("4.請輸入數學成績");
		String s3=br.readLine();
		int n3=Integer.parseInt(s3);
		int sum=n1+n2+n3;
		double avg=(n1+n2+n3)/3.0;
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ sum);
		System.out.println("平均"+ avg);
        //switch case
               int level=(int)avg/10;
		switch(level){
			case 10:
				System.out.println("成績等級:A");
				break;
			case 9:
				System.out.println("成績等級:A");
				break;
			
			case 8:
				System.out.println("成績等級:B");
				break;
			case 7:
				System.out.println("成績等級:C");
				break;
			case 6:
				System.out.println("成績等級:D");
				break;
			default:
				if(avg>100)
					System.out.println("輸入錯誤!平均不可大於100");
				if(avg<0)
					System.out.println("輸入錯誤!平均不可小於0");
				if(avg<60 && avg>=0)
					System.out.println("成績等級:E");
				break;
			
		}
        }
}
```
        
### ? : 語法
    ((判斷條件) ? 成立時，執行內容 : 不成立時，執行內容);

```java=
import java.io.*;
public class A3_4
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入姓名:");
		String name=br.readLine();
		System.out.print("2.請輸入國文成績:");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("3.請輸入英文成績:");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		System.out.print("4.請輸入數學成績");
		String s3=br.readLine();
		int n3=Integer.parseInt(s3);
		int sum=n1+n2+n3;
		double avg=(n1+n2+n3)/3.0;
		System.out.println("-------------------------");
		System.out.println("姓名:"+ name);
		System.out.println("國文:"+ s1+"\n英文:"+ s2+"\n數學:"+ s3);
		System.out.println("總分:"+ sum);
		System.out.println("平均"+ avg);
        //?:
		System.out.println((avg>100)?"輸入錯誤!平均不可大於100":(avg>=90 && avg<=100)?"成績等級:A":(avg>=80)?"成績等級:B":(avg>=70)?"成績等級:C":(avg>=60)?"成績等級:D":(avg>=0)?"成績等級:E":"輸入錯誤!平均不可小於0");
        }
}
```
Output

    範例一:
        1.請輸入姓名:Lin
        2.請輸入國文成績:80
        3.請輸入英文成績:70
        4.請輸入數學成績60
        -------------------------
        姓名:Lin
        國文:80
        英文:70
        數學:60
        總分:210
        平均70.0
        成績等級:C
        
    範例二:
        1.請輸入姓名:Tom
        2.請輸入國文成績:150
        3.請輸入英文成績:150
        4.請輸入數學成績150
        -------------------------
        姓名:Tom
        國文:150
        英文:150
        數學:150
        總分:450
        平均150.0
        輸入錯誤!平均不可大於100



## CH4
### for 迴圈
**單層for迴圈**

    for(初始變數; 判斷式; 遞增式) {
        條件成立時，執行內容
    }
    
```java=
public class A4_1
{
	public static void main (String A[])
	{
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.println("*");
		
		int i;
		for(i=1;i<=6;i++)
		{
			System.out.print(i+" ");
		}
		System.out.println("\nfor迴圈中斷時，i="+i);
	}
}
```

**雙層for迴圈**

    for(初始變數; 判斷式; 遞增式) {
        for(初始變數; 判斷式; 遞增式) {
            條件成立時，執行內容
        }
    }
    
```java=
public class A4_2
{
	public static void main (String A[])
	{
		for(int i=1;i<=6;i++)
		{
			for(int j=1;j<=i;j++)
			{
				System.out.print("*");
			}
			System.out.print("\n");
		}
	}
}
```
### [練習]:薪資計算
    輸入說明:
        輸入時薪、工作天數和每日工作時數
    輸出說明:
        輸出當日薪資、總工時和總薪資
```java=
import java.io.*;
public class A4_3
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入時薪:");
		String s1=br.readLine();
		int 時薪=Integer.parseInt(s1);
		System.out.print("2.請輸入天數:");
		String s2=br.readLine();
		int 天數=Integer.parseInt(s2);
		int 總薪資=0,總工時=0;
		for(int i=1;i<=天數;i++)
		{
			System.out.print("3.請輸入第"+i+"天時數:");
			String s3=br.readLine();
			int 時數=Integer.parseInt(s3);
			int 當日薪資=時薪*時數;
			System.out.println("當日薪資:"+當日薪資);
			總薪資=總薪資+當日薪資;
			總工時=總工時+時數;
		}
		System.out.println("\n總工時:"+總工時+"  總薪資:"+總薪資);
	}
}
```
### while 迴圈
    while(判斷條件){
        條件成立時，執行內容
    }
```java=
import java.io.*;
public class A4_4
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入時薪:");
		String s1=br.readLine();
		int 時薪=Integer.parseInt(s1);
        //while
		while(時薪<=0)		
		{
			System.out.print("1.請輸入時薪:");
			s1=br.readLine();
			時薪=Integer.parseInt(s1);
		}
		System.out.print("2.請輸入天數:");
		String s2=br.readLine();
		int 天數=Integer.parseInt(s2);
         //while
		while (天數<=0){       
			System.out.print("2.請輸入天數:");
			s2=br.readLine();
			天數=Integer.parseInt(s2);
		}		
		int 總薪資=0,總工時=0;
		for(int i=1;i<=天數;i++)
		{
			System.out.print("3.請輸入第"+i+"天時數:");
			String s3=br.readLine();
			int 時數=Integer.parseInt(s3);
			int 當日薪資=時薪*時數;
			System.out.println("當日薪資:"+當日薪資);
			總薪資=總薪資+當日薪資;
			總工時=總工時+時數;
		}
		System.out.println("\n總工時:"+總工時+"  總薪資:"+總薪資);
	}
}
```


### do - while 迴圈
    do{
        條件成立時，執行內容
    }while(判斷條件);
    
    do-while 至少執行內容1次
```java=
import java.io.*;
public class A4_5
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		int 時薪;
	//do-while 迴圈
		do
		{
			System.out.print("1.請輸入時薪:");
			String s1=br.readLine();
			時薪=Integer.parseInt(s1);
		}while (時薪<=0);
		int 天數;
        //do-while 迴圈
		do
		{
			System.out.print("2.請輸入天數:");
			String s2=br.readLine();
			天數=Integer.parseInt(s2);
		}while (天數<=0);
		int 總薪資=0,總工時=0;
		for(int i=1;i<=天數;i++)
		{
			System.out.print("3.請輸入第"+i+"天時數:");
			String s3=br.readLine();
			int 時數=Integer.parseInt(s3);
			int 當日薪資=時薪*時數;
			System.out.println("當日薪資:"+當日薪資);
			總薪資=總薪資+當日薪資;
			總工時=總工時+時數;
		}
		System.out.println("\n總工時:"+總工時+"  總薪資:"+總薪資);
	}
}
```
Output

    1.請輸入時薪:168
    2.請輸入天數:3
    3.請輸入第1天時數:8
    當日薪資:1344
    3.請輸入第2天時數:10
    當日薪資:1680
    3.請輸入第3天時數:6
    當日薪資:1008

    總工時:24  總薪資:4032


### [練習]:區間內2和3的倍數
    說明:
        for 迴圈、while 迴圈、do-while 迴圈 三種作法
```java=
import java.io.*;
public class A4_6
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("1.請輸入起始值:");
		String s1=br.readLine();
		int start=Integer.parseInt(s1);
		while(start<0)
		{
			System.out.print("1.請輸入起始值:");
			s1=br.readLine();
			start=Integer.parseInt(s1);
		}
		int end;
		do
		{
			System.out.print("2.請輸入終止值:");
			String s2=br.readLine();
			end=Integer.parseInt(s2);
		}while(end<0);
		
		
		int sum=0,t=0;
		
		
		//for 迴圈
		for(int i=start;i<=end;i++)
		{
			if((i%2==0)||(i%3==0))
			{
				System.out.print(i+"  ");
				sum=sum+i;
				t=t+1;
			}
		}
		
		System.out.println("\n------------");
		System.out.println("2和3倍數的個數:"+t);
		System.out.println("2和3倍數的總和:"+sum);		
		
		
		
		//while 迴圈
		int i=start;sum=0;t=0;
		while(i<=end)
		{
			if((i%2==0)||(i%3==0))
			{
				System.out.print(i+"  ");
				sum=sum+i;
				t=t+1;
			}
			i=i+1;
		}
		System.out.println("\n------------");
		System.out.println("2和3倍數的個數:"+t);
		System.out.println("2和3倍數的總和:"+sum);	
		
		
		
		
		//do while 迴圈
		i=start;sum=0;t=0;
		do
		{
			if((i%2==0)||(i%3==0))
			{
				System.out.print(i+"  ");
				sum=sum+i;
				t=t+1;
			}
			i=i+1;
		}while(i<=end);
		System.out.println("\n------------");
		System.out.println("2和3倍數的個數:"+t);
		System.out.println("2和3倍數的總和:"+sum);	
		
	}
	
}
```
Output

    1.請輸入起始值:1
    2.請輸入終止值:50
    2  3  4  6  8  9  10  12  14  15  16  18  20  21  22  24  26  27  28  30  32  33  34  36  38  39  40  42  44  45  46  48  50
    ------------
    2和3倍數的個數:33
    2和3倍數的總和:842
    
### [練習]:猜數字遊戲
    遊戲介紹:
        根據提示輸入1~10間的整數，並成功猜出數字
        
    [補充]:
        隨機亂數產生
        Math.random():隨機產生 0 ~ 1 間的數值 (不等於1)
        int 變數名稱=(int)(Math.random()*最大值+最小值)
```java=
import java.io.*;
public class A4_7
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		int p=(int)(Math.random()*10+1),i=0;
		System.out.println(p);
		//while 迴圈
		while(i!=p){
			
			//System.out.println((p<=5)?"[提示]:電腦出的數字小於6":"[提示]:電腦出的數字大於5");
			
			if(p<=5)
				System.out.println("[提示]:電腦出的數字小於6");
			else
				System.out.println("[提示]:電腦出的數字大於5");
			
			System.out.print("請輸入一個數: ");
			String s=br.readLine();
			i=Integer.parseInt(s);
			
			if(i!=p)
				System.out.println("沒猜到喔!猜到對才能閃人");
			else{
				System.out.println("恭喜猜對喔!");
			}
		}

		//do-while 迴圈
		do{
			if(p<=5)
				System.out.println("[提示]:電腦出的數字小於6");
			else
				System.out.println("[提示]:電腦出的數字大於5");
			System.out.print("請輸入一個數: ");
			String s=br.readLine();
			i=Integer.parseInt(s);
			if(i!=p)
				System.out.println("沒猜到喔!猜到對才能閃人");
			else{
				System.out.println("恭喜猜對喔!");
				break;
			}
		}while(true);
		
	}
}		
```

Output

    [提示]:電腦出的數字小於6
    請輸入一個數: 2
    沒猜到喔!猜到對才能閃人
    [提示]:電腦出的數字小於6
    請輸入一個數: 5
    沒猜到喔!猜到對才能閃人
    [提示]:電腦出的數字小於6
    請輸入一個數: 4
    沒猜到喔!猜到對才能閃人
    [提示]:電腦出的數字小於6
    請輸入一個數: 3
    沒猜到喔!猜到對才能閃人
    [提示]:電腦出的數字小於6
    請輸入一個數: 1
    恭喜猜對喔!

### [練習]:隨機四則運算
     輸入說明:
         輸入算術運算子和兩數值
    輸出說明:
        輸出算是運算後的結果
        (若輸入算術運算子非加、減、乘、除，則輸出 "是未知的運算子" )
```java=
import java.io.*;
public class A4_8
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		System.out.print("請輸入算術運算子: ");
		String oper=br.readLine();
		System.out.print("請輸入n1: ");
		String s1=br.readLine();
		int n1=Integer.parseInt(s1);
		System.out.print("請輸入n2: ");
		String s2=br.readLine();
		int n2=Integer.parseInt(s2);
		
		switch(oper){
			case "+":
				System.out.println(n1+"+"+n2+"="+(n1+n2));
				break;
			case "-":
				System.out.println(n1+"-"+n2+"="+(n1-n2));
				break;
			case "*":
				System.out.println(n1+"*"+n2+"="+(n1*n2));
				break;
			case "/":
				System.out.println(n1+"/"+n2+"="+(n1/n2));
				break;
			default:
				System.out.print(oper+"是未知的運算子");
		}
		System.out.print("程式結束");
	}
}
```
Output

    請輸入算術運算子: *
    請輸入n1: 4
    請輸入n2: 25
    4*25=100
    程式結束
### [練習]:九九乘法表
```java=
import java.io.*;
public class A4_9
{
	public static void main (String A[])
	{
		//for 迴圈
		for(int i=1;i<=9;i++){
			for(int j=1;j<=9;j++){
				System.out.print(i + "*"+j+"="+(i*j)+"\t");
			}
			System.out.print("\n");
		}
		
		
		
		int i=1,j=1;
		System.out.print("\n");
		
		//while 迴圈
		while(i<=9){
			j=1;
			while(j<=9){
				System.out.print(i + "*"+j+"="+(i*j)+"\t");
				j=j+1;
			}
			System.out.print("\n");
			i=i+1;
		}
		System.out.print("\n");
		
		//do while 迴圈
		i=1;j=1;
		do{
			j=1;
			do{
				System.out.print(i + "*"+j+"="+(i*j)+"\t");
				j=j+1;
			}while(j<=9);
			System.out.print("\n");
			i=i+1;
		}while(i<=9);
		
	}
}
```
Output

    1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   1*6=6   1*7=7   1*8=8   1*9=9
    2*1=2   2*2=4   2*3=6   2*4=8   2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
    3*1=3   3*2=6   3*3=9   3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
    4*1=4   4*2=8   4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
    5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
    6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  6*7=42  6*8=48  6*9=54
    7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  7*8=56  7*9=63
    8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
    9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81
(重複三次)

### [練習]:四則運算闖關遊戲
    規則介紹:
        遊戲順序:加法 -> 減法 -> 乘法 ->除法
        每種運算有三次作答機會，答對晉級
        答錯一、二次可繼續作答
        答錯三次則退回上一關(加法直到答對才晉級)
        除法運算答對即可過關
```java=
import java.io.*;
public class A4_10
{
	public static void main (String A[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		int n1,n2,usr;
		int b=1;
		int a=1;
		int i=1;
		int level=1;
		while(level!=5){
			n1=(int)(Math.random()*10+1);
			n2=(int)(Math.random()*10+1);
			
			switch (level){
				//加法
				case 1:
					System.out.print("第"+a+"題: "+n1+"+"+n2+"=");
					String s=br.readLine();
					usr=Integer.parseInt(s);
					if(usr==n1+n2){
						System.out.println("恭喜答對! 晉級[減法運算]!");
						level=level+1;
						i=1;
					}
					else{
						System.out.println("抱歉答錯!");
					}
					a++;
					break;
				
				//減法
				case 2:
					System.out.print("第"+a+"題: "+n1+"-"+n2+"=");
					s=br.readLine();
					usr=Integer.parseInt(s);
					if(usr==n1-n2){
						System.out.println("恭喜答對! 晉級[乘法運算]!");
						level=level+1;
						i=1;
					}
					else{
						if(i<3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[加法運算]! 剩"+(3-i)+"次");
							i=i+1;
						}	
						else if(i>=3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[加法運算]!");
							level=1;
							i=1;
						}
						
					}
					a++;
					break;
					
				//乘法
				case 3:
					System.out.print("第"+a+"題: "+n1+"*"+n2+"=");
					s=br.readLine();
					usr=Integer.parseInt(s);
					if(usr==n1*n2){
						System.out.println("恭喜答對!");
						level=level+1;
						i=1;
					}
					else{
						if(i<3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[減法運算]! 剩"+(3-i)+"次");
							i=i+1;
						}
						else if(i>=3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[減法運算]!");
							level=2;
							i=1;
						}

					}
					a++;
					break;
				
				//除法
				case 4:
					System.out.print("第"+a+"題: "+n1+"/"+n2+"=");
					s=br.readLine();
					usr=Integer.parseInt(s);
					if(usr==n1/n2){
						System.out.println("恭喜全數答對!");
						level=level+1;
						i=1;
					}
					else{
						if(i<3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[乘法運算]! 剩"+(3-i)+"次");
							i=i+1;
						}
							
						else if(i>=3){
							System.out.println("抱歉答錯! 答錯"+i+"次  要回到[乘法運算]!");
							level=3;
							i=1;
						}
					}
					a++;
					break;
			}
		}
	}
}
```
Output

    第1題: 6+10=11
    抱歉答錯!
    第2題: 7+1=8
    恭喜答對! 晉級[減法運算]!
    第3題: 7-7=1
    抱歉答錯! 答錯1次  要回到[加法運算]! 剩2次
    第4題: 8-4=4
    恭喜答對! 晉級[乘法運算]!
    第5題: 5*1=6
    抱歉答錯! 答錯1次  要回到[減法運算]! 剩2次
    第6題: 4*7=28
    恭喜答對!
    第7題: 9/9=2
    抱歉答錯! 答錯1次  要回到[乘法運算]! 剩2次
    第8題: 8/2=2
    抱歉答錯! 答錯2次  要回到[乘法運算]! 剩1次
    第9題: 4/9=2
    抱歉答錯! 答錯3次  要回到[乘法運算]!
    第10題: 5*7=35
    恭喜答對!
    第11題: 10/8=1
    恭喜全數答對!


## CH5
### 一維陣列 宣告
    一維陣列宣告:
        int A[];
	    A=new int [儲存空間個數];
        
        int A[]=new int [儲存空間個數];  <--簡化
        
        int B[]={儲存數值};    //直接存數值進陣列中
        
```java=
import java.io.*;
public class A5_1
{
    public static void main (String a[]){
        int A[];
		A=new int [5];
		//int A[]=new int [5]; 簡化
		A[0]=10;
		A[1]=0;
		A[2]=20;
		A[3]=0;
		A[4]=30;
		System.out.println("A[]陣列記憶體大小:"+A.length);
		for(int i=0;i<5;i++){
			System.out.println("A["+i+"]= "+A[i]);
		}
    }
}
```    
Output

    A[]陣列記憶體大小:5
    A[0]= 10
    A[1]= 0
    A[2]= 20
    A[3]= 0
    A[4]= 30

### 一維陣列 運算
```java=
import java.io.*;
public class A5_2
{
	public static void main (String a[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
               int B[]=new int[5];
		int sum=0;
		for(int i=0;i<5;i++){
		System.out.print("請輸入B["+i+"]"+"數值: ");
		String s=br.readLine();
		B[i]=Integer.parseInt(s);
		}
		
		for(int i=0;i<5;i++){
			System.out.println("B["+i+"]= "+B[i]);
			sum=sum+B[i];
		}
		System.out.println("B[]陣列數值總和= "+sum);
        }
}
```
Output

    請輸入B[0]數值: 11
    請輸入B[1]數值: 13
    請輸入B[2]數值: 15
    請輸入B[3]數值: 17
    請輸入B[4]數值: 19
    B[0]= 11
    B[1]= 13
    B[2]= 15
    B[3]= 17
    B[4]= 19
    B[]陣列數值總和= 75


### [練習]:終極密碼
    遊戲介紹:
        電腦隨機產生1~100中的任意數字為答案，玩家答錯繼續，答對離開
```java=
import java.io.*;
public class A5_3
{
	public static void main (String a[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		int A[]={1,100};
		int p=(int)(Math.random()*100+1);
		int usr=0;
		System.out.println("[終極密碼]:電腦隨機產生1~100中的任意數字為答案，玩家答錯繼續，答對離開");
		while(usr!=p){
			System.out.print("請輸入大於"+A[0]+"小於"+A[1]+"的數字: ");
			String s=br.readLine();
			usr=Integer.parseInt(s);
			if(usr == p){
				System.out.println("答對啦! 答案就是"+p+"，真是好運啊!");
			}
			else if(usr<p && usr>A[0]){
				A[0]=usr;
				System.out.println("Sorry，沒猜到  範圍在:"+A[0]+"到"+A[1]);
			}
			else if(usr>p && usr<A[1]){
				A[1]=usr;
				System.out.println("Sorry，沒猜到  範圍在:"+A[0]+"到"+A[1]);
			}
			else{
				System.out.println("請重新輸入!!");
			}
		}
	}
}
```
Output

    [終極密碼]:電腦隨機產生1~100中的任意數字為答案，玩家答錯繼續，答對離開
    請輸入大於1小於100的數字: 50
    Sorry，沒猜到  範圍在:50到100
    請輸入大於50小於100的數字: 75
    Sorry，沒猜到  範圍在:75到100
    請輸入大於75小於100的數字: 85
    Sorry，沒猜到  範圍在:75到85
    請輸入大於75小於85的數字: 80
    答對啦! 答案就是80，真是好運啊!


### [練習]:猜樂透
    輸入說明:
        輸入樂透組數
    輸出說明:
        輸出隨機產生號碼，每組六個數(由小排到大、每組號碼不重複)
    
    [補充]:
        排序演算法:氣泡排序
            由小排到大
            int tmp;
            for(int i=0;i<陣列大小;i++){
		    for(int j=0;j<i;j++){
		        if(A[j]>A[i]){
			    tmp=A[i];
                        A[i]=A[j];
                        A[j]=tmp;
                    }
                }
            }
        
```java=
import java.io.*;
import java.util.*;
public class A5_4
{
	public static void main (String a[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		
		System.out.print("請輸入組數:");
		String s=br.readLine();
		int n=Integer.parseInt(s);
		int p=1;
		while (p<=n){
			int A[]=new int [6];
			for(int i=0;i<6;i++){
				A[i]=(int)(Math.random()*49+1);
				for(int j=0;j<i;j++){
					if(A[i]==A[j]){
						A[i]=(int)(Math.random()*49+1);
						j=0;
					}
				}
			}
			int tmp=0;
			for(int i=0;i<6;i++){
				for(int j=0;j<i;j++){
					if(A[j]>A[i]){
						tmp=A[i];
						A[i]=A[j];
						A[j]=tmp;
					}
				}
			}
			
			Arrays.sort(A);    //排序(由小到大)
			
			System.out.print("第"+p+"組: ");
			
			for(int i=0;i<6;i++){
				System.out.print(A[i]+"\t");
			}
			p=p+1;
			System.out.println();
		}
	}
}
```
Output

    請輸入組數:5
    第1組: 13       14      15      33      36      37
    第2組: 8        30      33      37      44      47
    第3組: 20       22      31      33      35      38
    第4組: 14       19      23      34      36      41
    第5組: 6        26      27      35      43      45

    
### 二微陣列 宣告
    二維陣列宣告:
    int A[列數][行數];
    A=new int [列儲存空間個數][行儲存空間個數];
    簡化 --> int A[][]=new int [列儲存空間個數][行儲存空間個數];
    
    int B[][]={第一列儲存數值,第二列儲存數值,...,第N列儲存數值};
    
```java=
import java.io.*;

public class A5_5
{
	public static void main (String a[])
    {
    int A[][]=new int[3][4];
		A[0][1]=100;
		A[1][2]=200;
		A[2][3]=300;
		System.out.println("A[][]陣列列數:"+3);
		for(int i=0;i<A.length;i++){
			System.out.print("第"+i+"列長度:"+4+"\t");
			for(int j=0;j<A[i].length;j++){
				System.out.print("A["+i+"]["+j+"]="+A[i][j]+"\t");
			}
			System.out.println();
		}
    }
}
```
Output

    A[][]陣列列數:3
    第0列長度:4     A[0][0]=0       A[0][1]=100     A[0][2]=0       A[0][3]=0
    第1列長度:4     A[1][0]=0       A[1][1]=0       A[1][2]=200     A[1][3]=0
    第2列長度:4     A[2][0]=0       A[2][1]=0       A[2][2]=0       A[2][3]=300

    

### 二維陣列 運算
```java=
import java.io.*;
import java.util.*;

public class A5_6
{
	public static void main (String a[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
        int sum=0;
		int B[][]={{99,44,33,66},{77,11},{22,88,55}};
		int max=B[0][0],min=B[0][0];
		System.out.println("B[][]陣列長度:"+B.length);
		for(int i=0;i<B.length;i++){
			System.out.print("第"+i+"列長度:"+B[i].length+"\t");
			for(int j=0;j<B[i].length;j++){
				System.out.print("B["+i+"]["+j+"]="+B[i][j]+"\t");
				sum=sum+B[i][j];
				if(B[i][j]>max){
					max=B[i][j];
				}
				if(B[i][j]<min){
					min=B[i][j];
				}
			}
			System.out.println();
		}
		
		System.out.println("\n陣列總和="+sum);
		
		for(int i=0;i<B.length;i++){
			for(int j=0;j<B[i].length;j++){
				if(B[i][j]==max)
					System.out.println("最大值="+max+"    陣列座標:B["+i+"]["+j+"]");
				if(B[i][j]==min)
					System.out.println("最小值="+min+"    陣列座標:B["+i+"]["+j+"]");
			}
		}
        }
}
```
Output

    B[][]陣列長度:3
    第0列長度:4     B[0][0]=99      B[0][1]=44      B[0][2]=33      B[0][3]=66
    第1列長度:2     B[1][0]=77      B[1][1]=11
    第2列長度:3     B[2][0]=22      B[2][1]=88      B[2][2]=55

    陣列總和=495
    最大值=99    陣列座標:B[0][0]
    最小值=11    陣列座標:B[1][1]

### 二維陣列 其他使用方式
    宣告多個一維陣列:
        int C[][]=new int [3][];
	    int c1[]={存入陣列數值};
		int c2[]={存入陣列數值};
		int c3[]={存入陣列數值};
		C[0]=c1;    //第0列數值為c1
		C[1]=c2;    //第1列數值為c2
		C[2]=c3;    //第2列數值為c3
        
```java=
import java.io.*;
import java.util.*;

public class A5_7
{
	public static void main (String a[])throws IOException
	{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
        int C[][]=new int [3][];
		int c1[]={11,22,33,44};
		int c2[]=new int [2];
		int c3[]={77,66,55};
		C[0]=c1;
		C[1]=c2;
		C[2]=c3;
		System.out.println("C[][]陣列長度:"+C.length);
		for(int i=0;i<C.length;i++){
			System.out.print("第"+i+"列長度:"+C[i].length+"\t");
			for(int j=0;j<C[i].length;j++){
				System.out.print("C["+i+"]["+j+"]="+C[i][j]+"\t");
			}
			System.out.println();
		}
		
		for(int i=0;i<C[2].length;i++){
			System.out.print(c3[i]+"\t");
		}
		System.out.println();
		for(int i=0;i<C[0].length;i++){
			System.out.print(c1[i]+"\t");
		}
		System.out.println();
		for(int i=0;i<C[1].length;i++){
			System.out.print(c2[i]+"\t");
		}
		System.out.println();
	}
}
```
Output
    
    C[][]陣列長度:3
    第0列長度:4     C[0][0]=11      C[0][1]=22         C[0][2]=33      C[0][3]=44
    第1列長度:2     C[1][0]=0       C[1][1]=0
    第2列長度:3     C[2][0]=77      C[2][1]=66      C[2][2]=55
    77      66      55
    11      22      33      44
    0       0
    
### [練習]:計算銷售員業績
    輸入說明:
        輸入五件產品價格和三位銷售員的銷售量
    輸出說明:
        輸出三位銷售員業績、達成比率和最佳銷售員
```java=
import java.io.*;
import java.util.*;

public class A5_8
{
	public static void main (String a[])throws IOException
	{
		 Scanner c= new Scanner(System.in);
		
		int max=0,Index=0;
		int A[]=new int[5];
		int B[][]=new int[3][5];
		int C[]=new int[3];
		System.out.print("產品價格:");
		int s;
		for(int i=0;i<A.length;i++){
			s=c.nextInt();
			A[i]=s;
		}
		for(int i=0;i<B.length;i++){
			System.out.print("銷售員"+(i+1)+"的銷售量:");
			for(int j=0;j<B[i].length;j++){
				s=c.nextInt();
				B[i][j]=s;
			}
		}
		
		
		for(int i=0;i<B.length;i++){
			for(int j=0;j<B[i].length;j++){
				C[i]=C[i]+(A[j]*B[i][j]);
			}
		}
		
		for(int i=0;i<B.length;i++){
			System.out.println("銷售員"+(i+1)+"的業績:"+C[i]+"，達成比率: "+((C[i]/10000.0)*100)+"%");
			if(C[i]>max){
				max=C[i];
				Index=i+1;
			}
		}
		System.out.println("最佳銷售員"+Index+"  總業績: "+max);
	}
}

```
Output

    產品價格:       10      20      40      30      20
    銷售員1的銷售量:100     200     100     200     110
    銷售員2的銷售量:200     100     100     200     100
    銷售員3的銷售量:100     200     200     100     200
    銷售員1的業績:17200，達成比率: 172.0%
    銷售員2的業績:16000，達成比率: 160.0%
    銷售員3的業績:20000，達成比率: 200.0%
    最佳銷售員3  總業績: 20000

## CH6
### 函數 - 變數使用


    方法屬性 回傳值型態  方法名稱(引數1,引數2...){
        程式敘述
        ……
        return 傳回值;
    }
**無回傳值**
```java=
public class A6_1
{
	public static void main (String a[])
	{
		star();
		Nstar(10);
		Dstar(15.5);
	}
	public static void star(){
		for(int i=1;i<=5;i++){
			System.out.print("*");
		}
		System.out.println();
	}
	public static void Nstar(int n){
		for(int i=1;i<=n;i++){
			System.out.print("*");
		}
		System.out.println("\n n="+n);
	}
	public static void Dstar(double n){
		for(int i=0;i<n;i++){
			System.out.print("*");
		}
		System.out.println("\n n="+n);
	}
}
```
Output

    *****
    **********
     n=10
    ****************
     n=15.5
    


**有回傳值**
```java=
public class A6_3
{
	public static void main (String a[])
	{
		System.out.println(Rstar(15,13.5));
		double result=Rstar(15,13.5);
		System.out.println(" result="+result);
	}
    public static double Rstar(int m,double n){
		for(int i=1;i<=m+n;i++){
			System.out.print("*");
		}
		System.out.println("\n m="+m+"  n="+n);
		return m+n;		//int+double --> double
	}
}
```
Output

    ****************************
     m=15  n=13.5
    28.5
    ****************************
     m=15  n=13.5
     result=28.5
     
     
### 函數 - 一維陣列使用

**無回傳值**
```java=
public class A6_4
{
	public static void main (String a[])
	{
		AddSum(5,3,8,12,6);
		int A[]={5,3,8,12,6,3,4,7,9};
		AddSumArray(A);
	}
    
        public static void AddSum(int n1,int n2,int n3,int n4,int n5){
		int sum=n1+n2+n3+n4+n5;
		System.out.println("n1="+n1);
		System.out.println("n2="+n2);
		System.out.println("n3="+n3);
		System.out.println("n4="+n4);
		System.out.println("n5="+n5);
		System.out.println("sum="+sum);
	}
	public static void AddSumArray(int A[]){
		int sum=0;
		System.out.println("A[]陣列記憶體空間:"+A.length+" 陣列位址:"+A);
		for(int i=0;i<A.length;i++){
			sum=sum+A[i];
			System.out.println("A["+i+"]="+A[i]);
		}
		System.out.println("sum="+sum);
	}
	
}
```
Output

    n1=5
    n2=3
    n3=8
    n4=12
    n5=6
    sum=34
    A[]陣列記憶體空間:9 陣列位址:[I@15db9742
    A[0]=5
    A[1]=3
    A[2]=8
    A[3]=12
    A[4]=6
    A[5]=3
    A[6]=4
    A[7]=7
    A[8]=9
    sum=57

**有回傳值**
```java=
public class A6_5
{
	public static void main (String a[])
	{
		int A[]={5,3,8,12,6,3,4,7,9};
		int B[]=AddNReturn(A,100);
		System.out.println("B[]陣列位址:"+B);	//輸出位址	
		printOne(B,"B");
		System.out.println("B[]陣列位址:"+AddNReturn(A,100));	//輸出位址	
		
	}
	public static int[] Astar(int m,double n){
		for(int i=0;i<m+n;i++){
			System.out.print("*");
		}
		System.out.println("\n m="+m+"  n="+n);
		int A[]={m,(int)n};
		return A;
	}
	public static void printOne(int A[],String name){
		for(int i=0;i<A.length;i++){
			System.out.println(name+"["+i+"]="+A[i]);
		}
	} 
	public static int[] AddNReturn(int A[],int N){
		for(int i=0;i<A.length;i++){
			A[i]=A[i]+N;
		}
		return A;
	}
}
```
Output

    B[]陣列位址:[I@15db9742
    B[0]=105
    B[1]=103
    B[2]=108
    B[3]=112
    B[4]=106
    B[5]=103
    B[6]=104
    B[7]=107
    B[8]=109
    B[]陣列位址:[I@15db9742


### 函數 - 二維陣列使用
```java=
public class A6_7
{
	public static void main (String a[])
	{
		int A[][]={{11,22,33,44},{55,66},{77,88,99}};
		printTwo(A,"A");
		int B[][]=AddNArray(A,100);
		System.out.println("B陣列位址:"+B);		//輸出位址
		printTwo(B,"B");
		
	}
	public static int[][] AddNArray(int A[][],int N){
		for(int i=0;i<A.length;i++){
			for(int j=0;j<A[i].length;j++){
				A[i][j]=A[i][j]+N;
			}
		}
		return A;
	}

	public static void printTwo(int A[][],String name){
		System.out.println(name+"[][]陣列列數:"+A.length);
		for(int i=0;i<A.length;i++){
			System.out.print("第"+i+"列長度:"+A[i].length+"\t");
			for(int j=0;j<A[i].length;j++){
				System.out.print(name+"["+i+"]["+j+"]="+A[i][j]+"\t");
			}
			System.out.println();
		}
	}
	
}
```
Output

    A[][]陣列列數:3
    第0列長度:4     A[0][0]=11      A[0][1]=22      A[0][2]=33      A[0][3]=44
    第1列長度:2     A[1][0]=55      A[1][1]=66
    第2列長度:3     A[2][0]=77      A[2][1]=88      A[2][2]=99
    B陣列位址:[I@15db9742
    B[][]陣列列數:3
    第0列長度:4     B[0][0]=111     B[0][1]=122     B[0][2]=133     B[0][3]=144
    第1列長度:2     B[1][0]=155     B[1][1]=166
    第2列長度:3     B[2][0]=177     B[2][1]=188     B[2][2]=199


### [練習]:計算銷售員業績(函數版)

    輸入說明:
        輸入五件產品價格和三位銷售員的銷售量
    輸出說明:
        輸出三位銷售員業績、達成比率和最佳銷售員
        
```java=
import java.io.*;
import java.util.*;

public class A6_8
{
	public static void main (String a[])throws IOException
	{
		int A[]=input_Good(5);
		int B[][]=input_Sale(3,5);
		int C[]=Sale(A,B);
		number(C,B.length);
	}
	public static int[] input_Good(int n){		// 輸入商品價格
		Scanner c= new Scanner(System.in);
		int A[]=new int[n];
		System.out.print("產品價格:");
		int s;
		for(int i=0;i<n;i++){
			s=c.nextInt();
			A[i]=s;
		}
		return A;
	}
	
	public static int[][] input_Sale(int a,int b){		// 輸入銷售數量
		int B[][]=new int [a][b];
		Scanner c= new Scanner(System.in);
		int s;
		for(int i=0;i<a;i++){
			System.out.print("銷售員"+(i+1)+"的銷售量:");
			for(int j=0;j<b;j++){
				s=c.nextInt();
				B[i][j]=s;
			}
		}
		return B;
	}
	public static int[] Sale(int A[],int B[][]){		//計算銷售員業績
		int C[]=new int[3];
		for(int i=0;i<B.length;i++){
			for(int j=0;j<B[i].length;j++){
				C[i]=C[i]+(A[j]*B[i][j]);
			}
		}
		return C;
	}
	
	public static void number(int C[],int B){			//業績排名
		int max=0,Index=0;
		for(int i=0;i<B;i++){
			System.out.println("銷售員"+(i+1)+"的業績:"+C[i]+"，達成比率: "+((C[i]/10000.0)*100)+"%");
			if(C[i]>max){
				max=C[i];
				Index=i+1;
			}
		}
		System.out.println("最佳銷售員"+Index+"  總業績: "+max);
	}
}

```
Output

    產品價格:       10      20      40      30      20
    銷售員1的銷售量:100     200     100     200     110
    銷售員2的銷售量:200     100     100     200     100
    銷售員3的銷售量:100     200     200     100     200
    銷售員1的業績:17200，達成比率: 172.0%
    銷售員2的業績:16000，達成比率: 160.0%
    銷售員3的業績:20000，達成比率: 200.0%
    最佳銷售員3  總業績: 20000
    
## CH7
### 物件導向
    類別(class):對真實事物的抽象描述
               ex:設計圖、藍圖...
    物件(object):實體、實例
    
    使用方法:
    [步驟一]描述類別:
            class 類別名稱{
            資料成員(屬性)--> int a=0;        //宣告field
                            doube b=10.0;
                            
            方法成員(功能)--> void 方法名稱 (){
                                方法內容
                            }
                         }
                         
    [步驟二]生成物件:
    
            類別名稱 變數名稱 = new 類別名稱();    //命名物件
            變數名稱.方法名稱();                  //匿名物件   
            
    [步驟三]物件操作:
            變數名稱.資料成員;


```java=
class 房子{
	int 寬 = 200;
	int 高 = 100;
	int 樓層 = 32;
	void 游泳池(){
		System.out.println("使用游泳池");
	}
	void 健身房(){
		System.out.println("使用健身房");
	}
}
public class A7
{
	public static void main (String a[])
	{
		new 房子().游泳池();		//匿名物件
		房子 帝寶 = new 房子();		//命名物件
		System.out.println("帝寶.寬:"+帝寶.寬+"  高:"+帝寶.高+"  樓層:"+帝寶.樓層);
		帝寶.健身房();
	}
}
```
Output

    使用游泳池
    帝寶.寬:200  高:100  樓層:32
    使用健身房
    
### [練習]:計算BMI(使用物件導向)
    輸入說明:
            輸入身高和體重
    輸出說明:
            輸出計算後的BMI值
```java=
import java.io.*;
 class 體脂肪
{
	double BMI(int a,int b){
		double bmi,h;
		h=a/100.0;
		bmi=b/(h*h);
		return bmi;
	}
	
}

public class A7_1
{
	public static void main (String a[])throws IOException
	{
		
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
			
		System.out.print("請輸入身高(cm):");		//輸入身高
		String s=br.readLine();
		int h=Integer.parseInt(s);
			
		System.out.print("請輸入體重(kg):");		//輸入體重
		s=br.readLine();
		int w=Integer.parseInt(s);
		
		體脂肪 Tom = new 體脂肪 ();					//使用物件導向(體脂肪)
		double n = Tom.BMI(h,w);
		System.out.println("BMI值:"+n+"%");
		
	}
}
```

Output
    
    請輸入身高(cm):160
    請輸入體重(kg):50
    BMI值:19.531249999999996%

    
### 關鍵字:this 使用
    
    可在field 前面加上this，即「this.field名稱」
    此時的this即代表取用此field的物件

```java=
class 人類
{
	private int 眼=2;
	private int 耳=2;
	private int 口=1;
	private int 鼻=1;
	public void showField(String name){
		System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
}

public class A7_2{
	public static void main (String a[]){
		人類 亞當 = new 人類();
		人類 夏娃 = new 人類();
		System.out.println("物件成員:");
		亞當.showField("亞當");
		夏娃.showField("夏娃");
	}
}
```

### 使用權限
    public(公開):可使用於程式的任何地方
    
    protected(保護):對於有關係的類別為public,無關的類別為private
    
    default(預設):java的預設許可權，當沒有使用上面提到的任何訪問限定詞時，就使用它
    
    private(私有):僅限使用於該類別中
    
```java=
class 人類
{
	private int 眼=2;		//private 私有:只限類別內部使用
	private int 耳=2;
	private int 口=1;
	private int 鼻=1;
	void 吃(String name){
		System.out.println(name+"呼叫吃的方法");
	}
	protected void showField(String name){		//protected : 僅限相關可使用
		String 眼="[我是區域變數眼睛]";
		System.out.println(name+".眼="+眼+" 耳="+耳+" 口="+口+" 鼻="+鼻);
		System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	void setField(int m,int n,int o,int p,String name){		//default :java預設使用(不須設定)
		if(m<0 || n<0 || o<0 || p<0)
			System.out.println("設定錯誤!!");
		else{
			眼=m;
			耳=n;
			口=o;
			鼻=p;
		}
		this.showField(name);
	}
}
	
public class A7_2{			
	public static void main (String a[]){		
		人類 亞當 = new 人類();
		人類 夏娃 = new 人類();
		夏娃.吃("夏娃");
		System.out.println("初始物件成員:");
		亞當.showField("亞當");
		夏娃.showField("夏娃");
		System.out.println("修改後物件成員:");
		夏娃.setField(1,3,5,7,"夏娃");
		亞當.setField(2,4,6,8,"亞當");
	}
}
```

## CH8
### 多載(Overloading)
    
    多載是指將相同的方法名稱，如果引數個數不同，
    或者是引數個數相同、型態不同，方法便具有不同功能
    public  類別名稱(){		//+void  --> 方法(非建構元)
		
	}
	
	public 類別名稱(){
		
	}
	
	public 類別名稱(int m,int n){
		
	}
	
	public 類別名稱(int m,int n,int o){
		
	}
	
	public 類別名稱(int m,int n,int o,int p){
		
	}
    

### 建構元
    建構元可視為一種特殊的方法，定義方式與方法類似
    
    修飾子 類別名稱(型態 引數，....){        //建構元的名稱必須和類別名稱相同(建構元不須加void)
            程式敘述;        //建構元沒有回傳值
    }

```java=
class 人類2
{
	private int 眼=2;
	private int 耳=2;
	private int 口=1;
	private int 鼻=1;
	public void showField(String name){
		System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public  人類2(){		//若+void  --> 方法(非建構元)
		System.out.println("0.人類建構元(),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類2(int m){
		this.眼=m;	
		System.out.println("1.人類建構元(int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類2(int m,int n){
		this(m);		//只能加在建構元敘述內容的第一行
		this.眼=m;
		this.耳=n;
		System.out.println("2.人類建構元(int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類2(int m,int n,int o){
		this.眼=m;
		this.耳=n;
		this.口=o;
		System.out.println("3.人類建構元(int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類2(int m,int n,int o,int p){
		this.眼=m;
		this.耳=n;
		this.口=o;
		this.鼻=p;
		System.out.println("4.人類建構元(int,int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public void setField(int m,String name){
		if(m<0)
			System.out.println("設定錯誤!!");
		else{
			眼=m;
		}
		this.showField("1."+name);
	}
	
	public void setField(int m,int n,String name){
		if(m<0 || n<0)
			System.out.println("設定錯誤!!");
		else{
			眼=m;
			耳=n;
		}
		this.showField("2."+name);
	}
	
	public void setField(int m,int n,int o,String name){
		if(m<0 || n<0 || o<0 )
			System.out.println("設定錯誤!!");
		else{
			眼=m;
			耳=n;
			口=o;
		}
		this.showField("3."+name);
	}

	public void setField(int m,int n,int o,int p,String name){
		if(m<0 || n<0 || o<0 || p<0)
			System.out.println("設定錯誤!!");
		else{
			眼=m;
			耳=n;
			口=o;
			鼻=p;
		}
		this.showField("4."+name);
	}
}

public class A8_1{
	public static void main (String a[]){
		人類2 亞當 = new 人類2(11);
		人類2 夏娃 = new 人類2(11,22);
		人類2 張三 = new 人類2(11,22,33);
		人類2 李四 = new 人類2(11,22,33,44);
		人類2 王五 = new 人類2();
		System.out.println("初始物件成員:");
		亞當.showField("亞當");
		夏娃.showField("夏娃");
		System.out.println("修改後物件成員:");
		夏娃.setField(1,"夏娃");
		亞當.setField(2,4,"亞當");
		張三.setField(3,5,7,"張三");
		李四.setField(6,7,8,9,"李四");
	}
}
```
Output

    1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1
    1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1
    2.人類建構元(int,int),眼=11 this.耳=22 this.口=1 this.鼻=1
    3.人類建構元(int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=1
    4.人類建構元(int,int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=44
    0.人類建構元(),眼=2 this.耳=2 this.口=1 this.鼻=1
    初始物件成員:
    this.眼=11 this.耳=2 this.口=1 this.鼻=1
    this.眼=11 this.耳=22 this.口=1 this.鼻=1
    修改後物件成員:
    this.眼=1 this.耳=22 this.口=1 this.鼻=1
    this.眼=2 this.耳=4 this.口=1 this.鼻=1
    this.眼=3 this.耳=5 this.口=7 this.鼻=1
    this.眼=6 this.耳=7 this.口=8 this.鼻=9

### 實例變數
    物件保有自己儲存field 的地方，而不與其他物件共用，據此特性的變數，
    稱為實力變數(instance variable)
舉例:
| 物件名稱 | 變數名稱 | 數值 |
| -------- | -------- | -------- |
| cir1 | pi | 3.14 |
|  | radius | 1.0 |
| cir2 | pi | 3.14 |
|  | radius | 2.0 |

### 實例方法
    需先建立物件，再利用物件來呼叫方法，稱為實例方法(instance method)
舉例:
```
CCircle cir1= new CCircle (1.0);        //建立物件 cir1
cir1.show();        //由物件 cir1 呼叫 show() method
CCircle cir1= new CCircle (2.0);        //建立物件 cir2
cir2.show();        //由物件 cir2 呼叫 show() method
```

###  靜態成員static 

    static 是一個關鍵字，是用來修飾成員(member，類別的屬性、方法或子類別)，使其成為靜態成員。
    靜態的意思是，在程式載入記憶體的時候，跟著程式一起在記憶體中佔有空間，
    而不是主程式開始執行後才跟記憶體要空間。

### 類別變數
    可由所有物件共享，每個物件的「類別變數」均相同，
    更改變了某物件的「類別變數」後，其他物件的「類別變數」也會改變
    必須在變數前加上「static」，可宣告為類別變數
    
舉例:

    private static double pi=3.14;    //將pi宣告為「類別變數」
    
### 類別方法
    將方法宣告為「類別方法」，可直接由類別呼叫
    在 method 之前加上 static 修飾子 
舉例:
```
public  static void count(){        //將count宣告成「類別方法」
    方法內容;
}
//使用時可用類別呼叫它
CCircle.count();        //直接用CCircle類別呼叫「類別方法」
```

```java=
class 人類3
{
	int 眼=2;
	int 耳=2;
	int 口=1;
	int 鼻=1;
	static int num;		//類別變數
	
	public  人類3(){		//+void  --> 方法(非建構元)
		num++;
		System.out.println("0.人類建構元(),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類3(int m){
		num++;
		this.眼=m;	
		System.out.println("1.人類建構元(int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類3(int m,int n){
//		this(m);		//只能加在建構元敘述內容的第一行
		num++;
		this.眼=m;
		this.耳=n;
		System.out.println("2.人類建構元(int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類3(int m,int n,int o){
		num++;
		this.眼=m;
		this.耳=n;
		this.口=o;
		System.out.println("3.人類建構元(int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	public 人類3(int m,int n,int o,int p){
		num++;
		this.眼=m;
		this.耳=n;
		this.口=o;
		this.鼻=p;
		System.out.println("4.人類建構元(int,int,int,int),眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
	
	void showNum(){
		System.out.println("總共生成"+num+"個人類物件");
		System.out.println("實例變數,眼="+眼+" this.耳="+耳+" this.口="+口+" this.鼻="+鼻);
		showField("");
	}
	
	public void compare(人類3 human){		
		System.out.println("this物件位址:"+this+"  human物件位址:"+human);
		if(this==human)
			System.out.println("同一人，this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
		else 
			System.out.println("不同人，human.眼="+human.眼+" human..耳="+human.耳+" human.口="+human.口+" human.鼻="+human.鼻);
	}
	
	public 人類3 compareR(人類3 human){		//類別方法
		int thisField=this.眼+this.耳+this.口+this.鼻;
		int humanField=human.眼+human.耳+human.口+human.鼻;
		System.out.println("thisField="+thisField+"humanField="+humanField);
		if(thisField>humanField){
			System.out.println("this物件成員較大.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
			return this;
		}
		else{
			System.out.println("human物件成員較大.眼="+human.眼+" human..耳="+human.耳+" human.口="+human.口+" human.鼻="+human.鼻);
			return human;
		}
	}
	public void showField(String name){
		System.out.println("this.眼="+this.眼+" this.耳="+this.耳+" this.口="+this.口+" this.鼻="+this.鼻);
	}
}



public class A8_2{
	public static void main (String a[]){
		人類3 亞當 = new 人類3(11);
		人類3 夏娃 = new 人類3(11,22);
		人類3 張三 = new 人類3(11,22,33);
		人類3 李四 = new 人類3(11,22,33,44);
		人類3 王五 = new 人類3();
		
		亞當.showNum();
		夏娃.showNum();
		張三.showNum();
		李四.showNum();
		王五.showNum();
		
		人類3 Four=李四;
		李四.compare(Four);
		人類3 Five=張三.compareR(王五);
		張三.compare(Five);
	}
}
```
Output

    1.人類建構元(int),眼=11 this.耳=2 this.口=1 this.鼻=1
    2.人類建構元(int,int),眼=11 this.耳=22 this.口=1 this.鼻=1
    3.人類建構元(int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=1
    4.人類建構元(int,int,int,int),眼=11 this.耳=22 this.口=33 this.鼻=44
    0.人類建構元(),眼=2 this.耳=2 this.口=1 this.鼻=1
    總共生成5個人類物件
    實例變數,眼=11 this.耳=2 this.口=1 this.鼻=1
    this.眼=11 this.耳=2 this.口=1 this.鼻=1
    總共生成5個人類物件
    實例變數,眼=11 this.耳=22 this.口=1 this.鼻=1
    this.眼=11 this.耳=22 this.口=1 this.鼻=1
    總共生成5個人類物件
    實例變數,眼=11 this.耳=22 this.口=33 this.鼻=1
    this.眼=11 this.耳=22 this.口=33 this.鼻=1
    總共生成5個人類物件
    實例變數,眼=11 this.耳=22 this.口=33 this.鼻=44
    this.眼=11 this.耳=22 this.口=33 this.鼻=44
    總共生成5個人類物件
    實例變數,眼=2 this.耳=2 this.口=1 this.鼻=1
    this.眼=2 this.耳=2 this.口=1 this.鼻=1
    this物件位址:人類3@15db9742  human物件位址:人類3@15db9742
    同一人，this.眼=11 this.耳=22 this.口=33 this.鼻=44
    thisField=67humanField=6
    this物件成員較大.眼=11 this.耳=22 this.口=33 this.鼻=1
    this物件位址:人類3@6d06d69c  human物件位址:人類3@6d06d69c
    同一人，this.眼=11 this.耳=22 this.口=33 this.鼻=1


## CH9 
### 繼承 : extends

    繼承為單一繼承，(子)「繼承」可獲得(父)所有成員
    
    (子)可使用(父)之成員
    但(父)不可使用(子)之成員
    

```java=
class 青標{
	int 現金 = 500000000;
	int 豪宅 = 2;
	int 跑車  = 3;
	void 當立委(){
		System.out.println("當立委");
	}
	void 當主委(){
		System.out.println("當主委");
	}
}

class 寬橫 extends 青標{           //寬橫 繼承 青標
	int 電腦 = 1;
	void 消坡塊(){
		System.out.println("做消坡塊");
	}
}
public class A9_1 {
	public static void main(String[] args) {
		青標  大言 = new 青標();
		System.out.println("大言  現金:"+大言.現金+"  豪宅:"+大言.豪宅+"  跑車:"+大言.跑車);
		大言.當立委();
		
		寬橫 小言 = new 寬橫();
		System.out.println("小言  現金:"+小言.現金+"  豪宅:"+小言.豪宅+"  跑車:"+小言.跑車+"  電腦:"+小言.電腦);
		小言.當主委();
		小言.消坡塊();
	}

}

```
Output

    大言  現金:500000000  豪宅:2  跑車:3
    當立委
    小言  現金:500000000  豪宅:2  跑車:3  電腦:1
    當主委
    做消坡塊

### 關鍵字 : super
    在「繼承」中，當使用子類別「建構元」時，會先執行父類別的「建構元」(呼叫預設建構元或沒有引數建構元)
    
    super : 是用來呼叫父類別中的「特定建構元」
    
    [注意]
        1. super()的敘述必須寫在子類別建構元的第一行
        2. super()可以多載，super會根據引數數目的型態，執行相對應之父類別建構元
        
```java=
class CCircle{
	double pi = 3.14;
	double radius = 2.0;
	CCircle (){			//建構元
		double pi = 3.14;
		double radius = 2.0;
		System.out.println("父0.CCircle()建構元,  pi="+pi+"  radius="+radius);
		show();
	}
	CCircle (double r){			//建構元
		double pi = 3.14;
		double radius = r;
		System.out.println("父1.CCircle(double)建構元,  pi="+pi+"  radius="+radius);
		show();
	}
	
	void show(){
		System.out.println("父 CCircle show(),  pi="+pi+"  radius="+radius+"  area="+radius*radius*pi);
	}
	
}
class CCoin extends CCircle{
	int value;
	CCoin(){		//建構元
		value = 10;
		System.out.println("子0.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	CCoin(double v){		//建構元
		super(v);		//呼叫父類別相同類型建構元
		value = (int)v;
		System.out.println("子1.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	
	void setvalue(int v){
		value = v;
		System.out.println("子 CCoin setvalue(int),  value="+value);
	}
	
}
public class A9_2 {
	public static void main(String[] args) {
		CCircle c1 = new CCircle();
		CCoin c2 = new CCoin(5.0);
		c2.setvalue(3);
	}

}

```
Output
    
    父0.CCircle()建構元,  pi=3.14  radius=2.0
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    父1.CCircle(double)建構元,  pi=3.14  radius=5.0
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    子1.CCoin()建構元,  pi=3.14  radius=2.0  value=5
    子 CCoin setvalue(int),  value=5
    子 CCoin setvalue(int),  value=3

   
### [練習]: 樂透(進階版)

    透過物件導向完成樂透選號程式(分為物件導向類別和主程式兩部分)
    輸入:
        使用者可選擇自選或隨機方式產生N組號碼(每組六個數值)
    輸出:
        經排序後，輸出各組數值
        
類別程式:Loto
```java=
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;

public class Loto {
	InputStreamReader isr=new InputStreamReader(System.in);
	BufferedReader br=new BufferedReader(isr);
	private int num;
	public Loto(int num){
		this.num=num;		//this.num 為類別中    num為建構元中
		System.out.println("樂透數值範圍:1~"+num);
	}
	public void play() throws IOException{
		System.out.print("[開始樂透游戲]\n 1.自選 2.隨機:");
		
		String s=br.readLine();
		int n=Integer.parseInt(s);
		if(n==1){
			this.n1();
		}
		else if(n==2){
			this.n2();
		}
	}

	protected void n1() throws IOException{		//自選
		Scanner c= new Scanner(System.in);
		
		System.out.print("請輸入組數:");
		String s=br.readLine();
		int n=Integer.parseInt(s);
		int A[][]=new int [n][6];	
		int v;
		for(int i=0;i<n;i++){
			System.out.print("請輸入第"+(i+1)+"組(6數值):");
			for(int j=0;j<6;j++){
				v=c.nextInt();
				A[i][j]=v;
			}
		}
		for(int i=0;i<n;i++){
			Arrays.sort(A[i]);
		}
		
		LotoOutput(A,n);
	}
	
	 protected void n2() throws IOException{		//隨機
		System.out.print("請輸入組數:");
		String s=br.readLine();
		int n=Integer.parseInt(s);
		int A[][]=new int [n][6];	
		for(int i=0;i<n;i++){
			for(int j=0;j<6;j++){
				A[i][j]=(int)(Math.random()*num+1);
			}
			repeat(A,i);
		}
		for(int i=0;i<n;i++){
			Arrays.sort(A[i]);
		}
		
		LotoOutput(A,n);
	}
	
	protected void repeat(int A[][],int a){
		for(int i=0;i<6;i++){
			for(int j=0;j<i;j++){
				if(A[a][i]==A[a][j]){
					A[a][i]=(int)(Math.random()*49+1);
					j=0;
				}
			}
		}
	}
	protected void LotoOutput(int A[][],int n){
		for(int a=0;a<n;a++){
			System.out.print("第"+(a+1)+"組:");
			for(int b=0;b<6;b++){
				System.out.print(A[a][b]+"    ");
			}
			System.out.println();
		}
	}
}

```

主程式:A9_3
```java=
import java.io.IOException;

public class A9_3 {

	public static void main(String[] args) throws IOException {
		Loto L = new Loto(100);
		L.play();
	}

}

```
Output

    範例一:
    樂透數值範圍:1~100
    [開始樂透游戲]
     1.自選 2.隨機:1
    請輸入組數:3
    請輸入第1組(6數值):6 5 4 3 2 1
    請輸入第2組(6數值):90 80 70 60 50 40
    請輸入第3組(6數值):77 33 99 11 22 44
    第1組:1    2    3    4    5    6    
    第2組:40    50    60    70    80    90    
    第3組:11    22    33    44    77    99
    
    
     範例二:
    樂透數值範圍:1~100
    [開始樂透游戲]
        1.自選 2.隨機:2
    請輸入組數:5
    第1組:17    33    51    67    70    91    
    第2組:7    24    32    36    72    73    
    第3組:10    88    92    93    96    99    
    第4組:9    31    36    55    75    87    
    第5組:13    28    55    61    66    70    

### 改寫(Overriding)
    改寫(Overriding)是當子類別當中，有定義名稱、引數個數與型態均與父類別相同的method，
    用以改寫父類別裡的method的功能


類別程式:Game(繼承Loto類別)
```java=
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Game extends Loto{
	InputStreamReader isr=new InputStreamReader(System.in);
	BufferedReader br=new BufferedReader(isr);
	public Game(int num) throws IOException{
		super(num);
		play();
	}
	public void play() throws IOException{			//Overriding Loto類別
		System.out.print("[開始樂透游戲]\n 1.自選 、2.隨機、3.終極密``碼:");
		
		String s=br.readLine();
		int n=Integer.parseInt(s);
		switch (n){						//switch case 判斷 n值
			case 1:
				this.n1();
				break;
			case 2:
				this.n2();
				break;
			case 3:
				this.PassWord();
				break;
		}
	}
	public void PassWord() throws IOException{			//3.終極密碼
		int A[]={1,100};
		int p=(int)(Math.random()*100+1);
		int usr=0;
		System.out.println("[終極密碼]:電腦隨機產生1~100中的任意數字為答案，玩家答錯繼續，答對離開");
		while(usr!=p){
			System.out.print("請輸入大於"+A[0]+"小於"+A[1]+"的數字: ");
			String s=br.readLine();
			usr=Integer.parseInt(s);
			if(usr == p){
				System.out.println("答對啦! 答案就是"+p+"，真是好運啊!");
			}
			else if(usr<p && usr>A[0]){
				A[0]=usr;
				System.out.println("Sorry，沒猜到  範圍在:"+A[0]+"到"+A[1]);
			}
			else if(usr>p && usr<A[1]){
				A[1]=usr;
				System.out.println("Sorry，沒猜到  範圍在:"+A[0]+"到"+A[1]);
			}
			else{
				System.out.println("請重新輸入!!");
			}
		}
	}
	
}

```

主程式:A9_4
```java=
import java.io.IOException;

public class A9_4 {

	public static void main(String[] args) throws IOException {
		new Game(100);
	}

}

```
Output

    範例一 : 
        樂透數值範圍:1~100
        [開始樂透游戲]
         1.自選 、2.隨機、3.終極密碼:3
        [終極密碼]:電腦隨機產生1~100中的任意數字為答案，玩家答錯繼續，答對離開
        請輸入大於1小於100的數字: 56
        Sorry，沒猜到  範圍在:56到100
        請輸入大於56小於100的數字: 78
        Sorry，沒猜到  範圍在:78到100
        請輸入大於78小於100的數字: 98
        Sorry，沒猜到  範圍在:78到98
        請輸入大於78小於98的數字: 78
        請重新輸入!!
        請輸入大於78小於98的數字: 89
        Sorry，沒猜到  範圍在:78到89
        請輸入大於78小於89的數字: 83
        Sorry，沒猜到  範圍在:78到83
        請輸入大於78小於83的數字: 80
        答對啦! 答案就是80，真是好運啊!
        
    範例二:
        樂透數值範圍:1~100
        [開始樂透游戲]
         1.自選 、2.隨機、3.終極密碼:2
        請輸入組數:3
        第1組:10    23    39    42    48    91    
        第2組:8    39    42    44    48    58    
        第3組:5    20    34    54    65    75    


## CH10
### 抽象類別
    
    抽象類別是以 abstract 關鍵字為開頭的類別
    
    abstract class 類別名稱{        //定義抽象類別
        宣告資料成員;
         
        回傳值資料型態 method 名稱(引數...)
        {
                //定義一般method 
        }
        abstract 回傳值資料型態 method 名稱(引數..)
        //定義抽象method。抽象method裡，沒有定義處理的方式
    }        
   

抽象類別:HSBC (匯豐銀行)
```java=
public abstract class HSBC {
	double 存款利率 = 0.001;
	double 借款利率 = 0.1;
	void 利率表(){
		System.out.println("HSBC  利率表， 存款利率 = "+存款利率+"  借款利率 = "+借款利率 );
	}
	
	abstract void 房貸業務(int m,double n);		//定義抽象類別
	abstract int  信貸業務(int m,double n);
	abstract void 車貸業務(int m,double n);
	
}
```

類別:TWHSBC(繼承HSBC)
```java=
public class TWHSBC extends HSBC {

	@Override        //改寫
	void 房貸業務(int m, double n) {
		System.out.println("TWHSBC改寫房貸業務()， 房貸金額: "+m+"  房貸利率: "+n+"房貸利息: "+m*n);
	}

	@Override
	int 信貸業務(int m, double n) {
		System.out.println("TWHSBC改寫信貸業務()， 信貸金額: "+m+"  信貸利率: "+n+"信貸利息: "+m*n);
		return 0;
	}

	@Override
	void 車貸業務(int m, double n) {
		System.out.println("TWHSBC改寫車貸業務()， 車貸金額: "+m+"  車貸利率: "+n+"車貸利息: "+m*n);
	}
}
```

類別:JPHSBC(繼承HSBC)
```java=
public class JPHSBC extends HSBC {

	@Override
	void 房貸業務(int m, double n) {
		System.out.println("JPHSBC改寫房貸業務()， 房貸金額: "+m+"  房貸利率: "+n+"房貸利息: "+m*n);
	}

	@Override
	int 信貸業務(int m, double n) {
		System.out.println("JPHSBC改寫信貸業務()， 信貸金額: "+m+"  信貸利率: "+n+"信貸利息: "+m*n);
		return 0;
	}

	@Override
	void 車貸業務(int m, double n) {
		System.out.println("JPHSBC改寫車貸業務()， 車貸金額: "+m+"  車貸利率: "+n+"車貸利息: "+m*n);
	}
}
```
主程式:A10_1
```java=
public class A10_1{

	public static void main(String[] args) {
		TWHSBC TW = new TWHSBC();
		TW.利率表();
		TW.車貸業務(1000000, 0.098);
		
		JPHSBC JP = new JPHSBC();
		JP.房貸業務(50000000, 0.077);
		
		//new.HSBC();		//不能生成抽象類別的物件
	}
}
```
Output

    HSBC  利率表， 存款利率 = 0.001  借款利率 = 0.1
    TWHSBC改寫車貸業務()， 車貸金額: 1000000  車貸利率: 0.098車貸利息: 98000.0
    JPHSBC改寫房貸業務()， 房貸金額: 50000000  房貸利率: 0.077房貸利息: 3850000.0


### 介面(Interface)
    介面本身也具有資料成員和抽象方法，但他與抽象類別有下列兩點不同:
    (1) 介面的資料成員必須初始化
    (2) 介面裡的method 必須全部都宣告成abstract 
        介面不能像抽象類別一樣保有一般的method ，而必須全部都是 抽象方法
        
        介面定義:
        interface 介面名稱    //定義抽象類別
        {
            final 資料型態 成員名稱 = 常數;        //資料成員必須設定初始值
            
            abstract 回傳值得資料型態 method 名稱(引數...);        
            //宣告抽象method 。 於抽象method 中，沒有定義處理方式
        
        }    
        
```java=
public interface 國稅局 {		//宣告介面名稱:國稅局
	final double Tax= 0.05;	//介面中宣告資料成員
	abstract void 綜所稅();	//介面中宣告抽象類別
	abstract void 營所稅();
}
```
        
### 多重繼承
    Java並「不」允許多個父類別繼承
    但可藉由「介面」的機制，多重繼承的處理還是可以實現
    其作法-- 將類別和兩個以上的介面實作在一起，其語法如下:
    class 類別名稱 implements 介面1,介面2,...        //可實作兩個以上介面
    {
        ... ...
    }
```java=
public abstract class HSBC implements 國稅局{        //多重繼承可使用於抽象類別和類別中
	public void 營所稅(){				//繼承類別  可改寫介面中的抽象類別，也可不改寫(不改寫則交由類別改寫)
		System.out.println("HSBC改寫國稅局營所稅()");
	}
}
```
完整程式
介面1名稱:國稅局
```java=
public interface 國稅局 {		//宣告介面名稱:國稅局
	abstract void 綜所稅();	//介面中宣告抽象類別
	abstract void 營所稅();
}
```
介面2名稱:證交所
```java=
public interface 證交所 {        //宣告介面名稱:證交所
	abstract void 損益表();  //介面中宣告抽象類別
	abstract void 盈餘表();
}
```
介面3名稱:金管會
```java=
public interface 金管會 {		//宣告介面名稱:金管會
	abstract void 負債比();	//介面中宣告抽象類別
	abstract void 逾放比();
	abstract void 呆帳比();
}

```
抽象類別名稱:HSBC
```java=
public abstract class HSBC implements 國稅局{
	double 存款利率 = 0.001;
	double 借款利率 = 0.1;
	void 利率表(){
		System.out.println("HSBC  利率表， 存款利率 = "+存款利率+"  借款利率 = "+借款利率 );
	}
	
	abstract void 房貸業務(int m,double n);
	abstract int  信貸業務(int m,double n);
	abstract void 車貸業務(int m,double n);
	
	public void 營所稅(){				//繼承類別  可改寫，也可不改寫
		System.out.println("HSBC改寫國稅局營所稅()");
    }
}
```
類別:TWHSBC
```java=
public class TWHSBC extends HSBC  implements 金管會,證交所{

	@Override
	void 房貸業務(int m, double n) {
		System.out.println("TWHSBC改寫房貸業務()， 房貸金額: "+m+"  房貸利率: "+n+"房貸利息: "+m*n);
	}

	@Override
	int 信貸業務(int m, double n) {
		System.out.println("TWHSBC改寫信貸業務()， 信貸金額: "+m+"  信貸利率: "+n+"信貸利息: "+m*n);
		return 0;
	}

	@Override
	void 車貸業務(int m, double n) {
		System.out.println("TWHSBC改寫車貸業務()， 車貸金額: "+m+"  車貸利率: "+n+"車貸利息: "+m*n);
	}

	@Override
	public void 綜所稅() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫國稅局綜所稅()");
	}

	@Override
	public void 負債比() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫金管會負債比()");
	}

	@Override
	public void 逾放比() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫金管會逾放比()");
	}

	@Override
	public void 呆帳比() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫金管會呆帳比()");
	}

	@Override
	public void 損益表() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫證交所損益比()");
	}

	@Override
	public void 盈餘表() {
		// TODO Auto-generated method stub
		System.out.println("TWHSBC改寫證交所盈餘表()");
	}
}
```
主程式:A10
```java=
public class A10 {

	public static void main(String[] args) {
		TWHSBC TW = new TWHSBC();
		TW.利率表();
		TW.車貸業務(1000000, 0.098);
		TW.營所稅();
		TW.綜所稅();
		TW.負債比();
		TW.呆帳比();
		TW.損益表();
		TW.逾放比();
	}

}

```
Output

    HSBC  利率表， 存款利率 = 0.001  借款利率 = 0.1
    TWHSBC改寫車貸業務()， 車貸金額: 1000000  車貸利率: 0.098車貸利息: 98000.0
    HSBC改寫國稅局營所稅()
    TWHSBC改寫國稅局綜所稅()
    TWHSBC改寫金管會負債比()
    TWHSBC改寫金管會呆帳比()
    TWHSBC改寫證交所損益比()
    TWHSBC改寫金管會逾放比()

## CH11
### 檔案的分割(package)
    開發大型程式時，可利用當按分割的方式，將程式分開成獨立的類別，
    以利於程式的開發與維護

    package 基本概念:
        package是使用多個類別或介面時，避免名稱重復而採用的一種措施。
        
    package 使用方法:
            在類別或介面最上面一行加上package 的宣告就可以
    
    語法:
        package package名稱;
    
建立一個資料夾:Gjun(資料夾中放CCircle、CCoin、A11)

類別: CCircle
```java=
package Gjun;		//package名稱需與資料夾名稱相同(Gjun)
public class CCircle{
	double pi = 3.14;
	double radius = 2.0;
	CCircle (){			//建構元
		double pi = 3.14;
		double radius = 2.0;
		System.out.println("父0.CCircle()建構元,  pi="+pi+"  radius="+radius);
		show();
	}
	CCircle (double r){			//建構元
		double pi = 3.14;
		double radius = r;
		System.out.println("父1.CCircle(double)建構元,  pi="+pi+"  radius="+radius);
	}
	
	public void show(){
		System.out.println("父 CCircle show(),  pi="+pi+"  radius="+radius+"  area="+radius*radius*pi);
	}
}
```

類別: CCoin
```java=
package Gjun;		//package名稱需與資料夾名稱相同(Gjun)
public class CCoin extends Taipei.CCircle{
	int value;
	CCoin(){		//建構元
		value = 10;
		System.out.println("子0.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	CCoin(double v){		//建構元
		super(v);		//呼叫父類別相同類型建構元
		value = (int)v;
		System.out.println("子0.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	
	void setvalue(int v){
		value = v;
		System.out.println("子 CCoin setvalue(int),  value="+value);
	}
	public void show(){
		System.out.println("子 CCircle show(),  pi="+pi+"  radius="+radius+"  value="+value);
	}
}
```

主程式:A11_1
```java=
package Gjun;		//package名稱需與資料夾名稱相同(Gjun)
public class A11_1{
	public static void main(String[] args) {
		Taipei.CCircle c1 = new Taipei.CCircle();
		c1.show();
		Hsinchu.CCoin c2 = new Hsinchu.CCoin();
		c2.setvalue(5);
		c2.show();
		Taipei.CCircle c3 = new Hsinchu.CCoin(8.0);
		c3.show();
	}
}
```
Output(編譯、執譯)
命令提示字元(cmd)內容:

    C:\Java\作品>javac Gjun\CCircle.java

    C:\Java\作品>javac Gjun\CCoin.java

    C:\Java\作品>javac Gjun\A11.java

    C:\Java\作品>java Gjun.A11
    父0.CCircle()建構元,  pi=3.14  radius=2.0
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    父0.CCircle()建構元,  pi=3.14  radius=2.0
    子 CCircle show(),  pi=3.14  radius=2.0  value=0
    子0.CCoin()建構元,  pi=3.14  radius=2.0  value=10
    子 CCoin setvalue(int),  value=10
    子 CCoin setvalue(int),  value=5
    子 CCircle show(),  pi=3.14  radius=2.0  value=5
    父1.CCircle(double)建構元,  pi=3.14  radius=8.0
    子0.CCoin()建構元,  pi=3.14  radius=2.0  value=8
    子 CCoin setvalue(int),  value=8
    子 CCircle show(),  pi=3.14  radius=2.0  value=8

### 不同 package 中存取
    如果數個類別分別屬於不同的package時，在某個類別要存取到其他類別的成員時，必須做下類修改:
    
    (1)若某個類別需要被存取時，必須把這個類別公開(public)
    
    (2)若要存取不同package內某個public 類別的成員時，在程式碼內部必須明確指明「被存取的package的名稱.類別名稱」
    
    (3)須注意成員權限(Field、method、constructor)

資料夾:Tapei
類別名稱:CCircle
```java=
package Taipei;		//package 宣告要放在第一行(不含註解)

public class CCircle{
	protected double pi = 3.14;		//宣告權限為protected，供CCoin類別使用
	protected double radius = 2.0;	//宣告權限為protected，供CCoin類別使用
	public	CCircle (){				//須公開(跨package)//建構元
		double pi = 3.14;
		double radius = 2.0;
		System.out.println("父0.CCircle()建構元,  pi="+pi+"  radius="+radius);
		show();
	}
	public CCircle (double r){		//須公開(跨package)//建構元
		double pi = 3.14;
		double radius = r;
		System.out.println("父1.CCircle(double)建構元,  pi="+pi+"  radius="+radius);
	}
	
	public void show(){				//須公開(跨package)
		System.out.println("父 CCircle show(),  pi="+pi+"  radius="+radius+"  area="+radius*radius*pi);
	}
}
```

資料夾:Hsinchu
類別名稱:CCoin
```java=
package Hsinchu;			//package 宣告要放在第一行(不含註解)
import Taipei.CCircle;		//匯入Taipei 資料庫(其中一處)

public class CCoin extends Taipei.CCircle{		//匯入Taipei 資料庫(其中一處)
	int value;
	public CCoin(){			//須公開(跨package)//建構元
		value = 10;
		System.out.println("子0.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	public CCoin(double v){	//須公開(跨package)//建構元
		super(v);			//呼叫父類別相同類型建構元
		value = (int)v;
		System.out.println("子0.CCoin()建構元,  pi="+pi+"  radius="+radius+"  value="+value);
		setvalue(value);
	}
	
	public void setvalue(int v){	//須公開(跨package)
		value = v;
		System.out.println("子 CCoin setvalue(int),  value="+value);
	}
	public void show(){			//須公開(跨package)
		System.out.println("子 CCircle show(),  pi="+pi+"  radius="+radius+"  value="+value);
	}
}
```
資料夾:Gjun
類別名稱:A11_2
```java=
package Gjun;			//package名稱需與資料夾名稱相同(Gjun)

import Taipei.CCircle;		//可先匯入資料庫(Taipei、Hsinchu)
import Hsinchu.*;			//"*"可匯入資料庫中所有類別

public class A11_2{
	public static void main(String[] args) {
		CCircle c1 = new CCircle();
		c1.show();
		CCoin c2 = new CCoin();
		c2.setvalue(5);
		c2.show();
		CCircle c3 = new CCoin(8.0);
		c3.show();
	}
}
```
Output

    父0.CCircle()建構元,  pi=3.14  radius=2.0
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    父 CCircle show(),  pi=3.14  radius=2.0  area=12.56
    父0.CCircle()建構元,  pi=3.14  radius=2.0
    子 CCircle show(),  pi=3.14  radius=2.0  value=0
    子0.CCoin()建構元,  pi=3.14  radius=2.0  value=10
    子 CCoin setvalue(int),  value=10
    子 CCoin setvalue(int),  value=5
    子 CCircle show(),  pi=3.14  radius=2.0  value=5
    父1.CCircle(double)建構元,  pi=3.14  radius=8.0
    子0.CCoin()建構元,  pi=3.14  radius=2.0  value=8
    子 CCoin setvalue(int),  value=8
    子 CCircle show(),  pi=3.14  radius=2.0  value=8
