--- tags: JAVA菜鳥筆記 --- # Java DAY02 ## FOR ### 格式: for (設定變數初始值;重複條件;變數的變化){} ### EX: ```java= for (int i=0;i<=10;i++){ System.out.println(i); } ``` ### 上面這程式碼最後會輸出的結果為 0 1 2 3 4 5 6 7 8 9 10 ### 因為上面的i我們設定為0且讓他不斷+1,加到10才會停止,所以會輸出0-10。 ### 以相同概念融合前面學的if,來進行下面的題目。 ### 例題01:設計一個程式,並列印出使用者所選擇的兩數區間中,使用者所輸入的倍數的所有數字,及其總和。 #### 程式碼: ```java= Public static void main(String[] args) { Scanner sc= new Scanner(System.in); System.out.println("請輸入倍數"); int a=sc.nextInt(); System.out.println("請輸入第一個數"); int b=sc.nextInt(); System.out.println("請輸入第二個數"); int c=sc.nextInt(); int total=0; if (b<c) { for (;b<=c;b++) { //設定重複條件為b<=c,並且每次b都+1 if (b%a==0) { System.out.println(b); total += b; } } }else { for (;c<=b;c++) { //設定重複條件為c<=b,並且每次c都+1 if (c%a==0) { System.out.println(c); total += c; } } } System.out.println("上列數字相加="+total); } } ``` :::success 此程式順利運行,在我們輸入倍數5、第一數1、第二數100以後會顯示 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 上列數字相加=1050 ::: ## While ### 格式: ### (設定變數初始值) while (重複條件){ 重複執行的程式 控制變數的改變 } ### Ex: ```java= int i=1; int total=0; while (i<=10) { total+=i; i++; } ``` ### 此程式運行完成後會和上面for的程式一樣輸出0-10。 ### for和while的使用方法雖不同,但都能進行迴圈的程式執行,端看個人比較習慣用哪種。 #### (菜雞如我在for的例題可以順利執行,但改成while以後就無法運作,想到就傷心,改了一堆結果還是沒用待會要問老師了2022/09/08) ### Tips #### 在使用迴圈時如果沒有設定好終止條件或變數改變沒設定好,會陷入無窮迴圈,要好好注意。 ### Ex: ```java= int i = 10; for (; i > 0;) { System.out.println(i); } ``` :::warning 上面的程式碼因為沒有設定變數改變式,所以條件成立就會一執行下去,要注意這細節。 ::: ### 例題02:以while去完成上面的例題01。 #### 程式碼(錯誤) ```java= package top02; import java.lang.reflect.Array; import java.text.DecimalFormat; import java.util.Scanner; public class Ex04 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc= new Scanner(System.in); System.out.println("請輸入倍數"); int a=sc.nextInt(); System.out.println("請輸入第一個數"); int b=sc.nextInt(); System.out.println("請輸入第二個數"); int c=sc.nextInt(); int total=0; if (b<c) { while (b<=c) { if (b%a==0) { System.out.println(b); total += b; b++; } } }else { while (c<=b) { if (c%a==0) { System.out.println(c); total += c; c++; } } } System.out.println("上列數字相加="+total); } } ``` #### 終於找到問題了XD看到以後覺得自己很像白癡,上面這行程式碼大家有發現哪裡有錯嗎XD,答對了~我這個智障把While的變數改變式放到if裡面了!難怪會陷入無限迴圈然後連字都出不來XD,下面我把改好的再貼一次。 ```java= package top02; import java.lang.reflect.Array; import java.text.DecimalFormat; import java.util.Scanner; public class Ex04 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc= new Scanner(System.in); System.out.println("請輸入倍數"); int a=sc.nextInt(); System.out.println("請輸入第一個數"); int b=sc.nextInt(); System.out.println("請輸入第二個數"); int c=sc.nextInt(); int total=0; if (b<c) { while (b<=c) { if (b%a==0) { System.out.println(b); total += b; } b++; //再擺錯位置阿 } }else { while (c<=b) { if (c%a==0) { System.out.println(c); total += c; } c++; //再擺錯位置阿 } } System.out.println("上列數字相加="+total); } } ``` #### 困擾我一上午的錯誤在這麼白癡的地方XD尤其是我上面才打要記好不要放錯位置或漏打,打臉就是如此之快QAQ。 ## Do while ### 老師沒講但他說很簡單,所以要我們自己看,就我自己看講義後得出的結論,的確蠻簡單的就是把重複執行及控制變數的程式放在do裡面,while裡放終止的條件,格式如下 ### 格式: do { 重複執行的程式 控制變數的式子 }while(終止的條件); #### 因為太簡單所以我就沒在練習了(囂張,剛剛明明連while的控制變數式子都擺錯)。 ## 算術相關的類別函式 #### 實在是太多了,族繁不及備載,就直接挑講義上有的來打好了。 | 名稱 | 功能 | 範例 | 結果 | | ------ | ----------------- | ------------------ | ---- | | abs | 計算絕對值 | Math.abs(-5) | 5 | | max | 取得兩數的最大值 | Math.max(1.2, 3.4) | 3.4 | | min | 取得兩數的最小值 | Math.min(2, 5) | 2 | | floor | 無條件捨去 | Math.floor(3.8) | 3.0 | | random | 取得0<=x<1 的亂數 | Math.random() | | | sqrt | 開根號 |Math.sqrt(9)|3 | | round |小數四捨五入 |Math.round(3.7) |4| | ceil |無條件進位|Math.ceil(3.2)|4.0| | pow |次方|Math.pow(2, 3) | 8.0 | ### 直接上例題~ ### 例題03:設計一個猜數字遊戲(限定數字為1-6)並讓使用者只能猜三次。 #### 程式碼(主程式): ```java= //猜數字(1-6) //使用者可以猜三次 System.out.println("請開始猜數字,僅有三次機會"); Scanner sc=new Scanner(System.in); int guess; Data01 data01=new Data01(); for (int i=0;i<3;i++) { guess = sc.nextInt(); if (data01.joudge(guess) == true) { System.out.println("猜對了"); break; }else { System.out.println("猜錯了"); } } System.out.println("遊戲結束"); ``` #### 程式碼(副程式): ```java= int ranno=(int)(Math.floor(Math.random()*6+1)); // boolean joudge(int guess) { //這裡使用boolean是為了讓下面的程式可以回傳ture或false System.out.println(ranno); if (ranno==guess) { return true; } return false; } ``` :::success 程式成功運行,終於有一次是使用到副程式的例題了(明明就自己不愛用副程式),副程式上面的註解有寫道我們為了讓程式回傳給我們true或false所以使用boolean來讓{}裡面的式子回傳給我們。 ::: ## 本日心得: ### 今天上課的內容主要是在迴圈的練習,雖然for的例題做得很順利,但在轉成while的時候卡的有夠久XD,for的程式我在老師講完沒幾分鐘就做完了,但while的那一個錯誤讓我從上午抓到下午,難道我沒當碼農的天分嗎,至於在做猜數字例題時,卡了很久的時間一直想不到該怎麼做,只好看老師的作法再自己改版,最後還好有做出來,讓我有時間在老師放風時間打心得筆記,明天就是連假了,祝看到這裡的朋友們中秋連假快樂!!(2022/09/08)