變數 (variable) :表示記憶體中,某一位址所存放的 值; 或當成參考(...
DESCRIPTION
Java 變數的介紹. 變數 (variable) :表示記憶體中,某一位址所存放的 值; 或當成參考( reference )時表示某一物件的位址 。 變數的命名: 可用的字元: 0…9 、 A...Z 、 a…z 、 under line(‘ _ ’) 、’ $’ or Unicodes 。 命名的規則: 1) 變數的第一個字元,不可以是數字,餘為上述可用之字元。 2) 大 小 寫是不一樣的!( case sensitive ) - PowerPoint PPT PresentationTRANSCRIPT
變數 (variable) :表示記憶體中,某一位址所存放的值; 或當成參考( reference )時表示某一物件的位址。 變數的命名:可用的字元: 0…9 、 A...Z 、 a…z 、 under line(‘_’) 、’ $’ or Unicod
es 。命名的規則:1) 變數的第一個字元,不可以是數字,餘為上述可用之字元。2) 大小寫是不一樣的!( case sensitive )3) Java 的保留字 (reserved word or key word) 不可以當成變數名稱。4) 可以用中文名稱當變數。* 建議儘量取有意義的變數名稱例如: char my_account; // C/C++ style ,以底線分開 int totalMoney; // 除第一個字外,其餘首字大寫來區分 class MyFirstClass; // class 首字大寫來區分 final int MAX_USER; // 常數一律大寫, 字以底線分隔,前加 fi
nal
Java 變數的介紹
識別字種類 習 慣 命 名 原 則 範 例
常 數 使用英文大寫字母和底線「_」符號 MAX_SIZE
變 數 使用英文小寫字母開頭,如果是兩個英文
字所組成,第二個之後的英文字以大寫開
頭
size、screenSize
類 別 使用英文大寫字母開頭,如果是兩個英文
字組成,其它英文字使用大寫開頭
LargeCar、SmallCar
函數(方法) 使用英文小寫字母開頭,如果是兩個英文字組成,其它英文字使用大寫開頭
pressButton 、
scrollScreen
Java 變數命名慣例
type modifier data type bytes rangechar 1 -128 ~ 127
unsigned char 1 0 ~ 255int 4 -2147483648 ~ 2147483647
short int 2 -32768 ~ 32767long int 4 -2147483648 ~ 2147483647
unsigned int 4 0 ~ 4294967295unsigned short int 2 0 ~ 65535unsigned long int 4 0 ~ 4294967295
float 4 3.4E-38 ~ 3.4E+38double 8 1.7E-308 ~ 1.7E+308
C/C++ 各種資料型態的儲值範圍
*可使用 sizeof ( ) 來求出資料型態在記憶體中的儲存長度( bytes )。
Numeric Data TypesName Domain Storage sizebyte -27 ~ 27-1 8-bit signed
short -215 ~ 215-1 16-bit signed
int -231 ~ 231-1 32-bit signed
long -263 ~ 263-1 64-bit signed
float -3.4E38~3.4E38 32-bit IEEE-754
double -1.7E308~1.7E308 64-bit IEEE-754
char 0~ 216-1 (65535) 16 bits
boolean true or false 16 bits
Java 各種資料型態的儲值範圍
Operator Precedence chartPrecedence OperatorHighest order casting
++ and -- (prefix)
*, /, %+, -<, <=, >, >===, !=&&| |=, +=, -=, *=, /=, %=
Lowest order ++ and -- (postfix)
C/C++/Java 語言的數值資料表示法10 進位數值:與一般數值相同,此為預設的表示法。 8 進位數值:以 0 (數值零)開頭的數值。16 進位數值:以 0x 或 0X 開頭的數值。為避免產生變數判別上的混淆:例如:就像是個變數名稱的十六進位數, 0xAB 。所以在 Java 中,變數的首字字元不可以是數字。
10 進位數值: 12 = (12)10
8 進位數值: 012 = (10)10
16 進位數值: 0x12 = (18)10
Statement: System.out.println(2+1+"="+2+1);
Displaying: 3=21
Statemetn: System.out.println(""+2+1+"="+2+1);
Displaying: 21=21
System.out.print("line 1");
System.out.print("line 2\n");
System.out.println("line 3");
System.out.println("line 4\n");
Java print() & println() 的使用範例(1)
line 1line 2line 3line 4
當第一個字串出現後接下來其餘各項均當成字串處理
Java print() & println() 的使用範例(2)
System.out.println("012="+012 +" 12="+12 +" 0x12="+0x12 +"\n");
Output : 012=10 12=12 0x12=18
System.out.println("c:\backup=>c:\\backup");
System.out.println("\"\\");
Output : cackup=>c:\backup
cc:cacaccackcackucackup
Java 陣列的宣告與使用範例 (1) Step 1:宣告參考( reference)
DataType[] arrayName; or
DataType arrayName[];
Ex. int[] aryValue; or int aryValue[];現在我們祇是得到一個可以存取資料的 reference,陣列的大小與所需的記憶體空間,系統並未配置給該矩陣變數。Step 2:產生真正的陣列 arrayName = new Datatype[number_of_Elements];
Ex. aryValue = new int[10];現在我們有了:aryValue[0],aryValue[1],aryValue[2],aryValue[3],aryValue[4],aryValue[5],aryValue[6],aryValue[7],aryValue[8],aryValue[9]
1) Zero-based :index starting from zero.
2) The size of the array, aryValue.length =>10
Java 陣列的宣告與使用範例 (2) 宣告陣列並同時給予初值,此時甚至不必指定陣列的大小,會自動計算該陣列的大小。
DataType arrayName[] = {v1,v2, … ,vn }; or
DataType [] arrayName = {v1,v2, … ,vn };
Ex.
int aryInt[] = { 10, 20, 30, 40, 50 };
int[] aryInt = { 11, 22, 33, 44, 55 };
The size of the array aryInt, aryInt.length => 5
Java 陣列的宣告與使用範例 (3) int i; // an integer variable
int[] ia, ib; // Both ia & ib are array
ia= new int[5]; ib= new int[5]; // requests for array// Error below, int[] required but int found.
i= new int[5];
What following really are ?
int ic[], id; // ic is an array, but id is an integer.
ic= new int[5];
id= new int[5]; // Error ! Id is not an array !
1) Type arrayName[]; // array requested,
2) arrayName= new Type[#OfElement]; // really obtained the array
C 語言中負數的表示法設數值 x (>0) 為 r 進位,且共有 n 位數:則( -x )的 r 補數表示法為: ( -x ) => ( rn – x ) = x 的 (r-1) 補數 + 1;
x 的 r-1 補數表示法為: x => ( rn –1) – x
x 的 r 補數的 r 補數 = ( rn – ( rn – x )) = x
例如: (0111 1111)2 = ( 127 )
(1000 0000)2 = ( -128 )
(1000 0001)2 = ( -127 )
(1111 1111)2 = ( -1 )
加1符號位元
C / C++ /Java 的 運 算 子算術運算子: +、 -、 *、 /、 %(mod)
關係運算子: >、 >=、 <、 <=、 ==、 !=
位元運算子: &(and)、 |(or)、 ^(xor)、 ~(not)、 >>(shr)、 <<(shl)
邏輯運算子: &&(and)、 ||(or)、 !(not)
條件運算子:? :
遞增、遞減運算子: ++、 --
Java 運算式的簡寫表示法a = a + (value); ==> a += (value);
a = a + (expression); ==> a += (expression);
Ex. a = a+2; same as a += 2;
a = a + b*b; same as a += b*b;
其中的運算子可以是下述的任一個:+ 、 - 、 * 、 / 、 % 、 & 、 | 、 ^ 、 >> 、 <<
a &= (expression);
a -= (expression);
a >>= (expression);
a ^= (expression); … , etc.
條件運算子 => ? :
( 條件判斷式 ) ? ( 成立執行此部分 ) : ( 不成立執行此部分 ) ;
例如: (x>0)?(x=x):(x=-x); //取 x的絕對值 (x%2==1)? System.out.print(“odd”) : System.out.print(“even”); a = (x>=0)?(100):(50);
*類 C語言中,任何型態的資料,都可以視為數值,即使是 指標存的位址,也能當成是數值來看待。*類 C語言中,條件成立與否或其結果是真或假,是以數值 來表示:成 立、真、 true => 非零值 不成立、假、 false => 零
遞增、遞減運算子: ++、 --a++; ++a; 均等效於 a = a + 1;
a--; --a; 均等效於 a = a - 1;
C/C++ 中前置運算與後置運算的差別:++a :先將變數 (a) 的值加 1 後,再參與運算。a-- :先參與運算後,再將變數 (a) 的值減 1 。例如: int a=10, b=20;
1) b = ++a +5+ b--;
2) a = a++ + 9;
3) b = (b++) + (++a);
4) a = (a--)*(++b);
a=11; b=35;
a=20; b=20;
a=11; b=32;
a=209; b=21;
a=a+1;b=a+5+b;b=b-1;
解讀規則:1) 先做前置運算2) 計算敘述結果3) 進行後置運算
例如: int a=10, b=20;
1) b = ++a +5+ b--;
2) a = a++ + 9;
3) b = (b++) + (++a);
4) a = (a--)*(++b);
a=11; b=36;
a=19; b=20;
a=11; b=31;
a=210; b=21;
a=a+1;k=a+5+b;b=b-1;b=k;
It’s another story in Java.1) 各變數的前置運算先作2) 計算此時右邊的結果(暫存)3) 接著處理需後置運算的變數4) 最後把 2) 得到的結果,代入左邊的變數
if ( 條件式 ) 敘述 Yes;
敘述 next;
敘述 Yes
敘述 next
條件式
if ( 條件式 ) 敘述 Yes;else 敘述 No;
敘述 next;
敘述 Yes
敘述 next
條件式
敘述 No
成立才做
no
yesnoyes
其中之ㄧ
Ex. if statement
if ( a>0 )
System.out.println (“a>0”);System.out.println(“next statement”);
Ex. if-else statement
if ( a>0 )
System.out.print(“a>0\n”);
else System.out.print(“a<=0\n”);System.out.printf(“next statement”);
if ( 條件式 ){ 敘述 Yes1; 敘述 Yes2;}else { 敘述 No1; 敘述 No2;};
敘述 next;
敘述 Yes2
敘述 next
條件式
敘述 Yes1
敘述 No2
敘述 No1
no yes
複合敘述:以 {} 括住將其當成一個敘述。
if ( 條件式 )
{ 敘述 Yes1;
敘述 Yes2;
}
else
敘述 No1; // end if
敘述 No2;
敘述 next;
敘述 Yes2
敘述 next
條件式
敘述 Yes1敘述 No1
敘述 No2
no yes
複合敘述:誤讀敘述。
敘述 Yes22
敘述 next
條件式 1
敘述 Yes21
敘述 No 條件式 2
將左邊流程圖以下列程式表示,這樣對嗎 ?
if ( 條件式 1 )
if ( 條件式 2 )
{ 敘述 Yes21;
敘述 Yes22;
}
else 敘述 No;
敘述 next;
else 會與最近的 if 配對
no
yes
yes
是描述左圖的程式碼?int a=-1;
if ( a!=0 )
if ( a>0 )
System.out.print(“a>0\n”);
else
System.out.print(“a=0\n”);
What is the output ?
printf(“a>0\n”)
敘述 next
a!=0
a>0
printf(“a=0\n”)
a=0
no
yes
yes
no
程式碼與對應的流程圖
Score Grade>=90 A>=80 B>=70 C>=60 D< 60 E
if ( score>=90 ) System.out.print(“Grade A”);else if ( score>=80 ) System.out.print(“Grade B”);else if ( score>=70 ) System.out.print(“Grade C”);else if ( score>=60 ) System.out.print(“Grade D”)else System.out.print(“Grade E”);
Transfer score to grade
程式碼對齊:將 else 前移。
if ( score>=90 )
System.out.print(“Grade A”);
else if ( score>=80 )
System.out.print(“Grade B”);
else if ( score>=70 )
System.out.print(“Grade C”);
else if ( score>=60 )
System.out.print(“Grade D”)
else
System.out.print(“Grade E”);
對應展開上一頁的 if-else 的配對關係
for 迴圈 (for loop) :for ( 初值設定 ; 條件判斷 ; 條件變換 )
{ ………..
迴圈內容 ;
};
敘述 next;Ex. 求 1+2+…+n 的值int n, total=0;
scanf(“%d”, &n);
for (k=1; k<=n; ++k )
{ total = total + k; // or total += k;
}
printf(“1+…+%d=%d\n”, n, total);
條件判斷 迴圈內容
條件變換
敘述 next
初值設定祇會做一次
yes
no
迴圈內容
敘述 next
條件式
while-loop:while ( 條件式 ){ …………. 迴圈內容 ;};
敘述 next;
int total=0; k=1;while ( k<=n ){ total += k; ++k; }
敘述 next;
計算 1+2+…+n 的值
條件成立時才會做迴圈內容
yes
no
迴圈內容
敘述 next
條件式
do-while-loop:
do { ………….
迴圈內容 ;
};
while ( 條件式 ) ;
敘述 next;
do { printf(“Input your password:”);
scanf(“%s”, password);
}
while ( check(password) );
敘述 next;
檢查輸入的密碼
至少做一次
yes
no
相當於下列流程:迴圈內容 ;while ( 條件式 ){ …………. 迴圈內容 ;};
switch ( value )
{
case v1 : 敘述 1;
case v2 : 敘述 2;
…..
case vk : 敘述 k;
…..
default : 敘述 n;
};
敘述 next;
switch ( value )
{
case v1 : 敘述 1;
case v2 : 敘述 2;
…..
case vk : 敘述 k;
….. break;
default : 敘述 n;
};
敘述 next;
有 break
當所有情況都不符合時可有可無
value 可以是運算式
switch case => 多個條件選一!
switch case 與 if- else-if … else 的比較:都能做多個條件選一,兩者有何差異?1) switch 中 case 的值必須是類整數型態的; 2) if- else-if … else 則可以使用更彈性的條件判斷式!
Ex. switch-case without break
value=‘A’;
switch (value)
{
case ‘A’ : printf(“A”);
case ‘B’ : printf(“B”);
case ‘C’ : printf(“C”);
default : printf(“not ABC”);
};
敘述 next;
value=‘A’ ABCnot ABC
value=‘B’
value=‘C’
value=‘P’ not ABC
BCnot ABC
Cnot ABC
Ex. switch-case with breakvalue=‘A’;
switch (value)
{ case ‘A’ : System.out.print(“A”);
break;
case ‘B’ : System.out.print(“B”);
case ‘C’ : System.out.print(“C”);
break;
default : System.out.print(“not ABC”);
};
敘述 next;
value=‘A’ A
value=‘B’value=‘C’
value=‘P’ not ABC
BCC
break : 跳出迴圈 ,至敘述 next(迴圈後的下一敘述 )
continue: 跳至 條件變換 或 條件判斷 處break 可用於 for-loop, while, do-while, switch
continue 則用於 for-loop, while, do-while
for (k=1; k<10; ++ k){ ………. ….. break; ………. ….. continue; ……...};
next-statement;
while ( a>=1 ){ ………. ….. break; ………. ….. continue; ……...};next-statement;
// break case:
int n, sum=0; // 初值設定 for (n=1; n<=10; ++n)
{ if ( n = = 5 ) break;
sum += n;
}
// continue case
int n, sum=0;
for (n=1; n<=10; ++n)
{ if ( n = = 5) continue;
sum += n;
}
sum = 1+2+3+4 = 10
sum = 1+2+3+4+6+7+8+9+10 = 50
位元的介紹bit (binary digit) :位元 => 0 or 1
byte = 8 bits :位元組word = 2 bytes = 16 bits :字組
1 0 1 1 0 1 0 1
27 26 25 24 23 22 21 20
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
位 元 的 稱 呼 (與冪次有關)
& 0 10 0 01 0 1
| 0 10 0 11 1 1
^ 0 10 0 11 1 0
0 ^ A = A 具 inverse 的作用1 ^ A = ~A 能把 bit 設成反相
0 | A = A 具 set 的作用1 | A = 1 能把 bit 設成 1
0 & A = 0 具 reset 的作用1 & A = A 能把 bit 設成 0
位元的運算 : & | ^ ~ << >>
位元的運算例子 (1/2)
若 A = 0xD3 = (1101 0011)2
a) 將 bit4 設成 0 : A = A & 0xEF;
1 1 0 1 0 0 1 1
利用 & (and)運算1 1 1 0 1 1 1 1
b) 將 bit3 設成 1 : A = A | 0x08;
1 1 0 1 0 0 1 1
利用 | (or)運算0 0 0 0 1 0 0 0
位元的運算例子 (2/2)
若 A = 0xD3 = (1101 0011)2 (nibble: 4 bits)
c) 將 high nibble反相 :
A = A ^ 0xF0;
1 1 0 1 0 0 1 1
利用 ^ (xor)運算1 1 1 1 0 0 0 0
d) 保留 low nibble:
A = A & 0x0F;
1 1 0 1 0 0 1 1
利用 & (and)運算0 0 0 0 1 1 1 1
1 0 1 0 0 1 1 1
0 1 0 1 0 0 1 1
N = 0xA7
N = N>>1
位元的右、左移
1 0 1 0 0 1 1 1
0 1 0 0 1 1 1 0
N = 0xA7
N = N<<1
補零
補零
注意!符號位元可能會被改變!
A>>1 : A 除以 2 ,並且去餘數。A<<1 : A乘以 2 ,但有可能超過數值的範圍或導致變號。可利用上述的特性,來加快數值的計算!例如: a = 5*a; => a = (a<<2)+a; // a=a*4+a;