java basic th ch2 variables&expressions

54
intro. to Java (FEU.faa) ในบทที่สองนี้เราจะมาทําความเขาใจในเรื่องของชนิดขอมูลทีJava มีไวในการรองรับการเขียน โปรแกรม ทั้งขอมูลที่เปนตัวเลข และขอมูลที่เปนตัวอักษร เราจะทดลองเขียนโปรแกรมดวยขอมูล ชนิดตาง นีหลังจากจบบทเรียนนี้แลว ผูอานจะไดทราบถึง o วิธีการประกาศตัวแปร (variable declaration) ที่มีชนิดเปน integer และ floating-point o วิธีการประกาศตัวแปรที่มีชนิดเปน character และ boolean o วิธีการกําหนด (assignment) คาใหกับตัวแปรตาง o การสรางประโยค (statement หรือ expression) o การประมวลผล (calculation และ evaluation) ที่เกี่ยวกับตัวแปรชนิดตาง o การเปลี่ยนแปลง (casting) ชนิดของขอมูล o การแสดงผลดวยการใช printf() และ format() o การใชฟงคชั่นทางคณิตศาสตร (Mathematical Functions) ทีJava มีให กอนที่เราจะพูดถึงขอมูลและการประมวลผลขอมูล เราควรกลับไปดูถึงโครงสรางที่จําเปนตองมีในการ เขียนโปรแกรมดวย Java public class ClassName { public static void main(String[] args) { program statements } } Java โปรแกรมทุกตัว (ที่ไมใช applet) ตองมี method ที่ชื่อ main() ที่มีรูปแบบดังที่เห็นดานบนนีClassName จะเปนทั้งชื่อของ class และชื่อของไฟลที่เก็บโปรแกรมนีสวน program statements จะเปนชุดคําสั่งที่อยูในโปรแกรม 2.1 ขอมูล และ ตัวแปร (data and variable) โดยทั่วไปถาเราตองการคํานวณหาคาทางคณิตศาสตร เชน 354 + 45 * 12 เรามักจะใชเครื่องคิด เลข หรือไมก็ใชวิธีคิดในกระดาษ ซึ่งวิธีคิดแบบที่สองนี้เราใชกระดาษเปนตัวกลางในการหาคานั้น กลาวคือ เราใชกระดาษเปนที่เก็บตัวเลขที่ตองการหาคา รวมไปถึงผลลัพธของการหาคานั้น ดวย เชนเดียวกับการเขียนโปรแกรมทางคอมพิวเตอร คาตาง เหลานี้จําเปนจะตองมีที่เก็บ และที่เก็บ ขอมูลเหลานี้ตองเปนที่เก็บที่สามารถรองรับการประมวลผล หรือ การคํานวณไดอยางพอเพียง ดังนั้นในการเขียนโปรแกรม เราจึงตองใชตัวแปรเปนที่เก็บขอมูลตาง ที่เราจะตองใชในการ ประมวลผล ตัวแปรที่วานี้เปนสัญลักษณแทนหนวยความจํา (memory) ที่อยูในเครื่อง และ compiler จะเปนผูกําหนดวาอยูที่ใด มีขนาดเทาใด (address เริ่มตน และ offset) ที่เก็บขอมูลนี้จะเก็บขอมูล ไดเพียงชนิดที่เราไดกําหนดไว เพียงชนิดเดียวเทานั้น ขอมูลถูกแบงออกตามชนิดของขอมูล หลัก คือ ขอมูลที่เปนตัวเลข และ ขอมูลที่ไมใชตัวเลข แตจะแบงยอย ลงไปอีก เชน ถาเรากําหนดใหตัว แปรตัวใดตัวหนึ่งเก็บขอมูลชนิดที่เปนตัวเลขในแบบของ integer (จํานวนเต็ม เชน 2, 45, 90 เปน ตน) เราก็ไมสามารถที่จะนําเอาขอมูลที่เปนตัวเลขในรูปแบบอื่น เชน double หรือ float (เลขที่มีจุด ทศนิยม เชน 2.35, 3.00 เปนตน) มาเก็บไวในตัวแปรนี้ได เนื่องจากวาขอมูลที่ตัวแปรเก็บไดนั้นมี ขนาดตายตัว ตามการออกแบบของภาษา ดังนั้น การนําเอาขอมูลชนิดอื่นมาใสไวในตัวแปรนี้จะถูก ตรวจสอบโดย compiler และ compiler จะฟองไปยังผูเขียนโปรแกรมทันที

Upload: pongnat

Post on 06-Dec-2015

235 views

Category:

Documents


0 download

DESCRIPTION

JAVA Basic Th Ch2 Variables&Expressions

TRANSCRIPT

Page 1: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

ในบททสองนเราจะมาทาความเขาใจในเรองของชนดขอมลท Java มไวในการรองรบการเขยนโปรแกรม ทงขอมลทเปนตวเลข และขอมลทเปนตวอกษร เราจะทดลองเขยนโปรแกรมดวยขอมลชนดตาง ๆ น หลงจากจบบทเรยนนแลว ผอานจะไดทราบถง

o วธการประกาศตวแปร (variable declaration) ทมชนดเปน integer และ floating-point o วธการประกาศตวแปรทมชนดเปน character และ boolean o วธการกาหนด (assignment) คาใหกบตวแปรตาง ๆ o การสรางประโยค (statement หรอ expression) o การประมวลผล (calculation และ evaluation) ทเกยวกบตวแปรชนดตาง ๆ o การเปลยนแปลง (casting) ชนดของขอมล o การแสดงผลดวยการใช printf() และ format() o การใชฟงคชนทางคณตศาสตร (Mathematical Functions) ท Java มให

กอนทเราจะพดถงขอมลและการประมวลผลขอมล เราควรกลบไปดถงโครงสรางทจาเปนตองมในการเขยนโปรแกรมดวย Java public class ClassName { public static void main(String[] args) { program statements } }

Java โปรแกรมทกตว (ทไมใช applet) ตองม method ทชอ main() ทมรปแบบดงทเหนดานบนน ClassName จะเปนทงชอของ class และชอของไฟลทเกบโปรแกรมน สวน program statements จะเปนชดคาสงทอยในโปรแกรม 2.1 ขอมล และ ตวแปร (data and variable) โดยทวไปถาเราตองการคานวณหาคาทางคณตศาสตร เชน 354 + 45 * 12 เรามกจะใชเครองคดเลข หรอไมกใชวธคดในกระดาษ ซงวธคดแบบทสองนเราใชกระดาษเปนตวกลางในการหาคานน ๆ กลาวคอ เราใชกระดาษเปนทเกบตวเลขทตองการหาคา รวมไปถงผลลพธของการหาคานน ๆ ดวย เชนเดยวกบการเขยนโปรแกรมทางคอมพวเตอร คาตาง ๆ เหลานจาเปนจะตองมทเกบ และทเกบขอมลเหลานตองเปนทเกบทสามารถรองรบการประมวลผล หรอ การคานวณไดอยางพอเพยง ดงนนในการเขยนโปรแกรม เราจงตองใชตวแปรเปนทเกบขอมลตาง ๆ ทเราจะตองใชในการประมวลผล ตวแปรทวานเปนสญลกษณแทนหนวยความจา (memory) ทอยในเครอง และ compiler จะเปนผกาหนดวาอยทใด มขนาดเทาใด (address เรมตน และ offset) ทเกบขอมลนจะเกบขอมลไดเพยงชนดทเราไดกาหนดไว เพยงชนดเดยวเทานน ขอมลถกแบงออกตามชนดของขอมล หลก ๆ คอ ขอมลทเปนตวเลข และ ขอมลทไมใชตวเลข แตจะแบงยอย ๆ ลงไปอก เชน ถาเรากาหนดใหตวแปรตวใดตวหนงเกบขอมลชนดทเปนตวเลขในแบบของ integer (จานวนเตม เชน 2, 45, 90 เปนตน) เรากไมสามารถทจะนาเอาขอมลทเปนตวเลขในรปแบบอน เชน double หรอ float (เลขทมจดทศนยม เชน 2.35, 3.00 เปนตน) มาเกบไวในตวแปรนได เนองจากวาขอมลทตวแปรเกบไดนนมขนาดตายตว ตามการออกแบบของภาษา ดงนน การนาเอาขอมลชนดอนมาใสไวในตวแปรนจะถกตรวจสอบโดย compiler และ compiler จะฟองไปยงผเขยนโปรแกรมทนท

Page 2: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

22

การประกาศตวแปรนน ผเขยนโปรแกรมจะใชสญลกษณใด ๆ กไดท Java ยอมใหใช ซงตองอยในกฎเกณฑ ตอไปน 1. ตองขนตนดวยตวอกษร (letter) หรอ เครองหมาย _ (underscore) หรอ เครองหมาย $ (dollar

sign) 2. เครองหมายอน ๆ ทตามมาเปนไดทง ตวอกษร ตวเลข และ สญลกษณอน ๆ ทไมไดถกใชโดย

Java (เชน operator ตาง ๆ ท Java ใชดงตวอยางของการ + (บวก) – (ลบ) * (คณ) / (หาร) เปนตน)

ตวอยางของตวแปรทถกตอง taxRate pricePerUnit _timeInSecond $systemClock unit897 เนองจากวา Java ไดออกแบบใหผใชสามารถทจะกาหนดตวแปรใหเปน Unicode1 เพอเปดโอกาสใหการออกแบบตวแปรเปนไปไดในภาษานน ๆ ของ ผเขยนโปรแกรม เราจงสามารถทจะใชตวแปรทเปนภาษาไทยได สงทเราตองคานงถงกคอ text editor ทเราใชในการเขยน code ตองยอมใหเราใชภาษาไทยดวย ในบทนและบทอน ๆ ของตารานจะใชตวแปรทเปนภาษาองกฤษเทานน เพอใหงายตอการเขยน และการทาความเขาใจในเนอหาไดรวดเรวขน โดยทวไปเราจะเรยกตวแปรทไดกาหนดใหเกบขอมลชนดใด ชนดหนงวา variable หรอ identifier และ identifier ทวาน มความยาวเทาไรกได (จานวนของตวอกษร) แตกตองอยภายใตขอกาหนดทไดกลาวมาแลว พรอมกนน ตวแปรทสรางขนจะตองไมใชคาเฉพาะ (keyword หรอ reserved word) ท Java ไดสรางขนไวใชงาน ดงทแสดงในตาราง 2.1 ตารางท 2.1 keyword abstract const finally interface return throws assert continue float long short transient boolean default for native static try break do goto new strictfp void byte double if null super volatile case else implements package switch while catch enum import private synchronized char extends instanceof protected this class final int public throw

2.2 ชนดของขอมล (Data Type) ในการประกาศตวแปรทกครงเราจะตองบอกชนดของขอมลใหกบ ตวแปรนนดวย ซงการประกาศตวแปรนน ตองเรมตนดวย ชนดของขอมล (datatype) และตามดวย ชอของตวแปร (identifier หรอ variable) ตามรปแบบทกาหนดดงน datatype identifier โดยท datatype คอชนดของขอมลท ตวแปรสามารถเกบได และในภาษา Java datatype เปนไดทง ขอมลทเรยกวา ขอมลพนฐาน (primitive datatype) และขอมลทเปนขอมลอางอง (reference type) ซงเราจะไดมาดกนเมอเราพดถงเรองของ class และ object Java กาหนดใหม primitive datatype จานวนทงสน 8 ชนดซงสามารถแบงออกเปนกลมได 4 กลม ดงน (ดตารางท 2.2)

1 มความจ 2 byte เพอรองรบภาษาทใชกนในประเทศตาง ๆ (เดมใช ASCII ซงมความจเพยง 1 byte)

Page 3: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

23

1. ตรรกะ (Logical) – boolean 2. ตวอกษร (Textual) – char 3. เลขจานวนเตม (Integral) – byte, short, int, และ long 4. เลขทมจดทศนยม (Floating point) – double และ float

ตาราง 2.2 ขอมลพนฐาน (primitive datatype) datatype คาอธบาย ขนาด (bit) boolean คาทางตรรกะ มคาเปน true หรอ false byte ตวเลขทไมมจดทศนยม 8 short ตวเลขทไมมจดทศนยม 16 int ตวเลขทไมมจดทศนยม 32 long ตวเลขทไมมจดทศนยม 64 float ตวเลขทมจดทศนยม 32 double ตวเลขทมจดทศนยม 64 char ตวอกษร 16

ขนาดของ datatype จะเปนตวกาหนดคาทเราสามารถเกบไดในตวแปรทไดประกาศในโปรแกรม ยงจานวนของ bit มากเทาไรเรากสามารถเกบคาสง ๆ ได ตารางท 2.3 แสดงคาตาง ๆ ทสามารถเกบไดใน datatype ชนดตาง ๆ ตาราง 2.3 คาทเกบไดใน primitive datatype ตาง ๆ datatype คาตาสด คาสงสด byte -128 (-27) 127 (27 - 1) short -32768 (-215) 32767 (215 - 1) int -2147483648 (-231) 2147483647 (231 - 1) long -9223372036854775808 (-263) 9223372036854775807 (263 - 1) float -3.4 x 1038 3.4 x 1038 double -1.7 x 10308 1.7 x 10308

2.3 ตวอยางการประกาศตวแปร int numberOfBikes; float taxRate; double interests, PI; boolean yesOrNo; char response;

โดยทวไปนกพฒนาโปรแกรมมกจะใช ตวอกษรตวเลกเปนตวเรมตนของตวแปร และจะเปลยนเปนอกษรตวใหญเมอคานน ๆ สนสดลง เชนการประกาศตวแปรทเหนดานบนน อกวธหนงทหลาย ๆ คนชอบใช คอการใชเครองหมาย _ (underscore) เปนตวแบงคา เชน int number_of_bikes; float tax_rate; double cum_gpa; boolean yes_or_no;

ทงนและทงนน การประกาศตวแปรทงสองวธทาใหการอานตวแปรทาไดงายขน แตสงสาคญทเราจาเปนจะตองคานงถงในการประกาศตวแปรกคอ การเลอกใชคาทสอถงความหมายของขอมลทตวแปรนน ๆ รองรบ หรอ เกบอย เชน ถาเราตองการเกบขอมลทเปนเกรดทเปนตวอกษร เรากควรใช ตวแปรทสอถงเกรดทเปนตวอกษร เชน คาวา letterGrade และถาเราตองการเกบเกรดทเปนคาเฉลยเรากควรใช ตวแปร เชน gpa หรอ cumulativeGPA เปนตน 2.3.1 การกาหนดคาใหกบตวแปร (Assignment) หลงจากทเราไดประกาศตวแปรสาหรบการใชงานแลว เราจะตองกาหนดใหตวแปรทเราสรางขนมคาเบองตนสาหรบการใชงานนน ๆ ไมเชนนนแลว Java จะฟองถงความผดพลาดทเกดขน ดงเชนทเกดขนกบโปรแกรมตวอยางน

Page 4: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

24

1: class TestDefault { 2: public static void main(String[] args) { 3: byte bt; 4: short st; 5: int in; 6: long ln; 7: float ft; 8: double db; 9: char ch; 10: boolean bo; 11: 12: System.out.println(ch); 13: System.out.println(bt); 14: System.out.println(st); 15: System.out.println(in); 16: System.out.println(ln); 17: System.out.println(ft); 18: System.out.println(db); 19: System.out.println(bo); 20: } 21: }

หลงจากทเรา compile โปรแกรม error ทเราไดคอ TestDefault.java:12: variable ch might not have been initialized System.out.println(ch); ^ TestDefault.java:13: variable bt might not have been initialized System.out.println(bt); ^ TestDefault.java:14: variable st might not have been initialized System.out.println(st); ^ TestDefault.java:15: variable in might not have been initialized System.out.println(in); ^ TestDefault.java:16: variable ln might not have been initialized System.out.println(ln); ^ TestDefault.java:17: variable ft might not have been initialized System.out.println(ft); ^ TestDefault.java:18: variable db might not have been initialized System.out.println(db); ^ TestDefault.java:19: variable bo might not have been initialized System.out.println(bo); ^ 8 errors

ผอานจะเหนวา Java ไมยอมใหเราใชตวแปรเหลานถาไมมการกาหนดคากอน ดงนนเราจงจาเปนทจะตองกาหนดคาเบองตนของตวแปรกอนการใชทกครง2 การกาหนดคาใหกบตวแปรนนทาไดดวยการใชเครองหมาย = (เรยกกนวา assignment operator) ซงมความหมายวา "ใหนาคาทางขวามอ (rvalue) ของเครองหมาย = ไปเกบไวในตวแปรทอยทางดานซายมอ (lvalue) ของเครองหมาย =" rvalue สามารถเปนไดทง คาคงท ตวแปร หรอ

2 Java เรยกตวแปรทมการประกาศใชภายใน method (เชน method main() ทเหน) วา local variable ซงเปนการประกาศใชทตองการกาหนดคาเบองตนกอน แตมตวแปรอกแบบหนงท Java เรยกวา member variable หรอ reference variable (เชน variable ทอยใน class) ทไมจาเปนตองมการกาหนดคาผานเรา แต Java จะกาหนดคาเบองตนใหกบตวแปรเหลานนเอง ซงมคาตาง ๆ ดงน ชนดของตวแปร คาเบองตนจาก Java boolean false char '0' byte, short, int, long 0 double, float 0.0

Page 5: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

25

ประโยคใด ๆ ทสามารถหาคาได สวน lvalue เปนไดเฉพาะตวแปรเทานน เพราะจะตองเปนททเกบขอมลได (physical memory) เชน numberOfBikes = 2; area = PI * r * r; taxReturned = calculateTaxReturned(income);

แตไมใชแบบน 2 = numberOfBikes; PI * r * r = area; calculateTaxReturned(income) = taxReturned;

ในการกาหนดคาใหกบตวแปรนน ถาเรามองในมมมองของทมาของคาทนามาใสใหกบตวแปร เรากสามารถทจะแบงการกาหนดคาไดเปนสองแบบ คอ (1) การกาหนดคาใหกบตวแปรภายในตวโปรแกรม และ (2) การกาหนดคาใหกบตวแปรผานทางสอการนาเขาขอมลมาตรฐาน (standard I/O channel) เราจะมาทาความเขาใจการกาหนดคาในแบบทหนงกนกอน เพราะเปนการกาหนดคาทงายทสด 2.3.2 การกาหนดคาใหกบตวแปรภายในโปรแกรม ดงทไดกลาวมาแลววาการกาหนดคาใหกบตวแปรนนสาคญมาก เพราะโดยทวไปตวแปรจะไมมคาใด ๆ เลยหลงจากการประกาศ ภาษาในการเขยนโปรแกรมหลาย ๆ ภาษาบงคบใหผเขยนโปรแกรมกาหนดคาเบองตน กอนทจะใชตวแปรนน ๆ ซงกเปนสงทด เพราะจะทาใหการเขยนโปรแกรมเปนไปไดงาย และสะดวกตอการตรวจสอบหากมขอผดพลาดเกดขน โปรแกรมตวอยางทเหนนแสดงถงวธการประกาศตวแปรพรอมกบการกาหนดคาเบองตนใหกบตวแปรเหลานน

