Transcript Java 介紹

Java變數的介紹
變數(variable):表示記憶體中,某一位址所存放的值;
或當成參考(reference)時表示某一物件的位址。
變數的命名:
可用的字元:0…9、A...Z、a…z、under line(‘_’)、’$’ or Unicodes。
命名的規則:
1) 變數的第一個字元,不可以是數字,餘為上述可用之字元。
2) 大小寫是不一樣的!(case sensitive)
3) Java的保留字 (reserved word or key word) 不可以當成變數名稱。
4) 可以用中文名稱當變數。
*建議儘量取有意義的變數名稱
例如: char my_account;
int totalMoney;
class MyFirstClass;
final int MAX_USER;
// C/C++ style,以底線分開
// 除第一個字外,其餘首字大寫來區分
// class首字大寫來區分
// 常數一律大寫, 字以底線分隔,前加 final
Java變數命名慣例
識別字種類
習 慣 命 名 原 則
範 例
常 數
使用英文大寫字母和底線「_」符號
MAX_SIZE
變 數
使用英文小寫字母開頭,如果是兩個英文 size、screenSize
字所組成,第二個之後的英文字以大寫開
頭
類 別
使用英文大寫字母開頭,如果是兩個英文 LargeCar、SmallCar
字組成,其它英文字使用大寫開頭
函數(方法) 使用英文小寫字母開頭,如果是兩個英文 pressButton
字組成,其它英文字使用大寫開頭
scrollScreen
、
C/C++各種資料型態的儲值範圍
type modifier data type bytes
unsigned
short
long
unsigned
unsigned short
unsigned long
range
char
1
-128 ~ 127
char
int
int
1
4
2
0 ~ 255
-2147483648 ~ 2147483647
-32768 ~ 32767
int
int
int
4
4
2
-2147483648 ~ 2147483647
0 ~ 4294967295
0 ~ 65535
int
float
double
4
4
8
0 ~ 4294967295
3.4E-38 ~ 3.4E+38
1.7E-308 ~ 1.7E+308
*可使用 sizeof ( ) 來求出資料型態在記憶體中的儲存長度(bytes)。
Java 各種資料型態的儲值範圍
Numeric Data Types
Name
Domain
Storage size
8-bit signed
-27 ~ 27-1
byte
16-bit signed
-215 ~ 215-1
short
32-bit signed
-231 ~ 231-1
int
64-bit signed
-263 ~ 263-1
long
-3.4E38~3.4E38 32-bit IEEE-754
float
-1.7E308~1.7E308 64-bit IEEE-754
double
16 bits
0~ 216-1 (65535)
char
16 bits
true or false
boolean
Operator Precedence chart
Precedence
Operator
Highest 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
Java print() & println()的使用範例(1)
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");
line 1line 2
line 3
line 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
ca
c
:
cackup
cacku
cack
cac
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;
b=a+5+b;
a--:先參與運算後,再將變數(a)的值減1。 b=b-1;
例如:int a=10, b=20;
解讀規則:
1)先做前置運算
2)計算敘述結果
3)進行後置運算
1) b = ++a +5+ b--;
a=11; b=35;
2) a = a++ + 9;
a=20; b=20;
3) b = (b++) + (++a);
a=11; b=32;
4) a = (a--)*(++b);
a=209; b=21;
It’s another story in Java.
1) 各變數的前置運算先作
2) 計算此時右邊的結果(暫存)
3) 接著處理需後置運算的變數
4) 最後把 2) 得到的結果,代入左邊的變數
例如:int a=10, b=20;
1) b = ++a +5+ b--;
a=11; b=36;
2) a = a++ + 9;
a=19; b=20;
3) b = (b++) + (++a);
a=11; b=31;
4) a = (a--)*(++b);
a=210; b=21;
a=a+1;
k=a+5+b;
b=b-1;
b=k;
if ( 條件式 )
敘述Yes;
if ( 條件式 )
敘述Yes;
else
敘述No;
敘述next;
敘述next;
條件式
no
敘述next
yes
no
敘述Yes
成立才做
條件式
敘述No
yes
敘述Yes
敘述next
其中之
ㄧ
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;
};
no
條件式
yes
敘述No1
敘述Yes1
敘述No2
敘述Yes2
敘述next;
敘述next
複合敘述:誤讀敘述。
if ( 條件式 )
no
條件式
yes
{ 敘述Yes1;
敘述Yes2;
敘述No1
敘述Yes1
}
敘述Yes2
else
敘述No1; // end if
敘述No2;
敘述No2
敘述next;
敘述next
no
條件式1
yes
if ( 條件式1 )
條件式2
敘述No
將左邊流程圖以下列
程式表示,這樣對嗎?
if ( 條件式2 )
yes
{ 敘述Yes21;
敘述Yes22;
敘述Yes21
}
敘述Yes22
else 敘述No;
敘述next;
敘述next
else 會與
最近的if配對
程式碼與對應的流程圖
是描述左圖的程式碼?
no
int a=-1;
a!=0
if ( a!=0 )
yes
a>0
if ( a>0 )
System.out.print(“a>0\n”);
else
no
printf(“a=0\n”)
System.out.print(“a=0\n”);
What is the output ?
a=0
敘述next
yes
printf(“a>0\n”)
if- else-if………else => 多個條件選一!
條件1
yes
敘述1
no
條件2
no
yes
條件n-1
no
yes
敘述2
敘述n-1
敘述next
敘述n
Transfer score to grade
Score Grade
>=90
A
>=80
B
>=70
C
>=60
D
< 60
E
程式碼對齊:
將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的
配對關係
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”);
for 迴圈 (for loop):
for (初值設定; 條件判斷; 條件變換)
祇會做一次
{ ………..
迴圈內容;
初值設定
};
條件變換
敘述next;
Ex. 求1+2+…+n的值
條件判斷
int n, total=0;
scanf(“%d”, &n);
no
for (k=1; k<=n; ++k )
{ total = total + k; // or total += k;
}
printf(“1+…+%d=%d\n”, n, total);
敘述next
yes
迴圈內容
while-loop:
while ( 條件式 )
{ ………….
迴圈內容;
};
敘述next;
條件式
敘述next;
迴圈內容
no
敘述next
int total=0; k=1;
while ( k<=n )
{ total += k;
++k;
}
yes
條件成立時
才會做迴圈內容
計算1+2+…+n的值
至少做一次
do-while-loop:
迴圈內容
do { ………….
迴圈內容;
};
while ( 條件式 ) ;
敘述next;
相當於下列流程:
條件式
迴圈內容;
while ( 條件式 )
{ ………….
迴圈內容;
};
no
敘述next
do { printf(“Input your password:”);
scanf(“%s”, password);
}
while ( check(password) );
敘述next;
檢查輸入的密碼
yes
switch case => 多個條件選一!
switch ( value )
switch ( value )
value可以是
運算式
{
{
case v1 : 敘述1;
case v1 : 敘述1;
case v2 : 敘述2;
case v2 : 敘述2;
…..
…..
case vk : 敘述k;
case vk : 敘述k;
…..
…..
default : 敘述n;
default : 敘述n;
};
敘述next;
當所有情況
都不符合時
可有可無
};
敘述next;
break;
有break
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”);
value=‘A’
ABCnot ABC
case ‘B’ : printf(“B”);
value=‘B’
BCnot ABC
case ‘C’ : printf(“C”);
value=‘C’
Cnot ABC
default : printf(“not ABC”);
value=‘P’
not ABC
};
敘述next;
Ex. switch-case with break
value=‘A’;
switch (value)
{
value=‘A’
A
case ‘B’ : System.out.print(“B”);
value=‘B’
BC
case ‘C’ : System.out.print(“C”);
value=‘C’
C
value=‘P’
not ABC
case ‘A’ : System.out.print(“A”);
break;
break;
default
};
敘述next;
: System.out.print(“not ABC”);
break : 跳出迴圈,至敘述next(迴圈後的下一敘述)
continue: 跳至 條件變換 或 條件判斷 處
break可用於for-loop, while, do-while, switch
continue 則用於for-loop, while, do-while
for (k=1; k<10; ++ k)
{ ……….
….. break;
……….
….. continue;
……...
};
while ( a>=1 )
{ ……….
….. break;
……….
….. continue;
……...
};
next-statement;
next-statement;
// break case:
int n, sum=0; // 初值設定
for (n=1; n<=10; ++n)
{ if ( n = = 5 ) break;
sum += n;
sum = 1+2+3+4 = 10
}
// continue case
int n, sum=0;
for (n=1; n<=10; ++n)
{ if ( n = = 5) continue;
sum += n;
}
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
1
0
0
0
1
0
1
|
0
1
0
0
1
1
1
1
^
0
1
0
0
1
1
1
0
0&A=0
具reset的作用
1&A=A
能把bit設成0
0|A=A
具set的作用
1|A=1
能把bit設成1
0^A=A
具inverse的作用
1 ^ A = ~A
能把bit設成反相
位元的運算: & | ^ ~ << >>
A
0
1
~A 1
0
將A逐位元的反相
XOR (互斥或):
XOR (互斥或):
相等時為 0;不相等時是1
可做簡易的
加密編碼
位元的運算例子 (1/2)
若 A = 0xD3 = (1101 0011)2
a) 將 bit4 設成 0:
1
1
1
0
0
1
1
利用& (and)運算
A = A & 0xEF;
b) 將 bit3 設成1:
0
1
1
1
0
1
1
1
1
1
1
0
1
0
0
1
1
0
0
利用| (or)運算
A = A | 0x08;
0
0
0
0
1
0
位元的運算例子 (2/2)
若 A = 0xD3 = (1101 0011)2
c) 將 high nibble反相:
1
(nibble: 4 bits)
1
1
0
0
1
1
利用^ (xor)運算
A = A ^ 0xF0;
d) 保留 low nibble:
0
1
1
1
1
0
0
0
0
1
1
0
1
0
0
1
1
1
1
利用& (and)運算
A = A & 0x0F;
0
0
0
0
1
1
位元的右、左移
N = 0xA7
1
0
1
0
0
1
1
1
N = N>>1
0
1
0
1
0
0
1
1
補零
N = 0xA7
注意!符號位元可能會被改變!
1
0
1
0
0
1
1
1
0
1
0
0
1
1
1
0
N = N<<1
補零
A>>1:A除以2,並且去餘數。
A<<1:A乘以2,但有可能超過數值的範圍或導致變號。
可利用上述的特性,來加快數值的計算!
例如:a = 5*a; => a = (a<<2)+a; // a=a*4+a;
課堂練習
1) 9 x 9 乘法表。
2) 隨機產生一個陣列並排序。
3) 輸入成績並列出等級:
>=90 : A;
>=80 : B;
>=70 : C;
>=60 : D;
else F。
課堂練習
1) 輸入三個科目的成績,計算總平均並統計有幾科不及格。
2) 可選擇計算矩形或圓形的面積。
3) 輸入一元二次方程式:ax2 + bx + c = 0 的係數a、b、c,
並計算 x 的值。
4) 畫出sin(x)的圖形。(使用Applet)
(Math.sin(x), x:為徑度(radian) =180 / 3.141592653度 )