找回密碼
 註冊

JAVA程式分享(課本習題-設計一個三角形類別)

来源: 新聞 跑山的節奏 2011-11-17 18:35 只看這個作者 |閱讀模式
12 13519
本文章最後由 編輯部女孩 於 2016-5-27 15:44 編輯


題目:
設計一個三角形類別,當中包含三項公用資料如下:

      項目
名稱
封裝等級
題目要求
三角形類別
CTriangle
非public
自定的類別
最小的邊
edge1
公用
int
次小的邊
edge2
公用
int
最大的邊
edge2
公用
int

在(1)-a~d共設計四個CTriangle的方法,解說如下:

      方法
名稱
封裝等級
題目要求
建構子
CTriangle()
public
(1)-a
是否為合法之3邊
isLegal(int a,int b,int c)
private
(1)-b
建構子
CTriangle(int a,int b,int c)
public
(1)-c
畢氏定理判斷直角
isRightAngled()
public
(1)-d

(1)-a:設計一個無引數的建構子。功能為設定三個邊為3,4,5。
  (1)-b:設計一個類別方法(class method),boolean isLegal(int a,int b,int c),用以判斷a,b,c是否能夠成為三角形的邊。其中
  須符合a≦b≦c,否則回傳false。
  須符合 |另兩邊的差| < 第三邊 < 另兩邊的和,否則回傳false。
(1)-c:設計一個建構子,接受三個整數引數a,b,c,內容為利用isLegal判定輸入的引數是否可構成三角形,若無法構成,則設定三個邊為3,4,5(請呼叫(1)-a來完成),若可構成三角形,則設定a,b,c為三個邊的值。
  【hint:請注意在建構子中如何使用另一個建構子】
(1)-d:設計一個方法boolean isRightAngled(),使用畢氏定理判定是否為直角三角形。
題目(1)-e~h,皆為主類別的程式,解說如下:
(1)-e:撰寫一個產生三個亂數的主類別函式int [] makeThreeNum()。三個數存放於陣列中。
  陣列[0]之值為介於5~29的整數。
  陣列[1]之值為介於9~49的整數。
  陣列[2]之值為介於29~89的整數。
(1)-f:在main()中,建立CTriangle的物件陣列objArr,並使用迴圈呼叫10次makeThreeNum(),取得10組數
值,並利用這10組數值作為objArr[0]~objArr[9]的成員值(若不合法,則該物件之成員會自動被設定為3,4,5)。
  (1)-f:在main()中,手動修正objArr[9]的三個成員值為(20,21,29)。
  (1)-h:在main()函式中,印出物件陣列的10個三角形的邊,並判斷是否為直角三角形。
(2) 將上一題的資料項目edge1,edge2,edge3全部改為私用,會產生無法編譯的狀況,請修正為可編譯的狀況(您可能需要新增某些功用的方法)

  1. 我寫的解答:
  2. class CTriangle {
  3.    
  4.     private int edge1, edge2, edge3;
  5.     //基本上應該是set.get都要有,不過因為沒用到set所以就沒做了
  6.     public int getEdge1() {
  7.         return edge1;
  8.     }
  9.     public int getEdge2() {
  10.         return edge2;
  11.     }
  12.     public int getEdge3() {
  13.         return edge3;
  14.     }
  15.     //預設建構子
  16.     public CTriangle() {
  17.         this.edge1 = 3;
  18.         this.edge2 = 4;
  19.         this.edge3 = 5;
  20.     }
  21.     //收三個參數的建構子
  22.     public CTriangle(int edge1, int edge2, int edge3) {
  23.         this();
  24.         if (this.isLegal(edge1, edge2, edge3)) {
  25.             this.edge1 = edge1;
  26.             this.edge2 = edge2;
  27.             this.edge3 = edge3;
  28.         }
  29.     }
  30.     //判別是否為直角三角形(兩邊平方的合等於第三邊的平方)
  31.     public boolean isRightAngled() {
  32.         if ((edge1 * edge1) + (edge2 * edge2) == (edge3 * edge3)) {
  33.             System.out.println("是直角三角形");
  34.             return true;
  35.         } else {
  36.             System.out.println("不是直角三角形");
  37.             return false;
  38.         }
  39.     }
  40.     //判別是否為合法的三角形
  41.     private boolean isLegal(int edge1, int edge2, int edge3) {
  42.         if ((edge1 <= edge2 && edge2 <= edge3) && (edge1 - edge2 < edge3 && edge3 < edge1 + edge2)) {
  43.             return true;
  44.         } else {
  45.             return false;
  46.         }
  47.     }
  48.     //這個其實是測試建構子是否正常用的,看看就好
  49.     @Override
  50.     public String toString() {
  51.         return "CTriangle{" + "edge1=" + edge1 + ", edge2=" + edge2 + ", edge3=" + edge3 + '}';
  52.     }
  53. }
  54. public class ch7_23 {
  55.     //亂數選取,要不要加static都可以,不加的話必須在main裡面初始化ch7_23
  56.     static int[] makeThreeNum() {
  57.         int edge[] = new int[3];
  58.         return edge;
  59.     }
  60.     public static void main(String[] ager) {
  61.         int[] b;
  62.         CTriangle[] objArr = new CTriangle[10];
  63.         for (int i = 0; i < objArr.length; i++) {
  64.             b = makeThreeNum();
  65.             objArr[i] = new CTriangle(b[0], b[1], b[2]);
  66.         }
  67.         objArr[9] = new CTriangle(20, 21, 29);
  68.         for (int i = 0; i < objArr.length; i++) {
  69.             System.out.print("3邊為" + "\t");
  70.             System.out.print(objArr[i].getEdge1() + "\t");
  71.             System.out.print(objArr[i].getEdge2() + "\t");
  72.             System.out.print(objArr[i].getEdge3() + "\t");
  73.             objArr[i].isRightAngled();
  74.         }
  75.     }
  76. }