1: /** 2: Demonstrates variables declaration and initialization 3: */ 4: 5: class Variables { 6: public static void main(String[] args) { 7: boolean booleanVar = true; 8: byte byteVar = 0; 9: byte maxByte = Byte.MAX_VALUE; 10: byte minByte = Byte.MIN_VALUE; 11: short shortVar = 0; 12: short maxShort = Short.MAX_VALUE; 13: short minShort = Short.MIN_VALUE; 14: int intVar = 0; 15: int maxInt = Integer.MAX_VALUE; 16: int minInt = Integer.MIN_VALUE; 17: long longVar = 0L; 18: long maxLong = Long.MAX_VALUE; 19: long minLong = Long.MIN_VALUE; 20: float floatVar = 0.0F; 21: float maxFloat = Float.MAX_VALUE; 22: float minFloat = Float.MIN_VALUE; 23: double doubleVar = 0.0D; 24: double maxDouble = Double.MAX_VALUE; 25: double minDouble = Double.MIN_VALUE; 26: char charVar = 'A'; 27: 28: System.out.println("boolean variable: " + booleanVar); 29: System.out.println("byte variable: " + byteVar); 30: System.out.println("short variable: " + shortVar); 31: System.out.println("int variable: " + intVar); 32: System.out.println("long variable: " + longVar); 33: System.out.println("float variable: " + floatVar); 34: System.out.println("double variable: " + doubleVar); 35: System.out.println("char variable: " + charVar); 36: 37: System.out.println("Max byte: " + maxByte); 38: System.out.println("Min byte: " + minByte); 39: System.out.println("Max short: " + maxShort); 40: System.out.println("Min short: " + minShort); 41: System.out.println("Max int: " + maxInt);

Page 6: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

26

42: System.out.println("Min int: " + minInt); 43: System.out.println("Max long: " + maxLong); 44: System.out.println("Min long: " + minLong); 45: System.out.println("Max float: " + maxFloat); 46: System.out.println("Min float: " + minFloat); 47: System.out.println("Max double: " + maxDouble); 48: System.out.println("Min double: " + minDouble); 49: } 50: }

เรากาหนดคาทเปนศนยใหกบตวแปรทกตว ยกเวนตวแปรทเปน boolean ซงเรากาหนดคาใหเปน true และตวแปรทเปน char ทเรากาหนดคาใหเปนตวอกษร A สวนตวแปรทขนตนดวย max หรอ min เราจะกาหนดคาใหเปนคาสงสด และคาตาสดท Java มให เราบอกให Java รวาคาทกาหนดใหกบตวแปรตาง ๆ มชนดเปนอะไรไดดวยการใสตวอกษรทบงบอกชนดนน ๆ ของตวแปร เชน 0L 0.0F และ 0.0D ซงหมายถง คาของศนยทเปน long คาของศนยทเปน float และ คาของศนยทเปน double ตามลาดบ ทงนเพอบอกให Java รวาเราตองการใชคาทเกบชนดนน ๆ จรง ซงเราจาเปนทจะตองทาเพยงคาของตวแปรทเปน float และ double เทานน เพราะวาตวแปรทมชนดเปน float ถามการกาหนดคา Java จะเหมาเอาวาเปน double เราจงตองกาหนดคาตามชนดของตวแปรจรง ๆ ทเราตองการ สวนตวแปรอน ๆ เรากาหนดใหมคาเปน คาสงสดและคาตาสดท Java ยอมใหเปนได ผลลพธของโปรแกรม Variables.java boolean variable: true byte variable: 0 short variable: 0 int variable: 0 long variable: 0 float variable: 0.0 double variable: 0.0 char variable: A Max byte: 127 Min byte: -128 Max short: 32767 Min short: -32768 Max int: 2147483647 Min int: -2147483648 Max long: 9223372036854775807 Min long: -9223372036854775808 Max float: 3.4028235E38 Min float: 1.4E-45 Max double: 1.7976931348623157E308 Min double: 4.9E-324 เรามาดขนตอนท Java เกบขอมลในตวแปรกนดกวา (หากจะบอกวาภาษาอน ๆ กเกบแบบนกคงจะไมผดนก) เราจะใชตวแปรจากโปรแกรมตวอยางขางบน จากประโยคของการประกาศและกาหนดคา long longVar = 0L;

ประโยคทเหนดานบนนสามารถทจะเขยนไดอกแบบหนงคอ long longVar; longVar = 0L;

ประโยค long longVar; นนเปนการประกาศตวแปรชอ longVar ทมชนดเปน long สวนประโยค longVar = 0L; นนเปนการกาหนดคา 0 ใหกบตวแปร longVar (ภาพท 2-1 แสดงถงขนตอนในการสรางตวแปรและการกาหนดคาใหกบตวแปรของ Java) การประกาศพรอมกบกาหนดคาใหกบตวแปรในประโยคเดยวกน ชวยใหการเขยน code เมอมองดแลวสวยและกะทดรดขน ทงนกคงจะขนอยกบตวผอานเองวามความคดเหนอยางไร สาหรบตวผเขยนเองคดวาถาเปนการประกาศทมตวแปรไมกตวในบรรทดนนกคงมองดแลวสวยด แตถามมากเกนไปกคงจะไมเขาทาเทาไรนก ตวอยางเชน double price = 0.0D, tax = 0.7D, returned = 0.0D, interests = 0.0D, principal = 10000.0D;

โปรแกรมเมอรควรจะแยกการประกาศทเหนดานบนนใหอยคนละบรรทดเพอใหงายตอการอาน และเปลยนแปลง หากมการเปลยนแปลงเกดขนในโปรแกรม

Page 7: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

27

ภาพท 2-1 การกาหนดคาใหกบตวแปร

ในการกาหนดคาใหกบตวแปรนน เราไมจาเปนทจะตองกาหนดคาของตวแปรตาง ๆ ใหเปนศนย เราสามารถทจะกาหนดคาอะไร กไดใหกบตวแปรเหลาน ทงนขนอยกบการใชงานของตวแปรนน ๆ หลาย ๆ ครงทเราตองตดสนใจวาควรจะใชตวแปรชนดใดด ในกรณทขอมลเปนชนดทอยในหมวดเดยวกน เชน ขอมลเปนเลขทไมมจดทศนยม หรอ ขอมลเปนเลขทมจดทศนยม ซงถาเหตการณเหลานเกดขน เรากจาเปนทจะตองคดถงคาความเปนไปไดของขอมลวาตาสดและสงสดควรเปนเทาใด (range) เชน ถาเราตองการใชตวแปรรองรบขอมลทเปนเลขทไมมจดทศนยมทมขนาดไมเกน 127 เรากควรทจะประกาศตวแปรดวยการใช byte แทนการใช int เปนตน เราสามารถทจะประกาศตวแปรพรอมกบการกาหนดคาใหกบตวแปร หลาย ๆ ตวในหนงประโยค เชน int length = 2, height = 8, width = 4; double angles = 30.5, distance = 24.50;

การประกาศตวแปรในรปแบบนตองใชเครองหมาย , (comma) เปนตวแบงตวแปรออกจากกน และตวแปรเหลานนจะมชนดเปนชนดเดยวกนตลอด เราไมสามารถประกาศตวแปรตางชนดกนไดดวยวธการประกาศแบบน เชน int cats = 90, float tax = 0.50; // ERROR – mixed-type

การประกาศตวแปรไมจาเปนตองกาหนดคาใหทนท แตสามารถทจะกาหนดไดภายหลง เชน double radius; radius = 2.54;

ลองมาดการประกาศและกาหนดคาในรปแบบอกรปแบบหนง int one = 1, two = 2, three = one + two;

Java ยอมใหมการประกาศและกาหนดคาแบบนได เนองจากวา ตวแปร one และ two มการกาหนดคาเรยบรอยแลว ดงนน การประกาศและกาหนดคาใหกบตวแปร three จงทาไดโดยไมมปญหาใด ๆ จาก compiler เลย ประโยค three = one + two; เปนประโยคทมการประมวลผลของ one + two กอนแลวจงนาคาทไดมาเกบไวทตวแปร three เราจะพดถง ประโยค และ การประมวลผลทเกดขนในประโยคในโอกาสตอไป 2.4 การใช final ในการกาหนดคาใหกบตวแปร หลาย ๆ ครงทเราตองการใชคาบางคาตลอดอายการทางานของโปรแกรม เชน คาของ PI หรอ คาคงททจะไมมการเปลยนแปลงใด ๆ ในขณะใชงานในโปรแกรม Java มคาสงท user ไมสามารถทนามาใชในการประกาศตวแปรได (reserved word) แตเอาไวใชในงานนโดยเฉพาะ คอ คาวา final

long longVar;

??? 0

longVar = 0L;

ประกาศตวแปรชนด long ชอวา longVar ซง Java จะจองหนวยความจาใหแตไมมคาใด ๆ ณ หนวยความจานน

หลงจากกาหนดคา 0 ใหกบ longVar แลวหนวยความจา ณ ตาแหนงนนกจะมคาตามทกาหนดให คอ 0

Page 8: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

28

ถาเราขนตนการประกาศตวแปรดวยคาวา final ตวแปรนน ๆ จะไมสามารถมคาอน ๆ ไดอก ไมวาจะเปนการเปลยนคาภายในโปรแกรม หรอ การเปลยนแปลงทเกดจากการใสขอมลใหมผานทาง keyboard ดงโปรแกรมตวอยางทแสดงใหเหนน

1: /** 2: Demonstrates the use of final keyword 3: */ 4: 5: class Final { 6: public static void main(String[] args) { 7: final double PI = 3.14; 8: int radius = 2; 9: 10: System.out.println("The value of PI is " + Math.PI); 11: 12: double area = radius * radius * Math.PI; 13: System.out.println("Area of a circle is " + area); 14: } 15: }

หลงจากท compile และ run โปรแกรม ผลลพธทไดคอ The value of PI is 3.14 Area of a circle is 12.56

ถาเราเปลยนแปลงโปรแกรม Final.java ดวยการกาหนดคาใหกบตวแปร PI ใหม ดงทเหนในโปรแกรม FinalWithError.java น compiler จะฟองดวยขอมลดงทเหน

1: /** 2: Changing the value of final keyword 3: */ 4: 5: class FinalWithError { 6: public static void main(String[] args) { 7: final double PI = 3.14; 8: int radius = 2; 9: 10: double area = radius * radius * PI; 11: System.out.println("Area of a circle is " + area); 12: 13: PI = 3.142; 14: area = radius * radius * PI; 15: System.out.println("Area of a circle is " + area); 16: } 17: }

ผลของการ compile FinalWithError.java:13: cannot assign a value to final variable PI PI = 3.142; ^ 1 error

ขออธบายถงขอความ error ท Java ฟองสกนดหนอย ถาผอานสงเกต error ทเกดขนจะเหนเลข 13 ถดจากชอของโปรแกรมทไดรบการ compile ซงบงบอกถงเลขทบรรทดท error นเกดขน รวมไปถงตาแหนงท error เกดขนซงเปนตวชวยใหเรากลบเขาไปแกไขโปรแกรมของเราไดงายยงขน (ไมตองเสยเวลาคนหาบรรทดทเกด error) การใช final ทาใหโปรแกรมมความแมนยาและมนคงมากยงขน ความพยายามทจะเปลยนคาเหลานกไมสามารถทาได ทาใหการออกแบบและพฒนาโปรแกรมเปนไปไดดวยด ลดขอผดพลาดทอาจเกดขนจากตวโปรแกรมเมอรเอง ในบางครงการประกาศตวแปรตองการใชคาทสงมาก ๆ หรอ คาทเลกมาก ๆ เชน ระยะทางจากโลกไปยงดวงอาทตย ซงมคาโดยประมาณเทากบ 149, 600,000 กโลเมตร (1.496 x 108) หรอ การกาหนดคาของมวลของอเลคตรอน (electron mass) ซงมคาเลกมาก ขนาดของมวลโดยประมาณม

Page 9: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

29

คาเทากบ 0.0000000000000000000000000009 กรม (9.0 x 10-28) เรากสามารถทาไดดวยการใชการประกาศในรปแบบของการกาหนดคาทางวทยาศาสตร (scientific notation) เชน final double sunDistance = 1.496E8; // 1.496 x 108 final float electronMass = 9.0E-28F; // 9.0 x 10-28

การประกาศและกาหนดคาในรปแบบนทาใหการมองเหน และ การเขยนหรอการอานทาไดงายยงขน ลองนกถงการทเราตองเขยนประโยคในการกาหนดคาใหกบ มวลของอเลคตรอน ทไดกลาวถงขางตนซงมศนยถง 27 ตววานาราคาญขนาดไหน (โปรแกรมเมอรสวนใหญรเรองนด) ยงถาเราเขยน code เยอะ ๆ การกาหนดคาใหกบตวแปรเหลานดวยการเขยนทสนทสดยอมเปนการดเสมอ (เขยนโปรแกรมไดไวขน?) 2.5 อาย และ ขอบเขตการใชงาน (life-time and scope) ของตวแปร หลงจากทมการประกาศใชตวแปรใด ๆ ในโปรแกรม ตวแปรเหลานจะมขอบเขต หรออายการใชงานตามลกษณะการประกาศตวแปรของผเขยนโปรแกรมเอง โดยทวไปตวแปรจะมอายการใชงานตามเนอท (block) ทตวแปรเหลานนปรากฏอย ซงจะอยในเครองหมาย {} เชนโปรแกรมตวอยางตอไปน

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope { 6: public static void main(String[] args) { 7: int x = 5, y = 8; 8: 9: System.out.print("Value of x is "); 10: System.out.println(" Value of y is " + y); 11: //create scope for x and w 12: { 13: int x = 45; 14: int w = 89; 15: System.out.println("Value of w in brackets is " + x); 16: System.out.println("Value of y in brackets is " + y); 17: } 18: //error w is out of scope 19: System.out.println("Value of w is " + w); 20: } 21: }

เปนทแนนอนอยแลววาโปรแกรม Scope.java จะ compile ไมผาน เนองจากเหตผลสองอยางดงท compiler ฟอง คอ (1) ตวแปร int x ไดมการประกาศใน main() แลว และ (2) ตวแปร int w ไมไดอยใน scope ของมนเอง ซงในทนคอ block ทมการประการ int x และ int w Scope.java:13: x is already defined in main(java.lang.String[]) int x = 45; ^ Scope.java:19: cannot find symbol symbol : variable w location: class Scope System.out.println("Value of w is " + w); ^ 2 errors

ในภาษาอน เชน C++ การประกาศตวแปรใน block ใหมดวยตวแปรทมชอซากนสามารถทาไดโดยไมมเงอนไขใด ๆ (ดงทเหนในโปรแกรม Scope.java) แตตว Java เองไมยอมใหมการประกาศตวแปรซาถงแมวาจะอยใน block ใหมทซอนกนอยกตาม ยกเวนในกรณทเราสราง block ใหมทไมซอนกน ดงทเหนน { int w = 3; } { int w = 5; }

Page 10: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

30

ลองมาดโปรแกรม Scope2.java

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope2 { 6: static int x = 8, y; 7: public static void main(String[] args) { 8: { 9: int x; 10: x = 5; 11: y = x; 12: System.out.println("Value of y is " + y); 13: } 14: y = x; 15: System.out.println("Value of y is " + y); 16: } 17: }

โปรแกรม Scope2.java หลงจากท compile ผานแลวจะไดผลลพธดงน Value of y is 5 Value of y is 8

จะเหนวา compiler ยอมใหผานทงนเพราะตวแปร x ใน block ดานในมการประกาศและกาหนดคาอยางสมบรณ และ ตวแปร x ใน scope ดานนอกมการกาหนดใหเปน static ซงเปนตวแปรท Java เรยกวา class variable ดงนนตวแปรทงสองจงไมใชตวแปรเดยวกน เพราะฉะนนการกาหนดคาใหกบตวแปร y ใน block ดานในจะไดคาของตวแปร x ทอยดานใน และการกาหนดคาใหกบ y อกครงดานนอกจงไดคาของ class variable ทชอวา x เรามาลองดโปรแกรมตวอยางอกโปรแกรมหนง

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope2v1 { 6: static int x = 8, y; 7: public static void main(String[] args) { 8: { 9: x = 5; 10: y = x; 11: System.out.println("Value of y is " + y); 12: } 13: y = x; 14: System.out.println("Value of y is " + y); 15: } 16: }

โปรแกรม Scope2v1.java แสดงการใชตวแปร x ตวเดยวทไดประกาศกอน method main() ซงมคาเปน 8 ดงนนการเปลยนคาของ x ใน block ดานในทาใหคาของตวแปร x เปนคาลาสดคอ 5 ผลลพธของการ run โปรแกรมนจงไดอยางทคาดหวงไว คอ Value of y is 5 Value of y is 5

ลองมาดอกตวอยางหนง

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope3 { 6: static int x = 20; 7: public static void main(String[] args) { 8: System.out.println("x = " + x);

Page 11: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

31

9: int x = (x = 12) + 8; 10: System.out.println("Value of local x is " + x); 11: } 12: }

ในโปรแกรม Scope3.java นเราประกาศตวแปรสองตวทมชอเหมอนกนคอ x โดยทตวหนงม scope อยใน class Scope3 และอกตวหนงม scope อยใน method main() และเมอ compile ผานแลวผลลพธทได คอ x = 20 Value of local x is 20

ในบรรทดท 8 การแสดงผลทเกดขนเปนการแสดงผลของตวแปร x ทอยภายนอก main() สวนการแสดงผลในบรรทดท 10 เปนการแสดงผลของตวแปร x ทเราไดประกาศใชภายใน main() ซงเปนคนละตวกนเหมอนทไดกลาวไวแลว

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope4 { 6: public static void main(String[] args) { 7: int x = (x = 12) + 8; 8: System.out.println("Value of local x is " + x); 9: } 10: }

โปรแกรม Scope4.java เปนโปรแกรมเดยวกนกบโปรแกรม Scope3.java เพยงแตเราลบการประกาศตวแปรทอยดานนอกออก และเมอ compile และ run ผลลพธทไดกคอผลลพธเดมทไดจากโปรแกรม Scope3.java ลองมาดอกตวอยางหนง

1: /** 2: Showing scope of variables 3: */ 4: 5: class Scope6 { 6: public static void main(String[] args) { 7: int x = 12, y = x + 8; 8: System.out.println("Value of local y is " + y); 9: } 10: }

ซงไดผลลพธหลงจากการ compile และ run ดงน Value of local y is 20

การประกาศและกาหนดคาแบบนสามารถทาไดเพราะ x ไดรบการกาหนดคากอนทจะถกนามาใชในการประกาศและกาหนดคาใหกบตวแปร y การประกาศและกาหนดคาใหกบตวแปรใด ๆ นนจะตองคานงถงการใช และขอบเขตของการใชเสมอ ทงนในการกาหนดคาใด ๆ ใหกบตวแปรนนสงทนามากาหนดคานนในตวของมนเองจะตองมคาอยแลว หรอสามารถทจะทาการประมวลคาไดกอนทจะนามาใชในการกาหนดคาใหกบตวแปรอน ดงเชนตวอยางทเหนกอนหนาน 2.6 การสรางประโยค (statement and expression) ในภาษา Java ประโยค (statement) จะตองจบดวยเครองหมาย ; (semicolon) เสมอดงตวอยางทแสดงใหเหนน int priceOfBook = 125; float taxReturn;

Page 12: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

32

เราไมจาเปนจะตองเขยนประโยคใหจบภายในบรรทดเดยว แตทสาคญตองมเครองหมาย ; ปดทายเสมอ เชน int priceOfBook = 125 ;

Java จะมองหาเครองหมาย ; เสมอโดยไมแยแสวาประโยคนน ๆ จะกนเนอทกบรรทด แตทสาคญกคอการเขยนททาใหอานไดงาย ยอมจะทาใหทงเรา และผอนสามารถทจะด code ไดรวดเรวยงขน ถาไมเชอลองด code จากโปรแกรมนดส /* Scope2v1.java - Showing scope of variables* @author faa xumsai*/class Scope2v1{static int x = 8, y;public static void main(String[] args) { {int x;x = 5;y = x;System.out.println("Value of y is " + y);}y = x; System.out.println("Value of y is " + y);}}

การเขยน code ใหมรปแบบทเหมาะสม อานไดงาย จะทาใหการพฒนาโปรแกรมเปนไปไดดวยความรวดเรวและเปนทยอมรบตามระบบสากล รปแบบทเหมาะสมนนคอมการยอหนา (indentation) เพอใหการอานทาไดงาย และมองดแลวสวยงาม ดงโปรแกรมตวอยางหลาย ๆ ตวทแสดงใหเหนกอนหนาน Expression หมายถงประโยคในภาษา Java ทไดรบการยอมรบวาอยในรปแบบทไดกาหนดไว เชน ประโยคในเรองของการกาหนดคาใหกบตวแปร ประโยคทตองมการประมวลผลในรปแบบตาง ๆ เชน การประมวลผลทางดานคณตศาสตร (mathematical evaluation) การประมวลผลทางดานตรรกะ (relational evaluation) เปนตน การประมวลผลทางดานคณตศาสตรนน ม operator ทใชอยดงน คอ + (บวก), – (ลบ), * (คณ), / (หาร) และ % (การหาเศษทเหลอจากการหารตวเลขสองตว) โปรแกรมตวอยางตอไปนแสดงถงการประมวลผลของขอมลดวย operator ชนดตาง ๆ ทไดกลาวถง

1: /** 2: Shows mathematical operators 3: */ 4: 5: class OperatorsOnInt { 6: public static void main(String[] args) { 7: int i, j, k; 8: 9: //generate random number between 1 and 10 10: j = 1 + (int)(Math.random() * 10); 11: k = 1 + (int)(Math.random() * 10); 12: System.out.println("j = " + j + " and k = " + k); 13: 14: //evaluate and display results of math operators 15: i = j + k; System.out.println("j + k = " + i); 16: i = j - k; System.out.println("j - k = " + i); 17: i = j * k; System.out.println("j * k = " + i); 18: i = j / k; System.out.println("j / k = " + i); 19: i = j % k; System.out.println("j % k = " + i); 20: } 21: }

เนองจากวาเราตองการทจะแสดงถงการสรางประโยคและการประมวลผลดวยคาทมาจาก ขางในโปรแกรมเอง และเราไดใชเครองมอในการสรางคาเหลานใหเราแบบอตโนมต ซงเครองมอทวานกคอ method random() ทมาจาก class Math (มอยใน Java แลว) method random() จะสรางคาระหวาง 0 – 0.9+ พดงาย ๆ กคอ คาตาสดคอ 0 และคาสงสดคอ คาทใกล 1 แตไมเทากบ 1 (คา n ใด ๆ ทอยในเงอนไขน 0.0 <= n < 1.0) เมอไดคานแลวเราคณคานดวย 10 แลวบวก 1 เรากจะไดคาระหวาง 1 – 10 หลงจากนนเรากคานวณหาคา i ดวยการใช operator ตาง ๆ พรอมทงแสดงคาทหาไดไปยงหนาจอ และเมอ run โปรแกรมผลลพธทไดคอ j = 5 and k = 2 j + k = 7

Page 13: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

33

j - k = 3 j * k = 10 j / k = 2 j % k = 1

และเนองจากวาเราใช method random() เปนตวหาคา ดงนนการ run ในแตละครงกจะไดผลลพธทอาจซากน หรอแตกตางกน Operator ตวอน ๆ กเหมอนกบการคานวณ ทางดานคณตศาสตรทเราคนเคยโดยทวไป ยกเวน % ซงเปนการหาเศษจากการหารตวเลขทเปน integral และ floating point ประโยคจากโปรแกรมทวา i = j % k;

จะนาเอาคาของตวแปร k คอ 2 ไปหารคาของตวแปร j ซงมคาเปน 5 แลวเกบเศษทไดจากการหารไว (ซงกคอ 1) เมอไดแลวกนาคานไปเกบไวในตวแปร i ตอไป โปรแกรมตวอยางตอไปนแสดงถงการกาหนดคาดวยขอมลชนด int และ double

1: /** 2: Shows mathematical operators 3: */ 4: import java.util.Random; 5: 6: class Operators { 7: public static void main(String[] args) { 8: //do the ints 9: int i, j, k; 10: 11: //generate random number between 1 and 10 12: Random rand = new Random(); 13: j = 1 + rand.nextInt(10); 14: k = 1 + rand.nextInt(10); 15: System.out.println("j = " + j + " and k = " + k); 16: 17: //evaluate and display results of math operators 18: i = j + k; System.out.println("j + k = " + i); 19: i = j - k; System.out.println("j - k = " + i); 20: i = j * k; System.out.println("j * k = " + i); 21: i = j / k; System.out.println("j / k = " + i); 22: i = j % k; System.out.println("j % k = " + i); 23: 24: //do the doubles 25: double v1, v2, v3; 26: //generate random double between 1.0 and 10.0 27: v1 = 1.0 + rand.nextDouble() * 9; 28: v2 = 1.0 + rand.nextDouble() * 9; 29: System.out.println("v1 = " + v1 + " v2 = " + v2); 30: v3 = v1 + v2; System.out.println("v1 + v2 = " + v3); 31: v3 = v1 - v2; System.out.println("v1 - v2 = " + v3); 32: v3 = v1 * v2; System.out.println("v1 * v2 = " + v3); 33: v3 = v1 / v2; System.out.println("v1 / v2 = " + v3); 34: } 35: }

ผลลพธทไดคอ j = 7 and k = 6 j + k = 13 j - k = 1 j * k = 42 j / k = 1 j % k = 1 v1 = 3.5279786640632915 v2 = 9.035898448743211 v1 + v2 = 12.563877112806502 v1 - v2 = -5.5079197846799195 v1 * v2 = 31.878456937808643 v1 / v2 = 0.39044027376757345

Page 14: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

34

โปรแกรม Operators.java แสดงตวอยางของการกาหนดคา และ การคานวณดวย operator อยาง งาย ๆ ทางดานคณตศาสตร โดยเรมตนดวยการกาหนดคาใหกบตวแปร i และ j ดวยการสรางคาแบบสม (random) จาก method nextInt(max value) ซง method นจะกาหนดคาทอยระหวาง 0 ถง คาทกาหนดใน max value แตไมรวมตว max value ดวยซงถาเราตองการทจะสรางคาทอยระหวาง 1 ถง 10 เรากตองบวก 1 เขากบคาทเกดจากการเรยกใช method นดวย ดงทไดกาหนดไวในโปรแกรม เราสามารถทจะเขยนประโยคทมการประมวลผลในรปของประโยคทมหลายตวแปรในประโยคเดยวกนได ดงตวอยางน

1: /** 2: Shows mathematical operators 3: */ 4: 5: class Operators1 { 6: public static void main(String[] args) { 7: int a, b, c, d, e; 8: 9: b = 1 + (int)(Math.random() * 10); 10: c = 1 + (int)(Math.random() * 10); 11: d = 1 + (int)(Math.random() * 10); 12: e = 1 + (int)(Math.random() * 10); 13: 14: System.out.print("b = " + b + " c = " + c); 15: System.out.println(" d = " + d + " e = " + e); 16: a = b + c - d; 17: System.out.println("Value of a is " + a); 18: a = b * c - d; 19: System.out.println("Value of a is " + a); 20: a = b / c * d; 21: System.out.println("Value of a is " + a); 22: } 23: }

ผลลพธทไดจากการ run คอ b = 8 c = 2 d = 6 e = 5 Value of a is 4 Value of a is 10 Value of a is 24

2.7 การประมวลผล เมอมตวแปรหลายตวในการประมวลผลของประโยค ลาดบขน (precedence) ของการประมวลผลมความสาคญทนท ทงนกเนองมาจากรปแบบของการประมวลผลตามชนของ operator ตาง ๆ มลาดบการประมวลผลทไมเทากน (กอน หรอ หลง) ซงเปนไปตามลาดบขนของการประมวลผลตามกฎของการประมวลผลทางดานคณตศาสตร ดงตารางท 2.4 ตาราง 2.4 Operator Precedence Operator ตามกลม การประมวลผล (), [], ., postfix ++, postfix -- ซายไปขวา unary +, unary –, prefix ++, prefix -- ขวาไปซาย (datatype), new ซายไปขวา *, /, % ซายไปขวา +, - ซายไปขวา <<, >>, >>> ซายไปขวา <, <=, >, >=, instanceof ซายไปขวา ==, != ซายไปขวา & ซายไปขวา ^ ซายไปขวา | ซายไปขวา && ซายไปขวา

Page 15: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

35

|| ซายไปขวา ?: ซายไปขวา =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, |=, ^= ขวาไปซาย

2.7.1 การประมวลผลขอมลทเปน integer การประมวลผลขอมลทเปน integer ทงหมดไมมความสลบซบซอนอะไรเลย เปนการประมวลผลเหมอนกบทเราเคยเรยนมา ในวชาคณตศาสตรซงลาดบขนของการประมวลผลกขนอยกบชนดของ operator ทใชในการประมวลผลนน ๆ เชน การคณและการหาร ทากอน การบวกและการลบ statement 50 * 2 – 45 / 5 จะไดผลลพธคอ 91 ซงไดมาจากการนาเอา 2 ไปคณ 50 กอนหลงจากนนกเอา 5 ไปหาร 45 เมอไดแลวกนาเอาผลลพธทไดไปลบออกจากผลลพธของการคณ 50 กบ 2 ซงมคาเทากบ 100 – 9 แตถาเราตองการทจะใหการประมวลผลอยในรปแบบอน ทเราตองการเรากใชวงเลบเปนตวกาหนด เชน ถาเราตองการทจะใหการลบเกดกอน ในประโยคทเหนกอนหนานเรากเขยนใหมเปน 50 * (2 – 45) / 5 ซงมคาเทาเทยมกบประโยค 50 * -43 / 5 และมคาเทากบ -430 เนองจากวาการประมวลผลขอมลทเปน integer โดยเฉพาะการหารนน เราจะไมมเศษเหลอใหทาการหารตอไปเหมอนทเราเคยหารกนมา เชน ถาเราเอา 4 ไปหาร 9 เรากจะได 2.25 แตถาเปนการหารดวย integer ใน Java แลวผลลพธทเราไดจากการหารนจะเปน 2 เทานน เราจะไมไดเศษ เราจะไดแตสวน ลองดตวอยางตอไปน 5 / 2 = 2 125 / 4 = 31 3 / 9 = 0 15 / 15 = 1 แตเรากหาเศษไดดวยการใช operator % ดงทไดแสดงในโปรแกรมตวอยางกอนหนาน หรอดงตวอยางการหาเศษตอไปน 5 % 2 = 1 125 % 4 = 1 3 % 9 = 3 15 % 15 = 0 โดยทวไปเทาทพบเหนและประสพมา ผอานทใหมตอการเขยนโปรแกรม มกจะสบสนในเรองของการหาเศษ หรอการหาสวนของขอมลทเปน integer อยางไรกตามเรองเหลานมกจะหายไปถาไดทดลองทาอยางสมาเสมอ สาหรบ Java นนการหาเศษสามารถทจะทาไดกบขอมลทเปน double หรอ float ดวย แตในทนจะทงไวใหผอานไดทดลองทาการตรวจสอบดเอง (เนองจากวาผเขยนเองยงมองไมเหนประโยชนของการหาเศษจากขอมลทเปน double หรอ float เลย) ในการเขยนโปรแกรมนนเราเกบขอมลไวในตวแปร ดงนนการประมวลผลกตองทากบตวแปรเหลานน เชน เราสามารถทจะคานวณหาคาของภาษมลคาเพม (vat) จากตวแปร price และ rate ถาตวแปรทงสองไดรบการกาหนดคาเรยบรอยแลว เชน double price = 120.0, rate = 7.5;

Page 16: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

36

double vat = price * rate;

ลองมาดโปรแกรมตวอยางการประมวลผลดวยขอมลทเปน integer

1: /** 2: Integer calculation 3: */ 4: 5: class IntegerCal { 6: public static void main(String[] args) { 7: //declares and initialize three variables 8: int studentNumber = 40; 9: int teacherNumber = 30; 10: int totalNumber = 0; 11: 12: totalNumber = studentNumber + teacherNumber; 13: 14: //display result 15: System.out.print(studentNumber + " students + " + teacherNumber); 16: System.out.println(" teachers = " + totalNumber + " people"); 17: 18: System.out.println("30 + 45 = " + 30 + 45); 19: } 20: }

โปรแกรม Integer.java เปนการแสดงถงการคานวณหาคาของผลรวมของจานวนนกศกษา (studentNumber)และคร (teacherNumber) จากประโยค totalNumber = studentNumber + teacherNumber;

ซงขนตอนของการประมวลผล อาจพดไดคราว ๆ คอ Java นาเอาคาทเกบไวในตวแปร studentNumber และคาทเกบไวในตวแปร teacherNumber มารวมกนและนาเอาผลลพธทไดไปเกบไวในตวแปร totalNumber ผานทางเครองหมาย = (assignment operator) ลองดภาพท 2-2

ภาพท 2-2 การบวก integer สองตว

ในการแสดงผลลพธทไดจากการประมวลผลไปยงหนาจอนน เราสงผานทาง System.out.print() และ System.out.println() ประโยค System.out.print(studentNumber + " students + " + teacherNumber);

จะใหผลลพธคอ คาทเกบไวในตวแปร studentNumber ตามดวย string ทมคาเปน "student +" ตามดวยคาทเกบไวในตวแปร teacherNumber ในบรรทดเดยวกน หลงจากนนประโยค System.out.println(" teachers = " + totalNumber + " people");

teacherNumber

studentNumber

totalNumber

40 30

70

+

Page 17: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

37

กจะใหผลลพธ คอ string ทมคาเปน " teachers = " ตามดวยคาทเกบไวในตวแปร totalNumber ตามดวย string ทมคาเปน " people" ซงเมอรวมแลวทงหมดกจะไดผลลพธทแสดงไปยงหนาจอดงน (หลงจากแสดงผลลพธ cursor จะไปอยในบรรทดใหม) 40 students + 30 teachers = 70 people

คาวา "ตามดวย" จากคาอธบายดานบนนเกดจากการประมวลผลของ Java กบเครองหมาย + ในการใชประโยคของการแสดงผล (System.out) ขอมลใด ๆ ทอยในเครองหมาย " " จะถกสงไปยงหนาจอ แตถาเปนตวแปรหรอประโยคทตองมการประมวลผลอก Java จะทาการประมวลผลกอนเพอใหไดคาสดทายทสามารถจะสงออกไปหนาจอได เชน System.out.println("30 + 45 = " + (30 + 45));

สงทถกสงออกไปกอนคอ "30 + 45 = " ตามดวยคาของการประมวลผลของประโยค (30 + 45) ซงกคอ 75 ดงนนผลลพธทสงไปยงหนาจอคอ 30 + 45 = 75 วงเลบในประโยคของการบวก 30 กบ 45 กมสวนสาคญเพราะถาไมม Java กจะแสดงผลเปน 30 + 45 = 3045 การใสวงเลบเปนการบอก Java ใหทาการคานวณหาคาของประโยคนน ๆ ทงนเฉพาะในประโยคทใช System.out เทานน สวนการประมวลผลทอน ๆ กทาตามเดม เหตทเปนเชนนกเพราะวา System.out จะนาคานน ๆ ทเปนอยไปแสดงถาไมมการคานวณใด ๆ สมมตวาเราตองทาการบวกคาใดคาหนงใหกบตวแปร เรากสามารถทจะสรางประโยคไดเหมอนกบทเราเคยทามากอนหนาน เชน total = total + value; ถาเราลองเขยนภาพแทนประโยคดงกลาว เรากอาจเขยนไดดงน

ภาพท 2-3 การเพมคาใหกบตวแปรตวเดม

ประโยคทเหนดานบนนสามารถทจะเขยนอกแบบได ดงนคอ total += value;

เราใชเครองหมาย += ในการสรางประโยคของเรา แตไดผลลพธเชนเดยวกนกบประโยคกอนหนาน และลดเวลาในการเขยนลง (ถงแมวาจะไมมากกตาม) เชนเดยวกบการประมวลผลดวย operator ตวอน ๆ เรากสามารถจะใชวธเดยวกนนได ดงทไดสรปไวใน ตาราง 2.5

value

total

total value+

Page 18: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

38

ตาราง 2.5 การใช operator ตาง ๆ รวมกบการกาหนดคา ประโยคตวอยาง ประโยคทไดผลลพธเหมอนกน sum = sum + count; sum += count; sum = sum - count; sum -= count; sum = sum * count; sum *= count; sum = sum / count; sum /= count; sum = sum % count; sum %= count;

การกาหนดคาแบบนไมจาเปนทจะตองทากบตวแปรเทานน เราสามารถทจะทากบคาคงทอน ๆ ได เชน total += 4; sum += 1;

ยงม operator ทเราสามารถใชไดโดยไมตองเสยเวลาในการเขยนมากมายนก เชน การเพม หรอ ลดทละหนงคา ดงประโยคตวอยาง count = count + 1; value -= 1;

ทงสองประโยคทเหนดานบนทาการเพมคาและลดคาทละหนงคา ตามลาดบ เราสามารถทจะเขยนใหมดวยการใช operator ++ และ operator -- ไดดงน คอ count++; value--;

จะเหนวาถาเราตองการเพมคาเพยงแคหนงคาเรากใชเครองหมาย ++ ตามหลงตวแปรนน เชนเดยวกนถาเราตองการลดคาลงหนงคา เรากใชเครองหมาย –- ตามหลงตวแปรนน เราเรยกการเขยนแบบนวา การเขยนแบบ postfix (postfix notation) ซงเปนการใช operator ตามหลงตวแปร และ Java ยอมใหมการเพมหรอลดคาไดเพยงแคหนงคาเทานน ถาเราตองการเพมหรอลดคามากกวาหนงคา เราตองใชวธสองวธทไดแสดงการใชกอนหนาน เชน ถาตองการเพมทละสอง เรากเขยนเปน total += 2;

และถาเราตองการลดทละสาม เรากเขยนเปน total -= 3;

Java ยงม Operator อกตวหนงทเราสามารถเลอกใช ในการประมวลผลถาเราคานงถงขนตอนของการประมวลผล วาควรจะทาอะไรกอน อะไรหลง ดงประโยคตวอยางตอไปน int count = 8, value = 5; count = count + value++;

ถามองดเผน ๆ เรากอาจบอกวาประโยคนเปนการบวกคาของตวแปร value เขากบตวแปร count พรอมกบการเพมคาใหกบตวแปร value อกหนงคา แตเรารหรอไมวาอะไรไดรบการประมวลผลกอน count + value กอน หรอ value++ กอน และผลลพธทไดจากการบวกคออะไร จากประโยคดานบน Java จะนาเอาคาของ value มาบวกเขากบคาของ count กอน หลงจากนนจงเพมคาใหกบตวแปร value อหนงคา ดงนนถาเรา execute ประโยค count = count + value++ เรากจะไดผลลพธเปน 13 และคาของ value หลงจากการบวกจะเปน 6 แตถาเราเปลยนประโยคใหเปนดงน count = count + ++value;

เราจะไดผลลพธจากการบวกเปน 14 (ทาไม)

Page 19: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

39

เนองจากวาเราใชเครองหมาย ++ นาหนาตวแปร ดงนน Java จงทาการเพมคาใหกบตวแปร value กอน หลงจากนนจงนาคาทไดนไปบวกเขากบคาของตวแปร count ผลลพธทไดจงเปน 14 ดงทเหน เราเรยกการเขยนแบบนวาการเขยนแบบ prefix (prefix notation) ขนอยกบตาแหนงทใช prefix หรอ postfix ในประโยค บางครงการประมวลผลจาก Java อาจไดผลลพธทเหมอนกน เราจะกลบมาพดถงกรณดงกลาวในเรองของการทางานแบบวน หรอ loop (repetition) ลองมาดตวอยางการใช prefix และ postfix กนอกสกหนอย int count = 10, value = 5; count--; value++; value = ++count + ++value;

ถาเรา execute ประโยค value = ++count + --value; เรากจะไดผลลพธ คอ value มคาเปน 17 เพราะกอนหนานน count มคาเปน 9 และ value มคาเปน 6 (จาก count—และ value++) แตไดรบการเพมใหอกหนงคากอนการบวกในประโยคสดทาย ถาหากวาเราตองการให code ทเขยนนนอานไดงายขนเรากอาจใชวงเลบเปนตวชวยกได เชน value = (++count) + (++value);

หรออาจเขยนใหดแลวเวยนหวแบบน value = (count += 1) + (value += 1);

หรอแบบน value = (count = count + 1) + (value = value + 1);

สวนประโยคตอไปนจะใหผลลพธตางจากตวอยางดานบน (ทาไม?) value = (count++) + (value++);

ถาเราลองวเคราะหประโยคดานบนน ดวยคาของ count = 10 และคาของ value = 5 และตามขอกาหนดการใชงานของ postfix ++ เรากตองสรปวา Java จะนาเอาคาของ count ซงมคาเทากบ 10 บวกเขากบคาของ value ซงมคาเทากบ 5 เมอไดแลวกนาผลลพธทไดไปเกบไวในตวแปร value ดงนน value จงมคาเทากบ 15 หลงจากนนกจะเพมคาใหกบ count และ value อกหนงคา ซงทาให count มคาเทากบ 11 และ value มคาเทากบ 16 แตเมอทดลอง run ดแลวผลลพธทไดกลบเปน value = 15 และ count = 11 ทาไม? เพอใหเกดความกระจางเรากทดลองเขยนประโยคตรวจสอบใหม คอ value = 5; value = value++;

และเมอ run ดเรากไดผลลพธเปน value = 5 ทาใหเราคอนขางจะมนใจวา Java ไมยอมให postfix operator ++ เพมคาใหกบตวแปรเดมทไดรบการกาหนดคาในประโยคเดยวกน แตเพอใหแนใจขนอกเรากทดลอง run ดวยประโยค int sum = value++; เราไดผลลพธเปน sum มคาเทากบ 5 และ value มคาเทากบ 6 ดงนนเราจงมนใจวา postfix operator ++ ไมยอมใหมการเพมคาใหกบตวแปรตวเดยวกนกบทใชในการกาหนดคาในประโยคเดยวกน (ดงทไดกลาวไว แตถาเราตองการทจะเพมคาใหกบตวแปรเดมจรง ๆ เรากทาไดดวยการเปลยนประโยคใหเปน value = value + 1 แทน) การเขยนโปรแกรมทดนนไมควรเขยนใหอานยาก เชนตวอยางของการใช ++ ทไดกลาวถงกอนหนาน ถาการเขยนนนไดผลลพธดงทเราตองการ ถงแมวาจะเขยนดวยประโยคหลาย ๆ ประโยค กยง

Page 20: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

40

ดกวาทเขยนดวยจานวนประโยคทสน แตอานไดยากกวา ตวอยางตอไปนเปนการใช operator ++ และ operator – ในรปแบบตาง ๆ

1: /** 2: Shows increment operators 3: */ 4: class Increments { 5: public static void main(String[] args) { 6: int value = 25, number = 25; 7: 8: System.out.println("value is " + value); 9: System.out.println("number is " + number); 10: --value; 11: number++; 12: System.out.println("value is " + value); 13: System.out.println("number is " + number); 14: value = value + --number; 15: System.out.println("value is " + value); 16: System.out.println("number is " + number); 17: number = number - value++; 18: System.out.println("value is " + value); 19: System.out.println("number is " + number); 20: number--; 21: value++; 22: System.out.println("value is " + value); 23: System.out.println("number is " + number); 24: value = --value; 25: number = number++; 26: System.out.println("value is " + value); 27: System.out.println("number is " + number); 28: } 29: }

ผลลพธทไดจากการ run value is 25 number is 25 value is 24 number is 26 value is 49 number is 25 value is 50 number is -24 value is 51 number is -25 value is 50 number is -25

ผอานควรทดสอบการใช operator increment ทงสอง (++ และ --) ในประโยคสมมตตาง ๆ เพอใหเกดความเขาใจในการใช operator ทงสองไดดยงขน ผอานควรพงระลกวาขอแตกตางระหวาง operator ทงสองนนจะเกดขนเมอไปปรากฏอยใน expression เชนทเราไดแสดงใหดจากตวอยางหลาย ๆ ตวอยางกอนหนาน แตผเขยนไมขอแนะนาใหใช operator ทงสองเพราะจะทาใหเกดความลาบากในการทจะเขาใจ โดยเฉพาะผอนทนาเอา code ของเราไปใชหรอนาไปปรบปรง อยางไรกตาม การใชทเหมาะสมกยงคงมอยได 2.7.2 การประมวลผลดวย integer ขนาดเลก (short และ byte) ในการประมวลผลดวยขอมลทเปน byte หรอ short นน Java จะทาการประมวลผลเชนเดยวกนกบการประมวลผลดวยขอมลทเปน int และผลลพธของการประมวลผลขอมลทเปน short หรอ byte นนจะถกเกบอยในรปแบบของขอมลทเปน int ดงตวอยางตอไปน (ByteShort.java)

1: /** 2: Shows byte and short integer calculation 3: */ 4: class ByteShort {

Page 21: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

41

5: public static void main(String[] args) { 6: short numScooters = 10; 7: short numChoppers = 5; 8: short total = 0; 9: 10: total = numScooters + numChoppers; 11: 12: System.out.println("Number of scooters is " + numScooters); 13: System.out.println("Number of choppers is " + numChoppers); 14: System.out.println("Total number of bikes is " + total); 15: } 16: }

เมอได compile แลว Java จะฟองวาม error เกดขน ByteShort.java:10: possible loss of precision found : int required: short total = numScooters + numChoppers; ^ 1 error

เนองจากวาผลลพธของการบวกจะตองเกบเปน integer ทมขนาดเทากบ 64 bit แตตวแปร total สามารถเกบขอมลไดสงสดเทากบ 16 bit ดงนน compiler จงฟองทนท วธการแกไขกอาจจะตองเปลยนตวแปรทงสามใหเปน int หรอไมกใชวธการเปลยนชนดของขอมลทเรยกวา casting 2.7.3 การเปลยนแปลงชนดของขอมล (casting) ในการเปลยนชนดขอมลนนเราจาเปนทจะตองคานงถงการจดเกบขอมลวาเราจะตองใชขอมลชนดไหนในการจดเกบ การประกาศตวแปรกตองทาดวยความระมดระวง เนองจากวาการ cast นนถาเรา cast ขอมลทมขนาดใหญไปสขอมลทมขนาดเลก เราจะสญเสยคาความเปนจรงของขอมลนน เรามาทาการแกไขโปรแกรม ByteShort.java เพอให Java ยอมใหการ compile เปนไปอยางถกตอง วธการกไมยากเพยงแตเปลยนประโยค total = numScooters + numChoppers; ใหเปน total = (short)(numScooters + numChoppers);

เทาน Java กยอมใหเรา compile และเมอเราทดลอง run ดกไดผลลพธดงทคาดไว คอ Number of scooters is 10 Number of choppers is 5 Total number of bikes is 15

ทนเราลองมาดกนวาถาเราเปลยนคาของ numScooters ใหเปน 32767 ดงทเหนดานลาง ผลลพธทไดในการ compile และ run โปรแกรมของเราจะเปนอยางไร short numScooters = 32767; //คาสงสดทเปนไปได short numChoppers = 5;

ผลลพธทได คอ Number of scooters is 32767 Number of choppers is 5 Total number of bikes is -32764

จะเหนวาคาของ total เปน -32764 ซงเปนคาทไมถกตอง ซงถาบวกกนแลวคาทไดตองเปน 32772 ทาไม? เนองจากวาตวแปรทงสามตวมชนดเปน short และสามารถเกบขอมลไดสงสดเพยงแค 32767 ดงนนการนาเอาผลรวมทมคาเกนกวาคาสงสดทเปนไปไดมาเกบไวในตวแปร total จงไมสามารถทาไดแต Java กจะนาเอาคาอนทไดจากการประมวลผล (ทถกตองตามหลกการแตมคาความคลาดเคลอนของการประมวลผล – จานวน bit ทใชในการคานวณหายไปครงหนง จาก 64 bit เหลอเพยง 32 bit) มาใสไวให ผเขยนโปรแกรมจะตองทาความเขาใจเกยวกบชนดของของมล และการประมวลผลตามชนด

Page 22: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

42

นน ๆ ของขอมล ถาหากวาหลกเลยงได ผเขยนโปรแกรมกควรหลกเลยงการใช cast นอกเสยจากวาจาเปนตองใชจรง ๆ เทานน เรามาดการ cast อน ๆ จากโปรแกรม Casting.java

1: /** 2: Changing type of data 3: */ 4: 5: class Casting { 6: public static void main(String[] args) { 7: byte byteVar = 127; 8: short shortVar = 32767; 9: long longVar = 100000; 10: int intVar = 300000; 11: 12: System.out.println("byteVar is " + byteVar); 13: System.out.println("shortVar is " + shortVar); 14: System.out.println("longVar is " + longVar); 15: System.out.println("intVar is " + intVar); 16: 17: byteVar = (byte)shortVar; 18: shortVar = (short)longVar; 19: longVar = (int)intVar * (int)longVar; 20: intVar = (short)intVar * (short)intVar; 21: 22: System.out.println("byteVar is " + byteVar); 23: System.out.println("shortVar is " + shortVar); 24: System.out.println("longVar is " + longVar); 25: System.out.println("intVar is " + intVar); 26: } 27: }

ผลลพธทไดจากการ run คอ byteVar is 127 shortVar is 32767 longVar is 100000 intVar is 300000 byteVar is -1 shortVar is -31072 longVar is -64771072 intVar is 766182400

ในการประมวลผลดวยการใชขอมลทมชนดเปน long นน (บงคบใหเปน long ดวยการใส L ดานหลงคาทกาหนดใหกบตวแปรนน ๆ) ขอมลชนดอนจะถกเปลยนใหเปน long กอนการประมวลผล เชน long value = 125; long price = 200L; int total = 0; total = value * price;

กอนการประมวลผลคาของตวแปร value จะถกเปลยนใหเปน long แลวจงนามาคณกบตวแปร price เพราะฉะนนในการประมวลผลขอมลทเปน integer นนขอควรคานงถงกคอ

o การประมวลผลกบตวแปรทประกาศเปน long ทมการกาหนดคาดวยตว L จะเปนการประมวลผลดวยการใชจานวน bit เทากบ 64 bit

o การประมวลผลกบตวแปรทประกาศเปน int จะเปนการประมวลผลดวยการใชจานวน bit เทากบ 32 bit

ปญหาของการประมวลผลดวยขอมลทมชนดเปน integer

o ถาเราหารตวแปรทมชนดเปน int ดวย 0 เราไมสามารถหาคาตอบได เพราะฉะนน Java จะทาการฟองดวย error แตเรากสามารถทจะตรวจสอบและแกไขไดดวยการใช exception

Page 23: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

43

ซงเปนวธดกจบ error ท Java เอออานวยใหผเขยนโปรแกรมไดทาการเอง เราจะพดถง exception ในโอกาสตอไป

o การประมวลผลดวยคาทเกนขดจากดของตวแปรจะทาใหไดผลลพธทคลาดเคลอน o การประมวลผลดวย % ทมคาของ 0 อยทางขวากทาใหเกด error เหมอนกบการหารดวย 0

2.8 การประมวลผลดวยตวแปรทมจดทศนยม (Floating Point Calculations) การประมวลผลของขอมลทเปนเลขทศนยมนนกคลายกนกบการประมวลผลดวยขอมลทเปน integer การใช operator ตาง ๆ กเหมอนกน คอ + - * / ลองมาดตวอยางกน

1: /** 2: Calculating with floating-point numbers 3: */ 4: class FloatingPoint { 5: public static void main(String[] args) { 6: double weeklyPay = 1075 * 5;//1075 per day 7: double extras = 1580; 8: final double TAX_RATE = 8.5;//tax rate in percent 9: 10: //calculate tax and income 11: double tax = (weeklyPay + extras) * TAX_RATE / 100; 12: double totalIncome = (weeklyPay + extras) - tax; 13: 14: System.out.println("Tax = " + tax); 15: System.out.println("Total income = " + totalIncome); 16: } 17: }

โปรแกรม FloatingPoint.java เปนการคานวณหาภาษ และรายไดตอหนงอาทตย โดยเราสมมตใหรายไดตอวนเทากบ 1075 บาท และรายไดพเศษเทากบ 1580 บาท อดตราภาษเทากบ 8.5% เมอเรา execute โปรแกรมเรากจะไดผลลพธดงน Tax = 591.175 Total income = 6363.825

ในการคานวณหาภาษนนเราจาเปนทจะตองใชวงเลบในประโยค double tax = (weeklyPay + extras) * TAX_RATE / 100;

เนองจากวาเราตองการใหการบวกทากอนการคณและการหาร ถาไมเชนนนแลวเราจะไมไดคารายไดโดยรวมทเปนจรง ถาเราสงเกตใหดผลลพธทไดจะมเลขหลงจดทศนยมอยสามตว เราทาใหเปนสองตวดงทใชกนอยทวไปไดมย? คาตอบกคอ ได ดวยการเพม code เขาไปในโปรแกรมดงน

1: /** 2: Calculating floating-point with formatted output 3: */ 4: 5: import java.text.*; //for NumberFormat 6: 7: class FloatingPoint2 { 8: public static void main(String[] args) { 9: double weeklyPay = 1075 * 5;//1075 per day 10: double extras = 1580; 11: final double TAX_RATE = 8.5;//tax rate in percent 12: 13: //set format output 14: NumberFormat form = NumberFormat.getNumberInstance(); 15: form.setMaximumFractionDigits(2); 16: 17: //calculate tax and income 18: double tax = (weeklyPay + extras) * TAX_RATE / 100; 19: double totalIncome = (weeklyPay + extras) - tax; 20: 21: System.out.println("Tax = " + form.format(tax)); 22: System.out.println("Total income = " + form.format(totalIncome)); 23: }

Page 24: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

44

24: }

เราเพมประโยค NumberFormat form = NumberFormat.getNumberInstance(); form.setMaximumFractionDigits(2);

และเปลยนการแสดงผลลพธดวยการใช form.format(tax) และ form.format(totalIncome) เพอใหผลลพธทออกมาเปน Tax = 591.18 Total income = 6,363.82

จะเหนวา 591.175 จะถกปดใหเปน 591.18 และ 6363.825 ถกปดใหเปน 6363.82 โดยทคาของ totalIncome ม , (comma) เปนตวบอกถงจานวนของหลกรอยดวย ในการใช method ทง getNumbereInstance() และ setMaximumFractionDigits() นนเราจาเปนทจะตอง import class NumberFormat เขาสโปรแกรมของเรา ถาไมแลวเราจะไมสามารถใช method เหลานได ยงม method อนใน class DecimalFormat ทเราสามารถเรยกใชในการ format ผลลพธทเปนจดทศนยมได เชนถาเราไมตองการ , (comma) เปนตวแบงหลกเราจะทาอยางไร? ลองดตวอยางนด (FloatingPoint3.java)

1: /** 2: Calculating floating-point with formatted output 3: */ 4: 5: import java.text.*; //for DecimalFormat 6: 7: class FloatingPoint3 { 8: public static void main(String[] args) { 9: double weeklyPay = 1075 * 5;//1075 per day 10: double extras = 1580; 11: final double TAX_RATE = 8.5;//tax rate in percent 12: 13: //set format output 14: DecimalFormat form = new DecimalFormat("#.00"); 15: 16: //calculate tax and income 17: double tax = (weeklyPay + extras) * TAX_RATE / 100; 18: double totalIncome = (weeklyPay + extras) - tax; 19: 20: System.out.println("Tax = " + form.format(tax)); 21: System.out.println("Total income = " + form.format(totalIncome)); 22: } 23: }

ผลลพธทไดคอ Tax = 591.18 Total income = 6363.82

เราเพยงแตเรยกใช class DecimalFormat แทน NumberFormat และเปลยนการกาหนด format ใหเปน DecimalFormat form = new DecimalFormat("#.00);

เรากจะไดผลลพธทมเลขหลงจดทศนยมอยสองตว และไมม , (comma) เปนตวแบงหลก ยงมวธการกาหนดรปแบบของการแสดงผลลพธอกหลายแบบ หนงในนนมมากบ Java 1.5 นนกคอการใช printf() เปนตวแสดงผล

Page 25: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

45

2.8.1 การใช printf() ในการแสดงผล ใน Java 1.5 เราสามารถเรยกใช printf() เพอแสดงผลใหเราตามโครงสรางทเราตองการไดอยางงาย ๆ ดงโปรแกรมตวอยางน

1: /** 2: Using printf() for formatted output 3: */ 4: 5: class UsingPrintf { 6: public static void main(String[] args) { 7: double weeklyPay = 1075 * 5;//1075 per day 8: double extras = 1580; 9: final double TAX_RATE = 8.5;//tax rate in percent 10: String total = "Total income = "; 11: 12: //calculate tax and income 13: double tax = (weeklyPay + extras) * TAX_RATE / 100; 14: double totalIncome = (weeklyPay + extras) - tax; 15: 16: System.out.printf("Tax = %.2f%n", tax); 17: System.out.printf("%s %.2f", total, totalIncome); 18: } 19: }

การแสดงผลของการประมวลในบรรทดท 16 จากโปรแกรมตวอยางน ใช printf() แสดงผลลพธโดยกาหนดใหการแสดงผลเปนเลขทมจดทศนยมสองจดดวยการใชสญลกษณ '%.2f' ซงตวกาหนดใหมทศนยมสองตาแหนงคอ ตวเลขทอยหลงจด ตามดวยตวอกษร 'f' สวนตว %n หมายถงการเลอนบรรทด ผอานจะสงเกตวาเราจะตองกาหนดรปแบบทตองการภายในเครองหมาย " " สวนตวแปรทเกบคาของขอมลทตองการแสดงผลนนจะอยภายนอกและตองตามหลงเครองหมาย ',' เสมอ ในบรรทดท 17 เราแสดงผลขอมลสองตว ตวแรกมชนดเปน String สวนตวทสองเปนเลขทมจดทศนยมเหมอนกบทแสดงในบรรทดท 16 ผอานจะตองใช %s ในการแสดงผลขอมลทเปน String และถามการแสดงผลขอมลมากกวาหนงตวเรากใชเครองหมาย ',' เปนตวแบงเสมอ และจานวนของสญลกษณแสดงผลภายในเครองหมาย " " ตองมจานวนเทากบตวแปรทอยภายนอก 2.8.1.1 การใชเครองหมายอน ๆ (flag) ใน printf() โปรแกรมตวอยางตอไปนแสดงถงการควบคมหนาตาของสงทเราตองการสงไปยงชองทางออก (เชน หนาจอ เปนตน) ซงมเครองหมายทนาสนใจดงน

1. เครองหมายลบ (-) 2. เครองหมายบวก (+) 3. ศนย (0) 4. เครองหมาย comma (,) 5. เครองหมายวงเลบเปด ( สาหรบการแทนคาทเปนลบ

1: /** 2: Using flags in printf() 3: */ 4: 5: class FlagInPrintf { 6: public static void main(String[] args) { 7: 8: System.out.println("column:\t01234567890123456789"); 9: System.out.printf("\t%+d %d %n", 1234, 1234); 10: System.out.printf("\t%-10.2f%n", 1234.567); 11: System.out.printf("\t%+09d%n", 493); 12: System.out.printf("\t%09d%n", 493); 13: System.out.printf("\t%,d%n", 123456); 14: System.out.printf("\t%,.2f%n", 1234.567); 15: System.out.printf("\t%(d%n", -1234); 16: System.out.printf("\t%(.1e%n", -493.0); 17: } 18: }

Page 26: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

46

ผลลพธทเราไดคอ column: 01234567890123456789 +1234 1234 1234.57 +00000493 000000493 123,456 1,234.57 (1234) (4.9e+02)

ผอานควรศกษาถงผลลพธทไดจากโปรแกรมตวอยางนเพอใหเกดความเขาใจใหมากยงขน (column ทอยดานบนของผลลพธมไวเพอเปนการอางองถงตาแหนงทผลลพธควรจะเปนเมอมการเรยกใช flag ตาง ๆ) 2.8.2 การใช format() แทน printf() เราสามารถทจะใช format() แทนการแสดงผลดวย printf() โดยไมตองมการเปลยนแปลง code ของเราแตอยางใด เชนถาเราเปลยนชดคาสงในบรรทดท 16 และ 17 ของโปรแกรม UsingPrintf ใหเปน System.out.format("Tax = %.2f%n", tax); System.out.format("%s %.2f", total, totalIncome);

ผลลพธของการประมวลผลทเราไดกเหมอนกน คอ Tax = 591.18 Total income = 6363.83

ผอานกเลอกใชตามแตทตนเองชอบกแลวกน ยงมสญลกษณอกหลายตวทเราสามารถเรยกใชได ซงเราไดนามาแสดงไวในตารางท 2.6 น ตาราง 2.6 การใชสญลกษณแสดงผล สญลกษณแสดงผล ความหมาย

%% แสดง % ใน String %a, %A แสดงคาเลขทมจดทศนยม %b, %B แสดงคาทเปนจรง หรอเทจ %c, %C แสดงคาของตวอกษรหนงตว %d แสดงคาของตวเลขทไมมจดทศนยม %e, %E แสดงคาเลขทมจดทศนยมในรปแบบของ exponential notation %f แสดงคาเลขทมจดทศนยม %g, %G แสดงคาเลขทมจดทศนยมสงสดหกตาแหนง %h, %H แสดงคาเลขในฐานสบหก (hash code) %n เลอนบรรทดใหมหนงบรรทด %o แสดงคาเลขในฐานแปด %s, %S แสดงคาของ String %t, %T แสดงคาของเวลา %x, %X แสดงคาตวเลขในฐานสบหก

2.8.3 การแสดงผลทไมตองใชคาวา System นาหนา หลาย ๆ ครงทเราตองการแสดงผลลพธไปยงหนาจอ แตกตองมาเสยเวลาในการพมพคาวา System กอนหนาคาวา out.println() หรอ out.printf() ดงทเราไดเหนจากตวอยางตางๆ ทผานมา ใน Java 1.5 เราสามารถทจะลดการเขยนลงดวยการใชการ import ทเรยกวา static import แทนการ import ทเราไดเคยทามา ดโปรแกรมตวอยางตอไปน

1: /** 2: Display output without 'System'

Page 27: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

47

3: */ 4: 5: import static java.lang.System.out; 6: 7: class StaticImport { 8: public static void main(String[] args) { 9: String name = "Jennie Xumsai"; 10: int age = 9; 11: 12: out.printf("%s is %s%n", name, age); 13: 14: long maxLong = Long.MAX_VALUE; 15: double maxDouble = Double.MAX_VALUE; 16: out.printf("Maximum long: %d%n", maxLong); 17: out.printf("Maximum double: %E%n", maxDouble); 18: } 19: }

เรากาหนดใหมการ import แบบ static ในบรรทดท 5 ซงเปนการบอกให Java รวาเราตองการใชสงท Java เรยกวา 'static field' ทชอ 'out' พรอมทง method ทงหลายทมใหใช เชน printf() เปนตน ดงนนการแสดงผลลพธในบรรทดท 12, 16 และบรรทดท 17 จงไมตองมคาวา 'System' อยอกตอไป ผลลพธทเราไดคอ Jennie Xumsai is 9 Maximum long: 9223372036854775807 Maximum double: 1.797693E+308

ผอานจะเหนวาถาโปรแกรมของเรามการแสดงผลไปยงหนาจอมาก ๆ การใช static import จะชวยใหเราเขยนโปรแกรมไดไวยงขน 2.9 การประมวลผลขอมลตางชนดกน (Mixed Type Calculations) ในการประมวลผลขอมลทมความหลากหลายของชนดในประโยคใด ๆ นน โดยทวไป Java จะทาการเปลยนชนดของขอมลทมขนาดเลกกวาใหเปนขนาดทใหญทสดในกลมของขอมลนน ๆ แตผเขยนโปรแกรมจะตองใชความระมดระวงในเรองของการจดเกบขอมลทมขนาดใหญไปไวในตวแปรทมขนาดเลก เชนเดยวกบทไดทามากอนหนานในเรองของการประมวลผลขอมลทเปน integer ลองมาดตวอยางกน

1: /** 2: Demonstrates mixed-type calculations 3: */ 4: 5: class FloatingPoint4 { 6: public static void main(String[] args) { 7: double hourlyPay = 85.50D; //85.50 per hour 8: int hoursPerDay = 8; //8 hours per day 9: int numberOfDays = 5; //total days worked 10: int extraHoursWorked = 15; //overtime hours 11: final double TAX_RATE = 8.5D; //tax rate in percent 12: 13: //calculate weekly pay 14: double weeklyPay = hourlyPay * hoursPerDay * numberOfDays; 15: //calculate extra pay 16: double extras = extraHoursWorked * (hourlyPay + (hourlyPay / 2.0)); 17: //calculate tax 18: double tax = (weeklyPay + extras) * TAX_RATE / 100; 19: //calculate total income 20: double totalIncome = (weeklyPay + extras) - tax; 21: 22: System.out.printf("Income before tax = %.2f%n", (weeklyPay + extras)); 23: System.out.printf("Tax = %.2f%n", tax); 24: System.out.printf("Income after tax = %.4f%n", totalIncome); 25: } 26: }

โปรแกรม FloatingPoint4.java ใชตวแปรทมชนดเปนทง double และ integer ปนกนในการคานวณหารายไดตอหนงอาทตย โดยกาหนดใหตวแปร hoursPerDay, numberOfDays และ

Page 28: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

48

extraHoursWorked เปน integer สวนตวแปร hourlyPay, weeklyPay, extras, tax และ totalIncome เรากาหนดใหเปน double การประมวลผลกไมยงยากอะไร Java จะเปลยนตวแปรทเปน int ใหเปน double กอนการประมวลผล เพราะฉะนนการจดเกบผลลพธกไมมคาความคลาดเคลอนใด ๆ เกดขน ดงผลลพธทแสดงน Income before tax = 5343.75 Tax = 454.22 Income after tax = 4889.5313 ขอควรจาในการประมวลผลขอมลตางชนดกน (ในประโยคเดยวกน)

o ถามตวแปรใดเปน double ตวแปรทนามาประมวลผลดวยจะถกเปลยนใหเปน double กอนการประมวลผล

o ถามตวแปรใดเปน float ตวแปรทนามาประมวลผลดวยจะถกเปลยนใหเปน float กอนการประมวลผล

o ถามตวแปรใดเปน long ตวแปรทนามาประมวลผลดวยจะถกเปลยนใหเปน long กอนการประมวลผล

สงทสาคญกคอขอมลทเลกกวาในประโยคจะถกเปลยนใหเปนชนดทใหญทสดในประโยคนน ๆ ซงบางครงกไมใชการประมวลผลทเราตองการ เชน ตวอยางของโปรแกรมตอไปน

1: /** 2: Demonstrates mixed-type calculations 3: */ 4: 5: class MixedTypes { 6: public static void main(String[] args) { 7: double result = 0.0; 8: int one = 1, two = 2; 9: 10: result = 1.5D + one / two; 11: 12: System.out.printf("Result is %.2f%n", result); 13: } 14: }

ผลลพธทเราคาดหวงวาจะได คอ 2.0 แต Java กลบให 1.5 ซงเปนผลลพธทเราไมตองการ ถาสงเกตใหดจะเหนวาประโยค result = 1.5 + one / two;

นน การหารจะเกดกอน และเนองจากวาทง one และ two เปน int ดงนนผลลพธของการหารจงมคาเปน int และมคาเปน 0 หลงจากนน Java กจะเปลยน 0 ทไดใหเปน double แลวจงทาการบวกเขากบ 1.5 เพอใหผลลพธเปนทเราตองการ ดงนนเราจงตองทาการ cast ใหตวแปร one เปน double เสยกอน ดงน

1: /** 2: Demonstrates mixed-type calculations 3: */ 4: 5: class MixedTypes { 6: public static void main(String[] args) { 7: double result = 0.0; 8: int one = 1, two = 2; 9: 10: result = 1.5D + (double)one / two; 11: 12: System.out.printf("Result is %.2f%n", result); 13: } 14: }

เรากจะไดผลลพธเปน 2.0 ดงทเราตองการ

Page 29: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

49

อยางไรกตามการ cast นนตองใชความระมดระวงเปนพเศษ หากเราทาการ cast ขอมลทใหญกวาไปเกบไวในตวแปรทเลกกวากจะทาใหเกดความคลาดเคลอนของขอมลได ดงทไดพดไวกอนหนาน 2.9.1 Autoboxing และ Unboxing เราไดพดถงการใชขอมลชนดตาง ๆ เชน int, short, float และอน ๆ ซงเปนขอมลพนฐานทใชเกบคาตาง ๆ ท user ตองการ และขอมลเหลานไมใชขอมลทเปน object ดงนนในการเลอกใชตวแปรเราจงตองระมดระวงทจะใหขอมลเหลานนเปนขอมลทถกตอง ตวอยางเชน ถาเราประกาศใหตวแปร myNum มเปนชนดเปน Integer และ myNumToo มชนดเปน int ซงทงสองตวแปร ถาพดงาย ๆ กคอเกบขอมลชนดเดยวกน ตางกนตรงทตวหนงเปน object อกตวหนงเปนขอมลชนดพนฐาน ซงทงสองไมสามารถนามาใชแทนกนได (ในอดตกอน java 1.5) เชน ถาเราใชคาสง Integer myNum = new Integer(35); int myNumToo = 35;

เราไมสมารถกาหนด myNum = myNumToo; หรอ myNumToo = myNum; ได แตพอมาถง Java 1.5 กระบวนการทเรยกวา Autoboxing และ Unboxing ยอมใหเราทาได กลาวคอ เราสามารถทจะกาหนดชดคาสงดงกลาวได Boxing หมายถงการเปลยนขอมลจากชนดพนฐานใหเปน wrapper type (object นน ๆ ทรองรบกบขอมลพนฐาน) เชน Boolean, Byte, Short, Character, Integer, Long, Float, หรอ Double และเนองจากวาเหตการณนเกดขนโดยอตโนมต เราจงเรยกวา Autoboxing ในทางตรงกนขามการเปลยนให wrapper type เปนขอมลชนดพนฐานเราเรยกวา unboxing

1: /** 2: From wrapper type to primitives and vice versa 3: */ 4: 5: import static java.lang.System.out; 6: 7: class WrapPrim { 8: public static void main(String[] argas) { 9: Integer myInteger = new Integer(35); 10: int myInt = 4; 11: 12: out.printf("MyInt = %d%n", myInt); 13: //boxing 14: myInt = myInteger; 15: out.printf("Now MyInt = %d%n", myInt); 16: 17: double myD = 3.145; 18: //unboxing 19: Double myDouble = myD; 20: out.printf("myD = %.3f, myDouble = %.3f%n", myD, myDouble); 21: } 22: }

ผลลพธทเราไดจากการ run คอ MyInt = 4 Now MyInt = 35 myD = 3.145, myDouble = 3.145

โปรแกรมตวอยางของเราใช boxing ในบรรทดท 14 และ unboxing ในบรรทดท 19 ผอานจะเหนวาเราไมตองทาอะไรเลยเพยงแตใชตวแปรทงสองชนดเสมอนกบวาเปนตวแปรทไดประกาศใหเปนชนดเดยวกน ใน Java รนกอน ๆ การเปลยนขอมลตองมกระบวนการเพมอก ดงตวอยางน Integer num1 = new Integer(35); int num2 = num1.intValue(); Integer num3 = Integer.valueOf(num2);

Page 30: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

50

เรากาหนดใหตวแปร num1 เปน Integer มคาเปน 35 และกาหนดให num2 เปน int มคาทเปน int จาก num1 ดวยการใช method intValue() ของ class Integer และกาหนดให num3 เปน Integer ทมคาเปน Integer จากการเปลยนคา int ของ num2 ดวยการเรยกใช valueOf() ของ class Integer เชนเดยวกน เพราะฉะนนตวแปรทงสามจงมคาเหมอนกนคอ 35 ในสวนของ wrapper type อน ๆ เชน Double หรอ Character กทางานคลาย ๆ กนผอานสามารถหาดไดจาก Java API ของ Sun ได 2.10 การประมวลผลเลขทมขนาดใหญ ถาเราตองการทจะทางานกบตวเลขทมคาเกนกวาท int จะเกบคาได Java กมวธททาใหเราสามารถประมวลผลเลขใหญๆ เหลานนได 2.10.1 การใช BigInteger Java ม class BigInteger ทเราสามารถเรยกใชในการประมวลผลเลขทมคามากๆได แตเราตองทาตามขอกาหนดท Java ไดตงไว คอ 1. จะตองสรางตวเลยใหเปน Object จาก class BigInteger 2. การประมวลผลจะตองทาผาน method ทมใหตวอยาง เชน ลองมาดโปรแกรมตวอยางการใชด

1: /** 2: Big Integers Operations Demo 3: */ 4: 5: import java.math.BigInteger; 6: 7: class BigIntegerDemo { 8: public static void main(String[] args) { 9: BigInteger big1 = new BigInteger("999999999999999999999999999999"); 10: BigInteger big2 = new BigInteger("999999999999999999999999999999"); 11: BigInteger result; 12: 13: //add big1 and big2 14: result = big1.add(big2); 15: System.out.println("big1 + big2 = " + result); 16: 17: //subtract big1 and big2 18: result = big1.subtract(big2); 19: System.out.println("big1 - big2 = " + result); 20: 21: //multiply big1 and big2 22: result = big1.multiply(big2); 23: System.out.println("big1 * big2 = " + result); 24: 25: //divide big1 and big2 26: result = big1.divide(big2); 27: System.out.println("big1 / big2 = " + result); 28: } 29: }

ผลลพธทเราไดคอ big1 + big2 = 1999999999999999999999999999998 big1 - big2 = 0 big1 * big2 = 999999999999999999999999999998000000000000000000000000000001 big1 / big2 = 1

สาหรบ class BigDecimal กคลายๆ กบ BigInteger เพยงแตเปนการทางานกบตวเลขทมจดทศนยมเทานนเอง ผอานคงตองหาดขอมลทเกยวของกบการทางานกบตวเลขใหญๆ เหลานเสรมเอง

Page 31: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

51

2.11 การใช Mathematical Functions ตาง ๆ ท Java มให หลาย ๆ ครงทการเขยนโปรแกรมตองการใช function ทเกยวของกบการหาคาทางคณตศาสตร เชน การหาคาของ sine cosine tangent หรอ คาอน ๆ ทเกยวของกบการคานวณทางคณตศาสตร Java กไดทาการออกแบบและจดสรร function เหลานไวใหผใชไดเรยกใชอยางเตมท เราจะมาทดลองเรยกใช function ตาง ๆ เหลานด ตวอยางตอไปนจะเปนการคานวณหาคาของสมการ ทเรยกวา Quadratic Equation ax2 + bx + c = 0 ซงหาไดจากการใชสตร

aacbbx

242

1−+−

=

aacbbx

242

2−−−

=

ซง mathematical function ทเราตองใชกคอ การหา square root และ Java ไดจดเตรยม method ตวนไวใหเราแลวกคอ Math.sqrt() เรามาลองดโปรแกรมทหาคาของสมการตวนกนด

1: /** 2: Calculating roots of a function 3: */ 4: 5: class Quadratic { 6: public static void main(String[] args) { 7: double a, b, c; 8: 9: //4x2 + 20x + 16 = 0 10: a = 4; 11: b = 20; 12: c = 16; 13: 14: //calculate determinant 15: double det = Math.sqrt(b * b - 4 * a * c); 16: 17: //calculate roots 18: double x1 = (-b + det) / (2 * a); 19: double x2 = (-b - det) / (2 * a); 20: 21: System.out.printf("Root 1 = %.4f%n", x1); 22: System.out.printf("Root 2 = %.4f", x2); 23: } 24: }

ผลลพธทไดคอ Root 1 = -1.0000 Root 2 = -4.0000 ในการเขยนโปรแกรม Quadratic. java ในครงนนนเราจะยงไมสนใจในเรองทคาของ determinant จะเปน 0 เนองจากวาเราไมสามารถหาคาของ square root ของ 0 ได เราจะใชตวเลขททาใหคาของ b2 – 4ac เปนบวกเทานนเพอหลกเลยงเหตการณดงกลาว อกอยางหนงกคอ เรายงไมไดเรยนเรองการใช ชดคาสงในการตรวจสอบ (if –else) เราจะกลบมาดตวอยางนอกครงหนงเมอเราไดเรยนเรองของการใช ชดคาสงในการตรวจสอบ ในทนเราสนใจแตเรองของการใช Math.sqrt() เทานนเอง เรามาลองใช Mathematical function อน ๆ ดกนดกวา

1: /** 2: Finding max and min 3: */ 4: 5: class MaxMin { 6: public static void main(String[] args) {

Page 32: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

52

7: int num1 = 58, num2 = 97, num3 = 15; 8: 9: //finding maximum between num1, num2, and num3 10: int maxOfTwo = Math.max(num1, num2); 11: int maxOfAll = Math.max(maxOfTwo, num3); 12: 13: //finding minimum between num1, num2, and num3 14: int minOfTwo = Math.min(num1, num2); 15: int minOfAll = Math.min(minOfTwo, num3); 16: 17: System.out.printf("Maximum number is %d%n", maxOfAll); 18: System.out.printf("Minimum number is %d", minOfAll); 19: } 20: }

โปรแกรม MaxMin.java แสดงการเรยกใช method max() และ min() ในการเปรยบเทยบและหาคาทมากทสด และคาทนอยทสดของ integer 3 ตว ตามลาดบ และเนองจากวา method ทงสองยอมรบ parameter เพยงแคสองตวเทานน เราจงตองทาการหาคาสองครง ครงแรกระหวาง integer 2 ตวแรก และครงทสองระหวางคาทหาได กบ integer ทเหลอ และเมอ execute โปรแกรมเรากจะไดผลลพธดงทเหนน Maximum number is 97 Minimum number is 15

โปรแกรมทแสดงใหดตอไปนเปนโปรแกรมทเรยกใช method ตาง ๆ ทมอยใน class Math

1: /** 2: Other math functions 3: */ 4: 5: class Maths { 6: public static void main(String[] args) { 7: double angle = 0.7853982; //45 degrees angle in radians 8: 9: System.out.println("sin(45) is " + Math.sin(angle)); 10: System.out.println("cos(45) is " + Math.cos(angle)); 11: System.out.println("tan(45) is " + Math.tan(angle)); 12: 13: System.out.println("Absolute value of -456 is " + Math.abs(-456)); 14: System.out.println("2 to the 4th power is " + Math.pow(2D, 4D)); 15: System.out.println("2.345267 rounded to " + Math.round(2.345267)); 16: System.out.println("2.859 rounded to " + Math.round(2.859)); 17: System.out.println("The remainder of 3.25 / 2.25 is " +

Math.IEEEremainder(3.25, 2.25)); 18: System.out.println("The nearest integer of PI is " + Math.rint(Math.PI)); 19: } 20: }

โปรแกรม Maths.java ใช method จาก class Math ทาการหาคาของ sine cosine และ tangent ของมม 45 ซงมคาเทากบ 0.7853982 radians สาเหตทตองใชมมทเปน radians กเพราะวา method เหลานบงคบใหมมทรบเขาเปน parameter มชนดเปน radians หลงจากนนกทาการหาคา absolute ของ -456 คา 24 และคาการปดเศษในรปแบบตาง ๆ ผลลพธทไดจากการ run คอ sin(45) is 0.7071068070684596 cos(45) is 0.7071067553046345 tan(45) is 1.0000000732051062 Absolute value of -456 is 456 2 to the 4th power is 16.0 2.345267 rounded to 2 2.859 rounded to 3 The remainder of 3.25 / 2.25 is 1.0 The nearest integer of PI is 3.0

โปรแกรมตวอยางการใช method toRadians() สาหรบการเปลยนมมทเปน degrees ใหเปน radians

Page 33: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

53

1: /** 2: Other math functions 3: */ 4: import java.text.DecimalFormat; 5: 6: class Maths1 { 7: public static void main(String[] args) { 8: double angle = 45; //45 degrees angle 9: double sin, cos, tan; 10: 11: //set format output 12: DecimalFormat f = new DecimalFormat("0.00000"); 13: 14: //calculate sin, cos, and tan 15: sin = Math.sin(Math.toRadians(angle)); 16: cos = Math.cos(Math.toRadians(angle)); 17: tan = Math.tan(Math.toRadians(angle)); 18: 19: System.out.println("sin(" + angle + ") = " + f.format(sin)); 20: System.out.println("cos(" + angle + ") = " + f.format(cos)); 21: System.out.println("tan(" + angle + ") = " + f.format(tan)); 22: } 23: }

ผลลพธของโปรแกรม Maths1.java คอ sin(45.0) = 0.70711 cos(45.0) = 0.70711 tan(45.0) = 1.00000

โปรแกรมตวอยางอกตวหนงทใช math function ในการคานวณหาคาของรศมของวงกลม จากพนทของวงกลมทกาหนดให

1: /** 2: Other math functions 3: */ 4: 5: class Radius { 6: public static void main(String[] args) { 7: double radius; 8: double area = 850.0; 9: int meters, centimeters; 10: 11: //calculate radius 12: radius = Math.sqrt(area / Math.PI); 13: 14: //convert to meters and centimeters 15: meters = (int)Math.floor(radius); 16: centimeters = (int)Math.round(100.0 * (radius - meters)); 17: 18: System.out.printf("Circle with area of %.2f %s", area, "square meters "); 19: System.out.printf("has a radius of %d %s", meters, "meters and "); 20: System.out.printf("%d %s%n", centimeters, "centimeters"); 21: } 22: }

เราใช floor() ในการหาคาของรศมทเปนจานวนเตม และใช round() ในการคานวณหาคาของ centimeters ทเหลอจากการนาเอา meters ไปลบออกจาก radius ซงเมอ run กจะไดผลลพธดงน Circle with area of 850.00 square meters has a radius of 16 meters and 45 centimeters

ยงม method อกหลายตวทผเขยนโปรแกรมอาจตองใช ซงไดสรปไวในตารางท 2.7

Page 34: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

54

ตาราง 2.7 Mathematical Functions Method Function Argument Result Type sin(arg) หาคา sine double (radians) double cos(arg) หาคา cosine double (radians) double tan(arg) หาคา tangent double (radians) double asin(arg) หาคา arc sine double double (radians

ระหวาง –π /2 และ π /2)

acos(arg) หาคา arc cosine double double (radians ระหวาง 0.0 และ π )

atan(arg) หาคา arc tangent double double (radians ระหวาง –π /2 และ π /2 )

atan2(arg1, arg2) หาคา arc tangent of arg1 และ arg2

double double (radians ระหวาง –π และ π )

abs(arg) หาคา absolute ของ arg int long float double

เหมอนกนกบ Argument

max(arg1, arg2) หาคาสงสดระหวาง arg1 และ arg2

int long float double

เหมอนกนกบ Argument

min(arg1, arg2) หาคาตาสดระหวาง arg1 และ arg2

int long float double

เหมอนกนกบ Argument

ceil(arg) หาคาทเลกทสดทใหญกวาหรอเทากบ arg

double double

floor(arg) หาคาทใหญทสดทนอยกวาหรอเทากบ arg

double Double

round(arg) หาคา integer ทใกลเคยงกบ arg ทสด

float double ได int ถา argument เปน float และ long ถาเปน double

rint(arg) หาคา integer ทใกลเคยงกบ arg ทสด

double double

IEEEremainder(arg1, arg2)

หาคาเศษทเหลอจากการหาร arg1 ดวย arg2

double double

sqrt(arg) หาคา root ทสองของ arg double double pow(arg1, arg2) หาคาของ arg1 ยกกาลง

arg2 double double

exp(arg) หาคา e ยกกาลง arg double double log(arg) หาคา log ของ arg double double Random() หาคาสมทมากกวา 0.0 แต

นอยกวา 1.0 ไมม double

2.12 การใชขอมลทเปนตวอกษร (char) เราไดดการประกาศตวแปรทเปนตวอกษรมากอนหนานเพยงตวอยางเดยว เพอใหเกดความเขาใจถงการใชขอมลทเปนตวอกษร ใน Java เรามาลองดตวอยางการใชตวอกษรในรปแบบตาง ๆ กนอกสกหนอย

1: /** 2: Using character data 3: */ 4: 5: class Characters {

Page 35: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

55

6: public static void main(String[] args) { 7: char H, e, l, o; 8: 9: H = 72; //ASCII for 'H' 10: e = 101; //ASCII for 'e' 11: l = 108; //ASCII for 'l' 12: o = 111; //ASCII for 'o' 13: 14: System.out.printf("%c", H); 15: System.out.printf("%c", e); 16: System.out.printf("%c", l); 17: System.out.printf("%c", l); 18: System.out.printf("%c", o); 19: System.out.println(" World"); 20: } 21: }

ผลลพธจากการ run โปรแกรม Characters. java กคอคาวา Hello World ซงตวโปรแกรมเองใชรหส Unicode ในการกาหนดคาใหกบตวแปร H e l และ o ซงเมอนาไปแสดงผลกจะไดคาทตวแปรเหลานนเปนอย เรามาลองดการประมวลผลดวยการใช character ดวย operator งาย ๆ ทมอย

1: /** 2: Using operators on characters 3: */ 4: 5: class Characters1 { 6: public static void main(String[] args) { 7: char ch1 = 88, ch2 = 77; 8: 9: System.out.printf("ch1 = %c%n", ch1); 10: System.out.printf("ch2 = %c%n", ch2); 11: 12: ch1 -= 23; //Unicode for 'A' 13: ch2 += 6; //Unicode for 'S' 14: 15: System.out.println("ch1 = " + ch1); 16: System.out.println("ch2 = " + ch2); 17: } 18: }

โปรแกรมเรมตนดวยการกาหนดคาให ch1 และ ch2 มคาเปนตวอกษร X และ M ตามลาดบ และเมอแสดงผลของทงสองตวแปรแลว โปรแกรมกเปลยนคาใหกบตวแปร ch1 และ ch2 ดวยการลดคาของ ch1 ลงเปนจานวนเทากบ 23 และเพมคาใหกบตวแปร ch2 อก 6 เพอใหไดตวอกษร A และ X และเมอ execute โปรแกรมเรากจะไดผลลพธทงหมดเปน ch1 = X ch2 = M ch1 = A ch2 = S ทนเรามาลองดการใช Unicode ในการแสดงผลตวอกษรตาง ๆ

1: /** 2: Unicode character 3: */ 4: 5: class Characters2 { 6: public static void main(String\u005B\u005D args) { 7: char ch1 = '\u0058'; //unicode for 'X' 8: char ch2 = '\u004D'; //unicode for 'M' 9: char ch3 = '\u0041'; //unicode for 'A' 10: char ch4 = '\u0053'; //unicode for 'S' 11: 12: System.out.println("ch1 = " + ch1); 13: System.out.println("ch2 = " + ch2); 14: System.out.println("ch3 = " + ch3); 15: System.out.println("ch4 = " + ch4); 16: } 17: }

Page 36: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

56

ซงเมอ run แลวกจะไดผลลพธเหมอนกนกบผลลพธของโปรแกรม Characters1.java เราสามารถทจะใช Unicode ในการแสดงตวอกษรในภาษาไทยได เชนเดยวกนกบทเราใช Unicode ในการแสดงตวอกษรในภาษาองกฤษ แตวาระบบของเราจะตองเออตอการแสดงผลทเปนตวอกษรไทยดวย ไมเชนนนแลวผลลพธทไดกจะเปนตวอกษรทอานไมรเรอง หรอไมกแสดงผลเปนเครองหมาย '?' ทกตว ถาผอานสงเกตใหดจะเหนวาในบรรทดท 6 เราใช Unicode \u005B และ \u005D แทนเครองหมาย [] ซงเปนการใชท Java ยอมรบเหมอนกบการใช [] โดยตรง ตารางท 2.7 แสดงถงตวอกษรทใชในการแสดงผลลพธทไมใชตวอกษรธรรมดา หรอทภาษาองกฤษเรยกวา Character Escape Sequences ซงเราสามารถนามาใชในการจดวางรปแบบของผลลพธทเราตองการใหดแลวสวยงามขน (อยางหยาบ ๆ และ งาย ๆ) ตาราง 2.7 Character Escape Sequence Escape Sequence ความหมาย \ddd แสดงผลลพธเปนเลขฐานแปด (Octal)

\uxxxx แสดงตวอกษร Unicode (Hexadecimal)

\' ตว ' (Single quote) \" ตว " (Double quote)

\\ ตว \ เอง

\r กลบไปยงจดเรมตนของบรรทด (Carriage return)

\n ขนบรรทดใหม (New line หรอ Linefeed)

\f เลอนไปหนาถดไป (Form feed) \t เลอนไปยงตาแหนงถดไป (Tab)

\b เลอนไปทางซายหนงตวอกษร

2.13 การใชตวแปรชนด boolean เราไดเหนการประกาศตวแปรทเปน boolean มาเพยงนอยนดกอนหนาน ตอไปเราจะมาทาความเขาใจกบขอมลทเปน boolean และการประมวลตวแปรหรอประโยคทมคาของการประมวลผลเปน boolean อกสกเลกนอยกอนทเราจะใชมนในโอกาสตอไป ผเขยนหลายทานเรยก operator เหลานวา Logical Operator โดยทวไปเราสามารถประมวลผลขอมลทเปน boolean ดวย operator ตาง ๆ ทเหนน && หรอทเรยกวา Conditional AND || หรอทเรยกวา Conditional OR & หรอทเรยกวา Logical AND | หรอทเรยกวา Logical OR ! หรอทเรยกวา Logical NOT && และ || มการประมวลผลในรปแบบทหนงสอหลาย ๆ เลมใหชอวา Lazy หรอ Short Circuit ซงมรปแบบการประมวลผลทแตกตางจาก & และ | operator && ตางจาก & โดยท && นนจะไมประมวลผล ประโยคหรอตวแปรทตามหลงตวมนเอง ถาประโยคหรอตวแปรทอยกอนหนามคาเปน false เพราะวาคาทเปน false เมอนามาประมวลผลกบคาอน ๆ แลวจะได false เสมอ operator || กเชนเดยวกนกบ && แตจะประมวลผลประโยคหรอตวแปรทตามมาเมอประโยคแรกหรอตวแปรตวแรกมคาเปน true เพราะวาประโยคหรอตวแปรทมคาเปน true เมอนามาประมวลกบคาใด ๆ กตามจะไดคา true เสมอ

Page 37: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

57

สวน operator & และ | จะประมวลผลประโยคและตวแปรทงสองเสมอ และ operator ! นนเมอไปอยหนาตวแปรหรอประโยคทมคาทาง boolean คาใดคาหนงกจะเปลยนคานนใหเปนตรงกนขามทนท Operator ตวอน ๆ ทใชกบตวแปรหรอประโยคทมคาเปน boolean มดงน < ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย นอยกวา คาทางดานขวาหรอไม > ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย มากกวา คาทางดานขวาหรอไม <= ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย นอยกวาหรอเทากบ คาทางดานขวา หรอไม >= ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย มากกวาหรอเทากบ คาทางดานขวา หรอไม == ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย เทากบ คาทางดานขวาหรอไม != ใชในการเปรยบเทยบวา คาทางดานซายของเครองหมาย ไมเทากบ คาทางดานขวาหรอไม เราเรยก operator เหลานวา Relational operator ซงเอาไวใชในการตรวจสอบความสมพนธของตวแปรหรอประโยความคาแตกตางกนอยางไรเมอนามาเปรยบเทยบกน เราจะลองเขยนโปรแกรมตรวจสอบ operator ตาง ๆ เหลานด

1: /** 2: Testing boolean operations 3: */ 4: 5: class BooleanOp { 6: public static void main(String[] args) { 7: boolean A = true, B = false; 8: 9: System.out.println("Conditional AND"); 10: System.out.println("F && F is " + (B && B)); 11: System.out.println("F && T is " + (B && A)); 12: System.out.println("T && F is " + (A && B)); 13: System.out.println("T && T is " + (A && A)); 14: 15: System.out.println("Conditional OR"); 16: System.out.println("F || F is " + (B || B)); 17: System.out.println("F || T is " + (B || A)); 18: System.out.println("T || F is " + (A || B)); 19: System.out.println("T || T is " + (A || A)); 20: 21: System.out.println("Logical AND"); 22: System.out.println("F & F is " + (B & B)); 23: System.out.println("F & T is " + (B & A)); 24: System.out.println("T & F is " + (A & B)); 25: System.out.println("T & T is " + (A & A)); 26: 27: System.out.println("Logical OR"); 28: System.out.println("F | F is " + (B | B)); 29: System.out.println("F | T is " + (B | A)); 30: System.out.println("T | F is " + (A | B)); 31: System.out.println("T | T is " + (A | A)); 32: 33: System.out.println("Logical NOT"); 34: System.out.println("!F is " + (!B)); 35: System.out.println("!T is " + (!A)); 36: } 37: }

โปรแกรมประกาศตวแปรสองตว A และ B ดวยคา true และ false ตามลาดบ และทาการแสดงผลลพธของการประมวลผลดวย operator ผานทาง System.out.println() ผลลพธทแสดงออกทางหนาจอ คอ Conditional AND F && F is false F && T is false

Page 38: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

58

T && F is false T && T is true Conditional OR F || F is false F || T is true T || F is true T || T is true Logical AND F & F is false F & T is false T & F is false T & T is true Logical OR F | F is false F | T is true T | F is true T | T is true Logical NOT !F is true !T is false ทนลองมาดโปรแกรมการใช Relational operator (BooleanOp2.java)

1: /** 2: Using relational operators 3: */ 4: 5: class BooleanOp2 { 6: public static void main(String[] args) { 7: int i = 5, j = 10; 8: 9: System.out.println("i = " + i); 10: System.out.println("j = " + j); 11: System.out.println("i > j is " + (i > j)); 12: System.out.println("i < j is " + (i < j)); 13: System.out.println("i >= j is " + (i >= j)); 14: System.out.println("i <= j is " + (i <= j)); 15: System.out.println("i == j is " + (i == j)); 16: System.out.println("i != j is " + (i != j)); 17: System.out.println("(i < 10) && (j < 10) is " + ((i < 10) && (j < 10)) ); 18: System.out.println("(i < 10) || (j < 10) is " + ((i < 10) || (j < 10)) ); 19: } 20: }

โปรแกรม BooleanOp2.java ทาการหาคาของประโยคตาง ๆ ในรปแบบงาย ๆ เพอใหผอานไดเหนถงผลลพธของการใช operator ตาง ๆ ไดอยางชดเจน เราประกาศตวแปรทเปน int สองตว คอ i และ j ซงกาหนดใหมคาเปน 5 และ 10 ตามลาดบ หลงจากนนโปรแกรมกใช operator ตาง ๆ กบตวแปรสองตวน และเมอ run โปรแกรมนแลวผลลพธทได คอ i = 5 j = 10 i > j is false i < j is true i >= j is false i <= j is true i == j is false i != j is true (i < 10) && (j < 10) is false (i < 10) || (j < 10) is true

เพอใหเหนภาพของการประมวลของ operator && และ operator || ไดชดเจนยงขน ผอานควรตรวจสอบจากแผนภาพของการประมวลผลน (ภาพท 2-4 และ 2-5) โดยเราไดกาหนดใหตวแปร p

Page 39: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

59

และ q มคาเปน 5 และ 10 ตามลาดบในการประมวลผลทางดานซาย และใหมคาเปน 10 และ 5 ในการประมวลผลทางดานขวา

ภาพท 2- 4 การประมวลผลดวย &&

ภาพท 2-5 การประมวลผลดวย ||

ตาราง 2.8 ไดสรปคาของการประมวลผลดวย operator && || & | ดงทไดกลาวมาแลว ตาราง 2.8 การใช operator && || & และ |

P Q P && Q P || Q P & Q P | Q true true true true true true false true false true false true true false false true false true false false false false false false

เราคงมองไมเหนถงประโยชนของการใชตวแปรทเปน boolean และการใช operator ตาง ๆ ทไดพดถงในตอนนอยางมากมายนก การประมวลผลของตวแปรทเปน boolean สวนใหญจะเอาไวชวยการตรวจสอบถงเหตการณ (condition) ตาง ๆ ทอาจเกดขนในโปรแกรม เชน ถาประโยคทหนง เมอนามาประมวลผลกบ ประโยคทสองแลว ผลลพธทไดเปน true หรอ false ซงถาเปน true เราจะทาการอยางอน และกจะทาการอนหากเปน false เปนตน เราจะพดถง boolean operator ตาง ๆ เมอเราพดถงเรองของ logic และเรองของการประมวลผลในรปแบบของการวนซา (logic and loop)

p = 10, q = 5

(q <= 10)

T

F T

p = 5, q = 10

(p < q) || (q <= 10) (p < q) ||

T ไมตองประมวลผลตอเพราะ T || กบอะไรกได T

p = 10, q = 5

(q <= 10)

T

p = 5, q = 10

(p < q) && (q <= 10) (p < q) &&

T T Fไมตองประมวลตอเพราะ F

&& กบอะไรกได F

Page 40: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

60

2.14 การประมวลผลในระดบ 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 >> 1 13 = 000011012 เมอ shift ไปทางขวา 1 bit ผลลพธทไดคอ 000001102 (เทากบ 6 ในเลขฐาน 10) 13 << 1 shift ไปทางซาย 1 bit ผลลพธทไดคอ 000110102 (เทากบ 26 ในเลขฐาน 10) 13 >>> 1 shift ไปทางขวา 1 bit ผลลพธทไดคอ 000001102 (เทากบ 6 ในเลขฐาน 10) การโยก bit ไปทางซายครงละหนง bit นนทจรงแลวกคอการคณดวยสอง เรามาดตวอยางโปรแกรมการโยก bit ไปทางซายกน จากโปรแกรม ShiftLeftOp.java ทเหนดานลางน

1: /** 2: Using left-shift operator 3: */ 4: 5: class ShiftLeftOp { 6: public static void main(String[] args) { 7: byte bits = 1; 8: 9: System.out.println("Value of bits is " + bits); 10: bits = (byte) (bits << 1); 11: System.out.println("Value of bits is " + bits); 12: bits = (byte) (bits << 1); 13: System.out.println("Value of bits is " + bits); 14: bits = (byte) (bits << 1); 15: System.out.println("Value of bits is " + bits); 16: bits = (byte) (bits << 1); 17: System.out.println("Value of bits is " + bits); 18: bits = (byte) (bits << 1); 19: System.out.println("Value of bits is " + bits); 20: bits = (byte) (bits << 2); 21: System.out.println("Value of bits is " + bits); 22: } 23: }

เราเรมดวยการกาหนดใหตวแปร bits มชนดเปน byte และมคาเทากบหนง โปรแกรมทาการโยก bit ไปทางซายจานวนเทากบหาครง ซงในการโยกแตละครงเรากจะไดคาใหมทมคาเทากบคาเดมคณดวยสอง ดงทเหนจากผลลพธของการ run โปรแกรมน Value of bits is 1 Value of bits is 2 Value of bits is 4

Page 41: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

61

Value of bits is 8 Value of bits is 16 Value of bits is 32

เราเลอกใชขอมลชนดทเปน byte กเพอใหเหนวาถาเราโยก bit อกครงดวยจานวน bit ทตองการโยกเทากบสอง bit (ครงทหก ในบรรทดท 20) เราจะไดคาทตวแปร bits ไมสามารถเกบได ลองด code ทเพม และ ผลลพธของการ run bits = (byte) (bits << 2); System.out.println("Value of bits is " + bits);

ผลลพธเมอ run อกครงดวย code ทเพมขนจะเหนวาคาของ bits ทไดมคาเปน -128 ซงเปนคาท Java เปนผกาหนดให แตไมใชคาทถกตอง เพราะขอมลทเปน byte นนเกบคาสงสดทเปนบวกไดเพยงแค 127 เทานน Value of bits is 1 Value of bits is 2 Value of bits is 4 Value of bits is 8 Value of bits is 16 Value of bits is 32 Value of bits is -128

สงสาคญอกสงหนงกคอ การ cast เราจาเปนตองเปลยนขอมลใหถกตองตามชนดของตวแปร เนองจากวา Java ไดทาการเปลยนตวแปร bits ของเราใหเปน int กอนทจะทาการ shift ดงนนเราตองเปลยนขอมลใหกลบมาเปนชนดเดมกอนการจดเกบ (หลงจากการ shift สนสดลง) การใช >> และ << นนสามารถทาใหจางายขน ดงนคอ การโยก bit ไปทางขวาดวย >> นนเปนการหารตวเลขนน ๆ ดวยสองยกกาลงของจานวน bit ทตองการโยก เชน 128 >> 4 จะใหคา 128/24 = 16 -256 >> 4 จะใหคา -256/24 = -16 สวนการโยก bit ไปทางซายดวย << นนหมายถงการคณตวเลขนน ๆ ดวยสองยกกาลงจานวน bit ทตองการโยก เชน 128 << 1 จะใหคา 128 * 21 = 256 16 << 2 จะใหคา 16 * 22 = 64 โปรแกรมตวอยางตอไปนเปนการแสดงการใช bitwise operator สามตวคอ bitwise AND (&), bitwise OR (|) และ bitwise exclusive OR (XOR)

1: /** 2: Show bitwise operations 3: */ 4: 5: class BitwiseOperations { 6: public static void main(String[] args) { 7: byte bits = 5; 8: 9: System.out.println("Value of bits is " + bits); 10: 11: //using bitwise AND 12: bits = (byte)(bits & 5); 13: System.out.println("Value of bits is " + bits); 14: 15: //using bitwise OR 16: bits = (byte)(bits | 7); 17: System.out.println("Value of bits is " + bits); 18: 19: //using bitwise exclusive OR (XOR) 20: bits = (byte)(bits ^ 4); 21: System.out.println("Value of bits is " + bits); 22: } 23: }

Page 42: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

62

การใช bitwise operator ทงสามตวมหลกการทาดงทแสดงในตารางท 2.10 น ตาราง 2.10 การใช bitwise operator &, |, และ ^ Operator วธใช ผลลพธ

& operand1 & operand2 ถาคาของ bit เปน 1 ทงคผลลพธทไดจะมคาเปน 1

| operand1 | operand2 ถาคาของ bit ตวใดตวหนงเปน 1 ผลลพธทไดจะมคาเปน 1

^ operand1 ^ operand2 ถาคาของ bit ตางกนผลลพธทไดจะมคาเปน 1 โปรแกรม BitwiseOperations.java ทาการ & คา 5 กบ 5 ในบรรทดท 12 ซงทาใหเราไดผลลพธเปน 5 (00000101 & 00000101 = 00000101) ในบรรทดท 16 เราทาการ | คา 5 กบ 7 เรากไดผลลพธเปน 7 (00000101 | 00000111 = 00000111) และในบรรทดท 20 เราทาการ ^ คาของ 7 กบ 4 ซงไดผลลพธเปน 3 (00000111 ^ 00000100 = 00000011) เราไดพดถงการประกาศตวแปร การกาหนดคาใหกบตวแปรทอยภายในตวโปรแกรม ดวยขอมลทงทมชนดเปน integer และ floating-point ซงการกาหนดคาใหกบตวแปรภายในโปรแกรมนน ไมมความยดหยนของขอมลทถกเกบอยในตวแปรนน หากผใช หรอ ผเขยนโปรแกรมตองการทจะเปลยนคาทตวแปรนนเกบอย ผเขยนจะตองเปนผแกไขแตเพยงฝายเดยว ผใชโปรแกรมไมสามารถทจะเปลยนคาเหลานนได ดงนนการเขยนโปรแกรม จะตองใหโอกาสผใชโปรแกรมในการเปลยนแปลงคาเหลานน Java ม method อยหลายตวทรองรบการใสขอมลผานทาง keyboard เราจะมาทาความรจก และเขาใจถงวธการ ซงคอนขางจะซบซอนพอสมควรสาหรบผเรมหดเขยนโปรแกรมใหม อยางไรกตามหลงจากทไดทาความเขาใจแลว กจะเหนวาการรบคาตาง ๆ ผานทาง keyboard นนเปนเรองท (จรง ๆ แลว) ไมยงยากเลย 2.15 การกาหนดคาใหกบตวแปรผานทางสอการนาเขาขอมลมาตรฐาน ใน Java รนกอน 1.5 เราไมสามารถเรยกใช method ใด ๆ ทรบคาขอมลตามชนดนน ๆ ของขอมลทเขามาเลย เชน ถาผใชโปรแกรมตองการทจะใสคาทเปน int float double หรอ char ผเขยนโปรแกรมกไมสามารถทจะรบคาตาง ๆ เหลานไดโดยตรง เหมอนกบการเขยนโปรแกรมดวยภาษาอน ๆ เชน C หรอ C++ แตตวผเขยนเองจะตองเขยน code ขนมารองรบคาเหลานผานทางการอานเขาแบบทเรยกวา การรบขอมลทเปน String ซงเมออาน String ไดแลวกตองแปลง String ใหเปนชนดของขอมลทผเขยนโปรแกรมตองการใหเปน [แตใน Java รน 1.5 เราสามารถอานคาเหลานผานทาง keyboard ไดเลย ซงเราจะไดพดตอไปในเรองของ Scanner] ผอานอาจสงสยวา String คออะไร ในทนจะอธบายอยางคราว ๆ เนองจากวาเราจะพดถง String ในบทอนตอไป ใน Java นน String เปน object (อกแลว object? เชนเดยวกนเราจะพดถง object อยางละเอยดในบทอน) ซงสามารถเกบตวอกษรไดคราวละมาก ๆ ขอยกตวอยางงาย ๆ ใหดกแลวกน People of Thailand สวสด price_of_coffee 1234567890 23+popOfRock ตวอยางทเหนดานบนนลวนแลวแตเปน String ทงนน ทนเรามาลองดวธการอาน String เขามาจาก keyboard แลวกเปลยน String ใหเปนขอมลชนดตาง ๆ ทเราตองการ เรมดวยการเปลยนแปลง code ของโปรแกรม Radius.java ใหรบคาของ area จาก keyboard แทนการกาหนดภายในโปรแกรม

1: /** 2: Reading data from keyboard 3: */ 4: import java.io.*; 5: 6: class Radius2 { 7: public static void main(String[] args) throws IOException { 8: double radius, area;

Page 43: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

63

9: int meters, centimeters; 10: String inputString = null; 11: 12: 13: //prompt user for area of a circle 14: System.out.print("Enter area of a circle: "); 15: 16: //get string from keyboard 17: InputStreamReader in = new InputStreamReader(System.in); 18: BufferedReader buffer = new BufferedReader(in); 19: inputString = buffer.readLine(); 20: 21: //convert string to double 22: area = Double.parseDouble(inputString); 23: 24: //calculate radius 25: radius = Math.sqrt(area / Math.PI); 26: 27: //convert to meters and centimeters 28: meters = (int)Math.floor(radius); 29: centimeters = (int)Math.round(100.0 * (radius - meters)); 30: 31: System.out.print("Circle with area of " + area + " square meters "); 32: System.out.print("has a radius of " + meters + " meters and "); 33: System.out.println(centimeters + " centimeters"); 34: } 35: }

โปรแกรม Raadius2.java เพม code ใหอาน String จาก keyboard ดวยประโยค System.out.print("Please enter area of a circle: "); InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in); String inputString = buffer.readLine();

ประโยคแรกสดเปนการสงขอความไปยง user ใหรวาตองใสขอมลอะไรเขาสโปรแกรม ประโยคถดมาอานขอมลในรปแบบของ byte จากระบบ (System.in) เปลยนขอมลเหลานนใหเปน character แลวจงนามาเกบไวในตวแปร in ประโยคทสามทาการจองเนอทใหกบตวแปร buffer พรอมกบนาคา character ทอยในตวแปร in มาเกบไวในรปแบบของ String เมอได String (ซงตอนนอยในตวแปร buffer) เรากทาการอาน String ทวานดวย method readLine() ผานทางตวแปร buffer แลวจงนาไปเกบไวในตวแปรชนด String ทมชอวา inputString ฟงดแลวรสกวามขนตอนมากมายในการอาน String แตตอนนขอเพยงแตจาวาถาจะอาน String จาก keyboard ตองทาดวยวธน (ณ เวลาน เพราะยงมอกหลายวธทเราสามารถทาได) เมอเราได String แลวขนตอนตอไปกคอการเปลยน String ใหเปนขอมลชนดทเราตองการใชในโปรแกรม ซงโปรแกรม Radius2.java ของเราตองการใชขอมลชนดทเปน double เราจงตองทาการเปลยน String นใหเปน double ดวยการเรยกใช method parseDouble() จาก class Double พรอมทงสงตวแปรทเกบขอมลจาก keyboard ไปใหแก method นดวย area = Double.parseDouble(inputString);

หลงจากนน code ของโปรแกรมทเหลอกเหมอนกบทเราไดเขยนกอนหนาน และเมอ run โปรแกรมด สองครง ดวยคา 850 ในครงแรกและคา 54 ในครงทสอง เรากไดผลลพธ ดงทแสดงใหเหนน Please enter area of a circle: 850 Circle with area of 850.0 square meters has a radius of 16 meters and 45 centimeters Please enter area of a circle: 54 Circle with area of 54.0 square meters has a radius of 4 meters and 15 centimeters

ถาสงเกตใหดจะเหนวาโปรแกรม Radius2.java นนมขอความเพมตอทายของ main(..) คอ throws IOException

Page 44: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

64

เหตผลทเราตองเพม throws IOException ใหกบ main(…) กเพราะวา การอานขอมลเขาสโปรแกรมนน บางครงกอาจเจอกบปญหาในการอาน เชน อานไมได และเหตผลอกอนหนง คอ Java บงคบใหเราตองตรวจสอบการทางานกบ I/O เอง ซงถาหากมปญหาเกดขน เราจะไดแกไขไดถกตอง มวธการตรวจสอบและปองกนไมใหการอานมปญหาหลากหลาย ซงเราจะไดดกนในโอกาสตอไป (บทท 7) ลองมาดวาถาเราไมใสขอความทวาลงไปในโปรแกรม Radius2.java เราจะได error อะไร Radius2.java:16: unreported exception java.io.IOException; must be caught or declared to be thrown String inputString = buffer.readLine(); ^ 1 error

จะเหนวา Java จะบอกใหเรารวาเราไมสามารถทจะอานขอมลเขาสโปรแกรมได ถาเราไมทาการตรวจสอบดวยวธทไดกลาวไว ประโยคทวา must be caught or declared to be thrown กลาวถงวธ สองวธ ทเราสามารถใชไดในการอานขอมลเขาสโปรแกรม คอ (1) ตรวจจบ – catch และ (2) เรยกใช throws ของ Java ตอไปจะไดแสดงการใชวธทหนง ซงเปนการตรวจจบ error ในการอานขอมล แตจะพดเพยงเพอใหการอานขอมลทาไดสมบรณเทานน คงจะไมกลาวถงอยางละเอยดมากมายนก เรามาเรมตนดวยการเขยน code เพมขนใหม ดงทแสดงใหเหนน

1: /** 2: Reading data from keyboard with error detection 3: */ 4: 5: import java.io.*; 6: 7: class Radius3 { 8: public static void main(String[] args) throws IOException { 9: double radius, area; 10: int meters, centimeters; 11: String inputString = null; 12: 13: try { 14: //prompt user for area of a circle 15: System.out.print("Please enter area of a circle: "); 16: 17: //get string from keyboard 18: InputStreamReader in = new InputStreamReader(System.in); 19: BufferedReader buffer = new BufferedReader(in); 20: inputString = buffer.readLine(); 21: } 22: catch(IOException ioe) {} 23: 24: //convert string to double 25: area = Double.parseDouble(inputString); 26: 27: //calculate radius 28: radius = Math.sqrt(area / Math.PI); 29: 30: //convert to meters and centimeters 31: meters = (int)Math.floor(radius); 32: centimeters = (int)Math.round(100.0 * (radius - meters)); 33: 34: System.out.print("Circle with area of " + area + " square meters "); 35: System.out.print("has a radius of " + meters + " meters and "); 36: System.out.println(centimeters + " centimeters"); 37: } 38: }

สงทเราไดปรบปรงคอประโยค ตอไปน String inputString = null;

Page 45: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

65

//prompt user for area of a circle System.out.print("Please enter area of a circle: "); try { //get string from keyboard InputStreamReader in = new InputStreamReader(System.in); BufferedReader buffer = new BufferedReader(in); inputString = buffer.readLine(); } catch(IOException ioe) {}

เรายายการประกาศตวแปร inputString ไปอยกอนประโยคทอานขอมลเขาพรอมกบเพมประโยค try { … … … } catch(IOException ioe) {}

เขาสโปรแกรมดวยการนาเอาประโยคการอานขอมลเขาส string ทงสามประโยคไวใน block ของ try {} สวนคาวา catch(IOException ioe) {} นนเรากเพมเขาหลงจาก block ของ try {} เราไมจาเปนตองใส code อะไรเขาไปใน code ของ catch(IOExcpetion ioe) {} เพราะเราเพยงแตตองการใหการอานเปนไปไดดวยดเทานน เรายงจะไมกงวลถง error ทเกดขน ซงถาม error เกดขน Java กจะเปนผฟองใหเราทนท เพอใหเกดความเขาใจอกสกหนอย เราจะมาตรวจสอบการใสขอมลของผใชดวา ไดมการใสขอมลเขาสโปรแกรม หรอเพยงแตกดปม Enter เฉย ๆ เราทาการตรวจสอบดวยการเพม try {..} และ catch() {} ใหกบโปรแกรม Radius3.java ดงน

1: /** 2: Reading data from keyboard with error detection 3: */ 4: import java.io.*; 5: 6: class Radius4 { 7: public static void main(String[] args) { 8: double radius, area; 9: int meters, centimeters; 10: String inputString = null; 11: 12: //prompt user for area of a circle 13: System.out.print("Please enter area of a circle: "); 14: try { 15: //get string from keyboard 16: InputStreamReader in = new InputStreamReader(System.in); 17: BufferedReader buffer = new BufferedReader(in); 18: inputString = buffer.readLine(); 19: 20: try { 21: //convert string to double 22: area = Double.parseDouble(inputString); 23: 24: //calculate radius 25: radius = Math.sqrt(area / Math.PI); 26: 27: //convert to meters and centimeters 28: meters = (int)Math.floor(radius); 29: centimeters = (int)Math.round(100.0 * (radius - meters)); 30: 31: System.out.print("Circle with area of " + area + " square meters "); 32: System.out.print("has a radius of " + meters + " meters and "); 33: System.out.println(centimeters + " centimeters"); 34: } 35: //catch empty string (user hits Enter) 36: catch(Exception e) { 37: System.out.println("Error! you must supply input"); 38: e.printStackTrace();

Page 46: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

66

39: System.exit(1); 40: } 41: } 42: //catch other I/O error - do nothing 43: catch(IOException ioe) { /* leave it to Java! */ } 44: } 45: }

โปรแกรม Radius3.java ทเราเขยนขนใหมม try {…} และ cath() {} อยสองตว ตวแรกใชตรวจสอบเรองของการอานทวไปทไดกลาวไปแลว สวนตวทสองเปนการตรวจสอบวาผใชมการใสขอมลหรอไม ซงถาไมใส เรากจะสงขอความไปยงหนาจอดวยคาสง System.out.println("Error! you must supply input"); 1. สงขอความ error ท Java ไดฟองไว ดวยคาสง e.printStackTrace(); 2. ออกจากโปรแกรมโดยไมมการประมวลผลใด ๆ ทงสน ดวยคาสง System.exit(1); และเมอ execute ดเรากจะไดขอความดงน Please enter area of a circle: < User กดปม Enter > Error! you must supply input java.lang.NumberFormatException: empty String at sun misc FloatingDecimal.readJavaFormatString (Unknown Source) at java.lang.Double.parseDouble(Unknown Source) at Radius4.main(Radius4.java:22) โดยทวไปการออกจากโปรแกรมทไมมปญหาใด ๆ ในการเขยนดวยภาษา Java นนเราจะใชการออกดวยเลข 1 ในประโยค System.exit(1) หรอเลขอน ๆ ทไมใช 0 สวนการออกแบบปกตนนเราใชเลข 0 แทนเลข 1 เราคงจะพกการตรวจสอบ หรอ ตรวจจบ error ไวเพยงแคนกอนเราจะกลบมาพดถงการเขยน code รองรบ error ในบทอนตอไป 2.15.1 การนาขอมลเขาผานทาง Scanner การนาขอมลเขากอนหนานดไปแลวจะรสกวามขนตอนทคอนขางจะยงไปสกหนอย (ยงถาผอานเคยเขยนโปรแกรมดวยภาษาอน เชน C แลวยงจะมความหงดหงดกบการนาขอมลเขาของ Java) เพราะฉะนน เราจะมาดกนถงการนาขอมลเขาดวยการใช Scanner Scanner เปนตวกลางทยอมใหมการโยกยายขอมลจากแหลงหนงไปอกแหลงหนงเชน จาก keyboard เขาสตวแปรเปนตน โปรแกรมตวอยางทเหนเปนการอานขอมลเขาจาก keyboard ผานทาง Scanner

1: /** 2: Reading numbers via Scanner 3: */ 4: 5: import java.util.Scanner; 6: import static java.lang.System.out; 7: 8: class AddIntegers { 9: public static void main(String[] args) { 10: //setup input channel via command prompt 11: Scanner input = new Scanner(System.in); 12: 13: int number1, number2; 14: int sum; 15: float average; 16: 17: //prompt for two integers 18: out.print("Enter first integer: "); 19: number1 = input.nextInt(); 20: out.print("Enter second integer: "); 21: number2 = input.nextInt(); 22: 23: //find sum and average

Page 47: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

67

24: sum = number1 + number2; 25: average = sum / 2.0F; 26: 27: //display results 28: out.printf("Sum of two integers is %d%n", sum); 29: out.printf("Average of two integers is %.2f%n", average); 30: } 31: }

ในบรรทดท 11 เรากาหนดใหการนาขอมลเขาผานทาง command prompt โดยใช Scanner เปนตวกลาง และเราอานขอมลทเปน integer ในบรรทดท 19 และ 21 ซงเราจาเปนตองอาศย method nextInt() เปนตวอานให class Scanner ม method หลายตวทเราสามารถเรยกใชอานขอมลชนดตาง ๆ ได เชน ขอมลทเปน integer ใช nextInt() ขอมลทเปน float และ double เรยกใช nextFloat() และ nextDouble() ตามลาดบ ขอมลทเปน long และ short เรยกใช nextLong() และ nextShort() ตามลาดบ ถาตองการอานขอมลอน ๆ โดยไมสนใจชนดเรากเรยกใช next() ซงหมายถงการอานขอมลตวถดไป หรอ nextLine() ทหมายถงการอานขอมลทงบรรทด สวนการตรวจสอบวามขอมลอยอกหรอไมเรากเรยกใช hasNext(), hasNextInt(), หรอ hasNextDouble() Class Scanner ยงม method อน ๆ ใหเราเรยกใชไดอกมาก ทงนผอานสามารถหาดไดจาก Java API ไดเอง 2.15.2 การนาขอมลเขา และออกผาน Dialog Box การนาขอมลเขาสโปรแกรมผานสอนาเขาขอมลทเราไดใชมากอนหนาน ดจะยงยากพอสมควร มวธการนาขอมลเขาอกทางหนงทผเขยนคดวาทาไดงายและสะดวกกวา นนกคอการนาขอมลเขาผานทาง InputDialog ซงเปน Method ท Java มไวใหในกลมทใช Swing เราคงจะไมเขาไปดถงรายละเอยดมากมายในเรองของการใช Swing เราเพยงแตหยบเอา method บางตวทเราคดวาเออการทางานของเราใหงายขน ลองมาดตวอยางโปรกแกรมการนาขอมลเขาผานทาง InputDialog

1: /** 2: Reading input via InputDialog 3: */ 4: import javax.swing.*; 5: 6: class InputTest { 7: public static void main(String[] args) { 8: //get name 9: String name = JOptionPane.showInputDialog("What is your name?"); 10: 11: //get age 12: String ageStr = JOptionPane.showInputDialog("Tell me you age."); 13: int age = Integer.parseInt(ageStr); 14: 15: //send output to standard output device (console) 16: System.out.println("Hello " + name + " " + 17: age + " is very young!"); 18: 19: System.exit(0); 20: } 21: }

หลงจากท compile และ run โปรแกรม หนาตางแรกทเราไดคอ

Page 48: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

68

หลงจากทใสขอมล Peter Pan เรากกดปม OK ซงจะทาใหหนาตางทสองเกดขน

ซงเมอกดปม OK แลวผลลพธทไดจากการประมวลผลจะถกนาไปแสดงยง console ทเราไดเปดอยดงน Hello Peter Pan 42 is very young!

ในโปรแกรม Inputtest.java เราใชตวแปร 3 ตวเปนตวเกบขอมล 2 ตวแรก name และ ageStr เปน String ทเกบขอมลท user ใสเขาสโปรแกรมผานทาง String name = JOptionPane.showInputDialog ("What is your name?"); String ageStr = JOptionPane.showInputDialog ("Tell me your age."); สวนตวแปร age เปนการแปลง string ท user ใสเขามาใหเปน int เชนเดยวกบทเราไดทามากอนหนาน สาหรบประโยคทอยในบรรทดสดทายนน (System.exit(0)) เราจาเปนจะเหนทจะตองใสไว เนองจากเปนขอกาหนดของ Java เมอไรกตามทเราใช JOptionpane.showInputDialog เราจะตองมประโยคนเพอบงคบให Java ทาการยตการทางานของ Thread ทควบคม InputDialog อย การสงผลลพธไปยง console กเปนการสงทใชไดดอยางหนงในการตรวจสอบวาโปรแกรมของเราทางานไดดและถกตองหรอไม แตถาเราใช InputDiaglog แลวเรากนาทจะสงผลลพธใหออกไปในรปแบบทเหมอนกน หรอคลายคลงกน เรามาลองดโปรแกรมตวอยางตอไปทเรยกใช MessageDialog ในการสงขอมลออกไปยง user

1: /** 2: Reading input via InputDialog 3: Sending output via MessageDialog 4: */ 5: import javax.swing.*;

Prompt user เพอใสขอมล

กดปม OK เพอยอมรบขอมล ซงจะทาให dialog box ปดตวเอง

ลงดวย

กดปม Cancel เพอยกเลกขอมลพรอมกบปด dialog box

Page 49: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

69

6: 7: class OutputTest { 8: public static void main(String[] args) { 9: //get name 10: String name = JOptionPane.showInputDialog("What is your name?"); 11: 12: //get age 13: String ageStr = JOptionPane.showInputDialog("Tell me you age."); 14: int age = Integer.parseInt(ageStr); 15: age += 5; 16: 17: JOptionPane.showMessageDialog(null, 18: "Hello " + name + ", " + 19: " 5 years from now you will be " + age + 20: ".\nWhich is still very young!", 21: "Output", 22: JOptionPane.INFORMATION_MESSAGE); 23: 24: System.exit(0); 25: } 26: }

โปรแกรม OutputTest.java ไดถกปรบปรงขนจากโปรแกรม InputTest.java ทเราเขยนขนกอนหนาน สงทเราไดเพมขนมากคอ JOptionPane.showMessageDialog(null, "Hello " + name + ", " + " 5 years from now you will be " + age + ".\nWhich is still very young!", "Output", JOptionPane.INFORMATION_MESSAGE);

ซงเปนการสงขอมลไปยง user ผานทาง Dialog Window โดยท showMessageDialog() จะตองม parameter สงไปทงหมด 4 ตว ดงน

1. Component 2. Object ทเปน message ทตองการสงออก 3. string ทเปนหว หรอ title ของ MessageDialog 4. ชนดของ Message

เรากาหนดให Component เปน null (เรองนอยนอกเหนอ scope ของหนงสอเลมน) สวน Object ทเปน message เรากาหนดใหเปน "Hello " + name + ", " + " 5 years from now you will be " + age + ".\nWhich is still very young!",

String ทเปน title ของ MessageDialog นน เรากาหนดใหมคาเปน "Output" ซงผอานและสดทายเรากาหนดใหชนดของ message เปนเพยงแคขอมล (INFORMATION_MESSAGE) ซงการบอกชนดของ message จะทาให icon ของ MessageDialog เปลยนไป ผอานควรเปรยบเทยบขอความดงกลาวกบผลลพธทไดจากการ run น (ขอมลเขาเหมอนเดม)

ขนาดของ MessageDialog จะขนอย กบความยาวของ message ทถกสงออกกไป เราสามารถทจะใช "\n" เปนตวกาหนดการขนบรรทดใหมของขอมลได ผอานควรสงเกตถงการสงขอมลทเปน int ไป

Page 50: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

70

ยง MessageDialog (ตวแปร age) เราไมจาเปนทจะตองเปลยนใหเปน string กอนการสงแตอยางใด การแปลงชนดจะทาโดยอตโนมต ถาระบบของผอานรองรบการใชภาษาไทย และใช Java ทรองรบภาษาไทยเหมอนกน การเปลยนขอมลบางอยางในโปรแกรมจะทาใหผลลพธมหนาตาคลายๆ แบบน

ตวอยางทเราแสดงใหดเปนการอานขอมลเพยงตวเดยวจาก keyboard ถาเราตองการอานขอมลทมมากกวาหนงตว เราตองทาอยางไรบาง คาตอบงาย ๆ ทเราสามารถทาไดทนทกคอ ใช dialog box อานทละตว แตวธการแบบน ทาใหเราตองเสยเวลาในการนาขอมลเขามากเกนไป (หนง dialog box ตอหนงขอมล) เพราะฉะนนเราตองหาวธใหมในการนาขอมลเขา ซงเราจะกลบมาดกนถงวธดงกลาวในบทท 3 เมอเราไดพดถงเรองของการประมวลผลแบบวน (loop) 2.16 การใช enum ใน Java 1.5 เราสามารถใช enum ในการกาหนดชนดของขอมลสาหรบการใชงานในลกษณะพเศษทไมเหมอนกบขอมลชนดอน ยกเวนการใช final ทเราไดพดไปแลว ซงมสวนคลายกบรปแบบการเรยกใชของ enum แตมประสทธภาพทดอยกวา เราจะมาดการใช enum ในโปรแกรมตวอยางตอไปน

1: /** 2: Shows simple usage of enum 3: */ 4: 5: enum Season {SUMMER, RAINNY, WINTER}; 6: 7: class UseOfEnum { 8: public static void main(String[] args) { 9: //printing values of enum 10: System.out.println("Seasons in Thailand are: " + 11: Season.SUMMER + ", " + 12: Season.RAINNY + ", and " + 13: Season.WINTER); 14: } 15: }

ในการประกาศใช enum นนเราตองขนตนการประกาศดวยคาวา enum ตามดวยชอของ enum ทเราตองการใช ตามดวยเครองหมาย { ซงในเครองหมาย { นเราสามารถใสขอมลทเราตองการไว ดงทเราทาใน enum Season เพราะวาเราตองการเรยกใชคาของฤดตาง ๆ ทมอยในบานเราดงนน เราจงกาหนดใหม 3 ฤดคอ SUMMER, RAINNY, และ WINTER พรอมกบปดทายดวยเครองหมาย } ในการเรยกใช enum นนเราตองขนตนดวยชอของ enum ตามดวยจด (.) และชอแทนขอมลทเราไดประกาศภายใน enum นน เชน Season.WINTER

เราไมจาเปนตองกาหนดคาใหกบสญลกษณทเราไดประกาศใชภายใน enum กอนทเราจะเรยกใชสญลกษณเหลานน ทงนกเพราะวา Java ไดทาการกาหนดคาเหลานนใหเราโดยอตโนมต ซงเราสามารถเรยกดได เชน ถาเราเพมประโยคนเขาสโปรแกรม UseOfEnum.java System.out.println("SUMMER = " + Season.SUMMER.ordinal() + "\n" + "RAINNY = " + Season.RAINNY.ordinal() + "\n" + "WINTER = " + Season.WINTER.ordinal());

Page 51: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

71

ซงจะใหผลลพธคอ Seasons in Thailand are: SUMMER, RAINNY, and WINTER SUMMER = 0 RAINNY = 1 WINTER = 2

จะเหนวาผลลพธของการเรยกดวย Season.SUMMER กจะสง SUMMER ใหเราทางหนาจอ ซงเปนสงทดมาก ทงนกเพราะวาในการเขยนโปรแกรมหลาย ๆ ครงเราตองการแสดงผลตวสญลกษณเอง ไมใชคาของสญลกษณเหลานน สวนผลลพธทตามมากเปนคาของสญลกษณเหลานนท Java ไดกาหนดไวให โปรแกรมตวอยางทเหนอาจไมมประโยชนอะไรมากมายนก แต enum ยงมวธการใชแบบอน ๆ อกใหเราไดใช ซงเราจะไดดในบทตอ ๆ ไป สรป เราไดเรยนรถงขอมลชนดตาง ๆ ทเปนขอมลแบบพนฐาน หรอทเรยกวา primitive datatype ท Java มให รวมไปถงการประกาศตวแปร การกาหนดคาใหกบตวแปร การประมวลผลตวแปรชนดเดยวกน และ ตางชนดกน การเปลยนชนดของขอมล (casting) การใช method ทเกยวของกบตวเลข การแสดงผลตวเลขทมจดทศนยม การอานขอมลเขาสโปรแกรม การตรวจสอบ และตรวจจบ error ทอาจเกดขนในการอานขอมล การทางานในระดบ bit และการใช dialog box ในการอานและแสดงผลขอมล แบบฝกหด 1. จงอธบายถงความหมายของคาวา final พรอมทงยกตวอยางประกอบ 2. จงอธบายถงความแตกตางระหวาง 5, 5.0, '5', "5", และ "5.0" 3. จงแสดงผลลพธของประโยคตอไปน

3.1. System.out.println("4" + 4); 3.2. System.out.println('4' + 4); 3.3. System.out.println("4" + 4 + 4); 3.4. System.out.println("4" + (4 + 4)); 3.5. System.out.println('4' + 4 + 4);

4. จงแสดงผลลพธของประโยคตอไปน

4.1. System.out.println("Value is %f %e\n", 45.25, 45.25); 4.2. System.out.println("Value is %5.4f %5.4e\n", 45.25, 45.25); 4.3. System.out.println("%4b%n", (4 > 5)); 4.4. System.out.println("%6s\n", "Java");

5. จงหาวาประโยคตอไปนเกยวของกบการ cast หรอไมถาเกยวของใหหาผลลพธของการ cast นน

char c = 'A'; in = (int)c; boolean b = true; in = (int)b; float f = 500.44f; in = (int)f; double d = 500.44d; in = (int)d;

Page 52: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

72

int x = 65; char c = (char)x; int v = 1000; Boolean b = (Boolean)v;

6. กาหนดให x มคาเปน 1 จงหาคาของการประมวลผลตอไปน

6.1. (x > 1) & (x++ > 1) 6.2. (x > 1) && (x++ > 1) 6.3. x >> 1 6.4. x << 1 6.5. x >>> 1 6.6. x ^ 1 6.7. x & 1 6.8. x | 1

7. จงหาผลลพธของการประมวลผลประโยคตอไปน ถากาหนดให

double x = 4.5; double y = -45.25; int p = 12; int q = 2; 7.1. x + p * y / (p – y) * x 7.2. p % (p – q) 7.3. (int) y 7.4. (int) p 7.5. Math.round(x) 7.6. (int) Math.round(y) 7.7. -2 * y + (int) x 7.8. q / p 7.9. p % q 7.10. y * y – y + (x * (int) x)

8. จงเขยนโปรแกรมทรบตวเลขชนด int จาก keyboard จานวน 2 ตว และขอมลชนด double อก

2 ตว หลงจากนนใหโปรแกรมคานวณหาผลรวมของเลขทง 4 ตว ใหเกบผลลพธทหาไดไวในตวแปรตวใหม สงผลลพธทไดไปยงหนาจอ

9. จงเขยนประโยคดวยภาษา Java จากสมการทใหน

9.1. a + bc / 2 9.2. a(a – c) + b(b – c) – (c(c – a) / d) 9.3. b2 – 4ac 9.4. (4/3)2 / 2

9.5. 21 T

kDxMTq +⎟

⎠⎞

⎜⎝⎛

−=

10. จงเขยนโปรแกรมททาการเปลยน องศา Celsius ใหเปนองศา Fahrenheit โดยกาหนดใหขอมล

ทตองการเปลยน นาเขาจาก keyboard โดยกาหนดใหสตรการเปลยน คอ

Celsius = 95

(Fahrenheit – 32)

Page 53: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

บทท 2: ขอมล ตวแปร และการประมวลผล

73

11. จงเขยนโปรแกรมททาการเปลยน องศา Fahrenheit ใหเปนองศา Celsius โดยกาหนดใหขอมลทตองการเปลยน นาเขาจาก keyboard

12. จงเขยนโปรแกรมทรบขอมลทเปนจานวนกโลกรมจาก keyboard เปลยนใหเปน mile สง

ผลลพธไปยงหนาจอ 13. จงเขยนโปรแกรมทอานขอมลจาก keyboard ทเปนอายของผใชในรปแบบของป ใหโปรแกรม

เปลยนเปนจานวนวน สงผลลพธออกทางหนาจอ (กาหนดให 1 ปเทากบ 365 วน) 14. จงเขยนโปรแกรมทรบ int จานวน 5 ตว หาคาเฉลยของตวเลขเหลาน เสรจแลวสงผลลพธไปยง

หนาจอ 15. จงเขยนโปรแกรมทคานวณหาเวลาทแสงเดนทางจากโลกไปยงดวงอาทตย ใหสงผลลพธของ

การคานวณในรปแบบของนาท สงผลลพธทหาไดไปยงหนาจอ 16. สมมตวาอาจารยทกคนในวทยาลยแหงหนงดม beer 1 ขวดตอวน และในการทา beer 1 ลง (24

ขวด) นนตองใชขาว barley จานวน 1 ถง ถาจานวนของอาจารยในวทยาลยทวานมทงสน 200 คน จงเขยนโปรแกรมในการคานวณหาจานวนของขาว barley ทตองใชในการทา beer ใหเพยงพอตอการบรโภคของอาจารยในวทยาลยนตลอดภาคการศกษา

17. จงเขยนโปรแกรมทรบขอมลชนด long ทมจานวนของตวเลข (digit) อยระหวาง 10 – 12 ตว ให

สงผลลพธในรปแบบของ ตวเลขทใชเครองหมาย , เปนตวแบงกลม โดยเรมตนจากทางขวามอ และใหมตวเลขกลมละ 3 ตวไปยงหนาจอ

18. จงเขยนโปรแกรมทรบคาความยาวของดานทกดานของสามเหลยม จากนนใหคานวณหาคาของ

เสนรอบรป (perimeter) สงผลลพธไปยงหนาจอ 19. จงเขยนโปรแกรมทคานวณหาพนทของวงกลม จากรศมทรบเขามาจาก keyboard 20. จงเขยนโปรแกรมทรบขอมลชนด double จานวน 5 ตวจาก keyboard จากนนใหคานวณหา

คาเฉลยของตวเลขเหลานน สงผลลพธทหาไดไปยงหนาจอ 21. กาหนดใหเสนผาศนยกลางของดวงอาทตยเทากบ 865,000 ไมล และเสนผาศนยกลางของโลก

เทากบ 7,600 ไมล จงเขยนโปรแกรมทคานวณหา

21.1. ปรมาตรของโลก (cubic mile หรอ mile3) 21.2. ปรมาตาของดวงอาทตย (cubic mile) 21.3. อตราสวนของปรมาตรของดวงอาทตยตอปรมาตรของโลก

22. จงเขยนโปรแกรมทรบขอมลชนด double ทอยในรปแบบ xxx.xxxx เชน 123.4567 จาก

keyboard จากนนใหดงเอาสวนของขอมลทอยหนาจดทศนยมไปเกบไวในตวแปรทมชนดเปน long ตวหนง เสรจแลวใหเกบขอมลทอยหลงจดทศนยมไปเกบไวในตวทเปน long อกตวหนง สงผลลพธทอยในตวแปร long ทงสองไปยงหนาจอ

23. จงเขยนโปรแกรมแสดงผลการยกกาลงของ integer จาก 0 ถง 10 ดงเชนตวอยางทแสดงใน

ตารางน

number square cube 0 0 0 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000

Page 54: JAVA Basic Th Ch2 Variables&Expressions

intro

. to

Java

(FE

U.fa

a)

เรมตนการเขยนโปรแกรมดวย Java

74

24. จากขอ 4 จงเขยนโปรแกรมทรบขอมลผานทาง JOptionPane.showInputDialog เมอ

คานวณหาคาเสนรอบรปไดแลวใหสงผลลพธออกทาง JOptionPane.messageDialog 25. ใช JOptionPane เขยนโปรแกรมแกปญหาของโจทยในขอ 19 26. จงเขยนโปรแกรมททาหนาทเปลยนตวอกษรภาษาองกฤษตวเลก (lower case) ใหเปนตวใหญ

(upper case) โดยไมมการเรยกใช method ใด ๆ ของ Java (ดตาราง ASCII เพอหาคาความตางของตวอกษรทงสองแบบ)

27. จงเขยนโปรแกรมทอานคาสามคาทเปนคาของสามเหลยมทงสามดาน พรอมทงคานวณวาคาท

อานเขามานนสามารถสรางสามเหลยมไดจรง โดยแสดงผลกลบออกไปในรปแบบของ true หรอ false เชน

Can edges 1, 2, and 1 form a triangle? False Can edges 2, 2, and 1 form a triangle? True [ดานสามดานจะเปนสามเหลยมได ถาผลรวมของดานสองดานใด ๆ มคามากกวาดานอกดานทเหลออย]

28. จงเขยนโปรแกรมทอานคาระหวาง 0 ถง 1000 เพอนามาคานวณหารผลรวมของตวเลขทอยใน

คาทอานเขามา เชน ถาคาทอานมคาเปน 345 ผลลพธทไดคอ 12

[ใช operator % เพอดงตวเลขออกจากคาทอานเขามา และใช operator / ในการลบตวเลขออกจากคานน เชน 654 % 10 = 4 และ 654 / 10 = 65]

29. ใช JOptionPane เขยนโปรแกรมแกปญหาของโจทยในขอ 20 ขอสงเกตของการใช

JOptionPane มขดจากดในเรองของการใสขอมล คอจะใสไดเพยงแค string หนงตว ดงนนถาตองใสขอมลทเปน double 5 ตวเราจาเปนทจะตองมาตรการอนเขามาชวย เชน ใชชองวางเปนตวแบงขอมลใน string ทนาเขาดงตวอยางตอไปน

ผลลพธทไดจาการคานวณของ input ดานบนคอ

ผลลพธทไดมาจากการใช method ของ class StringTokenizer ซงอยใน package java.util.StringTokenizer (ดบทท 3)