a+java part 2
DESCRIPTION
ชีทสรุป (แบบเร่งรัด) ที่ช่วยกันเขียนกับเพื่อนเมื่อปีที่แล้ว ก่อนสอบ FinalPart 2: Recursive programming & Introduction to OOPTRANSCRIPT
เอกสารชดนมอะไรบาง
• สรปเนอหาหลงมดเทอม ในหวขอทนอกเหนอจาก 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
いるか
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
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
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 หรอ หารรวมมากในภาษาไทยนนเอง)
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);
}
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));
} }
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: ความสมพนธของการยาย อาจหาไดจากการอปนยเชงคณตศาสตร
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 ปรบเสยง( )
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
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);
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”
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
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);
} }
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();
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
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
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 แรกสดของสารบทถกสรางขน
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 ไปเลยจรงๆ
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");
}
}
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 ...
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 สาหรบเซท คาคณสมบตตงตนตางๆทงหมด
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
Quick guide to A+JAVA (PART 2) 23
Class Field : เปน class สาหรบวางเปาบนสนามทงหมด 10 เปา และเปนคลาสหลกทใชรนและทาการแขงขน โดย class นจะเกบรายละเอยดในสวนทเหลอทงหมด (สามารถเพมเตมรายละเอยดเองไดตามทตองการ)
โดยใน class นใหทาการสราง constructor สาหรบเซทเปาเรมตนจานวน 10 เปาดวย
- การตงคาคณสมบตเรมตนของนกธน คณสมบตเรมตนของเปายง ใชการสมเลขทงหมด
- ในกรณทสรางนกธนขนมาแลวนกธนไมผานเกณฑใหทาการสรางนกธนขนมาใหม
สาหรบคนทเขยนไดแลวอาจจะลองเพมลกเลน เชน เพมสตรการคานวณใหซบซอนกวาเดม หรอสรางเปนเปายงเคลอนท เพมชนดของธน ชนดของเปา เขาไปไดอก
*สามารถ Download Source Code ทมอยในเอกสารน ไดจาก http://aplusjava.uni.cc