Upload
tranthu
View
263
Download
3
Embed Size (px)
Citation preview
บทท 2
ภาษา Java พนฐาน Java Language Fundamentals
เนอหาในบทนกลาวถงรปแบบการเขยนภาษา Java เครองหมายการท างาน (Operator) ชนดของขอมล การเขยนโปรแกรมท าซ า และค าสงเงอนไข
การเขยนค าอธบายในโปรแกรมภาษา Java
การเขยนโปรแกรมโดยทวไป ผเขยนโปรแกรมควรแทรกค าอธบายไวในตวโปรแกรมดวย เพอใหผอานโปรแกรมเขาใจโปรแกรมไดงาย การเขยนค าอธบายหรอ Comments ในภาษา Java ม 3 แบบคอ
1. In-line Comments เปนการแทรกค าอธบายโปรแกรมภายในหนงบรรทด ใชเครองหมาย “//” เปนจดเรมตนการเขยนค าอธบาย และสนสดเมอจบบรรทด การอธบายแบบนเหมอนการเขยนค าอธบายในภาษา C++
2. Block Comments เปนการแทรกค าอธบายเปนกลม หรอหลายบรรทด ใชเครองหมาย “/*” เปนจดเรมตนและเครองหมาย “*/” เปนจดสนสดค าอธบาย รปแบบการเขยนค าอธบาบแบบนเหมอนการเขยนค าอธบาบในภาษา C
3. Javadoc Comments เปนค าอธบายทถกสรางเปนรปแบบภาษา HTML โดยโปรแกรม javadoc ใชเครองหมาย “/**” เปนจดเรมตน และเครองหมาย */ เปนจดสนสดการเขยนค าอธบาย (ส าหรบการเขยน Javadoc Comments ผอานควรมความรเรองการเขยนโปรแกรมแบบเชงวตถกอน ดงนนจะกลาวถงการเขยน Javadoc Comments ในบทท 3 ตอไป)
ตวอยางการเขยนค าอธบายโปรแกรมแบบ In-line และ Block แสดงดงตอไปน
// This is an in-line comment. This looks like C++ comment style.
// You can write many comments as you would like to
// But the beginning of the line must include “//”
/* This is a block comment.
Anything you can put here.
The compiler will ignore everything in this block.
This comment looks like C comment style.
*/
In-line comment
Block comment
10 การเขยนโปรแกรมภาษา Java
Keywords ค าหลกเปนค าทภาษา Java ไดก าหนดขนมาเพอใชในวตถประสงคทตางกนในการเขยนโปรแกรม เชน
ค าหลก boolean ใชในการประกาศตวแปรชนดตรรกะ หรอค าหลก new ใชในการสรางวตถจากคลาสเปนตน ค าหลกเหลานไมสามารถน าไปตงเปนชอคลาส ตวแปร หรอ Method ได ดงตารางท 2.1
ตารางท 2.1 แสดงถง 49 ค าหลกในภาษา Java (คา true, false และ null ไมใชค าหลกใน Java)
abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
Identifier
การตงชอคลาส หรตวแปร ตองมกฎเกณฑตามทภาษา Java ก าหนดไว ซงชอดงกลาวเรยกวา Identifier ตวอยางของ Identifier ในภาษา Java เชน TestFruit หรอ total_cal
กฎการตงชอของ Identifier มดงน Identifier ตองขนตนดวยตวอกษร เครองหมาย “$” หรอเครองหมาย “_” เทานน ส าหรบตวเลข “0” ถง “9” สามารถใชไดแตตองไมใชตวแรกของ Identifiers หามมชองวางใน Identifiers และหามตงชอตรงกบค าหลก (Keywords) ในภาษา Java ดวย ดงตวอยาง Identifier ทถก Identifier ทผด TestFruit Test Fruit (มชองวาง) Good_Morning Good Morning (มชองวาง) Test1 1Test (ตวเลขไมสามารถขนตนได) $age #age (# ไมสามารถขนตนได) _OK true (เปนคาของ Boolean ในภาษา Java) ตวแปร (Variable) ตวแปรใชในการเกบขอมล ชอของตวแปรตองเปน Identifier ดวย การประกาศตวแปรในโปรแกรม (Variable Declaration) จะมรปแบบดงน
Data Type Identifier [, Identifier];
การเขยนโปรแกรมภาษา Java 11
Data Type Data Type คอชนดของขอมลในตวแปรซงแบงเปน 2 ประเภทคอ Primitive และ Reference ซงมความ
แตกตางกน แตมความส าคญในในการเขยนโปรแกรมภาษา Java เทาเทยมกน Primitive เปน Data Type พนฐานในภาษา Java ซงสามารถเกบคาไดเพยงคาเดยวและมขนาดทแนนอน
เชน เลขจ านวนเตม (Integer) เลขทศนยม (Floating Point) ตวอกษร (Character) หรอ คาจรงและเทจ (Boolean) 1. Data Type ชนดตวเลขคอ byte, short, int และ long 2. Data Type ชนดทศนยมคอ float และ double 3. Data Type ชนดตวอกษรคอ char 4. Data Type ชนดจรงและเทจคอ boolean
ตารางท 2.2 แสดง Data Type ชนดตางๆ
Keywords ค าอธบาย ชวงขอมล แบบตวเลข
byte Two’s Complement 8 บต -128 ถง 127 short Two’s Complement 16 บต -32,768 ถง 32,767 int Two’s Complement 32 บต -2,147,483,648 ถง
2,147,483,647 long Two’s complement 64 บต -263 ถง 263-1
แบบทศนยม float IEEE 754 32 บต -3.4E38 ถง 3.4E38 double IEEE 754 64 บต -1.7E308 ถง 1.7E308
แบบตวอกษร char 16 บต 65,536 ตวอกษร
แบบคาจรงและเทจ boolean 1 บต true และ false
การเลอกชนดของ Data Type ขนอยกบลกษณะของโจทยปญหาและชวงคาของขอมลทตองการเกบขอมล เชนโปรแกรมการบวกเลขสองหลก ถาประกาศตวแปรเปนแบบ byte อาจไมเหมาะสม เพราะถาตวเลขสองตวเปน 99 และ 98 ท าใหผลรวมเปน 197 ซงเกนคาสงสดทตวแปรชนด byte จะเกบไดดงตารางท 2.2 ดงนนตวแปรแบบ short จงมเหมาะสมมากกวาส าหรบโปรแกรมบวกเลขสองหลก ไมมความจ าเปนทตองใชตวแปรชนด long เพราะคาของตวแปรชนด long สามารถเกบคาตวเลขจ านวนเตมไดสงเกนกวาผลลพธทเปนไปไดของโปรแกรมบวกเลขสองหลก และอาจสงผลใหโปรแกรมท างานไดชาลง เพราะการบวกขอมลทจ านวนบตมาก ท างานไดชากวาการบวกขอมลทมจ านวนบตนอย ดงนนการเลอกชนดของตวแปรควรพจารณาถงขอบเขตคาทตองการเกบขอมลและโจทยปญหาเปนหลก ตวอยางของการประกาศตวแปรแบบ Primitive คอ int integer;
char ch;
12 การเขยนโปรแกรมภาษา Java
float f;
boolean b;
//ในกรณทประกาศตวแปรชนดเดยวกนเปนจ านวนมาก สามารถใชเครองหมาย “,” ในการคนได int i, j, k, l, m, n, o, p, q, u, r;
ตวแปรแบบทสองคอ Reference ซงเปนตวแปรแบบตวช (Pointer) ไปทวตถ ตวแปรประเภทนมความซบซอนมากกวาแบบแรก Primitive เนองจากเปนตวแปรทอางถงกลมของตวแปรแบบ Primitive ในภาพท 2.1 แสดงตวอยางของการใชตวแปรแบบ Reference // สรางตวแปรชนด Reference ชอ MyHouse ซงเปนชนด House ซงตวแปรนยงไมสามารถน าไปใชได House MyHouse;
// สรางวตถ House และให MyHouse ชไปทวตถ House MyHouse = new House(“Wooden”);
MyHouse เปน Data Type แบบ Reference เพราะท าหนาทเปนตวชเทานน ถามการประกาศตวแปร House MyHouse; เพยงเทาน ตวแปร MyHouse ยงไมสามารถน าไปใชไดเพราะ MyHouse ชไปท Null (ไมมคา) ดงนนตองใชค าสง new เพอท าการสรางวตถบานขนมากอน และให MyHouse ชไปทวตถนน (บทท 3 จะกลาววธการใชงานตวแปรประเภทนโดยละเอยด)
ภาพท 2.1 แสดงตวอยางการสรางตวแปรแบบ Reference
การเขยนคาในตวแปร (Literals) คาของตวแปรมทงหมด 5 ประเภทคอ Integer, Floating Point, Character, String, และ Boolean Literals ซงสามารถเกบขอมลทแตกตางกน Integer literals การเขยนคาแบบเลขจ านวนเตม สามารถเขยนได 3 แบบคอ
1. แบบเลขฐานสบ เชน 3 หรอ 3L 2. แบบเลขฐานแปด ขนตวดวยเลขศนย เชน 03 หรอ 03L 3. แบบเลขฐานสบหก ขนตนดวยเลขศนยและเอกซ เชน 0xA หรอ 0xAL
MyHouse
House
Object MyHouse
Null House MyHouse;
MyHouse = new House(“Wooden”);
การเขยนโปรแกรมภาษา Java 13
การค านวณตวเลขจ านวนเตมในภาษา Java ถาไมมการระบชนดตอทายตวเลข มการค านวณแบบ 32 บตหรอ Integer เทานน การใสคา และค านวณตวแปรทเปนชนด 64 บตหรอ Long จ าเปนตองเขยน L หรอ l ลงทายทกครงเสมอ เพอใหตวแปรภาษา Java เปลยนคาจาก Integer เปน Long long a = 2147483647; // ไมเกด Error เมอมการผานตวแปลภาษา เพราะจ านวนตวเลขไมเกนคาท // Integer สามารถเกบได long b = 2147483648; // เกด Error เพราะตวเลขมคาเกนคาสงสดท Integer เกบคาได long c = 214748648L; // ไมเกด Error เพราะมการเขยน L ลงทายเพอบอกใหตวแปลภาษา // เปลยนคา Integer เปน Long /* Error เมอผานตวแปลภาษา Java เพราะ a+b เปนการบวกแบบ 32 บตตามขอก าหนดของ Java เนองจากไมมการระบชนดตอทายขอมล ท าใหไมสามารถใหตวแปร a ไปเทากบ a+b ได เนองจาก a+b ผลลพททไดเปนคา Integer */ byte a = 3, b = 5;
a = a + b; /* ถกตอง การทก าหนดตวแปร Byte ใหเทากบ Integer ตองใส (byte) เพอบอกใหตวแปรภาษาเปลยนขอมลจากการบวก 32 บตใหเทากบตวแปรขนาด 8 บต ซงอาจเสยความแมนย า (Loss of Precision) บางสวน */ a = (byte) (a + b);
Floating point literals การค านวณตวเลขทศนยมในภาษา Java ใชการค านวณแบบ 64 บตหรอ Double ดงนนการใสคาใหตวแปรทเปน Float ตองเขยนลงทายดวย F หรอ f และตวแปรทเปนชนด Double ตองลงทายดวย D หรอ d แตไมจ าเปนตองเขยนกได เพราะการค านวณตวเลขทศนยมในภาษา Java โดยปกตเปน Double
ตวอยางของ Float Literals คอ 2.0F 3.f 5e7f 0.4e+38f ตวอยางของ Double Literals คอ 2.0 3. 3e-7 .9E+200
double m = 2.3; // ถกตอง /* ผด ตองเขยน f ตอทายตวเลข เนองจากไมสามารถก าหนดคา Double ใหเทากบ Float ได เพราะ Float มขนาดเลกกวา */ float f = 2.3; float k = 2.3f; // ถกตอง
14 การเขยนโปรแกรมภาษา Java
การประกาศตวแปรทเปน Float เมอมการใสคาใหกบตวแปรจะตองเขยนตวอกษร F หรอ f ดวยทกครง เพอใหตวแปลภาษาสามารถเปลยนคาจาก Double เปน Float เพราะการค านวณทศนยมโดยปกตเปนแบบ 64 บต หรอ Double ดงทกลาวไปแลว float a = 3; // ไมเกด Error เมอมการผานตวแปลภาษา Java float b = 3.0f; // ถกตอง จากตวอยางขางบน float a = 3; ไมเกด Error เพราะเลข 3 หมายถงตวเลขจ านวนเตมทมขนาด 32 บต การใสคาตวเลข Integer 32 บต ใหกบตวแปรชนด Float สามารถท าไดเพราะมขนาดเทากน แตถาตวเลขมจดทศนยมเมอใด ตวแปรภาษาจะมองตวเลข 3.0 เปนแบบ Double 64 บต ดงนนจ าเปนตองเขยน f หลงตวเลข Character literals การเขยนขอมลชนดตวอกษร ตองเขยนอยในเครองหมาย ‘ (Single Quotation Mark) ตวอยางเชน ‘c’ และ ‘A’ และขอมลชนดทเปนตวอกษรนนสามารถเขยนโดยใช Escape Character (เครองหมาย \) น าหนาไดดงตารางท 2.3
ตารางท 2.3 แสดงความหมายของตวอกษรทใช Escape Character เครองหมาย ค าอธบาย เครองหมาย ค าอธบาย \n ขนบรรทดใหม
(New line) \t ตวอกษรตงระยะ
(Tab) \r เลอน Cursor ไป
จดเรมตนของบรรทด (Carriage return)
\’ พมพเครองหมาย ‘
\b ลบตวอกษรทางซายมอ 1 ตวอกษร (Backslash)
\\ พมพเครองหมาย \
\” พมพเครองหมาย “ \uxxx xxx เปนเลขฐานสบหก ตวอยางเชน ‘\u3f5f
\ooo ooo เปนเลขฐานแปด ตวอยางเชน ‘\12’
\f ตวอกษร Form Feed
ตวอยางของการเขยนคาใหตวแปรแบบ Character char ch = ‘c’; // เทากบตวอกษร c ch = ‘A’; // เทากบตวอกษร A ch = ‘\n’; // เทากบ ตวอกษรขนบรรทดใหม ch = ‘\\’ // เทากบเครองหมาย \ ch = ‘\’’; // เทากบเครองหมาย ‘
การเขยนโปรแกรมภาษา Java 15
String literals การเขยนขอมลตวอกษรทมากกวา 1 ตว หรอประโยค ขอมลนนตองอยภายในเครองหมาย “ (Double Quotation Mark) ดงตวอยาง String str = “สวสดครบ”; str = “สวสดครบ\n”; // ตวอกษรในตาราง 2.3 สามารถน ามาเขยนเปนประโยคได เชน \n str = “”; // ตวแปร str เปน String ทมตวอกษร 0 ตว str = “สบายดไหมครบ \u3f07 \n”; // สามารถใชเลขฐาน 16 ในประโยคของ String ได /*เครองหมาย + จะรวม 2 Strings เปน String เดยวกน เรยกวาการ String Concatenation */ str = “Hello” + “ How are you?”;
Boolean literals มสองคาคอ true และ false คา Boolean ใชบอยครงในภาษา Java เพอควบคมการเขยนโปรแกรมแบบวนซ า (Loop) และแบบเงอนไข (If Statement) ซงจะกลาวถงในชวงทายบท boolean yes = ture; boolean no = false; Operator ภาษา Java ไดแบงรปแบบการค านวณ (Operator) เปน 5 แบบคอ
1. Arithmetic Operators 2. Relational and Conditional Operators 3. Shift and Logical Operators 4. Assignment Operators 5. Miscellaneous Operators
1. Arithmetic Operators เปนเครองหมายทใชในการค านวณแบบ Arithmetic คอ + - * / % การเขยนนพจนของการค านวณแบงเปน 3 แบบคอ แบบ Infix เชน Operand1 + Operand2 แบบ Prefix เชน ++Operand และสดทายแบบ Postfix เชน Operand++ โปรแกรม Arithmetic.java แสดงการใชงาน Arithmetic Operators public class Arithmetic {
public static void main(String[] args) {
int a = 30, b = 20;
double x = 100.99, y = 20.78;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("a+b = " + (a+b));
System.out.println("a-b = " + (a-b));
System.out.println("a*b = " + (a*b));
System.out.println("a/b = " + (a/b)); // ผลหารทเปนจ านวนเตม
16 การเขยนโปรแกรมภาษา Java
System.out.println("a%b = " + (a%b)); // เศษทเหลอจากการหาร
System.out.println(""); System.out.println("x = " + x); System.out.println("y= " + y);
System.out.println("x+y = " + (x+y));
System.out.println("x-y = " + (x-y));
System.out.println("x*y = " + (x*y));
System.out.println("x/y = " + (x/y)); // ผลหารทเปนทศนยม
System.out.println("x%y = " + (x%y)); // เศษทเหลอจากการหาร
}
}
---------- Java Output ----------
a = 30
b = 20
a+b = 50
a-b = 10
a*b = 600
a/b = 1
a%b = 10
x = 100.99
y= 20.78
x+y = 121.77
x-y = 80.21
x*y = 2098.5722
x/y = 4.859961501443696
x%y = 17.86999999999999
การเขยนนพจนแบบ Prefix และ Postfix ใชในการเพมคาหรอลดคาใหกบตวแปรซงการเพมคาใชเครองหมาย ++ และการลดคาใหตวแปรใชเครองหมาย – การวางเครองหมายเหลาน สามารถวางไวหนาตวแปร (Prefix) และหลงตวแปร (Postfix) ได ตวอยางเชน i++ และ ++i เมอจบค าสงแลว คา i ทไดจะมคาเทากน ยกเวนในกรณทมการ Assign คาตวแปร (การใหคาในตวแปรดานขวามอเทากบดานซายมอ เชน a = b ท าให a มคาเทากบ b) ผลลพธทเกดจากการ Assign คาตวแปรจะไมเทากน ดตวอยางโปรแกรม ShortcutOperator.java ประกอบความเขาใจ public class ShortcutOperator {
public static void main(String[] args) {
int i = 5;
int j;
System.out.println("i = " + i);
j = i++; // j เทากบ 5 และ i เทากบ 6
System.out.println("j = i++ Value j = " + j );
System.out.println("Value i now= "+ i);
j = ++i; // j เทากบ 7 และ i เทากบ 7
System.out.println("j = ++i Value j = " + j );
System.out.println("Value i now= "+ i);
}
}
---------- Java Output ----------
i = 5
การเขยนโปรแกรมภาษา Java 17
j = i++ Value j = 5
Value i now= 6
j = ++i Value j = 7
Value i now= 7
จากตวอยางโปรแกรม ShortcutOperator.java การ Assign คาใหกบตวแปรโดยใช Postfix j = i++ ท าให j มคาเทากบ i และเมอจบค าสง คา i จะเพมอก 1 สวนการ Assign คาใหกบตวแปรโดยใช Prefix j = ++i ท าใหมการเพมคา i อก 1 กอนทจะ Assign คาใหกบ j 2. Relational and Conditional Operators การค านวณแบบเปรยบเทยบหรอ Relational จะพจารณาความสมพนธระหวาง Operand 2 คา และสงคาผลลพธเปน true หรอ false จากตารางท 2.4 แสดงใหเหนความความสมพนธระหวาง Operand1 และ Operand 2 ถา op1 Operator op2 เปนจรง ผลลพธทไดคอคา true ถาไมจรง ผลลพธทไดจะเปนคา false ดงตวอยางในโปรแกรม Relational.java
ตารางท 2.4 แสดงเครองหมายทใชในการค านวณแบบ Relational Operator การใชงาน สงคา true กลบถา
> op1 > op2 op1 มากกวา op2 >= op1 >= op2 op1 มากกวาหรอเทากบ op2 < op1 < op2 op1 นอยกวา op2 <= op1 <= op2 op1 นอยกวาหรอเทากบ op2 == op1 == op2 op1 เทากบ equal != op1 != op2 op1 ไมเทากบ op2
public class Relational {
public static void main(String[] args) {
int i = 10;
int j = 20;
System.out.println("i = "+ i + " j = " + j);
System.out.println("i>j "+ (i>j));
System.out.println("i<j "+ (i<j));
System.out.println("i>=j "+ (i>=j));
System.out.println("i<=j "+ (i<=j));
System.out.println("i==j "+ (i==j));
System.out.println("i!=j "+ (i!=j));
}
}
---------- Java Output ----------
i = 10 j = 20
i>j false
i<j true
i>=j false
i<=j true
i==j false
i!=j true
18 การเขยนโปรแกรมภาษา Java
การค านวณโดยใช Relational Operator สามารถเปรยบเทยบความสมพนธระหวาง 2 Operands เทานน ในกรณทมการเปรยบเทยบมากกวา 2 Operands จ าเปนตองใช Conditional Operator มาเชอม จากตารางท 2.5 op1 และ op2 คอนพจนแบบ Relational Operator เชน
(i<3) && (j > 5) จะสงคาจรงกลบ ในกรณท i < 3 และ j > 5 (i<3) || (j>5) จะสงคาจรงกลบ ในกรณท i < 3 หรอ j > 5 !hello จะสงคาจรงกลบ ในกรณทตวแปร hello เปนเทจ เครองหมาย ! สวนใหญใชใน
การทดสอบเงอนไขในค าสง if
ตารางท 2.5 แสดงเครองหมายทใชในการค านวณแบบ Conditional Operator การใชงาน สงคา true กลบถา
&& op1 && op2 op1 และ op2 เปนจรง || op1 || op2 op1 หรอ op2 เปนจรง ! ! op op เปนเทจ
โปรแกรม Conditional.java แสดงตวอยางการใช Conditional Operator
public class Conditional {
public static void main(String[] args) {
int i = 5; int j = 10;
boolean result;
System.out.println("i = " + i);
System.out.println("j = " + j);
result = (i <=5 ) && (j>=10);
System.out.println("(i <=5) && (j>=10) " + result);
result = (i <6 ) || (j>20);
System.out.println("(i <6) || (j>20) " + result);
result = (i <3 ) && (j>2);
System.out.println("(i <3) && (j>2) " + result);
result = (i >6 ) || (j>20);
System.out.println("(i >6) || (j>20) " + result);
boolean hello = true;
System.out.println("Value of hello is " + hello);
System.out.println("Value of !hello is " + !hello);
}
}
---------- Java Output----------
i = 5
j = 10
(i <=5) && (j>=10) true
(i <6) || (j>20) true
(i <3) && (j>2) false
(i >6) || (j>20) false
Value of hello is true
Value of !hello is false
การเขยนโปรแกรมภาษา Java 19
3. Shift and Logical Operators เปน Operator ทใชกบตวแปรชนดตวเลขจ านวนเตมเทานน ซงประกอบดวย char, byte, short, integer และ long ตวแปรชนดอน เชน float หรอ boolean ไมรองรบการท างานของ Operator แบบนได ตารางท 2.6 แสดงค าอธบายเครองหมาย Shift and Logical Operators การ Shift ขวา แบงเปน 2 ชนดคอ Arithmetic Shift (สนใจเครองหมาย Sign) และ Logical Shift (ไมสนใจเครองหมาย Sign) การ Shift ขวาแบบ Arithmetic นน บตดานซายมอสดหรอ Most Significant Bit (MSB) ถกน ามาใชในการ Shift ดวย ตวอยางเชน คา 1111 0000 เมอ Shift ดานขวาหนงบต ไดผลลพธเปน 1111 1000 การทบต 1 หรอ 0 ถก Shift เขามาแทนทบตดานซายมอนน ขนอยกบบต MSB วาเปนคา 1 หรอ 0 ถาเปนคา 1 คา 1 ถก Shift เขามาแทนท ในกรณทบต MSB เปน 0 คา 0 จะถก Shift เขามาแทนท ตรงขามกบการ Shift ขวาแบบ Logical บต MSB ไมถกน ามาใชในการ Shift ดงนน ค าตอบทไดเปน 0111 1000 การ Shift แบบ Logical บตทน าเขามาแทนทจะเปนคา 0 เสมอ การ Shift ซาย เปนแบบ Logical Shift เทานน หมายความวาทกครงเมอมการ Shift คา 0 ถกน าแทนทบตดานขวามอสด ดงตวอยาง 0101 1101 เมอมการ Shift ซาย ผลลพธทไดเปน 1011 1010 Operator แบบ Logical นน ม 4 แบบคอ AND, OR, XOR และ Complement ตารางท 2.8 แสดงการท างานของ Logical Operators เปนแบบบตตอบต 1111 0000 Complement 0000 1111 0100 1011 0100 1100 1110 1010 AND OR XOR 1101 1100 1011 0011 1010 1001 0100 1000 1111 1111 0100 0011
ตารางท 2.6 แสดงเครองหมายทใชในการค านวณแบบ Shift และ Logical Operator การใชงาน ผลลพธ ชนด
>> op1 >> op2 เลอนทกบตไปดานขวาเปนจ านวนเทากบ op2 ครง (Arithmetic Shift )
Shift
<< op1 << op2 เลอนทกบตไปดานซายเปนจ านวนเทากบ op2 ครง
Shift
>>> op1 >>> op2 เลอนทกบตไปดานขวาเปนจ านวนเทากบ op2 ครง โดยไมตองพจารณา Sign บต (Logical Shift) สามารถใชไดกบขอมลทเปน Integer และ Long เทานน
Shift
& op1 & op2 Bitwise AND Logical | op1 | op2 Bitwise OR Logical
20 การเขยนโปรแกรมภาษา Java
Operator การใชงาน ผลลพธ ชนด ^ op1 ^ op2 Bitwise XOR Logical ~ ~op2 Bitwise Complement Logical
ตารางท 2.7 แสดงผลลพธทเกดจาก Logical Operators ทง 4 แบบ
op1 op2 & op1 op2 | op1 op2 ^ op ~ 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0
โปรแกรม Shift.java แสดงตวอยางการใช Shift Operator ในโปรแกรมนมการใช Method ใหมชอวา Integer.toBinaryString(int i) ในคลาส Integer เปนคลาสทมอยแลวในภาษา Java สงเกตวา ตวอกษร I ในค า Integer จะเปนตวใหญ การท างานของคลาส Integer เหมอนกบ int ทกประการ ยกเวนคลาส Integer เปน Data Type แบบ Reference หรอ Object คลาส Integer จะม Method มากมาย ผอานสามารถเปดดไดใน API Specification ของภาษา Java (Download Java API Specification ไดท http://java.oracle.com)
Method ทชอ toBinaryString() ท าหนาทเปลยนคาตวเลขจ านวนเตมเปน String ของเลขฐานสอง ในกรณทตวเลขมคาตดลบ toBinaryString() จะเปลยนเปน String ของเลขฐานสองจ านวน 32 บต แตถาตวเลขเปนคาบวก Method toBinaryString() เปลยนเปน String ของเลขฐานสอง โดยไมแสดงบตทมคาเปนศนยซายมอ (No extra leading 0s) ดงตวอยาง
127 ฐานสองมคาเปน 0000 0000 0000 0000 0000 0000 0111 1111 ถาใช toBinaryString(127) ผลลพธทไดมคาเปน 111 1111 โดยจะตดบตทมคาเปนศนยทงหมดดานซายมอ
-127 ฐานสองมคาเปน 1111 1111 1111 1111 1111 1111 1000 0001 ถาใช toBinaryString(-127) ผลลพธทไดมคาเหมอนเดม public class Shift {
public static void main(String[] args) {
int value=-1;
System.out.println(“value in base10 = -1”);
System.out.println(“base2 = ” + Integer.toBinaryString(value));
System.out.println(“value after left shift 10 times <<”);
System.out.println(“value = ” + Integer.toBinaryString(value<<10) +\n”);
value = -500000;
System.out.println(“value in base10 = -500000”);
System.out.println(“base2 ” + Integer.toBinaryString(value));
System.out.println(“value after arthmetic right shift 5 times >>”);
System.out.println(“value = "+ Integer.toBinaryString(value>>5) + “\n”);
value = 127;
System.out.println("value in base10 = 127”);
การเขยนโปรแกรมภาษา Java 21
System.out.println(“base2 = ” + Integer.toBinaryString(value));
System.out.println(“value after logical right shift 2 times >>>”);
System.out.println(“value = ” + Integer.toBinaryString(value>>>2) + “\n”);
value = -20000000;
System.out.println(“value in base10 = -20000000”);
System.out.println(“base2 =” + Integer.toBinaryString(value));
System.out.println(“value after logical right shift 8 times >>>”);
System.out.println(“value = ” +Integer.toBinaryString(value>>>8));
} }
---------- Java Output----------
value in base10 = -1
base2 = 11111111111111111111111111111111
value after left shift 10 times <<
value = 11111111111111111111110000000000
value in base10 = -500000
base2 = 11111111111110000101111011100000
value after arthmetic right shift 5 times >>
value = 11111111111111111100001011110111
value in base10 = 127
base2 = 1111111
value after logical right shift 2 times >>>
value = 11111
value in base10 = -20000000
base2 = 11111110110011101101001100000000
value after logical right shift 8 times >>>
value = 111111101100111011010011
ขอควรระวงในการใช Right Shift แบบ Logical ส าหรบตวแปรทเปนชนด Byte และ Short
พจารณาตวอยางโปรแกรมตอไปน
byte b = -1; // มคาเทากบ 1111 1111 b = (byte) (b>>>10);
System.out.println(b);
ผลลพธควรเปน 0 เพราะตวแปร Byte มขนาด 8 บต เมอใชการ Shift ขวาแบบ Logical หมายความวา
บตศนยถกน ามาแทนทบตดายซายมอเปนจ านวน 10 บต ดงนนค าตอบทไดนาจะเปนคาศนย แตผลลพธทไดจรงจากโปรแกรมมคาเปน -1 เหมอนเดม เนองจากการท างานของตวเลขจ านวนเตมใน Java เปน 32 บต ดงนนค าสง (byte) (b>>>10) คาของตวแปร b จะถกเปลยนเปน 32 บตกอน แลวจงเรม Shift ขวาแบบ Logical สดทายเปลยนคากลบเปนตวแปรชนด byte ดงตวอยาง
-1 เลขฐานสองคอ 1111 1111 1111 1111 1111 1111 1111 1111 Shift ขวาแบบ Logical 10 บต ผลลพธทไดเปน 0000 0000 0011 1111 1111 1111 1111 1111 เปลยนคากลบเปน Byte ดงนน b เทากบ 1111 1111 ท าใหผลลพธทไดจากโปรแกรมมคาเปน -1 เหมอนเดม
22 การเขยนโปรแกรมภาษา Java
ถาตองการ Shift ขวาแบบ Logical ส าหรบขอมลทเปน byte เครองหมาย >>> ไมสามารถใชได ควรเลยงมาใชเครองหมาย >> และ & ดงตวอยาง
byte b = -2; // คาเลขฐานสองคอ 1111 1110
b = (byte) ((b & 0xFF) >> 4); // คาเลขฐานสองคอ 0000 1111
เครองหมาย & คอ Bitwise AND เรมตนตวแปร b ถกเปลยนเปน 32 บต ซงมคาเปน 0xFFFFFFFE และ
AND กบ คา 0x000000FF ผลลพธทไดเปน 0x000000FE แลวจง Shift ขวาเปน Arithmetic 4 บต ไดค าตอบเปน 0x0000000F ซงถกตอง ส าหรบโปรแกรม Bitwise.java แสดงตวอยางการใชงาน Bitwise Operators public class Bitwise {
public static void main(String[] args) {
int op1 = 0xffffffff;
int op2 = 0x000000ff;
System.out.println(“op1 = ” + Integer.toHexString(op1) );
System.out.println(“op2 = ” + Integer.toHexString(op2) );
System.out.println();
System.out.println(“op1 & op2 = ” + Integer.toHexString(op1 & op2) );
System.out.println(“op1 | op2 = ” + Integer.toHexString(op1 | op2) );
System.out.println(“op1 ^ op2 = ” + Integer.toHexString(op1 ^ op2) );
System.out.println(“~op2 = ” + Integer.toHexString(~op2) );
}
}
---------- Java Output----------
op1 = ffffffff
op2 = ff
op1 & op2 = ff
op1 | op2 = ffffffff
op1 ^ op2 = ffffff00
~op2 = ffffff00
4. Assignment Operators (เครองหมาย =) เปนเครองหมายทใชในการ Assign คาใหกบตวแปร ส าหรบในภาษา Java อนญาตใหผเขยนโปรแกรมสามารถใช Shortcut Assignment ได ซงเปนวธการ Assign คาใหกบตวแปรแบบยอ ตารางท 2.8 แสดงวธการใช Shortcut Assignment
ตารางท 2.8 แสดงวธการใช Shortcut Assignment Operator รปแบบ เทากบ += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 - op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2
การเขยนโปรแกรมภาษา Java 23
Operator รปแบบ เทากบ |= op1 |= op2 op1 = op1 | op2 ^= op1 ^= op2 op1 = op1 ^ op2 <<= op1 <<= op2 op1 = op1 << op2 >>= op1 >>= op2 op1 = op1 >> op2 >>>= op1 >>>= op2 op1 = op1 >>> op2
5. Miscellaneous Operators แบงเปน 5 แบบ คอ
5.1 เ ค ร อ ง หม า ย ? : ใ ช ใ น ก า ร เ ป ร ย บ เ ท ย บ เ ง อ น ไ ข ร ป แ บบก า ร เ ข ย น เ ป น Condition ? Value when condition true : Value when condition false
System.out.println( 2>3 ? "Yes" : "No"); // ผลลพธเปน No System.out.println( 2<3 ? "Yes" : "No"); // ผลลพธเปน Yes int i = 100>1 ? 200: 300; // ดงนน i = 200
5.2 เครองหมาย [ ] ใชในการประกาศตวแปรทเปน Array เชน int[] a = new int[5]; 5.3 เครองหมาย . ใชในการอางถง Methods หรอ Attributes ในวตถ 5.4 เครองหมาย (type) หรอ Casting โดยท type เปนชนดขอมล ดงตวอยาง
int i = 1000;
short s;
s = (short) i; // การท า Casting 5.5 instanceof เปน Operator ทใชในการทดสอบวาวตถเปนสมาชกของคลาสหรอไม ดงตวอยาง
class Vehicle { }
class Car extends Vehicle{ }
class Convertible extends Car{ }
public class TestInstanceof {
public static void main (String args []){
Convertible Camry = new Convertible();
if (Camry instanceof Vehicle)
System.out.println("Yes, Camry is a vehicle");
if (Camry instanceof Car)
System.out.println("Yes, Camry is a car");
if (Camry instanceof Convertible)
System.out.println("Yes, Camry is a
convertible car");
}
};
---------- Java Output----------
Yes, Camry is a vehicle
Yes, Camry is a car
Yes, Camry is a convertible car
24 การเขยนโปรแกรมภาษา Java
ล าดบการค านวณ Expression คอการน า Operands และ Operators มาเขยนรวมกนเพอใชในการค านวณ ตวอยางเชน
2 * 3 เลข 2 และ 3 คอ Operand สวนเครองหมาย * คอ Operator ดงนน Expression สามารถเปน Arithmetic,
Relational and Conditional, Shift and Logical, Assignment หรอ Miscellaneous Operators ตวอยางเชน i = 3 a + b (i<3) && (j > 5)
ในบางกรณ Expression มความซบซอน เพราะมจ านวน Operators มากกวา 1 เชน 2 * 3 + 5 ในกรณน ใหเรมค านวณจาก Operator ดานซายไปดานขวา ดงนนค านวณคาของ 2 * 3 ไดผลลพธเปน 6 และน าไปบวก 5 เทากบ 11 แตถาเขยนใหมเปน 2 + 3 * 5 และใชวธการค านวณแบบเดม น า 2 + 3 เปน 5 น าไปคณ 5 เทากบ 25 ซงไมถกตอง ค าตอบทถกควรเปน 17 เนองจากเครองหมาย Operators มล าดบความส าคญไมเทากน เครองหมายคณ มล าดบความส าคญสงกวาเครองหมายบวก การค านวณทถกตองคอ น า 3 * 5 ได 15 น าไปบวกกบ 2 ได 17
ผ เ ข ยนโปรแกรมสามารถใช เ คร องหมายวง เล บ เพ อ ให เ กดความชด เจนได ด งต วอย า ง 2 + (3 * 5) เพราะเครองหมายวงเลบมล าดบความส าคญทสงกวาเครองหมายอนๆ สรปล าดบการค านวณ กอนการค านวณตองพจารณาล าดบความส าคญของเครองหมายทใชในการค านวณดวย ถาล าดบความส าคญของการค านวณเทากน ใหค านวณจากดานซายกอน ดภาพท 2.2 ส าหรบตวอยาง 3 + 2 * (5 – 7) / 2 และตารางท 2.9 แสดงล าดบความส าคญของเครองหมาย Operators
ตารางท 2.9 แสดงล าดบความส าคญของเครองหมาย Operators
ความส าคญ เครองหมาย Operator 1 ( ), exp++, exp-- 2 ++exp, --exp, +exp, -exp, ~ 3 New 4 *, /, % (Remainder) 5 +, - 6 <<, >>, >>> 7 <, <=, >, >=, instanceof 8 ==, != 9 & 10 ^ 11 | 12 && 13 ||
การเขยนโปรแกรมภาษา Java 25
ความส าคญ เครองหมาย Operator 14 ? : 15 =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=,
>>=, >>>=
รปท 2.2 ตวอยางล าดบการค านวณ 3 + 2 * (5 – 7) / 2
Casting
การ Casting จ าเปนเมอผเขยนโปรแกรมภาษา Java ตองการ Assign คาส าหรบตวแปรตางชนดกน เชน ตองการใหตวแปรชนด Integer ไปเปน Long ดงตวอยาง
int i = 100;
long p = 1000L;
p = i; // ถกตอง เรยกวา Implicit Casting
i = p; // Error เนองจากตวแปร i มขนาด 32 บต ซงเลกกวาตวแปร p ทมขนาด 64 บต
i = (int) p; // ถกตอง เรยกวา Explicit Casting
การ Assign คาของตวแปรทมขนาดเลกกวา ไปยงตวแปรทมขนาดใหญกวา สามารถท าไดทนท เรยกวา
Implicit Casting คอไมจ าเปนตองใส (Data Type) ดานขวามอของเครองหมายเทากบ ในทางตรงขามกน ตองใส (Data Type) หรอ Explicit Casting เพอบอกใหตวแปลภาษาเปลยนคาจากตวแปรทมขนาดใหญกวา ใหเปนขนาดตามทก าหนด ขอสงเกต การเปลยนคาของตวแปรทมขนาดใหญกวาเปนขนาดเลกกวา จะท าใหเสยคาความแมนย าดงตวอยาง
3 + 2 * (5 – 7) / 2
-2
-4
-2
1
26 การเขยนโปรแกรมภาษา Java
int i;
double d = 3.141;
i = (int) d; // การใช Explicit Casting อาจท าใหคาความแมนย านอยลง System.out.println (i); // แสดงคา “3” เทานน
การเปลยนคาจากตวแปรทมขนาดเลกกวาไปยงตวแปรทมขนาดใหญกวาสามารถท าไดโดยไมจ าเปนตอง
ใส Casting ดงตวอยาง byte > short > int > long > float > double การเปลยนจาก byte ไป int หรอ จาก short ไป float ไมจ าเปนตองใส Casting.java ดงตวอยางโปรแกรม Casting
public class Casting {
public static void main(String[] args) {
byte b=10;
short s=100;
int i = 1000;
long l = 10000L;
float f = 200F;
double d=2000;
b = (byte) s;
System.out.println(b +" From short to byte, it may cause loss precision");
b = (byte) l;
System.out.println(b +" From long to byte, it may cause loss precision");
d = i;
System.out.println(d + " From integer to double");
f = s;
System.out.println(f + " From short to float");
}
}
---------- Java Output----------
100 From short to byte,it may cause loss precision
16 From long to byte,it may cause loss precision
1000.0 From integer to double
100.0 From short to float
ค าแนะน า แมวาการเปลยนคาจากตวแปรทมขนาดเลกกวาไปยงตวแปรทมขนาดใหญกวา ท าไดโดยไม
จ าเปนตองใส Casting แตเพอใหงายในการอาน และแกไขโปรแกรม ควรใส Explicit Casting ทกครง เมอมการ Assign คาส าหรบตวแปรตางชนดกน
Control Flow Statement
ถาโปรแกรมทถกเขยนขน ท างานเปนล าดบขนตอน จากบรรทดทหนงของโปรแกรมไปจนบรรทดสดทาย แลวจบโปรแกรมเลย โปรแกรมนนาจะเขยนไดอยางงาย ลองพจารณาดอกครง การทโปรแกรมท างานจากบรรทดแรกไปบรรทดสดทาย โดยไมมการกลบมาท าซ า หรอเลอกทจะท าบางสวนในโปรแกรม ผเขยนโปรแกรมตองเผชญกบการเขยนโปรแกรมทยากทสด ตวอยางเชน การบวกตวเลข 100 ตว ส าหรบโปรแกรมทไมมการท าซ า ผเขยนโปรแกรมตองสรางชดค าสง (Statements) ถง 100 ค าสงการบวก แตถาโปรแกรมสามารถท าชดค าสงซ าได การเขยนโปรแกรมนอาจเหลอเพยงไมกบรรทด หรอโปรแกรมส าหรบค านวณภาษรายไดบคคล ซงแตละคนเสยภาษไมเทากน ขนอยกบรายได 1 ปของคนนน การเกบภาษใชหลกการเกบภาษกาวหนา ยงมรายไดมาก ยอมตองจาย
การเขยนโปรแกรมภาษา Java 27
ภาษมากตามไปดวย ส าหรบคนทมรายไดนอย ถาไมถงเกณฑขนต าไมตองเสยภาษ ดงนนตองใชโปรแกรมค านวณภาษส าหรบคนทมรายไดนอยหนงโปรแกรม และใชโปรแกรมค านวณภาษส าหรบคนทมรายไดสงอกหนงโปรแกรมแยกกน คงสรางความยงยากกบผใชโปรแกรมอยางมาก แตถาใชโปรแกรมเพยงโปรแกรมเดยว และ สามารถเลอกท างานชดค าสงทเหมาะสมกบขอมลทรบมาโดยอตโนมต ท าใหโปรแกรมมความยดหยนและใชงานไดสะดวกขน
โชคดทภาษา Java และภาษาอนๆ เปดโอกาสใหผเขยนโปรแกรมสามารถเขยนโปรแกรมโดยใหโปรแกรมท าซ า หรอเลอกท าชดค าสงทเหมาะสมกบขอมลทรบมาได
Branch ท างานโดยเลอกชดค าสงได ซงประกอบดวย ชดค าสง if-else และ switch Loop ท างานวนซ า ประกอบดวย ชดค าสง for, while และ do-while
If-else Statement if-else เปน Control Statement ประเภท Branch คอมการเลอกท าชดค าสง A ถาเงอนไขททดสอบเปน
จรง หรอ (else) ท าชดค าสง B ถาเงอนไขไมจรง รปท 2.3 แสดง Flowchart ของ if-else รปแบบ (Syntax) ของการเขยนชดค าสง if-else คอ
if (Condition)
Statement A;
else
Statement B;
รปแบบอนๆ if (Condition)
Statement;
if (Condition1)
Statement A;
else if (Condition2)
Statement B;
else if (Condition3)
Statement C;
else
Statement D;
ในกรณทชดค าสงภายใต if มมากกวาหนงค าสง ตองใชเครองหมาย { } ควบคดวย ดงตวอยาง
if (Condition) {
Statement M;
…
Statement N;
} else {
Statement X;
…
Statmenet Y;
}
28 การเขยนโปรแกรมภาษา Java
Condition
Statement
Statement
false
true
ภาพท 2.3 แสดง Flowchart ของ if-else ตวอยางการใช if-else Statement ในการหาเกรดของนกศกษา โดยชวงคะแนนแสดงในตารางท 2.10 และ
น าชวงคะแนนนไปสราง Flowchart ไดดงภาพท 2.4
ตารางท 2.10 แสดงชวงคะแนนการตดเกรดของนกศกษา คะแนน เกรด
80 – 100 A 70 – 79 B 60 – 69 C 50 – 59 D
นอยกวา 50 F
การเขยนโปรแกรมภาษา Java 29
Score >= 80 ? Grade=A
false
true
Score >= 70 true Grade=B
false
Score >= 60 true Grade=C
false
Score >= 50 true Grade=D
false
Grade=F
ภาพท 2.4 แสดง Flowchart การค านวณหาเกรด น า Flowchart ในภาพท 2.4 มาเขยนโปรแกรม Grade.java เพอแสดงการค านวณเกรด ไดดงน
public class Grade {
public static void main(String[] args) {
int score = 72;
char grade;
if (score >= 80) {
grade = 'A';
} else if (score >= 70) {
grade = 'B';
} else if (score >= 60) {
grade = 'C';
} else if (score >= 50) {
grade = 'D';
30 การเขยนโปรแกรมภาษา Java
} else {
grade = 'F';
}
System.out.println("Grade = " + grade);
}
}
---------- Java Output----------
Grade = B
Switch Statement
การท างานของ Switch Statement คลายคลงกบ If-else Statement รปแบบการเขยน Switch Statement คอ
switch (expression) {
case constant1:
Statement A; break;
case constant2:
Statement B; break;
case constant3:
Statement C; break;
…
case constant:
Statement; break;
default:
Default Statement; }
ขอสงเกต เมอมการใชค าสง case แลวตองลงทายดวยค าสง break ทกครง ถาไมใสค าสง break
โปรแกรมจะท างานตอเนองไปโดยไมสนใจ case ทตามมา ค าสง switch ถาไมจ าเปนกไมควรใชเพราะ ถาผใชงานลมใสค าสง break อาจท าใหโปรแกรมท างาน
ผดพลาดได หรอเกด “Bug” ขนในโปรแกรมไดงาย
public class If {
public static void main(String[] args){
int i = 0;
if (i == 4)
System.out.println ("Four");
else if (i == 3)
System.out.println ("Three");
else if (i == 2)
System.out.println ("Two");
else if (i == 1)
System.out.println ("One");
else
System.out.println ("Not interesting");
}
}
---------- Java Output----------
Not interesting
การเขยนโปรแกรมภาษา Java 31
จากโปรแกรม If.java ขางบน สามารถเขยนแทนดวยค าสง Switch Statement ดงตวอยางโปรแกรม Switch.java
class Switch {
public static void main(String[] args){
int i = 3;
switch (i) {
case 4:
System.out.println ("Four"); break;
case 3:
System.out.println ("Three"); break;
case 2:
System.out.println ("Two"); break;
case 1:
System.out.println ("One"); break;
default: System.out.println ("Not interesting");
}
} }
---------- Java Output----------
Three
โปรแกรมเดมถาไมใสค าสง break ใน case ท i เทากบ 3 โปรแกรมจะท างานตอไปจนเจอค าสง break จง
หยดท าใหผลลพธทไดแสดงคา Two ดวย ดงตวอยาง class Switch {
public static void main(String[] args){
int i = 3;
switch (i) {
case 4:
System.out.println ("Four"); break;
case 3: // ไมใสค าสง break ท case เทากบ 3
System.out.println ("Three");
case 2:
System.out.println ("Two"); break;
case 1:
System.out.println ("One"); break;
default: System.out.println ("Not interesting");
}
} }
---------- Java Output----------
Three
Two
32 การเขยนโปรแกรมภาษา Java
For Loop Statement การสงใหโปรแกรมท างานซ าหรอวนรอบ (Loops) สามารถใชค าสง For Loop Statement รปแบบการ
เขยนคอ
for(Initialization; Condition Expression; Step Expression) {
Statement;
}
Initialization หมายถงการก าหนดคาตวแปรกอนเรมการท างาน เชน int i=0 ขนตอนนท างาน
เพยงครงเดยวเทานน ในตอนเรมท างานค าสง For Loop การประกาศคาตวแปรสามารถท าไดในขนตอนน และตวแปรทประกาศขนมาเปน Local Variable ซงใชไดภายในค าสง For Loop เทานน เมอจบค าสง For Loop ตวแปรนจะถกยกเลกไป
Condition Expression เปนการทดสอบเงอนไข ถาเงอนไขเปนจรง ชดค าสงในเครองหมาย { } จะถกท างาน
Step Expression หลงจากท างานชดค าสงเสรจแลว ในขนตอนสดทาย เปนการเขยนค าสงเพมคาใหกบตวแปรทใชในการทดสอบเงอนไข
พจารณาชดค าสงตอไปน และภาพท 2.5 ซงแสดง Flowchart ของชดค าสง For Loop ของชดค าสงน
for(int i=0; i<100; i++) {
System.out.println(i);
}
ในสวน Initialization สามารถประกาศคาตวแปรไดมากกวาหนงคาแตตองเปนตวแปรชนดเดยวกนเทานน โดยใชเครองหมายจลภาคในการแบง และในสวน Step Expression สามารถม Expression มากกวาหนงคาเชนกน เชน for(int i=1, j=2, k=5; i<10; i++, j++);
โปรแกรม ForLoop.java แสดงการบวกเลขของตวแปร i และ j เปนจ านวน 10 ครงโดยใชค าสง For Loop โดยทคา i มการเพมคาครงละ 1 และลดคาตวแปร j ครงละ 2 ในแตละ Loop
การเขยนโปรแกรมภาษา Java 33
Start for Loop
Initialize variable
i=0
Check
Condition
i<100?
println(i)
true
Step
i++
false End Loop
รปท 2.5 แสดง Flowchart ของ for Loop
public class ForLoop {
public static void main(String[] args){ int sum = 0;
for(int i=1, j=100; i<10; i++, j-=2 ){
System.out.println("i = " + i + " ,j = " + j);
sum = i + j;
System.out.println("i + j = " + sum);
}
}
}
---------- Java Output----------
i = 1 ,j = 100
i + j = 101
i = 2 ,j = 98
i + j = 100
i = 3 ,j = 96
i + j = 99
i = 4 ,j = 94
i + j = 98
i = 5 ,j = 92
i + j = 97
i = 6 ,j = 90
i + j = 96
i = 7 ,j = 88
i + j = 95
i = 8 ,j = 86
i + j = 94
34 การเขยนโปรแกรมภาษา Java
i = 9 ,j = 84
i + j = 93
While Loop Statement
ค าสง While Loop เหมอนค าสง For Loop ทกประการ ยกเวนรปแบบการเขยนแตกตางกน ในค าสง while ไมมสวน Initialization และ Step Expression ส าหรบสวน Condition Expression ยงคงไวเหมอนเดม รปแบบ while Loop มลกษณะดงน
while (Condition Expression) {
Statement;
}
Condition Expression ตองมคาเปน true เทานน Statement ใน while Loop จงท างาน และหยดท างาน
ในกรณท Condition Expression มคาเปน false ดงตวอยาง Flowchart ในภาพท 2.6
Start while Loop
Check
Condition
true
Do Statements
End while Loop
รปท 2.6 แสดง Flowchart ของค าสง while Loop
โปรแกรม WhileLoop.java แสดงการหา Factorial ของคา 5 โดยใชค าสง For Loop
// หาคา factorial ของ i public class WhileLoop {
public static void main(String[] args){
int fac=1;
int i=5;
System.out.println("i = " + i);
while (i != 0) {
fac *= i--; //ค าสงนมคาเทากบ fac = fac * i; i = i - 1; }
System.out.println("Factorial = " + fac);
}
}
การเขยนโปรแกรมภาษา Java 35
---------- Java Output----------
i = 5
Factorial = 120
Do-while Loop Statement
ค าสง Do-while Loop มการท างานเหมอนกบ for และ while ยกเวนการทดสอบเงอนไขอยเปนล าดบสดทาย ดงนน Statements จะถกเรยกใหท างาน 1 ครงกอนทจะไปทดสอบเงอนไขวาเปนจรงหรอเทจ ดงภาพ Flowchart ท 2.7
Start do-while
Loop
Check
Condition
Do Statements
false End do-while Loop
true
ภาพท 2.7 แสดง Flowchart ของ Do-while Loop Statement
รปแบบการเขยน Do-while Loop คอ
do {
Statement;
} while (Condition Expression);
โปรแกรม DoWhileLoop.java แสดงการใช Do-while Loop แทนการใช While Loop ซงใหผลลพธ
เหมอนกบโปรแกรม WhileLoop.java ทกประการ
// หาคา Factorial ของ 5 public class DoWhileLoop {
public static void main(String[] args){
int fac=1;
int i=5;
System.out.println("i = " + i);
do {
fac *= i--;
} while (i > 1 );
System.out.println("Factorial = " + fac);
}
}
---------- Java Output----------
i = 5
Factorial = 120
36 การเขยนโปรแกรมภาษา Java
Break และ Continue Statements ค าสง break นอกจากใชกบค าสง switch แลว สามารถน ามาใชกบค าสง for, while และ do-while Loop
ไดดวย ค าสง break ใชเพอยกเลกการท าซ า (Exit Loop) สวนค าสง continue ใชเพอใหกลบไปท างานในสวนทท างานทดสอบเงอนไขทนท โปรดด Flowchart ในรปท 2.8
โปรแกรม BreakContinue.java แสดงการใชค าสง break และ continue พมพคาเลขคยกเวนคา 10 จนไปถงคา 20 โดยทมการบวกคา i ทกๆ รอบของ While Loop เมอคา i เปน 10 มการใชค าสง continue ท าใหโปรแกรมขามการท างานในค าสงทตามมาทงหมด และกลบไปท างานในค าสง while ทนท ในกรณทคา i เปน 20 มการใชค าสง break ท าใหจบการท างานของค าสง While Loop ทนทเชนกน
Start Loop
Check
Condition
Do Statements
true
Want to break? break
End Loop
End Loop
false
yes
no
Start Loop
Check
Condition
Do Statements
true
Want to
continue?continue
End Loopfalse
yes
no
ภาพท 2.8 แสดง Flowchart ของค าสง break และ continue
การเขยนโปรแกรมภาษา Java 37
// แสดงคาเลขคจาก 2 ถง 20 ยกเวนเลข 10 public class BreakContinue {
public static void main(String[] args) {
int i=1;
while (true){
i++;
if (i == 10) { // ไมพมพคา 10 continue;
}
else if (i > 20) { //ถา i มคามากกวา 20 ใหหยดการท างานของ while
break;
}
if (i%2 == 0) { // พมพคา i เมอเศษทหารเทากบ 0
System.out.println(i);
} // end if
} // end while
} // end main
} // end class
---------- Java Output---------- 2 4 6 8 12 14 16 18 20
โปรแกรม Prime1.java แสดงการหาคาตวเลขจ านวนเฉพาะโดยใชใชค าสง break ชวยในการเขยน
โปรแกรม
public class Prime1 {
public static void main(String[] args)
{
int number = 30; // จ านวนตวเลขสดทายทตองการหาคา Prime
boolean isPrime = true; // เปนตวแปรทใชตรวจสอบเงอนไข
System.out.println("Prime number from 2 to 30");
for(int i=2; i<=number; i++){
for(int j=2; j<i; j++) {
if(i%j == 0) {
// ถา i%j เปนศนย แสดงวาคา i ใน loop นไมใช prime isPrime = false; // แสดงวา i ไมเปนคา prime break;
}
}
if(isPrime)
System.out.println(i);
isPrime = true;
}
}
38 การเขยนโปรแกรมภาษา Java
}
---------- Java Output----------
Prime number from 2 to 30
2
3
5
7
11
13
17
19
23
29
การเขยนโปรแกรมภาษา Java 39
สรป เนอหาในบทน กลาวถงพนฐานในการเรมตนเขยนโปรแกรมโดยใชภาษา Java รปแบบของ Operators
ชนดของขอมลซงประกอบไปดวย int, boolean, char, float และ double รปแบบการเขยนค าสง if, switch, for, while และ do-while
40 การเขยนโปรแกรมภาษา Java
แบบฝกหดทายบทท 2
1. อธบายวธการเขยน Javadoc Comments 2. อธบายกฎการตงชอ Identifiers 3. อธบายความแตกตางระหวาง Data Type แบบ Primitive และ Reference 4. อธบาย Literals ทกชนด 5. อธบาย Scope ของตวแปร 6. อธบาย Operators ทกแบบ 7. อธบายความแตกตางระหวาง Arithmetic และ Logical Shift 8. Casting ท าเพออะไร 9. อธบายการท างานของ Branch และ Loop Statements 10. อธบายการสงคาใหกบ Method แบบ Pass-by-Value และ Pass-by_Reference 11. ตวแปร (Variable) ท าหนาทอะไร 12. วตถ System.out ท าหนาทอะไร 13. อธบายความแตกตางระหวางตวแปรชนด int และ double 14. จงยกตวอยางทผดของการ Assign คาใหตวแปรชนด int 15. ถาตวแปร x มคาเทากบ 5 และ y มคาเทากบ 10 จงหาคาผลลพธ
a. x + y * 5
b. x – y + 3
c. (x – y) * 5
d. y % x
16. อธบาย Data Type ตอไปนวาเปนชนดใด a. +123 b. -324 c. 23.45f d. 234.532 e. 0xBBFF f. 044 g. “Hello” h. ‘j’ i. 0.34E+01f
17. จงหาผลลพธของโปรแกรมตอไปน public class Test {
public static void main(String args[]) {
System.out.println(6 ^ 3);
}
} 18. จงหาผลลพธของโปรแกรมตอไปน
public class Test {
public static void main(String args[]) {
int i = 0xFFFFFFF1;
int j = ~i;
}
}
การเขยนโปรแกรมภาษา Java 41
19. จงหาผลลพธของชดค าสงตอไปน int x = 20, y = 15, z;
if(x<y)
z = 10;
else
z = 5;
System.out.println(z);
20. ชดค าสงตอไปนมทผด จงแกไขใหถกตอง //โปรแกรมพมพเลขค 1 ถง คา limit for(int i=1; i<limit; i++)
if(i%2==1)
System.out.println(i);
21. ขอใดถกตอง a. float f=1.3;
b. char c="a";
c. byte b=257;
d. boolean b=null;
e. int i=10;
f. float f=1/3;
g. int i=1/3;
h. float f=1.01;
i. double d=999d;
j. int w = (int) 888.8;
k. byte x = (byte) 1000L;
l. long y = (byte) 100;
m. byte z = (byte) 100L;
22. ขอใดเปนการประกาศ Identifier ทถกตอง a. 2variable
b. variable2
c. _whatavariable
d. _3_
e. $anothervar
f. #myvar
23. จงหาผลลพธจากค าสงตอไปน int x, a = 6, b = 7;
x = a++ + b++;
24. จงหาผลลพธจากค าสงตอไปน int x = 11 & 9;
System.out.println(x);
25. จงหาผลลพธจากค าสงตอไปน int x = 0, y = 4, z = 5;
if (x > 2) {
if (y < 5) {
System.out.println( “message one” );
}
else {
System.out.println( “message two” );
}
}
else if (z > 5) {
System.out.println( “message three” );
}
42 การเขยนโปรแกรมภาษา Java
else {
System.out.println( “message four” );
}
26. จงหาผลลพธจากค าสงตอไปน int i=1;
switch (i) {
case 0:
System.out.println("zero");
break;
case 1:
System.out.println("one");
case 2:
System.out.println("two");
default:
System.out.println("default");
}
27. จงหาผลลพธจากค าสงตอไปน class Exp{
public static void main(String[] args) {
int i = 10; int j = 12;
if( (i<j) || (i++ == 3) )
System.out.println(“OK”);
System.out.println(i);
}
Programming Problems 1. จงเขยนโปรแกรมเพอค านวณหาเสนรอบวง ปรมาณพนผว และความจของทรงกลม โดยก าหนดใหทรงกลมม
รศมเปน r 2. แสงเดนทางโดยมความเรวเทากบ 3 x 108 เมตร/วนาท จงเขยนโปรแกรมค านวณหาระยะทางเวลา 1 ปวาแสง
เดนทาง (ปแสง) ไดระยะทางเทาไหร 3. จงเขยนโปรแกรม Loop โดยสรางตวแปรชนด byte และใหมคาเปน 1 และใหคณดวย 2 เปนจ านวน 10 ครง 4. จงเขยนโปรแกรมเพอค านวณหาคา x ในสมการ ax2+bx+c = 0 โดยใชสตร
[-b + sqt(b2-4ac)] / (2a) และ [-b - sqt(b2-4ac)] / (2a) 5. จงเขยนโปรแกรมเปลยนเวลาวนาทใหเปน วน ชวโมง นาท และวนาท ดงตวอยาง
345632434 วนาท = xx วน yy ชวโมง zz นาท aa วนาท 6. จงเขยนโปรแกรมเพอบวกตวเลข 1 + 2 + 3 + … + 500