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