a+java part 2

23
เอกสารชุดนี้มีอะไรบ้าง สรุปเนื้อหาหลังมิดเทอม ในหัวข้อที่นอกเหนือจาก Part แรก o Recursive Programming o Introduction to Object-Oriented Programming Classes & Objects Class Methods & Object Methods Constructor Methods ตัวอย่างและแบบฝึกหัด เทคนิค, ข้อควรระวัง, ข้อควรสังเกต แทรกไว้ระหว่างการอธิบาย คําแนะนํา เนื้อหาใน Part นี้ถือว่ายากกว่า Part แรกค่อนข้างมาก จึงขอแนะนําให้ทําความเข้าใจมาก่อนบ้าง ควรผ่านการอ่าน Part แรกมาก่อน และทําความเข้าใจเรื่องของ Method อย่างละเอียด โชคเอครับ * COMPLETED BY INTANIA’91 ZA-NUKER (F) // LUPIN (F) // NORTHERN (F) // MOOZZ (C) FEBRUARY 1, 2008 いるか

Upload: z4nukre

Post on 11-Apr-2015

2.634 views

Category:

Documents


4 download

DESCRIPTION

ชีทสรุป (แบบเร่งรัด) ที่ช่วยกันเขียนกับเพื่อนเมื่อปีที่แล้ว ก่อนสอบ FinalPart 2: Recursive programming & Introduction to OOP

TRANSCRIPT

Page 1: A+JAVA part 2

เอกสารชดนมอะไรบาง

• สรปเนอหาหลงมดเทอม ในหวขอทนอกเหนอจาก Part แรก

o Recursive Programming

o Introduction to Object-Oriented Programming

� Classes & Objects

� Class Methods & Object Methods

� Constructor Methods

• ตวอยางและแบบฝกหด

• เทคนค, ขอควรระวง, ขอควรสงเกต แทรกไวระหวางการอธบาย

คาแนะนา • เนอหาใน Part นถอวายากกวา Part แรกคอนขางมาก จงขอแนะนาใหทาความเขาใจมากอนบาง

• ควรผานการอาน Part แรกมากอน และทาความเขาใจเรองของ Method อยางละเอยด

โชคเอครบ * COMPLETED BY INTANIA’91

ZA-NUKER (F) // LUPIN (F) // NORTHERN (F) // MOOZZ (C)

FEBRUARY 1, 2008

いるか

Page 2: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 2

>>>>>>>> Recursive ProgrammingRecursive ProgrammingRecursive ProgrammingRecursive Programming

การเขยน Recursion เปนเรองยากเรองหนงสาหรบเพอนๆทเรมตนเขยนโปรแกรม แตการเขยน Method ชนดน จะชวยใหการโปรแกรมของเรากระชบ และอานงายขนเปนอยางมาก Recursion มกจะเขยนในลกษณะของฟงกชนทมการนยามตวของมนเอง พดแบบนอาจจะงงๆ ดจากตวอยางดานลางน

Factorial FunctionFactorial FunctionFactorial FunctionFactorial Function

หรอ

จะเหนวา ฟงกชน Fac เมอเราสงคา n เขาสฟงกชน ภายในฟงกชนจะมการเรยกใชฟงกชนของมน โดยการสงคา n-1 พจารณาเมอเราสงคา 3 เขาสฟงกชน Fac รปทเราได จะเปนดงน

Fac(3) = 3 * Fac(2)

Fac(2) = 2 * Fac(1)

Fac(1) = 1 * Fac(0)

เนองจาก Fac(0) = 1 ดงนน เราสามารถยอนคากลบไดเปน Fac(1) = 1 * 1

เนองจาก Fac(2) = 2 * Fac(1) และเรารแลววา Fac(1) มคาเปน 1

เพราะฉะนน Fac(2) = 2 * 1 = 2

พจารณาท Fac(3) = 3 * Fac(2) และเรารแลววา Fac(2) มคาเปน 2

เพราะฉะนน Fac(3) = 3 * 2 = 6

การเรยกตวเองซา จะทาไปเรอยๆ จนกวาจะเจอเงอนไขททาใหหยดการเรยกตวเอง จากตวอยาง Factorial เงอนไขทจะทาใหหยดการเรยกตวเองกคอ เมอ n = 0 หรอ Fac(0)=1 ซงเราเรยกวา base case

ถงตอนน ใหเพอนๆลองคดกนดเลนๆวา อะไรจะเกดขนถาหากเราไมมจดหยดการเรยกซา อะแนนอน ความหมายชดเจนอยในตวมนอยแลว ถาไมมจดทหยดการเรยกซา มนกจะเรยกซาฟงกชนของมนไปเรอยๆ จนกวาโปรแกรมเราจะเดงหรอ Crash System Stack Overflow นนเอง (Stack เปนเรองหนงของวชา Data Structure ทภาคคอมจะตองเรยนในป 2)

Fac(n) = n * Fac(n-1)

และ Fac(0) = 1 n! = n+(n-1)!

และ 0! = 1

1

2Fac(2) = 2 * Fac(1)

Fac(1) = 1 * Fac(0)

Fac(3) = 3 * Fac(2) 6

1

Page 3: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 3

คาถามชวนคด : ในโคดโปรแกรม Fibonacci เราตองกาหนด Base Case n=1 และ n=2 ทาไมจง ไมสามารถกาหนดเพยง Base Case เดยวแบบ Factorial ได ( if (n==0) return 1; )

Recursion เปนพนฐานของการเขยนโปรแกรมประเภท Divide & Conquer หรอแบงแยกแลวเอาชนะ จะสงเกตไดวา Fac(3) เรายงไมสามารถหาคาของมนไดในทนท เราแบงการคานวณออกเปน 3 * Fac(2)

ซงมคา n นอยลง และใกลเคยงกบ Fac(0) ทเราทราบคาแลว และทาการแบงยอยปญหาไปเรอยๆ จนเราสามารถพชตปญหาใหญไดสาเรจ

ตวอยางของโคดโปรแกรม Factorial แบบ Recursion

การประมวลผลของโปรแกรมนจะมลกษณะเหมอนแผนภาพทแสดงไวดานบน

อกตวอยางหนง คอ การเขยน Method หาคาของ Fibonacci ลาดบท i ความสมพนธของ Fibonacci Sequence

วธการพจารณา จะสงเกตเหนวา ปญหาใหญ fibo(i) จะถกแบงยอยออกเปน fibo(i-1) และ fibo(i-2) ซงมคาใกลเคยงกบคาทเราร คอ fibo(1) และ fibo(2) และมเงอนไขการหยดเรยกตวเองซาเมอ i = 1

