2015年7月27日 星期一

JAVA SL-110_07/26

label 標籤
代表的是迴圈的標示記號,可利用 label 指向相對應的迴圈。

1. label_name:迴圈敘述
2. label_name:迴圈敘述

Outerloop:label_name
for(;;){
        Innerloop:label_name
        for(;;){
                break Innerloop;
                ...
                continue Innerloop;
                ...
                break Outerloop;
                ...
                continue Outerloop;
        }
{

################################################################
for 和 ( , )
判斷下列能否執行:

1. for(int i=0, j=0 ; ; )               //可以

2. for(int i=0, int j=0 ; ; )           //錯誤,若多種型態要在外部宣告

3. for(int i=0, long j=0 ; ; )          //錯誤,同 2.

4. int i=0;                             //可以
   long j=0;
   for(i=0, j=0 ; ;)

5. int i=0;                             //錯誤, long 同樣要在外部宣告
   for(i=0, long j=0 ; ;)

6. String s=null;                       //可以
   int i=0;
   for(i=1,s=a ; ;)
################################################################
無窮迴圈:
while(true)             java 不可以用 1,要用 true

for(;;)                 直接不要打。
################################################################
for_each
(for/in)簡化存取集合體物件元素,
例如 Array 或集合,其特性是在執行的過程會自動往下找直到全部擷取完畢。

for(資料型態 變數名稱:母體集合){
        程式敘述
}
################################################################
陣列一經宣告就不能更改 length。

int score={98, 56, 63};
int score1=score;               //這是錯誤的陣列複製方法,應該用 arraycopy 等其>他方式。
################################################################
// 可以使用 for 迴圈做陣列複製
public class test0726_4{
 public static void main(String avgs[]){
        int[] score1 = {88, 81, 76, 68};
        int[] score2 = new int [score1.length];

        for(int i=0; i<score1.length; i++)
                score2[i] = score1[i];

        for(int j:score2)
                System.out.println(j);
 }
}

################################################################
// 也使用 Arrays.copyOf 來達到陣列複製
import java.util.Arrays;
//import java.util.*;

public class test0726_5{
 public static void main(String avgs[]){
        int[] score1 = {88, 81, 76, 68};
        int[] score2 = Arrays.copyOf(score1, score1.length);

        for(int s:score2)
                System.out.printf("%3d", s);

        System.out.println();
        score2[0]=99;

        for(int s:score2)
                System.out.printf("%3d", s);
        // %s:字串, %d:整數, %f:浮點數, %c:字元, %n:換行
        // %3d:印出三位整數,不足自動補空格
 }
}

################################################################
public class MyClass{
        int i = 10;
        static int k = 100;
        void aMethod(String s){
                int j = 20;
                static String s = "a";  //錯誤,在 Method 不可以有 static 變數。
        }       //在方法裡面,不可以再宣告方法。
}
################################################################
// 建立物件實體
1. 建立類別變數
        。用 new 建立類別實體









//物件變數抓取屬性、方法
1. 類別變數.屬性;
2. 類別變數.方法();
################################################################

################################################################
// Constructer 建構子
程式在執行時,第一個執行的函式就是建構子。

//語法:
存取權限 類別名稱(參數列){

}

// *
// 1. 建構子沒有回傳值
// 2. 建構子的名稱必須和類別名稱相同

// 預設建構子
當程式中沒有自行定義的建構子時,編譯時會自動加上預設建構子。

// *
// 1. new 一個實體時會自動執行
// 2. 預設建構子沒有參數列
// 3. 程式中只會有一個預設建構子
################################################################
// 大資料數據,使用 BigDecimal -> java.math.BigDecimal;
import java.math.BigDecimal;

public class test0726_11{
 public static void main(String avgs[]){
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.1");
        BigDecimal c = a;
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(a.equals(b));
 }
}

//輸出:
//false         //雖同值,但不同位址,判斷為不同之參考。
//true          //經 = ,兩者變為同一參考位址。
//true          //純粹比對兩者的值,都是 0.1 故 true。

// 補充
字串比對: == 、equals
字元比對:只能用 ==

// 差異:
== 去比對它的參考位址。
= 直接去改變參考。
equals 去比對它的值。
################################################################
// 繼承
是指物件的資源可以延伸和重複使用,
在 Java 利用 extends 這個關鍵字來表達類別的繼承關係,也就是 is-a 的概念。

子類別名稱 + extends + 父類別名稱















################################################################
// this 和 super

// this
是指參考到目前作用中物件的特性、方法、建構子。

//super
是指可以參考到父物件的方法、屬性、建構子。
################################################################
// super 練習

class Father{
        Father(String s){
                System.out.println("A");
                System.out.println(s);
        }
}

class Son extends Father{
        Son(){
                super("C");
                System.out.println("B");
        }
}

public class Extends2{
 public static void main(String avgs[]){
        Son s = new Son();
 }
}
################################################################
// spuer and this 練習

class Father{
        Father(char c){                         //第四步驟,接收到 'A'
                System.out.println(c);          //第五步驟,印出 'A'
        }
}

class Son extends Father{
        Son(){
                this('A');                      //第一步驟,丟出 'A' 到 Son(char c)
                System.out.println("B");        //第六步驟,印出 'B'
        }
        Son(char c){                            //第二步驟,接收 this 傳來的值 'A'
                super(c);                       //第三步驟,回傳值到 Father
        }
}

public class Extends3{
 public static void main(String avgs[]){
        Son s = new Son();                      //第○步驟,建構子 Son(){...}
 }
}
################################################################

2015年7月25日 星期六

UnoJoy HexFiles Compile and Flash

系統環境:Debian Linux 8.0

一、下載 Source Code
UnoJoy 官方下載: https://github.com/AlanChatham/UnoJoy

二、安裝刷 Arduino 韌體工具
安裝 Flash 工具「dfu-programmer」及編譯工具「avr-gcc」:
su
apt-get update
apt-get install dfu-programmer
apt-get install gcc-avr avr-libc binutils-avr gdb-avr avrdude

三、燒入 Arduino .ino Code
以官方軟體 Arduino IDE 寫好程式,直接燒入。

四、編譯並燒至 Firmware

Step 1. Compile .c to .o
avr-gcc -DF_CPU=16000000UL -mmcu=atmega8u2 -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -Wall -c UnoJoy.c -o UnoJoy.o

avr-gcc -DF_CPU=16000000UL -mmcu=atmega8u2 -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -Wall -c usb_gamepad.c -o usb_gamepad.o

Step 2. Compile .o to .elf
avr-gcc -mmcu=atmega8u2 -o UnoJoy.elf UnoJoy.o usb_gamepad.o

Step 3. Compile .elf to .hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature UnoJoy.elf UnoJoy.hex

Step 4. switch DFU mode
參考教學(適用 Arduino UNO R1/R2):https://www.arduino.cc/en/Hacking/DFUProgramming8U2
若是使用 Arduino UNO R3 版本,直接做短路 Reset 步驟,無需焊電阻。

可以使用 Linux 指令查看:
watch -n 1 'dmesg| grep -i arduino'

正常情況,
R1/R2 焊完 10K 電阻,短路後會顯示 DFU Mode;
而 R3 直接短路後,可能無輸出訊息。

Step 5. 燒入 Hex File 至 Flash Memory
(atmega8u2 晶片)
sudo dfu-programmer at90usb82 erase
sudo dfu-programmer at90usb82 flash UnoJoy.hex
sudo dfu-programmer at90usb82 reset

(atmega16u2 晶片)
sudo dfu-programmer atmega16u2 erase
sudo dfu-programmer atmega16u2 flash UnoJoy.hex
sudo dfu-programmer atmega16u2 reset

此時,將 Arduino 插入 Host 端會顯示為一支搖桿,
並且無法使用 Arduino IDE 做程式燒錄,
必須再燒 firmware 回原廠設定。

五、UnoJoy Joystick 回原為 Arduino UNO
找到檔案 Arduino-usbserial-uno.hex ,
同樣用 DFU Mode ,並以指令 dfu-programmer 指令做燒錄動作。

補充:自編一個 Makefile:
##############################################################################
# UnoJoy Test Makefile
##############################################################################
# AVR Libc Reference Manual
# http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__util__delay.html

# Toolchain
OBJCOPY = avr-objcopy
CC = avr-gcc
F_CPU = -DF_CPU=16000000UL
MMCU = -mmcu=atmega8u2
C_FLAGS = $(F_CPU)
C_FLAGS += $(MMCU)
C_FLAGS += -funsigned-char
C_FLAGS += -funsigned-bitfields
C_FLAGS += -Os
C_FLAGS += -fpack-struct
C_FLAGS += -fshort-enums
C_FLAGS += -Wall

# Target source file
UNOJOY = UnoJoy
GAMEPAD= usb_gamepad
C_UNOJOY = $(UNOJOY).c
C_GAMEPAD = $(GAMEPAD).c

# Compile output file
O_UNOJOY = TEST_UnoJoy.o
O_GAMEPAD = TEST_gamepad.o
ELF_FILE = TEST.elf
HEX_FILE = TEST.hex
##############################################################################
all: $(ELF_FILE)
        @echo ============ HexFiles Creating ============
        $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock -R .signature $(ELF_FILE) $(HEX_FILE)

$(ELF_FILE): $(O_UNOJOY) $(O_GAMEPAD)
        @echo ============ ELF File Creating ============
        $(CC) $(MMCU) -o $@ $(O_UNOJOY) $(O_GAMEPAD)

$(O_UNOJOY): $(C_UNOJOY)
        @echo  ============ Compile $(C_UNOJOY) ============
        $(CC) $(C_FLAGS) -c $< -o $@

$(O_GAMEPAD): $(C_GAMEPAD)
        @echo ============ Compile $(C_GAMEPAD) ============
        $(CC) $(C_FLAGS) -c $< -o $@

clean:
        @echo "rm -f $(O_UNOJOY)" 
        @echo "rm -f $(O_GAMEPAD)"
        @echo "rm -f $(ELF_FILE)"
        @echo "rm -f $(HEX_FILE)"
        @echo ============ Clean: ALL ============
        @rm -f $(O_UNOJOY) $(O_GAMEPAD) $(ELF_FILE) $(HEX_FILE)




執行編譯檔案: make
清除編譯檔案:make clean


Reference:

  http://www.atmel.com/webdoc/AVRLibcReferenceManual/using_tools_1using_sel_gcc_opts.html












2015年7月20日 星期一

JAVA SL-110_07/19

Java SL-110 2015/07/19
##########################################################################
JAVA 構成的要件分為幾項:屬性、方法、類別、建構子。
以下列程式為例:

public class Puggy{                     //類別
        String name = "小黑";           //物件變數
        static String type = "拉布拉多";//類別變數

        void skill(){                   //物件方法
                String s1 = "拿報紙";   //區域變數
                System.out.println(s1);
        }

        static void skill_1(){          //類別方法
                System.out.println("拎施鞋");
        }
        Puggy()[]                       //建構子
}

##########################################################################
註解:
1. //           單行註解
2. /*.....*/    多行註解
3. /**...*/     文件註解,編譯指令:javadoc -verbose -private O.java

##########################################################################
練習『文件註解』:Puppy.java

/**這是寵物的類別*/
public class Puppy{
        /**寵物的名稱*/
        public static String name = "小黃";
        /**寵物的品種*/
        public static String type = "拉布拉多";
        /**寵物的顏色*/
        public static String color = "黃色";
        /**寵物的技能*/
        public static void skill(){
                System.out.println("拿施鞋");
        }
}

cmd:
javadoc -verbose -private Puppy.java

點開 index.html 可以看到說明文件。
##########################################################################
// package 與 import

// package 程式,路徑 C:\java\water\Fish.java
package water;
public class Fish{
        public static String name = "小金";
        public static String type = "金魚";
        public static String color = "金";
        public static void skill(){
                System.out.println("吐泡泡");
        }
}

// 主程式,路徑 C:\java\PetStore.java
public class PetStore{
        public static void main(String args[]){
                String fishname = water.Fish.name;
                String fishtype = water.Fish.type;
                String fishcolor = water.Fish.color;
                System.out.println("我有一隻優雅的" + fishtype + "牠的名字叫" + fishname + ",牠身上的顏色是:" + fishcolor + "色");
                System.out.println("每當牠生氣的時候都會");
                water.Fish.skill();
        }
}

cmd:
javac PetStore.java
java PetStore

// 猜猜哪個 import 寫法,效能較快?
// 1.
import java.io.File;
File f;
f = new File("test.txt");

// 2.
import java.io.*;
import java.awt.*;
File f;
f = new File("test.txt");

// 3.
import java.io.*;
File f;
f = new File("test.txt");

// 4.
java.io.File f;
f = new java.io.File("test.txt");

// 答:以上四種的執行效能都一樣。
// 程式撰寫優先: package > import > classpath
##########################################################################
存取修飾元:

private         同一個 class 下才可進行存取。
default         同一個 package 下的 class 才可進行存取。
protected       不同 package 可以透過繼承。
public          皆可存取。

一般類別只有 public 和 default 兩種存取權限,『內部類別』才有四種存取權限。
##########################################################################
Java 命名規則:

1. 第一個字必須是英文字母、_ 或 $。
2. Java 有大小寫之分。
3. 不可以是關鍵字。

因此推薦使用駝峰式大小寫命名,例: AppStore
##########################################################################
資料型態        bytes   bit     範圍                            預設值
char            2       16      '1u0000'~'1uFFFF'(0~65535)      '1u0000'
byte            1       8       -128~127                        0
short           2       16      -32768~32762                    0
int             4       32      -2031次方~(2031次方-1)          0

char c = '中';          //可以
char c1= '1u4E2D';      //可以 Unicode 編碼
char c2= 65;            //可以 ASCII 編碼
char c3= '\0';          //可以 \0 為空字元
byte b = 255;           //不行,超出資料範圍
short a = 'A';          //可以,會轉換成數字
int a = '爪';           //可以,會轉成 ASCII 數字
int b = '哇';           //可以,會轉成 ASCII 數字
int c = a+b;            //可以,會轉成 ASCII 數字

// Java 預設值
整數    int
浮點數  double

資料型態        bytes   bit     範圍                            預設值
long            8       64      -2063次方~(2063次方-1)          0L
float           4       32      -3.4E+38~3.4E+38                0.0f
double          8       64      -1.7E+308~1.7E+308              0.0
boolean         1       8       true/false                      false

long l = 10;            //不行,因為 long 宣告要有 L
float f = 2.5;          //不行,因為 float 宣告要有 f
double d = 2.5f         //可以,因為 dobule 的資料範圍大於 float
boolean b = 0;          //不行,Java 的布林值只有 true / false
##########################################################################
資料態的轉換:

1. 小轉大:無風險,自動轉換


2. 大轉小:風險大,手動 coding
(欲轉換的型態)變數名稱;
(float)b;

// 判斷 compile 會不會過?
int i = 1;
double d;
d = i;
i = d;
//答:i=d; 會有問題,必須改成 i = (int)d;

// 判斷 compile 會不會過?
byte b=3;
short s=5;
short c=b+s;
//答:compile 會錯,因為整數預設為 int ,
//所以整數運算 short c=b+s; 必須改為 int c=b+s;
##########################################################################
陣列:
[]      >       指的是陣列中元素的位置或陣列物件的長度

int a[]=new int[5]{1,2,3,4,5];  \\這是錯誤的,已設有初值,不能再設長度。
int a[]=new int[]{1,2,3,4,5];

int B[]=new int[5];
B[0]=3;
B[1]=2;

//陣列取長度:
陣列變數.length         //陣列取長度是一種屬性。
字串變數.length();      //字串取長度是一個方法,後面有括號。

//比較 String 與 chat

                String                  char
資料型態        參考資料型態            基本資料型態
圈住符號        " "                     ' '
比較運算        == 或 equals()          ==
抽象表現        是一個 class            16-bit unicod

補充,參考資料型態有三種:String, Array, Object.
##########################################################################
算數運算子:

+       正加            //正或負為單元運算子
-       負減
*
/
%
++
...

//---------------------------
byte x=1, y=2, z;
z = x+y;
//這是錯的,要先相加再做轉換:z=(byte)(x+y);
//---------------------------
int a=0, b=0;
b = a++ + ++a - a++;
a= 3
b= 0
//Ans:b = 0(1) + 2(2) - 2(3)
//---------------------------
int a=0, b=0;
b= a-- + --a - a--;
a= -3
b= 0
//Ans:b = 0(-1) + -2(-2) - -2(-3)
##########################################################################
關系運算子:

>
<
>=
<=
==
!=

int a=1, b=2;
a==b    False
a>b     False
a<b     Ture
a>=b    False
a<=b    Ture
##########################################################################
邏輯運算子:                    短路 short-circuit
不論是 T 或 F 都會執行
&                               && 第一組邏輯是 F 時,就跳出
|                               || 第一組邏輯是 T 時,就跳出

int a=1, b=2;
(a<b) && (a>0);         T,T     Ture
(a<b) & (a>0);          T,T     Ture
(a>b) | (a<0);          F,F     False
(a>b) || (a<0);         F,F     False
!(a>b);                    F,NOT     Ture
(b>a) | (a<0);          T       Ture    | 後面不執行
(b>a) || (a<0);         T,F     Ture
(a<b) & (a<0);          T,F     False

//---------------------------
int a=1, b=2;
if((a<b) | (++a>0))
a=2
//---------------------------
int a=1, b=2;
if((a<b) || (a++>0))
a=1
##########################################################################
指定運算子:
=
+=
-=
*=
/=
%=
&=
//---------------------------
int a=2;
a=a*2-3;
a=1
//---------------------------
int a=2;
a*=2-3;
a=-2
//---------------------------
String s1="JAVA";
String s2="SCJP";
int i=1;
int j=2;
System.out.println(i+j);        //印出 3
System.out.println(s1+j);       //印出 JAVA2
//---------------------------
String s1="420";

s1+=42;
System.out.println(s1);         //印出 42042
//---------------------------
X = 5*3 < 20 & 3+7 > 9-1 || 20 >= 20 -30 && False
       T     &    T      ||   跳出
##########################################################################
流程控制:

條件式流程控制  if-else, switch-case
迴圈式          for, while, do-while, foreach
例外控制        try-catch-finally, throws
特定控制單元    break, continue, label
label 為流程控制記號,不能改變程式執行流程的順序。

//---------------------------
//if_else

int a=1;
if(a>0)
        System.out.println("A");
//      System.out.println("B");
else
        System.out.println("C");
        System.out.println("D");

輸出:
A
D
//---------------------------
//switch case

1. case 的比對不可以重複
2. switch(x)
        x 必須是 int 以下的值域和 String (int, char, byte, short)
3. default 關鍵字可以單獨存在
4. default 只能有一個

為何需要 break?
因為 case 不能改變程式執行的流程,它只是一個記號,所以需要 break 來改變目前流程>。

語法:
switch(x){
        case 1:
        ......
        break;
        case 2:
        ......
        break;
        default:
}
//---------------------------
//for

public class Fest{
        public static void main(String avgs[]){
                for(int i=1;i<=10;i++){
                        if(i==8)
                                break;
                        if(i%3==0)
                                continue;
                        System.out.println(i);
                }
        }
}

輸出:12457

2015年7月14日 星期二

程式設計概論0705

# 二維陣列
宣告

資料型態 陣列名稱[][] = 資料型態[列的個數][行的個數];

# 對等宣告
int arr[][] = new [3][4];
int arr[][] = {{1,2,3}, {4,5,6}};

# 不對等宣告
int arr[][] = new [3][];
arr[0] = new int [4];   // 宣告 arr[0] 列,有 4 行
arr[1] = new int [3];   // 宣告 arr[1] 列,有 3 行
arr[2] = new int [4];   // 宣告 arr[2] 列,有 4 行

int arr[][] {{第 0 列初值}, {第 1 列初值}, {第 2 列初值}...{ 第 n 列初值}};

# 取得陣列的列數
陣列名稱.length();

# 取得特定列的元素個數
陣列名稱[列的索引值].length;


## 函數
把相同的程式碼撰寫在函數中,簡化程式中的程式碼達到程式模組化。

語法
public static 傳回值 方法名稱 (型態 引數, 型態 引數)