บทท่ี 2: ขอ มลู ตัวแปร และการประมวลผล
3: */ intro. to Java (FEU.faa)
4:
5: import static java.lang.System.out;
6:
7: class StaticImport {
8: public static void main(String[] args) {
9: String name = "Jennie Xumsai";
10: int age = 9;
11:
12: out.printf("%s is %s%n", name, age);
13:
14: long maxLong = Long.MAX_VALUE;
15: double maxDouble = Double.MAX_VALUE;
16: out.printf("Maximum long: %d%n", maxLong);
17: out.printf("Maximum double: %E%n", maxDouble);
18: }
19: }
เรากําหนดใหม ีการ import แบบ static ในบรรทดั ที่ 5 ซ่งึ เปน การบอกให Java รวู า เราตอ งการใชส ่ิง
ท่ี Java เรียกวา 'static field' ท่ชี ือ่ 'out' พรอ มท้ัง method ท้ังหลายทม่ี ใี หใ ช เชน printf() เปน ตน
ดงั นน้ั การแสดงผลลัพธใ นบรรทัดที่ 12, 16 และบรรทดั ท่ี 17 จึงไมตอ งมีคําวา 'System' อยูอกี ตอไป
ผลลพั ธท ีเ่ ราไดค อื
Jennie Xumsai is 9
Maximum long: 9223372036854775807
Maximum double: 1.797693E+308
ผอู านจะเห็นวา ถา โปรแกรมของเรามกี ารแสดงผลไปยังหนา จอมาก ๆ การใช static import จะชวย
ใหเ ราเขยี นโปรแกรมไดไวยิง่ ขน้ึ
2.9 การประมวลผลขอมลู ตา งชนดิ กนั (Mixed Type Calculations)
ในการประมวลผลขอ มลู ที่มคี วามหลากหลายของชนิดในประโยคใด ๆ น้นั โดยท่ัวไป Java จะทําการ
เปลยี่ นชนิดของขอมูลทมี่ ขี นาดเล็กกวา ใหเ ปนขนาดท่ีใหญท ่ีสดุ ในกลมุ ของขอมลู น้นั ๆ แตผเู ขียน
โปรแกรมจะตองใชความระมัดระวังในเรอื่ งของการจดั เกบ็ ขอมลู ท่มี ีขนาดใหญไ ปไวใ นตัวแปรท่มี ี
ขนาดเลก็ เชนเดียวกับทไ่ี ดทาํ มากอนหนา นใ้ี นเร่อื งของการประมวลผลขอ มูลทีเ่ ปน integer ลองมาดู
ตวั อยา งกัน
1: /**
2: Demonstrates mixed-type calculations
3: */
4:
5: class FloatingPoint4 {
6: public static void main(String[] args) {
7: double hourlyPay = 85.50D; //85.50 per hour
8: int hoursPerDay = 8; //8 hours per day
9: int numberOfDays = 5; //total days worked
10: int extraHoursWorked = 15; //overtime hours
11: final double TAX_RATE = 8.5D; //tax rate in percent
12:
13: //calculate weekly pay
14: double weeklyPay = hourlyPay * hoursPerDay * numberOfDays;
15: //calculate extra pay
16: double extras = extraHoursWorked * (hourlyPay + (hourlyPay / 2.0));
17: //calculate tax
18: double tax = (weeklyPay + extras) * TAX_RATE / 100;
19: //calculate total income
20: double totalIncome = (weeklyPay + extras) - tax;
21:
22: System.out.printf("Income before tax = %.2f%n", (weeklyPay + extras));
23: System.out.printf("Tax = %.2f%n", tax);
24: System.out.printf("Income after tax = %.4f%n", totalIncome);
25: }
26: }
โปรแกรม FloatingPoint4.java ใชต ัวแปรท่มี ชี นิดเปน ทั้ง double และ integer ปนกันในการ
คํานวณหารายไดต อหนงึ่ อาทติ ย โดยกําหนดใหต ัวแปร hoursPerDay, numberOfDays และ
47
เรมิ่ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
extraHoursWorked เปน integer สวนตัวแปร hourlyPay, weeklyPay, extras, tax และ
totalIncome เรากําหนดใหเ ปน double
การประมวลผลก็ไมยงุ ยากอะไร Java จะเปล่ยี นตัวแปรทเี่ ปน int ใหเปน double กอ นการประมวลผล
เพราะฉะน้ันการจดั เก็บผลลัพธกไ็ มม คี าความคลาดเคลือ่ นใด ๆ เกดิ ขึน้ ดังผลลพั ธท ี่แสดงนี้
Income before tax = 5343.75
Tax = 454.22
Income after tax = 4889.5313
ขอควรจาํ ในการประมวลผลขอมูลตา งชนิดกนั (ในประโยคเดียวกนั )
o ถามีตวั แปรใดเปน double ตัวแปรท่นี ํามาประมวลผลดว ยจะถูกเปลีย่ นใหเ ปน double กอ น
การประมวลผล
o ถา มีตวั แปรใดเปน float ตวั แปรที่นาํ มาประมวลผลดว ยจะถกู เปลี่ยนใหเปน float กอ นการ
ประมวลผล
o ถา มตี วั แปรใดเปน long ตัวแปรท่ีนาํ มาประมวลผลดว ยจะถกู เปลยี่ นใหเ ปน long กอ นการ
ประมวลผล
สิ่งท่ีสาํ คญั กค็ อื ขอ มลู ที่เลก็ กวา ในประโยคจะถูกเปลย่ี นใหเปนชนิดท่ีใหญที่สดุ ในประโยคนน้ั ๆ ซ่งึ
บางครัง้ ก็ไมใ ชการประมวลผลที่เราตอ งการ เชน ตวั อยางของโปรแกรมตอไปน้ี
1: /**
2: Demonstrates mixed-type calculations
3: */
4:
5: class MixedTypes {
6: public static void main(String[] args) {
7: double result = 0.0;
8: int one = 1, two = 2;
9:
10: result = 1.5D + one / two;
11:
12: System.out.printf("Result is %.2f%n", result);
13: }
14: }
ผลลพั ธที่เราคาดหวังวา จะได คือ 2.0 แต Java กลบั ให 1.5 ซึง่ เปนผลลพั ธท ่เี ราไมตอ งการ ถา
สงั เกตใหด จี ะเห็นวาประโยค
result = 1.5 + one / two;
น้นั การหารจะเกดิ กอน และเน่ืองจากวา ทัง้ one และ two เปน int ดังน้ันผลลัพธข องการหารจึงมคี า
เปน int และมีคาเปน 0 หลงั จากน้นั Java ก็จะเปลย่ี น 0 ท่ีไดใหเปน double แลวจึงทาํ การบวกเขา
กับ 1.5 เพอื่ ใหผลลัพธเปน ที่เราตอ งการ ดงั นัน้ เราจงึ ตอ งทําการ cast ใหต ัวแปร one เปน double
เสยี กอ น ดงั น้ี
1: /**
2: Demonstrates mixed-type calculations
3: */
4:
5: class MixedTypes {
6: public static void main(String[] args) {
7: double result = 0.0;
8: int one = 1, two = 2;
9:
10: result = 1.5D + (double)one / two;
11:
12: System.out.printf("Result is %.2f%n", result);
13: }
14: }
เราก็จะไดผ ลลพั ธเปน 2.0 ดงั ทีเ่ ราตองการ
48
บทที่ 2: ขอ มลู ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
อยางไรกต็ ามการ cast นั้นตองใชค วามระมัดระวังเปน พิเศษ หากเราทําการ cast ขอมลู ท่ใี หญก วาไป
เกบ็ ไวในตัวแปรทีเ่ ลก็ กวา ก็จะทําใหเ กดิ ความคลาดเคลือ่ นของขอ มลู ได ดงั ทไี่ ดพูดไวก อ นหนา นี้
2.9.1 Autoboxing และ Unboxing
เราไดพูดถงึ การใชข อ มลู ชนิดตาง ๆ เชน int, short, float และอ่ืน ๆ ซงึ่ เปนขอมูลพน้ื ฐานที่ใชเก็บคา
ตา ง ๆ ที่ user ตองการ และขอมูลเหลาน้ไี มใชขอ มูลท่ีเปน object ดงั นั้นในการเลอื กใชต ัวแปรเราจึง
ตองระมัดระวังท่จี ะใหขอ มูลเหลา น้ันเปน ขอ มลู ทีถ่ กู ตอ ง ตวั อยา งเชน ถา เราประกาศใหต วั แปร
myNum มีเปนชนดิ เปน Integer และ myNumToo มีชนดิ เปน int ซึง่ ทั้งสองตวั แปร ถา พดู งาย ๆ ก็
คอื เก็บขอมูลชนดิ เดียวกนั ตา งกนั ตรงท่ีตวั หน่งึ เปน object อกี ตวั หนึ่งเปน ขอมลู ชนิดพน้ื ฐาน ซง่ึ ทั้ง
สองไมส ามารถนาํ มาใชแ ทนกันได (ในอดตี กอ น java 1.5) เชน ถา เราใชค ําส่ัง
Integer myNum = new Integer(35);
int myNumToo = 35;
เราไมส มารถกําหนด
myNum = myNumToo; หรือ myNumToo = myNum;
ได แตพอมาถึง Java 1.5 กระบวนการที่เรยี กวา Autoboxing และ Unboxing ยอมใหเราทาํ ได
กลา วคอื เราสามารถท่จี ะกาํ หนดชดุ คาํ สงั่ ดังกลา วได
Boxing หมายถงึ การเปลีย่ นขอมลู จากชนดิ พนื้ ฐานใหเ ปน wrapper type (object น้นั ๆ ท่ีรองรบั กับ
ขอมลู พื้นฐาน) เชน Boolean, Byte, Short, Character, Integer, Long, Float, หรอื Double และ
เนอื่ งจากวา เหตุการณน เี้ กดิ ข้ึนโดยอัตโนมตั ิ เราจงึ เรียกวา Autoboxing ในทางตรงกนั ขามการ
เปลยี่ นให wrapper type เปนขอ มูลชนิดพื้นฐานเราเรียกวา unboxing
1: /**
2: From wrapper type to primitives and vice versa
3: */
4:
5: import static java.lang.System.out;
6:
7: class WrapPrim {
8: public static void main(String[] argas) {
9: Integer myInteger = new Integer(35);
10: int myInt = 4;
11:
12: out.printf("MyInt = %d%n", myInt);
13: //boxing
14: myInt = myInteger;
15: out.printf("Now MyInt = %d%n", myInt);
16:
17: double myD = 3.145;
18: //unboxing
19: Double myDouble = myD;
20: out.printf("myD = %.3f, myDouble = %.3f%n", myD, myDouble);
21: }
22: }
ผลลัพธทีเ่ ราไดจากการ run คอื
MyInt = 4
Now MyInt = 35
myD = 3.145, myDouble = 3.145
โปรแกรมตัวอยา งของเราใช boxing ในบรรทัดที่ 14 และ unboxing ในบรรทดั ท่ี 19 ผูอา นจะเห็นวา
เราไมต อ งทําอะไรเลยเพยี งแตใ ชตวั แปรทัง้ สองชนิดเสมือนกับวาเปน ตัวแปรท่ีไดประกาศใหเปน ชนดิ
เดยี วกัน ใน Java รนุ กอน ๆ การเปลีย่ นขอมูลตอ งมีกระบวนการเพม่ิ อีก ดังตวั อยา งนี้
Integer num1 = new Integer(35);
int num2 = num1.intValue();
Integer num3 = Integer.valueOf(num2);
49
เร่ิมตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
เรากําหนดใหต ัวแปร num1 เปน Integer มคี าเปน 35 และกาํ หนดให num2 เปน int มคี า ท่เี ปน int
จาก num1 ดว ยการใช method intValue() ของ class Integer และกาํ หนดให num3 เปน Integer
ทม่ี คี าเปน Integer จากการเปล่ียนคา int ของ num2 ดวยการเรยี กใช valueOf() ของ class
Integer เชน เดียวกัน เพราะฉะน้นั ตัวแปรทง้ั สามจงึ มคี าเหมอื นกันคือ 35
ในสว นของ wrapper type อ่นื ๆ เชน Double หรอื Character ก็ทาํ งานคลา ย ๆ กันผูอานสามารถ
หาดไู ดจ าก Java API ของ Sun ได
2.10 การประมวลผลเลขทม่ี ขี นาดใหญ
ถา เราตอ งการท่จี ะทาํ งานกบั ตัวเลขทมี่ คี า เกินกวา ที่ int จะเกบ็ คาได Java กม็ ีวธิ ีทที่ ําใหเ ราสามารถ
ประมวลผลเลขใหญๆ เหลา นนั้ ได
2.10.1 การใช BigInteger
Java มี class BigInteger ท่ีเราสามารถเรียกใชในการประมวลผลเลขทมี่ ีคา มากๆได แตเราตอ งทํา
ตามขอกาํ หนดที่ Java ไดต้ังไว คือ
1. จะตอ งสรา งตวั เลยใหเ ปน Object จาก class BigInteger
2. การประมวลผลจะตองทําผาน method ท่ีมใี หตัวอยาง เชน
ลองมาดูโปรแกรมตัวอยางการใชด ู
1: /**
2: Big Integers Operations Demo
3: */
4:
5: import java.math.BigInteger;
6:
7: class BigIntegerDemo {
8: public static void main(String[] args) {
9: BigInteger big1 = new BigInteger("999999999999999999999999999999");
10: BigInteger big2 = new BigInteger("999999999999999999999999999999");
11: BigInteger result;
12:
13: //add big1 and big2
14: result = big1.add(big2);
15: System.out.println("big1 + big2 = " + result);
16:
17: //subtract big1 and big2
18: result = big1.subtract(big2);
19: System.out.println("big1 - big2 = " + result);
20:
21: //multiply big1 and big2
22: result = big1.multiply(big2);
23: System.out.println("big1 * big2 = " + result);
24:
25: //divide big1 and big2
26: result = big1.divide(big2);
27: System.out.println("big1 / big2 = " + result);
28: }
29: }
ผลลพั ธท ีเ่ ราไดค อื
big1 + big2 = 1999999999999999999999999999998
big1 - big2 = 0
big1 * big2 = 999999999999999999999999999998000000000000000000000000000001
big1 / big2 = 1
สําหรบั class BigDecimal กค็ ลายๆ กับ BigInteger เพียงแตเ ปน การทํางานกับตวั เลขท่ีมีจดุ ทศนิยม
เทา นน้ั เอง ผูอานคงตอ งหาดขู อมูลที่เก่ียวของกบั การทํางานกบั ตัวเลขใหญๆ เหลา นี้เสริมเอง
50
บทที่ 2: ขอมูล ตัวแปร และการประมวลผล
2.11 การใช Mathematical Functions ตา ง ๆ ท่ี Java มีให intro. to Java (FEU.faa)
หลาย ๆ ครั้งทกี่ ารเขยี นโปรแกรมตอ งการใช function ทเี่ ก่ียวของกับการหาคา ทางคณติ ศาสตร เชน
การหาคา ของ sine cosine tangent หรอื คา อืน่ ๆ ที่เกย่ี วของกบั การคํานวณทางคณติ ศาสตร Java
กไ็ ดท ําการออกแบบและจดั สรร function เหลา น้ีไวใหผใู ชไ ดเ รยี กใชอยางเต็มท่ี เราจะมาทดลอง
เรยี กใช function ตาง ๆ เหลา นดี้ ู
ตัวอยางตอ ไปนีจ้ ะเปน การคาํ นวณหาคา ของสมการ ท่เี รยี กวา Quadratic Equation Æ ax2 + bx +
c = 0 ซึง่ หาไดจ ากการใชสตู ร
x1 = − b + b2 − 4ac
2a
x2 = − b − b2 − 4ac
2a
ซ่งึ mathematical function ท่เี ราตองใชก็คือ การหา square root และ Java ไดจ ัดเตรยี ม method
ตัวน้ไี วใ หเ ราแลวกค็ ือ Math.sqrt() เรามาลองดูโปรแกรมทห่ี าคาของสมการตวั นีก้ นั ดู
1: /**
2: Calculating roots of a function
3: */
4:
5: class Quadratic {
6: public static void main(String[] args) {
7: double a, b, c;
8:
9: //4x2 + 20x + 16 = 0
10: a = 4;
11: b = 20;
12: c = 16;
13:
14: //calculate determinant
15: double det = Math.sqrt(b * b - 4 * a * c);
16:
17: //calculate roots
18: double x1 = (-b + det) / (2 * a);
19: double x2 = (-b - det) / (2 * a);
20:
21: System.out.printf("Root 1 = %.4f%n", x1);
22: System.out.printf("Root 2 = %.4f", x2);
23: }
24: }
ผลลพั ธท ่ไี ดคอื
Root 1 = -1.0000
Root 2 = -4.0000
ในการเขียนโปรแกรม Quadratic. java ในคร้ังนน้ี ้นั เราจะยังไมส นใจในเรื่องทีค่ า ของ determinant
จะเปน 0 เนอื่ งจากวาเราไมส ามารถหาคา ของ square root ของ 0 ได เราจะใชต วั เลขทีท่ ําใหคา ของ
b2 – 4ac เปนบวกเทานน้ั เพ่ือหลกี เล่ยี งเหตกุ ารณด งั กลาว อีกอยางหนึ่งกค็ อื เรายงั ไมไ ดเรยี นเร่ือง
การใช ชดุ คาํ สง่ั ในการตรวจสอบ (if –else) เราจะกลับมาดูตวั อยางนี้อีกครัง้ หนึ่งเม่อื เราไดเ รียนเรือ่ ง
ของการใช ชุดคําสง่ั ในการตรวจสอบ ในท่ีนเี้ ราสนใจแตเร่อื งของการใช Math.sqrt() เทานั้นเอง
เรามาลองใช Mathematical function อ่ืน ๆ ดูกนั ดีกวา
1: /**
2: Finding max and min
3: */
4:
5: class MaxMin {
6: public static void main(String[] args) {
51
เรมิ่ ตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
7: int num1 = 58, num2 = 97, num3 = 15;
8:
9: //finding maximum between num1, num2, and num3
10: int maxOfTwo = Math.max(num1, num2);
11: int maxOfAll = Math.max(maxOfTwo, num3);
12:
13: //finding minimum between num1, num2, and num3
14: int minOfTwo = Math.min(num1, num2);
15: int minOfAll = Math.min(minOfTwo, num3);
16:
17: System.out.printf("Maximum number is %d%n", maxOfAll);
18: System.out.printf("Minimum number is %d", minOfAll);
19: }
20: }
โปรแกรม MaxMin.java แสดงการเรียกใช method max() และ min() ในการเปรยี บเทียบและหา
คา ที่มากทสี่ ดุ และคาที่นอยที่สดุ ของ integer 3 ตวั ตามลาํ ดับ และเน่อื งจากวา method ทง้ั สอง
ยอมรบั parameter เพียงแคสองตัวเทาน้นั เราจงึ ตอ งทําการหาคาสองครง้ั คร้ังแรกระหวาง integer
2 ตวั แรก และคร้ังที่สองระหวางคาทีห่ าได กบั integer ท่ีเหลือ และเมื่อ execute โปรแกรมเราก็จะ
ไดผ ลลัพธด ังทเี่ ห็นน้ี
Maximum number is 97
Minimum number is 15
โปรแกรมทแ่ี สดงใหด ตู อไปนีเ้ ปน โปรแกรมทีเ่ รยี กใช method ตาง ๆ ท่ีมอี ยใู น class Math
1: /**
2: Other math functions
3: */
4:
5: class Maths {
6: public static void main(String[] args) {
7: double angle = 0.7853982; //45 degrees angle in radians
8:
9: System.out.println("sin(45) is " + Math.sin(angle));
10: System.out.println("cos(45) is " + Math.cos(angle));
11: System.out.println("tan(45) is " + Math.tan(angle));
12:
13: System.out.println("Absolute value of -456 is " + Math.abs(-456));
14: System.out.println("2 to the 4th power is " + Math.pow(2D, 4D));
15: System.out.println("2.345267 rounded to " + Math.round(2.345267));
16: System.out.println("2.859 rounded to " + Math.round(2.859));
17: System.out.println("The remainder of 3.25 / 2.25 is " +
Math.IEEEremainder(3.25, 2.25));
18: System.out.println("The nearest integer of PI is " + Math.rint(Math.PI));
19: }
20: }
โปรแกรม Maths.java ใช method จาก class Math ทําการหาคาของ sine cosine และ tangent
ของมุม 45 ซง่ึ มีคา เทา กบั 0.7853982 radians สาเหตุท่ีตอ งใชมุมที่เปน radians ก็เพราะวา
method เหลา น้ีบังคบั ใหม มุ ท่รี ับเขาเปน parameter มีชนดิ เปน radians
หลังจากน้ันกท็ าํ การหาคา absolute ของ -456 คา 24 และคา การปด เศษในรปู แบบตาง ๆ ผลลัพธท่ี
ไดจ ากการ run คือ
sin(45) is 0.7071068070684596
cos(45) is 0.7071067553046345
tan(45) is 1.0000000732051062
Absolute value of -456 is 456
2 to the 4th power is 16.0
2.345267 rounded to 2
2.859 rounded to 3
The remainder of 3.25 / 2.25 is 1.0
The nearest integer of PI is 3.0
โปรแกรมตัวอยา งการใช method toRadians() สําหรับการเปลย่ี นมุมทเี่ ปน degrees ใหเ ปน
radians
52
บทที่ 2: ขอ มูล ตวั แปร และการประมวลผล
1: /** intro. to Java (FEU.faa)
2: Other math functions
3: */
4: import java.text.DecimalFormat;
5:
6: class Maths1 {
7: public static void main(String[] args) {
8: double angle = 45; //45 degrees angle
9: double sin, cos, tan;
10:
11: //set format output
12: DecimalFormat f = new DecimalFormat("0.00000");
13:
14: //calculate sin, cos, and tan
15: sin = Math.sin(Math.toRadians(angle));
16: cos = Math.cos(Math.toRadians(angle));
17: tan = Math.tan(Math.toRadians(angle));
18:
19: System.out.println("sin(" + angle + ") = " + f.format(sin));
20: System.out.println("cos(" + angle + ") = " + f.format(cos));
21: System.out.println("tan(" + angle + ") = " + f.format(tan));
22: }
23: }
ผลลัพธข องโปรแกรม Maths1.java คือ
sin(45.0) = 0.70711
cos(45.0) = 0.70711
tan(45.0) = 1.00000
โปรแกรมตวั อยางอีกตัวหน่งึ ที่ใช math function ในการคํานวณหาคา ของรัศมขี องวงกลม จากพนื้ ที่
ของวงกลมที่กําหนดให
1: /**
2: Other math functions
3: */
4:
5: class Radius {
6: public static void main(String[] args) {
7: double radius;
8: double area = 850.0;
9: int meters, centimeters;
10:
11: //calculate radius
12: radius = Math.sqrt(area / Math.PI);
13:
14: //convert to meters and centimeters
15: meters = (int)Math.floor(radius);
16: centimeters = (int)Math.round(100.0 * (radius - meters));
17:
18: System.out.printf("Circle with area of %.2f %s", area, "square meters ");
19: System.out.printf("has a radius of %d %s", meters, "meters and ");
20: System.out.printf("%d %s%n", centimeters, "centimeters");
21: }
22: }
เราใช floor() ในการหาคาของรัศมีทเ่ี ปนจํานวนเต็ม และใช round() ในการคํานวณหาคา ของ
centimeters ที่เหลือจากการนําเอา meters ไปลบออกจาก radius ซึ่งเม่ือ run ก็จะไดผลลพั ธดังน้ี
Circle with area of 850.00 square meters has a radius of 16 meters and 45
centimeters
ยงั มี method อกี หลายตวั ทผี่ ูเขยี นโปรแกรมอาจตอ งใช ซ่งึ ไดสรุปไวใ นตารางที่ 2.7
53
เร่ิมตนการเขยี นโปรแกรมดว ย Java
ตาราง 2.7 Mathematical Functions intro. to Java (FEU.faa)
Method Function Argument Result Type
double (radians) double
sin(arg) หาคา sine double (radians) double
double (radians) double
cos(arg) หาคา cosine double double (radians
tan(arg) หาคา tangent double ระหวาง – π /2
และ π /2)
asin(arg) หาคา arc sine double
double (radians
acos(arg) หาคา arc cosine double ระหวา ง 0.0 และ
atan(arg) หาคา arc tangent int long float π)
double
atan2(arg1, arg2) หาคา arc tangent of arg1 int long float double (radians
และ arg2 double
abs(arg) int long float ระหวา ง – π /2
max(arg1, arg2) หาคา absolute ของ arg double และ π /2 )
min(arg1, arg2) double
ceil(arg) หาคาสูงสดุ ระหวาง arg1 double (radians
floor(arg) และ arg2 double
หาคาตา่ํ สดุ ระหวา ง arg1 ระหวาง – π และ
และ arg2 π)
หาคา ที่เล็กที่สดุ ท่ีใหญกวา
หรอื เทา กับ arg เหมอื นกนั กับ
หาคาท่ีใหญท ส่ี ุดทน่ี อ ยกวา Argument
หรือเทากบั arg เหมือนกนั กบั
Argument
เหมอื นกนั กับ
Argument
double
Double
round(arg) หาคา integer ทใี่ กลเ คยี ง float double ได int ถา
กบั arg ทส่ี ดุ argument เปน
float และ long ถา
rint(arg) หาคา integer ที่ใกลเ คียง double เปน double
กบั arg ทสี่ ดุ double
IEEEremainder(arg1, double
arg2) หาคา เศษที่เหลอื จากการ double
sqrt(arg) หาร arg1 ดว ย arg2 double
pow(arg1, arg2) double double
หาคา root ทสี่ องของ arg double
exp(arg) หาคา ของ arg1 ยกกําลัง double
log(arg) arg2 double double
Random() ไมม ี double
หาคา e ยกกําลัง arg double
หาคา log ของ arg
หาคาสมุ ท่มี ากกวา 0.0 แต
นอยกวา 1.0
2.12 การใชขอมลู ที่เปนตวั อักษร (char)
เราไดดูการประกาศตวั แปรทีเ่ ปนตวั อกั ษรมากอนหนา นี้เพียงตัวอยา งเดยี ว เพื่อใหเ กิดความเขาใจถึง
การใชขอ มลู ทเ่ี ปนตัวอกั ษร ใน Java เรามาลองดูตัวอยา งการใชต ัวอกั ษรในรูปแบบตา ง ๆ กนั อกี สกั
หนอย
1: /**
2: Using character data
3: */
4:
5: class Characters {
54
บทท่ี 2: ขอ มลู ตัวแปร และการประมวลผล
6: public static void main(String[] args) { intro. to Java (FEU.faa)
char H, e, l, o;
7:
8: H = 72; //ASCII for 'H'
e = 101; //ASCII for 'e'
9: l = 108; //ASCII for 'l'
10: o = 111; //ASCII for 'o'
11:
System.out.printf("%c", H);
12: System.out.printf("%c", e);
13: System.out.printf("%c", l);
14: System.out.printf("%c", l);
System.out.printf("%c", o);
15: System.out.println(" World");
16: }
17:
18:
19:
20:
21: }
ผลลัพธจ ากการ run โปรแกรม Characters. java ก็คอื คาํ วา Hello World ซึ่งตัวโปรแกรมเองใชร หสั
Unicode ในการกําหนดคา ใหกบั ตวั แปร H e l และ o ซง่ึ เมื่อนาํ ไปแสดงผลก็จะไดคาท่ีตวั แปร
เหลาน้ันเปน อยู เรามาลองดูการประมวลผลดว ยการใช character ดว ย operator งาย ๆ ทมี่ อี ยู
1: /**
2: Using operators on characters
3: */
4:
5: class Characters1 {
6: public static void main(String[] args) {
7: char ch1 = 88, ch2 = 77;
8:
9: System.out.printf("ch1 = %c%n", ch1);
10: System.out.printf("ch2 = %c%n", ch2);
11:
12: ch1 -= 23; //Unicode for 'A'
13: ch2 += 6; //Unicode for 'S'
14:
15: System.out.println("ch1 = " + ch1);
16: System.out.println("ch2 = " + ch2);
17: }
18: }
โปรแกรมเร่มิ ตนดว ยการกําหนดคา ให ch1 และ ch2 มีคาเปน ตวั อกั ษร X และ M ตามลาํ ดบั และเมอ่ื
แสดงผลของท้งั สองตัวแปรแลว โปรแกรมกเ็ ปลีย่ นคา ใหกบั ตวั แปร ch1 และ ch2 ดวยการลดคา ของ
ch1 ลงเปน จาํ นวนเทา กับ 23 และเพ่ิมคาใหกบั ตัวแปร ch2 อีก 6 เพ่ือใหไ ดต ัวอกั ษร A และ X และ
เมอื่ execute โปรแกรมเราก็จะไดผ ลลพั ธท งั้ หมดเปน
ch1 = X
ch2 = M
ch1 = A
ch2 = S
ทีน้เี รามาลองดูการใช Unicode ในการแสดงผลตวั อักษรตา ง ๆ
1: /**
2: Unicode character
3: */
4:
5: class Characters2 {
6: public static void main(String\u005B\u005D args) {
7: char ch1 = '\u0058'; //unicode for 'X'
8: char ch2 = '\u004D'; //unicode for 'M'
9: char ch3 = '\u0041'; //unicode for 'A'
10: char ch4 = '\u0053'; //unicode for 'S'
11:
12: System.out.println("ch1 = " + ch1);
13: System.out.println("ch2 = " + ch2);
14: System.out.println("ch3 = " + ch3);
15: System.out.println("ch4 = " + ch4);
16: }
17: }
55
เร่ิมตนการเขียนโปรแกรมดวย Java
ซ่งึ เม่ือ run แลว กจ็ ะไดผ ลลัพธเ หมอื นกันกับผลลัพธข องโปรแกรม Characters1.java intro. to Java (FEU.faa)
เราสามารถท่ีจะใช Unicode ในการแสดงตัวอกั ษรในภาษาไทยได เชนเดียวกันกบั ที่เราใช Unicode
ในการแสดงตัวอกั ษรในภาษาองั กฤษ แตวาระบบของเราจะตองเออ้ื ตอ การแสดงผลท่เี ปนตัว
อกั ษรไทยดวย ไมเชนนน้ั แลวผลลัพธท ่ไี ดกจ็ ะเปนตัวอักษรท่อี านไมรูเรอื่ ง หรอื ไมก็แสดงผลเปน
เคร่ืองหมาย '?' ทุกตัว
ถา ผูอา นสงั เกตใหดจี ะเห็นวาในบรรทดั ที่ 6 เราใช Unicode \u005B และ \u005D แทนเครอ่ื งหมาย
[] ซึ่งเปน การใชท่ี Java ยอมรบั เหมอื นกับการใช [] โดยตรง
ตารางท่ี 2.7 แสดงถงึ ตวั อักษรทใ่ี ชในการแสดงผลลพั ธท ่ีไมใชต วั อกั ษรธรรมดา หรอื ที่ภาษาองั กฤษ
เรยี กวา Character Escape Sequences ซึง่ เราสามารถนาํ มาใชในการจดั วางรปู แบบของผลลพั ธท ี่
เราตองการใหด แู ลวสวยงามขึ้น (อยา งหยาบ ๆ และ งาย ๆ)
ตาราง 2.7 Character Escape Sequence
Escape Sequence ความหมาย
\ddd แสดงผลลัพธเ ปน เลขฐานแปด (Octal)
\uxxxx แสดงตัวอักษร Unicode (Hexadecimal)
\' ตัว ' (Single quote)
\" ตัว " (Double quote)
\\ ตวั \ เอง
\r กลับไปยงั จดุ เร่ิมตน ของบรรทัด (Carriage return)
\n ข้ึนบรรทัดใหม (New line หรือ Linefeed)
\f เลอ่ื นไปหนาถดั ไป (Form feed)
\t เลื่อนไปยงั ตาํ แหนงถดั ไป (Tab)
\b เลอื่ นไปทางซา ยหน่งึ ตัวอักษร
2.13 การใชตัวแปรชนิด boolean
เราไดเ หน็ การประกาศตัวแปรที่เปน boolean มาเพียงนอ ยนดิ กอนหนานี้ ตอไปเราจะมาทาํ ความ
เขา ใจกบั ขอ มลู ทีเ่ ปน boolean และการประมวลตัวแปรหรอื ประโยคท่มี คี า ของการประมวลผลเปน
boolean อีกสักเลก็ นอ ยกอนทเี่ ราจะใชมันในโอกาสตอ ไป ผเู ขียนหลายทา นเรียก operator เหลาน้ี
วา Logical Operator
โดยทัว่ ไปเราสามารถประมวลผลขอ มูลท่ีเปน boolean ดว ย operator ตาง ๆ ท่เี หน็ นี้
&& หรอื ทเ่ี รียกวา Conditional AND
|| หรือทีเ่ รียกวา Conditional OR
& หรือทเ่ี รยี กวา Logical AND
| หรอื ท่เี รยี กวา Logical OR
! หรือทเ่ี รียกวา Logical NOT
&& และ || มกี ารประมวลผลในรปู แบบท่หี นงั สือหลาย ๆ เลม ใหช่ือวา Lazy หรอื Short Circuit ซงึ่ มี
รูปแบบการประมวลผลที่แตกตา งจาก & และ |
operator && ตา งจาก & โดยท่ี && นน้ั จะไมป ระมวลผล ประโยคหรอื ตวั แปรทต่ี ามหลงั ตวั มนั เอง ถา
ประโยคหรอื ตัวแปรทอ่ี ยกู อนหนา มีคา เปน false เพราะวาคา ท่เี ปน false เม่ือนาํ มาประมวลผลกับคา
อน่ื ๆ แลว จะได false เสมอ
operator || ก็เชน เดียวกันกบั && แตจะประมวลผลประโยคหรอื ตวั แปรทีต่ ามมาเมอื่ ประโยคแรกหรือ
ตวั แปรตัวแรกมีคา เปน true เพราะวา ประโยคหรอื ตวั แปรท่ีมีคา เปน true เม่อื นํามาประมวลกับคา ใด ๆ
ก็ตามจะไดค า true เสมอ
56
บทที่ 2: ขอ มลู ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
สว น operator & และ | จะประมวลผลประโยคและตัวแปรทงั้ สองเสมอ
และ operator ! น้นั เมื่อไปอยูหนาตวั แปรหรือประโยคที่มีคาทาง boolean คาใดคา หน่งึ กจ็ ะเปลี่ยน
คานน้ั ใหเ ปนตรงกนั ขามทันที
Operator ตวั อน่ื ๆ ที่ใชกับตัวแปรหรอื ประโยคทม่ี ีคา เปน boolean มีดงั น้ี
< ใชในการเปรียบเทยี บวา คาทางดา นซา ยของเคร่อื งหมาย นอ ยกวา คาทางดานขวาหรอื ไม
> ใชในการเปรียบเทยี บวา คา ทางดานซา ยของเครอื่ งหมาย มากกวา คา ทางดา นขวาหรอื ไม
<= ใชในการเปรียบเทยี บวา คา ทางดา นซา ยของเคร่ืองหมาย นอ ยกวาหรือเทา กบั คาทางดานขวา
หรือไม
>= ใชในการเปรยี บเทยี บวา คาทางดานซายของเครอื่ งหมาย มากกวาหรอื เทา กบั คาทางดา นขวา
หรอื ไม
== ใชในการเปรียบเทียบวา คา ทางดา นซา ยของเคร่อื งหมาย เทากบั คาทางดานขวาหรอื ไม
!= ใชในการเปรียบเทยี บวา คา ทางดา นซา ยของเครอื่ งหมาย ไมเทา กบั คา ทางดา นขวาหรอื ไม
เราเรียก operator เหลานว้ี า Relational operator ซึง่ เอาไวใ ชในการตรวจสอบความสมั พนั ธข องตวั
แปรหรอื ประโยควา มีคา แตกตา งกนั อยา งไรเม่ือนาํ มาเปรียบเทียบกนั
เราจะลองเขียนโปรแกรมตรวจสอบ operator ตาง ๆ เหลา นด้ี ู
1: /**
2: Testing boolean operations
3: */
4:
5: class BooleanOp {
6: public static void main(String[] args) {
7: boolean A = true, B = false;
8:
9: System.out.println("Conditional AND");
10: System.out.println("F && F is " + (B && B));
11: System.out.println("F && T is " + (B && A));
12: System.out.println("T && F is " + (A && B));
13: System.out.println("T && T is " + (A && A));
14:
15: System.out.println("Conditional OR");
16: System.out.println("F || F is " + (B || B));
17: System.out.println("F || T is " + (B || A));
18: System.out.println("T || F is " + (A || B));
19: System.out.println("T || T is " + (A || A));
20:
21: System.out.println("Logical AND");
22: System.out.println("F & F is " + (B & B));
23: System.out.println("F & T is " + (B & A));
24: System.out.println("T & F is " + (A & B));
25: System.out.println("T & T is " + (A & A));
26:
27: System.out.println("Logical OR");
28: System.out.println("F | F is " + (B | B));
29: System.out.println("F | T is " + (B | A));
30: System.out.println("T | F is " + (A | B));
31: System.out.println("T | T is " + (A | A));
32:
33: System.out.println("Logical NOT");
34: System.out.println("!F is " + (!B));
35: System.out.println("!T is " + (!A));
36: }
37: }
โปรแกรมประกาศตวั แปรสองตวั A และ B ดว ยคา true และ false ตามลําดบั และทําการแสดงผล
ลัพธข องการประมวลผลดวย operator ผานทาง System.out.println() ผลลพั ธท่แี สดงออกทาง
หนา จอ คอื
Conditional AND
F && F is false
F && T is false
57
เริ่มตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa)
T && F is false
T && T is true
Conditional OR
F || F is false
F || T is true
T || F is true
T || T is true
Logical AND
F & F is false
F & T is false
T & F is false
T & T is true
Logical OR
F | F is false
F | T is true
T | F is true
T | T is true
Logical NOT
!F is true
!T is false
ทีนลี้ องมาดโู ปรแกรมการใช Relational operator (BooleanOp2.java)
1: /**
2: Using relational operators
3: */
4:
5: class BooleanOp2 {
6: public static void main(String[] args) {
7: int i = 5, j = 10;
8:
9: System.out.println("i = " + i);
10: System.out.println("j = " + j);
11: System.out.println("i > j is " + (i > j));
12: System.out.println("i < j is " + (i < j));
13: System.out.println("i >= j is " + (i >= j));
14: System.out.println("i <= j is " + (i <= j));
15: System.out.println("i == j is " + (i == j));
16: System.out.println("i != j is " + (i != j));
17: System.out.println("(i < 10) && (j < 10) is " + ((i < 10) && (j < 10)) );
18: System.out.println("(i < 10) || (j < 10) is " + ((i < 10) || (j < 10)) );
19: }
20: }
โปรแกรม BooleanOp2.java ทาํ การหาคา ของประโยคตาง ๆ ในรปู แบบงาย ๆ เพ่อื ใหผ อู า นไดเหน็
ถึงผลลัพธของการใช operator ตาง ๆ ไดอ ยา งชัดเจน เราประกาศตัวแปรทเ่ี ปน int สองตวั คอื i
และ j ซึง่ กาํ หนดใหมคี าเปน 5 และ 10 ตามลาํ ดับ หลงั จากนน้ั โปรแกรมก็ใช operator ตาง ๆ กบั ตัว
แปรสองตวั น้ี
และเมอื่ run โปรแกรมนี้แลว ผลลัพธท่ีได คอื
i=5
j = 10
i > j is false
i < j is true
i >= j is false
i <= j is true
i == j is false
i != j is true
(i < 10) && (j < 10) is false
(i < 10) || (j < 10) is true
เพอื่ ใหเห็นภาพของการประมวลของ operator && และ operator || ไดชัดเจนยง่ิ ขึ้น ผูอ านควร
ตรวจสอบจากแผนภาพของการประมวลผลนี้ (ภาพที่ 2-4 และ 2-5) โดยเราไดกาํ หนดใหต ัวแปร p
58
บทที่ 2: ขอมูล ตัวแปร และการประมวลผล
และ q มีคา เปน 5 และ 10 ตามลําดบั ในการประมวลผลทางดา นซา ย และใหม คี าเปน 10 และ 5 ใน intro. to Java (FEU.faa)
การประมวลผลทางดา นขวา
(p < q) p = 5, q = 10 (p < q) p = 10, q = 5
&& (q <= 10) && (q <= 10)
T TF
ไมตองประมวลตอ เพราะ F
&& กบั อะไรก็ได F
T
ภาพท่ี 2- 4 การประมวลผลดว ย &&
(p < q) p = 5, q = 10 (p < q) p = 10, q = 5
|| (q <= 10) || (q <= 10)
T ไมต อ งประมวลผลตอเพราะ T || กับ F T
อะไรก็ได T
T
ภาพที่ 2-5 การประมวลผลดว ย ||
ตาราง 2.8 ไดส รุปคาของการประมวลผลดว ย operator && || & | ดังทไ่ี ดก ลาวมาแลว
ตาราง 2.8 การใช operator && || & และ |
P Q P && Q P || Q P&Q P|Q
true true
true true true true false true
false true
false true false true false false
true false false true
false false false false
เราคงมองไมเห็นถึงประโยชนข องการใชต ัวแปรทเ่ี ปน boolean และการใช operator ตาง ๆ ทไ่ี ดพูด
ถึงในตอนนอ้ี ยา งมากมายนัก การประมวลผลของตวั แปรทเ่ี ปน boolean สวนใหญจ ะเอาไวชวยการ
ตรวจสอบถึงเหตกุ ารณ (condition) ตา ง ๆ ทอ่ี าจเกิดขึ้นในโปรแกรม เชน ถา ประโยคที่หนง่ึ เมอ่ื
นาํ มาประมวลผลกบั ประโยคที่สองแลว ผลลพั ธทไี่ ดเ ปน true หรือ false ซ่งึ ถาเปน true เราจะทํา
การอยางอ่ืน และก็จะทาํ การอ่ืนหากเปน false เปน ตน เราจะพดู ถึง boolean operator ตาง ๆ เมอ่ื
เราพูดถงึ เร่อื งของ logic และเรอ่ื งของการประมวลผลในรปู แบบของการวนซ้าํ (logic and loop)
59
เรมิ่ ตน การเขยี นโปรแกรมดวย Java
2.14 การประมวลผลในระดบั bit ดวยการใช operator Shift และ Bitwise
ในการทํางานในระดบั bit นน้ั มี operator ไมก่ตี ัวทเ่ี ราสามารถเรียกใชได ซึ่งการใชง านโดยทัว่ ไปก็ intro. to Java (FEU.faa)
ไมงายนกั เพราะตอ งทาํ ในระดับ bit และผูใ ชตองมีความเขาใจในเรอ่ื งของเลขฐานสองอยางดี
พอสมควร เราจะยกตัวอยางเพียงไมก ่ีตวั อยา งเพ่ือใหเ หน็ ถึงการใชงานของ operator shift ตา ง ๆ ท่ี
Java มีให คือ << >> และ >>>
ตาราง 2.9 การใช operator shift << >> และ >>>
Operator วิธใี ช ความหมาย
<< operand1 << operand2 โยก bit ของ operand1 ไปทางซายจาํ นวนเทากับ
คา ของ operand2 เตมิ 0ทุก ๆ bit ทางขวา
>> operand1 >> operand2 โยก bit ของ operand1 ไปทางขวาจาํ นวนเทา กับ
คาของ operand2 เตมิ ดวยคา bit (sign bit)สูงสุด
ทางซา ย
>>> operand1 >>> operand2 โยก bit ของ operand1 ไปทางขวาจาํ นวนเทากับ
คาของ operand2 เตมิ 0ทกุ ๆ bit ทางซาย
ตวั อยา ง
13 >> 1
13 = 000011012 เมอื่ shift ไปทางขวา 1 bit ผลลัพธท ไ่ี ดค อื 000001102 (เทากับ 6 ในเลขฐาน
10)
13 << 1
shift ไปทางซาย 1 bit ผลลัพธท ่ีไดค อื 000110102 (เทากบั 26 ในเลขฐาน 10)
13 >>> 1
shift ไปทางขวา 1 bit ผลลพั ธท่ไี ดคอื 000001102 (เทา กับ 6 ในเลขฐาน 10)
การโยก bit ไปทางซา ยคร้งั ละหนึ่ง bit นัน้ ท่ีจรงิ แลว ก็คือการคณู ดวยสอง เรามาดูตวั อยางโปรแกรม
การโยก bit ไปทางซา ยกัน จากโปรแกรม ShiftLeftOp.java ทเ่ี หน็ ดา นลา งนี้
1: /**
2: Using left-shift operator
3: */
4:
5: class ShiftLeftOp {
6: public static void main(String[] args) {
7: byte bits = 1;
8:
9: System.out.println("Value of bits is " + bits);
10: bits = (byte) (bits << 1);
11: System.out.println("Value of bits is " + bits);
12: bits = (byte) (bits << 1);
13: System.out.println("Value of bits is " + bits);
14: bits = (byte) (bits << 1);
15: System.out.println("Value of bits is " + bits);
16: bits = (byte) (bits << 1);
17: System.out.println("Value of bits is " + bits);
18: bits = (byte) (bits << 1);
19: System.out.println("Value of bits is " + bits);
20: bits = (byte) (bits << 2);
21: System.out.println("Value of bits is " + bits);
22: }
23: }
เราเรม่ิ ดวยการกําหนดใหตวั แปร bits มีชนดิ เปน byte และมีคาเทา กับหนึง่ โปรแกรมทําการโยก bit
ไปทางซายจํานวนเทา กบั หา ครง้ั ซ่ึงในการโยกแตละคร้ังเราก็จะไดค าใหมท มี่ ีคาเทา กับคาเดิมคูณ
ดว ยสอง ดังที่เหน็ จากผลลัพธของการ run โปรแกรมน้ี
Value of bits is 1
Value of bits is 2
Value of bits is 4
60
บทที่ 2: ขอ มลู ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
Value of bits is 8
Value of bits is 16
Value of bits is 32
เราเลือกใชข อมูลชนดิ ท่ีเปน byte กเ็ พอื่ ใหเ หน็ วาถาเราโยก bit อีกคร้ังดวยจํานวน bit ทตี่ องการโยก
เทากับสอง bit (ครง้ั ทีห่ ก ในบรรทดั ที่ 20) เราจะไดค า ที่ตัวแปร bits ไมส ามารถเกบ็ ได ลองดู code
ทเี่ พิ่ม และ ผลลพั ธของการ run
bits = (byte) (bits << 2);
System.out.println("Value of bits is " + bits);
ผลลัพธเม่ือ run อกี คร้ังดวย code ท่ีเพิ่มขึ้นจะเห็นวาคา ของ bits ทไ่ี ดม ีคา เปน -128 ซึง่ เปน คาที่
Java เปนผูกาํ หนดให แตไมใ ชค า ที่ถูกตอง เพราะขอมูลที่เปน byte น้ันเก็บคา สงู สดุ ทเี่ ปน บวกได
เพียงแค 127 เทานนั้
Value of bits is 1
Value of bits is 2
Value of bits is 4
Value of bits is 8
Value of bits is 16
Value of bits is 32
Value of bits is -128
สง่ิ สาํ คญั อีกสง่ิ หน่ึงกค็ อื การ cast เราจาํ เปน ตอ งเปลีย่ นขอ มูลใหถกู ตอ งตามชนดิ ของตวั แปร
เน่อื งจากวา Java ไดท ําการเปลย่ี นตัวแปร bits ของเราใหเปน int กอ นท่ีจะทําการ shift ดงั น้ันเรา
ตองเปลีย่ นขอมูลใหก ลบั มาเปน ชนดิ เดิมกอ นการจัดเกบ็ (หลงั จากการ shift สน้ิ สดุ ลง)
การใช >> และ << นน้ั สามารถทําใหจาํ งายข้นึ ดังนีค้ อื การโยก bit ไปทางขวาดวย >> นน้ั เปน
การหารตวั เลขน้ัน ๆ ดว ยสองยกกาํ ลังของจํานวน bit ทต่ี องการโยก เชน
128 >> 4 จะใหค า 128/24 = 16
-256 >> 4 จะใหค า -256/24 = -16
สวนการโยก bit ไปทางซา ยดว ย << นัน้ หมายถงึ การคณู ตวั เลขน้นั ๆ ดวยสองยกกาํ ลังจํานวน bit ท่ี
ตองการโยก เชน
128 << 1 จะใหคา 128 * 21 = 256
16 << 2 จะใหค า 16 * 22 = 64
โปรแกรมตัวอยา งตอ ไปน้ีเปน การแสดงการใช bitwise operator สามตวั คอื bitwise AND (&),
bitwise OR (|) และ bitwise exclusive OR (XOR)
1: /**
2: Show bitwise operations
3: */
4:
5: class BitwiseOperations {
6: public static void main(String[] args) {
7: byte bits = 5;
8:
9: System.out.println("Value of bits is " + bits);
10:
11: //using bitwise AND
12: bits = (byte)(bits & 5);
13: System.out.println("Value of bits is " + bits);
14:
15: //using bitwise OR
16: bits = (byte)(bits | 7);
17: System.out.println("Value of bits is " + bits);
18:
19: //using bitwise exclusive OR (XOR)
20: bits = (byte)(bits ^ 4);
21: System.out.println("Value of bits is " + bits);
22: }
23: }
61
เริ่มตน การเขยี นโปรแกรมดวย Java
การใช bitwise operator ทง้ั สามตัวมหี ลักการทําดงั ทีแ่ สดงในตารางที่ 2.10 นี้ intro. to Java (FEU.faa)
ตาราง 2.10 การใช bitwise operator &, |, และ ^
Operator วธิ ีใช ผลลัพธ
& operand1 & operand2 ถาคาของ bit เปน 1 ทัง้ คูผ ลลัพธท ไ่ี ดจะมีคาเปน
1
| operand1 | operand2 ถาคา ของ bit ตวั ใดตัวหนง่ึ เปน 1 ผลลพั ธท ีไ่ ดจ ะมี
คาเปน 1
^ operand1 ^ operand2 ถาคาของ bit ตางกนั ผลลัพธท ีไ่ ดจะมคี าเปน 1
โปรแกรม BitwiseOperations.java ทําการ & คา 5 กบั 5 ในบรรทดั ที่ 12 ซงึ่ ทําใหเ ราไดผลลพั ธ
เปน 5 (00000101 & 00000101 = 00000101) ในบรรทัดท่ี 16 เราทาํ การ | คา 5 กับ 7 เราก็ได
ผลลัพธเ ปน 7 (00000101 | 00000111 = 00000111) และในบรรทัดที่ 20 เราทําการ ^ คาของ 7
กบั 4 ซ่ึงไดผ ลลัพธเ ปน 3 (00000111 ^ 00000100 = 00000011)
เราไดพ ดู ถึงการประกาศตัวแปร การกาํ หนดคาใหก บั ตัวแปรท่อี ยภู ายในตัวโปรแกรม ดว ยขอมูลท้งั ที่มี
ชนดิ เปน integer และ floating-point ซึ่งการกําหนดคา ใหกับตัวแปรภายในโปรแกรมนั้น ไมมคี วาม
ยดื หยนุ ของขอมูลท่ถี กู เก็บอยูในตัวแปรนนั้ หากผูใช หรือ ผูเขียนโปรแกรมตองการท่ีจะเปล่ยี นคาท่ี
ตัวแปรนน้ั เกบ็ อยู ผูเขยี นจะตองเปนผูแกไ ขแตเพยี งฝา ยเดียว ผูใชโ ปรแกรมไมสามารถท่ีจะเปล่ียนคา
เหลาน้ันได ดังนน้ั การเขียนโปรแกรม จะตองใหโอกาสผใู ชโปรแกรมในการเปลีย่ นแปลงคา เหลาน้นั
Java มี method อยูหลายตวั ทรี่ องรบั การใสขอ มูลผา นทาง keyboard เราจะมาทําความรูจัก และ
เขา ใจถึงวิธีการ ซึง่ คอนขางจะซับซอนพอสมควรสาํ หรับผูเร่ิมหัดเขยี นโปรแกรมใหม อยา งไรก็ตาม
หลังจากท่ีไดทําความเขาใจแลว กจ็ ะเห็นวา การรับคาตาง ๆ ผา นทาง keyboard นั้นเปน เรื่องที่ (จริง
ๆ แลว) ไมยงุ ยากเลย
2.15 การกาํ หนดคาใหกบั ตวั แปรผา นทางสื่อการนําเขา ขอมลู มาตรฐาน
ใน Java รุนกอ น 1.5 เราไมส ามารถเรยี กใช method ใด ๆ ทรี่ บั คาขอ มูลตามชนิดนั้น ๆ ของขอมลู ท่ี
เขา มาเลย เชน ถา ผใู ชโปรแกรมตองการท่ีจะใสค า ทเ่ี ปน int float double หรอื char ผเู ขียน
โปรแกรมก็ไมสามารถทจี่ ะรบั คาตา ง ๆ เหลา นไี้ ดโ ดยตรง เหมือนกับการเขียนโปรแกรมดวยภาษาอ่นื
ๆ เชน C หรือ C++ แตต ัวผูเขยี นเองจะตอ งเขียน code ข้นึ มารองรบั คาเหลานผี้ า นทางการอา นเขา
แบบทเ่ี รียกวา การรับขอมลู ท่ีเปน String ซง่ึ เมื่ออาน String ไดแ ลว ก็ตอ งแปลง String ใหเปน ชนิด
ของขอ มูลท่ีผูเขยี นโปรแกรมตองการใหเ ปน [แตใ น Java รุน 1.5 เราสามารถอานคา เหลานผี้ านทาง
keyboard ไดเลย ซึ่งเราจะไดพดู ตอไปในเรือ่ งของ Scanner]
ผูอานอาจสงสัยวา String คืออะไร ในท่นี จ้ี ะอธบิ ายอยา งครา ว ๆ เนอื่ งจากวาเราจะพูดถึง String ใน
บทอนื่ ตอไป ใน Java นั้น String เปน object (อกี แลว object? เชน เดียวกันเราจะพดู ถงึ object
อยางละเอียดในบทอื่น) ซง่ึ สามารถเกบ็ ตัวอกั ษรไดคราวละมาก ๆ ขอยกตวั อยางงา ย ๆ ใหด ูก็แลว กนั
People of Thailand
สวสั ดี
price_of_coffee
1234567890
23+popOfRock
ตวั อยางท่เี หน็ ดานบนน้ลี ว นแลวแตเ ปน String ทั้งนัน้ ทีน้เี รามาลองดูวิธกี ารอา น String เขามาจาก
keyboard แลว กเ็ ปลยี่ น String ใหเ ปน ขอมูลชนิดตา ง ๆ ที่เราตองการ เริ่มดว ยการเปลย่ี นแปลง
code ของโปรแกรม Radius.java ใหรบั คาของ area จาก keyboard แทนการกําหนดภายใน
โปรแกรม
1: /**
2: Reading data from keyboard
3: */
4: import java.io.*;
5:
6: class Radius2 {
7: public static void main(String[] args) throws IOException {
8: double radius, area;
62
บทท่ี 2: ขอ มูล ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
9: int meters, centimeters;
10: String inputString = null;
11:
12:
13: //prompt user for area of a circle
14: System.out.print("Enter area of a circle: ");
15:
16: //get string from keyboard
17: InputStreamReader in = new InputStreamReader(System.in);
18: BufferedReader buffer = new BufferedReader(in);
19: inputString = buffer.readLine();
20:
21: //convert string to double
22: area = Double.parseDouble(inputString);
23:
24: //calculate radius
25: radius = Math.sqrt(area / Math.PI);
26:
27: //convert to meters and centimeters
28: meters = (int)Math.floor(radius);
29: centimeters = (int)Math.round(100.0 * (radius - meters));
30:
31: System.out.print("Circle with area of " + area + " square meters ");
32: System.out.print("has a radius of " + meters + " meters and ");
33: System.out.println(centimeters + " centimeters");
34: }
35: }
โปรแกรม Raadius2.java เพ่ิม code ใหอาน String จาก keyboard ดว ยประโยค
System.out.print("Please enter area of a circle: ");
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(in);
String inputString = buffer.readLine();
ประโยคแรกสุดเปนการสงขอความไปยัง user ใหร วู า ตอ งใสขอมลู อะไรเขา สูโ ปรแกรม ประโยคถดั มา
อา นขอมลู ในรูปแบบของ byte จากระบบ (System.in) เปลย่ี นขอมูลเหลานน้ั ใหเปน character แลว
จงึ นํามาเกบ็ ไวในตวั แปร in ประโยคท่ีสามทําการจองเนือ้ ท่ีใหกบั ตัวแปร buffer พรอ มกบั นําคา
character ที่อยูในตวั แปร in มาเกบ็ ไวในรปู แบบของ String เมอ่ื ได String (ซง่ึ ตอนนีอ้ ยใู นตัวแปร
buffer) เรากท็ ําการอา น String ท่ีวานี้ดวย method readLine() ผานทางตวั แปร buffer แลว จึง
นาํ ไปเกบ็ ไวในตัวแปรชนิด String ทมี่ ีช่ือวา inputString
ฟงดูแลว รสู กึ วามีขัน้ ตอนมากมายในการอา น String แตต อนน้ีขอเพยี งแตจําวาถาจะอา น String จาก
keyboard ตองทาํ ดวยวิธีน้ี (ณ เวลานี้ เพราะยังมอี กี หลายวธิ ที ีเ่ ราสามารถทําได)
เม่อื เราได String แลว ขน้ั ตอนตอ ไปก็คอื การเปลย่ี น String ใหเ ปน ขอ มูลชนิดท่ีเราตองการใชใน
โปรแกรม ซึง่ โปรแกรม Radius2.java ของเราตอ งการใชข อมลู ชนดิ ทเ่ี ปน double เราจึงตองทําการ
เปลยี่ น String นี้ใหเ ปน double ดวยการเรียกใช method parseDouble() จาก class Double พรอม
ทั้งสง ตวั แปรทเ่ี กบ็ ขอมูลจาก keyboard ไปใหแก method นด้ี ว ย
area = Double.parseDouble(inputString);
หลังจากนัน้ code ของโปรแกรมท่เี หลือกเ็ หมือนกับท่ีเราไดเขียนกอนหนานี้ และเมือ่ run โปรแกรม
ดู สองครง้ั ดวยคา 850 ในครัง้ แรกและคา 54 ในคร้งั ทส่ี อง เรากไ็ ดผ ลลัพธ ดังที่แสดงใหเห็นนี้
Please enter area of a circle: 850
Circle with area of 850.0 square meters has a radius of 16 meters and 45
centimeters
Please enter area of a circle: 54
Circle with area of 54.0 square meters has a radius of 4 meters and 15 centimeters
ถาสงั เกตใหด ีจะเห็นวา โปรแกรม Radius2.java นนั้ มีขอ ความเพ่ิมตอ ทา ยของ main(..) คอื
throws IOException
63
เริม่ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
เหตผุ ลที่เราตองเพมิ่ throws IOException ใหกบั main(…) กเ็ พราะวา การอา นขอมลู เขาสู
โปรแกรมน้ัน บางคร้ังกอ็ าจเจอกับปญหาในการอา น เชน อานไมได และเหตผุ ลอกี อนั หนึ่ง คือ Java
บงั คับใหเราตองตรวจสอบการทาํ งานกับ I/O เอง ซึ่งถา หากมปี ญหาเกดิ ขน้ึ เราจะไดแกไขไดถ กู ตอง
มวี ธิ กี ารตรวจสอบและปอ งกนั ไมใ หการอานมีปญ หาหลากหลาย ซ่งึ เราจะไดด กู นั ในโอกาสตอไป
(บทที่ 7) ลองมาดูวา ถา เราไมใสข อ ความทวี่ า ลงไปในโปรแกรม Radius2.java เราจะได error อะไร
Radius2.java:16: unreported exception java.io.IOException; must be caught or
declared to be thrown
String inputString = buffer.readLine();
^
1 error
จะเห็นวา Java จะบอกใหเ รารูวา เราไมส ามารถท่จี ะอา นขอ มูลเขา สูโ ปรแกรมได ถาเราไมทาํ การ
ตรวจสอบดว ยวิธที ่ไี ดก ลาวไว ประโยคทว่ี า
must be caught or declared to be thrown
กลา วถึงวิธี สองวิธี ท่เี ราสามารถใชไดในการอานขอ มูลเขาสโู ปรแกรม คอื (1) ตรวจจับ – catch และ
(2) เรยี กใช throws ของ Java
ตอไปจะไดแสดงการใชวิธที ่หี น่ึง ซึ่งเปนการตรวจจับ error ในการอานขอมลู แตจ ะพูดเพียงเพ่ือให
การอา นขอ มลู ทําไดส มบรณู เ ทาน้ัน คงจะไมกลา วถงึ อยางละเอยี ดมากมายนัก เรามาเริ่มตนดว ยการ
เขยี น code เพ่ิมข้ึนใหม ดงั ท่ีแสดงใหเห็นน้ี
1: /**
2: Reading data from keyboard with error detection
3: */
4:
5: import java.io.*;
6:
7: class Radius3 {
8: public static void main(String[] args) throws IOException {
9: double radius, area;
10: int meters, centimeters;
11: String inputString = null;
12:
13: try {
14: //prompt user for area of a circle
15: System.out.print("Please enter area of a circle: ");
16:
17: //get string from keyboard
18: InputStreamReader in = new
InputStreamReader(System.in);
19: BufferedReader buffer = new BufferedReader(in);
20: inputString = buffer.readLine();
21: }
22: catch(IOException ioe) {}
23:
24: //convert string to double
25: area = Double.parseDouble(inputString);
26:
27: //calculate radius
28: radius = Math.sqrt(area / Math.PI);
29:
30: //convert to meters and centimeters
31: meters = (int)Math.floor(radius);
32: centimeters = (int)Math.round(100.0 * (radius - meters));
33:
34: System.out.print("Circle with area of " + area + " square meters ");
35: System.out.print("has a radius of " + meters + " meters and ");
36: System.out.println(centimeters + " centimeters");
37: }
38: }
สงิ่ ท่เี ราไดปรบั ปรงุ คือประโยค ตอ ไปนี้
String inputString = null;
64
บทท่ี 2: ขอ มูล ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
//prompt user for area of a circle
System.out.print("Please enter area of a circle: ");
try {
//get string from keyboard
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(in);
inputString = buffer.readLine();
}
catch(IOException ioe) {}
เรายายการประกาศตัวแปร inputString ไปอยกู อ นประโยคท่ีอานขอ มลู เขาพรอมกบั เพม่ิ ประโยค
try {
…
…
…
}
catch(IOException ioe) {}
เขาสูโ ปรแกรมดวยการนําเอาประโยคการอา นขอ มลู เขา สู string ทัง้ สามประโยคไวใ น block ของ try
{} สว นคาํ วา catch(IOException ioe) {} นน้ั เรากเ็ พ่มิ เขาหลังจาก block ของ try {} เราไม
จาํ เปน ตอ งใส code อะไรเขาไปใน code ของ catch(IOExcpetion ioe) {} เพราะเราเพียงแต
ตอ งการใหการอา นเปน ไปไดดวยดเี ทานั้น เรายังจะไมกังวลถงึ error ทเี่ กดิ ขน้ึ ซงึ่ ถามี error เกดิ ขึน้
Java กจ็ ะเปนผูฟองใหเ ราทนั ที
เพื่อใหเ กิดความเขาใจอีกสกั หนอย เราจะมาตรวจสอบการใสขอมลู ของผใู ชดวู า ไดม กี ารใสขอ มลู เขา
สโู ปรแกรม หรือเพียงแตกดปมุ Enter เฉย ๆ เราทําการตรวจสอบดว ยการเพม่ิ try {..} และ catch()
{} ใหก ับโปรแกรม Radius3.java ดังนี้
1: /**
2: Reading data from keyboard with error detection
3: */
4: import java.io.*;
5:
6: class Radius4 {
7: public static void main(String[] args) {
8: double radius, area;
9: int meters, centimeters;
10: String inputString = null;
11:
12: //prompt user for area of a circle
13: System.out.print("Please enter area of a circle: ");
14: try {
15: //get string from keyboard
16: InputStreamReader in = new InputStreamReader(System.in);
17: BufferedReader buffer = new BufferedReader(in);
18: inputString = buffer.readLine();
19:
20: try {
21: //convert string to double
22: area = Double.parseDouble(inputString);
23:
24: //calculate radius
25: radius = Math.sqrt(area / Math.PI);
26:
27: //convert to meters and centimeters
28: meters = (int)Math.floor(radius);
29: centimeters = (int)Math.round(100.0 * (radius - meters));
30:
31: System.out.print("Circle with area of " +
area + " square meters ");
32: System.out.print("has a radius of " +
meters + " meters and ");
33: System.out.println(centimeters + " centimeters");
34: }
35: //catch empty string (user hits Enter)
36: catch(Exception e) {
37: System.out.println("Error! you must supply input");
38: e.printStackTrace();
65
เริ่มตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
39: System.exit(1);
40: }
41: }
42: //catch other I/O error - do nothing
43: catch(IOException ioe) { /* leave it to Java! */ }
44: }
45: }
โปรแกรม Radius3.java ท่ีเราเขียนขึ้นใหมม ี try {…} และ cath() {} อยูสองตวั ตัวแรกใชตรวจสอบ
เร่อื งของการอานทวั่ ไปทีไ่ ดก ลาวไปแลว สวนตัวที่สองเปน การตรวจสอบวา ผูใชมีการใสข อ มูลหรือไม
ซ่ึงถา ไมใส เราก็จะสง ขอ ความไปยังหนา จอดวยคาํ สัง่ System.out.println("Error! you must
supply input");
1. สงขอ ความ error ที่ Java ไดฟ องไว ดว ยคําสงั่ e.printStackTrace();
2. ออกจากโปรแกรมโดยไมมกี ารประมวลผลใด ๆ ท้งั สิ้น ดว ยคาํ ส่ัง System.exit(1);
และเม่ือ execute ดเู รากจ็ ะไดข อ ความดงั นี้
Please enter area of a circle: < User กดปุม Enter >
Error! you must supply input
java.lang.NumberFormatException: empty String
at sun misc FloatingDecimal.readJavaFormatString (Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at Radius4.main(Radius4.java:22)
โดยท่ัวไปการออกจากโปรแกรมทีไ่ มม ปี ญ หาใด ๆ ในการเขียนดว ยภาษา Java น้นั เราจะใชการออก
ดว ยเลข 1 ในประโยค System.exit(1) หรือเลขอ่ืน ๆ ท่ีไมใ ช 0 สวนการออกแบบปกตินั้นเราใชเลข
0 แทนเลข 1
เราคงจะพักการตรวจสอบ หรือ ตรวจจับ error ไวเ พียงแคน ีก้ อนเราจะกลบั มาพูดถึงการเขยี น code
รองรับ error ในบทอนื่ ตอ ไป
2.15.1 การนาํ ขอมูลเขา ผา นทาง Scanner
การนําขอ มลู เขากอ นหนา น้ดี ูไปแลวจะรสู ึกวามขี ้ันตอนท่คี อ นขางจะยุงไปสักหนอย (ยิ่งถาผูอา นเคย
เขียนโปรแกรมดวยภาษาอน่ื เชน C แลวยงิ่ จะมีความหงุดหงิดกับการนําขอมลู เขา ของ Java)
เพราะฉะน้ัน เราจะมาดกู นั ถึงการนาํ ขอ มลู เขาดวยการใช Scanner
Scanner เปน ตัวกลางทย่ี อมใหม กี ารโยกยา ยขอมูลจากแหลง หนึ่งไปอีกแหลง หนงึ่ เชน จาก
keyboard เขาสตู วั แปรเปนตน โปรแกรมตวั อยางท่เี หน็ เปนการอา นขอ มลู เขา จาก keyboard ผาน
ทาง Scanner
1: /**
2: Reading numbers via Scanner
3: */
4:
5: import java.util.Scanner;
6: import static java.lang.System.out;
7:
8: class AddIntegers {
9: public static void main(String[] args) {
10: //setup input channel via command prompt
11: Scanner input = new Scanner(System.in);
12:
13: int number1, number2;
14: int sum;
15: float average;
16:
17: //prompt for two integers
18: out.print("Enter first integer: ");
19: number1 = input.nextInt();
20: out.print("Enter second integer: ");
21: number2 = input.nextInt();
22:
23: //find sum and average
66
บทท่ี 2: ขอ มลู ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
24: sum = number1 + number2;
25: average = sum / 2.0F;
26:
27: //display results
28: out.printf("Sum of two integers is %d%n", sum);
29: out.printf("Average of two integers is %.2f%n", average);
30: }
31: }
ในบรรทัดท่ี 11 เรากําหนดใหก ารนําขอ มลู เขาผา นทาง command prompt โดยใช Scanner เปน
ตัวกลาง และเราอา นขอมูลท่ีเปน integer ในบรรทัดที่ 19 และ 21 ซง่ึ เราจําเปนตอ งอาศัย method
nextInt() เปนตัวอา นให class Scanner มี method หลายตัวท่ีเราสามารถเรยี กใชอานขอ มลู ชนดิ
ตา ง ๆ ได เชน
ขอ มูลที่เปน integer ใช nextInt()
ขอ มลู ท่ีเปน float และ double เรยี กใช nextFloat() และ nextDouble() ตามลําดบั
ขอมลู ท่ีเปน long และ short เรียกใช nextLong() และ nextShort() ตามลาํ ดบั
ถา ตองการอา นขอ มูลอน่ื ๆ โดยไมสนใจชนดิ เราก็เรยี กใช next() ซ่งึ หมายถงึ การอา นขอมูลตวั ถัดไป
หรอื nextLine() ท่ีหมายถงึ การอา นขอมลู ท้งั บรรทดั
สวนการตรวจสอบวามีขอ มูลอยูอ ีกหรือไมเ รากเ็ รยี กใช hasNext(), hasNextInt(), หรือ
hasNextDouble()
Class Scanner ยงั มี method อน่ื ๆ ใหเ ราเรยี กใชไดอีกมาก ทั้งนี้ผูอา นสามารถหาดไู ดจาก Java
API ไดเอง
2.15.2 การนําขอมลู เขา และออกผาน Dialog Box
การนาํ ขอ มูลเขาสโู ปรแกรมผา นสือ่ นาํ เขาขอ มูลท่ีเราไดใชม ากอนหนา นี้ ดจู ะยงุ ยากพอสมควร มี
วธิ กี ารนาํ ขอมลู เขาอกี ทางหนง่ึ ท่ผี เู ขียนคิดวาทาํ ไดง ายและสะดวกกวา นัน้ ก็คือการนาํ ขอ มลู เขาผา น
ทาง InputDialog ซง่ึ เปน Method ที่ Java มไี วใหใ นกลุมท่ีใช Swing
เราคงจะไมเขาไปดถู ึงรายละเอยี ดมากมายในเรือ่ งของการใช Swing เราเพียงแตห ยบิ เอา method
บางตวั ท่เี ราคดิ วา เออ้ื การทาํ งานของเราใหง า ยข้นึ ลองมาดตู ัวอยางโปรกแกรมการนาํ ขอมูลเขาผาน
ทาง InputDialog
1: /**
2: Reading input via InputDialog
3: */
4: import javax.swing.*;
5:
6: class InputTest {
7: public static void main(String[] args) {
8: //get name
9: String name = JOptionPane.showInputDialog("What is your name?");
10:
11: //get age
12: String ageStr = JOptionPane.showInputDialog("Tell me you age.");
13: int age = Integer.parseInt(ageStr);
14:
15: //send output to standard output device (console)
16: System.out.println("Hello " + name + " " +
17: age + " is very young!");
18:
19: System.exit(0);
20: }
21: }
หลงั จากที่ compile และ run โปรแกรม หนาตา งแรกทเ่ี ราไดค ือ
67
เรมิ่ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
Prompt user เพ่ือใสข อมลู
กดปมุ OK เพื่อยอมรับขอมูล ซึ่ง กดปุม Cancel เพอ่ื ยกเลิกขอมลู
จะทาํ ให dialog box ปดตวั เอง พรอ มกบั ปด dialog box
ลงดว ย
หลงั จากท่ีใสขอมลู Peter Pan เรากก็ ดปุม OK ซึ่งจะทําใหหนาตา งที่สองเกดิ ขน้ึ
ซ่ึงเม่อื กดปุม OK แลวผลลัพธท่ีไดจากการประมวลผลจะถูกนาํ ไปแสดงยงั console ที่เราไดเ ปดอยู
ดังนี้
Hello Peter Pan 42 is very young!
ในโปรแกรม Inputtest.java เราใชตัวแปร 3 ตัวเปน ตัวเก็บขอมูล 2 ตัวแรก name และ ageStr เปน
String ทีเ่ กบ็ ขอมลู ที่ user ใสเขา สูโ ปรแกรมผานทาง
String name = JOptionPane.showInputDialog ("What is your name?");
String ageStr = JOptionPane.showInputDialog ("Tell me your age.");
สวนตวั แปร age เปนการแปลง string ท่ี user ใสเขามาใหเปน int เชนเดียวกบั ท่เี ราไดทํามากอน
หนาน้ี
สาํ หรับประโยคที่อยูในบรรทดั สดุ ทา ยนัน้ (System.exit(0)) เราจําเปน จะเห็นที่จะตองใสไว เนื่องจาก
เปน ขอกําหนดของ Java เมอื่ ไรกต็ ามทเ่ี ราใช JOptionpane.showInputDialog เราจะตองมปี ระโยค
นีเ้ พื่อบังคบั ให Java ทําการยุตกิ ารทํางานของ Thread ทคี่ วบคมุ InputDialog อยู
การสงผลลัพธไปยัง console กเ็ ปน การสง ที่ใชไดด อี ยา งหน่งึ ในการตรวจสอบวา โปรแกรมของเรา
ทํางานไดดแี ละถกู ตองหรอื ไม แตถ า เราใช InputDiaglog แลวเรากน็ าทจี่ ะสงผลลพั ธใหออกไปใน
รูปแบบทีเ่ หมือนกัน หรอื คลา ยคลงึ กัน เรามาลองดโู ปรแกรมตัวอยา งตอ ไปทเี่ รียกใช
MessageDialog ในการสงขอมูลออกไปยัง user
1: /**
2: Reading input via InputDialog
3: Sending output via MessageDialog
4: */
5: import javax.swing.*;
68
บทท่ี 2: ขอ มลู ตัวแปร และการประมวลผล intro. to Java (FEU.faa)
6:
7: class OutputTest {
8: public static void main(String[] args) {
9: //get name
10: String name = JOptionPane.showInputDialog("What is your name?");
11:
12: //get age
13: String ageStr = JOptionPane.showInputDialog("Tell me you age.");
14: int age = Integer.parseInt(ageStr);
15: age += 5;
16:
17: JOptionPane.showMessageDialog(null,
18: "Hello " + name + ", " +
19: " 5 years from now you will be " + age +
20: ".\nWhich is still very young!",
21: "Output",
22: JOptionPane.INFORMATION_MESSAGE);
23:
24: System.exit(0);
25: }
26: }
โปรแกรม OutputTest.java ไดถ ูกปรับปรงุ ขนึ้ จากโปรแกรม InputTest.java ท่เี ราเขยี นขึ้นกอ นหนา
น้ี ส่งิ ท่เี ราไดเพม่ิ ข้ึนมากค็ อื
JOptionPane.showMessageDialog(null,
"Hello " + name + ", " +
" 5 years from now you will be " + age +
".\nWhich is still very young!",
"Output",
JOptionPane.INFORMATION_MESSAGE);
ซ่งึ เปนการสง ขอมูลไปยัง user ผานทาง Dialog Window โดยท่ี showMessageDialog() จะตอ งมี
parameter สงไปทง้ั หมด 4 ตวั ดงั น้ี
1. Component
2. Object ทีเ่ ปน message ทต่ี อ งการสง ออก
3. string ทีเ่ ปน หัว หรือ title ของ MessageDialog
4. ชนดิ ของ Message
เรากําหนดให Component เปน null (เร่ืองน้อี ยนู อกเหนือ scope ของหนงั สอื เลม นี้) สว น Object ที่
เปน message เรากําหนดใหเปน
"Hello " + name + ", " +
" 5 years from now you will be " + age +
".\nWhich is still very young!",
String ท่ีเปน title ของ MessageDialog น้นั เรากําหนดใหม ีคาเปน "Output" ซึง่ ผอู านและสุดทา ย
เรากําหนดใหช นดิ ของ message เปนเพยี งแคข อ มูล (INFORMATION_MESSAGE) ซง่ึ การบอก
ชนดิ ของ message จะทาํ ให icon ของ MessageDialog เปลี่ยนไป ผอู านควรเปรียบเทียบขอ ความ
ดงั กลา วกบั ผลลัพธทีไ่ ดจากการ run น้ี (ขอมูลเขาเหมือนเดมิ )
ขนาดของ MessageDialog จะขนึ้ อยกู ับความยาวของ message ทีถ่ กู สงออกกไป เราสามารถท่ีจะ
ใช "\n" เปน ตัวกาํ หนดการขึน้ บรรทดั ใหมข องขอ มูลได ผูอา นควรสงั เกตถึงการสง ขอมลู ท่เี ปน int ไป
69
เร่ิมตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
ยัง MessageDialog (ตวั แปร age) เราไมจ ําเปนทจี่ ะตองเปลี่ยนใหเปน string กอนการสงแตอ ยา ง
ใด การแปลงชนิดจะทําโดยอตั โนมตั ิ
ถาระบบของผูอานรองรบั การใชภ าษาไทย และใช Java ท่รี องรบั ภาษาไทยเหมือนกัน การเปลีย่ น
ขอ มูลบางอยางในโปรแกรมจะทาํ ใหผลลัพธมหี นาตาคลา ยๆ แบบนี้
ตวั อยางท่ีเราแสดงใหดูเปน การอานขอมลู เพียงตัวเดยี วจาก keyboard ถา เราตอ งการอานขอ มลู ท่ีมี
มากกวา หนึ่งตวั เราตอ งทาํ อยา งไรบาง คําตอบงาย ๆ ทเี่ ราสามารถทาํ ไดทนั ทกี ็คือ ใช dialog box
อานทลี ะตัว แตว ธิ ีการแบบน้ี ทาํ ใหเราตองเสียเวลาในการนําขอ มูลเขา มากเกินไป (หน่งึ dialog box
ตอหนงึ่ ขอ มลู ) เพราะฉะน้นั เราตองหาวธิ ใี หมใ นการนาํ ขอ มูลเขา ซึ่งเราจะกลับมาดูกนั ถึงวิธดี งั กลา ว
ในบทที่ 3 เมอ่ื เราไดพดู ถงึ เรื่องของการประมวลผลแบบวน (loop)
2.16 การใช enum
ใน Java 1.5 เราสามารถใช enum ในการกาํ หนดชนดิ ของขอมลู สาํ หรบั การใชงานในลักษณะพเิ ศษ
ที่ไมเ หมอื นกบั ขอมลู ชนดิ อนื่ ยกเวนการใช final ทเ่ี ราไดพ ดู ไปแลว ซ่งึ มสี วนคลา ยกบั รูปแบบการ
เรยี กใชของ enum แตมปี ระสิทธิภาพทด่ี อ ยกวา เราจะมาดูการใช enum ในโปรแกรมตวั อยา ง
ตอไปนี้
1: /**
2: Shows simple usage of enum
3: */
4:
5: enum Season {SUMMER, RAINNY, WINTER};
6:
7: class UseOfEnum {
8: public static void main(String[] args) {
9: //printing values of enum
10: System.out.println("Seasons in Thailand are: " +
11: Season.SUMMER + ", " +
12: Season.RAINNY + ", and " +
13: Season.WINTER);
14: }
15: }
ในการประกาศใช enum นั้นเราตอ งขนึ้ ตนการประกาศดว ยคําวา enum ตามดวยชื่อของ enum ทีเ่ รา
ตอ งการใช ตามดวยเครือ่ งหมาย { ซึ่งในเคร่ืองหมาย { นีเ้ ราสามารถใสข อ มลู ท่ีเราตองการไว ดงั ที่
เราทําใน enum Season เพราะวา เราตอ งการเรยี กใชค า ของฤดตู า ง ๆ ท่มี ีอยูในบา นเราดงั นนั้ เราจงึ
กาํ หนดใหมี 3 ฤดูคอื SUMMER, RAINNY, และ WINTER พรอ มกบั ปดทา ยดว ยเครอ่ื งหมาย }
ในการเรยี กใช enum นน้ั เราตองขึ้นตน ดว ยชอื่ ของ enum ตามดว ยจดุ (.) และชอื่ แทนขอมลู ท่ีเราได
ประกาศภายใน enum นน้ั เชน
Season.WINTER
เราไมจ าํ เปน ตอ งกาํ หนดคาใหกบั สญั ลักษณท ีเ่ ราไดป ระกาศใชภ ายใน enum กอ นทีเ่ ราจะเรยี กใช
สญั ลกั ษณเ หลานัน้ ท้งั นี้ก็เพราะวา Java ไดท ําการกําหนดคาเหลาน้นั ใหเราโดยอัตโนมัติ ซึง่ เรา
สามารถเรยี กดูได เชน ถา เราเพ่มิ ประโยคน้เี ขาสโู ปรแกรม UseOfEnum.java
System.out.println("SUMMER = " + Season.SUMMER.ordinal() + "\n" +
"RAINNY = " + Season.RAINNY.ordinal() + "\n" +
"WINTER = " + Season.WINTER.ordinal());
70
บทที่ 2: ขอ มูล ตวั แปร และการประมวลผล intro. to Java (FEU.faa)
ซึ่งจะใหผ ลลพั ธค อื
Seasons in Thailand are: SUMMER, RAINNY, and WINTER
SUMMER = 0
RAINNY = 1
WINTER = 2
จะเห็นวา ผลลัพธของการเรยี กดว ย Season.SUMMER ก็จะสง SUMMER ใหเราทางหนา จอ ซง่ึ เปน
ส่ิงทดี่ มี าก ท้ังนก้ี ็เพราะวาในการเขียนโปรแกรมหลาย ๆ คร้งั เราตอ งการแสดงผลตัวสญั ลกั ษณเอง
ไมใ ชค าของสัญลกั ษณเ หลานนั้ สว นผลลัพธทต่ี ามมาก็เปน คาของสญั ลักษณเหลา นน้ั ที่ Java ได
กําหนดไวให
โปรแกรมตวั อยางทเ่ี ห็นอาจไมมปี ระโยชนอะไรมากมายนัก แต enum ยังมีวธิ กี ารใชแบบอน่ื ๆ อีกให
เราไดใ ช ซ่ึงเราจะไดดูในบทตอ ๆ ไป
สรุป
เราไดเรียนรูถ งึ ขอมลู ชนดิ ตา ง ๆ ทเ่ี ปนขอ มูลแบบพืน้ ฐาน หรอื ท่ีเรียกวา primitive datatype ที่ Java
มีให รวมไปถึงการประกาศตัวแปร การกําหนดคา ใหกบั ตัวแปร การประมวลผลตัวแปรชนดิ เดยี วกัน
และ ตา งชนดิ กนั การเปล่ียนชนิดของขอ มลู (casting) การใช method ท่เี กีย่ วของกบั ตัวเลข การ
แสดงผลตวั เลขทม่ี ีจุดทศนยิ ม การอา นขอ มูลเขา สูโปรแกรม การตรวจสอบ และตรวจจับ error ทอ่ี าจ
เกิดข้นึ ในการอานขอ มลู การทํางานในระดบั bit และการใช dialog box ในการอา นและแสดงผล
ขอ มลู
แบบฝก หัด
1. จงอธบิ ายถงึ ความหมายของคาํ วา final พรอ มทัง้ ยกตัวอยา งประกอบ
2. จงอธบิ ายถงึ ความแตกตา งระหวาง 5, 5.0, '5', "5", และ "5.0"
3. จงแสดงผลลัพธของประโยคตอ ไปน้ี
3.1. System.out.println("4" + 4);
3.2. System.out.println('4' + 4);
3.3. System.out.println("4" + 4 + 4);
3.4. System.out.println("4" + (4 + 4));
3.5. System.out.println('4' + 4 + 4);
4. จงแสดงผลลพั ธของประโยคตอ ไปน้ี
4.1. System.out.println("Value is %f %e\n", 45.25, 45.25);
4.2. System.out.println("Value is %5.4f %5.4e\n", 45.25, 45.25);
4.3. System.out.println("%4b%n", (4 > 5));
4.4. System.out.println("%6s\n", "Java");
5. จงหาวา ประโยคตอ ไปนเ้ี ก่ยี วขอ งกบั การ cast หรือไมถ าเกี่ยวขอ งใหห าผลลพั ธข องการ cast นนั้
char c = 'A';
in = (int)c;
boolean b = true;
in = (int)b;
float f = 500.44f;
in = (int)f;
double d = 500.44d;
in = (int)d;
71
เริ่มตนการเขยี นโปรแกรมดว ย Java
int x = 65; intro. to Java (FEU.faa)
char c = (char)x;
int v = 1000;
Boolean b = (Boolean)v;
6. กาํ หนดให x มคี าเปน 1 จงหาคาของการประมวลผลตอ ไปน้ี
6.1. (x > 1) & (x++ > 1)
6.2. (x > 1) && (x++ > 1)
6.3. x >> 1
6.4. x << 1
6.5. x >>> 1
6.6. x ^ 1
6.7. x & 1
6.8. x | 1
7. จงหาผลลัพธข องการประมวลผลประโยคตอ ไปน้ี ถา กําหนดให
double x = 4.5;
double y = -45.25;
int p = 12;
int q = 2;
7.1. x + p * y / (p – y) * x
7.2. p % (p – q)
7.3. (int) y
7.4. (int) p
7.5. Math.round(x)
7.6. (int) Math.round(y)
7.7. -2 * y + (int) x
7.8. q/p
7.9. p%q
7.10. y * y – y + (x * (int) x)
8. จงเขียนโปรแกรมทรี่ ับตวั เลขชนิด int จาก keyboard จํานวน 2 ตัว และขอมลู ชนดิ double อกี
2 ตวั หลังจากนนั้ ใหโ ปรแกรมคาํ นวณหาผลรวมของเลขท้ัง 4 ตวั ใหเก็บผลลพั ธท่หี าไดไ วในตัว
แปรตัวใหม สงผลลพั ธท ี่ไดไปยงั หนา จอ
9. จงเขยี นประโยคดวยภาษา Java จากสมการท่ใี หน ี้
9.1. a + bc / 2
9.2. a(a – c) + b(b – c) – (c(c – a) / d)
9.3. b2 – 4ac
9.4. (4/3)2 / 2
9.5. q = ⎛⎜ T1 xM ⎟⎞ + T2
⎝ D−k ⎠
10. จงเขยี นโปรแกรมท่ที ําการเปลีย่ น องศา Celsius ใหเ ปนองศา Fahrenheit โดยกําหนดใหข อ มลู
ทีต่ องการเปลยี่ น นําเขาจาก keyboard โดยกําหนดใหสตู รการเปล่ียน คอื
Celsius = 5 (Fahrenheit – 32)
9
72
บทท่ี 2: ขอ มูล ตวั แปร และการประมวลผล
11. จงเขียนโปรแกรมท่ีทําการเปล่ยี น องศา Fahrenheit ใหเปนองศา Celsius โดยกาํ หนดใหข อมูล intro. to Java (FEU.faa)
ท่ีตอ งการเปล่ียน นําเขาจาก keyboard
12. จงเขียนโปรแกรมทรี่ ับขอมูลที่เปนจาํ นวนกิโลกรมั จาก keyboard เปลี่ยนใหเปน mile สง
ผลลพั ธไปยังหนา จอ
13. จงเขียนโปรแกรมท่อี านขอมูลจาก keyboard ท่เี ปน อายุของผใู ชในรปู แบบของป ใหโปรแกรม
เปล่ยี นเปน จาํ นวนวนั สง ผลลพั ธออกทางหนา จอ (กาํ หนดให 1 ปเทากบั 365 วัน)
14. จงเขียนโปรแกรมทร่ี ับ int จํานวน 5 ตัว หาคา เฉลยี่ ของตัวเลขเหลานี้ เสร็จแลวสง ผลลัพธไปยัง
หนาจอ
15. จงเขียนโปรแกรมท่คี ํานวณหาเวลาท่แี สงเดินทางจากโลกไปยังดวงอาทิตย ใหส ง ผลลัพธข อง
การคาํ นวณในรูปแบบของนาที สง ผลลพั ธท ห่ี าไดไ ปยังหนา จอ
16. สมมติวาอาจารยท กุ คนในวิทยาลัยแหง หนง่ึ ดมื่ beer 1 ขวดตอ วัน และในการทาํ beer 1 ลัง (24
ขวด) นน้ั ตองใชข า ว barley จํานวน 1 ถัง ถาจํานวนของอาจารยในวทิ ยาลยั ท่ีวาน้มี ที ้ังสน้ิ 200
คน จงเขียนโปรแกรมในการคาํ นวณหาจาํ นวนของขา ว barley ที่ตองใชในการทาํ beer ให
เพียงพอตอการบรโิ ภคของอาจารยใ นวทิ ยาลัยนต้ี ลอดภาคการศึกษา
17. จงเขยี นโปรแกรมที่รบั ขอมลู ชนิด long ทม่ี ีจาํ นวนของตัวเลข (digit) อยรู ะหวาง 10 – 12 ตวั ให
สง ผลลัพธในรูปแบบของ ตวั เลขที่ใชเคร่อื งหมาย , เปน ตัวแบงกลุม โดยเร่มิ ตนจากทางขวามือ
และใหมตี ัวเลขกลุมละ 3 ตวั ไปยังหนาจอ
18. จงเขยี นโปรแกรมที่รบั คา ความยาวของดา นทกุ ดา นของสามเหล่ียม จากนั้นใหค ํานวณหาคา ของ
เสนรอบรปู (perimeter) สง ผลลพั ธไ ปยังหนา จอ
19. จงเขยี นโปรแกรมทค่ี าํ นวณหาพนื้ ทีข่ องวงกลม จากรศั มีท่ีรับเขา มาจาก keyboard
20. จงเขียนโปรแกรมทรี่ บั ขอมูลชนดิ double จาํ นวน 5 ตัวจาก keyboard จากนน้ั ใหค าํ นวณหา
คา เฉล่ียของตวั เลขเหลา น้ัน สงผลลพั ธทหี่ าไดไ ปยังหนาจอ
21. กาํ หนดใหเสนผา ศนู ยก ลางของดวงอาทติ ยเทากับ 865,000 ไมล และเสนผาศูนยก ลางของโลก
เทา กับ 7,600 ไมล จงเขียนโปรแกรมทคี่ าํ นวณหา
21.1. ปริมาตรของโลก (cubic mile หรอื mile3)
21.2. ปริมาตาของดวงอาทิตย (cubic mile)
21.3. อัตราสว นของปรมิ าตรของดวงอาทติ ยต อปรมิ าตรของโลก
22. จงเขยี นโปรแกรมท่รี ับขอมูลชนิด double ท่อี ยใู นรปู แบบ xxx.xxxx เชน 123.4567 จาก
keyboard จากนัน้ ใหดงึ เอาสว นของขอมลู ทอี่ ยูหนาจดุ ทศนยิ มไปเกบ็ ไวใ นตัวแปรที่มีชนิดเปน
long ตัวหน่งึ เสรจ็ แลว ใหเ กบ็ ขอ มลู ท่อี ยหู ลงั จุดทศนยิ มไปเก็บไวในตัวทเี่ ปน long อกี ตัวหนง่ึ
สงผลลพั ธท ีอ่ ยใู นตัวแปร long ท้งั สองไปยังหนาจอ
23. จงเขียนโปรแกรมแสดงผลการยกกําลังของ integer จาก 0 ถงึ 10 ดงั เชนตวั อยา งท่ีแสดงใน
ตารางน้ี
number square cube
0 00
1 11
2 48
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
73
เริ่มตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
24. จากขอ 4 จงเขียนโปรแกรมทรี่ ับขอมูลผา นทาง JOptionPane.showInputDialog เมื่อ
คํานวณหาคาเสนรอบรปู ไดแลว ใหส ง ผลลพั ธอ อกทาง JOptionPane.messageDialog
25. ใช JOptionPane เขียนโปรแกรมแกปญหาของโจทยในขอ 19
26. จงเขยี นโปรแกรมท่ีทาํ หนาทีเ่ ปลี่ยนตวั อกั ษรภาษาอังกฤษตวั เล็ก (lower case) ใหเปน ตัวใหญ
(upper case) โดยไมม กี ารเรยี กใช method ใด ๆ ของ Java (ดตู าราง ASCII เพอ่ื หาคาความ
ตา งของตวั อกั ษรท้ังสองแบบ)
27. จงเขยี นโปรแกรมทีอ่ า นคาสามคาทเี่ ปน คา ของสามเหลี่ยมทง้ั สามดาน พรอ มทั้งคํานวณวา คาที่
อา นเขา มานัน้ สามารถสรางสามเหลย่ี มไดจ รงิ โดยแสดงผลกลับออกไปในรปู แบบของ true หรอื
false เชน
Can edges 1, 2, and 1 form a triangle? False
Can edges 2, 2, and 1 form a triangle? True
[ดานสามดา นจะเปนสามเหลี่ยมได ถา ผลรวมของดา นสองดา นใด ๆ มีค่ ามากกวา ดา นอกี ดา นท่ี
เหลอื อย]ู
28. จงเขียนโปรแกรมท่อี านคา ระหวาง 0 ถงึ 1000 เพ่อื นาํ มาคํานวณหารผลรวมของตวั เลขทีอ่ ยใู น
คา ทอ่ี านเขามา เชน ถา คา ทอ่ี า นมีคาเปน 345 ผลลพั ธท่ีไดคือ 12
[ใช operator % เพอ่ื ดึงตวั เลขออกจากคา ที่อา นเขามา และใช operator / ในการลบตัวเลข
ออกจากคานั้น เชน 654 % 10 = 4 และ 654 / 10 = 65]
29. ใช JOptionPane เขียนโปรแกรมแกปญ หาของโจทยใ นขอ 20 ขอสังเกตของการใช
JOptionPane มีขีดจํากดั ในเร่ืองของการใสขอมลู คอื จะใสไดเพยี งแค string หนงึ่ ตัว ดงั นนั้ ถา
ตอ งใสข อ มูลท่ีเปน double 5 ตัวเราจําเปนท่ีจะตองมาตรการอน่ื เขา มาชว ย เชน ใชชองวางเปน
ตวั แบง ขอ มูลใน string ทนี่ าํ เขาดังตวั อยา งตอ ไปนี้
ผลลัพธทไ่ี ดจ าการคาํ นวณของ input ดา นบนคือ
ผลลพั ธท ี่ไดมาจากการใช method ของ class StringTokenizer ซ่งึ อยใู น package
java.util.StringTokenizer (ดบู ทที่ 3)
74
ในบททสี่ ามน้เี ราจะมาทําความรจู ักกบั การทํางานในรปู แบบของการประมวลผลชุดคําสง่ั ซา้ํ ๆ กันตาม intro. to Java (FEU.faa)
เง่อื นไขที่กาํ หนดให หรือท่ีเรียกวาการประมวลผลแบบวน (repetition หรือ loop) การใชชดุ คําส่งั ใน
การตัดสนิ ใจ และ การใชป ระโยคในการเปรียบเทยี บขอมลู ตาง ๆ
หลงั จากจบบทเรียนนแี้ ลวผอู า นจะไดทราบถึง
o การเปรียบเทียบขอมูล (comparison)
o การกําหนดประโยคในการเปรียบเทยี บ (logical expression)
o การเปล่ยี นแปลงข้นั ตอนการประมวลผลในแบบตาง ๆ (control statement)
o การทาํ งานแบบวน (loop)
for/loop และ for-in/loop (หรอื ทีเ่ รยี กวา for-each/loop)
while/loop
do-while/loop
o การยตุ กิ ารทํางานของ loop ดวยการใชคําส่งั break และ continue
หลาย ๆ ครั้งการเขยี นโปรแกรมตอ งมีการเลือกท่ีจะประมวลผล ไมวาจะเปนการเลอื กตามขอมลู ที่
นําเขา หรือ การเลอื กประมวลผลตามขั้นตอน กระบวนการที่ไดก าํ หนดไว เชน ถาขอ มูลนําเขา มีคา
นอยกวาศูนย เราจะยุติการทาํ งานของโปรแกรม ถา มากกวา เราจะมวลผลตอไป อะไรทํานองนี้ ในการ
ตดั สนิ ใจที่จะให code ทาํ อยา งใด อยางหนง่ึ นัน้ เราจะตอ งรูจกั วธิ กี ารสรา งประโยคที่ใชในการ
เปรยี บเทยี บ ขั้นตอนของการใชป ระโยคเปรียบเทียบในรปู แบบตาง ๆ
3.1 การตดั สนิ ใจ และ การเปรยี บเทยี บ
การตดั สนิ ใจเปนสวนประกอบทสี่ าํ คญั มาก ๆ สว นหน่งึ ของการเขียนโปรแกรม โปรแกรมของเราตองมี
ความสามารถในการตัดสินใจท่ีจะเลอื กวาจะทาํ อะไรตอไป เชน ถา จาํ นวนของนกั ศกึ ษาท่มี าสมัคร
เรียนในภาควิชาคอมพวิ เตอรธรุ กจิ มมี ากกวา หา รอ ย เราจะมีการสอบคัดเลอื ก หรือ เชน ถาเงินเดือน
เพม่ิ ขึ้นฉันจะซ้ือบาน อะไรทาํ นองน้ี ซ่ึงในดานของการเขยี น code นั้น การตัดสินใจจะทาํ ได
โปรแกรมกต็ องมคี วามสามารถท่ีจะเปรียบเทียบไดกอน เชน เปรยี บเทียบถงึ ความมากกวา นอยกวา
หรือ เปรียบเทียบถึงความเทา กัน และความไมเทา กัน
ในบททีส่ องเราไดพดู ถึง relational operator เพียงเลก็ นอยในเร่ืองของการทาํ งานกบั ตัวแปรทีม่ ี
ชนดิ เปน boolean และ operator ทวี่ า น้กี ็คอื
< (นอ ยกวา เชน x < y)
<= (นอยกวา หรอื เทา กบั เชน x <= y)
> (มากกกวา เชน x > y)
>= (มากกวา หรือเทากบั เชน x >= y)
== (เทากัน เชน x == y)
!= (ไมเ ทา กัน เชน x != y)
เราจะมาดูถึงการใช operator เหลานี้ในประโยคคาํ สั่งตา ง ๆ
3.1.1 การใช if เพ่ือการตัดสนิ ใจ
if เปนคาํ ส่ังท่เี รานํามาใชใ นการเลอื กวา เราจะประมวลผลอะไรตามผลลพั ธที่เกดิ ขึ้น if มีรปู แบบดังนี้
คือ
เรม่ิ ตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
if(expression)
statement;
โดยมขี อกาํ หนดวา expression จะตอ งเปนประโยคทเี่ มอ่ื มกี ารประมวลผลแลว จะไดค าท่เี ปน
boolean ซงึ่ เปนไปไดเพียงแคสองคา คอื จรงิ (true) หรือเท็จ (false) เทานัน้ เชน
if(numberOfStudents >= 500)
entranceExam = true;
หรอื
if(number < 0)
number *= 10;
number++;
ถา คา ของ expression เปน จรงิ ประโยคที่ตามหลงั if จะถูกประมวลผล แตถ า เปน เท็จกจ็ ะไมถูก
ประมวลผล เชนตวั อยางทีเ่ หน็ ดานบนนี้ ถา คา ของ number < 0 เปนจรงิ ประโยค number *= 10 ก็
จะไดร บั การประมวลผล ภาพท่ี 3-1 แสดงถงึ ขน้ั ตอนของการประมวลผลดว ยการใช if กับประโยคใน
รูปแบบท่ัวไป และประโยคการเปรยี บเทียบ number ทไี่ ดก ลา วถงึ กอ นหนา น้ี
if(expression)
statement;
other_statement;
เปนจรงิ ? no number no
<0
yes yes
statement number *= 10;
other_statement number++;
ภาพที่ 3-1 การใชประโยค if
ในบางครัง้ เราก็อาจเขียนประโยค if ใหเ ปน รปู แบบทีอ่ ยูในบรรทัดเดียวกัน เชน ถา เราเปลีย่ นประโยค
ตวั อยา งกอนหนา น้ีใหอยูใ นบรรทัดเดียวกนั เรากจ็ ะได
if(number < 0) number *= 10;
number++;
ซ่ึงถกู ตองตามหลักไวยากรณข อง Java แตโ ดยทว่ั ไปแลว การข้นึ บรรทดั ใหมส ําหรับประโยคที่ตามมา
หลงั จากการเปรยี บเทียบส้ินสุดลง จะทําใหดู code ไดง ายขน้ึ ลองดโู ปรแกรมตวั อยางการตรวจสอบ
วา ตวั เลขที่ user ใสเ ขาสูโปรแกรมเปน เลขคูหรอื ไม
1: /**
2: Using if-statement to determine if a number is even
3: */
4:
5: import java.util.Scanner;
6: import static java.lang.System.out;
7:
8: class IfStatement {
9: public static void main(String[] args) {
76
บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
10: Scanner input = new Scanner(System.in);
11:
12: //get an integer
13: out.print("Enter a number: ");
14: int number = input.nextInt();
15:
16: //check if number is even
17: if(number % 2 == 0)
18: out.println(number + " is an even number.");
19: }
20: }
โปรแกรม IfStatement.java บอก user ใหใสต วั เลขหนึง่ ตวั ซ่ึงโปรแกรมไดจดั เก็บไวใ นตัวแปรช่ือ
number หลังจากนนั้ ก็ทาํ การตรวจสอบวาตัวเลขทอ่ี านมาเปน เลขคูหรือไมด ว ยประโยค
if(number % 2 == 0)
out.println(number + " is an even number.");
ซง่ึ ถา นาํ สองไปหาร number แลวไมม ีเศษ (หารลงตวั ) แสดงวาตัวเลขท่วี า น้เี ปน เลขคู ซง่ึ โปรแกรม
ก็จะแสดงขอความไปยงั หนา จอบอกผูใชว า ตัวเลขทีใ่ สเขา มาเปน เลขคู ดงั เชน ผลลัพธข องการ run
นี้
Enter a number: 45
Enter a number: 20
20 is an even number.
โปรแกรมของเรายังไมใ ชโ ปรแกรมที่สมบรณู ดงั จะเหน็ ไดจากผลลพั ธท ี่ได ถา เราใส 45 โปรแกรมก็
จะไมแ สดงอะไรเลย จะแสดงกต็ อเมอ่ื ตวั เลขทีใ่ สเปน เลขคูเ ทานัน้ เราจะกลับมาดูวา เราตองทาํ
อยางไร ถงึ จะสามารถทีจ่ ะแสดงขอความไปยงั หนา จอโดยแบง แยกวาตวั เลขนั้นเปน เลขคูห รอื เลขคี่
3.1.2 การใช if ในประโยคที่มีมากกวาหนึ่งประโยค (if – block)
การเขยี น code ทีม่ มี ากกวา หน่งึ ประโยคน้ัน ทาํ ไดดว ยการใชเ ครื่องหมาย {} ลอ มรอบประโยค
เหลานนั้ (compound statement) ดังตัวอยางทเี่ หน็ นี้
if(expression) {
statement 1;
statement 2;
statement 3;
…
statement n;
}
เชน
if(number % 2 == 0) {
System.out.println(number + " is an even number.");
number++;
System.out.println("But " + number + " is not!");
}
ทนี ี้เราจะกลับไปยงั ประเด็นท่ีเราพูดถงึ กอนหนา นี้ เกย่ี วกับเร่ืองของการแสดงผลท้ังท่เี ปน จริง และไม
เปนจริง ในการตรวจสอบดวยการใช if น้ันเราสามารถทจี่ ะบังคับการประมวลผลใหเ กิดขน้ึ ทั้งท่ีเปน
จรงิ และเปน เท็จ อยางใด อยางหนึ่งดว ยการใช else ตามหลงั ประโยคท่ตี าม if มาอกี ทหี น่ึง
รปู แบบโครงสรางของประโยค if – else นี้มีดงั นี้
if(expression)
statement;
else
other_statement;
another_statement;
ภาพท่ี 3-2 แสดงถึงโครงสรา งของ if – else
77
เรม่ิ ตน การเขยี นโปรแกรมดวย Java
yes เปน จรงิ ? no intro. to Java (FEU.faa)
statement other_statement
another_statement
ภาพท่ี 3-2 การใช if - else
จากโปรแกรม IfStatement.java ถาเราตองการท่จี ะแสดงผลถา ตวั เลขที่ user ใสเ ขา สูโปรแกรมเปน
เลขค่ี เราก็ตองเปลี่ยน code ของเราใหเปนดังนี้
1: /**
2: Using if - else statement to find
3: out whether a number is odd or even
4: */
5:
6: import java.util.Scanner;
7: import static java.lang.System.out;
8:
9: class IfElse {
10: public static void main(String[] args) {
11: Scanner input = new Scanner(System.in);
12:
13: //get an integer
14: out.print("Enter a number: ");
15: int number = input.nextInt();
16:
17: //check if number is even or odd
18: if(number % 2 == 0)
19: out.println(number + " is an even number.");
20: else
21: out.println(number + " is an odd number.");
22: }
23: }
ประโยคที่เราไดเขียนเพมิ่ เขาสโู ปรแกรมของเรา คอื
else
out.println(number + " is an odd number.");
ซ่ึงจะทําใหโปรแกรมของเราทําการประมวลผลประโยคที่อยถู ัดมาจาก else ถา number % 2 == 0
เปน เท็จ และตวั เลขทจี่ ะทําใหประโยคนถี้ ูกประมวลผลก็คือ ตัวเลขทเ่ี ปน เลขค่ี (นํา 2 ไปหารแลว
เหลือเศษ) ลองดูผลลพั ธของการ run นี้
Enter a number: 45
45 is an odd number.
Enter a number: 80
80 is an even number.
78
บทที่ 3: การตัดสินใจ และการประมวลผลแบบวน
จะเหน็ วาการนําเอา if – else มาใชท าํ ใหโปรแกรมของเราสนองตอบความตองการในการแสดงผล intro. to Java (FEU.faa)
เมอ่ื การตรวจสอบไดผลท่เี ปนจริงทางหนึ่ง และเมื่อผลของการตรวจสอบเปนเทจ็ อกี ทางหน่งึ
เน่อื งจาก if – else ก็เปน statement ตวั หนงึ่ ดังน้ันเรากส็ ามารถที่จะนาํ เอา if – else ไปใสไวใ น
ประโยคทเี่ ปน if – else อีกประโยคหน่งึ ได หรือแมแ ตก ระทั่งหลาย ๆ ประโยค เราเรยี กประโยคทีใ่ ช
if – else แบบนี้วา Nested – if ซ่งึ มรี ูปแบบโครงสราง ที่มลี ักษณะคลา ย ๆ กบั ทเ่ี หน็ นี้ (อาจมี
ประโยค if – else มากกวา หรือนอ ยกวา)
if(expression 1) { หรอื if(expression 1) {
statement 1; statement 1;
statement 2; statement 2;
}
else }
else if(expression 2)
if(expression 2)
statement 3; statement 3;
else { else {
statement 4;
statement 4; statement 5;
statement 5;
}
}
จากโครงสรางตวั อยางดานบนนปี้ ระโยคทจ่ี ะไดร บั การประมวลผลถา expression 1 เปนจริงคือ
statement 1 และ statement 2 สว น statement 3 จะไดร ับการประมวลผล ถา expression 2 เปน
จรงิ และ statement 4 และ statement 5 จะไดร บั การประมวลผลกต็ อเมอ่ื expression 1 และ
expression 2 เปน เท็จ
ลองมาดโู ปรแกรมตัวอยางการใช Nested – if ในโปรแกรม Grades.java
1: /**
2: Using Nested - if
3: finding letter grade from a given score
4: */
5:
6: import java.util.Scanner;
7: import static java.lang.System.out;
8:
9: class Grades {
10: public static void main(String[] args) {
11: Scanner input = new Scanner(System.in);
12: int score;
13: char grade;
14:
15: //getting a score
16: out.print("Enter your score: ");
17: score = input.nextInt();
18:
19: //determine grade by given score
20: if(score >= 90)
21: grade = 'A';
22: else if(score >= 80)
23: grade = 'B';
24: else if(score >= 70)
25: grade = 'C';
26: else if(score >= 60)
27: grade = 'D';
28: else
29: grade = 'F';
30:
31: out.printf("Your grade is %c%n", grade);
32: }
33: }
โปรแกรม Grades.java ใชเกณฑการใหเกรดคอื ถา score มีคา
มากกวา หรอื เทากับ 90 ได A
มากกวา หรือเทากับ 80 ได B (อยรู ะหวา ง 80 ถึง 89)
79
เรม่ิ ตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
มากกวา หรอื เทากบั 70 ได C (อยรู ะหวาง 70 ถึง 79)
มากกวาหรอื เทากบั 60 ได D (อยรู ะหวา ง 60 ถึง 69)
ตา่ํ กวา 60 ได F
เราไดอ อกแบบใหการตรวจสอบเปน ไปไดท ุกกรณดี ว ยการใชการเปรยี บเทียบจาก 90 ลงไปถงึ 60
ตามขน้ั ตอน คอื ถา user ใส score ที่มีคาเทา กบั 75 การเปรียบใน if แรก และ if ท่สี องจะเปน เท็จ
แตจะมาเปน จริงใน if ทส่ี ามคอื score >= 70 ประโยคท่ีตามมา grade = 'C' ก็จะไดรับการ
ประมวลผล สวนในกรณีสุดทา ยนน้ั ประโยค grade = 'F' จะไดรับการประมวลผลกต็ อเม่อื ทุก ๆ กรณี
ของการตรวจสอบกอ นหนานี้เปนเท็จทั้งหมด ผอู า นควรตรวจสอบประโยค if – else จากตวั อยางดว ย
คา score ทแี่ ตกตา งกนั เพื่อใหเกิดความเขา ใจมากย่งิ ขน้ึ
ผลลพั ธของการ run ดว ยขอ มลู บางสว น
Enter your score: 87
Your grade is B
Enter your score: 45
Your grade is F
Enter your score: 92
Your grade is A
เราสามารถทจี่ ะเขียนโปรแกรม Grades.java ขน้ึ ใหมด วยการใช operator && ชวยในการตรวจสอบ
ถงึ สถานะภาพของ score วาอยใู นกลุมใด ลองมาดกู นั
1: /**
2: Using Nested - if
3: finding letter grade from a given score
4: */
5:
6: import java.util.Scanner;
7: import static java.lang.System.out;
8:
9: class Grades2 {
10: public static void main(String[] args) {
11: Scanner input = new Scanner(System.in);
12: int score;
13: char grade;
14:
15: out.print("Enter your score: ");
16: score = input.nextInt();
17:
18: //determine grade by given score
19: if(score >= 60 && score <= 69)
20: grade = 'D';
21: else if(score >= 70 && score <= 79)
22: grade = 'C';
23: else if(score >= 80 && score <= 89)
24: grade = 'B';
25: else if(score >= 90 && score <= 100)
26: grade = 'A';
27: else
28: grade = 'F';
29:
30: out.println("Your grade is " + grade);
31: }
32: }
เราเปลีย่ น code ในการตรวจสอบใหมใหเ ปน
if(score >= 60 && score <= 69)
grade = 'D';
else if(score >= 70 && score <= 79)
grade = 'C';
else if(score >= 80 && score <= 89)
grade = 'B';
else if(score >= 90 && score <= 100)
grade = 'A';
80
บทที่ 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
else
grade = 'F';
ซ่งึ เมอื่ ไดลอง run ดแู ลว ก็ไดผ ลลัพธเ หมือนกันกบั ทีไ่ ดจากโปรแกรม Grades.java แตขนั้ ตอนของ
การตรวจสอบไมเหมือนกนั เราไดพดู กอ นหนา น้วี า ถา มีการใช && และคาของประโยคท่อี ยูทางดาน
หนา ของ && มคี า เปนจริง ประโยคทอี่ ยทู างดา นหลังกจ็ ะไดรับการประมวลผลดวย
3.1.3 การใช enum กบั if-else
เราสามารถนําเอา enum มาใชกบั โปรแกรมตัวอยา งทเ่ี ราใช if-else กอ นหนา นี้ได ดงั น้ี
1: /**
2: Using Nested - if and enum
3: finding letter grade from a given score
4: */
5:
6: import java.util.Scanner;
7: import static java.lang.System.out;
8:
9: enum Grade {A, B, C, D, F};
10:
11: class GradesWithEnum {
12: public static void main(String[] args) {
13: Scanner input = new Scanner(System.in);
14: int score;
15: Grade grade;
16:
17: out.print("Enter your score: ");
18: score = input.nextInt();
19:
20: //determine grade by given score
21: if(score >= 60 && score <= 69)
22: grade = Grade.D;
23: else if(score >= 70 && score <= 79)
24: grade = Grade.C;
25: else if(score >= 80 && score <= 89)
26: grade = Grade.B;
27: else if(score >= 90 && score <= 100)
28: grade = Grade.A;
29: else
30: grade = Grade.F;
31:
32: out.println("Your grade is " + grade);
33: }
34: }
เราประกาศในบรรทดั ที่ 8 กําหนดให Grade เปน enum มีคา เปน A, B, C, D, และ F ภายในตัว
main() เราสรางตวั แปร grade จาก Grade ดงั นน้ั เราจึงสามารถกาํ หนดคา ให grade ในบรรทดั ท่ี 28,
30, 32, 34, และ 35 ได ผลลพั ธท่เี ราไดจ ากการ run โปรแกรมก็เหมอื นกับโปรแกรม Grades2.java
โปรแกรมตอไปนี้ เปน โปรแกรมการใช if-else ตรวจสอบวา ตวั อักษรที่กําหนดใหอยใู นกลมุ นนั้ ๆ
หรือไม
1: /**
2: Using && in if - else statement
3: */
4:
5: import static java.lang.System.out;
6:
7: class UpperLower {
8: public static void main(String[] args) {
9: char ch = 'F';
10:
11: if(ch >= 'A' && ch <= 'Z')
12: out.printf("%c is an uppercase letter.", ch);
13: else if(ch >= 'a' && ch >= 'z')
14: out.printf("%c is a lowercase letter.", ch);
15: }
16: }
81
เร่ิมตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
โปรแกรมกําหนดใหตัวแปร ch มีคาเปนอกั ษร F ตัวใหญ และใชประโยค if – else ทาํ การตรวจสอบ
วาตัวอักษรที่วาน้ีเปน อักษรตวั ใหญห รอื ตวั เล็ก ซึง่ ก็แนนอนวาผลลัพธท ีไ่ ดจ ะตองเปนตัวใหญ แตเ รา
ตองการทีจ่ ะแสดงใหเ ห็นถึงการใช && เขา มาชว ยในการตรวจสอบคา ของ ch ที่เราไดกําหนดข้ึน
ในการเปรียบเทยี บนัน้ Java จะใชค า ASCII ในการเปรยี บเทยี บตวั อกั ษรทัง้ สองตัว โดยในตอนแรก
จะเปรียบเทยี บ F กับ A (70 กับ 65) ซึ่งผลของการเปรยี บเทยี บเปนจริง จึงตองเปรียบเทียบ F กบั Z
(70 กับ 90) ซึง่ ก็เปน จริง ดงั นัน้ ประโยคท่ตี ามมา out.printf("%c is an uppercase letter.", ch);
จงึ ไดรับการประมวลผล เชน เดียวกันกับตัวอกั ษรตัวเลก็ ถา ch เก็บอกั ษรที่เปน ตวั เลก็ อยกู าร
เปรยี บเทียบจะเกิดขนึ้ ในประโยค else – if ที่ตามมา
โปรแกรมตอไปนแ้ี สดงการใช || ในการตรวจสอบวา เดือนทก่ี ําหนดใหอยูในฤดอู ะไร
1: /**
2: Using || in if - else statement
3: */
4:
5: import static java.lang.System.out;
6: import java.util.Scanner;
7:
8: class Season {
9: public static void main(String[] args) {
10: int month;
11: String season;
12: Scanner input = new Scanner(System.in);
13:
14: out.print("Enter month (1 - 12): ");
15: month = input.nextInt();
16:
17: if(month == 3 || month == 4 || month == 5 || month == 6)
18: season = "Summer";
19: else if(month == 7 || month == 8 || month == 9 || month == 10)
20: season = "Rainy";
21: else if(month == 11 || month == 12 || month == 1 || month == 2)
22: season = "Winter";
23: else
24: season = "neverland!!";
25:
26: out.printf("%d is in %s", month, season);
27: }
28: }
โปรแกรม Season.java ใช || ในการตรวจสอบวา month ท่ี user ใสเ ขา สโู ปรแกรมน้นั อยูใ นฤดู
อะไร โดยเรากําหนดใหเ ดอื น 3 – 6 เปนฤดรู อ น 7 – 10 เปนฤดูฝน และ 11 – 2 เปน ฤดูหนาว (ซึ่ง
เดยี วน้ชี กั จะไมแนน อนเสยี แลว ) ลองมาดผู ลลพั ธจ ากการ run ดกี วา
Enter month (1 – 12): 4
4 is in Summer
Enter month (1 – 12): 8
8 is in Rainy
Enter month (1 – 12): 1
1 is in Winter
Enter month (1 – 12): 20
20 is in neverland!!
Operator || น้ันเปน การเปรยี บเทียบขอมูลท่ีอาจเปนไดห ลาย ๆ อยา ง ดังทเ่ี ห็นในโปรแกรม ถาเรา
ใหคาของ month เปน 3 4 5 หรือ 6 เราก็กําหนดให season มคี า เปน summer สว นเดือนอื่น ๆ ก็
เชน เดียวกนั ในทางตรงกนั ขามถา เราใช && แทนโปรแกรมของเราก็จะไมทาํ งานตามทเ่ี ราคาดหวัง
ไว กลา วคอื คา ของ month ไมส ามารถเปนไปไดท ้งั สค่ี า โปรแกรมก็จะประมวลผลประโยคทตี่ าม
else ตัวสุดทายตลอดไป ผูอ า นควรตรวจสอบวาทกี่ ลา วมาน้ี เปนจรงิ หรอื ไม
82
บทที่ 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
ในการใช Nested if – else นน้ั เราจะตอ งระวังวาทกุ ๆ if ท่ีเราใชจ ะตอ งมี else หรือไมเพราะ Java
จะตรวจสอบวา else ทใ่ี ชนนั้ วามี if อยกู อ นหนาหรอื ไม สมมตวิ า มีเรากต็ องระวังในเรอ่ื งของขนั้ ตอน
การตรวจสอบ วาเปนไปอยา งท่ีเราตั้งใจหรอื ไม ดังเชนตวั อยา งน้ี
1: /**
2: Dangling Else
3: */
4:
5: import static java.lang.System.out;
6:
7: class DanglingElse {
8: public static void main(String[] args) {
9: int x = 7, y = 99;
10:
11: if(x > 5)
12: if(y > 5)
13: out.println("x and y is greater than 5");
14: else
15: out.println("x is less than 5");
16: }
17: }
โปรแกรม DanglingElse.java ท่เี ห็นนี้เมื่อ run แลว ผลลัพธท ี่ไดค อื
x and y is greater than 5
ซง่ึ เปนไปตามทเ่ี ราคดิ ไว แตถ า เราเปลยี่ นคา ของ y ใหเปน 2 ผลลพั ธท่ีไดกลับเปน
x is less than 5
ซึ่งไมใ ชส ิง่ ทเ่ี ราตอ งการ เพราะเรารูวา x มคี า มากกวา 5 ส่งิ ท่เี กิดข้ึนคอื Java จัดให else นัน้ คูก ับ if
ตวั ท่สี อง ดังนี้
if(x > 5)
if(y > 5)
out.println("x and y is greater than 5");
else
out.println("x is less than 5");
เพราะฉะน้ันถา เราตองการใหการประมวลผลเปน ไปตามที่เราตอ งการ เราตองใช {} เปน ตวั ชว ย ดังนี้
if(x > 5) {
if(y > 5)
out.println("x and y is greater than 5"):
}
else
out.println("x is less than 5");
ซง่ึ เมอ่ื run ดแู ลว ก็จะไดผลลัพธเปนไปตามทีเ่ ราตองการ คือ ไมมผี ลลพั ธใด ๆ แสดงไปยงั หนาจอ
ถา y มีคา นอ ยกวา หรือเทา กับ 0
ถงึ เวลาท่เี ราจะกลบั ไปปรับปรุงโปรแกรม Quadratic.java ทเี่ ราไดพ ูดถึงในบทที่สอง เพ่ือใหม ีการ
ตรวจสอบคาของ determinant ท่ีอาจเปน 0 ดวยการใช if ในประโยค
//calculate determinant
double d = b * b – 4 * a * c;
if(d <= 0) {
err.println("Error: cannot find square root");
System.exit(1);
}
double det = Math.sqrt(d);
เราไดก ําหนดใหมีการตรวจสอบคา ของ d กอนการเรยี กใช Math.sqrt() ถา คา ของ d นอยกวา หรอื
เทากับ 0 เราจะฟองไปยัง user พรอมกับยตุ ิการทํางานของโปรแกรมทันที ดว ยการเรียกใช
System.exit(1)
83
เรมิ่ ตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
1: /**
2: Calculating roots of function
3: */
4:
5: import static java.lang.System.out;
6: import static java.lang.System.err;
7:
8: class Quadratic2 {
9: public static void main(String[] args) {
10: double a, b, c;
11: //4x2 + 20x + 16 = 0
12: a = 4;
13: b = 20;
14: c = 16;
15:
16: //calculate determinant
17: double d = b * b - 4 * a * c;
18: if(d <= 0) {
19: err.println("Error: cannot find square root");
20: System.exit(1);
21: }
22: double det = Math.sqrt(d);
23:
24: //calculate roots
25: double x1 = (-b + det) / (2 * a);
26: double x2 = (-b - det) / (2 * a);
27:
28: out.println("Root 1 = " + x1);
29: out.println("Root 2 = " + x2);
30: }
31: }
3.2 การใช Conditional Operator (? :)
Java มี operator อกี ตวั หนึ่งทเี่ ราสามารถนํามาใชแ ทน if – else ได เราเรยี ก operator ตัวน้ีวา
Conditional operator หรอื operator ทมี่ ี expression อยสู ามตัว ซ่งึ มโี ครงสรา งดงั นี้ คือ
(expression) ? (true statement) : (false statement);
เชน
(number % 2 == 0) ? System.out.println("Even number.")
: System.out.println("Odd number.");
จากประโยคตวั อยางดานบนน้ี การประมวลผลประโยค System.out.println("Even number."); จะ
เกิดข้นึ ถาผลลพั ธของการประมวลผลประโยค number % 2 == 0 เปนจริง สว นประโยค
System.out.println("Odd number."); จะเกิดข้นึ ถาการประมวลผลของประโยค number % 2 ==
0 เปน เท็จ
โดยหลกั การแลวการประมวลผลประโยคทอ่ี ยูถ ัดจากเคร่ืองหมาย '?' จะไดรบั การประมวลผลถา
ประโยคเปรียบเทียบเปนจรงิ และประโยคที่ตามหลังเครือ่ งหมาย ':' จะไดรับการประมวลถาประโยค
เปรียบเทยี บเปนเท็จ
ลองดโู ปรแกรมตัวอยางกัน
1: /**
2: Finding odd and even number
3: */
4:
5: import static java.lang.System.out;
6:
7: class OddEven {
8: public static void main(String[] args) {
9: int num;
10: String result = "";
11:
84
บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน
12: num = (int)(Math.random() * 100); intro. to Java (FEU.faa)
13:
14: result = (num % 2 == 0) ? "even" : "odd";
15:
16: out.println(num + " is an " + result + " number.");
17: }
18: }
โปรแกรม OddEven.java ใช operator ? : ในการตรวจสอบวา num เปนเลขคหู รือ เลขคี่ ซึง่ ถาเปน
อยา งใดอยางหนึง่ กจ็ ะเกบ็ ขอมูลนั้น (even หรอื odd) ไวในตัวแปร result แลว จึงแสดงผลไปยัง
หนาจอหลังจากนน้ั ดังตวั อยางผลลพั ธของการ run น้ี
65 is an odd number.
โปรแกรม Min.java ท่เี ห็นดานลา งนใี้ ช operator ? : ในการหาคาตวั เลขทน่ี อ ยทีส่ ุดระหวางเลขสอง
ตัวทีก่ าํ หนดให
1: /**
2: Finding minimum number
3: */
4:
5: import java.io.*;
6: import static java.lang.System.out;
7: import static java.lang.System.err;
8:
9: class MinNumber {
10: public static void main(String[] args) throws IOException {
11: if(args.length <= 0) {
12: err.println("No arguments supplied.");
13: System.exit(1);
14: }
15: int num1 = Integer.parseInt(args[0]);
16: int num2 = Integer.parseInt(args[1]);
17:
18: //if num1 < num assign num1 to min
19: //otherwise assign num2 to min
20: int min = (num1 < num2) ? num1 : num2;
21:
22: out.println("Minimum number is: " + min);
23: }
24: }
ผลลัพธท่ไี ดจ ากการ run คือ
D:\source>java MinNumber 23 45
Minimum number is: 23
การใช operator ? : ก็คอื การใช if – else น่นั เองดังนั้นก็เปนเรอ่ื งของผเู ขียนโปรแกรมเองวา อยากท่ี
จะใช operator ตวั ไหน เพราะทั้งสองใหผ ลการประมวลผลในลักษณะเดียวกนั แตผ อู านควรคํานึงถงึ
ความชัดเจนของการใช operator ตวั น้ี ถา ใชแลวทาํ ใหเ ขา ใจคอนขา งยากกไ็ มควรใช เชน ตวั อยา ง
การใชแบบน้ี
grade = score > 89 ? (score > 94 ? "A+" : "A") :
score > 79 ? (score > 84 ? "B+" : "B") :
score > 69 ? (score > 74 ? "C+" : "C") :
score > 59 ? (score > 64 ? "D+" : "D") :
จาก code ของการหาเกรดจากคะแนนทเ่ี ห็นน้ี ผอู านคงสงั เกตเห็นความซบั ซอนของ code เมอื่ นาํ ไป
เปรยี บเทียบกบั การคาํ นวณหาเกรดดว ยการใช if – else กอนหนาน้ี ยิง่ ถามกี ารเปรยี บเทยี บมาก
เทา ไร การมองดู code กย็ ากตามไปดวย ที่เหน็ ดา นลา งน้คี อื code ทัง้ หมดจากโปรแกรม
1: /**
2: conditional operator
3: How confuse can it be?
4: */
5:
6: import javax.swing.*;
85
เรม่ิ ตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa)
7:
8: class GradeCond {
9: public static void main(String[] args) {
10: String grade = "";
11: int score;
12:
13: //get score from dialog box
14: String in = JOptionPane.showInputDialog("Enter your score.");
15: score = Integer.parseInt(in);
16:
17: //compute a letter grade from score
18: grade = score > 89 ? (score > 94 ? "A+" : "A") :
19: score > 79 ? (score > 84 ? "B+" : "B") :
20: score > 69 ? (score > 74 ? "C+" : "C") :
21: score > 59 ? (score > 64 ? "D+" : "D") : "F";
22:
23: //display result via message dialog
24: String msg = "Score " + score +
25: " is equivalent to grade " + grade;
26: JOptionPane.showMessageDialog(null, msg,
27: "Grade",
28: JOptionPane.INFORMATION_MESSAGE);
29: }
30: }
ผลลัพธท่ไี ดจาการ run คอื
ลองมาดูโปรแกรมตัวอยางการใช ? : อีกตัวอยา งหนึ่งทไี่ ดด ดั แปลงมาจากโปรแกรม Season.java
ท่ไี ดเขียนมากอนหนา นี้
1: /**
2: Determine season from given months
3: */
4:
5: import java.io.*;
6: import java.lang.Integer;
7: import javax.swing.JOptionPane;
8:
9: class SeasonCond {
10: public static void main(String[] args) {
11: int month;
12: String season, input, monthTitle;
13:
14: //prompt user for month (1 - 12)
15: //if user hit cancel button, assign 0 to month
16: input = JOptionPane.showInputDialog("Enter month (1 - 12).");
17: month = (input != null) ? Integer.parseInt(input) : 0;
18:
19: //determine season from a given month
86
บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
20: season = (month >= 11) ? "Winter" :
21: (month >= 7) ? "Rainy" :
22: (month >= 3) ? "Summer" : "Unknown";
23:
24: //determine month's title from month number
25: monthTitle = (month == 1) ? "January" :
26: (month == 2) ? "February" :
27: (month == 3) ? "March" :
28: (month == 4) ? "April" :
29: (month == 5) ? "May" :
30: (month == 6) ? "June" :
31: (month == 7) ? "July" :
32: (month == 8) ? "August" :
33: (month == 9) ? "September" :
34: (month == 10) ? "October" :
35: (month == 11) ? "November" :
36: (month == 12) ? "December" : "Unknown";
37:
38: //display result
39: JOptionPane.showMessageDialog(null,
40: "Month " + month + " (" + monthTitle + " )" +
41: " is in " + season + " season.",
42: "Season",
43: JOptionPane.INFORMATION_MESSAGE);
44:
45: System.exit(0);
46: }
47: }
โปรแกรม SeasonCond.java ใช ? : ในการตรวจสอบและกาํ หนดคา ใหก บั ตวั แปร moth (บรรทัด ท่ี
21 ถึง 23) พรอ มทง้ั ทําการกําหนดชือ่ ของเดือนใหก บั ตวั เลขประจาํ เดอื นที่ user ไดใ สเ ขา สู
โปรแกรมดว ย (บรรทดั ท่ี 25 ถงึ 37)
โปรแกรมตัวอยา งนี้ ถึงแมว า ใช ? : เยอะมากกไ็ มดูสบั สนเทาไร ตา งกบั โปรแกรมท่คี าํ นวณหาเกรด
กอนหนานี้ ผลลพั ธท เี่ ราไดจาการ run คอื
87
เริ่มตนการเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa)
3.3 การใชค าํ สง่ั switch
Java มคี ําส่งั อีกตวั หนึง่ ทเ่ี ราสามารถนาํ มาใชแ ทน if – else ได คําสัง่ นี้กค็ ือ switch ซ่งึ มีโครงสรา ง
ดังนี้
switch(expression) {
case value1 :
statement;
break;
case value2 :
statement;
break;
…
default :
statement;
break;
}
คา ทไ่ี ดจ าก expression ของ switch นัน้ จะตองเปนคา ท่มี ชี นิดเปน char byte short หรอื int
เทาน้นั ถา เปน คา ชนดิ อนื่ Java จะฟองดวย error ทนั ที ภาพที่ 3-3 แสดงถึงขัน้ ตอนการทาํ งานของ
switch
เปน จริง? yes break
no statement break
ทําคาํ สัง่ อืน่ ๆ
เปนจริง? yes statement ในโปรแกรม
no break
default
ภาพที่ 3-3 ขน้ั ตอนการทาํ งานของ switch
คําสั่ง break ใน switch นน้ั สาํ คัญมาก ๆ ถา เราไมใส การทาํ งานของ switch กจ็ ะไมไดผลลพั ธด งั ที่
เราไดค าดการณไ ว
1: /**
2: Using switch statement
3: */
4:
5: import java.io.*;
6: import javax.swing.JOptionPane;
7:
8: class Switch {
9: public static void main(String[] args) throws IOException {
10: int month;
11: String season, input;
12:
13: //getting month number from user
14: input = JOptionPane.showInputDialog("Enter month (1 - 12).");
88
บทที่ 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
15: month = (input != null) ? Integer.parseInt(input) : 0;
16:
17: switch(month) {
18: //summer months
19: case 3: case 4: case 5: case 6:
20: season = "summer";
21: break;
22: //rainy months
23: case 7: case 8: case 9: case 10:
24: season = "rainy";
25: break;
26: //winter months
27: case 11: case 12: case 1: case 2:
28: season = "winter";
29: break;
30: //not summer, rainy or winter months
31: default :
32: season = "Unrecognized input!";
33: break;
34: }
35:
36: //display result
37: JOptionPane.showMessageDialog(null,
38: "Month " + month +
39: " is in " + season + " season.",
40: "Season",
41: JOptionPane.INFORMATION_MESSAGE);
42:
43: System.exit(0);
44: }
45: }
เราไดท ําการเปลย่ี นแปลงโปรแกรม Season.java ท่ีใช if – else ใหมาใช switch แทน โดยเราได
รวมเอาเดือนที่อยใู นฤดูเดียวกนั เหมอื นท่เี ราทํากับโปรแกรม Season.java มาอยใู นกลุมของ case
เดียวกัน จะเห็นวา เราเขียน case ตาง ๆ ทอี่ ยูใ นกลุมเดียวกนั ตามหลังกันไปโดยไมม ีการประมวลผล
ใด ๆ จนกวาจะจบ case สดุ ทา ยในกลมุ นั้น เชน
case 3: case 4: case 5: case 6:
season = "summer";
break;
Java จะประมวลผล case 3 กอนแตเราไมม ปี ระโยคใด ๆ ใน case นด้ี งั นั้น Java จึงประมวลผล case
4 case 5 และจนกระทั่งมาถึง case 6 ซึ่งเปน case สุดทายในกลมุ Java จงึ ประมวลผลประโยค
season = "summer" และ break
การนาํ เอา case ตา ง ๆ มาตอกันในลกั ษณะนี้มผี ลเหมือนการประมวลผลดว ยการใช operator || ใน
ประโยคทเ่ี รยี กใช if ผอู านควรสงั เกตถงึ การใช switch ในลักษณะน้ีใหดี เพราะเปน วิธีการท่ชี วยลด
ข้นั ตอนการเขยี นไดดพี อสมควร
เรามาลองดูตัวอยา งการใช switch อกี สักตัวหน่ึง
1: /**
2: Using switch statement
3: */
4:
5: import java.io.*;
6: import javax.swing.JOptionPane;
7:
8: class Switch2 {
9: public static void main(String[] args) throws IOException {
10: int digit;
11: String input, result = "";
12:
13: //getting a digit from user
14: input = JOptionPane.showInputDialog("Enter a digit:");
15:
16: try {
17: digit = Integer.parseInt(input);
18: switch(digit) {
89
เร่มิ ตน การเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
19: case 1: result = "You entered ONE.";
20: break;
21: case 2: result = "You entered TWO.";
22: break;
23: case 3: result = "You entered THREE.";
24: break;
25: case 4: result = "You entered FOUR.";
26: break;
27: case 5: result = "You entered FIVE.";
28: break;
29: case 6: result = "You entered SIX.";
30: break;
31: case 7: result = "You entered SEVEN.";
32: break;
33: case 8: result = "You entered EIGHT.";
34: break;
35: case 9: result = "You entered NINE.";
36: break;
37: case 0: result = "You entered ZERO.";
38: break;
39: }
40: //display result
41: JOptionPane.showMessageDialog(null, result,
42: "What Digit", JOptionPane.INFORMATION_MESSAGE);
43: }
44: catch(Exception e) {
45: JOptionPane.showMessageDialog(null,
"You chose to cancel or ERROR occurred!",
46: "Cancel or Error", JOptionPane.ERROR_MESSAGE);
47: }
48: System.exit(0);
49: }
50: }
โปรแกรม Switch2.java บอก User ใหใสต วั เลขระหวา ง 0 – 9 และจะแสดงตวั หนังสือแทนตวั เลข
เหลา น้นั กลับไปยงั หนาจอ ซง่ึ เมื่อ run แลวกจ็ ะไดผ ลลัพธด งั นี้
แตถา ขอมูลนําเขา ไมเปนไปตามทเี่ ราไดกําหนดไวในโปรแกรม หนาจอท่ีเราไดจ ะเปน
เราไดพ ูดกอนหนา นวี้ า การใส break ไวในแตละ case ของ switch นั้นสาํ คญั มาก ๆ ในการกาํ หนด
ข้นั ตอนของการประมวลผล เพอื่ ใหผ ูอ านไดเหน็ ภาพชัดข้ึนเราจะลบคําสัง่ break ทุกตวั ออกจาก
โปรแกรม Switch2.java เราก็จะไดหนาจอท่ีแสดงผลลัพธท ีใ่ นบรรทัดสดุ ทายเสมอ นัน่ กค็ ือประโยค
"You entered ZERO"
ประโยคทกุ ประโยคทต่ี ามมาจาก case ทเ่ี ปนจริงจะถกู ประมวลผลท้งั หมด ดังนัน้ ไมวา เราจะใสขอมูล
ณ ตาํ แหนง ไหน เราก็จะไดส วนประมวลผลทีเ่ กนิ มาเสมอ เพราะฉะน้นั ผูอา นจะตอ งระมดั ระวังเปน
พเิ ศษในเร่ืองของการใส break ใหก บั case ตา ง ๆ ที่มอี ยูใ น switch
90
บทที่ 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
3.4 การทํางานแบบวน (Repetition หรือท่ีเรยี กกนั งา ยๆ วา Loop)
หลาย ๆ ครั้งทโ่ี ปรแกรมเมอรตองการท่จี ะใหโปรแกรมทาํ การประมวลผลในรูปแบบเดมิ ซํา้ ๆ กนั เชน
คณู ตวั เลข 1 – 10 ดวย 2 หรอื อา นขอมลู จาก keyboard จนกวา user จะพอใจ เราสามารถนําเอา
ชดุ คาํ ส่งั ที่ Java มใี หม าใชก บั การทํางานทวี่ า น้ไี ดอยางไมย ากนกั ลองดโู ปรแกรมทที่ าํ การแสดงคา
จาก 1 – 10 ไปยงั หนาจอน้ี
1: /**
2: Printing 1 to ten without using for/loop
3: */
4:
5: import static java.lang.System.out;
6:
7: class NotAforLoop {
8: public static void main(String[] args) {
9: int number = 1;
10:
11: out.printf("Number now is %d\n", number++);
12: out.printf("Number now is %d\n", number++);
13: out.printf("Number now is %d\n", number++);
14: out.printf("Number now is %d\n", number++);
15: out.printf("Number now is %d\n", number++);
16: out.printf("Number now is %d\n", number++);
17: out.printf("Number now is %d\n", number++);
18: out.printf("Number now is %d\n", number++);
19: out.printf("Number now is %d\n", number++);
20: out.printf("Number now is %d\n", number++);
21: }
22: }
แนน อนผลลัพธท ไี่ ดก ต็ องเปน
Number now is 1
Number now is 2
Number now is 3
Number now is 4
Number now is 5
Number now is 6
Number now is 7
Number now is 8
Number now is 9
Number now is 10
การแสดงคา จาก 1 – 10 น้นั ยงั ไมม ีปญ หาอะไรมากมายนกั แตถ า เราตอ งการที่จะแสดงคา จาก 1 –
100 หรอื จาก 1 – 1000 เราคงตองพิมพจนมือเมอื่ ยแนเ ลย ลองมาดูวาเราจะใช loop ชวยในการ
ทํางานในลกั ษณะนี้ไดอยา งไร
Java มีโครงสรางหลายตัวทเี่ ราสามารถนาํ มาใชในการทาํ งานแบบวนได คาํ สง่ั ที่วา นี้ คือ while/loop,
do..while/loop และ for/loop ชดุ คาํ สง่ั แรกทีเ่ ราจะดูกัน คือ for/loop
3.4.1 การใช for/loop
กอนท่เี ราจะไปดโู ครงสรางของ for/loop กนั เรามาดกู ันวา โปรแกรมกอ นหนาน้ี ถา ใช for/loop แลว
จะมีหนาตาเปนอยางไร
1: /**
2: Printing 1 to ten using for/loop
3: */
4:
5: import static java.lang.System.out;
6:
7: class ForLoop {
8: public static void main(String[] args) {
9: int number = 1;
10:
11: //printing 1 - 10 using for/loop
91
เรม่ิ ตนการเขียนโปรแกรมดว ย Java intro. to Java (FEU.faa)
12: for(number = 1; number <= 10; number++)
13: out.printf("Number now is %d\n", number);
14: }
15: }
จะเหน็ วาโปรแกรมของเราสัน้ ลงมาก คําส่งั ใน for/loop บอกให Java รูว า การประมวลผลตอ งทํา
ทั้งหมด 10 ครงั้ โดยเร่ิมตนการประมวลผล เม่ือ number มคี า เทากับ 1 ไปจนกวา number จะมคี า
เปน 10 ซึ่งเม่อื number มีคา เปน 10 Java ก็จะยตุ ิการประมวลผลทงั้ หมด และผลลพั ธทไ่ี ดก็
เหมือนกนั กับโปรแกรม NotAforLoop.java ทีเ่ ราเขยี นข้นึ มากอ นหนา น้ี
โครงสรา งของ for/loop มีดังนคี้ ือ
for(expression1 ; expression2 ; expression3)
statement;
โดยท่ี expression ทง้ั สามตัวมีการทํางานที่ตางกัน expression1 จะถกู ประมวลผลเปนตวั แรกสดุ ซ่ึง
โดยทั่วไป expression น้ีมักจะถกู เรยี กวา initialization expression คอื ทําหนาทีใ่ นการกําหนดคา
เบอื้ งตน ใหกบั ตัวแปรท่จี ะนาํ มาใชใ น for/loop หลงั จากนนั้ expression2 กจ็ ะถูกประมวลผล ซ่ึงถา
การประมวลผลเปนจริงตามเงือ่ นไข statement ที่อยใู น for loop กจ็ ะถูกประมวลผล และ for/loop
จะยตุ ิการทํางานทันทที ีก่ ารประมวลของ expression2 เปน เท็จ เมือ่ statement ทอี่ ยูใน for/loop
สิ้นสดุ การประมวลผลแลว expression3 ก็จะไดร ับการประมวลผล และ for/loop จะกลับไป
ประมวลผล expression2 อกี คร้งั ซงึ่ ถาเปน จรงิ statement กจ็ ะถกู ประมวลผลอีกครัง้ ทําอยางนีไ้ ป
จนกวา expression2 จะเปนเท็จ เราเรียก expression2 วา loop condition และ expression3 วา
increment expression ภาพที่ 3-4 แสดงแผนผังการทาํ งานของ for/loop
expression1
expression2 no
(จริง ?)
yes
statement
expression3 statement อ่ืน ๆ
ในโปรแกรม
ภาพท่ี 3-4 โครงสรา ง (ขั้นตอน) การทาํ งานของ for/loop
เรากลบั มาดโู ปรแกรม ForLoop.java ทเ่ี ราเขียนกอนหนา น้วี า มีการทํางานอยา งไร เราเริม่ ตน ดว ยการ
เขยี น for/loop
for(number = 1; number <= 10; number++)
out.printf("Number now is %d\n", number);
สิง่ ที่ Java ทาํ กอ นก็คอื กาํ หนดคาตวั แปร number ใหเ ปนหนงึ่ หลังจากนนั้ ก็ทาํ การตรวจสอบวาตวั
แปร number มีคา นอ ยกวา หรือเทา กับสิบหรือไม ซง่ึ กเ็ ปน จรงิ ดงั นั้น Java จึงประมวลผลประโยคท่ี
อยใู น for/loop เมื่อเสรจ็ แลวจงึ ไปประมวลผลประโยค number++ ซึ่งเปน การเพ่มิ คาใหก บั ตัวแปร
number เสร็จแลว จึงกลบั ไปตรวจสอบวา number <= 10 อกี คร้ัง ทําไปเรือ่ ย ๆ จนกวา number จะ
มคี า มากกวาสบิ จงึ จะยุตกิ ารทํางาน โดยสรปุ แลวขนั้ ตอนของ for/loop ดงั กลา วมีดงั นค้ี ือ
92
บทที่ 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa)
1. กาํ หนดคา เบอ้ื งตน ใหกบั number
2. ตรวจสอบวา number <= 10 หรือไม
ถา เปนจรงิ
ประมวลผลประโยค System.out.println("Number now is " + number);
ถาเปนเทจ็ ยตุ กิ ารทํางานของ for/loop
3. ประมวลผลประโยค number++
4. กลับไปทําคาํ สัง่ ในขอ สองใหม
Expression ที่สําคัญที่สุดท่ีจะทาํ ให for/loop ทํางานตอ หรือยตุ ิการทาํ งานก็คือ expression ที่สอง
ดงั น้ันในการใช for/loop เราจึงตอ งระมัดระวังถึงประโยคท่ีใชในการตรวจสอบวา สามารถทจี่ ะทําได
ทงั้ สองกรณีหรือไม เพราะถา เราตรวจสอบไมด กี ารทํางานของ for/loop อาจทําไปโดยไมม ีการสนิ้ สุด
หรอื ท่ีเรยี กวา Infinite loop ตวั อยา งเชน ถา เราเปลี่ยน for/loop ของเราใหเปน ดงั นี้
for(number = 1; number > 0; number++)
System.out.println("Number now is " + number);
for/loop ใหมของเราก็จะทาํ งานโดยไมมีทส่ี ิ้นสุด เพราะวา คา ของ number จะมากกวา ศูนยอ ยู
ตลอดเวลา ทาํ ใหป ระโยคของการตรวจสอบเปน จริงเสมอ
การเขยี น for/loop ใหท าํ งานตลอดเวลาน้ันสามารถเขยี นไดหลายแบบ ตวั อยา งเชน
int number = 1;
for(;;)
System.out.println("Number now is " + number);
เราให for/loop ทํางานไปเร่ือย ๆ ดว ยการยกเลิก expression ทั้งสามตัวทอ่ี ยใู น loop หรือยกเลกิ
expression ที่หนึง่ และสาม ดงั นี้
int number = 1;
for(;number > 0;)
System.out.println("Number now is " + number);
ถาเราตองการ infinite loop ท่ไี มมปี ระโยคใด ๆ เลยก็ทําได ดังน้ี
for( ; ;) ;
เราลองมาดกู ารใช for/loop ในการบวกเลขจาก 1 ถึง 100
1: /**
2: Summation of 1 to n
3: */
4:
5: import static java.lang.System.out;
6: import javax.swing.JOptionPane;
7:
8: class Add1To100 {
9: public static void main(String[] args) {
10: int total = 0;
11: int n = 100;
12:
13: //adding 1, 2, 3, ..., n
14: //save result in total
15: for(int i = 1; i <= n; i++)
16: total += i;
17:
18: JOptionPane.showMessageDialog(null, "Total of 1 to " +
19: n + " is " + total,
20: "Summation", JOptionPane.INFORMATION_MESSAGE);
21: }
22: }
ผลลัพธของการ run คอื
93
เริ่มตน การเขยี นโปรแกรมดว ย Java
ตัวอยา งโปรแกรมตอ ไปนี้ทําการคาํ นวณหาดอกเบยี้ ทบตนในแตล ะป เปนจํานวนเทา กบั จาํ นวนปท ่ี intro. to Java (FEU.faa)
user เปน ผกู าํ หนดจากเงินฝากเรม่ิ ตน ท่ีหนง่ึ พนั บาท (หรอื เทา กบั จํานวนท่ี user เปนผใู สเขาสู
โปรแกรม) โดยใชสตู รการในการคํานวณ คอื
amount = p(1 + r)n
โดยท่ี
p คือ จาํ นวนเงินเรม่ิ ตน (principal)
r คอื อตั ราดอกเบ้ียประจาํ ป
n คือ จํานวนของปท ่ีตองการหา
amount คือ เงนิ ตน ทนี่ ําฝากของทกุ ป
1: /**
2: Demonstrating for/loop on compound interests
3: */
4:
5: import javax.swing.JOptionPane;
6:
7: class Interests {
8: public static void main(String[] args) {
9: double amount = 0;//amount at the end of year
10: double principal; //first deposit
11: double rate; //annual interests rate
12: int years; //number of years
13: String input; //input string
14:
15: //get input from user (principal, rate, years)
16: input = JOptionPane.showInputDialog("Enter principal");
17: principal = Double.parseDouble(input);
18:
19: input = JOptionPane.showInputDialog("Enter interests rate");
20: rate = Double.parseDouble(input);
21:
22: input = JOptionPane.showInputDialog("Enter number of years");
23: years = Integer.parseInt(input);
24:
25: //calculate interests
26: String result = "";
27: String yAmount;
28: for(int y = 1; y <= years; y++) {
29: amount = principal * Math.pow(1.0 + rate, y);
30: yAmount = String.format("%2d%8c%.2f%n", y, ' ', amount);
31: result += yAmount;
32: }
33:
34: //display output
35: String header = String.format("Year%5cAmount%n", ' ');
36: JOptionPane.showMessageDialog(null,
37: header+result + "\nPrincipal: " +
38: String.format("%.2f%n", principal) +
39: "Total interests: " +
40: String.format("%.2f", (amount-principal)),
41: "Interests",
42: JOptionPane.INFORMATION_MESSAGE);
43: }
44: }
94
บทที่ 3: การตัดสินใจ และการประมวลผลแบบวน
ผลลัพธข องการ run ดวย principal = 10000 rate = 0.25 และ years = 5
สว นประกอบที่สําคญั คอื for/loop ท่ีทําหนา ทีค่ าํ นวณหาจํานวนเงินทไ่ี ดร บั ในแตล ะป (พรอมทง้ั intro. to Java (FEU.faa)
ดอกเบ้ีย) เราใช method Math.pow() ในการหาคา ของดอกเบีย้ ในแตล ะป ซ่งึ เมอ่ื หาไดแลวเราก็
แสดงผลลพั ธไ ปยังหนา จอทันที for loop ของเรายตุ กิ ารประมวลผลเม่อื คาของตวั แปร y มีคา
มากกวา ตวั แปร years หลังจากแสดงจาํ นวนของเงนิ ในแตล ะปแ ลว เม่อื ออกจาก for/loop เรากแ็ สดง
จํานวนของเงนิ ตนและดอกเบ้ยี ท้ังหมดทไ่ี ดจ ากการฝากในชวงน้ัน
ในการแสดงผลน้ันเราใช method format() ทมี่ ีอยใู น class String เปนตัวกาํ หนดรูปแบบของ
ผลลัพธทแี่ สดงไปยังหนา จอ (บรรทัดที่ 30) ซ่ึงมรี ายละเอยี ดในการกาํ หนดดงั นี้
yAmount = String.format("%2d%8c%.2f%n", y, ' ', amount);
การกําหนดก็คลายกับการใชขอกาํ หนดของ printf() ทเ่ี ราไดแ สดงใหด กู อนหนานี้ เพียงแตว า เรา
เลอื กใช format() จาก class String กเ็ พราะวาเราตอ งการที่จะนาํ เอาผลลัพธท ้งั หมดไปเก็บไวใน
string1 กอนที่จะแสดงออกทางหนา จอ
ถา หากเราไมตอ งการใชส ตู รในการคํานวณหาดอกเบี้ย เราก็สามารถทําไดด ว ยการคํานวณหาดอกเบย้ี
กอ นแลวจงึ นาํ เอาดอกเบ้ยี ทีห่ าไดไ ปบวกกบั เงินตน หลังจากนั้นกค็ าํ นวณหาดอกเบ้ยี จากเงินตนใหม
นี้ ทําการคํานวณจนกวาจะครบตามจํานวนปท ีไ่ ดกําหนดไว ดังทีแ่ สดงดว ย code น้ี
amount = principal; //calculate interests
for(int y = 1; y <= years; y++) { //calculate new principal
double interests = amount * rate;
amount += interests;
}
เราลองมาดูโปรแกรมตวั อยางอีกตวั หนงึ่ ทใี่ ช for/loop ในการควบคมุ การทํางานของโปรแกรม พรอม
ทง้ั ยอมให user ใสขอมูลหลาย ๆ ตัว2ในบรรทัดเดยี วกันได
1: /**
2: Reading numbers from input line
3: user must specify space between those numbers and
4: hit <enter> when done.
5: */
6:
7: import java.io.BufferedReader;
8: import java.io.InputStreamReader;
9: import java.io.StreamTokenizer;
10: import java.io.IOException;
11: import static java.lang.System.out;
12:
1 เราจะพูดถึงการใช String ในบทที่ 4
2 วิธกี ารรบั ขอ มูลแบบนอ้ี าจดูยุงยากไปสกั เลก็ นอย มีวิธีการอื่นท่สี ้นั กวา ในตอนตอไป
95
เรม่ิ ตน การเขียนโปรแกรมดว ย Java
13: class AddNumbers {
14: public static void main(String[] args) throws IOException {
15: double number, sum = 0; //number and sum intro. to Java (FEU.faa)
16: int count = 0; //total numbers read
17: BufferedReader buffer; //input buffer
18: InputStreamReader isr; //input stream
19: StreamTokenizer token; //token from input stream
20:
21: out.print("Enter numbers (space between then <enter>): ");
22: isr = new InputStreamReader(System.in);
23: buffer = new BufferedReader(isr);
24:
25: //get tokens from input buffer
26: token = new StreamTokenizer(buffer);
27:
28: //set priority to EOL so that we
29: //can break out of the loop
30: token.eolIsSignificant(true);
31:
32: //get each number from tokens
33: //calculate the sum until EOL is reached
34: for( ; token.nextToken() != token.TT_EOL ; ) {
35: switch(token.ttype) {
36: //token is a number
37: case StreamTokenizer.TT_NUMBER:
38: number = token.nval; //save token in number
39: count++; //number of tokens read
40: sum += number; //calculate sum
41: break;
42: default:
43: out.printf("Token is not a number! %s\n", token.toString());
44: break;
45: }
46: }
47: //calculate average and display result
48: double average = sum / count;
49: out.printf("Sum of numbers is %.0f\n", sum);
50: out.printf("Average of numbers is %.2f\n", average);
51: }
52: }
โปรแกรม AddNumbers.java ใช method จาก class StreamTokenizer และ for/loop เปนตวั ชว ย
ในการดึงเอาขอมลู แตล ะตวั ที่ User ใสเขา สโู ปรแกรม เรากําหนดให user กดปมุ <enter> เม่อื
สิ้นสุดการใสข อมลู ดงั นน้ั เราจึงจําเปน ท่จี ะตองบอกให Java รวู า ปมุ <enter> มคี วามสาํ คญั ในการ
ยตุ ิการทํางานของ loop ซงึ่ เราทําไดด ว ยการเรยี กใช method eolIsSignificant() ดวยคา ที่เปน จริง
ดังนี้
eolIsSignificant(true);
ถาเราไมเรยี ก method นีม้ าใชก ารกดปุม <enter> ของ user ก็จะไมมีผลใด ๆ ตอโปรแกรม
(โปรแกรมจะไมยตุ ิการทาํ งาน และเราตอ งกดปมุ <ctrl> + c เพอื่ ใหโ ปรแกรมหยุดการทาํ งาน) เมอ่ื
เรากาํ หนดความสาํ คญั ของปุม <enter> แลวเราก็เรมิ่ อาน token แตละตวั ทเี่ ราไดด งึ มาจาก
keyboard จนกวา token นั้นจะมคี าเปน EOL (End Of Line) ซ่ึงเปน ตวั กําหนดการส้ินสุดของขอมูล
ในบรรทดั นัน้
เราอา น token ทีม่ ีอยูท้งั หมดใน buffer มาเกบ็ ไวในตวั แปร token ดวยคาํ สั่ง
token = new StreamTokenizer(buffer);
หลังจากน้ันเรากต็ รวจสอบดูวา token ท่อี ยถู ัดไปใน buffer เปน EOL หรือไม ซึ่งถาไมเปน เราก็
เรียกใช switch เพอ่ื ตรวจสอบดูวา token ที่อานมานัน้ เปน ตัวเลขหรือไม ถา เปน เราก็จะทําการบวก
ตวั เลขนีเ้ ขากับตัวแปร sum พรอมกบั เพมิ่ คา ใหกบั ตัวแปร count
for(; token.nextToken() != token.TT_EOL ;) {
switch(token.ttype) {
//token is a number
case StreamTokenizer.TT_NUMBER:
number = token.nval; //save token in number
96