และ i = 2 เราสามารถใชหลกการเดยวกนกบ Factorial ในการหาคาของ Fibonacci ไดเชนเดยวกน

ตวอยางโคดโปรแกรม Fibonacci Sequence แบบ Recursion

กลาวโดยสรป : การเขยนโคดโปรแกรมแบบ Recursive ตองหาความสมพนธ ในรปของการเรยกตวเองให ไดกอน แลวหากรณ Base Case ทจาเปนจะตองใช

fibo(i) = fibo(i-1) + fibo(i-2)

และ fibo(1) = 1 , fibo(2) = 1

class Factorial {

public static int fac(int n) {

if(n == 0) return 1;

return n * fac(n-1);

}

public static void main(String[] args) { System.out.println(fac(3));

}

}

class Fibonacci { public static int fibo(int n) {

if(n == 1 || n == 2) return 1;

return fibo(n-1)+ fibo(n-2);

} public static void main(String[] args) {

System.out.println(fibo(10));

}

}

Base Case

Base Case

Page 4: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 4

แบบฝกหดเรอง RecursionRecursionRecursionRecursion

>> 1.จงเขยนโปรแกรมเพอหา ห.ร.ม. ของจานวน 2 จานวน พรอมกบแสดงคาตอบ

จากโจทยขอน การหา ห.ร.ม. เราสามารถหาไดหลายวธดงทไดเรยนกนมาแลวในชนมธยมตน

ขอสรปวธการหาไดเปนดงน

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

วา เราตองรกอนวา ทง 2 เลขทเราตองการจะหา ห.ร.ม. นนสามารถแยกตวประกอบออกมาไดอะไรบาง จากนนจงนามาเอามาเฉพาะตวทซากน สงทยงยากกคอ เราตองแยกตวประกอบของจานวนแรก แลวเกบจานวนเฉพาะทงหมดไวใน Array จากนนแยกตวประกอบของจานวนทสอง แลวตองเทยบกนอกวา จานวนเฉพาะตวไหนทซากน ดงออกมาไวรอคณกนเปนคาตอบ แคคดกเหนอยแลว

การตงหาร

เราลองมาวเคราะหในแงของการตงหารกนบาง ซงวธนเปนวธท hot ทสดในหมของนกเรยนในระดบชนมธยมตน แตในกระดาษทดเราสามารถสมๆเอาไดวา จานวนอะไรทสามารถหารเลขทง 2 จานวนไดลงตว กหยบเอามาหาร แตในการเขยนโปรแกรม กวาเราจะรวา จานวนอะไรบางทสามารถหาร a , b

ไดลงตว กตองไลวนลปตงแต 2 จนถงผลลพธจากการหารของเลขทเราไลไดหารดวยจานวนนอย ซงกสามารถเขยนโปรแกรมไดไมยากเยนนก แตกยงไมใชวธทนยมทสด เพราะใชเวลาในการประมวลผลคอนขางมาก เชน ถาเราจะหา ห.ร.ม. ของ 999,999 กบ 999,998 แนนอน common sense ของเราๆกตอบไดวาคาตอบคอ 1 แตกวาคอมพวเตอรจะรวาคาตอบคอ 1 มนตองไลลปเอาจานวนมาหารตงแต 2 ถง 999,998 ทงหมด 999,997 ครงกวาจะรไดวา ห.ร.ม. ของทงสองจานวนนเปน 1 นะ ซงในทางปฏบตเคาไมนยมใชวธนกน

ใชวธของยคลด

ทน เรามาถงวธทหลอสดๆสาหรบการหา ห.ร.ม. ดวยการเขยนโปรแกรมกนแลว อะนนแน รนะวา เพอนๆหลายคนลมวธการหา ห.ร.ม. ดวยวธนไปแลว เรามาทบทวนการหา ห.ร.ม. ดวยวธของยคลดกนกอน

ตวอยาง หา ห.ร.ม. ของ 1071 กบ 1029 ตามขนตอนวธของยคลดจะทาไดดงน

1071 = 1029 (1) + 42

1029 = 42 (24) + 21

42 = 21 (2) + 0

เมอเราไดเศษจากการหารเปน 0 แลว แสดงวาขนตอนการหาห.ร.ม.แบบยคลดสนสดลง โดยห.ร.ม.ของ 1071 กบ 1029 ดานบนนนจะเทากบ 21

หมายเหต: ตอไปผเขยนจะเขยน gcd แทนคาวา ห.ร.ม. ( gcd = Great Common Divisor หรอ หารรวมมากในภาษาไทยนนเอง)

Page 5: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 5

จากความสมพนธดานบน เราจะสงเกตไดวา มนเปนความสมพนธวนซาไปเรอยๆ ทาใหเราสามารถเขยน

Recursive Method เพอใชแกปญหาดานบนนได

หรอ

วธการเขยน Recursion หลกการของมนคอ ใหเราหาความสมพนธของปญหาใหไดกอน ซงเปนความสมพนธทตองมการวนซาลกษณะเดมๆไปเรอยๆ (จากในกระดาษทดกได หรอจากเพอนขางๆกได ;p)

จากนน ความสมพนธทเราคดไวยงไง เรากสามารถเขยนโปรแกรมออกมาใหได

อกวธสาหรบการเขยนโปรแกรมแบบไม Recursive คอการใชการวนลปเพอหา ห.ร.ม. โดยใชวธของยคลด

>> 2.จงเขยน method เพอแปลงเลขฐาน 10 ใหเปนเลขฐาน 2

การแปลงเลขฐาน เพอนๆอาจใชวธการตงหารแลวเกบเศษจากการหารไปเรอยๆ จนกวาผลลพธจะเปนศนย จากนนกเขยนเศษยอนจากลางขนบน กจะไดเปนเลขฐานสอง ตวอยางเชน แปลง 13 ใหเปนเลขฐาน 2

13/2 = 6 เศษ 1 6/2 = 3 เศษ 0

3/2 = 1 เศษ 1

1/2 = 0 เศษ 1

เพราะฉะนน 15 ฐานสบ จะมคาเทากบ 1101 ฐานสอง

เพอนๆลองสงเกตถงความสมพนธทมนซากนวาซาอยางไร เมอเราโยนคา 13 ใสลงมาใน method มนกเอา 13 มาทาการ /2 และ %2 เพอเกบคาผลลพธจากการหาร และเศษจากการหารไว จากนนกโยน 6 มาทาตอในลกษณะเดมๆเอาละสเกดความสมพนธวนซาอกแลว เพอนๆลองนกถงการโปรแกรมความสมพนธลกษณะนกอนแลวกน เฉลยอยในหนาถดไป อยาแอบดกอนละ :p

