181
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
CHAPTER 13
คลาสและออบเจคแบบซบซอน
(Advanced Classes and Objects)
1. การรบคาและคนคาประเภทขอมลแบบ คลาส
1) เมทอดและตวสรางทรบพารามเตอรเปนออบเจค (พารามเตอรทมประเภทขอมลเปนคลาส )
หมายเหต เรยกตวสรางแบบหมายเลข 1 วา ตวสรางเรมตน (Default Constructor)
เรยกตวสรางแบบหมายเลข 2 วา ตวสรางรายละเอยด (Detail Constructor)
เรยกตวสรางแบบหมายเลข 3 วา ตวสรางคดลอก (Copy Constructor)
2) เมทอดและตวสรางทรบพารามเตอรทมชอเหมอนกบแอตทรบวของคลาส เมทอดหรอตวสรางใดกตามทรบคาพารามเตอรทมชอเหมอนกบแอตทรบวของคลาสนน จะตองใชคยเวรด
this ระบหนาแอตทรบวเพอไมใหเกดความสบสนวาคาใดคอแอตทรบวและคาใดคาพารามเตอร ดงตวอยาง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public class Data { public int x; public Data() { x = 0; } public Data(int n) { x = n; } public Data(Data d) { x = d.x; } public boolean isEq1(int n) { return x == n; } public boolean isEq2(Data d) { return x == d.x; }
}
รบเขามาทงกอนของออบเจค d แตจะสนใจเพยง
แคแอตทรบว x ในออบเจค d เทานน โดยจะเอา
คา x ทอยในออบเจค d หรอคา d.x เขาไปเกบไว
ในแอตทรบว x ของคลาสตนแบบ Data
n
d
x
รบเพยงแค int หนงคาในชอ n เขามา
ทางพารามเตอร
n
d
x
รบทงกอนออบเจคชนด Data หนงกอนใน
ชอ d เขามาทางพารามเตอร (แตจะใชงาน
เพยงแคคา x ของออบเจค d เทานน)
1 2 3 4 5 6 7 8
public class Data { public int x; ... public Data(int x) { x = x; //Error } ...
}
เกดความสบสนขน วา x ตวใดคอแอตทรบวและ
x ตวใดคอพารามเตอร
1 2 3 4 5 6 7 8
public class Data { public int x; ... public Data(int x) { this.x = x; } ...
}
ในกรณทรบพารามเตอรทมชออนทไมใชชอ x สามารถเขยนเปน
x = <พารามเตอร> ได แตถาพารามเตอรมชอเหมอนกบแอต-
ทรบว x จะตองเปลยนเปน this.x = <พารามเตอร>
คยเวรด this สามารถใชไดกบแอตทรบว
เทานนไมสามารถใชไดกบพารามเตอร
1
2
3
182
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
โจทยขอท 1 [ระดบปานกลาง] จงแสดงผลลพธในคลาส TestNum ทมการสรางและเรยกใชออบเจคจากคลาส Num ในรปแบบตางๆ พรอมทงเตมเตมสวนของเมทอดในคลาส Num ใหสมบรณ (16 คะแนน)
import java.util.Scanner; public class TestNum {
public static void main(String[] args) {
} //End of main
} //End of class
------------------------------------------------------------------------
public class Num { public int x; public int y; Num() { x = y = 0; }
Num(int x, int y) { this.x = x; this.y = y; }
Num(Num n) { this.x = n.x; this.y = n.y; } public boolean isEquals(int x, int y) { } public boolean isEquals(Num n) { }
} //End of class
Num n1 = new Num(); System.out.println(n1.x + "," + n1.y);
เรยกตวสรางใด (ระบหมายเลข)
ผลลพธทแสดง ขนบนจอภาพคอ
Num n2 = new Num(13, 2); System.out.println(n2.x + "," + n2.y);
Num n3 = new Num(n2); System.out.println(n3.x + "," + n3.y);
Num n4 = new Num(new Num(7, 11)); System.out.println(n4.x + "," + n4.y);
Num n5 = new Num(n4.y, n3.x); System.out.println(n5.x + "," + n5.y);
n2 = new Num(new Num()); System.out.println(n2.x + "," + n2.y);
1
2
3
183
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
3) เมทอดทคนคาเปนออบเจค (มประเภทขอมลเปนคลาส )
โจทยขอท 2 [ระดบยาก] จงเขยนคลาส Coin ใหสมบรณ ซงเปนตวแทนของเหรยญใดๆ ทประกอบไปดวยมลคาของเหรยญ (Value) และหนาของเหรยญ (Side) ทเปนหว (H) หรอกอย (T) พรอมทงสรางคลาส DemoCoin เพอสรางและเรยกใชออบเจคจากคลาส Coin (20 คะแนน)
public class Coin {
//แอตทรบว side แบบ public เพอเกบหนาของเหรยญเชน หว "H" และ กอย "T" //แอตทรบว value แบบ public เพอเกบมลคาของเหรยญ เชน 1 บาท, 2 บาท, 5 บาท และ 10 บาท
//กาหนดใหแอตทรบว list เปนรายการของหนาทเปนไปไดทงหมดของเหรยญ private final String list[] = { "H", "T" };
//ตวสรางแบบไมมพารามเตอรเพอกาหนดใหหนาของเหรยญเปนหว (H) และมลคา ของเหรยญเปน 0
//ตวสรางแบบมพารามเตอรสองตวทเปนสตรงและจานวนเตมเพอกาหนดหนาและมลคา ของเหรยญ
//ตวสรางแบบมพารามเตอรหนงตวประเภท Coin เพอกาหนดหนาและมลคาของเหรยญ
1 2 3 4 5 6 7 8 9 10 11 12
public class Data { public int x; ... public int getX() { return x; } public Data getData() { Data d = new Data(x); return d; } ...
}
x
d
x
คนคาขอมลในรปของออบเจค d ซงเปรยบเสมอน
เปนการคนคาขอมล d.x ออกไป (คนออกทงกอน)
184
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//เมทอด flip(…) เพอเปลยนหนาของเหรยญโดยการสม (ควรเรยกใชงานแอตทรบว list)
//เมทอด reverse(…) เพอกลบหนาของเหรยญจากหวเปนกอยหรอจากกอยเปนหว
//เมทอด equals(…) เพอรบเหรยญอกหนงเหรยญเขามาทางพารามเตอร แลวตรวจสอบวามหนา และมลคาของเหรยญนนเทากบเหรยญของคลาสนหรอไม
} //End of class
/* คลาส DemoCoin เพอสรางและเรยกใชงานคลาส Coin โดยใหสรางเหรยญ 4 เหรยญทประกอบไปดวยเหรยญ 1 บาทหนาหวจานวน 2 เหรยญ (ตองใชตวสรางคนละแบบกน) และเหรยญ 5 บาทหนากอยจานวน 2 เหรยญ (ตองใชตวสรางคนละแบบกน) พรอมสมหนาของเหรยญ 1 บาทเหรยญทหนงและกลบหนาเหรยญทสอง และสมหนาเหรยญ 5 บาทเหรยญทหนงและกลบหนาเหรยญทสอง โดยทา 20 ครง พรอมตรวจสอบวาเหรยญแตละคเทากนหรอไม แลวแสดงรายละเอยดนนขนบนจอภาพ */
185
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
public class DemoCoin { public static void main(String[] args) {
} //End of main } //End of class
โจทยขอท 3 [ระดบยาก] จงเขยนโปรแกรมจาวาเพอสรางคลาส SetOfInteger ทใชแทนเซตของตวเลขจานวนเตม โดยจะเกบไวในอาเรยทเรยงจากนอยไปหามากเสมอ และตวเลขในอาเรยตองไมซากนเลยโดยใหสรางเมทอด และแอตทรบวตามรายละเอยดทกาหนดให (30 คะแนน)
public class SetOfInteger {
//ประกาศแอตทรบวแบบ public ทเปนอาเรยประเภทจานวนเตมชอ iSet (ยงไมตองระบขนาด)
//กาหนดตวสรางแบบทรบพารามเตอร 1 ตวทเปนอาเรยชนดจานวนเตมเพอนามากาหนดคาเรมตนใหกบแอตทรบว iSet โดยจะตองมการจดเรยงจากนอยไปมากและกาจดสมาชกตวทซากนเสมอ ดตวอยาง { 7, 5, 3, 5, 3 } จะไดเปน { 3, 5, 7 } เปนตน (เรยกใชเมทอดทกาหนดไวให) public SetOfInteger(int[] x) {
} //End of constructor
186
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//กาหนดตวสรางแบบทรบพารามเตอร 1 ตวทเปนชนด SetOfInteger เพอนามากาหนดคาเรมตนใหกบแอตทรบว iSet public SetOfInteger(SetOfInteger s) {
} //End of constructor
//กาหนดใหเมทอด sort(…) ใชจดเรยงขอมลแบบฟองจากนอยไปมาก
public int[] sort(int x[]) { for (int i = x.length - 1; i >= 1; i--) for (int j = 0; j <= i; j++) if (x[j] > x[j + 1]) { int temp = x[j]; x[j] = x[j + 1]; x[j + 1] = temp; } } } return x;
} //End of method
//กาหนดใหเมทอด removeDuplicatedMembers(…) ใชกาจดสมาชกตวทซากน
public int[] removeDuplicatedMembers(int x[]) { int t[] = new int[x.length]; int index = 0; for(int i = 0; i < x.length; i++) { if (i == 0) { t[index] = x[i]; index++; } else { int j; for (j = 0; j < index; j++) { if (t[j] == x[i]) break; } if (j == index) { t[index] = x[i]; index++; } } } int n[] = new int[index]; for (int i = 0; i < n.length; i++) n[i] = t[i]; return n; } //End of method
187
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//ใหเมทอด equals(…) ใชตรวจสอบวาแอตทรบว iSet ในคลาสน กบ iSet จากออบเจค x ทรบ เขามาทางพารามเตอรเทากนหรอไม public boolean equals(SetOfInteger x) {
} //End of method
//ใหเมทอด toString(…) ใชคนคาสมาชกทกตวในแอตทรบว iSet ในรปแบบของสตรง public String toString() {
} //End of method
//ใหเมทอด addElement(…) ใชเพมจานวนเตมใดๆ หนงคาเขาไปในแอตทรบว iSet โดยจะตองขยายขนาดของแอตทรบว iSet และจดเรยงและกาจดกบสมาชกตวทซาใหมอกครงหนง public void addElement(int a) {
} //End of method
188
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//ใหเมทอด findElement(…) ใชคนหาตาแหนงของตวเลขคาใดคาหนงในแอตทรบว iSet โดยถาคนเจอใหคนคาตาแหนงทเจอ ถาไมเชนนนใหคนคา -1 public int findElement(int a) {
} //End of method
//ใหเมทอด isSubset(…) ใชตรวจสอบวาคา iSet ในออบเจค s เปนสบเซต (Subset) ของแอตทร-บว iSet ในคลาสนหรอไม public boolean isSubset(SetOfInteger s) {
} //End of method
//ใหเมทอด union(…) ใชคานวณหาเซตทเกดจากการนาเอา iSet ในคลาสนกบ iSet ทรบเขามาทางพารามเตอรมายเนยนกน (Union) แลวคนคาคาตอบชนด SetOfInteger
public SetOfInteger union(SetOfInteger s) {
} //End of method
189
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//ใหเมทอด intersect(…) ใชคานวณหาเซตทเกดจากการนาเอา iSet ในคลาสนกบ iSet ทรบเขามาทางพารามเตอรมาอนเตอรเซคกน (Intersection) แลวคนคาคาตอบชนด SetOfInteger
public SetOfInteger intersect(SetOfInteger s) {
} //End of method } //End of class
2. การประกาศและสรางอาเรยของออบเจค
1) วธการประกาศและสรางอาเรยของออบเจค ทาแบบเดยวกบการประกาศและสรางอาเรยแบบทวไป ซงมรายละเอยดดงน (1) การประกาศและสรางอาเรยของออบเจคแบบ 1 มต
(2) การประกาศและสรางอาเรยของออบเจคแบบ 2 มต
ตวอยางการประกาศและสรางออบเจคแบบทวไป (โดยอางองคลาส Data จากหนาแรก)
<ชอคลาส> <ชอออบเจค>[] = new <ชอคลาส>[ขนาด];
<ชอคลาส> <ชอออบเจค>[][] = new <ชอคลาส>[ขนาดแถว][ขนาดหลก];
1 2 3 4 5 6 7
public class TestData { public static void main(String [] args) { Data d = new Data(); Data e = new Data(13); System.out.println(d.x + "," + e.x); } }
d
x = 0
e
x = 13
190
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
ตวอยางการประกาศและสรางอาเรยของออบเจค
โจทยขอท 4 [ระดบยาก] จงสรางคลาส Student ทใชแทนนสตหนงคน ดงรายละเอยดตอไปน (30 คะแนน)
public class Student {
//แอตทรบวประจาออบเจค 3 ตวแบบ private ไดแก (4 คะแนน) แอตทรบว id ชนดจานวนเตมเพอเกบเลขประจาตวนสต แอตทรบว name ชนดสตรงเพอเกบชอนสต แอตทรบว score ชนดจานวนจรงซงเปนอาเรยทเกบคะแนนทกรายวชาทลงทะเบยนของนสต
//ตวสรางแบบไมกาหนดพารามเตอร (2 คะแนน)
//ตวสรางแบบ 3 พารามเตอร ไดแก เลขประจาตว ชอนสต และจานวนวชาทลงทะเบยน (2 คะแนน)
d
1 2 3 4 5 6 7 8 9 10
public class TestData { public static void main(String [] args) { Data d[] = new Data[6]; for (int i = 0; i < d.length; i++) { d[i] = new Data(i); } d[2].x = 15; d[4].x = 30 } }
ประกาศออบเจค 6 ออบเจคในรป
แบบของอาเรย (โดยแตละออบเจค
จะอยในอาเรยแตละชอง)
สรางออบเจคทง 6 ออบเจคในอาเรย โดยการ new พรอมทงกาหนด
คาเรมตนใหกบแอตทรบวในแตละออบเจคโดยการวน for
d[0]
x = 0
d[1]
x = 1
d[2]
x = 15
d[3]
x = 3
d[4]
x = 30
d[5]
x = 5
191
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//ตวสรางแบบ 1 พารามเตอรทเปนออบเจคของคลาส Student (2 คะแนน)
//เมทอดประจาออบเจค 4 เมทอดไดแก (10 คะแนน) เมทอด getID(…) ทไมรบพารามเตอร เพอคนคาเลขประจาตวนสต เมทอด getName(…)ทไมรบพารามเตอร เพอคนคาชอนสต เมทอด getScore(…)ทไมรบพารามเตอร เพอคนคาคะแนนทกรายวชาทลงทะเบยน เมทอด setScore(…) ทรบคาคะแนนทกรายวชาของนสตทเปนอาเรยเขามาทางพารามเตอร
เพอมากาหนดคาใหกบแอตทรบว score โดยเมทอดนไมมการคนคากลบ
} //End of class
จงสรางคลาส Freshmen ทมเพยงเมทอด main(…) โดยมรายละเอยดดงตอไปน (15 คะแนน)
import java.util.Scanner; public class Freshmen {
public static void main(String[] args) { Scanner kb = new Scanner(System.in);
//กาหนดใหมนสตทงหมด 800 คน ทสรางมาจากคลาส Student (เปนอาเรยของออบเจค)
192
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//กาหนดคาเรมตนใหกบเลขประจาตวของนสตของแตละคนแบบอตโนมต โดยเรยงลาดบตงแต 5300121 จนถง 5380021 และกาหนดคาเรมตนใหกบชอนสตของแตละคน โดยการวนรบคาจากแปนพมพทละชอ และกาหนดจานวนวชาทนสตทกคนลงทะเบยนเปน 4 รายวชาเทากนทกคน
//เรยกใชงานเมทอด setScore(…)ผานทางออบเจคของนสตแตละคน เพอใสคะแนนทง 4 ราย วชาใหกบนสตแตละคน โดยคาคะแนนไดจากการสมคะแนนในชวง 0 ถง 100
//แสดงเลขประจาตวนสต ชอนสต และคะแนนทง 4 รายวชาของนสตแตละคนออกทางจอภาพ
//คานวณหาคะแนนเฉลยของแตละรายวชา โดยเกดจากการเอาคะแนนแตละรายวชาของนสตทกคนมารวมกนแลวหารดวยจานวนนสตทงหมด พรอมทงแสดงผลลพธออกทางจอภาพ
193
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
} //End of main } //End of class
3. การประกาศและสรางแอตทรบวทมประเภทขอมลแบบคลาส
1) วธการประกาศและสรางแอตทรบวทเปนออบเจค (มประเภทขอมลเปนคลาส )
โจทยขอท 5 [ระดบยาก] จงเขยนโปรแกรมภาษาจาวาทสมบร ณเพอสรางเมอง (City) ทมพนทเปนรปสเหลยมผนผาหรอสเหลยมจสตรส โดยตวเมองนนเกดจากการนาทดน (Land) แปลงใดๆ มาเรยงตอกนในรปของตาราง ซงทดนแตละแปลงจะมเจาของทดน (Owner) ครอบครองอย โดยการทางานของโปรแกรมจะแบงออกเปน 3 คลาสไดแก คลาส Owner แทนเจาของทดนแตละคน คลาส Land แทนทดนแตละแปลง และคลาส City แทนเมองหนงเมอง โดยมรายละเอยดดงน (30 คะแนน)
Owner Land City
1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 16 17
public class Box { public double v; public Data d; public Box() { v = 0.0; d = new Data(); } public Box(double a, Data b) { v = a; d = new Data(b); } public Box(Box b) { v = b.v; d = new Data(b.d); } ...
}
Box v
d
x
การกาหนดคาเรมตนใหกบแอตทรบว v ซงเปนประเภท
double จะใชเครองหมายเทากบ (แบบเดมทเคยทา)
การกาหนดคาเรมตนใหกบแอตทรบว d ซงเปนออบ
เจคประเภท Data จะใชหลกการ new
194
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
1. คลาส Owner มรายละเอยดดงน (10 คะแนน)
public class Owner { //แอตทรบวประจาออบเจคแบบ private ชอ id เพอเกบหมายเลขประจาตว (ใหเปนจานวนเตม) //แอตทรบวประจาออบเจคแบบ private ชอ name เพอเกบชอเจาของทดน
//ตวสรางแบบ public ทไมมพารามเตอร เพอกาหนดคาเรมตนใหกบแอตทรบวทงสองตวใหเปนคาเรมตนตามประเภทขอมลของแอตทรบวนน (เชน int เปน 0 หรอ double เปน 0.0 เปนตน)
//ตวสรางแบบ public ทมพารามเตอร 2 ตวทเปนจานวนเตมและสตรง เพอกาหนดคาเรมตนใหกบแอตทรบวทงสองตวใหเปนไปตามคาทระบ
//ตวสรางแบบ public ทมพารามเตอร 1 ตวทเปนออบเจคชนด Owner เพอกาหนดคาเรมตนใหกบแอตทรบวทงสองตวใหเปนไปตามคาทไดจากออบเจคนน
//เมทอดประจาออบเจคแบบ public ชอ getID ทไมมพารามเตอร เพอคนคาหมายเลขประจาตว
195
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//เมทอดประจาออบเจคแบบ public ชอ getName ทไมมพารามเตอร เพอคนคาชอเจาของทดน
//เมทอดประจาออบเจคแบบ public ชอ setID ทรบคาจากพารามเตอร 1 ตว เพอใชกาหนดคาให กบหมายเลขประจาตว (กาหนดคาใหแอตทรบว id) โดยไมมการคนคากลบ
//เมทอดประจาออบเจคแบบ public ชอ setName ทรบคาจากพารามเตอร 1 ตว เพอใชกาหนดคาใหกบชอเจาของทดน (กาหนดคาใหแอตทรบว name) โดยไมมการคนคากลบ
//เมทอดประจาออบเจคแบบ public ชอ show ทไมมพารามเตอร เพอแสดงคาของแอตทรบวทงสองตวออกทางจอภาพทละบรรทด โดยไมมการคนคากลบ
} //End of class
2. คลาส Land มรายละเอยดดงน (10 คะแนน)
public class Land { //แอตทรบวประจาออบเจคแบบ public ชอ n ทเปนออบเจคของคลาส Owner (ประกาศออบเจคจากคลาส Owner มาเปนแอตทรบวในคลาส Land) เพอเปนตวแทนของเจาของทดนแปลงน //แอตทรบวประจาออบเจคแบบ public ชอ price เพอเกบราคาทดน
196
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//ตวสรางแบบ public ทไมมพารามเตอร เพอกาหนดคาเรมตนใหกบแอตทรบวทงสองตวใหเปนคาเรมตนตามประเภทขอมลของแอตทรบวน น (แอตทรบวทเปนออบเจคใหใชการ new)
//ตวสรางแบบ public ทมพารามเตอร 2 ตวทเปนออบเจคชนด Owner และจานวนจรง เพอกาหนดคาเรมตนใหกบแอตทรบวทงสองตวใหเปนไปตามคาทระบ
//เมทอดประจาออบเจคแบบ public ชอ setOwner ทมพารามเตอร 1 ตวคอออบเจคของคลาส Owner เพอใชกาหนดคาใหกบเจาของทดนแปลงน (กาหนดคาใหแอตทรบว n ทเปนออบเจค) โดยไมมการคนคากลบ
//เมทอดประจาออบเจคแบบ public ชอ setPrice ทมพารามเตอร 1 ตวเพอใชกาหนดคาใหกบราคาทดนแปลงน (กาหนดคาใหแอตทรบว price) โดยไมมการคนคากลบ
//เมทอดประจาออบเจคแบบ public ชอ show ทไมมพารามเตอร เพอแสดงคาของแอตทรบวทงสองตวออกทางจอภาพทละบรรทด โดยไมมการคนคากลบ
} //End of class
197
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
3. คลาส City ทมเมทอด main โดยมรายละเอยดภายในเมทอด main ดงน (10 คะแนน)
import java.util.Scanner; public class City { public static void main(String[] args) {
//สรางเมองทเปนอาเรยของออบเจค Land ทประกอบไปดวยทดน 3000 แปลง ขนาด 50 x 60 (เปนอาเรยสองมต)
//ภายในทดนแตละแปลงตองมเจาของทดนและราคาทกแปลง โดยเรมตนใหทดนทกแปลงยงไมมเจาของครอบครอง (กาหนดเจาของทดนใหเปน Default) และสมราคาทดนตงแตราคา 1 บาทจนถง 10 ลานบาทเพอกาหนดใหกบทดนแตละแปลง
//สรางออบเจคชอ ow1 ทเปนเจาของทดนชอ "Tukie" โดยมเลขประจาตวเปน 1001 พรอมแสดงขอมลของเจาของทดนคนนนบนจอภาพ
//สรางออบเจคชอ ow2 ทเปนเจาของทดนชอ "Annie" โดยมเลขประจาตวเปน 1002 พรอมแสดงขอมลของเจาของทดนคนนนบนจอภาพ
//กาหนดให Tukie ครอบครองทดนในแปลงตาแหนงท (4, 9) พรอมทงแสดงขอมลทดนแปลงนนออกทางจอภาพ
198
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//เปลยนราคาทดนท Tukie ครองครองอย ใหเปน 30 ลานบาท พรอมทงแสดงขอมลทดนแปลงนนออกทางจอภาพ
//เปลยนให Annie เขาไปครอบครองทดนแปลงท Tukie ครอบครองอย พรอมทงแสดงขอ มลทดนแปลงนนออกทางจอภาพ
//กาหนดให Tukie เขาครอบครองทดนแปลงใหม 50 แปลงทอยทางซายสดของเมอง (แถวท 1 ของเมอง) พรอมกาหนดใหราคาทดนทกแปลงเปน 50 ลานบาท พรอมทงแสดงขอมลของทดนแตละแปลงออกทางจอภาพ
} //End of main } //End of class
โจทยขอท 6 [ระดบยาก] โปรแกรมทกาหนดใหตอไปนเปนโปรแกรมทใชคลาส Scanner ในการรบคาตวเลขจานวนเตม 1 คาจากแปนพมพ แลวตามดวยรบคาสตรงอก 1 คาจากแปนพมพ ซงผลปรากฎวาเกดขอผดพลาดขนกบตวโปรแกรม โดยโปรแกรมเมอรบคาตวเลขจานวนเตมเรยบรอยแลว จะไมสามารถรอรบคาสตรงตอไปได เมอตรวจสอบสาเหตกพบวา หลงจากรบคาตวเลขจานวนเตมแลวตามดวยการกดปม Enter จะมอกขระบางตวทมองไมเหนเกดขน ซงอกขระดงกลาวไดถกเกบเขาไปในตวแปรสตรงทตงใจจะรบคาในตอนแรกแทน จงทาใหโปรแกรมไมสามารถรอรบคาสตรงทตองการได
1 2 3 4 5 6 7 8 9 10 11
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner kb = new Scanner(System.in); System.out.print("Enter Int: "); int a = kb.nextInt(); System.out.print("Enter Str: "); String b = kb.nextLine(); System.out.println(a + "," + b); } }
ผลลพธจรงทได Enter Int: 10 Enter Str: 10
ผลลพธทควรจะได (แตไมไดตามน) Enter Int: 10 Enter Str: Java 10,Java
199
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
จงสรางคลาสขนใหมชอ SScanner เพอทาการแกไขขอผดพลาดดงกลาว โดยคลาส SScanner นจะทา งานคลายกบคลาส Scanner โดยมสวนประกอบดงตอไปน (10 คะแนน)
import java.util.Scanner; import java.io.InputStream; public class SScanner {
//แอตทรบวประจาออบเจคชอ kb ทมชนดเปนแบบ Scanner
//ตวสรางทรบพารามเตอร 1 ตวชอ in ทมชนดเปนแบบ InputStream เพอกาหนดคาเรมตนใหกบ แอตทรบว kb
//เมทอดประจาออบเจคชอ nextInt(…) ทไมรบพารามเตอรใดๆ โดยจะรบคาตวเลขจานวนเตม 1 คาจากแปนพมพแลวคนคาตวเลขทรบนน
//เมทอดประจาออบเจคชอ nextLine(…) ทไมรบพารามเตอรใดๆ โดยจะรบคาสตรง 1 คาจากแปน พมพ ถาสตรงมความยาวมากกวา 0 ใหคนคาสตรงทรบมา ถาไมเชนนนจะวนรบไปเรอยๆ
} //End of class
200
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
จงสรางคลาสอกหนงคลาสชอ TestSScanner เพอเรยกใชงานคลาส SScanner แลวทาการรบคาแบบเดมอกครงหนง เพอทดสอบวาโปรแกรมสามารถทางานไดอยางไมผดพลาดอกตอไป (5 คะแนน)
public class TestSScanner { public static void main(String[] args) {
} //End of main } //End of class
โจทยขอท 7 [ระดบเทพ] นางสาวแอนน (มอล) นสตทงดงามทสดในภาคพนเอเชยตะวนออกเฉยงใต ไดจดเตรยมของขวญสาหรบแจกเหลาบรรดาหนมๆ ซงมารมจบเธออยางไมขาดสาย โดยของขวญของเธอนนเปนกระเชาผลไมทจดตกแตงอยางสวยงาม แตเนองจากการรมรอนและอดอนในวชาจาวาของเธอ จงทาใหแอนนเขยนโปรแกรมภาษาจาวาเพอสรางกระเชาผลไมทใชสาหรบใสผลไมขนมา โดยประกอบไปดวยคลาส 3 คลาสไดแก คลาส Fruit เพอแทนผลไม คลาส Basket เพอแทนกระเชา และคลาส FruitBasket เพอใชเปนกระเชาผลไมทจดตกแตงอยางสวยงามพรอมใชแจกใหกบบรรดากก เอย! บรรดาหนมๆ ของเธอ โดยมรายละเอยดของแตละคลาสดงตอไปน (50 คะแนน)
1. คลาส Fruit เพอแทนผลไมหนงผลใดๆ (10 คะแนน) public class Fruit {
//แอตทรบวประจาออบเจคชอ name เพอเกบชอผลไม เชน สม แอปเปล กลวย เปนตน //แอตทรบวประจาออบเจคชอ weigh เพอเกบนาหนกของผลไม
//กาหนดใหแอตทรบว wh แทนนาหนกทเปนไปไดทงหมดของผลไมแตละผล private final double wh[] = { 0.1, 0.2, 0.3, 0.4, 0.5 };
//ตวสราง 4 แบบ ดงตอไปน ตวสรางแบบไมมพารามเตอร เพอกาหนดคาเรมตนใหกบแอตทรบวทกตว ตวสรางแบบหนงพารามเตอรท เปนสตรง เพอใชกาหนดชอผลไม สวนนาหนกของผลไมนนจะ
ไดจากการสม (แนะนาใหเรยกใชแอตทรบว wh)
201
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
ตวสรางแบบสองพารามเตอรทเปนสตรงและจานวนจรง เพอใชกาหนดชอผลไม และนาหนก ขอผลไมตามลาดบ
ตวสรางแบบหนงพารามเตอรประเภท Fruit เพอใชกาหนดชอผลไม และนาหนกของผลไม
//เมทอดประจาออบเจคชอ showFruit เพอใชแสดงรายละเอยดของผลไมขนบนจอภาพ
} //End of class
2. คลาส Basket เพอแทนกระเชา (20 คะแนน) public class Basket {
//แอตทรบวประจาออบเจคชอ fruit ประเภท Fruit ซงเปนอาเรยทใชสาหรบเกบผลไม //แอตทรบวประจาออบเจคชอ count เพอบอกจานวนของผลไมทเกบอยในกระเชา
202
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//ตวสรางแบบไมมพารามเตอรเพอกาหนดใหกระเชาสามารถเกบจานวนผลไมไดสงสด 10 ผล
//ตวสรางแบบหนงพารามเตอรชนดจานวนเตม เพอกาหนดใหกระเชาสามารถเกบจานวนผลไมไดสงสดตามจานวนเต มทระบ
//ตวสรางแบบหนงพารามเตอรชนด Basket เพอกาหนดใหกระเชามขอมลทกอยางเหมอนกบกระเชาทรบเขามา พรอมทงนาผลไมจากกระเชาทรบเขามาทางพารามเตอรมาใสในกระเชาน
//เมทอดประจาออบเจคชอ isFull เพอตรวจสอบวากระเชาเตมหรอไม พรอมทงคนคากลบ
//เมทอดประจาออบเจคชอ isEmpty เพอตรวจสอบวากระเชาวางหรอไม พรอมทงคนคากลบ
203
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//เมทอดประจาออบเจคชอ takeIn เพอรบผลไมเขามา 1 ผลเพอนาไปเกบในกระเชา โดยกอนจะเกบลงไป จะตองตรวจสอบกอนวากระเชาเตมหรอไม ถาเตมใหแสดงขอความวา “Basket Full” แตถาไมเตมกใหเกบผลไมลงไปในกระเชา พรอมทงนบจานวนผลไมทอยในกระเชาดวยวามอยกผล
//เมทอดประจาออบเจคชอ takeOut เพอนาผลไม 1 ผลออกจากกระเชา โดยกอนจะนาออกไป จะ ตองตรวจสอบกอนวากระเชาวางหรอไม ถาวางใหแสดงขอความวา “Basket Empty” แตถาไมวางกใหนาผลไมออกจากกระเชา พรอมทงนบจานวนผลไมทอยในกระเชาดวยวามอยกผล
//เมทอดประจาออบเจคชอ getTotalWeigh เพอคนคานาหนกรวมของผลไมทงหมดในกระเชา
204
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//เมทอดประจาออบเจคชอ showBasket เพอใชแสดงรายละเอยดของผลไมในกระเชาขนบนจอภาพ
} //End of class
3. คลาส FruitBasket เพอใชเปนกระเชาผลไมทจดตกแตงอยางสวยงาม (20 คะแนน) import java.util.Scanner; public class FruitBasket {
//เมทอดประจาคลาสชอ getFruitBasket เพอใชสรางกระเชาผลไม 1 กระเชาโดยจะตองรบคาชอผลไมชนดใดชนดหนง (สม แอปเปล ฯลฯ) นาหนกของผลไม (เทากนทกผล) และจานวนของผลไมในกระเชาผานทางพารามเตอร พรอมทงคนคากระเชาผลไมทจดเกบเรยบรอยแลวกลบมา
//เมทอดประจาคลาสชอ showFruitBasket ทรบกระเชาเขามาทางพารามเตอร เพอใชแสดงคาขอ-มลในกระเชาขนบนจอภาพ ซงไดแก นาหนกรวมของกระเชา (Total Weigh) จานวนผลไมทงหมดในกระเชา (Total Fruit) และรายละเอยดของผลไมในกระเชาแตละผล (List of Fruit)
205
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//เมทอด main เพอใชในการจดเกบและตกแตงผลไมในกระเชา public static void main(String[] args) {
//สรางกระเชาผลไมขนมา 3 กระเชา (เปนอาเรยทเปนประเภท Basket) โดยในการสรางกระเชานนใหเรยกใชเมทอด getFruitBasket ซงกระเชาท 1 เปนกระเชาแอปเปล (Apple) นาหนกผลล 0.12 กรม จานวน 25 ผล กระเชาท 2 เปนกระเชาสม (Orange) นาหนกผลละ 0.1 กรม จานวน 30 ผล และ กระเชาท 3 เปนกระเชาเมลอน (Melon) นาหนกผลละ 0.45 กรม จานวน 15 ผล
//สรางกระเชาผลไมเปลาๆ ขนมาอก 6 กระเชา (เปนอาเรยทเปนประเภท Basket) แลวทาการหยบผลไมจาก 3 กระเชาแรกทไดสรางไวกอนหนานลงไปในกระเชาเปลาทง 6 กระเชานน โดยใหหยบผลไมจากกระเชาท 1-3 เรยงตามลาดบไปเรอยๆ จนกวากระเชาเปลาจะเตมทกกระเชา พรอมทงแสดงรายละเอยดของผลไมในแตละกระเชาทจดเกบเรยบรอยแลวขนบนจอภาพโดยการเรยกใชเมทอด showFruitBasket
} //End of main } //End of class
206
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
โจทยขอท 8 [ระดบเทพ] จงเขยนโปรแกรมภาษาจาวาใหสมบร ณเพอสรางหองตวจาวา ซงกคอหอง 302 ตก 1 คณะวศวกรรมศาสตร จฬาลงกรณมหาวทยาลย โดยจะประกอบไปดวยคลาส 2 คลาส ไดแกคลาส Student ทแทนนสตแตละคน และคลาส Room ทแทนหองตวจาวา โดยภายในหองตวจะมนสตนงอยขางใน ซงตาแหนงทนงของนสตแตละคนจะจดใหตามระดบความเกรยน (Noob Levels) ของนสตคนนน ซงจะม 4 ระดบไดแก ระดบท 1 เกรยน (Noob) ระดบท 2 เกรยนเรยกพอ (Father Noob) ระดบท 3 เกรยนเทพ (God Noob) ระดบท 4 เกรยนเมพ (Hof Noob) โดยรายละเอยดการทางาน และรายละเอยดของคลาสทงสองมดงตอไปน (30 คะแนน) 1. คลาส Student มรายละเอยดดงน (10 คะแนน)
public class Student { //แอตทรบวประจาออบเจคแบบ private ชอ id เกบเลขประจาตวนสต //แอตทรบวประจาออบเจคแบบ private ชอ name เกบชอนสต //แอตทรบวประจาออบเจคแบบ private ชอ noob เกบระดบความเกรยน
//ตวสรางแบบไมมพารามเตอร เพอกาหนดคาเรมตนใหกบแอตทรบวทกตว
//ตวสรางแบบทรบพารามเตอร 3 ตวเพอกาหนดคาเรมตนใหกบแอตทรบวทกตว
//ตวสรางแบบทรบพารามเตอรเปนชนด Student เพอกาหนดคาเรมตนใหกบแอตทรบวทกตว
207
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//เมทอดประจาออบเจคแบบ public ชอ getID ทไมมพารามเตอร เพอคนเลขประจาตวนสต
//เมทอดประจาออบเจคแบบ public ชอ getName ทไมมพารามเตอร เพอคนชอนสต
//เมทอดประจาออบเจคแบบ public ชอ getNoob ทไมมพารามเตอร เพอคนระดบความเกรยน
//เมทอดประจาออบเจคแบบ public ชอ set ทรบพารามเตอรชนด Student เพอนามากาหนด คาใหกบแอตทรบวทกตวใหเหมอนกบคาพารามเตอรนน
//เมทอดประจาออบเจคแบบ public ชอ show ทไมมพารามเตอร เพอแสดงคาของแอตทรบวทกตวในคลาสนขนบนจอภาพ ซงประกอบไปดวยเลขประจาตว ตามดวยชอ และตามดวยระดบความเกรยน โดยถาระดบความเกรยนเปน 1 ใหแสดงวา "[1-Noob]" ถาระดบความเกรยนเปน 2 ใหแสดงวา "[2-Father Noob]" ถาระดบความเกรยนเปน 3 ใหแสดงวา "[3-God Noob]" ถาระดบความเกรยนเปน 4 ใหแสดงวา "[4-Hof Noob]" ถาไมเชนนนใชแสดงวา "[Un- known]" โดยใหทกคาแสดงอยภายในบรรทดเดยวกน
208
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
} //End of class
2. คลาส Room แทนหองตวจาวา หอง 302 ตก 1 โดยกาหนดใหม 16 แถว แถวละ 40 ทนง โดยใน 40 ทนงนนจะนงไดจรงแค 38 ท นงเพราะถกเวนไวสาหรบชองทางเดนตรงกลางหอง โดยมแผนผงหองตามตวอยางทกาหนดให และมรายละเอยดของโปรแกรมดงตอไปน (20 คะแนน)
public class Room { //แอตทรบวประจาคลาสแบบ public ชอ s ทเปนอาเรย 2 มต โดยมชนดเปนแบบ Student เพอใชสาหรบสรางทนงใหกบหองตวจาวา โดยกาหนดใหหอง 302 ตก 1 ม 16 แถว แถวละ 40 ทนง
เมทอดประจาคลาสแบบ public void ชอ setSeat ทรบพารามเตอรเปนชนด Student (นสต 1 คน) เขามาเพอนามาจดสรรทนงใหกบนสตผนน โดยใหพจารณาระดบความเกรยนดงน (1) ถาระดบความเกรยนเปน 1 ใหเลอกทนงตงแตแถวท 13-16 (2) ถาระดบความเกรยนเปน 2 ใหเลอกทนงตงแตแถวท 9-12 (3) ถาระดบความเกรยนเปน 3 ใหเลอกทนงตงแตแถวท 5-8 (4) ถาระดบความเกรยนเปน 4 ใหเลอกทนงตงแตแถวท 1-4 //โดยตาแหนงทนงนนใหจดสรรเรยงตามลาดบทนงวางของแตละแถวไปเรอยๆ จนเตมแถว และจะไมมการจดสรรทนงบรเวณทางเดนกลางหอง (ปลอยวางเอาไว)
แถวท 1
แถวท 16
209
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java Advanced Classes and Objects - 13
//เมทอดประจาคลาสแบบ public void ชอ showRoom ทไมรบพารามเตอร เพอใชแสดงแผนผงหองตวพรอมกบระบตาแหนงของนสตทกาลงนงอยในหอง ณ ขณะนน ตามทไดถกจดสรรทนงเอาไว โดยถาทนงมนสตนงใหแสดงตวอกษรตวแรกของชอนสตขนบนแผนผงหอง เชน W, T เปนตน แตถาทนงวางใหแสดงเปนสญลกษณชารป (#) สวนบรเวณทางเดนใหแสดงเปนชองวาง
//เมทอดประจาคลาสแบบ public void ชอ showStudent ทรบพารามเตอรเขามา 2 ตว เปนลา ดบแถวและหลกของทนง เพอแสดงขอมลของนสตทนงอย ณ ตาแหนงนน
210
© สงวนลขสทธ พฤศจกายน 2553 (ปรบปรงครงท 7 ฉบบใชตวภาค 2/2553) เรยบเรยงโดย วงศยศ เกดศร (แบงค)
Computer Programming using Java 13 - Advanced Classes and Objects
//เมทอดประจาคลาสแบบ public void ชอ showStudent ทไมรบพารามเตอร เพอแสดงขอมลของนสตทกคนทอยในหองตว พรอมทงระบตาแหนงทนงของนสตแตละคน
//เมทอด main(…) เพอประมวลผลการจดสรรหองตวดงตอไปน (1) กาหนดใหแอตทรบว s ทเปนอาเรย 2 มตชนด Student ทกชอง มคาเรมตนเปนทนงวาง (แตละ
ชองมเลขประจาตวนสตเปน 0 ชอเปน "" และระดบความเกรยนเปน 0 (2) สรางนสตจานวน 5 คนไดแกนสตชอ Akeudom, Phakhin, Taparb, Ong-ard และ Wongyos
ตามลาดบ และมระดบความเกรยนเปน 1, 1, 2, 3, และ 4 ตามลาดบ โดยใหกาหนดเลขประจาตวนสตไดอยางอสระ
(3) จดสรรทนงในหองตวใหกบนสตทง 5 คน โดยเรยกใชเมทอด setSeat(…) (4) แสดงแผนผงหองตวเพอแสดงตาแหนงทนงของนสตทง 5 คน โดยเรยกใชเมทอด showRoom(…) (5) แสดงขอมลของนสตทกคนในหองตวโดยเรยกใชเมทอด showStudent(…)
} //End of class