JAVA 2 Basic part 4

1.Eclipse Debug 

a. Mark a Breakpoint--> Debug As--> Java Application
b.Test, Process control, Find 
   1. switch - case: The best,  reason ----- Ask once only
   2. if - else: The second, reason ----- Keep asking until getting the right answer
   3. "if - else if" and "if - else" are similar in performance ----- But "if - else if" is High readability
   4. "ïf": is the worst ----- because ask "everything"

2. for Loop test
a. for ( int i=0; i<=5; i++)
       System.out.println("i="+i);

b. for ( int i=5; i>=0; i--)
       System.out.println("i="+i);

c.利用 for 迴圈做 1+2+3+...+N 的總和。
程式碼
public class pct01
{
public static void main(String[] args) throws IOException
{
System.out.println("請輸入一正整數");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int sum=0;
for (int i=1;i<=num; i++ ){
sum = sum + i;
}
System.out.println("總合為"+sum);
}
}

d.將上一題的加總結果,在求平均值。(記得將 int--> double,保留小數 )。
程式碼
public class pct01
{
public static void main(String[] args) throws IOException
{
System.out.println("請輸入一正整數");
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int sum=0;
for (int i=1;i<=num; i++ ){
sum = sum + i;
}
System.out.println("總合為"+sum);
System.out.println("平均為"+ (double)sum/num);
}
}

e. 練習以雙層 for 迴圈,做九九乘法表
請參考

3.以上5個for迴圈的心得歸納
a.迴圈不只可以遞增,也可以遞減。
b.改成遞減時,結束條件也要改成  i >= 0
c. for  迴圈用來做加總、平均值,很方便
d.求平均時,記得將 int 除法改成 double
e.雙層迴圈印出九九乘法表,可用 Debug 驗證。

4.Break
另一種離開迴圈的方法
用法if (條件式) {
                 break;
             }
Break:保留字,略不同於 switch-case 的 break。
限制:此語法只能脫離一層迴圈

跳離多層迴圈
老師範例:
public class Test9x9V2 {
public static void main(String[] args) {
outer: for(int i=2; i<=9; i++) {
        for(int j=1; j<=9; j++) {
    if(i==6)
break outer; // 跳離多層 loop 的方法, 須加上 標籤, 標籤自訂名稱
   System.out.println(i + "x" + j + "=" + i*j);
}
}
}
}

5.益智練習
參考 Sample3.java ,加上雙層 for 迴圈,用 * 劃出下列形狀
範例:長方形
程式碼
import java.io.IOException;
import java.util.Scanner;
public class pct04 
{
public static void main(String[] args) throws IOException
{
   //用 *號畫長方形
System.out.println("請輸入寬");
Scanner scan = new Scanner(System.in);
int width = scan.nextInt();
System.out.println("請輸入高");
int height = scan.nextInt();
for (int i=1; i<=height; i++){
for (int j=1; j<=width; j++){
System.out.print("*");
}
System.out.println("");
}
}
}

結果

a. 直角三角形(正、倒)
程式碼
import java.io.IOException;
import java.util.Scanner;
public class pct05 
{
public static void main(String[] args) throws IOException
{
   //用 *號畫正、倒直角三角形
Scanner scan = new Scanner(System.in);
System.out.println("請輸入高");
int height = scan.nextInt();
System.out.println("正直角三角形");
for (int i=1; i<=height; i++){
for (int j=1; j<=i; j++){
System.out.print("*");
}
System.out.println("");
}
System.out.println("");
System.out.println("倒直角三角形");
for (int i=height; i>=1; i--){
for (int j=i; j>=1; j=j-1){
System.out.print("*");
}
System.out.println("");
}
}
}
結果

b.等腰三角形
程式碼
import java.io.IOException;
import java.util.Scanner;
public class pct06 
{
public static void main(String[] args) throws IOException
{
   //用 *號畫等腰形
Scanner scan = new Scanner(System.in);
System.out.println("請輸入高");
int height = scan.nextInt();
System.out.println("等腰三角形");
int width1 = height*2-1;
int width2 = (width1-1)/2;
for (int i=1; i<=height; i++){

for (int j=1; j<=width2; j++){
System.out.print(" ");
}
for (int j=1; j<=width1-2*width2; j=j+1){
System.out.print("*");
}
for (int j=1; j<=width2; j++){
System.out.print(" ");
}
System.out.print("\n");
width2=width2-1;
}
}
}
結果

c.口字型

d.X型

