1.假設CRectangle類別的定義如下:
class CRectangle
{
int width
int height
}
(a) 試設計一個建構元 CRectangle(int w,int h),當此建構元呼叫時,便會自動設定 width=w,height=h。
ans
public CRectangle(int w,int h)
{
width=w;
height=h;
}
(b) 請接續(a)的部分,請再設計一個沒有引數的建構元CRectangle(),使得當此建構元呼叫時,便會自動設定width=10,height=8(請不要使用this() 來設定)
ans
class CRectangle
{
int width;
int height;
public CRectangle(int w,int h)
{
width=w;
height=h;
}
public CRectangle()//沒有引數的建構元只能一組
{
width=10;
height=8;
}
public void show()
{
System.out.println("width="+width);
System.out.println("height="+height+"\n");
}
}
public class eel
{
public static void main(String args[])
{
CRectangle aa=new CRectangle(5,2);
aa.show();
CRectangle bb=new CRectangle();
bb.show();
}
}
(c)同 (b) 小題,但width 與 height 的值請用 this() 來設定。
ans
class CRectangle
{
int width;
int height;
public CRectangle(int w,int h)
{
width=w;
height=h;
}
public CRectangle()//沒有引數的建構元只能一組
{
this(10,8);
int width;
int height;
}
public void show()
{
System.out.println("width="+width);
System.out.println("height="+height+"\n");
}
}
public class eel
{
public static void main(String args[])
{
CRectangle aa=new CRectangle(5,2);
aa.show();
CRectangle bb=new CRectangle();
bb.show();
}
}
2. 如果把習題1的 (c) 小題中,沒有引數的建構元CRectangle() 撰寫成
01 public CRectangle()
02 {
03 System.out.println("constructor called");
04 this(10,8)
05 }
試問這個程式碼錯在哪兒?應如何更正?
ans
程式第 4 行的 this(10,8); 要與第 3 行交換,因為 this()必須要是建構元內的第一個敘述,否則編譯時會產生錯誤。
程式第 4 行的 this(10,8); 要與第 3 行交換,因為 this()必須要是建構元內的第一個敘
述,否則編譯時會產生錯誤。
程式第 4 行的 this(10,8); 要與第 3 行交換,因為 this()必須要是建構元內的第一個敘
述,否則編譯時會產生錯誤。
程式第 4 行的 this(10,8); 要與第 3 行交換,因為 this()必須要是建構元內的第一個敘
述,否則編譯時會產生錯誤。
3. 試閱讀下列的程式碼,並回答接續的問題:01 // hw9_3, 從某一建構元呼叫另一建構元
02 class Caaa // 定義類別Caaa
03 {
04 private int value;
05
06 public Caaa()
07 {
08 this(10);// 試填寫此處的程式碼,使得呼叫此建構元時,value的值會被設定為10
09 System.out.println("value="+value) ;
10 }
11 public Caaa(int i)
12 {
13 value=i;
14 System.out.println ("value="+value);
15 }
16}
17 public class hw9_3
18 {
19 public static void main(String args[])
20 {
21 Caaa obj1=new Caaa();
22 Caaa obj2=new Caaa(12);
23 }
24 }
(a) 試填寫第8行的程式碼,使得當沒有引數的建構元 Caaa() 被呼叫時,value 的值被設為10 。
ans 上述紅色字體
(b) 試問在第21與22 行的程式碼中,各是哪一個建構元會被呼叫?
ans 第21行是呼叫沒有引數的,第22行則是呼叫有引數的。
(c) 於本例中,第2行的 Caaa 類別是否可以宣告成 public? 為什麼?
ans: Caaa 類別不能宣告成public,因為一個檔案裡只能有一個 public 的類別,而且與程式儲存的文字檔名相同。如果要將 Caaa 類別宣告成 public,則必須將Caaa 類別另存成一個檔案,同時該檔案的名稱要為 Caaa.java。
Caaa 類別不能宣告成public,因為一個檔案裡只能有一個 public 的類別,而且與程
式儲存的文字檔名相同。如果要將 Caaa 類別宣告成 public,則必須將Caaa 類別另
存成一個檔案,同時該檔案的名稱要為 Caaa.java。
Caaa 類別不能宣告成public,因為一個檔案裡只能有一個 public 的類別,而且與程
式儲存的文字檔名相同。如果要將 Caaa 類別宣告成 public,則必須將Caaa 類別另
存成一個檔案,同時該檔案的名稱要為 Caaa.java。
(d) 於本例中,如果第 4 行的value 成員改成宣告為 public? 對本範例的執行是否會有影響?為什麼?ans 可在其他類別呼叫 value所以並沒有影響。
4. 於下列的程式碼中,當您編譯它時會有錯誤訊息。請嘗試找出錯誤之所在,並修正之。
//hw9_4, 建構元的使用
class CBox //定義類別CBox
{
private int length;
private int width;
private int height;
public CBox (int l,int w,int h)
{
length=l;
width=w;
height=h;
}
public void show()
{
System.out.print("length="+length);
System.out.print(", width="+width);
System.out.print(", height="+height);
}
}
public class hw9_4
{
public static void main(String args[])
{
CBox box1=new CBox(1,2,3) ; //設定引數
box1.show();
}
}
會印出
length=1, width=2, height=3。
9.2類別變數與類別函數
5. 試依題意回答下列各題:
(a) 試設計類別CCount,內涵 cnt 變數 (初值設為0) 與 count() 函數,只要每建立一個物件,cnt的值變加一。也就是說,cnt 可用來追蹤 CCount 物件建立的個數。
ans
class CCount
{
static int cnt=0;
public CCount ()
{
cnt ++;
}
public static void count()
{
System.out.println(cnt+"object(s) created");
}
}
public class eel
{
public static void main(String args[])
{
CCount a=new CCount();
CCount.count();
CCount b=new CCount();
CCount c=new CCount();
CCount.count();
CCount.count();
}
}
//印出
1object(s) created
3object(s) created
3object(s) created
又或者是這樣
class CCount
{
static int cnt=0;
public CCount ()
{
cnt ++;
}
public void count()
{
System.out.println(cnt+"object(s) created");
}
}
public class eel
{
public static void main(String args[])
{
CCount a=new CCount();
a.count();
CCount b=new CCount();
CCount c=new CCount();
b.count();
c.count();
}
}
印出相同
(b) 試設計setZero() 函數,當此函數呼叫時,cnt的值也會歸零。
ans
class CCount
{
static int cnt=0;
public CCount ()
{
cnt ++;
}
public void count()
{
System.out.println(cnt+"object(s) created");
}
void setValue()
{
cnt=0;
}
}
public class eel
{
public static void main(String args[])
{
CCount a=new CCount();
a.count();
CCount b=new CCount();
CCount c=new CCount();
b.count();
a.setValue();
c.count();
}
}
///印出
1object(s) created
3object(s) created
0object(s) created //與(a)題僅差setValue() 依題意呼叫且規0。
(c) 試設計setValue(int n) 函數,當此函數呼叫時, cnt的值會被設定為 n。
ans 可是n 是int整數型態所以填上任意整數的意思嗎?還是輸出要變成只有n??
在類別中加入此函數,可任意在setValue()輸入整數
void setValue(int n)
{
cnt=n;
}
(d) 於本例中, cnt 變數應該利用 實例變數 還是類別變數 ?為什麼?
ans 類別變數,static修飾子加上成為類別變數,類別變數是每一個物件共享,因此會隨物件建立而累家
(e) 於本例中, count() 函數應該宣告成 實例函數 還是 類別函數 ? 或者兩者都可以?
ans 實例函數,只要執行count() cnt變累加,如果是類別函數變成物件共用便無法執行。
6.試撰寫一個可以計算 1+2+...+n 的類別函數 add2n(int n) 函數。請分別計算出1+2+...+5及1+2+..+10的結果。
ans
class CCount
{
static int count;
public static void add2n(int n)
{
for(int i=0;i<=n;i++)
{
count=count+i;
}
System.out.println("1+2+3+..="+count);
count=0; //須歸零否則會繼續累計加下去
}
}
public class eel
{
public static void main(String args[])
{
CCount.add2n(10);
CCount.add2n(5);
}
}
7.試撰寫一個類別函數 power(int x, int n) 函數 , 用來計算 x 的 n 次方。請計算2^5的3^2。
ans
class Count
{
public static void ppp(int i,int j)
{
System.out.println(Math.pow(i, j)); //平方
}
}
public class eel
{
public static void main(String args[])
{
Count.ppp(2, 5);
Count.ppp(3, 2);
}
}
//印出
32.0
9.0
8.試依題意回答下列各題:
(a) 試設計類別CWin , 內含 cnt 變數 (初值設為0) 與count() 函數,只要每建立一個物件,cnt的值便加1。也就是說,cnt 可用來追蹤 CWin 物件建立的個數。
ans
class CWin
{
private static int cnt;
public static void count()
{
cnt=cnt+1;
System.out.println(cnt+" objects");
}
}
public class eel
{
public static void main(String args[])
{
CWin a=new CWin();
CWin.count();
CWin b=new CWin();
CWin.count();
}
}
//印出
1 objects
2 objects
(b) 試設計一個建構元 Cwin(String str,int w, int h),幫此建構元呼叫時,便會自動設定 color=str ,width=w,height=h。
(c) 請接續 (a) 的部分,請再設計一個沒有引數的建構元 CWin(),使得當此建構元呼叫時,便會自動設定 color=str,width=w,height=h。
(d) 試設計 setZore() 函數,當此函數呼叫時,cnt 的執會被歸於零。
(e) 試設計 setValue(int n) 函數,當此函數呼叫時,cnt 的執會被設定為n。
ans:以上
class CWin
{
private static int cnt;
static String color;
static int width;
static int height;
public static void count()
{
cnt=cnt+1;
System.out.println(cnt+" objects");
}
public static void Cwin(String str,int w,int h)
{
color = str;
width=w;
height=h;
}
public static void CWin()
{
color="red";
width=2;
height=2;
}
public static void setZore()
{
cnt=0;
System.out.println(cnt+" objects");
}
public static void setValue(int n)
{
cnt=n;
}
}
public class eel
{
public static void main(String args[])
{
CWin a=new CWin();
CWin.count();
CWin b=new CWin();
CWin.count();
CWin.setZore();
}
}
//印出
1 objects
2 objects
0 objects
(f) 於本例中,cnt變數應該利用 實例函數 還是 類別函數 ? 為什麼?
ans 類別函數,如果不是無法累加。
(g) 於本例中,count() 函數應該定義成 實例函數 還是 類別函數? 或者是兩者都可以?
ans:實例函數,只要執行count() cnt變累加,如果是類別函數變成物件共用便無法執行。
9. app9_11 的 compare() 函數是撰寫在 CCircle 類別內。 試修改 compare() 函數,使得它是類別 app9_11 裡的函數成員,而不是 CCircle 類別的函數成員。
ans
// app9_11 ,由函數傳回類別型態的變數
class CCircle // 定義類別CCircle
{
private static double pi=3.14;
private double radius;
public CCircle(double r) // CCircle建構元
{
radius=r;
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir1=new CCircle(1.0);
CCircle cir2=new CCircle(2.0);
CCircle obj;
obj=cir1.compare(cir2); // 呼叫compare() method
if(cir1==obj)
System.out.println("radius of cir1 is larger");
else
System.out.println("radius of cir2 is larger");
}
}
另
class CCircle
{
private static double pi=3.14;
public double radius;
public CCircle(double r)
{
radius=r;
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir1=new CCircle(1.0);
CCircle cir2=new CCircle(2.0);
CCircle obj;
obj=compare(cir1,cir2);
if(cir1==obj)
System.out.println("radius of cir1 is larger");
else
System.out.println("radius of cir2 is larger");
}
public static CCircle compare(CCircle cira,CCircle cirb)
{
if(cira.radius==cirb.radius)
return cira;
else
return cirb;
}
}
10. 假設我們設計一類別 CRational,可用來處理分數的一些相關運算。CRational 類別初步撰寫如下:
// hw 9_10, 分數類別的應用
01 // hw9_11, 分數類別的應用
02 class CRational // 分數類別
03 {
04 public int n;
05 public int d;
06 public void setN(int num) // 設定分子
07 {
08 n=num;
09 }
10 public void setD(int num) // 設定分母
11 {
12 d=num;
13 }
14 public void show()
15 {
16 System.out.println(n+"/"+d); // 顯示分數
17 }
18 }
19 public class hw9_11
20 {
21 public static void main(String args[])
22 {
23 CRational aaa=new CRational();
24 aaa.setN(2);
25 aaa.setD(5);
26 aaa.show();
27 }
28 }
上面的程式碼初步定義了 CRational 類別, 它具有兩個資料成員,分別為分子 (numerator) n 與 (denominator) d ,以及三個函數,分別為用來設定分子與分母的 setN() 與 setD() , 和用來顯示分數的show()。 在 main() 裡,我們設定了分子2,分母為5,最後並利用 show() 顯示分數。如果執行此一程式,可得到如下的執行結果 : 2/5
(a) 在 CRational 類別裡, setN() 與 setD() 函數分別是用來設定分子與分母。試撰寫另一函數,public void setND(int num, int den),可用來同時設定分數的分子與分母。
ans
class CRational // 分數類別
{
public int n;
public int d;
public void setND(int num, int den)
{
n=num;
d=den;
}
public void setN(int num) // 設定分子
{
n=num;
}
public void setD(int num) // 設定分母
{
d=num;
}
public void show()
{
System.out.println(n+"/"+d); // 顯示分數
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
aaa.setND(3,5);
aaa.show();
}
}
(b) 試將 CRational 類別裡的 show() 函數改寫成類別 ex9_11 裡的函數成員,而非CRational 類別裡的函數成員。
ans
class CRational // 分數類別
{
public static int n;
public static int d;
public void setND(int num, int den)
{
n=num;
d=den;
}
public void setN(int num) // 設定分子
{
n=num;
}
public void setD(int num) // 設定分母
{
d=num;
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
aaa.setND(3,5);
show(aaa); //內部函數(物件)
}
public static void show(CRational obj) //引數 類別and物件
{
System.out.println(obj.n+"/"+obj.d); // 顯示分數
}
}
11. 下列各題接續習題10,試在CRational類別裡加入分數運算的相關method,其中所有method的傳回型態皆為CRational,且分數運算的結果不需化成最簡分數:
(a) 加入add(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相加,並傳回相加後的結果。
(b) 加入sub(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相減,並傳回相減後的結果。
(c) 加入mul(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相乘,並傳回相乘後的結果。
(d) 加入div(CRational r) method,它可用來將呼叫它的CRational物件與傳入的引數進行分數的相除,並傳回相除後的結果。
ans
class CRational // 分數類別
{
public int n;
public int d;
public void setND(int num,int den)
{
n=num;
d=den;
}
public CRational add(CRational r)
{
display(this,r,'+');
CRational obj=new CRational();
obj.n=this.n*r.d+this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational sub(CRational r)
{
display(this,r,'-');
CRational obj=new CRational();
obj.n=this.n*r.d-this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational mul(CRational r)
{
display(this,r,'*');
CRational obj=new CRational();
obj.n=this.n*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational div(CRational r)
{
display(this,r,'/');
CRational obj=new CRational();
obj.n=this.n*r.d;
obj.d=this.d*r.n;
return obj;
}
public void display(CRational r1,CRational r2,char ch) // 顯示分數
{
System.out.print("(");
System.out.print(r1.n+"/"+r1.d);
System.out.print(")");
System.out.print(ch);
System.out.print("(");
System.out.print(r2.n+"/"+r2.d);
System.out.print(")=");
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
CRational bbb=new CRational();
CRational ccc;
aaa.setND(2,5);
bbb.setND(3,7);
ccc=aaa.add(bbb); // 加法 ,不董(猜測:display CRational r1,CRational r2,char ch
show(ccc);
ccc=aaa.sub(bbb); // 減法
show(ccc);
ccc=aaa.mul(bbb); // 乘法
show(ccc);
ccc=aaa.div(bbb); // 除法
show(ccc);
}
public static void show(CRational obj) // 顯示分數
{
System.out.println(obj.n+"/"+obj.d);
}
}
(2/5)+(3/7)=29/35
(2/5)-(3/7)=-1/35
(2/5)*(3/7)=6/35
(2/5)/(3/7)=14/15
12.下列各題接續習題10,試於 CRational 類別中撰寫 compare(CRational r1,CRational r2) 函數,可用來比較分數 r1 與 r2 的大小 ,並回傳較大者。compare() 請用類別函數來撰寫
ans
在class CRational 裡面設立類別函數
public CRational compare(CRational r1,CRational r2)//回傳
{
if(r1.n/r1.d>r2.n/r2.d)
return r1;
else
return r2;//2/5<3/7,r2傳到show()
}
底下的主要類別函數
ccc=aaa.compare(aaa, bbb);//在上面類別回傳函數裡面 this=r1=aaa r=r2=bbb
show(ccc);
//印出
3/7
全部碼---------------------------------------------
class CRational // 分數類別
{
public int n;
public int d;
public void setND(int num,int den)
{
n=num;
d=den;
}
public CRational add(CRational r)
{
display(this,r,'+');
CRational obj=new CRational();
obj.n=this.n*r.d+this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational sub(CRational r)
{
display(this,r,'-');
CRational obj=new CRational();
obj.n=this.n*r.d-this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational mul(CRational r)
{
display(this,r,'*');
CRational obj=new CRational();
obj.n=this.n*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational div(CRational r)
{
display(this,r,'/');
CRational obj=new CRational();
obj.n=this.n*r.d;
obj.d=this.d*r.n;
return obj;
}
public void display(CRational r1,CRational r2,char ch) // 顯示分數
{
System.out.print("(");
System.out.print(r1.n+"/"+r1.d);
System.out.print(")");
System.out.print(ch);
System.out.print("(");
System.out.print(r2.n+"/"+r2.d);
System.out.print(")=");
}
public CRational compare(CRational r1,CRational r2)
{
if(r1.n/r1.d>r2.n/r2.d)
return r1;
else
return r2;//2/5<3/7,r2傳到show()
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
CRational bbb=new CRational();
CRational ccc;
aaa.setND(2,5);
bbb.setND(3,7);
ccc=aaa.add(bbb); // 加法
show(ccc);
ccc=aaa.sub(bbb); // 減法
show(ccc);
ccc=aaa.mul(bbb); // 乘法
show(ccc);
ccc=aaa.div(bbb); // 除法
show(ccc);
ccc=aaa.compare(aaa, bbb);
show(ccc);
}
public static void show(CRational obj) // 顯示分數
{
System.out.println(obj.n+"/"+obj.d);
}
}
結束----------------------------------------
13. 接續習題 10,試於 CRational 類別中撰寫 large(CRational r) 函數,用來判別呼叫 larger()的 CRational 物件的質是否大於r ,若是則傳回 true,否則傳回 false。
ans
public boolean larger(CRational r)
{
if(r.n/r.d<0)
return false;
else
return true;
}
在主函數中 main
boolean ft;
ft=aaa.larger(bbb);
System.out.print(ft);
//印出 true;
原始碼
class CRational // 分數類別
{
public int n;
public int d;
public void setND(int num,int den)
{
n=num;
d=den;
}
public CRational add(CRational r)
{
display(this,r,'+');
CRational obj=new CRational();
obj.n=this.n*r.d+this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational sub(CRational r)
{
display(this,r,'-');
CRational obj=new CRational();
obj.n=this.n*r.d-this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational mul(CRational r)
{
display(this,r,'*');
CRational obj=new CRational();
obj.n=this.n*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational div(CRational r)
{
display(this,r,'/');
CRational obj=new CRational();
obj.n=this.n*r.d;
obj.d=this.d*r.n;
return obj;
}
public void display(CRational r1,CRational r2,char ch) // 顯示分數
{
System.out.print("(");
System.out.print(r1.n+"/"+r1.d);
System.out.print(")");
System.out.print(ch);
System.out.print("(");
System.out.print(r2.n+"/"+r2.d);
System.out.print(")=");
}
public CRational compare(CRational r1,CRational r2)
{
if(r1.n/r1.d>r2.n/r2.d)
return r1;
else
return r2;//2/5<3/7,r2傳到show()
}
public boolean larger(CRational r)
{
if(r.n/r.d<0)
return false;
else
return true;
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
CRational bbb=new CRational();
CRational ccc;
boolean ft;
aaa.setND(2,5);
bbb.setND(3,7);
ccc=aaa.add(bbb); // 加法
show(ccc);
ccc=aaa.sub(bbb); // 減法
show(ccc);
ccc=aaa.mul(bbb); // 乘法
show(ccc);
ccc=aaa.div(bbb); // 除法
show(ccc);
ccc=aaa.compare(aaa, bbb);
show(ccc);
ft=aaa.larger(bbb);
System.out.print(ft);
}
public static void show(CRational obj) // 顯示分數
{
System.out.println(obj.n+"/"+obj.d);
}
}
14.試問 app9_13 的 compare() 函數為何要設定成 static?
ans:
第11行直接將 compare() 宣告成 static ,以方便直接由 CCircle 類別來呼叫,而不需透過物件。
15.試修改 app9_13 的,加入 average(CCircle c[]) 函數,用來傳回 CCircle 物件陣列裡所有 radius 成員平均值。
ans
class CCircle // 定義類別CCircle
{
private static double pi=3.14;
private double radius;
public CCircle(double r)
{
radius=r;
}
public static double compare(CCircle c[]) // compare() method
{
double max=0.0;
for(int i=0;i<c.length;i++)
if(c[i].radius>max)
max=c[i].radius;
return max;
}
public static double average(CCircle c[])
{
double avg = 0;
for(int i=0;i<c.length;i++)
avg+=c[i].radius;
avg=avg/c.length;
return avg;
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir[];
cir=new CCircle[3];
cir[0]=new CCircle(1.0);
cir[1]=new CCircle(4.0);
cir[2]=new CCircle(2.0);
System.out.println("Largest radius = "+CCircle.compare(cir));
System.out.println("avgerage radius="+CCircle.average(cir));
}
}
16. 試將 app9_12 改為利用for 迴圈來輸入資料,cir[0] 傳入 0 cir[1] 傳入1 cir[2] 傳入2,依此類推,一直到 cir[5],最後並列印出輸入的結果與每一個物件的面積。
ans
class CCircle // 定義類別CCircle
{
private static double pi=3.14;
private double radius;
public CCircle(double r) // CCircle建構元
{
radius=r;
}
public void show()
{
System.out.println("area="+pi*radius*radius);
System.out.println("radius="+radius);
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir[];
cir=new CCircle[6];
for(int i=0;i<cir.length;i++)
{
cir[i]=new CCircle(i);//cir[i]=i 原本我想的,不知道new CCircle(i)是物件又或其他
cir[i].show();
}
cir[0]=new CCircle(1.0);
cir[1]=new CCircle(4.0);
cir[2]=new CCircle(2.0);
cir[0].show(); // 利用物件cir[0]呼叫show() method
cir[1].show(); // 利用物件cir[1]呼叫show() method
cir[2].show(); // 利用物件cir[2]呼叫show() method
}
}
9.5內部類別
17. 假設 Namecard 類別的部分如定義如下:
class Namecard
{
private String name;
private String address;
private phone data;
}
(a) 其中 Phone 為類別型態,有 company cell兩個資料成員,皆為 String 型態。試將 Phone 類別加入 Namecard 類別,成為巢狀類別。
(b) 請設計一個 Phone 類別的建構元 Phone(String s1,String s2),用來設定 company 為 s1 cell 為s2
(c) 試撰寫一個 show() 函數,用來列印 Namecard 類別裡所有成員的資料。
(d) 請在 main() 函數裡加入下面的敘述:
Namecard first=new Namecard ("Andy","123City","2345-6789","0911*336600");
first.show();
使得程式執行的結果如下 :
好友姓名: Andy
聯絡地址:123City
公司電話:2345-6789
手機號碼:0911-336600
13. 接續習題 10,試於 CRational 類別中撰寫 large(CRational r) 函數,用來判別呼叫 larger()的 CRational 物件的質是否大於r ,若是則傳回 true,否則傳回 false。
ans
public boolean larger(CRational r)
{
if(r.n/r.d<0)
return false;
else
return true;
}
在主函數中 main
boolean ft;
ft=aaa.larger(bbb);
System.out.print(ft);
//印出 true;
原始碼
class CRational // 分數類別
{
public int n;
public int d;
public void setND(int num,int den)
{
n=num;
d=den;
}
public CRational add(CRational r)
{
display(this,r,'+');
CRational obj=new CRational();
obj.n=this.n*r.d+this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational sub(CRational r)
{
display(this,r,'-');
CRational obj=new CRational();
obj.n=this.n*r.d-this.d*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational mul(CRational r)
{
display(this,r,'*');
CRational obj=new CRational();
obj.n=this.n*r.n;
obj.d=this.d*r.d;
return obj;
}
public CRational div(CRational r)
{
display(this,r,'/');
CRational obj=new CRational();
obj.n=this.n*r.d;
obj.d=this.d*r.n;
return obj;
}
public void display(CRational r1,CRational r2,char ch) // 顯示分數
{
System.out.print("(");
System.out.print(r1.n+"/"+r1.d);
System.out.print(")");
System.out.print(ch);
System.out.print("(");
System.out.print(r2.n+"/"+r2.d);
System.out.print(")=");
}
public CRational compare(CRational r1,CRational r2)
{
if(r1.n/r1.d>r2.n/r2.d)
return r1;
else
return r2;//2/5<3/7,r2傳到show()
}
public boolean larger(CRational r)
{
if(r.n/r.d<0)
return false;
else
return true;
}
}
public class eel
{
public static void main(String args[])
{
CRational aaa=new CRational();
CRational bbb=new CRational();
CRational ccc;
boolean ft;
aaa.setND(2,5);
bbb.setND(3,7);
ccc=aaa.add(bbb); // 加法
show(ccc);
ccc=aaa.sub(bbb); // 減法
show(ccc);
ccc=aaa.mul(bbb); // 乘法
show(ccc);
ccc=aaa.div(bbb); // 除法
show(ccc);
ccc=aaa.compare(aaa, bbb);
show(ccc);
ft=aaa.larger(bbb);
System.out.print(ft);
}
public static void show(CRational obj) // 顯示分數
{
System.out.println(obj.n+"/"+obj.d);
}
}
14.試問 app9_13 的 compare() 函數為何要設定成 static?
ans:
第11行直接將 compare() 宣告成 static ,以方便直接由 CCircle 類別來呼叫,而不需透過物件。
15.試修改 app9_13 的,加入 average(CCircle c[]) 函數,用來傳回 CCircle 物件陣列裡所有 radius 成員平均值。
ans
class CCircle // 定義類別CCircle
{
private static double pi=3.14;
private double radius;
public CCircle(double r)
{
radius=r;
}
public static double compare(CCircle c[]) // compare() method
{
double max=0.0;
for(int i=0;i<c.length;i++)
if(c[i].radius>max)
max=c[i].radius;
return max;
}
public static double average(CCircle c[])
{
double avg = 0;
for(int i=0;i<c.length;i++)
avg+=c[i].radius;
avg=avg/c.length;
return avg;
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir[];
cir=new CCircle[3];
cir[0]=new CCircle(1.0);
cir[1]=new CCircle(4.0);
cir[2]=new CCircle(2.0);
System.out.println("Largest radius = "+CCircle.compare(cir));
System.out.println("avgerage radius="+CCircle.average(cir));
}
}
16. 試將 app9_12 改為利用for 迴圈來輸入資料,cir[0] 傳入 0 cir[1] 傳入1 cir[2] 傳入2,依此類推,一直到 cir[5],最後並列印出輸入的結果與每一個物件的面積。
ans
class CCircle // 定義類別CCircle
{
private static double pi=3.14;
private double radius;
public CCircle(double r) // CCircle建構元
{
radius=r;
}
public void show()
{
System.out.println("area="+pi*radius*radius);
System.out.println("radius="+radius);
}
}
public class eel
{
public static void main(String args[])
{
CCircle cir[];
cir=new CCircle[6];
for(int i=0;i<cir.length;i++)
{
cir[i]=new CCircle(i);//cir[i]=i 原本我想的,不知道new CCircle(i)是物件又或其他
cir[i].show();
}
cir[0]=new CCircle(1.0);
cir[1]=new CCircle(4.0);
cir[2]=new CCircle(2.0);
cir[0].show(); // 利用物件cir[0]呼叫show() method
cir[1].show(); // 利用物件cir[1]呼叫show() method
cir[2].show(); // 利用物件cir[2]呼叫show() method
}
}
9.5內部類別
17. 假設 Namecard 類別的部分如定義如下:
class Namecard
{
private String name;
private String address;
private phone data;
}
(a) 其中 Phone 為類別型態,有 company cell兩個資料成員,皆為 String 型態。試將 Phone 類別加入 Namecard 類別,成為巢狀類別。
(b) 請設計一個 Phone 類別的建構元 Phone(String s1,String s2),用來設定 company 為 s1 cell 為s2
(c) 試撰寫一個 show() 函數,用來列印 Namecard 類別裡所有成員的資料。
(d) 請在 main() 函數裡加入下面的敘述:
Namecard first=new Namecard ("Andy","123City","2345-6789","0911*336600");
first.show();
使得程式執行的結果如下 :
好友姓名: Andy
聯絡地址:123City
公司電話:2345-6789
手機號碼:0911-336600