Java DAY02

FOR

格式:

for (設定變數初始值;重複條件;變數的變化){}

EX:

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:設計一個程式,並列印出使用者所選擇的兩數區間中,使用者所輸入的倍數的所有數字,及其總和。

程式碼:

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); } }

此程式順利運行,在我們輸入倍數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:

int i=1; int total=0; while (i<=10) { total+=i; i++; }

此程式運行完成後會和上面for的程式一樣輸出0-10。

for和while的使用方法雖不同,但都能進行迴圈的程式執行,端看個人比較習慣用哪種。

(菜雞如我在for的例題可以順利執行,但改成while以後就無法運作,想到就傷心,改了一堆結果還是沒用待會要問老師了2022/09/08)

Tips

在使用迴圈時如果沒有設定好終止條件或變數改變沒設定好,會陷入無窮迴圈,要好好注意。

Ex:

int i = 10; for (; i > 0;) { System.out.println(i); }

上面的程式碼因為沒有設定變數改變式,所以條件成立就會一執行下去,要注意這細節。

例題02:以while去完成上面的例題01。

程式碼(錯誤)

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,下面我把改好的再貼一次。

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)並讓使用者只能猜三次。

程式碼(主程式):

//猜數字(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("遊戲結束");

程式碼(副程式):

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; }

程式成功運行,終於有一次是使用到副程式的例題了(明明就自己不愛用副程式),副程式上面的註解有寫道我們為了讓程式回傳給我們true或false所以使用boolean來讓{}裡面的式子回傳給我們。

本日心得:

今天上課的內容主要是在迴圈的練習,雖然for的例題做得很順利,但在轉成while的時候卡的有夠久XD,for的程式我在老師講完沒幾分鐘就做完了,但while的那一個錯誤讓我從上午抓到下午,難道我沒當碼農的天分嗎,至於在做猜數字例題時,卡了很久的時間一直想不到該怎麼做,只好看老師的作法再自己改版,最後還好有做出來,讓我有時間在老師放風時間打心得筆記,明天就是連假了,祝看到這裡的朋友們中秋連假快樂!!(2022/09/08)