6.第六章迴圈之二
2.while  迴圈 
參考 Sample5.java
條件把關在前面,先判斷條件,符合才做。

3. do-while 迴圈
參考 Sample6.java
條件把關在後面,先做一次在做條件判斷,符合就繼續做。

7. Sample 1~11 歸納
a. for 迴圈的 counter 可記錄次數,需在程式中善用
b. 雙層 for 迴圈,可拿來做幾何圖案之應用
c. for 迴圈作加總,好用、要會解釋
d. 另二種迴圈變形,視情況搭配使用
   1. while
   2. do...while
e. 另有 break 與 continue 指令,搭配迴圈使用
   1. break:一去不回頭
   2. continue:指跳離一輪,繼續下一輪
   3.以上二者可搭配標籤,處理多層迴圈

8.課本P.124練習題

1.輸出1~10的偶數
   (方法一)  利用步進 i = i + 2
   (方法二) 利用偶數判別式 i % 2 ==0

2.請輸入考試成績,最後輸出加總,輸入0代表結束。

9.第七章陣列
定義:(非正式) 一群相同型態的變數,藉由陣列加以組群起來
語法:資料型態名稱 [] 陣列名稱;
例如: int [ ] scores;
初始化:(二種方法)
1.一宣告就給初值:int [] scores = {52,68,75,83,36}
2.先宣告空間,再給初值:
 int [ ] scores = new int [3]
scores[0] =52;
scores[1] =68;
scores[2] =75;

陣列注意事項:
1.陣列索引超用
例如:int [ ] score = new int [5];
但不小心用到 score[6], score[8],造成錯誤
解法:善用 length 屬性
例如Score.length ,記錄此陣列的空間大小。

10陣列練習
將陣列加入點餐系統

11.建立二維陣列
語法:
int [ ] [ ] ticTacToe = new int [3] [3];
//給初始值 -1
for (int i=0; i <3; i++)
   for (int j=0; j<3; j++)
      ticTacToe[i][j] = -1 ;

12.第八章:類別
類別方法:是一種模組概念,也是一種函數概念。可將"重複出現"的程式碼以類別方法,加以整理歸納。

13.第八章練習一:OX棋
a.將 TestTwoDimArray 修改,始能從鍵盤輸入2個整數。
   1.列 (0 ~ 2)
    2.欄 (0 ~2)
b.配合迴圈,奇數次輸入 (row, column)時,將井字填 0,偶數次輸入 (row, column),將井字填1。
Hint:檢查只有井字內容為 -1時,才可輸入
c. 奇數、偶數的判斷,讓 i % 2 ==0 -->偶數

程式碼一
//TestTwoDimArrayV2.java
import java.util.Scanner;
public class TestTwoDimArrayV2 {
static int [][] ticTacToe = { {-1, -1, -1},
                 {-1, -1, -1},
                 {-1, -1, -1}};

public static void print() {
// 印出棋盤
System.out.println("--------");
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
switch(ticTacToe[i][j]) {
case -1:
System.out.print(" |");
break;
case 0:
System.out.print("O|");
break;
case 1:
System.out.print("X|");
break;
}
}
System.out.println();
}
}
public static void main(String[] args) {
// 印出棋盤
print();
int i=0; // 控制奇, 偶數
while(true) {
System.out.println("請輸入兩次整數0~2, 代表井字遊戲的列與欄(row, column)");
Scanner s = new Scanner(System.in);
int row = s.nextInt();
int col = s.nextInt();
if(row<0 || row>2 || col <0 || col>2) {
//continue;
}
else if(ticTacToe[row][col]!=-1) {
//continue;
}
else {
i++;
if(i%2!=0) //奇數 
ticTacToe[row][col] = 0;
else // 偶數
ticTacToe[row][col] = 1;
print();
}
}
}
}

