--- title: JAVA(程設-期中考後) tags: JAVA(程設-期中考後) --- # JAVA程式語言 --- 李鍾斌(程設-期中考後) > 【目次】 > [TOC] > > Reference website: > 1. https://www.journaldev.com/12552/public-static-void-main-string-args-java-main-method > --- # 2018-11-19 class ## 程式模組化 * 將部分程式從主程式中切割出來 ==【 呼叫 function 】== * 執行流程: * main -> 看到 function (stop) -> 找到 function 並執行 -> 將值傳回 main 繼續做 * [```void``` 結束時,該 function 不需要回傳任何值 (無效、失效)](https://stackoverflow.com/questions/36217198/what-does-public-static-void-mean-what-is-a-class) * ```java= import java.util.*; public class Week11 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("輸入圓半徑:"); int r = sc.nextInt(); computeArea(r); } public static void computeArea(int r){ double area = r*r*3.1416; System.out.println("圓面積="+area); } } ===> 修改! import java.util.*; public class Week11 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("輸入圓半徑:"); int r = sc.nextInt(); double area1 = computeArea(r); // (宣告) double area1 = System.out.println("圓面積=" + area1); } public static double computeArea(int x){ // (回傳) double double area = x*x*3.1416; // 把 r變數 用 x變數 取代,但值不變 return(area); } } ``` * BMI 計算 ```java= import java.util.*; public class Week11 { public static void main(String[] args){ // 全域變數 Scanner sc = new Scanner(System.in); System.out.println("輸入身高(cm):"); int h = sc.nextInt(); System.out.println("輸入體重(kg):"); int w = sc.nextInt(); double bmi = computeBMI(h,w); System.out.println("BMI=" + bmi); } public static double computeBMI(int height, int weight){ // 區域變數 double h = height/100.0; double result = weight/(h*h); return(result); } } ``` * 比大小 ```java= #方法一 import java.util.*; public class Week11 { public static void main(String[] args){ //Scanner sc = new Scanner(System.in); int a=5, b=3, c=7; System.out.println("The bigger one is: " + bigger(a,b,c)); } public static int bigger(int x, int y, int z){ // if(x>y & x>z) return(x); else if (y>z) return(y); else return(z); } } #方法二 import java.util.*; public class Week11 { public static void main(String[] args){ //Scanner sc = new Scanner(System.in); int a=5, b=3, c=7; System.out.println("The bigger one is: " + bigger(bigger(a,b),c)); // } public static int bigger(int x, int y){ if(x>y) return(x); else return(y); } } #方法二(加入array) import java.util.*; public class Week11 { public static void main(String[] args){ //Scanner sc = new Scanner(System.in); int [] a = {13,11,7,5,3,2,17,19,99,0}; int champ = a[0]; //紀錄目前最大值,一開始先將a[0]設定為最大 for (int i=1; i<10; i++) champ = bigger(champ,a[i]); System.out.println("The bigger one is: " + champ); } public static int bigger(int x, int y){ if(x>y) return(x); else return(y); } } ``` ## HW: 副程式練習 ```java= import java.util.*; public class Week11 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("a is: "); int a = sc.nextInt(); System.out.println("b is: "); int b = sc.nextInt(); int power = pow(a,b); /* 執行流程: main -> 看到 function (stop) -> 找到 function 並執行 -> 將值傳回 main 繼續做 */ System.out.printf("a 的 b 次方:" + power); } public static int pow(int x, int y){ //將程式模組化 int result = 1; for (int i=1; i<=y; i++){ //迴圈 從1跑到y result *= x; } return(result); } } ``` # 2018-11-26 class ## 遞迴 Recursion * 反覆地透過自己呼叫自己,來解決問題。須有終止條件。 * Ex: ```n! = n * (n-1)!``` ```java= public class Week12 { public static void main(String[] args) { int num = 5; int result = factorial(num); System.out.printf("%d! = %d\n", num, result); } public static int factorial(int n){ if(n == 1){ return(1); } else{ return(n*factorial(n-1)); } } } ``` * 費氏數列: ```java= import java.util.*; public class Week12 { public static void main(String[] args) { Scanner sc = new Scanner (System.in); System.out.println("輸入項數:"); int n = sc.nextInt(); // 讀取項數 int [] fib = new int [n]; //依據大小宣告陣列 fib[0] = 1; fib[1] = 1; // 頭兩項為1 for (int i=2; i<n; i++){ fib[i] = fib[i-1] + fib[i-2]; // 第三項起為前兩項之和 } for (int i=0; i<n; i++){ //利用迴圈逐項輸出 System.out.printf("F(%d)=%d\n",i,fib[i]); } } } ===> 改遞迴 import java.util.*; public class Week12 { public static void main(String[] args) { Scanner sc = new Scanner (System.in); System.out.println("輸入項數:"); int n = sc.nextInt(); // 讀取項數 for (int i=0; i<n; i++){ //利用迴圈逐項輸出 System.out.printf("F(%d) = %d\n",i,fib(i)); } } public static int fib(int n) { //先寫~ if( n==0 || n==1 ){ return(1); //直接return答案 } else{ return(fib(n-1) + fib(n-2)); // 第三項起為前兩項之和 } } } ``` ## HW: 遞迴練習-指數運算 ```java= import java.util.*; public class Week12 { public static void main(String[] args) { Scanner sc = new Scanner (System.in); System.out.println("輸入底數 a:"); int a = sc.nextInt(); // 讀取底數 a System.out.println("輸入指數 b:"); int b = sc.nextInt(); // 讀取指數 b System.out.printf("%d^%d = %d\n", a, b, my_power(a,b)); } public static int my_power(int a, int b) { if( b == 0 ) return(1); else return(a*my_power(a,b-1)); } } ``` # 2018-12-03 class ## 程式呼叫 * call by value:全域變數/區域變數 * call by reference ```java= public class Week13 { public static void main(String[] args) { int [] a ={1,2,3,4,5}; int answer; answer = biggest(a); //System.out.println("Bigger number is: "+answer); } public static int biggest(int [] x){ //x陣列的內容 = a陣列的內容 for (int i=0; i<x.length; i++){ System.out.printf("x [%d] = %d \n", i, x[i]); } return(0); } } ``` ```java= public class Week13 { public static void main(String[] args) { int [] a ={1,2,3,4,5}; int answer; answer = biggest(a); //將整串a陣列交給biggest程式處理 // System.out.println(a); //陣列a的參考座標 System.out.println("Bigger number is: "+answer); } public static int biggest(int [] x){ //副程式以變數x接收主程式中a陣列的參考位置 int ans = x[0]; for (int i=1; i<x.length; i++){ if (ans < x[i]) ans = x[i]; } return(ans); } } ``` ## HW: 終極密碼 ```java= import java.util.*; import java.lang.Math; public class Week13 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("=====歡迎玩終極密碼!!====="); System.out.println("請輸入下界:"); int lb = sc.nextInt(); //lowerbound System.out.println("請輸入上界:"); int ub = sc.nextInt(); //upperbound int ans = getRandom(lb, ub), guess; System.out.println("ans=" + ans); System.out.println("=====請輸入你所猜的數字====="); boolean bingo = false; //預設 沒猜中 while(!bingo){ System.out.printf("請輸入介於 %d 到 %d的整數:", lb, ub); guess = sc.nextInt(); if ( guess == ans ){ System.out.printf("恭喜猜中了"); break; } } } public static int getRandom(int lb, int ub) { //副程式以變數x接收主程式中a陣列的參考位置 return((int)((Math.random()*(ub-lb)+1)+lb)); //將x設為終極密碼-電腦變數 } } //產生亂數 //副程式:getRandom(int lowerbound, int upperbound) ``` ## 終極密碼(改進版) ```java= import java.util.*; import java.lang.Math; public class Week13 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("=====歡迎玩終極密碼!!====="); System.out.println("請輸入下界:"); int lb = sc.nextInt(); //lowerbound System.out.println("請輸入上界:"); int ub = sc.nextInt(); //upperbound int ans = getRandom(lb, ub), guess; System.out.println("ans=" + ans); System.out.println("=====請輸入你所猜的數字====="); boolean bingo = false; //預設 沒猜中 while(!bingo){ System.out.printf("請輸入介於 %d 到 %d的整數:", lb, ub); guess = sc.nextInt(); if ( guess == ans ){ System.out.printf("恭喜猜中了"); break; } if ( guess > ans ){ System.out.println(""); System.out.printf("數字要再小一點"); } if ( guess < ans ){ System.out.println(""); System.out.println("數字要再大一點"); } } } public static int getRandom(int lb, int ub) { //副程式以變數x接收主程式中a陣列的參考位置 return((int)((Math.random()*(ub-lb)+1)+lb)); //將x設為終極密碼-電腦變數 } } //產生亂數 //副程式:getRandom(int lowerbound, int upperbound) ``` # 2018-12-17 class * Random 一次跑四位數 ```java= import java.util.*; import java.lang.Math; public class Week14 { public static void main(String[] args) { int ans; for(int i=0;i<50;i++){ ans = RanGen(1000,9999); System.out.println("Ans="+ans); } } public static int RanGen(int lb, int ub){ return ((int)(Math.random()*(ub-lb))+lb); } } ``` * Random 個別跑四位數 ```java= # 方法一 import java.util.*; import java.lang.Math; public class Week14 { public static void main(String[] args) { int [] ans = new int[4]; do{ ans[0] = RanGen(1,9); //產生千位數 ans[1] = RanGen(0,9); //產生百位數 ans[2] = RanGen(0,9); //產生十位數 ans[3] = RanGen(0,9); //產生個位數 }while(!Check(ans)); //逤沒通過檢查,則繼續執行迴圈 for(int i=0;i<4;i++){ //列印答案亂數供測試 System.out.println(ans[i]+" "); } } public static int RanGen(int lb, int ub){ //根據輸入的ub與lb,產生一個介於但包含ub和lb的亂數 return ((int)(Math.random()*(ub-lb+1))+lb); } public static boolean Check(int [] a){ if (a[0]==a[1] || a[0]==a[2]|| a[0]==a[3]|| a[1]==a[2]|| a[1]==a[3]|| a[2]==a[3]){ return(false); }else{ return(true); } } } # 方法二 import java.util.*; import java.lang.Math; public class Week14 { public static void main(String[] args) { int [] ans = new int[4]; int answer; do{ answer = RanGen(1000,9999); Divide(answer,ans); }while(!Check(ans)); //逤沒通過檢查,則繼續執行迴圈 for(int i=0; i<4; i++){ //列印答案亂數供測試 System.out.println(ans[i]+" "); } } public static int RanGen(int lb, int ub){ //根據輸入的ub與lb,產生一個介於但包含ub和lb的亂數 return ((int)(Math.random()*(ub-lb+1))+lb); } public static boolean Check(int [] a){ //用來檢查是否四個位數各自不重複 if (a[0]==a[1] || a[0]==a[2] || a[0]==a[3] || a[1]==a[2] || a[1]==a[3] || a[2]==a[3]){ return(false); //若任兩位數的數字重複,則傳回"偽" }else{ return(true); } } public static void Divide(int n, int[] a){ //四個位數,個字拆開 for (int i=3; i>=0; i--){ a[i] = n%10; n /= 10; } } } ``` * HW:猜數字(幾A幾B) ```java= import java.util.*; import java.lang.Math; public class Week14 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int [] ans = new int[4]; int answer; int [] guess = new int[4]; do{ answer = RanGen(1000,9999); Divide(answer,ans); //ans=系統產生的亂數,已放入陣列 }while(!Check(ans)); //若沒通過檢查,則繼續執行迴圈 for(int i=0; i<4; i++){ //列印答案亂數,供測試 System.out.print(ans[i]+" "); } int a,b; //用來計算得到的幾A幾B System.out.println("===猜數字==="); do{ a=0;b=0; //每次重猜數字時,AB都要歸0重新計算 do { //當使用者的輸入中有重複的數字或是時,請重猜!!! System.out.println("Input你所猜的四位數:"); answer = sc.nextInt(); Divide(answer,guess); }while(!Check(guess)); Divide(answer,guess); for(int i=0; i<4; i++) for(int j=0; j<4; j++) if (ans[i] == guess[j]) if(i==j) a++; else b++; System.out.println(a+"A"+b+"B"); }while(a!=4); //若沒通過檢查,則繼續執行迴圈 System.out.println("=== 成功了~ 猜數字game over~ ==="); } public static int RanGen(int lb, int ub){ //根據輸入的ub與lb,產生一個介於但包含ub和lb的亂數 return ((int)(Math.random()*(ub-lb+1))+lb); } public static boolean Check(int [] a){ //用來檢查是否四個位數各自不重複 if (a[0]==a[1] || a[0]==a[2] || a[0]==a[3] || a[1]==a[2] || a[1]==a[3] || a[2]==a[3]){ return(false); //若任兩位數的數字重複,則傳回"偽" }else{ return(true); } } public static void Divide(int n, int[] a){ //四個位數,各自拆開 for (int i=3; i>=0; i--){ a[i] = n%10; n /= 10; } } } ``` # 2018-12-24 class ## 氣泡排序法 ```java= # 自己做的版本 import java.util.*; public class Week16 { public static void main(String[] args) { //int [] x = {2,4,6,1,3,8,5,7}; Scanner sc = new Scanner(System.in); System.out.println("輸入資料筆數:"); int n = sc.nextInt(); int [] x = new int[n]; //宣告n個空間的陣列,並把資料一個個輸入進陣列裡 for (int i = 0; i < n ; i++ ){ System.out.printf("請輸入第%d筆資料",i+1); x[i] = sc.nextInt(); } int temp = 0; for ( int i = 0; i < x.length-1 ; i++ ){ //(最外圈:決定重複次數) for ( int j = 0; j < x.length-1; j++){ //(最內圈:決定前後兩兩筆大小,大的就往後丟) while ( x[j] > x[j+1] ){ temp = x[j]; x[j] = x[j+1]; x[j+1] = temp; } } } for ( int i = 0; i < x.length; i++ ){ //輸出排序結果 System.out.print(x[i]); } } } ``` ```java= # 改成 function 版本 import java.util.*; public class Week16 { public static void main(String[] args) { //int [] x = {2,4,6,1,3,8,5,7}; Scanner sc = new Scanner(System.in); System.out.println("輸入資料筆數:"); int n = sc.nextInt(); int [] x = new int[n]; //宣告n個空間的陣列,並把資料一個個輸入進陣列裡 for (int i = 0; i < n ; i++ ){ System.out.printf("請輸入第%d筆資料",i+1); x[i] = sc.nextInt(); } BubbleSort(x); for ( int i = 0; i < x.length; i++ ){ //輸出排序結果 System.out.print(x[i]); } } public static void BubbleSort(int [] a) { int temp = 0; for ( int i = 0; i < a.length-1 ; i++ ){ //(最外圈:決定重複次數) for ( int j = 0; j < a.length-1; j++){ //(最內圈:決定前後兩兩筆大小,大的就往後丟) while ( a[j] > a[j+1] ){ temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } } ``` ## HW: 撲克牌抽牌 ```java= import java.lang.Math; public class Card { public static void main(String[] args) { int [] poker = new int [52]; for (int i = 0; i < poker.length; i++){ poker[i]=0; } int ok = 0; do{ int result = RanGen( 0, 51 ); if ( poker[result] == 0 ){ ok++; poker[result] = 1; Color(result); System.out.println(result+"--------------"); } }while( ok < 5 ); } public static int RanGen(int lb, int ub) { //副程式以變數x接收主程式中a陣列的參考位置 return((int)((Math.random()*(ub-lb)+1)+lb)); //將x設為終極密碼-電腦變數 } public static int Color(int result) { //使用 % 13 來判斷 A, 1, 2 ..., J ,Q ,K int k = result % 13; if (result <= 12){ if (k == 0) System.out.println("黑桃A"); else if (k == 10) System.out.println("黑桃J"); else if (k == 11) System.out.println("黑桃Q"); else if (k == 12) System.out.println("黑桃K"); else System.out.println("黑桃"+k); } else if (result <= 25) { if (k == 0) System.out.println("紅心A"); else if (k == 10) System.out.println("紅心J"); else if (k == 11) System.out.println("紅心Q"); else if (k == 12) System.out.println("紅心K"); else System.out.println("紅心"+k); } else if (result <= 38) { if (k == 0) System.out.println("方塊A"); else if (k == 10) System.out.println("方塊J"); else if (k == 11) System.out.println("方塊Q"); else if (k == 12) System.out.println("方塊K"); else System.out.println("方塊"+k); } else if (result <= 51) { if (k == 0) System.out.println("梅花A"); else if (k == 10) System.out.println("梅花J"); else if (k == 11) System.out.println("梅花Q"); else if (k == 12) System.out.println("梅花K"); else System.out.println("梅花"+k); } return (k+result); } } //52抽5,不放回 ``` --- ## 期中考檢討 ```java= import java.util.*; public class Q3c { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int i,j,k = 9; do{ for(i = k; i >= 3; i--){ //分別執行當i=9,8,7,6,5,4,3時 for(j = 1; j <= i; j = j+2){ System.out.print(i); //列印i值 } } } while (i <= 9 && i >= 3); } } ``` ```java= import java.util.*; public class Q2b { public static void main(String[] args) { Scanner sc = new Scanner(System.in); /* (b) 承上題,有沒有可能以 switch 語法完成同樣的輸出功能?若可以,請寫出程式 片段,反之也請說明理由。 Ans: 其實可以用switch寫,但是會非常複雜(使用雙層switch),因此強烈不建議用switch寫 */ } } ``` ```java= import java.util.*; public class Q1c { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入整數:"); int input = sc.nextInt(); boolean prime = true; for (int i = 2; i < input; i++) { if (input % i == 0) { prime = false; break; } } System.out.println(prime ? "質數" : "非質數"); //若prime=true,"質數"。反之,"非質數" } } ```