# 目前學到的函式寫法彙整
## 8/17~8/21(第一周)目前學到的函式
* 輸入指定範圍內的數,(有提示字串,最小值,最大值,有設中斷點int[] arr)
解釋中斷點 如果設定要輸入0~100,那如果main中斷點設-1
那此方法不可能輸入的到-1,因為會一直超出範圍
則在使用函式時候,最後一個輸入值 放入new int[]{-1}
例如
```java=
int n =getNum("請輸入範圍:",0,100,new int[]{-1});
```
這樣當函式內判定你輸入-1時候,因為跟中斷點內設的值相同則直接return
-1 就會被回傳出來,達到回傳到範圍外的數字的要求
平常不需要回傳範圍內以外的數字時,就將中斷點那格填為null,例如
```java=
int n =getNum("請輸入範圍:",0,100,null);
```
* 回傳指定範圍的數字方法
```java=
public static int getNum(String hint, int min, int max, int[] avs) {
Scanner sc = new Scanner(System.in);
int n;
do {
System.out.print(hint + "(" + min + "~" + max + "):");
n = sc.nextInt();
if (avs != null) {
for (int i = 0; i < avs.length; i++) {
if (n == avs[i]) {
return n;
}
}
}
if (n >= min && n <= max) {
return n;
}
System.out.println("數字不符合規範,請重新輸入");
} while (true);
}
```
* 逐步搜尋法
```java=
public static int linearSearch(int key, int[] arr, int count) {
for (int i = 0; i < count; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
```
* 二元搜尋法
```java=
public static int binarySearch(int key, int[] arr, int count) {
int left = 0;
int right = count - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] == key) {
return middle;
}
if (arr[middle] > key) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return -1;
}
```
* 擴增陣列
```java=
public static int[] doubleArr(int[] arr) {
int[] tmpArr = new int[arr.length * 2];
for (int i = 0; i < arr.length; i++) {
tmpArr[i] = arr[i];
}
return tmpArr;
}
```
<br>
* 泡泡排序法 (從小到大)
```java=
public static void bubbleSort(int[] arr, int count) {
for (int i = 0; i < count - 1; i++) {
for (int n = 0; n < count - 1 - i; n++) {
if (arr[n] > arr[n + 1]) {
int tmp = arr[n];
arr[n] = arr[n + 1];
arr[n + 1] = tmp;
}
}
}
}
```
* 隨機亂數 排列陣列內數值
```java=
public static void shuffle(int[] arr, int count) {
for (int i = 0; i < count; i++) {
int r = (int) (Math.random() * count);
int tmp = arr[r];
arr[r] = arr[i];
arr[i] = tmp;
}
}
```
* 移除陣列中某位置的數
```java=
public static void removeElement(int index, int[] arr, int count) {
for (int i = index; i < count - 1; i++) {
arr[i] = arr[i + 1];
}
}
```
* 在陣列中指定位置插入 新的數,要記得注意陣列長度
```java=
public static void insertElement(int value, int index, int[] arr, int count) {
for (int i = count; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = value;
}
```
* 最大公因數
```java=
public static int gcd(int a, int b) {
int r = 0;
while (b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
```
* 質數搜尋範圍
```java=
public static boolean isPrime(int n) {
if (n == 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(n); i++) {
//搜尋範圍 最簡為n開根號,若有小於開根號 會在之前先被搜尋出來
if (n % i == 0) {
return false;
}
}
return true;
}
```
函式用法思考點
重複性的事情,可以寫成函式
功能性單一 針對單一功能為主
例如 判斷質數 則是輸入一個數 回傳 true or false