public static int gcd(int a , int b) {

if(a % b == 0) return b;

return gcd(b , a % b);

}

public static int gcd(int a, int b) {

int t;

while(b != 0) {

t = b;

b = a % b;

a = t;

}

return a;

}

public static int gcd(int a , int b) {

if(b == 0) return a;

return gcd(b , a % b);

}

Page 6: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 6

ตอไปเปนแบบฝดหดทจะลองใหเพอนๆคดกนเอง ขอใหเพอนๆโชคเอในการสอบวชานครบ :D

>>Basic Section : ( ระดบความยากอาจนอยกวาหรอเทากบการสอบ Final )<<

- จงเขยน Recursive method เพอรบคา n และหาคาผลรวมตงแต 1 ถง n

Hint: วธเหมอน Factorial

- จงเขยน Recursive method เพอรบคา n , k และคานวณ combination สาหรบสง n สง เมอเลอกออกมา k สง C(n,k) โดยมความสมพนธเปน C(n,k) = C(n-1,k-1) + C(n-1,k) (จากสามเหลยมปาสคาล ในระดบมธยมปลาย ใครไมรจกหาเพอนอธบายใหฟงเอานะ :) และ C(n,k) = 1 เมอ n = k หรอ k = 0

- จงเขยน Recursive method เพอรบคาเปน String จากนนใหทาใหพมพคาอกขระใน String นน ตงแต Character สดทายจนถง Character แรก เชน สงคา “Northern_series” ใหกบ method ผลลพธทไดตองเปน “seires_nrehtroN” โดยไมมเครองหมาย “”

- จงเขยน Recursive method เพอรบคา n จากนนใหหาคาของอนกรม

1/1 + 1/2 + 1/3 + . . . + 1/n

- จงเขยน Recursive method เพอรบ Array และ key 1 คา จากนนใหนบวา key ตรงกบสมาชกใน Array ทงหมดกตว จากนน return จานวนทพบ

เชน A = { 1 , 1 , 2 , 2 , 3 , 4 , 2 } และ key = 2 ให return จานวน 2 ทพบทงหมดใน Array คอ 3

- จงเขยน Recursive method เพอพมพคาตงแต

0000

0001

0010

. . .

. .

. 1101

1110

1111

class decimalToBinary {

public static String baseConverter(int num) {

if(num == 0) return "";

return baseConverter(num/2) + (num%2);

}

public static void main(String[] args) {

System.out.println(baseConverter(13));

} }

Page 7: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 7

>>Advance Section : ( นาจะยากกวาโจทย ตอนสอบ Final สาหรบเทพเจา A+Java :)<<

- จงเขยน Recursive method เพอพมพคาในลกษณะเรยงตามรหส Unicode สาหรบ String

1234 abcd

1243 abdc

1324 acbd

1342 acdb

. . . . . .

. . . . 4312 dcab 4321 dcba

- จงเขยน Recursive method เพอตรวจสอบ String ทประกอบดวย Character ‘(‘ และ ‘)’ วา การเปดปดวงเลบ ทาไดถกตองตามหลกคณตศาสตรหรอไม