複製代碼


收藏
收藏0

網友回覆12

跳到指定樓層
慢慢有物件導向的觀念了!
不過我在寫小程式不喜歡用物件導向,用以前的方法一樣亂寫就好了XD

記得OOP(物件導向)三個核心概念封裝,繼承,多載(多型)

你以前有學過程式語言還是這是第一次學?讀哪個大學?(可PM說),感覺寫的還不錯。

[ 本文章最後由 hollowaysxp 於 2011-11-21 12:58 編輯 ]
本文章最後由 編輯部女孩 於 2016-5-27 15:44 編輯


這是第一次學java~
因為對語言有興趣就跑去補習~
好險老師教的不錯,上課也很活潑
我大學在正修科大,是念機械系的~不過現在沒念了!!
看看明年要不要轉系去資訊
寫程式真的會去享受那種焦頭爛額的感覺
連蹲廁所也在想JAVA程式分享(課本習題-設計一個三角形類別)8867


4#
e617073 2011-11-21 23:22 只看這個作者
本文章最後由 編輯部女孩 於 2016-5-27 15:44 編輯


邊是 edge  你都打成dege了


回覆 4# e617073 的文章

本文章最後由 編輯部女孩 於 2016-5-27 15:45 編輯


190.gif
您不說我都沒發現呢
趕快偷偷改!!!!


本文章最後由 編輯部女孩 於 2016-5-27 15:45 編輯


補習班老師該不會是JAVA界很有名的老師XD


回覆 6# hollowaysxp 的文章

本文章最後由 編輯部女孩 於 2016-5-27 15:45 編輯


經過林信良老師認可的教師
我相信也不會太差就是了JAVA程式分享(課本習題-設計一個三角形類別)8811


本文章最後由 編輯部女孩 於 2016-5-27 15:46 編輯


剛剛Google了一下,原來是良葛格,當時我們老師也有推薦他的書。
但我們當時SCJP證照的教材書是段維瀚,這個老師也很有名。
你可以寫一個找出輸入一個數字(N),然後把1~N中的質數都找出來?
且要有效能,輸入999999999999時,程式可以很快的跑完,你可以試試看。
本文章最後由 編輯部女孩 於 2016-5-27 15:46 編輯


剛剛Google了一下,原來是良葛格,當時我們老師也有推薦他的書。
但我們當時SCJP證照的教材書是段維瀚,這個老師也很有名。
你可以寫一個找出輸入一個數字(N),然後把1~N中的質數都找出來?
且要有效能,輸入999999999999時,程式可以很快的跑完,你可以試試看。 [/quote]
用起來好慢.......
我的方法是從質數的倍數下去篩選
大大還有甚麼好方法嗎??

  1. public class NewMain {
  2.     public static void main(String[] args) {
  3.         Integer[] arr = new Integer[99999999];
  4.         Arrays.fill(arr, 0);
  5.         for (int i = 2; i * i <= 99999999; i++) {
  6.             if (arr[i] == 0) {
  7.                 for (int j = 2 * i; j < 99999999; j++) {
  8.                     if (j % i == 0) {
  9.                         arr[j] = 1;
  10.                     }
  11.                 }
  12.             }
  13.         }
  14.         for (int i = 2; i < 99999999; i++) {
  15.             if (arr[i] != 1) {
  16.                 arr[i] = i;
  17.                 System.out.println(i);
  18.             }
  19.         }
  20.     }
  21. }
複製代碼


本文章最後由 編輯部女孩 於 2016-5-27 15:46 編輯


這個重點就是考演算法,簡單的程式如何有效率的運作。
第一個耗費大量的記憶體就是不對了,尤其是大量的陣列使用。(雖然記憶體和CPU現在都很便宜了)
再來就是運算的時間,中間程式碼。
程式碼不是越短越好。
程式碼是能以迴圈次數越少越好。效率才會高。
要兩個for迴圈...不過效率是重點
例如1+2+3+....+99999999的程式有兩種寫法,一種是學for用到的,另一種就是另一種數學演算法一秒算出答案,你也可以嘗試看看。