2017年4月28日 星期五

認識類別 ch8

8.1 認識類別

1.設類別Caaa的定義為:

class Caaa
{
  int a;
  int b;
  int c;
}
試在程式碼裡完成下列各敘述:
(a) 試在main()函數裡建立一個Caaa類別型態的物件obj;
(b)將obj資料成員a的值設為5,b的值設為3。
(c)計算a*b之後設給成員c。
(d)印出a b 與c的值。

ans

class Caaa
{
int a;
int b;
int c;
}

public class eel
{
public static void main(String args[])
{
Caaa obj;
obj= new Caaa();
obj.a=5;
obj.b=3;
obj.c=obj.a*obj.b;

System.out.print("a="+obj.a+" "+"b="+obj.b+" "+"c="+obj.c);
}
}


2.設類別Cbbb的定義為:
class Cbbb
{
  double x;
  double y;
}
試在程式碼裡完成下列各敘述 :
(a)試在main() 函數裡建立Cbbb 類別型態的物件obj1 obj2與avg
(b)將 obj1 資料成員x的值設為5.2,y的值設為3.9。
(c)將 obj2 資料成員x的直設為6.5,y的值設為4.6。
(d)將 obj1 與 obj2的x的值平均後,指定給avg的x存放。
(e)將 obj1 與 obj2的y的值平均後,指定給avg的y存放。
(f)印出obj1 obj2與avg的值

ans
class Cbbb
{
double x;
double y;
}

public class eel
{
public static void main(String args[])
{
Cbbb obj1,obj2;
obj1=new Cbbb();
obj2=new Cbbb();
Cbbb avg = new Cbbb();
obj1.x=5.2;
obj1.y=3.9;
obj2.x=6.5;
obj2.y=4.6;
avg.x=(obj1.x+obj2.x)/2;
avg.y=(obj1.y+obj2.y)/2;

System.out.println("obj1="+obj1);
System.out.println("obj2="+obj2);
System.out.println("avg="+avg);

}
}

印出
obj1=Cbbb@15db9742
obj2=Cbbb@6d06d69c
avg=Cbbb@7852e922

3. 設類別Cddd的定義為:

class Cddd
{
  Strring name;
  double height;
  double weight;
}

(a) 試在main() 函數裡建立Cddd 類別型態的物件 student。
(b) 將student資料成員name設質為"Sandy",height的值設為165.5(單位為公分),
weight的值設為58.2(單位為公斤)。
(c)利用BMI=weight(kg)/height^2(M)計算此學生的身體質量指數BMI值。
(d)印出student 的資料及BMI值。

ans

class Cddd
{
  String name;
  double height;
  double weight;
}

public class eel
{


public static void main(String args[])
{
Cddd student;
student=new Cddd();
student.name = "Sandy";
student.height = 1.655;
student.weight = 58.2;

double BMI;
BMI=student.weight/(student.height*student.height);
System.out.println("student "+student.name+"  H="+student.height+"  w="+student.weight);
System.out.println("BMI="+BMI);

}
}

印出
student Sandy  H=1.655  w=58.2
BMI=21.248436943802993

4.請在下面的程式中填上適當的程式碼,使得物件box的length成員可被設為15,width成員可被設為10,height=25。

// hw8_4, 類別的練習
class CBox
{
  int length;
  int width;
  int height;
}
public class hw8_4
{
   public static void main(String arge[])
   {
      CBox box;
      box=new CBox();
   
//請於此處填上程式碼
      box.length=15;
      box.width=10;
      box.heigh=25;
   
      System.out.println("length= "+box.length);
      System.out.println("width= "+box.width);
      System.out.println("height="+ box.heigh);
  }
}

5.假設我們要設計一個Cbox類別,用來表示立體的箱子(box)。此類別內含長(length) 寬(width) 與高(height) 三個資料成員,其類別程式碼的撰寫如下:

class Cbox
{
   int length;
   int width;
   int height;
}
(a)試在main()函數裡,以Cbox類別建立一個box物件,並將其length width height 三個資料成員的值均設為1。
(b)試在Cbox類別裡,定義volume() 函數,用來傳回box物件的體積。
(c)試在Cbox類別裡,定義surfaceArea()函數,用來傳回box物件的表面積。
(d)試在Cbox類別裡,加入showData() 函數,用來顯示box物件length width height 三個資料成員的值
(e)試在Cbox類別裡,加入showAll() 函數,用來顯示box物件length width height 三個資料成員的值,以及其表面積與體積。

ans
class Cbox
{
   int length;
   int width;
   int height;
   void volume()
   {
    System.out.println("volume="+length*width*height);
   }
   void surfaceArea()
   {
    System.out.println("surfaceArea="+(length+width+height));
   }
   void showData()
   {
  System.out.println("length="+length);
  System.out.println("width="+width);
  System.out.println("height="+height);
   }
   void showAll()
   {
  showData();
  surfaceArea();
  volume();
   }
 
}


public class eel
{

public static void main(String args[])
{
Cbox box=new Cbox();
box.length=1;
box.width=1;
box.height=1;
box.showAll();
}

}

//印出

length=1
width=1
height=1
surfaceArea=3
volume=1

6.假設我們要設計一個圓形類別CCircle。此類別內涵圓周率(pi)與半徑(radius)二個資料成員,以及show_periphery()函數成員,用來計算並列印圓周長,其類別程式碼的撰寫如下:

class CCircle
{
  double pi3.14;
  double radius;

  viod show_periphery()
 {
   system.out.println("periphery="+2*pi*radius);
 }
}
試在程式碼裡面完成下列各敘述:
(a) 試在main() 函數裡建立一個 CCircle 類別型態的物件 cir1。
(b)在 main() 函數裡將cir1 資料成員的值設為3.0。
(c)利用關鍵字 this 修改CCircle 類別裡的函數成員。
(d)在 main() 函數裡呼叫 show_periphery() 函數。

ans
class CCircle
{
  double pi=3.14;
   double radius;

  void show_periphery()
 {
   System.out.println("periphery="+2*pi*this.radius);
   //this 是物件cirl1 因為不能cirl.show...() 無法直接拿到類別來
 }
}
public class eel
{

 public static void main(String args[])
 {
CCircle cirl1=new CCircle();
cirl1.radius=3.0;
cirl1.show_periphery();

 }

}

印出
periphery=18.84

7.試設計一類別 CTest,內含-test() 函數,可以用來判別傳入的值奇數還是偶數,如果為奇數則列印出"此數為奇數",反之若為偶數則印出"此為偶數";若輸入的數為0,則印出"此數為0"。請利用test(),判斷3  8與0各為何數。

ans

class CTest
{
   int x;
void test(int x)
{
  if(x%2==1) System.out.println("此數為奇數"); else if (x==0) System.out.println("此數為0"); else System.out.println("此數為奇數");


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

CTest ss=new CTest();
System.out.println("test(0)");
ss.test(0);
System.out.println("test(3)");
ss.test(3);
System.out.println("test(8)");
ss.test(8);
}
}

8.試設計一類別 CTest,內含-test()函數,可以用來判別傳入的值是否大於0,如果大於0則吟出"此數為正數",反之若為小於0的數則印出"此數為負數"; 若輸入的數為0,則印出"此數為0"。請利用test(),判斷-4  8與0各為何數。

ans

class CTest
{
   int x;
void test(int x)
{
if(x>0)
System.out.println("此數為正數");
else if (x==0)
System.out.println("此數為0");
else
System.out.println("此數為負數");


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

CTest ss=new CTest();
System.out.println("test(0)");
ss.test(0);
System.out.println("test(-4)");
ss.test(-4);
System.out.println("test(8)");
ss.test(8);
}
}

印出
test(0)
此數為0
test(-4)
此數為負數
test(8)
此數為正數

9.試設計一個CCalculator類別,資料成員包括a b 及c,型態為int。請建立該類別的物件obj,並完成下列的各函數的程式設計:

(a)定義set_value(int x,int y,int z)函數,用來設定資料成員之值,將x設值為25,y設值為3,z設值為7。
(b)定義show() 函數,可用來列印所有資料成員。
(c)定義add()函數,可用來傳回三數之和。
(d)定義sub() 函數,可用來傳回a-b-c之值。
(e)定義mul()函數,可用來傳回三數之乘積。
(f)定義avg() 函數,可用來傳回三數之平均值,傳回值型態請設為double。

class CCalculator
{
   int a;
   int b;
   int c;
   void set_value(int x,int y,int z)
   {
  x=25;//obj.set_value()裡面是000預設值,是在main裡輸入的
  y=3;
  z=7;
   }
   void show()
   {
 System.out.print(a+" "+b+" "+c);
   }
    int add()
   {
  return a+b+c;
   }
    int sub()
    {
    return a-b-c;
    }
    int mul()
    {
    return a*b*c;
    }
    int avg()
    {
    return (a+b+c)/3;
    }
}
public class eel
{
public static void main(String args[])
{
      CCalculator obj=new CCalculator();  
obj.a=25; obj.b=3; obj.c=7;
      obj.show();
obj.add();


}

}

10.在定義setCircle() 函數的多載時,下列兩行setCircle()的多載是否正確?為什麼?
void setCircle(double radius);
int setCircle(double radius);

ans
正確  用一個函數多個引述再根據引數的資料型態不同來設計不同功能。

11.試問在列哪一個選項可以呼叫 void set(int r)這個函數?
(a) set("hello");
(b)set(50);
(c)set(10,25);
(d)set(3.14);

ans
b 引述int

12.假設我們要設計一個CWin類別,用來表示一個視窗(window)的基本外觀。此類別內含寬(width) 高(height)與名稱(name)三個資料成員,部分程式碼撰寫如下:

//hw8_12, 視窗類別
class CWin
{
  int width;
  int height;
  String name;
 
  void setWindows(int w,int h)
    {
 width=w;
 height=h;
    }
  void setWindows(int w,int h,String s)
  {
 width=w;
 height=h;
 name=s;
  }

  void setW(int w)  //設定寬度的函數
     {
          //請在此處填上程式碼
         width=w;
     }
   void setH(int h) //設定高度的函數
    {
         //請在此處填上程式碼
    height=h;
    }
   void setName(String s)  //設定視窗名稱的函數
   {
       name=s;
   }

   public void show()
  {
     System.out.println("Name="+name);
     System.out.println("W="+width+", H="+height);
  }
}
   public class eel
{
      public static void main (String args[])
      {
         CWin cw=new CWin();
         cw.setName("My Window");
         cw.setW(5);
         cw.setH(3);
         cw.show();
      }
}

(a)於上面的程式碼中,SetW()與Set H() 兩個函數並沒有填上程式碼。試將他們完成,使得它們可以用來設定CWin物件的width與height成員的值。
(b)試加入setWindow(int w,int h)函數,使得它可以同時設定Cwin物件的width與height。
(c)接續上題,請多載setWindow() 函數,使得他可以同時設定CWin物件的width height 與name 三個資料成員。

13. 設有一CCircle類別,可用來表示一個圓形。此類別內含三個多載的函數成員,用來計算圓面積。試在程式碼裡完成下列各敘述:

(a) 試加入 area(double r) 函數,使得它計算 CCircle 物件的面積,其傳回值型態為double。
(b) 請多載area(float r) 函數,使得它計算 CCircle物件的面積,其傳回值型態為float。
(c) 請多載area(int r)函數,使得它計算CCircle物件的面積,其傳回值型態為double。
(d) 請於main()中分別呼叫 area(2) area(2.2f)與 area(2.2),並印出傳回值。

ans

class CCircle
{
double area;
double area(double r)
{
area=r*r*3.14;
return (double)area;
}
float area(float r)
{
area=r*r*3.14;
return (float) area;
}
int area(int r)
{
area=r*r*3.14;
return (int) area;
}
public void show()
{
System.out.println("area="+area);
}

}

   public class eel
{
      public static void main (String args[])
      {
         CCircle a=new CCircle();
         a.area(2);
         a.show();//必須將show逐行插入才能三列印,無法一次列印
         a.area(2.2f);
         a.show();
         a.area(2.2);
         a.show();
      }
}

//印出
area=12.56
area=15.197600479125978
area=15.197600000000003

14.於app8_6中,如果把pi與radius資料成員的屬性設為private,怎編譯時是否會得到錯誤訊息?如果會,是指出其錯誤所在。

ans
程式請參考 hw8_13.java。編譯後的錯誤訊息為 radius has private access in CCircle。由於 pi 及 radius 的屬性設為private,因此不能從 CCircle 以外的類別中呼叫。
01 // hw8_13
02 class CCircle
03 {
04 private double pi=3.14;
05 private double radius;
06
07 void show_area()
08 {
09 System.out.println("area="+pi*radius*radius);
10 }
11 void show_all()
12 {
13 System.out.println("radius="+radius);
14 show_area();
15 }
16 }
17 public class hw8_13
18 {
19 public static void main(String args[])
20 {
21 CCircle cir1=new CCircle();
22
23 cir1.radius=2.0;
24 cir1.show_all();
25 }
26 }
/* output------------------------------
radius has private access in CCircle
 --------------------------------------*/

15.在app8_14中,在main() 函數裡是否可以利用cir1物件來呼叫定義在7~10行的area()函數?為什麼?

ans
不行,因為修飾子是private 僅能透過公開成員setRadius(),私有成員radius才得以修改,(似乎只有類別公開成員才能修改私有成員。

class CCircle              // 定義類別CCircle
{
   private double pi=3.14;       // 將資料成員設定為private
   private double radius;

   private double area()      // 定義私有的成員函數area()
   {
       return pi*radius*radius;
   }
   public void show_area()    // 定義公有的成員函數show_area()
   {
       System.out.println("area="+ area());  // 呼叫私有成員area()
   }
   public void setRadius(double r)  // 定義公有的成員函數setRadius()
   {
       if(r>0)
       {
          radius=r;           // 將私有成員radius設為r
          System.out.println("radius="+radius);
       }
       else
          System.out.println("input error");
   }
}

public class eel
{
   public static void main(String args[])
   {
       CCircle cir1=new CCircle();
       cir1.setRadius(-2.0);  // 呼叫公有的setRadius() method
       cir1.show_area();         // 呼叫公有的show_area() method
   }
}


16.設有-CSphere類別,可用來表示一個圓球。此類別內含x,y,z三個資料成員,用來代表圓心的位置,此外有-radius資料成員,代表圓球的半徑。其部分程式碼的撰寫如下:

  class CSphere
{
   private int x;   //圓心的x座標
   private int y;   //圓心的y座標
   private int z;   //圓心的z座標
   private int radius;   //圓心的半徑
}

(a) 試在CSphere類別裡加入setLocation()函數,用來設定圓球之圓心的位置。請將圓心未設定為(3,4,5)。
(b)在CSphere類別裡加入setRadius()函數,用來設定圓球之半徑。請設定半徑為1。
(c)在CSphere類別裡加入surfaceArea()函數,用來傳回CSphere物件的表面積。
(d)在CSphere類別裡加入volume()函數,用來傳回CSphere物件的體積。
(e)在CSphere類別裡加入showCenter()函數,用來顯示CSphere物件之圓心座標。

ans

  class CSphere
{
   private int x;   //圓心的x座標
   private int y;   //圓心的y座標
   private int z;   //圓心的z座標
   private int radius;   //圓心的半徑

    void setLocation(int i, int j, int k)
   {
  x=i;                // int x=i 等於在宣告一個x變數 底下印出來的數字是預設值0 故不能有int  (int x是引數勿忘)
  y=j;
  z = k;
   }
   void setRadius(int r)
   {
  radius=r;
   }
   double surfaceArea()
   {
  return (double)4*3.1416*radius*radius;
   }
   double volume()
   {
  return ((double)3.1416*radius*radius);
 
   }
   void showCenter()
   {
  System.out.println("Circle center"+"x="+x+" "+"y="+y+" "+"z="+z+" "+"radius="+radius);
   }
}
 
 
  public class eel
  {
 public static void main(String args[])
 {
CSphere cs=new CSphere();
cs.setLocation(3,4,5);
cs.setRadius(1);
System.out.println("surface area="+cs.surfaceArea());
cs.showCenter();
//印不出radius 因為private r也是
 }
  }

印出
surface area=12.5664
Circle centerx=3 y=4 z=5 radius=1


17.在習題16中,如果把CSphere類別裡的資料成員之屬性改成public,則對程式的撰寫有何影響? 如此做,對程式的設計有何好處或壞處?

ans
如果屬性改public便可以在 public static void main(String args[])直接以cs.radius設定變數值,如同紅色字提示。如果沒寫public的話,則該成員只能在同一個類別庫裡面被儲存。反之,有的話便可以被其他類別庫所存取。缺點是容易造成錯誤值輸入8-35。

沒有留言:

張貼留言