程式碼二(完整版)
//TestTwoDimArrayV3.java
import java.util.Scanner;
public class TestTwoDimArrayV3
{
static int [][] ticTacToe = { {-1, -1, -1},
                 {-1, -1, -1},
                 {-1, -1, -1}};

public static boolean testLineUp() {
// 測試八條可能的連線
boolean isLined = false;
// 測 O
if(ticTacToe[0][0] == 0 && ticTacToe[0][1] == 0 && ticTacToe[0][2] == 0)
isLined = true;
else if(ticTacToe[1][0] == 0 && ticTacToe[1][1] == 0 && ticTacToe[1][2] == 0)
isLined = true;
else if(ticTacToe[2][0] == 0 && ticTacToe[2][1] == 0 && ticTacToe[2][2] == 0)
isLined = true;
else if(ticTacToe[0][0] == 0 && ticTacToe[1][0] == 0 && ticTacToe[2][0] == 0)
isLined = true;
else if(ticTacToe[0][1] == 0 && ticTacToe[1][1] == 0 && ticTacToe[2][1] == 0)
isLined = true;
else if(ticTacToe[0][2] == 0 && ticTacToe[1][2] == 0 && ticTacToe[2][2] == 0)
isLined = true;
else if(ticTacToe[0][0] == 0 && ticTacToe[1][1] == 0 && ticTacToe[2][2] == 0)
isLined = true;
else if(ticTacToe[0][2] == 0 && ticTacToe[1][1] == 0 && ticTacToe[2][0] == 0)
isLined = true;
// 測 X
if(ticTacToe[0][0] == 1 && ticTacToe[0][1] == 1 && ticTacToe[0][2] == 1)
isLined = true;
else if(ticTacToe[1][0] == 1 && ticTacToe[1][1] == 1 && ticTacToe[1][2] == 1)
isLined = true;
else if(ticTacToe[2][0] == 1 && ticTacToe[2][1] == 1 && ticTacToe[2][2] == 1)
isLined = true;
else if(ticTacToe[0][0] == 1 && ticTacToe[1][0] == 1 && ticTacToe[2][0] == 1)
isLined = true;
else if(ticTacToe[0][1] == 1 && ticTacToe[1][1] == 1 && ticTacToe[2][1] == 1)
isLined = true;
else if(ticTacToe[0][2] == 1 && ticTacToe[1][2] == 1 && ticTacToe[2][2] == 1)
isLined = true;
else if(ticTacToe[0][0] == 1 && ticTacToe[1][1] == 1 && ticTacToe[2][2] == 1)
isLined = true;
else if(ticTacToe[0][2] == 1 && ticTacToe[1][1] == 1 && ticTacToe[2][0] == 1)
isLined = true;
return isLined;
}
public static void print() {
// 印出棋盤
System.out.println("--------");
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
switch(ticTacToe[i][j]) {
case -1:
System.out.print(" |");
break;
case 0:
System.out.print("O|");
break;
case 1:
System.out.print("X|");
break;
}
}
System.out.println();
}
}
public static void main(String[] args) {
// 印出棋盤
print();
int i=0; // 控制奇, 偶數
while(true) {
System.out.println("請輸入兩次整數0~2, 代表井字遊戲的列與欄(row, column)");
Scanner s = new Scanner(System.in);
int row = s.nextInt();
int col = s.nextInt();
if(row<0 || row>2 || col <0 || col>2) {
//continue;
}
else if(ticTacToe[row][col]!=-1) {
//continue;
}
else {
i++;
if (i%2!=0) //奇數 
ticTacToe[row][col] = 0;
else // 偶數
ticTacToe[row][col] = 1;
print();
// 先判斷是否已連成一線?
boolean isWin = testLineUp();
if(isWin) {
System.out.println("連成一線!!");
break;
}
}
}
}
}

14.第六章課本練習題(P.155)
第四題
程式碼一
import java.io.*;
class Sample9
{
   public static void main(String[] args) throws IOException
   {
      BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));
            int[] test = new int[5];
       System.out.println("請輸入" + test.length + "個人的分數:");

      for(int i=0; i<test.length; i++){
         String str = br.readLine();
         test[i] = Integer.parseInt(str);
      }
      for(int i=0; i<test.length; i++){
      System.out.println("第" + (i+1) + "個人的分數是:"+test[i]) ;
      }
      //可以做排序:兩兩相比,大的放入test[s]。
      for(int s=0; s<test.length-1; s++){
         for(int t=s+1; t<test.length; t++){
            if(test[t] > test[s]){
               int tmp = test[t];
               test[t] = test[s];
               test[s] = tmp;
            }
         }
      }
      System.out.println("最高分是"+test[0]+ "分") ;
   }
}

程式碼二
import java.util.Scanner;
public class E724 {

static int max=-1;
public static void main(String[] args) {
System.out.println("max="+getmax());
}
public static int getmax(){
Scanner scan = new Scanner(System.in);
System.out.println("請輸入5個分數:");

int [] score = new int[5];
for (int i=0; i<score.length;i=i+1){
score[i] =  scan.nextInt();
}

for (int i=0;i<score.length;i=i+1){
if (score[i]>max){
max = score[i];
}
}
return max;
}
}

結果


No comments: