บทที่ 2 ขอมูล ตวั แปร และ การประมวลผล 46เรม่ิ ตนกับ Javaและ operator ! น้นั เม่อื ไปอยูหนา ตวั แปรหรอื ประโยคทม่ี คี า ทาง boolean คาใดคาหนึ่งกจ็ ะเปล่ยี นคานน้ัใหเ ปน ตรงกันขา มทนั ทีOperator ตัวอนื่ ๆ ทีใ่ ชกับตวั แปรหรือประโยคที่มคี า เปน boolean มดี งั น้ี< ใชในการเปรียบเทียบวา คา ทางดา นซา ยของเคร่อื งหมาย นอ ยกวา คาทางดา นขวาหรือไม> ใชในการเปรยี บเทยี บวา คาทางดา นซา ยของเครือ่ งหมาย มากกวา คาทางดา นขวาหรอื ไม<= ใชในการเปรียบเทียบวา คาทางดานซายของเคร่ืองหมาย นอ ยกวา หรอื เทา กบั คาทางดา นขวา หรือไม>= ใชใ นการเปรยี บเทยี บวา คาทางดานซายของเคร่อื งหมาย มากกวา หรือเทา กับ คาทางดานขวา หรอื ไม== ใชใ นการเปรียบเทยี บวา คาทางดานซายของเครื่องหมาย เทากับ คาทางดานขวาหรอื ไม!= ใชในการเปรียบเทยี บวา คาทางดานซายของเครื่องหมาย ไมเทา กับ คา ทางดานขวาหรือไมเราเรียก operator เหลา นีว้ า Relational operator ซงึ่ เอาไวใชใ นการตรวจสอบความสมั พันธของตวั แปรหรอื ประโยควา มคี า แตกตางกนั อยางไรเมื่อนํามาเปรียบเทียบกนัเราจะลองเขียนโปรแกรมตรวจสอบ operator ตาง ๆ เหลา นด้ี ู/* BooleanOp.java - Testing boolean operations */class BooleanOp { public static void main(String[] args) { boolean A = true, B = false; System.out.println(\"Conditional AND\"); System.out.println(\"F && F is \" + (B && B)); System.out.println(\"F && T is \" + (B && A)); System.out.println(\"T && F is \" + (A && B)); System.out.println(\"T && T is \" + (A && A)); System.out.println(\"Conditional OR\"); System.out.println(\"F || F is \" + (B || B)); System.out.println(\"F || T is \" + (B || A)); System.out.println(\"T || F is \" + (A || B)); System.out.println(\"T || T is \" + (A || A)); System.out.println(\"Logical AND\"); System.out.println(\"F & F is \" + (B & B)); System.out.println(\"F & T is \" + (B & A)); System.out.println(\"T & F is \" + (A & B)); System.out.println(\"T & T is \" + (A & A)); System.out.println(\"Logical OR\"); System.out.println(\"F | F is \" + (B | B)); System.out.println(\"F | T is \" + (B | A)); System.out.println(\"T | F is \" + (A | B)); System.out.println(\"T | T is \" + (A | A)); System.out.println(\"Logical NOT\"); System.out.println(\"!F is \" + (!B)); System.out.println(\"!T is \" + (!A)); }}โปรแกรมประกาศตัวแปรสองตวั A และ B ดว ยคา true และ false ตามลําดับ และทาํ การแสดงผลลพั ธของการประมวลผลดว ย operator ผานทาง System.out.println() ผลลัพธท แ่ี สดงออกทางหนาจอ คอื ภาควิชาคอมพิวเตอรธุรกิจ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 2 ขอ มลู ตวั แปร และ การประมวลผล 47เร่มิ ตน กับ JavaConditional ANDF && F is falseF && T is falseT && F is falseT && T is trueConditional ORF || F is falseF || T is trueT || F is trueT || T is trueLogical ANDF & F is falseF & T is falseT & F is falseT & T is trueLogical ORF | F is falseF | T is trueT | F is trueT | T is trueLogical NOT!F is true!T is falseทีนล้ี องมาดูโปรแกรมการใช Relational operator/* BooleanOp2.java - Using relational operators */class BooleanOp2 { public static void main(String[] args) { int i = 5, j = 10; System.out.println(\"i = \" + i); System.out.println(\"j = \" + j); System.out.println(\"i > j is \" + (i > j)); System.out.println(\"i < j is \" + (i < j)); System.out.println(\"i >= j is \" + (i >= j)); System.out.println(\"i <= j is \" + (i <= j)); System.out.println(\"i == j is \" + (i == j)); System.out.println(\"i != j is \" + (i != j)); System.out.println(\"(i < 10) && (j < 10) is \" + ((i < 10) && (j < 10))); System.out.println(\"(i < 10) || (j < 10) is \" + ((i < 10) || (j < 10))); }}โปรแกรม BooleanOp2.java ทาํ การหาคา ของประโยคตา ง ๆ ในรปู แบบงา ย ๆ เพ่อื ใหผ อู า นไดเห็นถงึผลลพั ธของการใช operator ตาง ๆ ไดอยางชดั เจน เราประกาศตัวแปรท่ีเปน int สองตัว คอื i และ j ซ่ึงกําหนดใหม ีคาเปน 5 และ 10 ตามลําดบั หลงั จากนนั้ โปรแกรมกใ็ ช operator ตาง ๆ กบั ตัวแปรสองตวั น้ีและเม่อื run โปรแกรมนแ้ี ลวผลลพั ธท ี่ได คอื ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลัยฟารอสี เทอรน
บทที่ 2 ขอมูล ตวั แปร และ การประมวลผล 48เร่ิมตน กับ Javai=5j = 10i > j is falsei < j is truei >= j is falsei <= j is truei == j is falsei != j is true(i < 10) && (j < 10) is false(i < 10) || (j < 10) is trueเพ่ือใหเ หน็ ภาพของการประมวลของ operator && และ operator || ไดชดั เจนยิ่งข้นึ ผอู า นควรตรวจสอบจากแผนภาพของการประมวลผลนี้ โดยเราไดกาํ หนดใหต วั แปร p และ q มีคาเปน 5 และ 10ตามลาํ ดับในการประมวลผลทางดานซาย และใหม คี า เปน 10 และ 5 ในการประมวลผลทางดานขวา(p < q) p = 5, q = 10 (p < q) p = 10, q = 5 && (q <= 10) && (q <= 10)TT F ไมตองประมวลตอ เพราะ 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 ขอ มลู ตัวแปร และ การประมวลผล 49เริม่ ตนกับ Javaตาราง 2.8 การใช operator && || & และ |P Q P && Q P || Q P&Q P|Q true truetrue true true true false true false truefalse true false true false falsetrue false false truefalse false false falseเราคงมองไมเห็นถงึ ประโยชนของการใชตวั แปรที่เปน boolean และการใช operator ตา ง ๆ ทไี่ ดพ ดู ถึงในตอนนอี้ ยางมากมายนกั การประมวลผลของตวั แปรทเี่ ปน boolean สวนใหญจ ะเอาไวช ว ยการตรวจสอบถงึ เหตกุ ารณ (condition) ตา ง ๆ ที่อาจเกดิ ขึ้นในโปรแกรม เชน ถา ประโยคท่หี นง่ึ เม่อื นาํ มาประมวลผลกับ ประโยคทส่ี องแลว ผลลพั ธท ี่ไดเ ปน true หรือ false ซง่ึ ถา เปน true เราจะทําการอยา งอ่นื และกจ็ ะทาํ การอ่ืนหากเปน false เปนตน เราจะพูดถึง boolean operator ตา ง ๆ เมื่อเราพูดถงึ เร่อื งของ logicและเร่อื งของการประมวลผลในรปู แบบของการวนซ้าํ (logic and loop)การประมวลผลในระดบั bit ดว ยการใช operator Shift และ Bitwiseในการทํางานในระดบั bit น้นั มี operator ไมกตี่ วั ท่เี ราสามารถเรยี กใชได ซงึ่ การใชงานโดยทั่วไปก็ไมงา ยนัก เพราะตองทาํ ในระดับ 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 >> 113 = 000011012 เมื่อ shift ไปทางขวา 1 bit ผลลัพธท ไี่ ดค ือ 000001102 (เทา กับ 6 ในเลขฐาน 10)13 << 1shift ไปทางซา ย 1 bit ผลลพั ธท ีไ่ ดค อื 000110102 (เทา กบั 26 ในเลขฐาน 10)13 >>> 1shift ไปทางขวา 1 bit ผลลัพธท ี่ไดค อื 000001102 (เทากับ 6 ในเลขฐาน 10)การโยก bit ไปทางซายครั้งละหนึง่ bit น้นั ทีจ่ ริงแลว กค็ ือการคูณดว ยสอง เรามาดตู วั อยางโปรแกรมการโยก bit ไปทางซา ยกัน จากโปรแกรม ShiftLeftOp.java ท่ีเห็นดานลา งนี้/* ShiftLeftOp.java - Using shift operators */class ShiftLeftOp { public static void main(String[] args) { byte bits = 1; System.out.println(\"Value of bits is \" + bits); bits = (byte) (bits << 1); System.out.println(\"Value of bits is \" + bits); bits = (byte) (bits << 1); ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 2 ขอมูล ตวั แปร และ การประมวลผล 50เร่ิมตนกับ Java System.out.println(\"Value of bits is \" + bits); bits = (byte) (bits << 1); System.out.println(\"Value of bits is \" + bits); bits = (byte) (bits << 1); System.out.println(\"Value of bits is \" + bits); bits = (byte) (bits << 1); System.out.println(\"Value of bits is \" + bits); }}เราเริ่มดว ยการกาํ หนดใหต วั แปร bits มีชนดิ เปน byte และมคี าเทา กับหนง่ึ โปรแกรมทาํ การโยก bit ไปทางซายจาํ นวนเทากับหา คร้งั ซงึ่ ในการโยกแตล ะคร้งั เราก็จะไดคา ใหมท ม่ี ีคา เทา กบั คาเดิมคณู ดว ยสองดังท่ีเหน็ จากผลลพั ธข องการ run โปรแกรมน้ีValue of bits is 1Value of bits is 2Value of bits is 4Value of bits is 8Value of bits is 16Value of bits is 32เราเลือกใชข อมลู ชนิดทเ่ี ปน byte ก็เพ่ือใหเ ห็นวาถาเราโยก bit อกี คร้งั ดว ยจํานวน bit ทต่ี อ งการโยกเทากบั สอง bit (ครั้งที่หก) เราจะไดค าทตี่ ัวแปร bits ไมส ามารถเก็บได ลองดู code ท่ีเพิ่ม และ ผลลพั ธของการ runbits = (byte) (bits << 2);System.out.println(\"Value of bits is \" + bits);ผลลัพธเมื่อ run อกี คร้งั ดวย code ท่ีเพม่ิ ขึ้นจะเห็นวา คา ของ bits ท่ไี ดมีคา เปน -128 ซง่ึ เปนคาท่ี Javaเปน ผกู าํ หนดให แตไ มใ ชคา ทีถ่ ูกตอ ง เพราะขอ มูลที่เปน byte น้นั เกบ็ คาสงู สดุ ท่ีเปนบวกไดเพียงแค 127เทาน้ันValue of bits is 1Value of bits is 2Value of bits is 4Value of bits is 8Value of bits is 16Value of bits is 32Value of bits is -128ส่งิ สาํ คญั อีกส่ิงหนึง่ ก็คอื การ cast เราจําเปน ตอ งเปลยี่ นขอมลู ใหถ กู ตอ งตามชนิดของตวั แปร เนอ่ื งจากวาJava ไดท าํ การเปล่ยี นตวั แปร bits ของเราใหเ ปน int กอ นที่จะทาํ การ shift ดงั นน้ั เราตอ งเปลยี่ นขอ มูลใหกลบั มาเปน ชนดิ เดมิ กอ นการจดั เกบ็ (หลงั จากการ shift สน้ิ สุดลง)เราไดพดู ถงึ การประกาศตัวแปร การกําหนดคา ใหก บั ตัวแปรทีอ่ ยูภ ายในตัวโปรแกรม ดวยขอ มูลท้ังท่มี ีชนิดเปน integer และ floating-point ซึ่งการกําหนดคาใหกบั ตัวแปรภายในโปรแกรมนน้ั ไมม ีความยืดหยนุของขอ มลู ทถี่ ูกเก็บอยูในตวั แปรน้นั หากผูใช หรือ ผเู ขยี นโปรแกรมตอ งการทจ่ี ะเปลย่ี นคา ทต่ี วั แปรน้ันเกบ็อยู ผเู ขยี นจะตอ งเปนผูแ กไ ขแตเ พยี งฝายเดยี ว ผใู ชโ ปรแกรมไมสามารถทจี่ ะเปล่ียนคา เหลาน้นั ได ดังนั้นการเขียนโปรแกรม จะตองใหโ อกาสผใู ชโปรแกรมในการเปลีย่ นแปลงคา เหลานั้น Java มี method อยูหลายตัวทีร่ องรบั การใสข อมลู ผานทาง keyboard เราจะมาทาํ ความรจู กั และเขาใจถงึ วธิ กี าร ซึ่งคอ นขา งจะซับซอ นพอสมควรสาํ หรับผเู ร่มิ หัดเขียนโปรแกรมใหม อยา งไรก็ตามหลงั จากท่ีไดท าํ ความเขาใจแลว ก็จะเห็นวาการรบั คา ตาง ๆ ผา นทาง keyboard นัน้ เปนเร่ืองท่ี (จริง ๆ แลว) ไมย ุง ยากเลย ภาควิชาคอมพิวเตอรธรุ กจิ วทิ ยาลัยฟารอสี เทอรน
บทที่ 2 ขอมูล ตวั แปร และ การประมวลผล 51เร่มิ ตน กบั Javaการกาํ หนดคา ใหก บั ตวั แปรผา นทางสอื่ การนาํ เขา ขอมลู มาตรฐานJava ไมม ี method ใด ๆ ทร่ี บั คาขอมูลตามชนิดนน้ั ๆ ของขอมูลที่เขา มาเลย เชน ถา ผใู ชโ ปรแกรมตอ งการทจี่ ะใสค าท่เี ปน int float double หรือ char ผเู ขยี นโปรแกรมก็ไมส ามารถทจ่ี ะรบั คา ตา ง ๆเหลา นไ้ี ดโ ดยตรง เหมอื นกบั การเขียนโปรแกรมดว ยภาษาอ่ืน ๆ เชน C หรือ C++ แตต ัวผเู ขยี นเองจะตอ งเขยี น code ขึ้นมารองรับคาเหลา นผี้ า นทางการอานเขา แบบทีเ่ รียกวา การรบั ขอมูลท่ีเปน String ซ่งึ เมอื่อาน String ไดแ ลวก็ตอ งแปลง String ใหเปนชนิดของขอ มลู ทผ่ี ูเขียนโปรแกรมตอ งการใหเ ปนผูอานอาจสงสยั วา String คืออะไร ในท่นี จี้ ะอธบิ ายอยา งครา ว ๆ เนือ่ งจากวา เราจะพดู ถงึ String ในบทอื่นตอ ไป ใน Java นั้น String เปน object (อกี แลว object? เชน เดยี วกนั เราจะพดู ถึง object อยา งละเอียดในบทอ่ืน) ซงึ่ สามารถเกบ็ ตวั อกั ษรไดคราวละมาก ๆ ขอยกตวั อยางงาย ๆ ใหด กู แ็ ลวกันPeople of Thailandสวสั ดีprice_of_coffee123456789023+popOfRockตวั อยา งท่ีเหน็ ดา นบนนี้ลว นแลว แตเ ปน String ทัง้ น้ัน ทีน้เี รามาลองดวู ธิ กี ารอา น String เขามาจากkeyboard แลวกเ็ ปลยี่ น String ใหเ ปน ขอ มูลชนิดตา ง ๆ ทเ่ี ราตองการ เรม่ิ ดว ยการเปลยี่ นแปลง codeของโปรแกรม Radius.java ใหร ับคา ของ area จาก keyboard แทนการกาํ หนดภายในโปรแกรม/* Radius2.java - Reading data from keyboard */import java.io.*;class Radius2 { public static void main(String[] args) throws IOException { double radius, area; int meters, centimeters; //prompt user for area of a circle System.out.print(\"Please enter area of a circle: \"); //get string from keyboard InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in); String inputString = buffer.readLine(); //convert string to double area = Double.parseDouble(inputString); //calculate radius radius = Math.sqrt(area / Math.PI); //convert to meters and centimeters meters = (int)Math.floor(radius); centimeters = (int)Math.round(100.0 * (radius - meters)); System.out.print(\"Circle with area of \" + area + \" square meters \"); System.out.print(\"has a radius of \" + meters + \" meters and \"); System.out.println(centimeters + \" centimeters\"); }}โปรแกรม Raadius2.java เพม่ิ code ใหอา น String จาก keyboard ดวยประโยคSystem.out.print(\"Please enter area of a circle: \"); ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 2 ขอ มูล ตวั แปร และ การประมวลผล 52เร่มิ ตนกับ JavaInputStreamReader 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 ใหเ ปน ขอมูลชนดิ ทีเ่ ราตองการใชใ นโปรแกรมซ่งึ โปรแกรม Radius.java ของเราตอ งการใชข อ มูลชนดิ ที่เปน double เราจงึ ตองทําการเปลย่ี น String นี้ใหเปน double ดวยการเรียกใช method parseDouble() จาก class Double พรอ มท้งั สง ตวั แปรทเ่ี ก็บขอ มูลจาก keyboard ไปใหแก method นีด้ วยarea = Double.parseDouble(inputString);หลังจากน้ัน code ของโปรแกรมทเ่ี หลือก็เหมือนกบั ทเ่ี ราไดเ ขียนกอ นหนานี้ และเมื่อ run โปรแกรมดูสองคร้งั ดว ยคา 850 ในครัง้ แรกและคา 54 ในคร้งั ทส่ี อง เรากไ็ ดผ ลลัพธ ดงั ทีแ่ สดงใหเ หน็ นี้Please enter area of a circle: 850Circle with area of 850.0 square meters has a radius of 16 meters and45 centimetersPlease enter area of a circle: 54Circle with area of 54.0 square meters has a radius of 4 meters and15 centimetersถาสังเกตใหด จี ะเหน็ วา โปรแกรม Radius2.java น้นั มขี อ ความเพมิ่ ตอทายของ main(..) คือthrows IOExceptionเหตผุ ลทเ่ี ราตองเพิ่ม throws IOException ใหกบั main(…) ก็เพราะวา การอานขอมลู เขาสูโปรแกรมน้นับางคร้งั กอ็ าจเจอกบั ปญ หาในการอาน เชน อา นไมได และเหตผุ ลอีกอนั หนง่ึ คอื Java บงั คบั ใหเราตองตรวจสอบการทํางานกับ I/O เอง ซ่งึ ถา หากมปี ญหาเกิดขน้ึ เราจะไดแกไขไดถูกตอ ง มีวธิ กี ารตรวจสอบและปองกันไมใ หก ารอา นมปี ญ หาหลากหลาย ซงึ่ เราจะไดด กู นั ในโอกาสตอไป (บทท่ี 7) ลองมาดวู า ถาเราไมใ สขอ ความที่วาลงไปในโปรแกรม Radius2.java เราจะได error อะไรRadius2.java:16: unreported exception java.io.IOException; must becaught 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 ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอีสเทอรน
บทที่ 2 ขอมูล ตวั แปร และ การประมวลผล 53เริ่มตน กบั Javaตอไปจะไดแสดงการใชว ิธที ่หี น่งึ ซ่งึ เปน การตรวจจับ error ในการอา นขอมลู แตจ ะพดู เพียงเพ่ือใหการอา นขอ มูลทาํ ไดสมบรูณเ ทา นน้ั คงจะไมก ลา วถึงอยา งละเอยี ดมากมายนัก เรามาเริม่ ตน ดวยการเขยี นcode เพิม่ ข้ึนใหม ดงั ทแี่ สดงใหเ หน็ น้ี/* Radius2.java - Reading data from keyboard */import java.io.*;class Radius2 { public static void main(String[] args) throws IOException { double radius, area; int meters, centimeters; String inputString = null; try { //prompt user for area of a circle System.out.print(\"Please enter area of a circle: \"); //get string from keyboard InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in); inputString = buffer.readLine(); } catch(IOException ioe) {} //convert string to double area = Double.parseDouble(inputString); //calculate radius radius = Math.sqrt(area / Math.PI); //convert to meters and centimeters meters = (int)Math.floor(radius); centimeters = (int)Math.round(100.0 * (radius - meters)); System.out.print(\"Circle with area of \" + area + \" square meters \"); System.out.print(\"has a radius of \" + meters + \" meters and \"); System.out.println(centimeters + \" centimeters\"); }}ส่ิงทเ่ี ราไดป รับปรงุ คือประโยค ตอ ไปน้ีString inputString = null;//prompt user for area of a circleSystem.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 { … ภาควิชาคอมพิวเตอรธ ุรกจิ วิทยาลยั ฟารอสี เทอรน
บทท่ี 2 ขอมูล ตวั แปร และ การประมวลผล 54เรม่ิ ตนกับ Java … …}catch(IOException ioe) {}เขา สโู ปรแกรมดวยการนาํ เอาประโยคการอานขอ มูลเขาสู string ท้ังสามประโยคไวใน block ของ try {}สว นคาํ วา catch(IOException ioe) {} นัน้ เราก็เพิม่ เขาหลังจาก block ของ try {} เราไมจ าํ เปน ตองใสcode อะไรเขา ไปใน code ของ catch(IOExcpetion ioe) {} เพราะเราเพียงแตตองการใหการอานเปน ไปไดดว ยดเี ทา นัน้ เรายังจะไมก ังวลถงึ error ที่เกดิ ข้นึ ซงึ่ ถา มี error เกิดข้ึน Java ก็จะเปน ผฟู อ งใหเราทันทีเพ่อื ใหเกดิ ความเขา ใจอกี สกั หนอย เราจะมาตรวจสอบการใสข อ มูลของผใู ชด ูวา ไดม กี ารใสข อ มลู เขา สูโปรแกรม หรือเพยี งแตก ดปุม Enter เฉย ๆ เราทําการตรวจสอบดวยการเพิ่ม try {..} และ catch() {}ใหก ับโปรแกรม Radius2.java ดังนี้/* Radius2.java - Reading data from keyboard */import java.io.*;class Radius2 { public static void main(String[] args) { double radius, area; int meters, centimeters; String inputString = null; //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(); try { //convert string to double area = Double.parseDouble(inputString); //calculate radius radius = Math.sqrt(area / Math.PI); //convert to meters and centimeters meters = (int)Math.floor(radius); centimeters = (int)Math.round(100.0 * (radius - meters)); System.out.print(\"Circle with area of \" + area + \" square meters \"); System.out.print(\"has a radius of \" + meters + \" meters and \"); System.out.println(centimeters + \" centimeters\"); } //catch empty string (user hits Enter) catch(Exception e) { System.out.println(\"Error! you must supply input\"); e.printStackTrace(); System.exit(1); } } //catch other I/O error - do nothing catch(IOException ioe) { /* leave it to Java! */ } } ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลัยฟารอสี เทอรน
บทท่ี 2 ขอ มูล ตัวแปร และ การประมวลผล 55เริ่มตน กับ Java}โปรแกรม Radius2.java ทีเ่ ราเขียนข้ึนใหมม ี try {…} และ cath() {} อยูสองตัว ตัวแรกใชตรวจสอบเรื่องของการอานท่วั ไปทไี่ ดก ลา วไปแลว สว นตวั ทสี่ องเปน การตรวจสอบวาผูใชม ีการใสข อมลู หรือไม ซึง่ถาไมใ ส เราก็จะ1. สง ขอความไปยังหนา จอดวยคาํ สง่ั System.out.println(\"Error! you must supply input\");2. สง ขอ ความ error ที่ Java ไดฟ อ งไว ดว ยคาํ สง่ั e.printStackTrace();3. ออกจากโปรแกรมโดยไมมีการประมวลผลใด ๆ ท้ังส้นิ ดว ยคําสง่ั System.exit(1);และเม่อื execute ดเู รากจ็ ะไดข อความดังน้ีPlease enter area of a circle: < ผใู ชก ดปมุ Enter >Error! you must supply inputjava.lang.NumberFormatException: empty String atjava.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:986) at java.lang.Double.parseDouble(Double.java:202) at Radius2.main(Radius2.java:22)โดยทั่วไปการออกจากโปรแกรมทไี่ มมีปญหาใด ๆ ในการเขยี นดว ยภาษา Java นั้นเราจะใชก ารออกดวยเลข 1 ในประโยค System.exit(1) หรอื เลขอน่ื ๆ ที่ไมใช 0 สวนการออกแบบปกตนิ น้ั เราใชเ ลข 0 แทนเลข 1เราคงจะพักการตรวจสอบ หรอื ตรวจจบั error ไวเ พยี งแคน ก้ี อนเราจะกลบั มาพูดถงึ การเขียน codeรองรบั error ในบทอนื่ ตอไปสรปุเราไดเ รยี นรูถ ึงขอมลู ชนิดตา ง ๆ ท่เี ปน ขอ มูลแบบพนื้ ฐาน หรือทเ่ี รยี กวา primitive datatype ท่ี Java มีให รวมไปถึงการประกาศตวั แปร การกาํ หนดคา ใหกับตัวแปร การประมวลตวั แปรชนดิ เดยี วกัน และ ตางชนิดกนั การเปลย่ี นชนดิ ของขอ มูล (casting) การใช method ทีเ่ ก่ียวของกับตัวเลข การแสดงผลตัวเลขทีม่ ีจดุ ทศนยิ ม การอา นขอมูลเขา สโู ปรแกรม และการตรวจสอบ และตรวจจบั error ทีอ่ าจเกดิ ขึน้ ในการอานขอ มูลแบบฝก หดั1. จงอธิบายถึงความหมายของคาํ วา final พรอมท้ังยกตวั อยางประกอบ2. จงอธบิ ายถึงความแตกตา งระหวาง 5, 5.0, '5', \"5\", และ \"5.0\"3. จงหาผลลพั ธของการประมวลผลประโยคตอไปน้ี ถา กําหนดให double x = 4.5; double y = -45.25; int p = 12; int q = 2; 3.1. x + p * y / (p – y) * x 3.2. p % (p – q) 3.3. (int) y 3.4. (int) p 3.5. Math.round(x) 3.6. (int) Math.round(y) ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลัยฟารอ สี เทอรน
บทท่ี 2 ขอ มลู ตวั แปร และ การประมวลผล 56เริ่มตนกับ Java3.7. -2 * y + (int) x3.8. q/p3.9. p%q3.10. y * y – y + (x * (int) x)4. จงเขยี นโปรแกรมทรี่ ับตวั เลขชนดิ int จาก keyboard จาํ นวน 2 ตัว และขอมลู ชนิด double อีก 2 ตัว หลังจากนั้นใหโ ปรแกรมคํานวณหาผลรวมของเลขทง้ั 4 ตวั ใหเ กบ็ ผลลัพธท ่ีหาไดไวใ นตวั แปรตวั ใหม สง ผลลพั ธทไ่ี ดไ ปยงั หนา จอ5. จงเขียนประโยคดว ยภาษา Java จากสมการท่ีใหนี้5.1. a + bc / 25.2. a(a – c) + b(b – c) – (c(c – a) / d)5.3. b2 – 4ac5.4. (4/3)2 / 25.5. q = T1 xM + T2 D−k 6. จงเขียนโปรแกรมทท่ี าํ การเปลยี่ น องศา Celsius ใหเ ปนองศา Fahrenheit โดยกาํ หนดใหข อ มลู ท่ี ตองการเปลยี่ น นําเขาจาก keyboard โดยกําหนดใหส ตู รการเปลี่ยน คือCelsius = 5 (Fahrenheit – 32) 97. จงเขียนโปรแกรมทท่ี ําการเปลย่ี น องศา Fahrenheit ใหเปนองศา Celsius โดยกาํ หนดใหข อ มลู ท่ี ตองการเปลยี่ น นําเขาจาก keyboard8. จงเขียนโปรแกรมทร่ี ับขอ มลู ทเ่ี ปน จํานวนกิโลกรัมจาก keyboard เปลี่ยนใหเ ปน mile สง ผลลัพธไป ยงั หนาจอ9. จงเขียนโปรแกรมทีอ่ านขอมูลจาก keyboard ท่เี ปนอายขุ องผใู ชใ นรูปแบบของป ใหโปรแกรม เปลีย่ นเปนจาํ นวนวนั สงผลลพั ธอ อกทางหนา จอ (กําหนดให 1 ปเ ทา กบั 365 วัน)10. จงเขียนโปรแกรมทร่ี บั int จาํ นวน 5 ตวั หาคา เฉลยี่ ของตวั เลขเหลา นี้ เสรจ็ แลวสงผลลพั ธไ ปยงั หนาจอ11. จงเขยี นโปรแกรมทคี่ าํ นวณหาเวลาท่ีแสงเดินทางจากโลกไปยังดวงอาทติ ย ใหส ง ผลลพั ธของการ คํานวณในรปู แบบของนาที สง ผลลพั ธท หี่ าไดไ ปยงั หนา จอ12. สมมตวิ า อาจารยท ุกคนในวทิ ยาลยั แหง หน่งึ ดม่ื beer 1 ขวดตอ วนั และในการทาํ beer 1 ลัง (24 ขวด) น้นั ตองใชข า ว barley จํานวน 1 ถงั ถา จํานวนของอาจารยใ นวทิ ยาลยั ทวี่ าน้มี ที ง้ั สิน้ 200 คน จงเขียนโปรแกรมในการคํานวณหาจาํ นวนของขาว barley ที่ตอ งใชในการทาํ beer ใหเ พียงพอตอ การบริโภคของอาจารยใ นวทิ ยาลยั น้ีตลอดภาคการศึกษา13. จงเขียนโปรแกรมทรี่ ับขอ มูลชนิด long ท่มี จี าํ นวนของตวั เลข (digit) อยูร ะหวาง 10 – 12 ตวั ใหส ง ผลลัพธใ นรูปแบบของ ตวั เลขทใ่ี ชเ ครอื่ งหมาย , เปน ตัวแบงกลุม โดยเร่มิ ตน จากทางขวามอื และให มีตัวเลขกลมุ ละ 3 ตัวไปยงั หนา จอ14. จงเขยี นโปรแกรมทร่ี บั คา ความยาวของดา นทกุ ดา นของสามเหล่ียม จากน้ันใหค ํานวณหาคา ของเสน รอบรปู (perimeter) สงผลลพั ธไปยงั หนา จอ15. จงเขยี นโปรแกรมทค่ี าํ นวณหาพืน้ ทข่ี องวงกลม จากรัศมที ร่ี ับเขามาจาก keyboard ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอ สี เทอรน
บทที่ 2 ขอ มลู ตัวแปร และ การประมวลผล 57เร่มิ ตน กบั Java16. จงเขียนโปรแกรมทร่ี บั ขอ มูลชนดิ double จาํ นวน 5 ตัวจาก keyboard จากนั้นใหค ํานวณหา คา เฉลย่ี ของตวั เลขเหลา นน้ั สงผลลพั ธท ห่ี าไดไปยังหนาจอ17. กาํ หนดใหเสน ผา ศนู ยกลางของดวงอาทติ ยเทากับ 865,000 ไมล และเสน ผา ศูนยกลางของโลก เทา กบั 7,600 ไมล จงเขียนโปรแกรมที่คาํ นวณหา17.1. ปรมิ าตรของโลก (cubic mile หรือ mile3)17.2. ปรมิ าตาของดวงอาทิตย (cubic mile)17.3. อตั ราสวนของปริมาตรของดวงอาทิตยต อ ปรมิ าตรของโลก18. จงเขยี นโปรแกรมทรี่ ับขอ มลู ชนดิ double ท่อี ยใู นรูปแบบ 123.4567 จาก keyboard จากน้ันใหด งึ เอาสว นของขอ มลู ท่อี ยหู นาจดุ ทศนยิ มไปเกบ็ ไวในตัวแปรท่ีมชี นิดเปน long ตัวหนึง่ เสร็จแลวใหเ กบ็ ขอ มูลทีอ่ ยูหลังจดุ ทศนยิ มไปเก็บไวใ นตัวทเี่ ปน long อกี ตวั หนง่ึ สงผลลพั ธท ีอ่ ยูในตัวแปร long ทงั้ สองไปยังหนา จอ ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอ สี เทอรน
ในบททสี่ ามนีเ้ ราจะมาทาํ ความรจู กั กบั การทาํ งานในรปู แบบของการประมวลผลชุดคาํ สง่ั ซา้ํ ๆ กนั ตามเงอื่ นไขท่ีกาํ หนดให หรือทีเ่ รยี กวา การประมวลผลแบบวน (repetition หรอื loop) การใชช ุดคาํ สั่งในการตัดสนิ ใจ และ การใชป ระโยคในการเปรียบเทียบขอ มูลตา ง ๆหลังจากจบบทเรยี นนี้แลว ผูอ านจะไดท ราบถงึ o การเปรียบเทยี บขอ มูล (comparison) o การกาํ หนดประโยคในการเปรยี บเทียบ (logical expression) o การเปล่ยี นแปลงข้นั ตอนการประมวลผลในแบบตา ง ๆ (control statement) o การทาํ งานแบบวน (loop) for loop while loop do … while loop o การยุตกิ ารทาํ งานของ loop ดว ยการใชค าํ สง่ั break และ continueหลาย ๆ คร้งั การเขยี นโปรแกรมตองมีการเลือกทีจ่ ะประมวลผล ไมว าจะเปน การเลือกตามขอมลู ท่ีนาํ เขาหรือ การเลอื กประมวลผลตามข้นั ตอน กระบวนการทไ่ี ดก าํ หนดไว เชน ถา ขอ มลู นาํ เขา มคี านอยกวา ศนู ยเราจะยตุ ิการทาํ งานของโปรแกรม ถามากกวา เราจะมวลผลตอ ไป อะไรทาํ นองนี้ ในการตดั สินใจท่ีจะใหcode ทาํ อยา งใด อยา งหนง่ึ นน้ั เราจะตองรูจกั วิธีการสรางประโยคทใ่ี ชใ นการเปรยี บเทียบ ข้ันตอนของการใชป ระโยคเปรียบเทยี บในรปู แบบตาง ๆการตดั สนิ ใจ และ การเปรียบเทียบการตดั สินใจเปน สวนประกอบทสี่ าํ คญั มาก ๆ สว นหนง่ึ ของการเขยี นโปรแกรม โปรแกรมของเราตองมีความสามารถในการตดั สินใจเลือกวา จะทาํ อะไรตอ ไป เชน ถา จาํ นวนของนกั ศึกษาทม่ี าสมคั รเรยี นในภาควชิ าคอมพวิ เตอรธ ุรกจิ มมี ากกวา หา รอย เราจะมกี ารสอบคัดเลือก หรือ เชน ถาเงนิ เดอื นเพ่ิมขนึ้ ฉันจะซือ้ บาน อะไรทาํ นองนี้ ซ่ึงในดา นของการเขยี น code นั้น การตดั สนิ ใจจะทาํ ไดโ ปรแกรมก็ตอ งมีความสามารถทจี่ ะเปรียบเทียบไดก อ น เชน เปรยี บเทยี บถึงความมากกวา นอ ยกวา หรือ เปรยี บเทยี บถึงความเทา กนั และความไมเทากนัในบททส่ี องเราไดพ ดู ถงึ relational operator เพียงเล็กนอยในเร่ืองของการทาํ งานกบั ตวั แปรท่ีมชี นดิ เปนboolean และ operator ที่วา น้กี ็คือ < <= > >= == และ != เราจะมาดถู ึงการใช operator เหลา น้ใี นประโยคทมี่ ีการเลอื กประมวลผลตามผลลัพธของการเปรียบเทียบน้นั ๆประโยคท่ใี ช ifif เปนคําสงั่ ทเ่ี รานํามาใชใ นการเลอื กวาเราจะประมวลผลอะไรตามผลลัพธทเี่ กิดข้นึ if มรี ูปแบบดังน้ี คือif(expression) statement;โดยมขี อกําหนดวา expression จะตอ งเปนประโยคท่เี มื่อมีการประมวลผลแลวจะไดค า ท่ีเปน boolean ซง่ึเปน ไปไดเพียงแค true หรอื false เทานน้ั เชน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 59เริ่มตน กบั Javaif(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 ใสเ ขาสโู ปรแกรมเปน เลขคหู รอื ไม/* IfStatement.java - Using if statement to find out whether a number * is odd or even*/import java.io.*;import java.lang.Integer;class IfStatement { public static void main(String[] args) throws IOException { ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลัยฟารอีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 60เรม่ิ ตน กับ Java int number; //set up buffer stream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(isr); //get input string System.out.print(\"Enter a number (int): \"); String input = buffer.readLine(); //convert string to int number = Integer.parseInt(input); //check if number is even or not if(number % 2 == 0) System.out.println(number + \" is an even number.\"); }}โปรแกรม IfStatement.java บอก user ใหใสต วั เลขหน่งึ ตวั ซง่ึ โปรแกรมไดจัดเก็บไวในตัวแปรชอื่number หลงั จากนั้นก็ทําการตรวจสอบวาตวั เลขท่อี านมาเปน เลขคูหรอื ไมด ว ยประโยคif(number % 2 == 0) System.out.println(number + \" is an even number.\");ซงึ่ ถา นําสองไปหาร number แลวไมม ีเศษ (หารลงตวั ) แสดงวาตวั เลขท่ีวา น้เี ปน เลขคู ซงึ่ โปรแกรมก็จะแสดงขอ ความไปยังหนาจอบอกผูใชวา ตวั เลขทใ่ี สเ ขา มาเปน เลขคู ดงั เชน ผลลัพธของการ run น้ีEnter a number (int): 45Enter a number (int): 2020 is an even number.โปรแกรมของเรายงั ไมใ ชโ ปรแกรมทสี่ มบรูณ ดังจะเห็นไดจ ากผลลัพธท ีไ่ ด ถาเราใส 45 โปรแกรมกจ็ ะไมแสดงอะไรเลย จะแสดงกต็ อ เมอ่ื ตัวเลขท่ีใสเปน เลขคูเ ทา น้ัน เราจะกลับมาดวู าเราตองทาํ อยา งไร ถึงจะสามารถท่จี ะแสดงขอความไปยงั หนาจอโดยแบงแยกวาตัวเลขนน้ั เปน เลขคูหรอื เลขคี่การใช 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!\");} ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 61เร่ิมตนกับ Javaทนี เ้ี ราจะกลับไปยงั ประเดน็ ที่เราพดู ถงึ กอ นหนา น้ี เกีย่ วกบั เรือ่ งของการแสดงผลทง้ั ท่ีเปนจรงิ และไมเปนจริง ในการตรวจสอบดวยการใช if น้ันเราสามารถท่ีจะบังคับการประมวลผลใหเ กิดขน้ึ ทั้งท่ีเปน จรงิ และเปนเทจ็ อยา งใด อยางหนึง่ ดวยการใช else ตามหลงั ประโยคท่ีตาม if มาอกี ทีหน่งึรปู แบบโครงสรา งของประโยค if – else นีม้ ดี ังนี้if(expression) statement;else other_statement;another_statement;ภาพท่ี 3.2 แสดงถึงโครงสรา งของ if – else yes เปน จริง? no statement other_statement another_statementภาพที่ 3.2 การใช if - elseจากโปรแกรม IfStatement.java ถา เราตองการทจ่ี ะแสดงผลถา ตวั เลขท่ี user ใสเขา สูโปรแกรมเปนเลขคี่ เรากต็ อ งเปลย่ี น code ของเราใหเ ปนดังนี้/* IfElse.java - Using if - else statement to find out whether a * number is odd or even*/import java.io.*;import java.lang.Integer;class IfElse { public static void main(String[] args) throws IOException { int number; //set up buffer stream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(isr); //get input string System.out.print(\"Enter a number (int): \"); String input = buffer.readLine(); ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลัยฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 62เรม่ิ ตนกับ Java//convert string to intnumber = Integer.parseInt(input);//check if number is even or notif(number % 2 == 0) System.out.println(number + \" is an even number.\");else System.out.println(number + \" is an odd number.\"); System.out.println(\"Good Bye.\"); }}ประโยคทีเ่ ราไดเขียนเพิม่ เขาสูโ ปรแกรมของเรา คือelse System.out.println(number + \" is an odd number.\");System.out.println(\"Good Bye.\");ซ่งึ จะทาํ ใหโ ปรแกรมของเราทาํ การประมวลผลประโยคทอ่ี ยถู ัดมาจาก else ถา number % 2 == 0 เปนเทจ็ และตัวเลขที่จะทําใหป ระโยคนถี้ ูกประมวลผลกค็ ือ ตวั เลขท่ีเปนเลขค่ี (นาํ 2 ไปหารแลว เหลอื เศษ)ลองดูผลลัพธของการ run นี้Enter a number (int): 4545 is an odd number.Good Bye.Enter a number (int): 8080 is an even number.Good Bye.จะเหน็ วาการนาํ เอา if – else มาใชท าํ ใหโ ปรแกรมของเราสนองตอบความตอ งการในการแสดงผล เมอื่การตรวจสอบไดผลที่เปน จริงทางหนึง่ และเมือ่ ผลของการตรวจสอบเปนเทจ็ อีกทางหนง่ึเนอื่ งจาก 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) หรือ statement 3; if(expression 2) else { statement 3; statement 4; else { statement 5; statement 4; } statement 5; }จากโครงสรา งตัวอยา งดา นบนนป้ี ระโยคทจ่ี ะไดรบั การประมวลผลถา expression 1 เปนจริงคือstatement 1 และ statement 2 สว น statement 3 จะไดร บั การประมวลผล ถา expression 2 เปน จริงและ statement 4 และ statement 5 จะไดร บั การประมวลผลกต็ อเมื่อ expression 1 และ expression 2เปน เท็จ ภาควิชาคอมพิวเตอรธรุ กจิ วทิ ยาลัยฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 63เรมิ่ ตนกับ Javaลองมาดูโปรแกรมตวั อยา งการใช Nested – if ในโปรแกรม Grades.java/* Grades.java - Using Nested - if finding letter grade * from a given score*/import java.io.*;import java.lang.Integer;class Grades { public static void main(String[] args) throws IOException { int score; char grade; //set up buffer stream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(isr); //get input string System.out.print(\"Enter your score: \"); String input = buffer.readLine(); //convert string to int score = Integer.parseInt(input); //determine grade by given score if(score >= 90) grade = 'A'; else if(score >= 80) grade = 'B'; else if(score >= 70) grade = 'C'; else if(score >= 60) grade = 'D'; else grade = 'F'; System.out.println(\"Your grade is \" + grade); }}โปรแกรม Grades.java ใชเกณฑก ารใหเ กรดคอื ถา score มีคามากกวา หรือเทา กบั 90 ได Aมากกวา หรอื เทา กับ 80 ได B (อยูระหวา ง 80 ถงึ 89)มากกวา หรือเทา กบั 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 ดว ยขอมลู บางสว น ภาควิชาคอมพิวเตอรธ รุ กจิ วทิ ยาลัยฟารอ สี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 64เร่มิ ตนกบั JavaEnter your score: 87Your grade is BEnter your score: 45Your grade is FEnter your score: 92Your grade is Aเราสามารถทจ่ี ะเขียนโปรแกรม Grades.java ขึน้ ใหมดว ยการใช operator && หรือ || ชว ยในการตรวจสอบถงึ สถานะภาพของ score วา อยูใ นกลมุ ใด ลองมาดูกัน/* Grades2.java - Using Nested - if finding letter grade * from a given score*/import java.io.*;import java.lang.Integer;class Grades2 { public static void main(String[] args) throws IOException { int score; char grade; //set up buffer stream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(isr); //get input string System.out.print(\"Enter your score: \"); String input = buffer.readLine(); //convert string to int score = Integer.parseInt(input); //determine grade by given score if(score >= 90) grade = 'A'; else if(score >= 80 && score <= 89) grade = 'B'; else if(score >= 70 && score <= 79) grade = 'C'; else if(score >= 60 && score <= 69) grade = 'D'; else grade = 'F'; System.out.println(\"Your grade is \" + grade); }}เราเปล่ยี น code ในการตรวจสอบใหมใ หเปนif(score >= 90) grade = 'A';else if(score >= 80 && score <= 89) grade = 'B';else if(score >= 70 && score <= 79) ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลัยฟารอสี เทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 65เริม่ ตน กับ Java grade = 'C';else if(score >= 60 && score <= 69) grade = 'D';else grade = 'F';ซงึ่ เมื่อไดลอง run ดูแลวกไ็ ดผ ลลัพธเหมือนกนั กับท่ีไดจากโปรแกรม Grades.java แตขน้ั ตอนของการตรวจสอบไมเหมือนกนั เราไดพ ดู กอ นหนาน้วี า ถา มีการใช && และคาของประโยคท่อี ยูท างดา นหนา ของ&& มีคา เปนจรงิ ประโยคทีอ่ ยทู างดา นหลังกจ็ ะไดร บั การประมวลผลดว ย เชน สมมตวิ า score มีคาเปน85 การประมวลผลใน if แรกจะเปนเทจ็ Java ก็จะประมวลผล if ท่ีสอง คอื else if(score >= 80 &&score <= 89) ซึ่งท่ีนเ่ี องที่ Java จะประมวลผลประโยคทอ่ี ยูหลัง && ดว ยเพราะประโยคที่อยทู างดา นหนา คือ score >= 80 นนั้ เปนจรงิ กรณีอื่น ๆ ทีม่ ีลกั ษณะคลายกนั กจ็ ะถกู ประมวลผลในแบบเดียวกันนี้ซง่ึ เปนการประมวลผลทซ่ี าํ้ ซอ น ทั้ง ๆ ทไี่ มม คี วามจาํ เปน ที่ตอ งทําเลย แตน เี่ ปน เพยี งตวั อยา งเดียวเทา นั้นมีกรณอี กี หลายกรณที ่ี ตองใช && หรอื || เขา มาชว ยในการตรวจสอบจรงิ ๆ เชน ในกรณีของโปรแกรมตอไปน้ี ซึง่ เปน โปรแกรมตรวจสอบวา ตวั อกั ษรทีก่ ําหนดใหอ ยูในกลุมนน้ั ๆ หรือไม/* UpperLower.java - Using && in if - else statement */import java.io.*;class UpperLower { public static void main(String[] args) throws IOException { char ch = 'F'; if(ch >= 'A' && ch <= 'Z') System.out.println(ch + \" is an uppercase letter.\"); else if(ch >= 'a' && ch <= 'z') System.out.println(ch + \" is a lowercase letter.\"); }}โปรแกรมกาํ หนดใหต วั แปร ch มีคา เปน อกั ษร F ตัวใหญ และใชประโยค if – else ทําการตรวจสอบวาตวั อกั ษรทวี่ า นเ้ี ปน อักษรตัวใหญหรือตวั เล็ก ซ่งึ กแ็ นนอนวา ผลลัพธท ีไ่ ดจ ะตอ งเปนตวั ใหญ แตเ ราตองการทีจ่ ะแสดงใหเหน็ ถึงการใช && เขามาชวยในการตรวจสอบคา ของ ch ทเ่ี ราไดก ําหนดข้ึนในการเปรียบเทยี บนนั้ Java จะใชค า ASCII (Unicode) ในการเปรียบเทยี บตัวอกั ษรทั้งสองตวั โดยในตอนแรกจะเปรยี บเทียบ F กบั A (70 กบั 65) ซง่ึ ผลของการเปรยี บเทยี บเปนจรงิ จึงตอ งเปรียบเทยี บ Fกับ Z (70 กบั 90) ซึง่ กเ็ ปน จรงิ ดงั น้ันประโยคทตี่ ามมา System.out.println(ch + \" is an uppercaseletter.\"); จงึ ไดรบั การประมวลผล เชน เดยี วกนั กับตวั อกั ษรตวั เลก็ ถา ch เกบ็ อกั ษรท่ีเปนตัวเล็กอยูการเปรยี บเทยี บจะเกิดขึ้นในประโยค else – if ทต่ี ามมาโปรแกรมตอ ไปนี้แสดงการใช || ในการตรวจสอบวาเดอื นทก่ี าํ หนดใหอ ยูในฤดูอะไร/* Season.java - Using || in if - else statement */import java.io.*;import java.lang.Integer;class Season { public static void main(String[] args) throws IOException { int month; String season, input; InputStreamReader in; BufferedReader buffer; System.out.print(\"Enter month (1 – 12): \"); in = new InputStreamReader(System.in); ภาควิชาคอมพิวเตอรธ รุ กิจ วิทยาลยั ฟารอสี เทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 66เร่ิมตนกับ Java buffer = new BufferedReader(in); input = buffer.readLine(); month = Integer.parseInt(input); if(month == 3 || month == 4 || month == 5 || month == 6) season = \"Summer\"; else if(month == 7 || month == 8 || month == 9 || month == 10) season = \"Rainy\"; else if(month == 11 || month == 12 || month == 1 || month == 2) season = \"Winter\"; else season = \"Never heard of it!\"; System.out.println(month + \" is in \" + season); }}โปรแกรม Season.java ใช || ในการตรวจสอบวา month ท่ี user ใสเ ขา สูโปรแกรมนน้ั อยูใ นฤดอู ะไรโดยเรากําหนดใหเดอื น 3 – 6 เปนฤดรู อ น 7 – 10 เปน ฤดูฝน และ 11 – 2 เปน ฤดูหนาว (ซงึ่ เดยี วนช้ี ักจะไมแนนอนเสียแลว) ลองมาดผู ลลัพธจ ากการ run ดกี วาEnter month (1 – 12): 44 is in SummerEnter month (1 – 12): 88 is in RainyEnter month (1 – 12): 11 is in WinterEnter month (1 – 12): 2020 is in Never heard of it!Operator || นั้นเปน การเปรยี บเทยี บขอ มูลทอ่ี าจเปนไดหลาย ๆ อยา ง ดงั ทเี่ หน็ ในโปรแกรม ถาเราใหคาของ month เปน 3 4 5 หรือ 6 เรากก็ าํ หนดให season มคี า เปน Summer สว นเดือนอื่น ๆ กเ็ ชน เดยี วกันในทางตรงกนั ขา มถา เราใช && แทนโปรแกรมของเรากจ็ ะไมทาํ งานตามท่เี ราคาดหวงั ไว กลา วคอื คา ของmonth ไมสามารถเปนไปไดท ง้ั สคี่ า โปรแกรมกจ็ ะประมวลผลประโยคท่ีตาม else ตัวสดุ ทา ยตลอดไปผูอา นควรตรวจสอบวาทก่ี ลา วมาน้ี เปนจรงิ หรอื ไมในการใช Nested if – else นนั้ เราจะตอ งระวงั วา ทกุ ๆ if ท่ีเราใชจะตองมี else หรือไมเ พราะ Java จะตรวจสอบวา else ท่ใี ชน ้นั วามี if อยูกอ นหนาหรอื ไม สมมติวา มเี ราก็ตอ งระวงั ในเรื่องของขน้ั ตอนการตรวจสอบ วา เปน ไปอยางท่ีเราตง้ั ใจหรอื ไม เชนตวั อยา งนี้/* DanglingElse.java */import java.io.*;class DanglingElse { public static void main(String[] args) { int x = 7, y = 99; if(x > 5) if(y > 5) System.out.println(\"x and y is greater than 5\"); else System.out.println(\"x is less than 5\"); ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอ สี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 67เร่ิมตนกบั Java }}โปรแกรม 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) System.out.println(\"x and y is greater than 5\"); else System.out.println(\"x is less than 5\");เพราะฉะน้นั ถาเราตอ งการใหการประมวลผลเปน ไปตามทีเ่ ราตอ งการ เราตอ งใช {} เปนตวั ชวย ดงั นี้if(x > 5) { if(y > 5) System.out.println(\"x and y is greater than 5\"):}else System.out.println(\"x is greater than 5\");ซึ่งเม่ือ run ดแู ลวก็จะไดผ ลลพั ธเ ปน ไปตามทเ่ี ราตอ งการ คอื ไมมีผลลพั ธใ ด ๆ แสดงไปยงั หนาจอถา yมนี อยกวา หรอื เทากบั 0ถงึ เวลาท่เี ราจะกลบั ไปปรบั ปรงุ โปรแกรม Quadratic.java ที่เราไดพ ดู ถงึ ในบททสี่ อง เพอื่ ใหม กี ารตรวจสอบคา ของ determinant ทีอ่ าจเปน 0 ดว ยการใช if ในประโยค//calculate determinantdouble d = b * b – 4 * a * c;if(d <= 0) { System.err.println(\"Error: cannot find square root\"); System.exit(1);}double det = Math.sqrt(d);เราไดกาํ หนดใหม ีการตรวจสอบคา ของ d กอนการเรยี กใช Math.sqrt() ถา คาของ d นอ ยกวา หรอื เทากับ0 เราจะฟอ งไปยงั user พรอมกบั ยุตกิ ารทาํ งานของโปรแกรมทันที ดวยการเรียกใช System.exit(1)/* Quadratic.java - Calculating roots of function */class Quadratic { public static void main(String[] args) { double a, b, c; //4x2 + 20x + 16 = 0 a = 4; b = 20; c = 16; //calculate determimant double d = b * b – 4 * a * c; ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 68เรม่ิ ตน กับ Java if(d <= 0) { System.err.println(\"Error: cannot find square root\"); System.exit(1); } double det = Math.sqrt(d); //calculate roots double x1 = (-b + det) / (2 * a); double x2 = (-b - det) / (2 * a); System.out.println(\"Root 1 = \" + x1); System.out.println(\"Root 2 = \" + x2); }}การใช Conditional Operator (? :)Java มี operator อีกตัวหนงึ่ ทเ่ี ราสามารถนาํ มาใชแทน if – else ได เราเรียก operator ตวั นีว้ าConditional operator หรอื operator ทีม่ ี expression (statement) อยสู ามตวั ซ่งึ มโี ครงสรางดงั นี้ คือ(expression) ? (true statement) : (false statement);เชน(number % 2 == 0) ? System.out.println(\"Even number.\") : System.out.println(\"Odd number.\");ลองดโู ปรแกรมตวั อยางกนั/* OddEven.java */import java.io.*;class OddEven { public static void main(String[] args) { int num; String result; num = (int)(Math.random() * 100; result = (num % 2 == 0) ? \"Even\" : \"Odd\"; System.out.println(num + \" is an \" + result + \" number.\"); }}โปรแกรม OddEven.java ใช operator ? : ในการตรวจสอบวา num เปนเลขคูหรือ เลขคี่ ซึ่งถา เปนอยางใดอยา งหนง่ึ ก็จะเก็บขอมลู นนั้ (Even หรอื Odd) ไวใ นตวั แปร result แลว จึงแสดงผลไปยังหนา จอหลังจากน้นั ดงั น้ี65 is an Odd number.โปรแกรม Min.java ที่เห็นดานลางนใี้ ช operator ? : ในการหาคา ตัวเลขทนี่ อ ยทสี่ ดุ ระหวา งเลขสองตวั ท่ีกาํ หนดให/* Min.java */import java.io.*;class Min { ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลัยฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 69เร่มิ ตนกบั Java public static void main(String[] args) { int num1 = 45, num2 = 89; int min = (num1 < num2) ? num1 : num2; System.out.println(\"Min number is \" + min); }}ผลลัพธท ไ่ี ดจ ากการ run คอืMin number is 45การใช operator ? : ก็คอื การใช if – else นนั่ เองดงั น้ันก็เปนเรือ่ งของผเู ขียนโปรแกรมเองวาอยากทจี่ ะใชoperator ตวั ไหน เพราะท้งั สองใหผลการประมวลผลในลกั ษณะเดียวกันการใช switchJava มคี าํ สง่ั อกี ตัวหน่งึ ที่เราสามารถนํามาใชแ ทน 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 ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลัยฟารอ ีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 70เร่ิมตน กบั Java เปน จริง? yes break no statement break ทาํ คําส่ังอืน่ ๆ เปน จริง? yes statement ในโปรแกรม no break defaultภาพท่ี 3.3 ขน้ั ตอนการทาํ งานของ switchคาํ สง่ั break ใน switch น้ันสาํ คญั มาก ๆ ถา เราไมใ ส การทํางานของ switch ก็จะไมไดผ ลลพั ธด งั ทเี่ ราไดค าดการณไว เราลองมาดตู วั อยางโปรแกรมการใช switch ดู/* Switch.java - Using switch * to differentiate input*/import java.io.*;import java.lang.Integer;class Switch { public static void main(String[] args) throws IOException { int month; String season, input; InputStreamReader in; BufferedReader buffer; System.out.print(\"Enter month (1 – 12): \"); in = new InputStreamReader(System.in); buffer = new BufferedReader(in); input = buffer.readLine(); month = Integer.parseInt(input); switch(month) { case 3: case 4: case 5: case 6: season = \"Summer\"; break; case 7: case 8: case 9: case 10: season = \"Rainy\"; break; case 11: case 12: case 1: case 2: season = \"Winter\"; break; default : season = \"Never heard of it!\"; ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอ ีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 71เรม่ิ ตนกบั Java break; } System.out.println(month + \" is in \" + season); }}เราไดท าํ การเปล่ยี นแปลงโปรแกรม 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 4case 5 และจนกระทัง่ มาถึง case 6 ซ่ึงเปน case สุดทา ยในกลมุ Java จงึ ประมวลผลประโยค season =\"Summer\" และ breakการนําเอา case ตา ง ๆ มาตอกันในลักษณะนมี้ ผี ลเหมอื นการประมวลผลดว ยการใช operator || ในประโยคทเ่ี รียกใช if ผอู า นควรสงั เกตถงึ การใช switch ในลกั ษณะน้ใี หดี เพราะเปนวิธกี ารทช่ี ว ยลดขนั้ ตอนการเขียนไดด ีพอสมควรผลลัพธท ี่ไดจ ากการ run โปรแกรม Switch.java ก็เหมอื นกันกับการ run โปรแกรม Season.javaเรามาลองดตู วั อยางการใช switch อกี สักตัวหนง่ึ/* Switch2.java */import java.io.*;import java.lang.Integer;class Switch2 { public static void main(String[] args) throws IOException { int digit; BufferedReader buffer; InputStreamReader isr; String input; System.out.print(\"Enter a digit: \"); isr = new InputStreamReader(System.in); buffer = new BufferedReader(isr); input = buffer.readLine(); digit = Integer.parseInt(input); switch(digit) { case 1: System.out.println(\"You entered ONE.\"); break; case 2: System.out.println(\"You entered TWO.\"); break; case 3: System.out.println(\"You entered THREE.\"); break; case 4: System.out.println(\"You entered FOUR.\"); break; case 5: System.out.println(\"You entered FIVE.\"); break; case 6: System.out.println(\"You entered SIX.\"); ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอ สี เทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 72เร่มิ ตนกับ Java break; case 7: System.out.println(\"You entered SEVEN.\"); break; case 8: System.out.println(\"You entered EIGHT.\"); break; case 9: System.out.println(\"You entered NINE.\"); break; case 0: System.out.println(\"You entered ZERO.\"); break; default: System.out.println(\"Sorry - not a digit!\"); break; } }}โปรแกรม Switch2.java บอก User ใหใ สต ัวเลขระหวาง 0 – 9 และจะแสดงตัวหนังสือแทนตวั เลขเหลานน้ั กลับไปยงั หนาจอ ซงึ่ เมอื่ run แลว กจ็ ะไดผ ลลพั ธด งั น้ีEnter a digit: 9You entered NINE.Enter a digit: 2You entered TWO.Enter a digit: 36Sorry - not a digit!เม่ือเราใส 36 โปรแกรมกลับบอกวา ไมใชตัวเลข ทงั้ น้ีเพราะโปรแกรมของเราตรวจสอบเฉพาะตวั เลขเพยี งตวั เดยี วเทาน้ัน เราตองปรบั ปรงุ โปรแกรมของเราใหมถ าเราตอ งการทจี่ ะตรวจสอบตัวเลขจรงิ ๆ ท้ังหมดการทาํ งานแบบวน (Loop)หลาย ๆ ครัง้ ทโ่ี ปรแกรมเมอรต อ งการทจี่ ะใหโ ปรแกรมทําการประมวลผลในรปู แบบเดิมซา้ํ ๆ กนั เชน คณูตวั เลข 1 – 10 ดวย 2 หรือ อา นขอ มูลจาก keyboard จนกวา user จะพอใจ เราสามารถนาํ เอาชดุ คาํ ส่งั ท่ีJava มใี หม าใชก ับการทาํ งานทวี่ าน้ไี ดอ ยางไมย ากนัก ลองดโู ปรแกรมทที่ าํ การแสดงคา จาก 1 – 10 ไปยงั หนา จอน้ี/* ForLoop.java */import java.io.*;class ForLoop { public static void main(String[] args) { int number = 1; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอ ีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 73เรม่ิ ตนกบั Java System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); number++; System.out.println(\"Number now is \" + number); }}แนนอนผลลพั ธท ่ไี ดก ็ตองเปนNumber now is 1Number now is 2Number now is 3Number now is 4Number now is 5Number now is 6Number now is 7Number now is 8Number now is 9Number now is 10การแสดงคา จาก 1 – 10 น้นั ยังไมมีปญหาอะไรมากมายนัก ถา เราตองการท่ีจะแสดงคา จาก 1 – 100 หรอืจาก 1 – 1000 หละ เราคงตองพมิ พจนมือเม่ือยแนเ ลย ลองมาดวู า เราจะใช loop ชว ยในการทาํ งานในลกั ษณะนีไ้ ดอยา งไรJava มีโครงสรา งหลายตวั ท่ีเราสามารถนาํ มาใชใ นการทาํ งานแบบวนได คาํ สงั่ ทวี่ าน้ี คือ while,do..while และ for ชุดคําสั่งแรกทเี่ ราจะดูกนั คอื for loopการใช for loopกอ นท่ีเราจะไปดโู ครงสรา งของ for loop กันเรามาดกู ันวา โปรแกรมกอนหนา นี้ ถา ใช for loop แลวจะมีหนาตาเปนอยางไร/* ForLoop2.java */import java.io.*;class ForLoop2 { public static void main(String[] args) { int number; for(number = 1; number <= 10; number++) System.out.println(\"Number now is \" + number); }}จะเหน็ วาโปรแกรมของเราสน้ั ลงมาก คําส่ังใน for loop บอกให Java รูวาการประมวลผลตอ งทําทัง้ หมด10 ครัง้ โดยเริม่ ตนการประมวลผล เม่อื number มคี า เทา กบั 1 ไปจนกวา number จะมีคา เปน 10 ซงึ่ เมื่อnumber มีคา เปน 10 Java ก็จะยตุ กิ ารประมวลผลทง้ั หมด และผลลพั ธท ่ีไดกเ็ หมอื นกนั กบั โปรแกรมForLoop.java ทีเ่ ราเขียนขึ้นมากอ นหนาน้ีโครงสรางของ for loop มดี งั นคี้ อืfor(expression1 ; expression2 ; expression3) statement; ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลัยฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 74เร่มิ ตนกับ Javaโดยที่ 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 วา incrementexpressionภาพท่ี 3.4 แสดงแผนผงั การทาํ งานของ for loop expression1 expression2 no (จรงิ ?) statement อ่ืน ๆ ในโปรแกรม yes statement expression3ภาพที่ 3.4 ข้นั ตอนการทํางานของ for loopเรากลบั มาดโู ปรแกรม ForLoop2.java ทเ่ี ราเขียนกอ นหนานวี้ ามกี ารทํางานอยา งไร เราเรมิ่ ตน ดวยการเขียน for loopfor(number = 1; number <= 10; number++) System.out.println(\"Number now is \" + number);ส่ิงที่ Java ทํากอ นก็คือ กําหนดคา ตัวแปร number ใหเปน หนึ่ง หลงั จากนนั้ กท็ าํ การตรวจสอบวา ตวั แปรnumber มีคา นอ ยกวา หรอื เทา กบั สิบหรอื ไม ซงึ่ กเ็ ปนจรงิ ดงั น้ัน Java จึงประมวลผลประโยคทีอ่ ยูใ น forloop เมอ่ื เสร็จแลวจึงไปประมวลผลประโยค number++ ซึ่งเปนการเพม่ิ คา ใหก บั ตัวแปร number เสรจ็แลวจึงกลบั ไปตรวจสอบวา number <= 10 อีกคร้ัง ทาํ ไปเรอื่ ย ๆ จนกวา number จะมคี า มากกวาสิบจึงจะยตุ กิ ารทํางาน โดยสรปุ แลวขั้นตอนของ for loop มดี ังน้คี อื1. กาํ หนดคา เบื้องตน ใหกับ number2. ตรวจสอบวา number <= 10 หรือไม ถาเปนจริง ประมวลผลประโยค System.out.println(\"Number now is \" + number); ถาเปนเทจ็ ยตุ กิ ารทํางานของ for loop3. ประมวลผลประโยค number++4. กลบั ไปทาํ คาํ สง่ั ในขอสองใหม ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลัยฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 75เรมิ่ ตน กบั JavaExpression ท่สี าํ คญั ทส่ี ดุ ทจี่ ะทําให 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/* Add1To100.java */import java.io.*;class Add1To100 { public static void main(String[] args) { int total = 0; for(int i = 1; i <= 100; i++) total += i; System.out.println(\"Sum of 1 - 100 is \" + total); }}ผลลัพธข องการ run คือSum of 1 – 100 is 5050ตัวอยา งโปรแกรมตอ ไปน้ีทาํ การคาํ นวณหาดอกเบยี้ ทบตน ในแตละป เปนจาํ นวนเทากับจํานวนปที่ userเปนผกู ําหนดจากเงนิ ฝากเริ่มตน ทห่ี น่ึงพนั บาท (หรือเทากบั จาํ นวนที่ user เปน ผใู สเ ขา สโู ปรแกรม) โดยใชส ูตรการในการคาํ นวณ คือamount = p(1 + r)nโดยที่ ภาควิชาคอมพิวเตอรธุรกจิ วิทยาลยั ฟารอ สี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 76เรม่ิ ตนกบั Javap คือ จํานวนเงนิ เริม่ ตน (principal)r คือ อัตราดอกเบย้ี ประจําปn คอื จํานวนของปท ่ตี องการหาamount คือ เงินตน ทน่ี ําฝากของทกุ ป/* Interests.java */import java.io.*;import java.lang.Integer;class Interests {public static void main(String[] args) throws IOException { double amount; //amount at the end of year double principal; //first deposit double rate; //annual interests rate int years; //number of years BufferedReader buffer; InputStreamReader isr; String input; //get input from user (principal, rate, years) System.out.print(\"Enter amount to deposit: \"); isr = new InputStreamReader(System.in); buffer = new BufferedReader(isr); input = buffer.readLine(); principal = Double.parseDouble(input); System.out.print(\"Enter interests rate: \"); input = buffer.readLine(); rate = Double.parseDouble(input); System.out.print(\"Enter number of year: \"); input = buffer.readLine(); years = Integer.parseInt(input); //calculate and display amount System.out.println(\"\nYear\tAmount on deposit\"); for(int y = 1 y <= years; y++) { amount = principal * Math.pow(1.0 + rate, y); System.out.println(y + \"\t\" + amount); } System.out.print(\"\nTotal interests after \" + years); System.out.println(\" years is \" + (amount - principal)); }}ผลลัพธข องการ run ดว ย principal = 10000 rate = 0.25 และ years = 5Enter amount to deposit: 10000Enter interests rate: .25Enter number of year: 5Year Amount on deposit1 12500.02 15625.03 19531.254 24414.06255 30517.578125 ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอ ีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 77เร่ิมตน กบั JavaTotal interests after 5 years is 20517.578125สว นประกอบทสี่ ําคญั คือ for loop ท่ที าํ หนาทค่ี าํ นวณหาจํานวนเงินท่ีไดร ับในแตล ะป (พรอ มทัง้ ดอกเบย้ี )เราใช method Math.pow() ในการหาคาของดอกเบีย้ ในแตล ะป ซงึ่ เมอ่ื หาไดแลว เรากแ็ สดงผลลพั ธไ ปยังหนาจอทันที for loop ของเรายตุ กิ ารประมวลผลเมือ่ คา ของตวั แปร y มคี า มากกวา ตวั แปร yearsหลงั จากแสดงจาํ นวนของเงินในแตล ะปแ ลว เมอื่ ออกจาก for loop เราก็แสดงจาํ นวนของดอกเบย้ีทง้ั หมดที่ไดจากการฝากในชว งนั้นถา หากเราไมต อ งการใชส ตู รในการคํานวณหาดอกเบ้ยี เราก็สามารถทาํ ไดด ว ยการคาํ นวณหาดอกเบีย้ กอ นแลวจงึ นําเอาดอกเบย้ี ที่หาไดไ ปบวกกับเงนิ ตน หลงั จากนน้ั กค็ ํานวณหาดอกเบีย้ จากเงนิ ตนใหมน ้ี ทําการคํานวณจนกวาจะครบตามจาํ นวนปท ีไ่ ดก ําหนดไว ดงั ทแ่ี สดงดว ย code น้ีamount = principal;System.out.println(\"\nYear\tAmount on deposit\");for(int y = 1; y <= years; y++) { double interests = amount * rate; //calculate interests amount += interests; //calculate new principal System.out.println(y + \"\t\" + amount);}เราลองมาดโู ปรแกรมตวั อยา งอกี ตัวหนง่ึ ทใี่ ช for loop ในการควบคุมการทาํ งานของโปรแกรม พรอ มทงั้ยอมให user ใสขอมลู หลาย ๆ ตวั ในบรรทดั เดียวกันได/* AddNumbers.java - reading numbers from input line * user must specify space between those numbers and * hit <enter> when done.*/import java.io.*;import java.text.DecimalFormat;class AddNumbers { public static void main(String[] args) throws IOException { double number, sum = 0; //a number read and sum of numbers int count = 0; //total numbers read BufferedReader buffer; //input buffer InputStreamReader isr; //input stream StreamTokenizer token; //token from input stream DecimalFormat f = new DecimalFormat(\"0.00\"); System.out.print(\"Enter numbers (space between – enter when done): \"); isr = new InputStreamReader(System.in); buffer = new BufferedReader(isr); //get tokens from input buffer token = new StreamTokenizer(buffer); //set priority to EOL so that we can break out of the loop token.eolIsSignificant(true); //get each number from tokens //calculate the sum until EOL is reached for(; token.nextToken() != token.TT_EOL ;) { switch(token.ttype) { //token is a number case StreamTokenizer.TT_NUMBER: number = token.nval; //save token in number count++; //number of tokens read ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลยั ฟารอีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 78เร่ิมตน กบั Java sum += number; //calculate sum break; default: System.out.println(\"Token is not a number! \" + token.toString()); break; } } //calculate average and display result double average = sum / count; System.out.println(\"Sum of numbers = \" + sum); System.out.println(\"Average of numbers = \" + f.format(average)); }}โปรแกรม 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 พรอ มกับเพิ่มคา ใหกบั ตวั แปร countfor(; token.nextToken() != token.TT_EOL ;) { switch(token.ttype) { //token is a number case StreamTokenizer.TT_NUMBER: number = token.nval; //save token in number count++; //number of tokens read sum += number; //calculate sum break; 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; ภาควิชาคอมพิวเตอรธุรกิจ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 79เริม่ ตน กับ Javaเนอื่ งจากวาเราสนใจเฉพาะ 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 34Sum of numbers = 930.0Average of numbers = 155.0Enter numbers (space between - enter when done): 45 68 95Sum of numbers = 208.0Average of numbers = 69.33Class StreamTokenizer ยงั มี field อน่ื ๆ ที่เราสามารถเรียกใชไ ด แตไ มไ ดก ลาวไวในทนี่ เี้ พราะวาโปรแกรม AddNumbers.java ของเราสนใจแตเฉพาะการอา นตวั เลขเทา นั้น ผูอานสามารถหาขอ มลู ไดจาก javadoc ของ Sun เองในการใช for loop นน้ั เราสามารถทจี่ ะใช , (comma) เปน ตัวแบง การประมวลในแตละ expression ไดดงั ตัวอยา งโปรแกรมการหาผลรวมและคา เฉลย่ี นของเลขจากหนงึ่ ถึงสิบนี้/* Sum.java */import java.io.*;class Sum { public static void main(String[] args) { int i, sum; for(i = 1, sum = 0; i <= 10; sum += i, i++) ; System.out.println(\"Sum = \" + sum); System.out.println(\"Average = \" + (double)sum / (i-1)); }}เรากาํ หนดให 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++) ;หรือfor(i = 1, sum = 0; i <= 10; sum += i, i++) { }การทาํ งานของ for loop ทวี่ าน้กี ็เหมือนกันกับการเขียน for loop แบบเดิม ตางกนั ตรงท่ีเราไดย า ยตําแหนงของประโยคสองประโยค เทา นัน้ เอง ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 80เริ่มตนกับ Javasum = 0;for(i = 1; i <= 10; i++) sum += i;ตาํ แหนงของขอ ความการหาผลรวมก็มคี วามสาํ คัญ เราตอ งกําหนดใหป ระโยค sum += i นนั้ อยูกอ นประโยค i++ ทัง้ นีก้ เ็ พราะวา Java จะประมวลผลประโยคทอี่ ยูท างซา ยของเครื่องหมาย , กอ น แลว จึงจะประมวลผลประโยคทอี่ ยถู ดั ไปทางขวา ซึ่งถาเรากาํ หนดให i++ อยูกอ น sum += i การประมวลผลของเรากจ็ ะผดิ พลาด คา ของผลรวมท่ไี ดค ลาดเคล่อื นสว นทีส่ าํ คัญอกี สวนหนง่ึ กค็ อื คาของ i สาํ หรับการคาํ นวณหาคาเฉล่ยี เราตอ งหกั คาของ i ออกหนง่ึ คากอนนําไปหาร sum กเ็ น่อื งจากวา ในขณะที่ for loop ยุติการทาํ งานน้นั คาของ i มคี า เปน 11การหาผลรวมของ for loop ทกี่ ลาวมาแลวนนั้ เราสามารถทจ่ี ะเขยี นไดอกี หลายรูปแบบ เชนi=;sum = 0;for( ; i <= 10; i++) ; sum += i;หรือi = 1;sum = 0;for( ; i <= 10; ) { sum += i; i++;}หรือsum = 0;for( i = 1; i <= 10; ) { sum += i; i++;}ผอู า นควรคาํ นงึ ถงึ การเขยี น code ท่ดี แู ลวอา นไดงา ย มโี ครงสรางทีม่ องดูเปน สากล ดงั นั้นถึงแมว า Javaจะยอมใหเราเขยี น code ไดอยา งอิสระและหลายรปู แบบ เรากไ็ มค วรเขยี น code ท่ยี ากตอ การทาํ ความเขาใจ ยกเวนวา การเขยี น code น้นั ๆ มีความจาํ เปน ทต่ี องใชร ปู แบบนั้น ๆ ในการเขียน (จาํ เปน จรงิ หรอื ?)การใช 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 ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 81เร่ิมตน กบั Java Expression no (จรงิ ?) yes statement Next statementภาพที่ 3.5 ข้นั ตอนการทํางานของ while loopเรามาลองใช while loop แทน for loop ท่ีเราไดใชใ นโปรแกรมตวั อยา งบางตัวกอนหนานี้/* Sum.java */import java.io.*;class Sum { public static void main(String[] args) { int i, sum; i = 0; sum = 0; while(i <= 10) { sum += i; i++; } System.out.println(\"Sum = \" + sum); System.out.println(\"Average = \" + (double)sum / (i-1)); }}สิง่ แรกที่เราตองทํากค็ อื การกําหนดคา เบอื้ งตน ใหก บั ตวั แปร i และ sum หลงั จากนน้ั เรากท็ าํ การตรวจสอบดวู าประโยค i <= 10 เปน จรงิ หรอื ไม ซึ่งถา เปนจริงเรากใ็ ห while loop ของเราทําการบวกคา ของ i เขากับตัวแปร sum พรอ มท้ังเพิม่ คา ใหก บั i เมอ่ื เสรจ็ แลว ถา เราลองเปรยี บเทยี บการใช while loop กับ forloop เราจะเห็นวา ประโยคi = 0;sum = 0;คอื expression ทหี่ น่งึ ของ for loop และประโยค ภาควิชาคอมพิวเตอรธรุ กิจ วทิ ยาลยั ฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 82เรม่ิ ตนกบั Javai <= 10 ก็คือ expression ทส่ี องใน for loop สวนประโยค i++ ก็คือ expression ทส่ี ามใน for loopนั่นเอง (ถงึ แมว า เราไดก ําหนดคา ของ i ใหเริม่ ตน ที่ 0 ก็ไมท ําใหการประมวลผลเปลีย่ นไป เพยี งแตว าloop ของเราทํางานมากขนึ้ อกี หน่งึ คร้ัง เทา น้ัน)ทนี ีเ้ รามาลองใช while loop แทน for loop ในโปรแกรม AddNumbers.java กนั/* AddNumbers2.java - reading numbers from input line user must specify space between those numbers and hit <enter> when done. (using while loop) */import java.io.*;import java.text.DecimalFormat;class AddNumbers2 { public static void main(String[] args) throws IOException { double number, sum = 0; //a number read and sum of numbers int count = 0; //total numbers read BufferedReader buffer; //input buffer InputStreamReader isr; //input stream StreamTokenizer token; //token from input stream DecimalFormat f = new DecimalFormat(\"0.00\"); System.out.print(\"Enter numbers (space between – enter when done): \"); isr = new InputStreamReader(System.in); buffer = new BufferedReader(isr); //get tokens from input buffer token = new StreamTokenizer(buffer); //set priority to EOL so that we can break out of the loop token.eolIsSignificant(true); //get each number from tokens //calculate the sum until EOL is reached while(token.nextToken() != token.TT_EOL) { switch(token.ttype) { //token is a number case StreamTokenizer.TT_NUMBER: number = token.nval; //save token in number count++; //number of tokens read sum += number; //calculate sum break; default: System.out.println(\"Token is not a number! \" + token.toString()); break; } } //calculate average and display result double average = sum / count; System.out.println(\"Sum of numbers = \" + sum); System.out.println(\"Average of numbers = \" + f.format(average)); }}เราแทบทีจ่ ะไมต องเปลย่ี นอะไรเลย เพียงแตเ ปล่ยี นประโยคfor(; token.nextToken() != token.TT_EOL ;) ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลยั ฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 83เร่มิ ตน กับ Javaใหเปนwhile(token.nextToken() != token.TT_EOL)เทา น้ันเอง สวน code อ่นื ๆ กย็ ังคงเหมือนเดมิทัง้ for loop และ while loop เปนโครงสรางของการทาํ งานแบบวนทต่ี องมกี ารตรวจสอบกอนวาประโยคในการควบคมุ ของ loop ทงั้ สองเปนจริงหรอื เทจ็ ซึ่งหมายถงึ วาการทาํ งานของ loop ทั้งสองอาจไมเกดิ ขึ้นเลยถา การประมวลผลประโยคควบคมุ เปน เท็จ แตถ าเราตองการทีจ่ ะประมวลผลกอ นอยางนอ ยหนง่ึครงั้ เราจะทาํ อยางไรการใช do..whileJava มีโครงสรา งการใช loop อกี ตวั หนึ่งทย่ี อมใหม กี ารทาํ งานอยา งนอยกอ นหน่ึงครง้ั แลวจงึ จะทาํ การประมวลผลประโยคควบคุม นนั่ ก็คือ do … while ซ่ึงมีโครงสรา งดงั นี้do { statement}while(expression);ภาพที่ 3.6 แสดงขนั้ ตอนการทาํ งานของ do … while loop statement yes Expression (จริง ?) no statementภาพท่ี 3.6 ขั้นตอนการทํางานของ do … whileถาเราตองการทจี่ ะทาํ งานอยา งนอ ยหนึง่ คร้ังกอ นทีจ่ ะมกี ารตรวจสอบเพ่ือยตุ กิ ารทาํ งาน หรือทาํ งานตอ ไปdo … while loop จะเปนโครงสรางท่ีเหมาะสมทส่ี ุด โปรแกรมตวั อยางตอ ไปนีแ้ สดงถงึ การใช do …while loop ในการตรวจสอบน้นั ๆ/* DoWhile.java - do .. while to repeat the program until user enter a letter other than 'y' */import java.io.*; ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอ สี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 84เริม่ ตนกบั Javaimport java.lang.Integer;class DoWhile { public static void main(String[] args) throws IOException { int score; char grade, ch; //set up buffer stream InputStreamReader isr = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(isr); do { //get input string System.out.print(\"Enter your score: \"); String input = buffer.readLine(); //convert string to int score = Integer.parseInt(input); //determine grade by given score if(score > 90) grade = 'A'; else if(score > 80) grade = 'B'; else if(score > 70) grade = 'C'; else if(score > 60) grade = 'D'; else grade = 'F'; System.out.println(\"Your grade is \" + grade); System.out.print(\"\nDO you want to continue? <y/n> : \"); String response = buffer.readLine(); ch = (char)response.charAt(0); } while(ch == 'y'); }}เราเพียงแตด ดั แปลงโปรแกรมการหาเกรดของเรา ดว ยการเพมิ่ do … while และประโยคSystem.out.print(\"\nDO you want to continue? <y/n> : \");String response = buffer.readLine();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: 89Your grade is B ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 85เรม่ิ ตนกบั JavaDO you want to continue? <y/n> : yEnter your score: 12Your grade is FDO you want to continue? <y/n> : yEnter your score: 75Your grade is CDO you want to continue? <y/n> : nเรามาลองดโู ปรแกรมตัวอยางอกี ตวั หน่ึงทใ่ี ช do … while loop ในการหาผลรวมของเลขระหวา ง 1 –100/* Sum2.java */import java.io.*;class Sum2 { public static void main(String[] args) { int i, sum; i = 0; sum = 0; do { sum += i; i++; } while(i <= 100); System.out.println(\"Sum = \" + sum); System.out.println(\"Average = \" + (double)sum / (i-1)); }}ซึง่ เมื่อ run ดกู ็ไดผ ลลัพธดงั นี้Sum = 5050Average = 50.5เราไมไ ดเปล่ียนแปลงอะไรมากมายใน loop ของเราเพียงแตเปล่ียนมาใช do … while loop เทานนั้ เองเพ่อื ใหเ กิดความเขาใจในการทาํ งานของ loop ดีย่ิงขึน้ เราจงึ นาํ เอาตวั อยางของ code ทใี่ ช loop ในรูปแบบตา ง ๆ มาใหด กู ัน ผูอานควรตรวจสอบถงึ ผลลัพธทค่ี วรจะไดจ ากการทาํ งานของ loop เหลา นด้ี ว ยมอื กอนทีจ่ ะเขยี นโปรแกรมตรวจสอบตวั อยา งท่ี 1class Loops { public static void main(String[] args) { int index = 1; while(index != 9) { index += 2; System.out.println(index); index--; } ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลยั ฟารอ ีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 86เริ่มตน กับ Java }}ตัวอยางท่ี 2class 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; } }}ตัวอยางท่ี 3class Loops2 { public static void main(String[] args) { int index = 1; while(index != 33) { index++; System.out.println(index); index++; } }}การใช break และ continueหลาย ๆ คร้ังท่เี ราตอ งการยตุ กิ ารทาํ งานของ loop โดยที่ loop ยังไมส ิน้ สดุ การทาํ งานของมนั เอง เชนกาํ หนดให loop หยดุ การทาํ งานเมอื่ คา ของ loop index มีคา ตรงตามเงอื่ นไขทีไ่ ดกําหนดไว ดังแสดงใหเหน็ ในโปรแกรมตัวอยางนี้/* Sum3.java */import java.io.*;class Sum3 { public static void main(String[] args) { int i, sum; i = 0; sum = 0; do { sum += i; i++; //break out of loop when i >= 50 if(i >= 50) break; } ภาควิชาคอมพิวเตอรธุรกิจ วทิ ยาลยั ฟารอ สี เทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 87เริม่ ตน กบั Java while(i <= 100); System.out.println(\"Sum = \" + sum); System.out.println(\"Average = \" + (double)sum / (i-1)); }}เราใชโปรแกรม Sum2.java เปนพนื้ ฐานของการเปลี่ยนแปลง โดยเรากาํ หนดใหมีการตรวจสอบคาของ iวา มากกวา หรือเทา กนั กับ 50 หรือไมซ ึ่งถา เปน จรงิ เราก็จะ break ออกจาก loop ทันทีif(i >= 50) break;เม่อื เราลอง run ดูเราไดผ ลลพั ธด งั น้ีSum = 1225Average = 25.0ลองมาดโู ปรแกรมทใี่ ช break ในการหยุดการทาํ งานของ loop ทใี่ ชห าคา ของตวั เลขทกี่ าํ หนดใหวา เปนเลขคูจ าํ นวนสบิ ตัว/* Break.java */import java.io.*;class Break { public static void main(String[] args) { for(int number = 1; ; number++) if(number % 2 == 0) { System.out.println(\"Number is \" + number); //break out of loop when number >= 10 if(number >= 10) break; } }}เราจะตรวจสอบวา ตัวเลขเปนเลขคกู อ นแลว จงึ ทาํ การแสดงตัวเลขนน้ั ๆ ไปยังหนาจอ เมอ่ื ครบสิบตัวแลวเรากจ็ ะหยุดการทํางานของ loop ดงั ทแ่ี สดงใหเห็นจากผลลพั ธท ไี่ ดน้ีNumber is 2Number is 4Number is 6Number is 8Number is 10ทนี ี้เรามาลองใช continue ดูบาง/* Continue.java */import java.io.*;class Continue { public static void main(String[] args) { for(int number = 1; number <= 10; number++) { ภาควิชาคอมพิวเตอรธุรกิจ วทิ ยาลัยฟารอสี เทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 88เรม่ิ ตนกับ Java //skip if number is 5 if(number == 5) continue; System.out.println(\"Number is \" + number); } }}การประมวลของ code ที่เหลืออยใู นโปรแกรมจะถูกประมวลผล ยกเวนเมอื่ คา ของ number มคี า เทา กับหา ดังแสดงใหเ ห็นจากผลลัพธน ี้Number is 1Number is 2Number is 3Number is 4Number is 6Number is 7Number is 8Number is 9Number is 10การใช continue นัน้ โดยทั่วไปมกั จะไมคอยมที ใี่ ชเ ทาไรนัก เพราะการเขยี นโปรแกรมโดยท่ัวไปมักจะทาํการประมวลผลกลุมของคาํ ส่งั ทั้งหมดจนเสรจ็ หรอื ไมกย็ ตุ ิการทาํ งานเมอ่ื เงื่อนไขบางอยางเปนจรงิ การกระโดดขา มการประมวลผลชดุ คําสงั่ ไมค อ ยจะมใี หเ ห็นมากมายนัก ดังน้นั ก็คงตอ งขน้ึ อยูกับการออกแบบโปรแกรมของผอู า นเองวา เหมาะสมอยางไรตอ การใชช ดุ คําสงั่ ตาง ๆการใช Nested Loopเราสามารถทจ่ี ะนําเอา loop ตา ง ๆ ทเี่ ราไดพ ดู ถงึ มาใสไ วใ น loop ได เชน เดยี วกับที่เราทาํ กบั if – elseเนอ่ื งจากวาตัว loop เองกเ็ ปน ประโยคอยางหนง่ึ ดงั นัน้ การนาํ ประโยคมาวางซอนกนั ในการเขียนโปรแกรมกย็ อมทีจ่ ะทําได เรามาลองดตู วั อยา งการใช nested loop กนั/* NestedLoop.java */import java.io.*;class NestedLoop { public static void main(String[] args) { for(int row = 1; row <= 10; row++) { for(int column = 1; column <= 10; column++) { if(column > row) continue; System.out.print(\"*\"); } System.out.println(); } }}โปรแกรม NestedLoop.java ของเราใช for loop สองตัวในการแสดงจํานวนของ '*' ในแตละแถว ดังที่แสดงใหเห็นจากผลลพั ธนี้ (หนาถดั ไป) ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลัยฟารอ ีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 89เริ่มตนกับ Java*******************************************************ใน 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 ในรปู แบบตาง ๆ (ผอู านควรตรวจสอบผลลพั ธด วยมือกอนการเขียนโปรแกรมทดสอบ)ตัวอยา งที่ 1class Loops3 { public static void main(String[] args) { int j, k = 0; while(k < 3) { j = 5; while(j > 0) { System.out.println(j); j -= 2; } System.out.println(\"k = \" + k); k++; } }} ภาควิชาคอมพิวเตอรธ ุรกจิ วิทยาลัยฟารอ ีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 90เร่มิ ตน กบั Javaตัวอยา งที่ 2class 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; } }}ตวั อยางที่ 3class 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; } }}การใช Labeled continue และ Labeled break ใน for loopJava ยอมใหมกี ารใช label ในการหยดุ และเร่ิมการประมวลผลใหม ซ่ึงโปรแกรมเมอรห ลาย ๆ ทา นไมคอ ยจะเหน็ ดว ยกบั การใชก ารประมวลผลในลกั ษณะนเี้ ทา ใดนกั เรามาดตู วั อยา งกัน/* LabledContinue.java */import java.io.*;class LabeledContinue { public static void main(String[] args) { label: for(int row = 1; row <= 10; row++) { System.out.println(); for(int column = 1; column <= 10; column++) { if(column > row) continue label; //goto label System.out.print(\"*\"); } } }} ภาควิชาคอมพิวเตอรธรุ กจิ วทิ ยาลัยฟารอสี เทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 91เรมิ่ ตนกบั Javaเราไดดดั แปลงโปรแกรม Continue.java ของเราสําหรับการแสดงการใช labeled continue ในโปรแกรมLabeledContinue.java เรากาํ หนดใหม ี identifier ทีม่ ชี อื่ วา label อยูกอ นหนา for loop ดานนอกของเรา ซึง่ ตอ งมเี ครอื่ งหมาย ':' ตามหลงั เสมอ และในการใช continue ใน for loop ดา นในนนั้ เราจะตองมีidentifier ทเี่ ราใชตามหลัง continue เสมอการประมวลดว ย labeled continue ก็ไมยากนกั ทจ่ี ะทาํ ความเขาใจ เมอ่ื คา ของ column มากกวา คาของrow การทํางานใน for loop ดานในกส็ ้ินสดุ ลงและไปเริ่มตน ใหมท ่ี for loop ดา นนอก เพราะนั่นเปน ทท่ี ีม่ ีlabel อยู การทาํ งานแบบน้กี ็เหมือนกบั การกระโดดไปยังตาํ แหนงทเ่ี ราตองการจะไปนนั่ เอง ท้งั น้ีก็ตองข้นึ อยูก ับเงือ่ นไขท่เี ราไดตงั้ ไวถา เราเปลยี่ น continue ใหเปน break เราจะไดผ ลลพั ธอ ะไร เรามาลองดูโปรแกรมท่ีใช labeled breakกันดู/* LabledContinue.java */import java.io.*;class LabeledContinue { public static void main(String[] args) { System.out.println(\"Statement before first label.\"); first: for(int i = 1; i <= 10; i++) { for(int j = 1; j <= 10; j++) { if(j > i) break first; System.out.println('*'); } } System.out.println(\"Statement after first label.\"); }}เราไดเพ่ิมประโยคท้ังกอนและหลัง label ท่ชี อื่ วา first ของเราเพอ่ื จะไดดวู า การประมวลผลเกิดขึ้นที่ใดบา ง กอนที่เราจะประมวลผลของประโยคท่ตี ามหลัง first เราสง ขอความไปยงั หนา จอวาStatement before first label.และ for loop ของเราทง้ั สองตัวสงตัวอักษรเพียงตัวเดยี วไปยงั หนา จอคอื*หลังจากนน้ั กส็ ง ขอความStatement after first label.ไปยงั หนาจอ จะเหน็ วาการใช labeled break นนั้ ทาํ ใหการประมวลผลของเรายตุ ลิ ง เพราะวา ประโยคทมี่ ีอยูใน block ของ first นน้ั มีเพียงประโยคเดยี วดงั นั้น Java จะประมวลผลประโยคที่อยูถดั ไป หลังจากblock ของ first ซึ่งกค็ อื ประโยคSystem.out.println(\"Statement after first label.\");เราสามารถทจี่ ะมี label block ก่ี block กไ็ ดใ นโปรแกรมของเรา การใช labeled break ถา ใชไดอยา งเหมาะสมแลว จะทําใหการเขยี น code เปนไปไดอ ยางสะดวกยงิ่ ขึน้ ทั้งน้กี ็เพราะวา เราสามารถท่จี ะกระโดดไปยงั block ตาง ๆ ไดอยางงาย ๆลองมาดโู ปรแกรมตวั อยา งอีกตวั หนง่ึ ทใี่ ช labeled break ในการหาผลคูณของเลขระหวาง 1 – 5 ภาควิชาคอมพิวเตอรธ รุ กิจ วิทยาลัยฟารอีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 92เริ่มตน กบั Java/* LabledBreak.java */import java.io.*;class LabeledBreak { public static void main(String[] args) { int prod = 1; int i = 1; outer: while(true) { prod *= i; i++; if(i > 5) break outer; } System.out.println(\"Product = \" + prod); }}เราใช while loop ทที่ ํางานอยตู ลอดเวลาโดยไมมีการกาํ หนดใหห ยดุ (ใช true ใน expression) แตเ รากําหนดใหมีการหยดุ จากการใช labeled break ใน while loop เอง ตวั โปรแกรมจะคํานวณหาผลคูณไปจนกวาคาของ i จะเปนหา กจ็ ะ break ออกจาก block ท่ีชือ่ outer ทนั ที และจะไปประมวลผลประโยคท่ีอยถู ัดมาจาก block ซงึ่ ก็คอื System.out.println(\"Product = \" + prod)Loop เปน โครงสรางทใี่ ชมากในการเขียนโปรแกรมตาง ๆ ทั้งนี้เพราะ loop เออ้ื อาํ นวยใหผ เู ขียนเรยี กใชชดุ คาํ สัง่ ตา ง ๆ ซาํ้ กนั ได ทาํ ใหก ารเขยี นโปรแกรมลดขั้นตอนการทาํ งานลง และการทาํ งานของโปรแกรมกก็ ระชบั ยง่ิ ขน้ึ เราจะกลบั มาพดู ถงึ loop อกี หลาย ๆ คร้งั ในบทตอ ๆ ไป โดยเฉพาะในเรอื่ งของ Arrayและ Stringสรปุในบทน้ีเราไดพ ดู ถงึ การใชประโยคของการเปรียบเทยี บ และการตัดสนิ ใจ การใชป ระโยคควบคมุ การทํางาน การใช loop ในการประมวลผลตดิ ตอกนั โดยรวมแลว เราไดพ ดู ถงึ9 การใช if และ if-else9 การใช nested-if9 การใช Tertiary operator - ? :9 การใช switch9 การใช loop ตา ง ๆ เชน for-loop while-loop และ do-while-loop9 การใช break continue และการใชประโยคทใ่ี ช labelแบบฝก หดั1. จงเขียนโปรแกรมทรี่ ับ int จาก keyboard จํานวน 10 ตวั หลังจากน้ันใหค าํ นวณหาผลรวม และ คา เฉลยี่ ของขอมูลท้งั 10 ตวั ใหส งผลลัพธอ อกทางหนา จอ2. จงเขียนโปรแกรมทสี่ รา งตัวเลขแบบสมุ จาํ นวน 100 ตวั เสรจ็ แลว ใหแ สดงผลลพั ธอ อกทางหนา จอ เฉพาะตัวเลขทเ่ี ปน เลขคเี่ ทานนั้ โดยกําหนดใหก ารแสดงผลเปน 10 ตัวตอหนง่ึ บรรทัด3. จากโจทยในขอ 2 แทนทจี่ ะแสดงผลเปน เลขคใ่ี หแ สดงผลเฉพาะทเี่ ปนเลขคเู ทาน้ัน โดยแสดงเฉพาะ เลขคูท ีม่ ากกวา 20 เทานน้ั4. จงเขียนโปรแกรมทแ่ี สดงตวั อกั ษรตั้งแต A ไปจนถึง Z ดว ยการใช while loop โดยไมม ีการรับคาใด ๆ จาก keyboard ภาควิชาคอมพิวเตอรธรุ กจิ วทิ ยาลัยฟารอ ีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 93เร่มิ ตน กบั Java5. จงเขียนโปรแกรมทคี่ าํ นวณหาคา ท่ีเล็กทสี่ ุดในกลุมตัวอักษรท่ีอา นเขามาจาก keyboard ทีละตัว (ตวั อักษรทน่ี ําเขาควรมจี าํ นวนไมน อยกวา 10 ตัว)6. จงเขยี นโปรแกรมท่อี านขอ มูล 2 ตวั จาก keyboard โดยทต่ี วั แรกเปน หมายเลขของสนิ คา (product number) และตวั ทสี่ องเปน จาํ นวนท่ขี ายไปในแตล ะวัน (quantity sold) กาํ หนดใหมสี นิ คา อยู 5 ชนดิ ทีม่ รี าคาตา งกัน ดังน้ีสนิ คาที่ 1 ราคา 500.0 บาทสนิ คา ท่ี 2 ราคา 750.0 บาทสนิ คาที่ 3 ราคา 850.0 บาทสินคา ท่ี 4 ราคา 950.0 บาทสนิ คาท่ี 5 ราคา 1000.0 บาทโปรแกรมจะคาํ นวณหายอดเงนิ ท่ขี ายไดของสนิ คา ทกุ ตวั ในอาทิตยท ผี่ านมา โดยท่ีจํานวนของสนิ คาแตล ะชนิดท่ีขายไปจะนําเขามาจาก keyboard โปรแกรมที่เขียนข้ึนตอ งใช switch ในการแยกแยะราคาของสินคาแตล ะชนดิ ทีเ่ ขา มา ใหแ สดงผลลัพธออกทางหนาจอ7. จงเขยี นโปรแกรมทคี่ าํ นวณหาดอกเบย้ี ทบตน จากเงินตน ทอ่ี านเขา มาจาก keyboard ดว ยสตู รที่ กําหนดให ตอ ไปน้ี (คลาย ๆ กับตัวอยางในบทนี้)a = p(1 + r)np หมายถึงเงนิ ลงทนุ คร้ังแรกr หมายถงึ อตั ราดอกเบีย้ ตอ ปn หมายถงึ จาํ นวนปทต่ี อ งการฝากเงินa จํานวนเงนิ ทฝ่ี ากเขา ทกุ ๆ สนิ้ ปโปรแกรมควรแสดงรายการออกเปนสอง column โดยท่ี column แรกเปน ปท ่ฝี าก และ column ท่ีสองเปนดอกเบี้ยทีไ่ ดใ นแตละป ใหท ดลอง run โปรแกรมดว ยอัตราดอกเบยี้ 5% ตอป และเงินตน ท่ี1000 บาท เปน เวลา 10 ป8. จงเขยี นโปรแกรมทแี่ สดงผลลพั ธ ดงั ท่ีเหน็ นี้ ดว ยการใช loop เทา นั้น********** ******************* ***************** *************** ************* *********** ********* ******* ***** *** *9. จงเขยี นโปรแกรมทรี่ บั คา int หนงึ่ ตัว (n) ที่มากกวาศนู ย หลงั จากน้ันใหแสดงผล ดังนี้1 2 3 … n-1 n1 2 3 … n-1…123121 ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลยั ฟารอ ีสเทอรน
บทท่ี 3 การประมวลผลแบบวน (Repetition) 94เรม่ิ ตน กบั Java10. จงเขียนโปรแกรมทรี่ ับคาเปน วัน เดือน ป จาก keyboard หลงั จากน้นั ใหแ สดงตําแหนงของวนั ท่นี น้ั ในป เชน 12 29 2002 จะแสดงเปน 36311. จงเขียนโปรแกรมทรี่ ับคา ตา ง ๆ จาก keyboard เฉพาะท่เี ปน 0 มากกวาศนู ย และ นอยกวา ศนู ย ให นับจาํ นวนของคา ทงั้ สามวา มอี ยา งละก่ตี วั โปรแกรมจะหยดุ ทํางานไดก ็ตอ เมื่อ user ใสข อ มูลทไี่ มใ ช ตวั เลข12. จงเขยี นโปรแกรมทร่ี บั คาระหวา ง 1 – 100 หลังจากน้นั ใหแ สดงคา ทรี่ ับเขามาในรูปแบบของ ตัวหนงั สือ เชน ถาขอ มูลนาํ เขา เปน 11 ผลลพั ธท่ไี ดคอื สบิ เอด็13. จงเขียนโปรแกรมทที่ ําการเขา รหสั ของขอ มลู ท่นี าํ เขาจาก keyboard โดยนาํ เอาตัวอกั ษรท่ีอานเขา บวกกบั คาของตัวอกั ษรทอี่ ยถู ดั ไป 2 ตวั อกั ษร mod ดว ยจาํ นวนของตวั อักษรท่มี อี ยู (26 ใน ภาษาอังกฤษ) เชน ถา คานําเขาเปน a ผลลัพธท่ไี ดจ ากการเขา รหสั จะเปน a + c ซึ่งจะมคี า เทากบั 97 + 99 = 196 % 26 = 14 ใหใ ชค านเี้ ปน ตวั บอกตาํ แหนง ของตวั อักษรทจ่ี ะแสดงไปยงั หนาจอ ซ่ึง ตัวอกั ษร ณ ตําแหนงท่ี 14 นคี้ อื n14. จงเขยี นโปรแกรมทร่ี ับคา เปนประโยคทางคณติ ศาสตร เชน 9 + 5 – 2 * 4 + 2 / 3 หลังจากน้นั ให ทาํ การประมวลผลประโยคดังกลาว ตามลําดบั ของขอ มลู ทนี่ าํ เขา15. จงเขียนโปรแกรมทร่ี ับคา เดือนทเ่ี ปนตัวเลขระหวา ง 1 – 12 หลงั จากน้นั ใหแ สดงผลเปน จาํ นวนของ วนั ท่ีมีอยใู นเดอื นดงั กลา ว16. จงหาผลลพั ธข องตัวแปร sum จาก code ทใ่ี ห class Loops6 { public static void main(String[] args) { int j = 0, k, m, n, sum = 0; while(j != 20) { k = 0; while(k != 100) { m = 0; while(m != 50) { n = 0; while(n != 10) { sum++; n++; } m++; } k++; } j++; } } }17. จงเขยี นโปรแกรมทค่ี าํ นวณหา ตวั หารรวมมาก (GCD – Greatest Common Divisor) ของตัวเลข สองตวั ทีร่ ับเขา มาจาก keyboard เชน gcd ของ 24 และ 15 คอื 3 note: gcd ของ x และ y คอื integer ทีใ่ หญท ่ีสดุ ที่หาร x และ y ลงตวั (เหลอื เศษ 0)18. จงเขยี นโปรแกรมทค่ี าํ นวณหา ตวั คูณรว มนอ ย (LCD – Least Common Multiple) ของตัวเลขสอง ตัวทร่ี บั เขา มาจาก keyboard เชน lcd ของ 24 และ 15 คือ 120 note: lcd ของ x และ y คือ integer ทนี่ อยทส่ี ดุ ทีท่ ง้ั x และ y หารลงตวั ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลัยฟารอีสเทอรน
บทที่ 3 การประมวลผลแบบวน (Repetition) 95เร่มิ ตนกบั Java19. จงเขียนโปรแกรมทห่ี า factor ของตวั เลขท่รี ับเขามาจาก keyboard เชน ถาขอมลู เทากบั 18 factor ที่ไดค อื 2 3 และ 3 (8 = 2 * 3 * 3) ภาควิชาคอมพิวเตอรธรุ กิจ วทิ ยาลัยฟารอ ีสเทอรน
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246