ตวอยางเชน ()()() , ()(()) , (()(())) ถอวาเปนวงเลบทถก

)( , (() , ())( , ((())())) ถอวาผด

[Special] หอคอยแหงฮานอย หรอ ทาวเวอรออฟฮานอย (Tower of Hanoi) เปนเกมคณตศาสตร ประกอบดวยหมด 3 แทง และ จานกลมแบนขนาดตางๆ ซงมรตรงกลางสาหรบใหหมดลอด เกมเรมจากจานทงหมดวางอยทหมดเดยวกน โดยเรยงตามขนาดจากใหญทสดอยทางดานลาง จนถงจานขนาดเลกทสดอยดานบนสด เปนลกษณะกรวยควาตามรป

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

- สามารถยายจานไดเพยงครงละ 1 ใบ

- ไมสามารถวางจาน ไวบนจานทมขนาดเลกกวาได

กาหนดใหมเสา 3 ตน ชอ A , B และ C และจานขนาดตางกนทงหมด 5 ใบ ขนาดตางกนทงหมด จงเขยน Recursive method เพอหาวธการยายจานทง 5 ใบ ทเดมอยทเสาตนท A ไปยงเสาตนท C โดยไมผดเงอนไขจากยายของ Tower of Hanoi โดยใหออกแบบรปแบบการแสดงผลเอง

Hint: ความสมพนธของการยาย อาจหาไดจากการอปนยเชงคณตศาสตร

Page 8: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 8

>> >> >> >> Introduction to ObjectIntroduction to ObjectIntroduction to ObjectIntroduction to Object----Oriented ProgrammingOriented ProgrammingOriented ProgrammingOriented Programming

พยายามอดทนอานหนอยนะ เพราะหนานจะอธบายถงคอนเซปทของการเขยนโปรแกรมเชงวตถ ซงจาเปนมากทตองเขาใจกอนทจะอานเนอหาในหวขอถดไป

จะเหนไดวาทกๆครงทเราทาการเขยนโปรแกรมภาษาจาวา เราตองกาหนดโปรแกรมทเราเขยนขนดวยคาวา class เสมอ แตเราไมไดพดถงเลยวา class คออะไร โดยทวไปการเขยนโปรแกรมเชงวตถหรอทเรยกวา Object-Oriented Programming (OOP) นน คาวา class มกจะหมายถงคณลกษณะหรอคณสมบตทมในวตถใดวตถหนง เราอาจเรยก class ไดวา เปนแมแบบหรอเปนตวกาหนดคณสมบตของ object (วตถ) ทถกสรางขนนนเอง

ปกตในชวตประจาวนเราทกคนไดสมผส ไดรจก และเคยใชงาน object กนมาแลว เพยงแตเราไมไดจากดความสงๆนนวาเปน object ตวอยางเชน โทรทศน รถยนต คอมพวเตอร สตว สงของตางๆ ถอวาเปน object ทงหมด เราจะเหนไดวาทกสงทกอยางจะมคณสมบต (Property) เฉพาะตวของมนเอง เชนทว จะมขนาดหนาจอ ยหอ รน ระบบเสยง ราคา สวนรถยนตกจะม ยหอ รน แรงมา จานวนประต นาหนก ชนดของเกยร เปนตน ถามองถงบรษทผผลต class กเหมอนกบพมพเขยว ทใชสาหรบสรางผลตภณฑหรอ object ขนมา โดย class กจะประกอบไปดวย คณสมบตเฉพาะตว (Property) และความสามารถในการทางาน (Method) ของ object นนๆ ถาสนคาแตละรนทผลตออกมา บรษทผผลตตองออกแบบทกองคประกอบใหมหมดกคงเปนการยงยากและเสยเวลาเปนอยางมาก โดยทวไปผผลตกจะนา class หรอพมพเขยวตนแบบเดมทม นามาปรบปรงคณสมบตและความสามารถตางๆ ออกเปนเปนผลตภณฑตวใหม โดยทาการพฒนาตอยอดจากผลตภณฑเดม การทาแบบนเรยกวา Inheritance ซงหมายถงการสบทอดคณสมบตจากตนแบบเดม ซงจะกลาวถงในบทตอไป

โดยทวไปในฐานะของผใชงานผลตภณฑตางๆเรามกไมรถงกลไกการทางานภายในของ object เรารเพยงแตวาเราเรยกใชคณสมบตหรอ method ทมใน object นนๆ แลว object สามารถทางานใหตามทเราตองการได ถาลองยอนกลบไปด class String ทเราใชนน จะเหนไดวาทกครง ไมวาเราจะเรยก method

ตางๆท class มมาให จากโปรแกรมใดๆกตาม การทางานหรอผลลพธกยงคงเหมอนเดม object ทมาจาก class String ไมวาจะเปนตวไหน เรากสามารถทจะใช method ตางๆกบ object เหลานได

ขอยกตวอยางทเหนในชวตประจาวนละกน สมมตเรากาหนดให โทรทศน เปน class หนง เราจะทาการสราง โตชบอง มาจากแมพมพน จะถอวา โตชบอง เปน object ทสรางจาก class โทรทศน หลงจากนนเราสามารถกาหนดลกษณะตางๆ ดงเชนตอไปน

Object = โตชบอง (ถกสรางมาจาก class โทรทศน) • คณสมบต (Properties)

o สเลอดหม

o จอ 22 นว

• ความสามารถ (Methods)

o เปด( ) ปด( )

o เปลยนชอง( )

o ปรบเสยง( )

Page 9: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 9

โครงสรางของ ClassClassClassClass

โดยทวไปการออกแบบ class จะประกอบดวยสวนสาคญ 2 สวน คอ

• FieldFieldFieldField หมายถง ตวแปรสาหรบเกบขอมลโดยทวไปของ object หนงสอหลายๆ เลมมกเรยกสวนนวา Data Member หรอสวนทเปนทเกบขอมลของ class หรอทเรยกกนทวไปวา variable

• MethodMethodMethodMethod หมายถง กระบวนการหรอความสามารถตางๆท object นนๆสามารถทาได โดยกระบวนการตางๆ สวนใหญจะกระทากบ Data Member

เราสามารถกาหนดสวน Data Member นใหเปนขอมลไดทกชนด รวมไปถงกาหนดเปนตวอางอง (Reference) ถง object ทมาจาก class ตวเองหรอ class อนๆไดดวย

เพอใหเหนภาพไดชดเจนยงขน เราจะทาการออกแบบ class ขนมาหนง class ซงใหทาการศกษา class นใหด เพราะในภายหลง เราจะนา class ทออกแบบไวนไปสรางเปนโปรแกรมเชงวตถทใหญขนตอไป

class Card ทเราสรางขนนนประกอบไปดวยสวนประกอบสองสวนดงทกลาวขางตน คอสวนทเปน Field

และสวนทเปน Method ซงภายในสองสวนทวานยงมรายละเอยดและสวนประกอบอนๆทมความสาคญตอการออกแบบและการใช class

ขอสงเกต การตงชอ class นยมตงชอใหตวแรกเปนตวใหญ

** ดาวนโหลดโคดโปรแกรมตวอยางในเอกสารนไดจาก http://aplusjava.uni.cc

Class

Instance

FieldFieldFieldField

Method

Page 10: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 10

การสราง Instance Instance Instance Instance ของ ClassClassClassClass

การสราง Instance ทาเหมอนกบการประกาศ Variable โดยรปแบบการประกาศคอ

ชอคลาส ชอตวแปร

ตวอยางเชน

FirstCard จะเปน Reference ของ Card โดยจะทาหนาทเสมอนกบตวช ทชไปยงหนวยความจาทเกบคา Instance เอาไว สวน new Card(1,1) นนเปนการสราง Instance ของ Class Card ขนมาโดยตองตามดวยวงเลบซงอาจจะสงคาพารามเตอรตงตนหรอไมกได

FirstCard = new Card(1,1); จงหมายความวา ทาการสราง Instance ของ Class Card ขนมาโดยกาหนดคาพารามเตอรตงตนใหกบ Instance เปน (1,1) หลงจากนนจงสงคา address หรอตาแหนงของ Instance ของ Class Card ในหนวยความจาเกบเขาตวแปร FirstCard ซงเปนตวแปรแบบ Reference

ทกครงทเราทาการสราง Instance (new …) Method พเศษ Method หนง (Constructor) จะถกเรยกใชโดยอตโนมต Method ทวานมไวสาหรบกาหนดคาเบองตนใหกบตวแปรภายใน Class ซงจะกลาวถงในภายหลง

Class Variable and Instance VariableClass Variable and Instance VariableClass Variable and Instance VariableClass Variable and Instance Variable

Object ทเกดมาจาก class นนเราเรยกวา instance ของ class โดย object ทวานจะมสวนประกอบท class มให คอ ตวแปรและ method ตางๆ ตวแปรทเกดขนมาจาก class นนมสองชนดคอ ตวแปรแบบ Class และตวแปรแบบ Instance

ตวแปรแบบ Class นนเปนตวแปรทกาหนดเอาไววา object ทกตวทเกดจาก class นจะใชตวแปรตวนรวมกน และตวแปรชนดนสามารถเรยกใชไดโดยไมตองสราง object ขนมา เพราะวาตวแปรประเภทนเปนตวแปรของ class ถาคาของตวแปรนเปลยนไป object หรอ class ทอางการใชถงตวแปรประเภทนกจะไดคาใหมทเปลยนไปดวย การประกาศใหตวแปรใดๆกตามเปน Class Variable นนเราตองใชคาสง static นาหนาเสมอ

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

Card FirstCard;

FirstCard = new Card(1,1);

Page 11: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 11

Class Method & Instance Method (Object Method)Class Method & Instance Method (Object Method)Class Method & Instance Method (Object Method)Class Method & Instance Method (Object Method)

Method เปนกระบวนการ ความสามารถ หรอชดคาสงตางๆของ object นนๆ ทเราสามารถเรยกใชเพอทางานตางๆใหเราได โดยอาจจะเปนการทางานทเกยวของกบตวแปรภายใน class หรอกระบวนการอนๆของ Class Method ไดถกแบงออกเปน 2 ชนด เชนเดยวกนกบตวแปรทกลาวไวกอนหนา คอ Class Method

และ Instance Method (Object Method)

Class Method คอ Method ของ class ทสามารถเรยกใชงานและประมวลผลไดแมวาจะไมม object

ลองยอนกลบไปด Method main() ทมในทกโปรแกรมของเรา เราจะเหนไดวาเราไมมการสราง object ขนมาจาก class ของเราเลย แตเรากยงสามารถทจะเรยกใชงาน Method main() ของเราได การประกาศ Method ใหเปน Class Method ทาไดโดยใชคาสง static นาหนาเชนเดยวกบการประกาศตวแปรแบบ Class

ขอควรระวงของการเขยน Class Method คอ Class Method เรยกใชงานตวแปรไดเฉพาะตวแปรประเภท Class Variable เทานน ไมสามารถเรยกใชงานตวแปรแบบ Instance Variable ได

สวน Instance Method เปน Method ทตองมการใชรวมกนกบ Instance Variable เพราะ Method

ประเภทนถกสรางขนมาจาก class เดยวกนกบท object ถกสราง และ Method ประเภทนจะถกเรยกใชไดกตอเมอมการสราง object ขนมาจาก class เทานน

Class Variable

Instance Variable

ทง FirstCard และ SecondCard

ตางกม copy ของตวแปรชดนเปนของตวเอง

public class Card {

static String color = �red�;

int number;

int suits;

}

FirstCardFirstCardFirstCardFirstCard

number

suits

SecondSecondSecondSecondCardCardCardCard

number

suits

“red”

Page 12: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 12

การเรยกใชงาน Variable Variable Variable Variable และ Method Method Method Method ของ ClassClassClassClass

ในการเรยกใชตวแปรหรอ Method ของ Class นนทาไดโดย ใชชอของ object หรอ class ตามดวยเครองหมาย . (dot) และตามดวยชอตวแปร หรอชอของ Method ทมใน Class นนๆ

ตวอยางเชน

Card.suitstxt[0];

FirstCard.number;

FirstCard.compareTo(SecondCard);

ConstructorConstructorConstructorConstructor

Constructor เปน Method ทมไวสาหรบกาหนดคาเบองตนใหกบตวแปรภายใน class โดย constructor จะถกเรยกใชโดยอตโนมตทกครงทเราทาการสราง object โดย Method ทวานจะตองมชอเหมอนกนกบชอของ class นนๆ โดยไมตองระบ return type ของ Method และเชนเดยวกบ Method อนๆ เราสามารถทจะทาการ Overload Constructor ไดโดยการกาหนด Parameter ตงตนของ Method ใหแตกตางกนออกไป

สมมตเราเขยนโปรแกรมเรยกใชงาน Class Card ของเรา (main Method นอยใน Class Card)

จะไดผลลพธดงน

จะเหนไดวาตวแปรประเภท Instance Variable ของทงสอง object ซงถกสรางขนเกบคาไมเหมอนกนทงนเนองมาจากตอนสราง object เรากาหนดคาของ Parameter เรมตนทสงใหกบ Constructor ตางกน

public static void main (String[] args) {

Card FirstCard = new Card(2, 4);

Card SecondCard = new Card(11, 3);

System.out.println("FirstCard is " + FirstCard);

System.out.println("SecondCard is " + SecondCard);

}

> FirstCard is 2 Club > SecondCard is J Diamond

Page 13: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 13

This ReferenceThis ReferenceThis ReferenceThis Reference

ในระหวางการเขยนโปรแกรมเราอาจจะตองการอางถงตวแปรประเภท Instance ภายใน class ของเรา แตเรายงไมรวา Instance ของเราทถกสรางขนนนจะม Reference เปนชออะไร พดงายๆกคอเราไมทราบวาชอของตวแปรทถกตงขนเปน object นนจะมชอวาอะไร เชนเราอาจจะตงชอวา Card mycard; ทาใหเราไมสามารถเรยกใชตวแปรประเภท Instance ได จาวาจงม Reference ตวหนงชอ this ใชสาหรบอางถง Instance ทสรางขนจาก class น โดย this ทอางถงใน class ใด หมายถง Instance ทสรางขนจาก class นน

ตวอยางการใช This ReferenceThis ReferenceThis ReferenceThis Reference

จากตวอยางนจะเหนไดวาชอตวแปรทรบเขามานนมชอเดยวกบตวแปรแบบ Instance ภายใน class

ซงสามารถทาได แตเราจะทาการเกบคาตวแปรทสงเขามาซงเปนตวแปรแบบ Local Variable เกบเขาไปยง Instance Variable ไดอยางไร? เราสามารถเตม this. นาหนาชอตวแปรแบบ Instance เพออางถงตวแปรแบบ Instance ภายใน classได จากตวอยางโปรแกรมขางตน Constructor จะทาการเกบคาทสงเขามาไปยงตวแปรประเภท Instance ทอยใน Instance ทอางถงนนๆ โดย this.number จะอางถงตวแปรทอยภายใน Instance สวน number ทไมม this. นาหนาจะอางถงตวแปรแบบ Local ทถกสงเขามา

public class Card {

int number;

int suits;

Card (int number, int suits) {

this.number = number;

this.suits = suits;

}

public static void main(String[] args) {

Card FirstCard = new Card(2, 4);

System.out.println("FirstCard is " + FirstCard);

} }

Page 14: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 14

ขมวดเนอหาสวน Classes and ObjectsClasses and ObjectsClasses and ObjectsClasses and Objects อกรอบ

• Class เปรยบเสมอนแมพมพสาหรบสราง object หนงๆ โดยภายในจะประกอบดวยคณสมบต (Data Member) และความสามารถ (Method) ของ object นนๆ

• Object เปนสงทสรางขนมาจาก class โดยมคณสมบตเหมอนกบ class ทกประการ สามารถเรยกใชตวแปรและ method ประเภท Instance และ Static ไดทงหมด

• การประกาศ ชอคลาส ชอตวแปร เชน Card firstcard;

หมายถงการประกาศตวแปรแบบ Reference ซงเปนตวแปรททาหนาทเกบตาแหนงของ object ทสรางจาก class นนๆขนมา ในทางภาษาคอมพวเตอรเราเรยกตวแปรประเภทนวา pointer หรอตวแปรทมหนาทสาหรบชไปยง object ทถกสรางขน

• การใชคาสง new new new new ชอคลาส();();();(); เชน new Card(1,4);

เปนการสราง object ขนมาจาก class ซงจะ return คาเปนตาแหนงของ object ซงตองใชตวแปรแบบ Reference ดงทกลาวขางตนมารบ โดยตอนสรางจะสง parameter หรอไมสงกไดขนอยกบ constructor ซงเปน method พเศษทไดกาหนดเอาไวใน class ของเรา

• การใช static นาหนาชอตวแปรหรอ method

หมายความวา ตวแปร หรอ method นน สามารถเรยกใชไดโดยตรงจาก class โดยไมตองทาการสราง object (new ชอคลาส()…) ขนมาเพอเรยกใช ตวอยาง method ทเราเคยเรยกใชเชน

System.out.println(); Double.parseDouble(); Math.sqrt(); Character.isDigit();

จะเหนไดวาเวลาเรยกใช เราจะเขยนโปรแกรมขนตนดวยชอ Class นนๆตามดวยชอตวแปรหรอ method ทเปนแบบ static เทานน

ขอสงเกต Method ทเปนแบบ static เวลาเราเขยนโปรแกรม เราจะไมสามารถเรยกใชตวแปรทเปนแบบ Instance ภายใน method ของเราได

• Method หรอ ตวแปรทไมม static นาหนา

Method หรอ ตวแปรนนๆ จะสามารถเรยกใชไดกตอเมอมการสราง object ขนมา โดยจะสงเกตไดวา method หรอตวแปรประเภทนเวลาเรยกใชนน มกจะขนตนดวย ชอตวแปรทเปนแบบ reference ทเราสรางขนตามดวยเครองหมาย .(dot) และชอ method หรอตวแปรทเราเรยกใช ตวอยางเชน

String str=”Classes and Objects”;

int len;

len = str.length();

Page 15: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 15

เราลองมาดโปรแกรมเชงวตถ ทมการทางานสมพนธระหวาง class ตางๆทเราสรางขนกน

public class Card {

static String[] suitstxt = new String[] {"No Suits","Spade","Heart","Diamond","Club"};

int number; // 2 to A - 11: J 12: Q 13: K 14: A

int suits; // 1: Spade♠ 2: Heart♥ 3: Diamond♦ 4: Club♣

Card (int number, int suits) {

this.number = number;

this.suits = suits;

}

public int compareTo(Card card) {

if (this.number == card.number) {

if (this.suits < card.suits) return 1;

else if (this.suits > card.suits) return -1;

return 0;

} else {

if (this.number > card.number) return 1;

else if (this.number < card.number) return -1;

}

return 0;

}

public String toString() {

String txt = "";

if (this.number == 11) txt = "J";

else if (this.number == 12) txt = "Q";

else if (this.number == 13) txt = "K";

else if (this.number == 14) txt = "A";

else txt = "”+ this.number;

return txt + "” + suitstxt[this.suits];

}

}

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

แตในทนใหไพ A เปนไพทใหญทสด

เรมกนท Class Card class นเปน class ทสรางขนเพอจาลองลกษณะของไพขนมา โดยไพแตละใบนนกจะมเลขไพ (number) และดอกของไพ (suit) แตกตางกนออกไป เนองจากสวนนเปนคณสมบตเฉพาะของการดแตละใบ ไมใชคณสมบตสวนรวม เราจงตองตงตวแปรสาหรบเกบเลขและดอกไพเปนแบบ non-static

Page 16: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 16

int number; เลขไพเปนไดตงแต 2-14 โดยเราจะใหเลข 11 แทน J ไปจนถงเลข 14 แทน A

int suits; เกบคาของดอกไพ โดยเราให 1: Spade♠ 2: Heart♥ 3: Diamond♦ 4: Club♣

ในสวนของ Constructor ของ class นไมมอะไรมากนก เปนการนา parameter สองตวทถกสงมาตอนสราง object โดยการใชคาสง new Card(เลขไพ , ดอกไพ) ตามทเรากาหนดไวขางตน ไปเกบไวในตวแปรทเปนแบบ instance ภายใน object ทเราสรางขน

Method public int compareToMethod public int compareToMethod public int compareToMethod public int compareTo (Card card) (Card card) (Card card) (Card card)

สาหรบเปรยบเทยบวาไพทถกเรยกใช ณ method ปจจบน กบไพทถกสงเขามา (parameter: Card

card) ไพใบใดมคามากกวากนโดยจะ return คาเปน -1 เมอไพใบแรกมคานอยกวาไพใบทสองทถกสงเขามา และ return คาเปน 1 เมอไพใบแรกมคามากกวา กรณไพทงสองใบมเลขและดอกเดยวกนจะ return 0

จะเหนไดวา method นมการใช This Reference ซงเปนการอางอง object ปจจบนทถกเรยกใช method สมมตโคดโปรแกรมเรามหนาตาดงน

Card a=new Card(1,3);

Card b=new Card(1,4);

a.CompareTo(b);

public int compareTo(Card card) {

If(this.number == card.number) �

สวน Method public String toString() เปน method สาหรบแปลงคาทเกบอยใน object กลบและ return

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

นอกจากน method ( String toString() ) ยงเปน method ทถกเรยกใชอตโนมต เมอเราใชคาสง

System.out.println(ชอobject);

ชอobject.toString(); จะถกเรยกใชอตโนมต

เชน ถาเราเขยนโคดโปรแกรม

Card mycard = new Card(3,4);

System.out.println(mycard);

mycard.toString(); ซงเปน method ทอยใน class Card จะถกเรยกโดยทนท

This ในทนจะหมายถง a (Reference ไปยง a)

สวน card จะมคาเทากบ b เนองจากเราสง address

หรอคาทเกบอยในตวแปร เขา method ไปยงตวแปรทมชอวา card

Page 17: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 17

import java.util.*;

public class Deck {

Card[] card = new Card[52]; int top=0;

Deck() {

int cnt=0, num, suit;

for (num = 2; num <= 14; num++) {

for (suit = 1; suit <= 4; suit++) {

card[cnt] = new Card(num, suit);

cnt++;

}

if(cnt==52) break;

}

}

public void shuffle() {

Collections.shuffle(Arrays.asList(card));

}

public Card drawcard() {

if (top == 52) System.out.println("Deck is empty.");

return card[top++];

}

}

Card[] card = new Card[52];

ตอไปสวนของ Class Deck class นจะเปนการจาลองสารบไพขนมา โดยใน 1 สารบของไพมาตรฐานทวไปจะมไพอยทงหมด 52 ใบ class นจะทางานสมพนธกบ Class Card ทเราสรางขนกอนหนาน

เปนการสรางตวอางองสาหรบเกบทอยของไพทจะถกสรางขนทงหมด 52 ใบ โดยในตอนนเรายงไมไดทาการสราง object ขนมา สารบทวานจงเปนสารบเปลาทไมมไพอย

ตวแปร top มไวสาหรบเกบตาแหนงไพใบบนสด ณ ปจจบนของกองสารบไพ โดยกาหนดคาตงตน ใหเปน 0

ซงหมายถงเลข index แรกสดของสารบทถกสรางขน

Page 18: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 18

Card[cnt] = new Card(num,suit);

return card[top++];

ในสวนของ Constructor Deck() เปนสวนทกาหนดคาตงตนของสารบไพของเรา โดยจะทาการสรางไพตงแตใบแรก index 0 (2 Spade) ไปจนถงใบสดทาย index 51 (A Club) ตามลาดบ

จะเหนไดวาในโคดโปรแกรมของเรามการนาคาสง for เขามาชวย และซอนกนถง 2 ชน

เปนการสราง object ทมเลขของไพเปน num และเลขดอกเปน suit จากนนสงตาแหนงของไพทถกสรางขน เกบเขาตวแปร Card[index cnt] ซงสงใหไลตงแตใบท 0 ถงใบท 51 โดยใช loop for

Method public shuffle();Method public shuffle();Method public shuffle();Method public shuffle(); เปน method สาหรบสลบคาใน array แบบสม ซงภายใน method นนไดไปเรยก method สาเรจรปทมมาใหอกท ตรงนเราสามารถเขยนเองได แตจะเปนการเสยเวลา ในเมอ java ม class

สาเรจรปทมประโยชนมาใหใชอยหลาย class เราจงไมจาเปนตองเขยนเองทงหมด (Class String กเปนหนงในนน)

Method public Card drawcard()Method public Card drawcard()Method public Card drawcard()Method public Card drawcard() เปน method ทจะ return ตาแหนงของการดใบบนสดของกองสารบไพของเราคนกลบไป จากนนจงทาการเลอนตาแหนงของไพใบบนสด (ตวแปร top) ไปยงไพใบถดไป

หมายความวา return ตาแหนงของ card[top] (ไมใช top+1) จากนนจงทาการเพมคาใหตวแปร top ขนอก 1 (เลอนไปยงใบถดไป) จรงๆแลวไพในสารบ (Array of Card) ของเราไมไดหายไปไหน แตเราใชตวแปร top คอยเลอนตงแตใบแรกไปยงไปสดทาย เสมอนกบวาเราไดทาการจวไพออกจากสารบไปจรงๆ

ใหสงเกตอกวาถาเราเขยนแบบน จะไมสามารถเรยก Method Shuffle หลายๆรอบได เนองจาก Method Shuffle ของเราจะทาการสลบคาแบบสมทง Array ทาใหทกครงทสม มโอกาสทไพทเราไดจวออกไปแลวจะกลบมาอยในตาแหนงทยงไมไดจวอกครง (ไพ index ทอยกอนหนาทตวแปร top ช ถกสลบมาอยหลง ทตวแปร top ชอย) เพราะฉะนนถาโปรแกรมของเรามการจวไพไปพรอมกบทาการสบไพไปดวยโปรแกรมของเราจะมความซบซอนมากกวาน จะตองมการนาไพออกจาก Array ไปเลยจรงๆ

Page 19: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 19

จะเหนไดวา class สดทายม method หลก (main method) อย method เดยวและเปน method ทจาเปนจะตองมเมอเราตองการรน class นนเปน class หลก โดยรวมแลว class นไมมอะไรซบซอน เปนการเขยนโปรแกรมเพอทาการเลนเกมของเราจาก class ทไดเขยนขนไว

import jlab.JLabIO;

public class Game {

public static void main(String[]args) {

Deck playdeck = new Deck();

int player1 = 0, player2 = 0;

Card card1, card2;

int rnd;

playdeck.shuffle();

for (rnd = 1; rnd <= 3; rnd++) {

card1 = playdeck.drawcard();

card2 = playdeck.drawcard();

if (card1.compareTo(card2) == 1) player1++;

else player2++;

System.out.println("Round " + rnd);

System.out.println("Player1 : " + card1);

System.out.println("Player2 : " + card2 + "\n");

}

System.out.println("Total Score : " + player1+ ":" + player2);

if (player1 > player2) System.out.println("Player1Win");

else System.out.println("Player2 Win");

}

}

Page 20: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 20

เรมตนเราไดทาการสรางสารบไพขนมา 1 สารบโดยตงชอสารบนนวา playdeck

โดยใชคาสง Deck playdeck = new Deck(); ซงจากคาสงนจะไปเรยก Constructor ทมอยใน Class Deck

ทาการจดเตรยมและสราง object การดไพใหเรามา 1 สารบ

ในแตละรอบของการเลนผเลนแตละคนจะทาการจวการดออกจากสารบโดยใช method drawcard();

คนละ 1 ใบจากนนจงนาการดของผเลนทง 2 มาเปรยบเทยบกนโดยใช method compareTo(); ไพของใครมแตมเหนอกวากจะชนะในรอบนนไป

สมมตเรารนโปรแกรมออกมาไดผลดงน

ลกษณะโครงสรางของโปรแกรมขณะทเรารนจะมลกษณะดงภาพ

เปนอนวาจบเรองทยากทสดของ Java (Classes and Objects) สาหรบใครทยงไมเขาใจใหลองศกษาจากหนงสอพนฐานทวไปหรอจาก internet เพมเตม

card [3]

number = 3

suit = 2

card [4]

number = 3

suit = 4

card [5]

number = 7

suit = 1

Round 1

Player1 : 9 Diamond

Player2 : J Spade

Round 2

Player1 : J Diamond

Player2 : 3 Heart

Round 3

Player1 : 3 Club

Player2 : 7 Spade

Total Score : 1:2 Player2 Win

playdeck

card [0]

number = 9

suit = 3

card [1]

number = 11

suit = 1

card [2]

number = 11

suit = 3

สารบไพของเรา

ไพทอยในสารบ

0 1 2 3 4 5 ...

Page 21: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 21

แบบฝกหด

จงเขยน class ทมชอวา Archer , Target , Rule , Field สาหรบจาลองนกธน เปายง การคานวณตางๆทเกยวของกบการแขงขน และสนามตามลาดบ ในโปรแกรมแขงขนยงธน ซงจาลองผลลพธของการแขงขนระหวางนกยงธน 2 คน โดยขนกบคาสถานะและความสามารถตางๆของนกธน

กตกาการแขงขนมดงน เรมตนนกธนทผานการคดเลอก 2 คนจะยนอยทตาแหนง (0,0) จด Origin ระบบบนพกดฉาก สวนเปาจะกระจายอยทวสนามโดยใชระบบพกดฉากในแนว 2 มต (x,y) อางอง จากนนนกธนแตละคนจะตองทาการยงเปาทงหมด ทอยในสนาม โดยเรยกใช method สาหรบคานวณวาลกธนทยงออกไปกระทบเปาหรอไม (สตรการคานวณจะกลาวถงตอไป) ในกรณทลกธนกระทบเปานกธนคนนนจะไดคะแนนตามเปาทกาหนดไวบนเปายงนนๆ นกธนทงสองจะตองผลดกนยง และจะตองยงใหครบทกเปา เปาละ 1 ดอก เมอการแขงขนจบลงใหแสดงผลคะแนนของนกธนทงสองและแสดงผลวานกธนยงถกเปาใดบาง

Class Archer : นกธนแตละคนมคณสมบตดงน

คณสมบต รายละเอยด คาทเปนไปได

namenamenamename ชอของนกธน อกขระไทยหรอองกฤษ strengthstrengthstrengthstrength พละกาลง จานวนเตม 5-20

accuracyaccuracyaccuracyaccuracy คาความแมนยา จานวนเตม 5-20

skillskillskillskill ทกษะการใชธน จานวนเตม 10-20

scorescorescorescore คะแนนสะสมปจจบน จานวนเตม 0-10000

Class นกธนนจะตองม constructor สาหรบเซท ชอ และคาของคณสมบตตงตนตางๆทงหมด

ใหสราง method toString() สาหรบแสดงรายละเอยด ชอ คณสมบตสถานะตางๆและคะแนนปจจบนดวย

Class Target : เปายงแตละเปามคณสมบตดงน

คณสมบต รายละเอยด คาทเปนไปได

sssscorecorecorecore คะแนนของเปายงนนๆ จานวนเตม 1-100 Coordinate XCoordinate XCoordinate XCoordinate X ตาแหนงบนพกดฉากแกน x จานวนเตม 1-100

Coordinate YCoordinate YCoordinate YCoordinate Y ตาแหนงบนพกดฉากแกน y จานวนเตม 1-100

sizesizesizesize ขนาดของเปา จานวนเตม 1-9

* ไมมเปายงใดๆอยทตาแหนง (0,0) หรอจดกาเนด และเพอลดความซบซอนในการเขยนโปรแกรมเปามากกวาหนงอนสามารถอย ณ ตาแหนงเดยวกนได

Class เปายงนจะตองม constructor สาหรบเซท คาคณสมบตตงตนตางๆทงหมด

Page 22: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 22

Class Rule : เปน class ทเกยวของกบการคานวณตางๆทใชในการแขงขน มรายละเอยดดงน

method ชอ randomnumber รบ parameter 2 ตวเปนจานวนเตม n และ m สาหรบสมเลขจานวนเตมมคาตงแต n ถง m สาหรบการเขยน method สาหรบสมเลข ทาไดดงน

public static int randomnumber(int n,int m) {

return (int)(Math.random()*(m-n+1))+n;

}

method ชอ distance สาหรบหาระยะทางระหวางจด 2 จดใดๆบนระบบพกดฉาก return คาเปน double

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

- คาสถานะตางๆตองอยในชวงทกาหนดให

- คาคณสมบตของ accuracy strength และ skill รวมกนมคานอยกวา 30

- มคณสมบตใดคณสมบตหนงทมคามากกวา 15 ไดเพยง 1 คณสมบตเทานน

เชน ถา accuracy มคาเทากบ 17 แลว คา strength และ skill จะมคามากกวา 15 ไมได

* สาหรบเรยกใชหลงสราง object นกธนขนมา โดย return คา true หรอ false เมอนกธนผานหรอไมผานเกณฑ ในกรณทไมผานเกณฑใหทาการสมคาและสราง object ขนมาใหม

method ชอ hitchance สาหรบคานวณการยงวายงถกเปาหรอไมโดยรบ parameter 2 ตวเปน reference

ไปยง object Archer และ reference ไปยง object Target : hitchance(Archer นกธน,Target เปายง)

return คาเปน true หรอ false

สตรการคานวณมดงน

1. คานวณ Strength vs Distance ถาคาทไดมคาเกน 5 ใหถอวามคาเทากบ 5

2. คานวณ Accuracy vs Size of Target ถาคาทไดมคาเกน 10 ใหถอวามคาเทากบ 10

3. สมคาระหวาง ((int)Ceiling(Skill / 2) ถง Skill)

4. นาคาจาก 3 ขอขางตนมาบวกกนทงหมด ถามคามากกวาหรอเทากบ 22 แสดงวายงถกเปา

* Ceiling หมายถงการปดเศษขน ใหเรยกใช Method Math.ceil(); สงเปน Double , return เปน Double

Page 23: A+JAVA part 2

Quick guide to A+JAVA (PART 2) 23

Class Field : เปน class สาหรบวางเปาบนสนามทงหมด 10 เปา และเปนคลาสหลกทใชรนและทาการแขงขน โดย class นจะเกบรายละเอยดในสวนทเหลอทงหมด (สามารถเพมเตมรายละเอยดเองไดตามทตองการ)

โดยใน class นใหทาการสราง constructor สาหรบเซทเปาเรมตนจานวน 10 เปาดวย

- การตงคาคณสมบตเรมตนของนกธน คณสมบตเรมตนของเปายง ใชการสมเลขทงหมด

- ในกรณทสรางนกธนขนมาแลวนกธนไมผานเกณฑใหทาการสรางนกธนขนมาใหม

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

*สามารถ Download Source Code ทมอยในเอกสารน ไดจาก http://aplusjava.uni.cc