ในบททสี่ ามน้เี ราจะมาทําความรจู ักกบั การทํางานในรปู แบบของการประมวลผลชุดคําสง่ั ซา้ํ ๆ กันตาม 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
บทที่ 3: การตดั สินใจ และการประมวลผลแบบวน count++; //number of tokens read sum += number; //calculate sum break; intro. to Java (FEU.faa) default: System.out.println(\"Token is not a number! \" + token.toString()); break; } } เราตรวจสอบความเปนตวั เลขของ token ไดดวยการเปรยี บเทยี บ token.ttype กบั StreamTokenizer.TT_NUMBER และถาเปน จริง token ท่ีเปนตัวเลขจะถูกเก็บไวในตัวแปร nval (และมชี นดิ เปน double) ดังนัน้ ตัวแปร number จงึ ตองประกาศใหเ ปน double และการดึงคามาเก็บ ในตวั แปร number ทาํ ไดด ว ยการกําหนดคาจากประโยค number = token.nval; เนอื่ งจากวา เราสนใจเฉพาะ token ท่เี ปน ตัวเลขเทา นน้ั เราจึงไมส นใจ token ทีเ่ ปนชนิดอ่ืน ดังนั้นเรา จึงเพยี งแตสง คา ของ token กลับคนื ไปยังหนา จอถา token น้ันเปน ชนดิ อน่ื ทีไ่ มใชตวั เลข for loop ของเราจะทํางานไปเรอื่ ย ๆ จนกวา user จะกดปุม <enter> ซึง่ การกดปมุ <enter> น้ีจะ ทาํ ให expression ท่ีมอี ยเู พียงตวั เดียวใน for loop เปนเท็จ การทาํ งานของ for loop จึงสิน้ สดุ ลง ผอู านจะสังเกตไดวาเราไมส นใจกบั expression ที่ 1 และ expression ที่ 3 ของ for loop เลยทั้งน้กี ็ เพราะวาเราไมตองมกี ารกาํ หนดคา เบ้อื งตน หรอื เพม่ิ คาใด ๆ เลย การยุตกิ ารทาํ งานของ for loop เกดิ จากการกดปมุ <enter> ของ user เทานัน้ ผลลพั ธของการ run ดวยคาสมมติตา ง ๆ Enter numbers (space between - enter when done): 20 30 45 789 12 34 Sum of numbers = 930.0 Average of numbers = 155.0 Enter numbers (space between - enter when done): 45 68 95 Sum of numbers = 208.0 Average of numbers = 69.33 Class StreamTokenizer ยังมี field อืน่ ๆ ที่เราสามารถเรียกใชได แตไ มไ ดก ลา วไวในทน่ี เ้ี พราะวา โปรแกรม AddNumbers.java ของเราสนใจแตเฉพาะการอานตัวเลขเทา นน้ั ผูอานสามารถหาขอ มลู ไดจาก javadoc ของ Sun เอง การอา นขอมูลจากโปรแกรมการบวกเลขที่เราเหน็ น้ันมีขน้ั ตอนที่ยุงยาก (ดงั ทไ่ี ดกลา วไวแ ลว ) แตเ รา นําแสดงใหดูก็เพื่อใหเ ห็นวาทําได แตก ม็ ีวธิ ที ส่ี ้นั กวา นัน่ ก็คือการใช Class Scanner เหมือนกับท่ีเรา ไดทํามากอ นหนาน้ี โปรแกรม SumOfNumbers.java แสดงถงึ การใช class Scanner ในรูปแบบท่ี คลายกนั กบั โปรแกรม AddNumbers.java 1: /** 2: Reading numbers from input line 3: */ 4: 5: import static java.lang.System.out; 6: import java.util.Scanner; 7: 8: class SumOfNumbers { 9: public static void main(String[] args) { 10: double number, sum = 0; 11: int count = 0; 12: 13: out.print(\"Enter numbers: \"); 14: Scanner input = new Scanner(System.in); 15: 16: //loop through numbers until EOF is found 17: //for windows: <ctrl/z> 18: for(; input.hasNext(); count++) { 19: sum += input.nextDouble(); 20: } 21: 97
เรม่ิ ตนการเขียนโปรแกรมดวย Java intro. to Java (FEU.faa) 22: //calculate average and display result 23: double average = sum / count; 24: out.printf(\"Sum of numbers is %.0f\\n\", sum); 25: out.printf(\"Average of numbers is %.2f\\n\", average); 26: } 27: } การนําขอ มลู เขาเรมิ่ ตนดว ยการตรวจสอบวา input มีขอมูลอยหู รือไมดว ยการใชค าํ ส่งั input.hasNext() ซึง่ ถา hasNext() สง คา ทเี่ ปน จริงกลบั มาเราก็จะรวู ามีขอ มูลอยู และจะทาํ ใหเราสามารถดึงขอมูล ออกมาไดดว ยคาํ ส่ัง (บรรทดั ท่ี 19) sum += input.nextDouble() ทง้ั น้ี user จะตอ งใสข อมูลโดยมีชอ งวางอยรู ะหวา งเหมอื นกับโปรแกรมกอนหนา น้เี ชนเดยี วกนั แต การบอกใหโ ปรแกรมรูว า การนําขอ มูลเขา ไดสิ้นสดุ ลง เราตอ งกดปมุ <enter> ตามดว ย <ctrl/z> และกดปมุ <enter> อีกครั้งหนง่ึ ดงั ทแ่ี สดงจากตวั อยา งผลลัพธนี้ Enter numbers: 1 2 3 4 5 ^Z Sum of numbers is 15 Average of numbers is 3.00 ผอู านจะเหน็ วา โปรแกรมของเราสัน้ ลงกวา เกามาก และกไ็ ดผ ลเชน เดยี วกนั ถึงแมวา การยตุ ิการนาํ ขอมลู เขา จะยงุ ยากกวาก็ตาม เราสามารถท่จี ะเรยี กใช scanner ในการอานขอ มูลจาก dialog box ไดเ ชน เดยี วกบั ทเ่ี ราใช scanner อานขอมูลจาก command line วิธกี ารกไ็ มยาก เพยี งแตเ ปลย่ี นการสง ชอ งทางนําขอ มลู เขา ของ scanner จาก System.in ใหเปน การอานจาก String ทเี่ ก็บขอมลู จาก dialog box ดังนี้ String in = JOptionPane.showInputDialog(null, \"Enter int values (separate by space)\", \"Sum of numbers\", JOptionPane.QUESTION_MESSAGE); Scanner input = new Scanner(in); ซ่ึงเราไดแ สดงการใชด งั กลาวในโปรแกรม SumDialog.java ทเ่ี ห็นนี้ 1: /** 2: Reading numbers from dialog box using scanner 3: */ 4: 5: import java.util.Scanner; 6: import javax.swing.JOptionPane; 7: 8: class SumInDialog { 9: public static void main(String[] args) { 10: double number, sum = 0; 11: int count = 0; 12: 13: //getting numbers from a dialog box 14: String in = JOptionPane.showInputDialog(null, 15: \"Enter int values (separate by space)\", 16: \"Sum of numbers\", JOptionPane.QUESTION_MESSAGE); 17: 18: Scanner input = new Scanner(in); 19: 20: //loop through numbers and add them up 21: for(; input.hasNext(); count++) { 22: sum += input.nextDouble(); 23: } 24: 25: //calculate average 26: double average = sum / count; 27: 98
บทที่ 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) 28: //display result via dialog box 29: JOptionPane.showMessageDialog(null, \"The sum is \" + 30: String.format(\"%.0f\\n\", sum) + 31: \"Average is \" + String.format(\"%.2f\\n\", average), 32: \"Sum of numbers\", JOptionPane.INFORMATION_MESSAGE); 33: } 34: } เราเก็บขอมูลที่ user ใสใน dialog box ไวในตวั แปร in ซึ่งเมอ่ื เราไดแลวเรากส็ งตัวแปร in นใ้ี หก บั scanner (ในบรรทัดท่ี 14 และ 18 ตามลาํ ดบั ) ผลลพั ธของการทดลอง run โปรแกรมก็เปน อยางที่ เราคาดไวคือ ในการใช for/loop นนั้ เราสามารถทีจ่ ะใช , (comma) เปน ตัวแบงการประมวลในแตล ะ expression ได ดังตัวอยางโปรแกรมการหาผลรวมและคา เฉลยี่ นของเลขจากหนง่ึ ถึงรอ ย 1: /** 2: Adding numbers using for/loop 3: with comma 4: */ 5: 6: import static java.lang.System.out; 7: 8: class SumUsingFor { 9: public static void main(String[] args) { 10: int i, sum; 11: 12: for(i = 1, sum = 0; i <= 100; sum += i, i++) ; 13: 14: out.printf(\"Sum = %d%n\", sum); 15: out.printf(\"Average = %.2f\", (double)sum / (i-1)); 16: } 17: } เรากําหนดให expression1 ของเรามขี อ ความอยสู องขอ ความคือ i = 0 และ sum = 0 โดยเราใช , เปนตัวแบงขอ ความทง้ั สอง เชนเดียวกันกับ expression3 เรากําหนดใหมีขอ ความ sum += i และ i++ อยู และในตวั for/loop นั้นเราไมม ีการกาํ หนดประโยคใด ๆ เลย ทงั้ น้ีกเ็ พราะวาเราไดก ําหนดให การหาผลรวมน้นั อยูใน expression3 แลว แตเ ราจะตอ งใส ; (หรือเราอาจใส {})เพือ่ ให Java รวู าเรา ไดจ บ for loop ของเราแลว for(i = 1, sum = 0; i <= 10; sum += i, i++) ; หรือ 99
เร่ิมตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa) for(i = 1, sum = 0; i <= 10; sum += i, i++) { } การทาํ งานของ for/loop ท่วี า นี้กเ็ หมือนกันกบั การเขยี น for/loop แบบเดมิ ตางกันตรงทีเ่ ราไดย า ย ตําแหนงของประโยคสองประโยค เทา น้นั เอง sum = 0; for(i = 1; i <= 10; i++) sum += i; ตําแหนง ของขอ ความการหาผลรวมกม็ คี วามสาํ คัญ เราตอ งกําหนดใหป ระโยค sum += i นนั้ อยกู อ น ประโยค i++ ทง้ั น้ีก็เพราะวา Java จะประมวลผลประโยคท่ีอยทู างซายของเคร่อื งหมาย , กอน แลว จึงจะประมวลผลประโยคทอี่ ยถู ัดไปทางขวา ซงึ่ ถา เรากําหนดให i++ อยกู อ น sum += i การ ประมวลผลของเราก็จะผดิ พลาด คา ของผลรวมทไี่ ดคลาดเคลือ่ น สวนท่สี ําคญั อีกสวนหนึ่งกค็ อื คาของ i สําหรบั การคาํ นวณหาคา เฉล่ีย เราตอ งหกั คาของ i ออกหนึง่ คา กอ นนาํ ไปหาร sum กเ็ นอ่ื งจากวาในขณะท่ี for/loop ยุตกิ ารทํางานนน้ั คา ของ i มีคาเปน 101 การหาผลรวมของ for/loop ทีก่ ลาวมาแลว นนั้ เราสามารถท่ีจะเขียนไดอีกหลายรูปแบบ เชน i=; sum = 0; for( ; i <= 100; i++) ; sum += i; หรือ i = 1; sum = 0; for( ; i <= 100; ) { sum += i; i++; } หรอื sum = 0; for( i = 1; i <= 100; ) { sum += i; i++; } ผูอา นควรคํานงึ ถงึ การเขียน code ท่ีดแู ลวอานไดงาย มีโครงสรางทม่ี องดเู ปนสากล ดงั นนั้ ถงึ แมวา Java จะยอมใหเ ราเขียน code ไดอ ยางอสิ ระและหลายรูปแบบ เรากไ็ มควรเขยี น code ทย่ี ากตอการ ทําความเขาใจ ยกเวนวา การเขียน code นัน้ ๆ มคี วามจําเปนท่ตี อ งใชรปู แบบนนั้ ๆ ในการเขียน (จําเปนจริงหรือ?) 3.4.1.1 การใช for-in/loop (for-each) Java 1.5 ไดก าํ หนดใหม กี ารใช for/loop อกี รูปแบบหนึ่งทีเ่ รียกวา for-in/loop ซ่งึ เปน for/loop ท่ี ใชในการดึงเอาขอ มลู ออกมาจากทีเ่ กบ็ เชน ขอมูลท่ีเก็บอยใู น array ซง่ึ เราจะพูดถึงในบทที่ 4 แต เน่ืองจากวาเราตองการใหผูอา นไดร ูจกั ถึง for-in/loop นีอ้ ยางครา ว ๆ กอน เราจงึ ไดน าํ เอาตวั อยาง ของ for-in/loop มาแสดงใหด ใู นที่น้ี โปรแกรมตวั อยางที่เราแสดงใหด ูเปน โปรแกรมงาย ๆ ทร่ี บั ขอมูลมาจาก command-line โดย user จะเปนผูใสข อ มูลถัดจากช่ือของโปรแกรม เชน ถา โปรแกรมของเราชือ่ ForInLoop เราก็จะเรยี กใช โปรแกรมดวยคาํ สง่ั ทเี่ ห็นนี้ พรอมท้ังใสข อมลู ของโปรแกรมตามหลงั คอื I love for/loop d:\\source>java ForInLoop I love for/loop โปรแกรมตัวอยางของเรามีหนา ตาดงั น้ี 1: /** 100
บทที่ 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) 2: Using for-in/loop 3: */ 4: 5: import javax.swing.JOptionPane; 6: 7: class ForInLoop { 8: public static void main(String[] args) { 9: //get each word from command-line 10: //and display them 11: for(String str : args) { 12: JOptionPane.showMessageDialog(null, 13: str, \"Words in sentence\", 14: JOptionPane.INFORMATION_MESSAGE); 15: } 16: } 17: } ผอู า นจะเห็นวา ในบรรทดั ท่ี 11 เราเรยี กใช for-in/loop ในการดงึ เอาขอ มูลออกจากตวั แปรท่ีชอ่ื args ซึง่ เปน command-line argument ของตวั โปรแกรมเองโดยทชี่ นดิ ของขอ มลู จะตองเปนชนดิ เดียวกนั กบั ท่เี ขามา และทไี่ ดก ําหนดไวใ น for-in/loop ดงั ทเี่ ราไดทาํ ไว รูปแบบของ for-in/loop มี ดังนี้ for(declaration : expression) statement จากรูปแบบของ for-in/loop และที่เราไดเขียนไวในบรรทดั ที่ 11 declaration คอื String str expression คอื args (args ของเราเปน array ทีเ่ กบ็ String) พดู ภาษางาย ๆ กค็ ือ for-in/loop ท่ีเราใชใ นบรรทดั ท่ี 12 เปน loop ทบ่ี อกใหเ กิดการทํางานทีว่ า \"สาํ หรับ String str ทุกตัวทอี่ ยใู น args\" เราจะทํากระบวนการตอ ไปนี้ … สิ่งที่เราทําไมไดใ น for-in/loop กค็ ือการทาํ แบบทว่ั ไปกับ loop ตา ง ๆ ที่เราเคยทาํ เชน ถาเรา ตอ งการดึงเอาขอมูลจากตําแหนง ใด ๆ ใน loop หรือแสดงขอ มลู ณ ตําแหนง น้ันๆ เปน ตน ขอ ควร ระวังในการใช for-in/loop ก็คือ expression จะตอ งเปน array หรือ object ท่มี าจาก java.lang.Iterable declaration โดยท่ัวไปจะเปน ชนิด และตัวแปร (การประกาศตวั แปรน่ันเอง) เราจะกลบั มาดูตวั อยางการใช for-in/loop อกี ในบทอืน่ ๆ ตอไป 3.4.2 การใช while/loop การใช while/loop ก็คลาย ๆ กับการใช for/loop ตา งกนั เฉพาะโครงสรา งบางโครงสรา งเทานั้นเอง (ตาํ แหนง ของ expression) เรามาดโู ครงสรางของ while/loop กัน while(expression) statement while/loop จะตรวจสอบวา คาของ expression นน้ั เปน จรงิ หรือเท็จ ถา เปน จริงก็จะประมวลผล ประโยคตา ง ๆ ทีอ่ ยภู ายใน while/loop และจะประมวลผลประโยคอน่ื ๆ ที่ตามมา (ภายนอก while/ loop) หลงั จากท่ีหลุดออกจาก while/loop แลว ภาพท่ี 3-5 แสดงขัน้ ตอนการทํางานของ while/ loop 101
เริม่ ตน การเขยี นโปรแกรมดว ย Java Expression no intro. to Java (FEU.faa) (จรงิ ?) yes statement Next statement ภาพที่ 3-5 ขนั้ ตอนการทาํ งานของ while/loop เรามาลองใช while/loop แทน for/loop ทเ่ี ราไดใ ชในโปรแกรมตวั อยา งบางตวั กอ นหนา น้ี 1: /** 2: Adding numbers using while/loop 3: */ 4: import static java.lang.System.out; 5: 6: class SumUsingWhile { 7: public static void main(String[] args) { 8: int i, sum; 9: 10: //initialize i and sum 11: i = 0; 12: sum = 0; 13: 14: //repeat process as long as i 15: //less than or equals to 100 16: while(i <= 100) { 17: sum += i; //add i to sum 18: i++; //increment i 19: } 20: 21: //print sum and average 22: out.printf(\"Sum = %d%n\", sum); 23: out.printf(\"Average = %.2f\", (double)sum / (i-1)); 24: } 25: } สิง่ แรกทเี่ ราตองทํากค็ อื การกาํ หนดคา เบอ้ื งตน ใหกับตวั แปร i และ sum หลงั จากน้ันเรากท็ ําการ ตรวจสอบดูวาประโยค i <= 10 เปนจรงิ หรอื ไม ซึง่ ถา เปน จรงิ เราก็ให while/loop ของเราทําการบวก คา ของ i เขากับตัวแปร sum พรอมท้ังเพิม่ คาใหก ับ i เม่อื เสร็จแลว ถา เราลองเปรยี บเทียบการใช while/loop กบั for/loop เราจะเหน็ วา ประโยค i = 0; sum = 0; คอื expression ท่หี นึง่ ของ for/loop และประโยค i <= 10 ก็คอื expression ทส่ี องใน for/loop สว นประโยค i++ ก็คอื expression ทส่ี ามใน for/ loop นนั่ เอง (ถึงแมวาเราไดก ําหนดคาของ i ให เรมิ่ ตนท่ี 0 กไ็ มทาํ ใหก ารประมวลผลเปล่ยี นไป เพียงแตว า loop ของเราทํางานมากข้ึนอกี หนงึ่ คร้งั เทานั้น) ทนี ีเ้ รามาลองใช while/loop แทน for/loop ในโปรแกรม AddNumbers.java พรอ มทง้ั เปลยี่ นการ อานขอมลู และการแสดงผล 102
บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน 1: /** intro. to Java (FEU.faa) 2: Calculating sum and average of numbers 3: using split() to get each token from input string 4: */ 5: 6: import javax.swing.JOptionPane; 7: import static java.lang.System.out; 8: 9: class AddNumbers2 { 10: public static void main(String[] args) { 11: double number, sum = 0; //a number and sum 12: int count = 0; //total numbers read 13: String input; //input string 14: 15: //get input from user 16: input = JOptionPane.showInputDialog(\"Enter numbers: \"); 17: String[] tokens = input.split(\"\\\\s\"); 18: while(count < tokens.length) { 19: try { 20: number = Integer.parseInt(tokens[count]); 21: sum += number; 22: count++; 23: } 24: //display error and exit from program 25: catch(Exception e) { 26: JOptionPane.showMessageDialog(null, 27: \"Invalid input: \" + tokens[count] + 28: \"\\nBefore invalid input\\n\" + 29: \"Sum is \" + 30: String.format(\"%.0f\", sum) + 31: \"\\nAverage is \" + 32: String.format(\"%.2f\", (sum/count)), 33: \"Error\", 34: JOptionPane.ERROR_MESSAGE); 35: System.exit(1); 36: } 37: } 38: //calculate average and display result 39: double average = sum / count; 40: JOptionPane.showMessageDialog(null, 41: \"Sum of numbers: \" + input + \" is \" + 42: String.format(\"%.2f%n\", sum) + 43: \"Average of numbers: \" + 44: String.format(\"%.2f\", average), 45: \"Sum and Average\", 46: JOptionPane.INFORMATION_MESSAGE); 47: } 48: } ในโปรแกรม AddNumbers2.java เราจะใช method split() ของ class String เปน ตวั ดึงเอาขอมลู ออกจาก String ที่ user ใสเ ขามาแทนการใช StreamTokenizer ดงั ทีเ่ ห็นในบรรทดั ท่ี 173 ซงึ่ ขอมลู แตล ะตวั ทถี่ ูกดงึ ออกมานน้ั เราจะนาํ ไปเกบ็ ไวใน array ชือ่ tokens การดึงขอ มลู แตล ะตวั ออกมานนั้ เราตอ งกาํ หนดให split() รูวาเราใชอะไรเปน ตวั กาํ หนดการแบงขอ มลู ท่มี ีอยูใน input ในทีน่ ้ีเราใช ชองวาง (space) เปนตวั แบงโดยเราตองบอกให split() รูดวยการใช \\s แตเน่ืองจากวา \\s เปน escape sequence เราจึงตองกาํ หนดใหม ี '\\' อีกหน่งึ ตัวนาํ หนา '\\s' หลังจากน้นั เรากเ็ ขา หาขอมลู แตละตวั ดว ย while/loop โดยเรียกใช length เปนตัวกําหนดจาํ นวนคร้ัง ของการวน loop และเราจะคาํ นวณหาผลรวมของขอ มลู ทเ่ี ปน Integer เทา นนั้ ถาหากวามขี อมลู ตวั ใดก็ตามท่ไี มใ ช Integer โปรแกรมกจ็ ะยุตกิ ารทาํ งานพรอมทงั้ สง ผลรวมและคา เฉล่ยี ของขอ มูลท่ี ถกู ตองมีอยูกอนหนา ออกทางหนา จอ สว นการแสดงผลของขอ มูลทีถ่ ูกตองกเ็ ปน ไปตามปกติ ดงั ตวั อยา งน้ี 3 เราใชโ ครงสรา งท่ีเรยี กวา array ในการเกบ็ ตัวเลขแตละตัว ซ่งึ เราจะไดอธิบายอยางละเอยี ดตอ ไปในบทที่ 4 103
เรมิ่ ตนการเขียนโปรแกรมดวย Java จากผลลพั ธจะเหน็ วาโปรแกรมจะยตุ ิการประมวลผลถา เจอขอมลู ท่ีไมใ ช Integer ตง้ั แตต ัวแรกท่ีเจอ intro. to Java (FEU.faa) ซงึ่ ตา งจากการใช StreamTokenizer กอนหนา นี้ที่ยังสามารถประมวลผลเฉพาะขอ มลู ท่ีถกู ตอ ง ทงั้ หมดท่ีมอี ยู ท้งั for/loop และ while/loop เปน โครงสรา งของการทํางานแบบวนที่ตองมกี ารตรวจสอบกอนวา ประโยคในการควบคุมของ loop ทั้งสองเปน จรงิ หรือเท็จ ซ่ึงหมายถงึ วาการทาํ งานของ loop ท้ังสอง อาจไมเกดิ ขน้ึ เลยถา การประมวลผลประโยคควบคมุ เปน เทจ็ แตถาเราตอ งการท่ีจะประมวลผลกอน อยางนอยหน่งึ ครัง้ เราจะทาํ อยา งไร 3.4.3 การใช do-while/loop Java มีโครงสรา งการใช loop อกี ตวั หน่ึงท่ียอมใหม ีการทาํ งานอยางนอ ยกอ นหนึง่ คร้งั แลว จึงจะทาํ การประมวลผลประโยคควบคุม น่นั ก็คือ do-while/loop ซง่ึ มโี ครงสรางดังน้ี do { statement } while(expression); statement yes Expression (จริง ?) no statement ภาพที่ 3-6 ขนั้ ตอนการทํางานของ do-while/loop 104
บทท่ี 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) ถาเราตองการที่จะทํางานอยางนอ ยหนงึ่ ครง้ั กอ นที่จะมกี ารตรวจสอบเพื่อยตุ ิการทํางาน หรือทํางาน ตอ ไป do-while/loop จะเปนโครงสรา งที่เหมาะสมทีส่ ุด โปรแกรมตวั อยางตอไปนี้แสดงถงึ การใช do/while loop ในการตรวจสอบนน้ั ๆ 1: /** 2: do/while loop demonstration 3: until user enter a letter other than 'y' 4: */ 5: 6: import static java.lang.System.out; 7: import java.util.Scanner; 8: 9: class DoWhile { 10: public static void main(String[] args) { 11: int score; 12: char grade, ch; 13: Scanner input = new Scanner(System.in); 14: 15: do { 16: //get input string 17: out.print(\"Enter your score: \"); 18: score = input.nextInt(); 19: 20: //determine grade by given score 21: if(score > 90) 22: grade = 'A'; 23: else if(score > 80) 24: grade = 'B'; 25: else if(score > 70) 26: grade = 'C'; 27: else if(score > 60) 28: grade = 'D'; 29: else 30: grade = 'F'; 31: 32: out.println(\"Your grade is \" + grade); 33: out.print(\"\\nDo you want to continue? <y/n> : \"); 34: String response = input.next(); 35: ch = (char)response.charAt(0); 36: } 37: while(ch == 'y' || ch == 'Y'); 38: } 39: } เราเพียงแตด ดั แปลงโปรแกรมการหาเกรดของเรา ดวยการเพิม่ do/while และประโยค out.print(\"\\nDo you want to continue? <y/n> : \"); String response = input.next(); ch = (char)response.charAt(0); ทใี่ ชสาํ หรับการถาม user วา ตองการทาํ งานตอ หรอื ไม โดยเราทําการดึงเอาตัวอักษรตวั แรกทอ่ี ยใู น บรรทัดนนั้ ออกมา ทําการเปรยี บเทียบกบั ตัวอักษร y ใน expression ของ do-while/loop ซง่ึ ถา การ เปรียบเทียบนนั้ เปน จริงเราก็จะทํางานไปเร่ือย ๆ วธิ ีการเดียวทีจ่ ะทาํ ให do-while/loop ยตุ กิ ารทาํ งาน ก็คอื การใสตวั อักษร n (หรอื อนื่ ๆ ทไี่ มใ ช y) เราใช method chatAt() ดว ยคา parameter ที่เปน ศูนยเพ่อื ดึงเอาอกั ษรตัวแรกสดุ ใน buffer มาเก็บ ไวในตัวแปร ch สําหรับการเปรียบเทยี บประโยคควบคุมของ do-while/loop ผลลพั ธก าร run โปรแกรมดว ยคา ตา ง ๆ Enter your score: 89 Your grade is B Do you want to continue? <y/n> : y Enter your score: 12 Your grade is F 105
เรมิ่ ตนการเขยี นโปรแกรมดวย Java Do you want to continue? <y/n> : y intro. to Java (FEU.faa) Enter your score: 75 Your grade is C Do you want to continue? <y/n> : n เรามาลองดูโปรแกรมตัวอยางอีกตวั หนึง่ ที่ใช do-while/loop ในการหาผลรวมของเลขระหวาง 1 – 100 1: /** 2: Adding numbers using do-while/loop 3: */ 4: 5: import static java.lang.System.out; 6: 7: class SumUsingDoWhile { 8: public static void main(String[] args) { 9: int i = 0; //loop counter 10: int sum = 0; //sum of i 11: 12: //repeat process until i is 13: //no longer less than or equal to 100 14: do { 15: sum += i; //add i to sum 16: i++; //increment i 17: } 18: while(i <= 100); 19: 20: out.printf(\"Sum = %d%n\", sum); 21: out.printf(\"Average = %.2f\", (double)sum / (i-1)); 22: } 23: } ซงึ่ เมื่อ run ดูก็ไดผลลพั ธด ังน้ี Sum = 5050 Average = 50.5 เราไมไ ดเ ปลย่ี นแปลงอะไรมากมายใน loop ของเราเพียงแตเ ปลยี่ นมาใช do-while/loop เทาน้ันเอง การใช do-while/loop รับรองวา จะเกดิ การทํางานอยา งนอ ยหน่ึงครง้ั เสมอดงั ทเ่ี ห็นจากตวั อยางทัง้ สอง เพราะฉะน้ันถาผอู า นไมต อ งการตรวจสอบเง่อื นไขกอ นการประมวลผล do-while/loop กเ็ ปน ตัวเลอื กที่คอ นคา งเหมาะสมท่สี ดุ 3.5 การใช break และ continue หลาย ๆ คร้ังทเี่ ราตองการยุติการทาํ งานของ loop โดยท่ี loop ยังไมส ิ้นสดุ การทํางานของมันเอง เชน กาํ หนดให loop หยุดการทํางานเมอื่ เงื่อนไขทไี่ ดก าํ หนดไวเ ปน จริง ดงั แสดงใหเหน็ ในโปรแกรม ตวั อยางน้ี 1: /** 2: Using break to get out of the loop 3: */ 4: 5: import static java.lang.System.out; 6: 7: class SumWithBreak { 8: public static void main(String[] args) { 9: int i = 1, sum = 0; 10: 11: //repeat the task until i > 200 12: do { 13: sum += i; 14: i++; 15: 16: //break out of loop when i > 100 17: if(i > 100) 18: break; 106
บทท่ี 3: การตัดสินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) 19: } 20: while(i <= 200); 21: 22: out.println(\"Sum = \" + sum); 23: out.println(\"Average = \" + (double)sum / (i-1)); 24: } 25: } เราใชโปรแกรม SumWithBreak.java เปน พน้ื ฐานของการเปลยี่ นแปลง โดยเรากําหนดใหม ีการ ตรวจสอบคา ของ i วา มากกวา 100 หรือไมซึง่ ถาเปน จรงิ เรากจ็ ะ break ออกจาก loop ทันที if(i >= 100) break; เมอ่ื เราลอง run ดเู ราไดผลลัพธด ังน้ี Sum = 5050 Average = 50.5 ลองมาดโู ปรแกรมท่ีใช break ในการหยุดการทาํ งานของ loop ทใี่ ชห าคาของตวั เลขทรี่ ะหวางหน่ึง ถึงสิบทเี่ ปนเลขคู 1: /** 2: Using break in a loop 3: */ 4: 5: class Break { 6: public static void main(String[] args) { 7: 8: for(int number = 1; ; number++) 9: if(number % 2 == 0) { 10: System.out.println(\"Number is \" + number); 11: 12: //break out of loop when number >= 10 13: if(number >= 10) 14: break; 15: } 16: } 17: } เราจะตรวจสอบวา ตัวเลขเปนเลขคกู อนแลว จึงทาํ การแสดงตัวเลขนนั้ ๆ ไปยังหนา จอเมื่อคาของ number เปนสบิ เราก็จะยุติการทํางานของ loop ดงั ท่แี สดงใหเ ห็นจากผลลพั ธท่ีไดน้ี Number is 2 Number is 4 Number is 6 Number is 8 Number is 10 การใช break ใน loop เปน การกาํ หนดให loop หยดุ การทํางานทันที ท่เี จอ break แตถ า เราตอ งการ ทีจ่ ะกระโดดขามคําสัง่ หรอื ชุดคาํ ส่งั ทมี่ ีอยูเมอ่ื เงือ่ นไขบางอยา งเปนจรงิ เราตองใช continue แทน ดงั โปรแกรมตวั อยางนี้ 1: /** 2: Using continue in a loop 3: */ 4: 5: import static java.lang.System.out; 6: 7: class Continue { 8: public static void main(String[] args) { 9: 10: for(int number = 1; number <= 10; number++) { 11: 12: //skip if number is 5 13: if(number == 5) { 14: out.printf(\"%d is skipped!%n\", number); 15: continue; 107
เรม่ิ ตน การเขียนโปรแกรมดวย Java intro. to Java (FEU.faa) 16: } 17: 18: out.println(\"Number is \" + number); 19: } 20: } 21: } การประมวลของประโยคในบรรทัดที่ 18 จะเกิดขนึ้ ทุกคา ของ number ยกเวนเมอ่ื คา ของ number มี คาเทา กบั หา ดงั แสดงใหเหน็ จากผลลพั ธนี้ Number is 1 Number is 2 Number is 3 Number is 4 5 is skipped! Number is 6 Number is 7 Number is 8 Number is 9 Number is 10 การใช continue นนั้ โดยท่วั ไปมักจะไมค อยมที ใ่ี ชเทาไรนัก เพราะการเขยี นโปรแกรมโดยท่วั ไปมกั จะ ทาํ การประมวลผลกลุมของคาํ สั่งทัง้ หมดจนเสร็จ หรอื ไมกย็ ุติการทาํ งานเม่อื เงื่อนไขบางอยางเปน จรงิ การกระโดดขา มการประมวลผลชดุ คําส่งั ไมค อ ยจะมีใหเห็นมากมายนัก ดังน้นั กค็ งตองขึ้นอยกู บั การออกแบบโปรแกรมของผูอานเองวา เหมาะสมอยางไรตอการใชช ดุ คําส่ังตา ง ๆ 3.6 การใช loop ใน loop (Nested Loop) เราสามารถท่จี ะนาํ เอา loop ตาง ๆ ท่ีเราไดพ ูดถึงมาใสไ วใน loop ได เชน เดยี วกับท่ีเราทาํ กับ if – else เนื่องจากวา ตัว loop เองกเ็ ปนประโยคอยางหนึ่ง ดังนั้นการนําประโยคมาวางซอนกนั ในการ เขยี นโปรแกรมกย็ อมทีจ่ ะทําได เรามาลองดตู ัวอยา งการใช nested loop กนั 1: /** 2: Using loop inside another loop 3: */ 4: 5: class NestedLoop { 6: public static void main(String[] args) { 7: 8: for(int row = 1; row <= 10; row++) { 9: for(int column = 1; column <= 10; column++) { 10: 11: //break out of inner loop when 12: //column is greater than row 13: if(column > row) 14: continue; 15: System.out.print(\"*\"); 16: } 17: System.out.println(); 18: } 19: } 20: } โปรแกรม NestedLoop.java ของเราใช for/loop สองตวั ในการแสดงจํานวนของ '*' ในแตละแถว ดงั ทแี่ สดงใหเ หน็ จากผลลพั ธน้ี * ** *** **** ***** ****** ******* ******** ********* ********** 108
บทท่ี 3: การตดั สนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) ใน for/loop ตวั แรกของเรา เราใชต ัวแปร row เปน loop index ซงึ่ จะประมวลผลเปนจํานวนเทากับ สิบคร้งั และในแตละครง้ั ท่ี row มีการประมวลผล for/loop ตัวทสี่ องทม่ี ี column เปน loop index จะ ประมวลผลเปนจํานวนเทากบั สิบครง้ั เพราะฉะน้นั การประมวลผลของ for/loop ทัง้ สองตัวจึงมีคา เปน จาํ นวนเทา กับหน่ึงรอยคร้งั ทกุ ๆ การประมวลผลของ for/loop ตวั ทสี่ องเราจะตรวจสอบวาคา ของ column มากกวาคา ของ row หรอื ไม ซงึ่ ถามากกวา เราจะหยุดการแสดงคา '*' ไปยงั หนาจอทันทีดวยการเรยี กใช continue ที่เรา ไดพดู ถึงกอนหนาน้ี ในขณะที่ row และ column มคี าเทากับหน่ึงน้ันเราก็สง '*' ไปยงั หนา จอ หลังจากนัน้ column กม็ ีคา เปนสอง ซง่ึ มีคา มากกวา row การกระโดดขา มจงึ เกิดขึน้ ซ่ึงจะเปน ไปจนกระทง่ั column มคี า เทากับ สบิ เอ็ดการประมวลผลของ for/loop ดานในจึงยตุ ิลง หลังจากนั้น row กม็ ีคา เปนสอง เหตกุ ารณเ ดมิ กเ็ กิดข้นึ อกี แตต อนนกี้ ารแสดงผล '*' จะมีเพ่ิมขึ้นจนกวา คาของ column จะมากกวา row เปนเชน นี้ ไปเรอ่ื ย ๆ จนกระทง่ั คา ของ row มคี าเปนสบิ เอ็ดการประมวลผลของ for/loop ดา นนอกจงึ ยตุ ลิ ง โดยความเปนจรงิ แลวเราสามารถทจี่ ะใช break แทนการใช continue ได ซึ่งกจ็ ะไดผลลพั ธ เหมอื นกนั ทั้งนี้เพราะการใช break จะทาํ ใหเ ราหลดุ ออกจาก for/loop ดานในทันที ซ่งึ เปน การ ประมวลผลทีด่ กี วา การใช continue เนอื่ งจากวา เราประมวลผล for/loop ดา นในดว ยจํานวนครัง้ ท่ี เทากบั คา ของ row ทเ่ี ปน อยขู ณะนัน้ (ผอู านควรตรวจสอบดวู าการประมวลผลของ for/loop ดานในมี จาํ นวนเทา กับก่ีครงั้ ในทุก ๆ การประมวลผลของ for/loop ดา นนอก - ทกุ คาของ row) ลองมาดูโปรแกรมตัวอยางอีกโปรแกรมหน่ึงที่ใช Nested – loop ในการแสดงผลของตัวเลขทเี่ รยี ง กันเปนรปู สามเหลยี่ ม 1: /** 2: Triangle of numbers 3: */ 4: 5: import static java.lang.System.out; 6: 7: class NumberTri { 8: public static void main(String[] args) { 9: int row, col; 10: int num; 11: 12: for(row = 0; row <= 7; row++) { 13: //print leading blanks 14: for(col = 1; col <= 7 - row; col++) 15: out.print(\" \"); 16: //print left half 17: for(col = 0; col <= row; col++) { 18: num = (int)Math.pow(2, col); 19: //print 4 blanks for a single digit number 20: //print 3 blanks for two-digit number 21: //print 2 blanks for three-digit number 22: if(num < 10) 23: out.print(\" \" + num); 24: else if(num < 100) 25: out.print(\" \" + num); 26: else 27: out.print(\" \" + num); 28: } 29: //print same format as before 30: for(col = row - 1; col >= 0; col--) { 31: num = (int)Math.pow(2, col); 32: if(num < 10) 33: out.print(\" \" + num); 34: else if(num < 100) 35: out.print(\" \" + num); 36: else 37: out.print(\" \" + num); 38: } 39: out.println(); 40: } 41: } 42: } 109
เรมิ่ ตน การเขยี นโปรแกรมดว ย Java intro. to Java (FEU.faa) ผลลัพธท ีไ่ ดจากการ run โปรแกรม NumberTri.java คือ 1 12 1 124 2 1 1248 4 2 1 1 2 4 8 16 8 4 2 1 1 2 4 8 16 32 16 8 4 2 1 1 2 4 8 16 32 64 32 16 8 4 2 1 1 2 4 8 16 32 64 128 64 32 16 8 4 2 1 เราไดทาํ การตรวจสอบถงึ คา ของตวั เลขทจี่ ะแสดงไปยงั หนาจอวา เปน ตัวเลขก่ี digit โดยเราจะ กําหนดใหมีการเวน ชอ งวา งไวดานหนาตวั เลขตามคา ของ digit น้นั ๆ เชน ตัวเลขหนงึ่ digit เราจะ แสดงชอ งวาง 3 ชอง ตวั เลข 2 digit เราจะแสดงชองวา ง 2 ชอ งและตวั เลขสาม digit เราจะแสดง 1 ชอ ง เพือ่ การเรียงลาํ ดบั ตัวเลขทดี่ แู ลวสวยงาม 3.7 การใช Label continue และ Label break ใน for loop Java ยอมใหมกี ารใช label ในการหยุดและเรมิ่ การประมวลผลใหม ซง่ึ โปรแกรมเมอรหลาย ๆ ทาน ไมค อยจะเหน็ ดวยกบั การใชการประมวลผลในลักษณะนเี้ ทา ใดนกั เรามาดูตวั อยา งกนั 1: /** 2: Using a label/continue 3: */ 4: 5: 6: class LabeledContinue { 7: public static void main(String[] args) { 8: 9: label: for(int row = 1; row <= 10; row++) { 10: System.out.println(); 11: 12: for(int col = 1; col <= 10; col++) { 13: 14: //go to label when column 15: //is greater than row 16: if(col > row) 17: continue label; 18: 19: System.out.print(\"*\"); 20: } 21: } 22: } 23: } เราไดด ัดแปลงโปรแกรม Continue.java ของเราสําหรับการแสดงการใช labeled continue ใน โปรแกรม LabeledContinue.java เรากาํ หนดใหมี identifier ท่ีมชี อ่ื วา label อยกู อนหนา for loop ดา นนอกของเรา ซง่ึ ตองมเี คร่ืองหมาย ':' ตามหลงั เสมอ และในการใช continue ใน for loop ดาน ในนนั้ เราจะตองมี identifier ทเ่ี ราใชต ามหลงั continue เสมอ การประมวลดว ย labeled continue ก็ไมย ากนกั ที่จะทําความเขา ใจ เมื่อคา ของ col มากกวา คา ของ row การทํางานใน for/loop ดา นในก็ส้นิ สดุ ลงและไปเรม่ิ ตนใหมท ่ี for/loop ดา นนอก เพราะนนั่ เปน ทท่ี ีม่ ี label อยู การทํางานแบบนีก้ เ็ หมอื นกบั การกระโดดไปยงั ตาํ แหนง ท่ีเราตองการจะไปน่ันเอง ทั้งน้ีก็ตอ งขน้ึ อยูกบั เงื่อนไขท่เี ราไดตั้งไว (ผลลพั ธเ หมือนเดมิ คอื ) * ** *** **** ***** ****** ******* ******** ********* 110
บทท่ี 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) ถา เราเปลีย่ น continue ใหเปน break เราจะไดผ ลลพั ธอ ะไร เรามาลองดโู ปรแกรมที่ใช labeled break กันดู 1: /** 2: Using label/break 3: */ 4: 5: import java.io.*; 6: 7: class LabeledBreak1 { 8: public static void main(String[] args) { 9: 10: label: for(int row = 1; row <= 10; row++) { 11: System.out.println(\"Before inner loop\"); 12: 13: for(int column = 1; column <= 10; column++) { 14: //break at label when column 15: //is greater than row 16: if(column > row) 17: break label; 18: 19: System.out.print(\"*\"); 20: } 21: 22: System.out.println(\"After inner loop\"); 23: } 24: System.out.println(\"\\nAfter outter loop\"); 25: } 26: } เราไดเพิม่ ประโยคทง้ั กอนและหลงั for/loop ดา นในของเราเพอื่ จะไดด ูวา การประมวลผลเกิดขน้ึ ที่ ใดบา ง ผลลัพธทเ่ี ราไดค อื Before inner loop * After label ขอความทีอ่ ยใู นบรรทัดที่ 24: System.out.println(\"After inner loop\"); จะไมไดรับการประมวลผล ท้งั น้กี เ็ พราะวาคําสั่งของ break กาํ หนดใหการทํางานยุติลงที่ label เราสามารถท่จี ะมี label block ก่ี block ก็ไดในโปรแกรมของเรา การใช labeled break ถาใชไ ด อยางเหมาะสมแลวจะทําใหก ารเขยี น code เปนไปไดอ ยางสะดวกยง่ิ ขน้ึ ท้ังนก้ี เ็ พราะวาเราสามารถท่ี จะกระโดดไปยัง block ตา ง ๆ ไดอยา งงาย ๆ ลองดโู ปรแกรมตัวอยา งอีกตวั หน่ึงท่ีใช labeled break ในการหาผลคณู ของเลขระหวาง 1 – 5 1: /** 2: Using label/break 3: */ 4: 5: import static java.lang.System.out; 6: 7: class LabeledBreak { 8: public static void main(String[] args) { 9: int prod = 1; 10: int i = 1; 11: 12: here: while(true) { 13: //calculate product 14: prod *= i++; 15: 16: //go to label: here when i 17: //is greater than 5 18: if(i > 5) 19: break here; 20: else 21: out.printf(\"Value of prod is %d%n\", prod); 22: } 23: 111
เร่มิ ตน การเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa) 24: out.println(\"\\nFinal product is \" + prod); 25: } 26: } เราใช while/loop ทท่ี าํ งานอยตู ลอดเวลาโดยไมม กี ารกาํ หนดใหห ยดุ (ใช true ใน expression) แต เรากําหนดใหมกี ารหยุดจากการใช labeled break ใน while/loop เอง ตวั โปรแกรมจะคาํ นวณหาผล คณู ไปจนกวา คา ของ i จะเปนหา ก็จะ break ออกจาก block ทช่ี อ่ื here ทนั ที และจะไปประมวลผล ประโยคที่อยถู ัดมาจาก block ซ่งึ ก็คอื System.out.println(\"\\n Final product is \" + prod) ทาํ ให เราไดผ ลลัพธดงั นี้ Value of prod is 1 Value of prod is 2 Value of prod is 6 Value of prod is 24 Final product is 120 Loop เปน โครงสรางท่ีใชม ากในการเขียนโปรแกรมตา ง ๆ ท้ังนี้เพราะ loop เอ้อื อาํ นวยใหผเู ขียน เรยี กใชชุดคําสั่งตา ง ๆ ซ้าํ กนั ได ทาํ ใหการเขียนโปรแกรมลดขั้นตอนการทํางานลง และการทํางาน ของโปรแกรมก็กระชับย่ิงขน้ึ เราจะกลับมาพูดถึง loop อกี หลาย ๆ คร้งั ในบทตอ ๆ ไป โดยเฉพาะใน เร่ืองของ Array และ String สรุป ในบทน้เี ราไดพูดถงึ การใชป ระโยคของการเปรียบเทียบ และการตดั สนิ ใจ การใชประโยคควบคุมการ ทํางาน การใช loop ในการประมวลผลตดิ ตอ กนั โดยรวมแลว เราไดพดู ถึง 9 การใช if และ if-else 9 การใช nested-if 9 การใช Conditional operator (? :) 9 การใช switch 9 การใช loop ตา ง ๆ เชน for/loop for-in/loop while/loop และ do-while/loop 9 การใช break continue และการใชประโยคท่ใี ช label แบบฝก หัด 1. จงเขียนโปรแกรมท่ีรับ int จาก keyboard จํานวน 10 ตวั หลังจากนนั้ ใหคาํ นวณหาผลรวม และ คาเฉล่ียของขอ มูลท้งั 10 ตวั ใหส ง ผลลัพธออกทางหนา จอ 2. จงหาผลลพั ธของ code ตอไปนโี้ ดยไมใช compiler ชว ย class Loops { public static void main(String[] args) { int index = 1; while(index != 9) { index += 2; System.out.println(index); index--; } } } 112
บทท่ี 3: การตดั สินใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) class Loops1 { public static void main(String[] args) { int index1, index2; index1 = 33; index2 = 1; while(index1 < index2) { index1 = index1 + 10; System.out.println(index1); index2 = index2 * 2; } } } class Loops2 { public static void main(String[] args) { int index = 1; while(index != 33) { index++; System.out.println(index); index++; } } } class Loops4 { public static void main(String[] args) { int j, k = 1; while(k < 7) { j = 5; while(j > 0) { System.out.println(\"j = \" + j); System.out.println(\"k = \" + k); j--; } k *= 2; } } } class Loops5 { public static void main(String[] args) { int j = 10, k = 1; while(k < 8) { while(j > 0) { System.out.println(\"j = \" + j); System.out.println(\"k = \" + k); j--; } k = k * 2; } } } 3. จงเขียนโปรแกรมที่สรางตวั เลขแบบสมุ จํานวน 100 ตวั เสร็จแลวใหแ สดงผลลพั ธอ อกทาง หนา จอเฉพาะตัวเลขท่เี ปน เลขคเี่ ทานน้ั โดยกาํ หนดใหการแสดงผลเปน 10 ตวั ตอ หนงึ่ บรรทดั 4. จากโจทยใ นขอ 2 แทนท่ีจะแสดงผลเปนเลขคใี่ หแ สดงผลเฉพาะที่เปนเลขคูเทานั้น โดยแสดง เฉพาะเลขคูทีม่ ากกวา 20 เทา นัน้ 5. จงเขียนโปรแกรมทแี่ สดงตัวอักษรตงั้ แต A ไปจนถึง Z ดวยการใช while/loop โดยไมมกี ารรบั คา ใด ๆ จาก keyboard 6. จงเขยี นโปรแกรมทีค่ าํ นวณหาคาท่เี ล็กท่ีสดุ ในกลุมตัวอกั ษรท่ีอา นเขา มาจาก keyboard ทีละตวั (ตวั อกั ษรท่นี าํ เขา ควรมจี าํ นวนไมนอ ยกวา 10 ตวั ) 113
เร่ิมตนการเขยี นโปรแกรมดวย Java 7. จงเขยี นโปรแกรมทีอ่ า นขอ มูล 2 ตัวจาก keyboard โดยทตี่ วั แรกเปน หมายเลขของสินคา intro. to Java (FEU.faa) (product number) และตัวทสี องเปน จํานวนท่ีขายไปในแตละวัน (quantity sold) กาํ หนดใหมี สินคา อยู 5 ชนิดท่ีมีราคาตางกนั ดังน้ี สินคา ท่ี 1 ราคา 500.0 บาท สนิ คา ที่ 2 ราคา 750.0 บาท สินคา ท่ี 3 ราคา 850.0 บาท สนิ คาท่ี 4 ราคา 950.0 บาท สินคาท่ี 5 ราคา 1000.0 บาท โปรแกรมจะคํานวณหายอดเงนิ ทขี่ ายไดของสนิ คา ทกุ ตวั ในอาทิตยทีผ่ านมา โดยที่จํานวนของ สินคาแตล ะชนิดทข่ี ายไปจะนําเขามาจาก keyboard โปรแกรมท่ีเขียนขนึ้ ตอ งใช switch ในการ แยกแยะราคาของสนิ คา แตล ะชนดิ ทีเ่ ขามา ใหแ สดงผลลพั ธอ อกทางหนา จอ 8. จงเขยี นโปรแกรมทแ่ี สดงผลลัพธ ดงั ท่ีเห็นน้ี ดวยการใช loop เทานนั้ *********** ********** ********* ********* ******** ******** ******* ******* ****** ****** ***** ***** **** **** *** *** ** ** * * 9. จงเขียนโปรแกรมทรี่ ับคา int หน่ึงตวั (n) ท่มี ากกวา ศูนย หลงั จากน้ันใหแ สดงผล ดงั นี้ 1 2 3 ... n-1 n 1 2 3 … n-1 … 123 12 1 10. จงเขยี นโปรแกรมท่รี บั คาเปน วัน เดอื น ป จาก keyboard หลงั จากนั้นใหแสดงตาํ แหนงของวันที น้นั ในป เชน 12 29 2002 จะแสดงเปน 363 11. จงเขียนโปรแกรมท่รี ับคาตา งๆ จาก keyboard เฉพาะท่เี ปน 0 มากกวา ศนู ย และนอ ยกวาศนู ยให นับจาํ นวนของคาท้ังสามวา มอี ยางละก่ีตัว โปรแกรมจะหยดุ ทาํ งานไดก ต็ อ เม่ือ user ใสขอ มูลท่ี ไมใชต วั เลข 12. จงเขยี นโปรแกรมท่ีรบั คาระหวา ง 1 – 100 หลงั จากนน้ั ใหแ สดงคา ทีร่ ับเขา มาในรูปแบบของ ตวั หนงั สอื เชน ถาขอ มลู เขาเปน 11 ผลลัพธท ่ีไดค ือ สบิ เอ็ด 13. จงเขียนโปรแกรมท่ที ําการเขา รหัสของขอ มูลที่นําเขา จาก keyboard โดยนําเอาตัวอกั ษรทอี า น เขา บวกกบั คา ของตัวอกั ษรทอ่ี ยถู ัดไป 2 ตัวอกั ษร mod ดวยจํานวนของตัวอักษรทีม่ อี ยู (26 ตัว ในภาษาองั กฤษ) เชน ถา คา นาํ เขา เปน a ผลลัพธท ีไ่ ดจากการเขารหัสจะเปน a + c ซ่ึงจะมีคา เทากบั 97 + 99 =196 % 26 = 14 ใหใ ชคา นี้เปนตัวบอกตาํ แหนงของตวั อักษรท่ีจะแสดงไป ยงั หนาจอ ซ่ึงตวั อกั ษร ณ ตําแหนง ที่ 14 นคี้ ือ n 14. จงเขยี นโปรแกรมท่ีรับคา เปน ประโยคทางคณติ ศาสตร เชน 9 + 5 – 2 * 4 + 2 /3 หลงั จากนน้ั ใหทําการประมวลผลประโยคดงั กลา ว ตามลาํ ดบั ของขอ มูลทน่ี าํ เขา 15. จงเขียนโปรแกรมทร่ี บั คา เดือนทีเ่ ปน ตัวเลขระหวาง 1 – 12 หลงั จากนั้นใหแสดงผลเปนจาํ นวน ของวนั ท่ีมีอยูในเดอื นดังกลา ว 114
บทที่ 3: การตัดสนิ ใจ และการประมวลผลแบบวน intro. to Java (FEU.faa) 16. จงเขียนโปรแกรมที่คาํ นวณหา ตวั หารรว มมาก (GCD – Greatest Common Divisor) ของ ตัวเลขสองตวั ทรี่ ับเขา มาจาก keyboard เชน gcd ของ 24 และ 15 คอื 3 Note: gcd ของ x และ y คอื integer ทีใ่ หญทสี่ ดุ ทห่ี าร x และ y ลงตวั 17. จงเขียนโปรแกรมทคี่ าํ นวณหา ตวั คูณรวมนอย (LCM – Least Common Multiple) ของตวั เลข สองตัวทร่ี บั เขามาจาก keyboard เชน lcm ของ 24 และ 15 คอื 120 Note: LCM ของ x และ y คือ integer ท่นี อ ยท่สี ดุ ที่ทง้ั x และ y หารลงตวั 18. จงเขยี นโปรแกรมที่หา factor ของตัวเลขท่รี บั เขามาจาก keyboard เชน ถา ขอมลู เทากบั 18 factor ทไ่ี ดคอื 2 3 และ (18 = 2 * 3 * 3) 19. จงเขียนโปรแกรมท่มี ี menu ให user ในการเลอื กการทํางานระหวางการหา LCM หรือการหา GCD การออกจากโปรแกรมจะถกู กาํ หนดโดย user 20. จงเขยี นโปรแกรมท่ีคาํ นวณหาผลลัพธของ series ทีใ่ หน ้ี 1/3 + 3/5 + 5/7 + 7/9 + 9/11 + … + 95/97 + 97/99 21. จงเขียนโปรแกรมทค่ี าํ นวณหาคาของ pi ดว ย series ท่ีใหน้ี pi = 4(1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + 1/13 - … - 1/(2i – 1) + 1/(2i +1)) 22. จงเขยี นโปรแกรมที่คาํ นวณหารคาของ e ดว ย series ทใ่ี หน้ี e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + … + 1/i! 115
เรม่ิ ตนการเขยี นโปรแกรมดวย Java intro. to Java (FEU.faa) 116
Search
Read the Text Version
- 1 - 42
Pages: