2021年12月20日 星期一

橙舍咖啡 TW COFFEE 二館

 位於台北漢口街的青年旅館。

今天是平日時段

價格約四百元的膠囊床位



衛浴 廁所 公共空間均自助使用

並未有人管理。

進門就看間小偷公告。

隔壁床位包月大哥也提醒財物不離身。

因為已經發生竊案數次

此外,衛生方面不好

床的舒適度欠佳

空氣也不流通

除了便利與價格外,其他是令人失望

與Agoda 評分8.0有些反差

如果再給我決定一次,我願意加錢換其他旅舍。




2020年12月28日 星期一

空腹熊貓:假日餐期為什麼總是接到遠單?

 先說結論,假日餐期偏遠地區用戶會擴大服務範圍,你自然容易接到遠單。


準備好餐期上線了嗎?





餐期每單加xx元,比平常60元一單多但...
收到偏遠訂單怎麼這麼多?
而且沒有而外距離加乘的最遠訂單。

順帶一提,我家住在XX山莊剛好是上述的情況。

身為用戶的立場,打開app想點餐但餐廳卻寥寥無幾。

早上只有兩間餐廳,午餐餐期卻又冒出一堆餐廳。

為什麼呢?

影響我家餐廳多寡(app上線營業)的因素有幾個:
  • 店家可自行關閉
  • 在線外送員多寡
  • 天氣變化(下雨)
  • 熊貓車控中心自行調整(可能是派單吧)

除了店家自行關閉外其他都是熊貓掌握的。

從我的外送員的經驗來看,也的確穩合。(汐止區,ex馥記、伯爵、水蓮...)

直白的說,因爲餐期有加錢所以外送員多,熊貓自然會開放偏遠地區點餐。

因此假日餐期會接到遠單就是種很大的幾率了。

假日餐期上線賺的是不是比較多,還真的不知道呢。

2020年11月20日 星期五

民法總則台大開放課程

 看完第一節與第二節課心得


第一節的印象大概是講區分公法與私法

1.利益分

2.歸屬

3.主體

4.新主體

先說為何要區分?目前除了普通法院(管轄民刑案件),跑錯法院可會不受理你的案件。

接著說,以上4種區分方法不重要,最後實務見解只是說要綜合判斷,說穿了就是他講了算。


令人吃驚的第一條

  第 1 條 民事,法律所未規定者,依習慣;無習慣者,依法理。


結果207條 前項規定,如商業上另有習慣者,不適用之。

這時候習慣又大於法律,並且又創造一個"事實上習慣"的名詞,也就是事實上的習慣

並不完全等於習慣。

這時候通說反而有理認為第一條的習慣是用來補充法律,也就是法律優先適用。


老師又舉例,有人用民法第一條告日治時家產傳男不傳女的習慣,後來也是敗訴。

老師的解釋是法律與道德會隨時代改變,因此不能拿現在的標準衡量過去時代。

我想如果可以法院大概會被這條搞垮拔。


第二節課

行政法規是否會拘束民事法院審判?

答案是不會縱使工廠汙染合乎法規標準,但是人民有受損害能應負賠償責任。



講法律解釋方法

  • 文義解釋-子女是否包含私生子女?如果把乾兒子也算進去那就超出文義
  • 體系解釋-詭異!92條我怎麼看都只是邏輯解釋
  • 歷史解釋
  • 從立法目的解釋

法律漏洞也就是立法時沒有被規定到的範圍

    用類推(有法律規定的則叫做準用,一模一樣)舉輕已明重 舉重以明輕

    目的性限縮,參考上面的文義解釋,子女核心文義當然是親生子女,但是解釋上可以包含私生子女。但法院可以限縮在親生子女的適用範圍。

    法律實在是太會凹了,是不是法匠已經不是重點,而是法官覺得誰有理而不是真的誰有理。

    法律是保護懂法律的人,更正確一點說,法律是保護懂法官的人,所言不差。


https://www.youtube.com/watch?v=zY8Y-5LK3RQ&list=PL9_VFvon1cELhsRcQdIh4enzRYoOms6ga&index=3



2017年5月15日 星期一

CH09類別的進階認識

9.1建構元

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);
     }
  }

\\print
(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


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。