none
關於介面與氣泡排序法疑問 RRS feed

  • 問題

  • namespace ConsoleInterface3
    {
         // 定義IMyComparable介面
         public interface IMyComparable
         { 
             // 宣告IMyComparable介面的MyCompareTo方法
             int MyCompareTo(object obj);  
         }
    
         class MyArray
         {
             public static void MySort(IMyComparable[] obj)
             {
                 // 使用汽泡排序法來排序陣列
                 for (int i = 0; i <= obj.Length - 2; i++)
                 {
                     for (int j = i + 1; j <= obj.Length - 1; j++)
                     {
                         // 如果 obj[j] 比 obj[i] 小的話就交換
                         if (obj[j].MyCompareTo(obj[i]) < 0)
                         {
                             // 進行兩數交換
                             IMyComparable tmp = obj[j];
                             obj[j] = obj[i];
                             obj[i] = tmp;
                         }
                     }
                 }
             }
         }
         // 定義一個使用 IMyComparable 介面的類別 Vector
         class Vector : IMyComparable
         {
             public int X { get; set; }  	// 定義X屬性
             public int Y { get; set; }   	// 定義Y屬性
     
             public Vector()
             {
                 X = 0;
                 Y = 0;
             }
     
             public Vector(int vX, int vY)
             {
                 X = vX;
                 Y = vY;
             }
     
             public void Show()			// 用來顯示向量座標 (X,Y)
             {
                 Console.Write("({0},{1})  ", X, Y);
             }
     
             // 實作出IMyComparable介面中的MyCompareTo方法
             int IMyComparable.MyCompareTo(object obj)
             {
                 Vector v = (Vector)obj;
                 return (X * X + Y * Y) - (v.X * v.X + v.Y * v.Y);
             }
         }
    
        class Program
        {
            static void Main(string[] args)
            {
                 // 建立一個內含五個向量的陣列物件vecArray       
                 Vector[] vecArray = {
                    new Vector(20, 10),
     				new Vector(50, 20),
     				new Vector(90, 40),
     				new Vector(10, 10),
     				new Vector(40, 30) };
                 Console.WriteLine("排序前 ...");
                 for (int i = 0; i <= vecArray.GetUpperBound(0); i++)
                 {
                     vecArray[i].Show();
                 }
                 Console.WriteLine();
                 Console.WriteLine();
     
                 MyArray.MySort(vecArray);     //呼叫 System.Array 類別的 Sort 方法
     
                 Console.WriteLine("排序後 ...");
                 for (int i = 0; i <= vecArray.GetUpperBound(0); i++)
                 {
                     vecArray[i].Show();
                 }
                 Console.Read();
            }
        }
    }

    Q1  : 關於 public static void MySort(IMyComparable[] obj)   這段程式碼 , 它的參數怎麼是用IMyComparable[]obj  ? 這樣它的型別是IMyComparable 名稱為 obj 的陣列嗎 ? 介面可以這樣拿來當參數型別嗎 ?

    Q2 : 氣泡排序法規定是外迴圈比內迴圈的計算次數多 1 次嗎 ? obj[i] 與 obj[j] 原本代表的涵義為何 ? 兩者有何關聯 ? 為何外圈是用  obj.Length-2  , 而內圈是用 obj.Length -1 ?

           

    Q3  : 在比較完兩數做順序交換時 ,為何要建立 IMyComparable tmp = obj[j] ; 不能直接用 tmp = obj[j] 嗎 ?

    請知道的大大替我解說一下 , 謝謝



    • 已編輯 阿燦 2015年11月13日 上午 07:24
    2015年11月12日 上午 11:23

解答

  • 氣泡排序

    選擇排序

    程式是選擇排序而不是氣泡排序?

    因為tmp要宣告和obj[j]相同的變數型態,才能存取數值...

    • 已標示為解答 阿燦 2015年11月14日 上午 11:58
    2015年11月13日 上午 08:53
  • .Net Framework 型別大致這樣看

    實值型別 : struct , enum

    參考型別 : class, interface, delegate

    其實方法參數可以被視為是變數宣告 ,只是可以從呼叫者傳進來, C# 的變數宣告表示式就是 型別 變數名稱;

    所以, 當然可以這樣用.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2015年11月13日 下午 12:49
    版主
  • 說到介面,那就要瞭解多型。瞭解多型,才能知道為什麼用IMyComparable[] obj。

    q2 / q3 可以去下中斷點觀察,以瞭解程式的執行過程。


    理直氣和,切記。

    個人

    2015年11月12日 下午 02:11

所有回覆

  • 說到介面,那就要瞭解多型。瞭解多型,才能知道為什麼用IMyComparable[] obj。

    q2 / q3 可以去下中斷點觀察,以瞭解程式的執行過程。


    理直氣和,切記。

    個人

    2015年11月12日 下午 02:11
  • 我的書上是寫說

    "多型"是透過動態繫結的方式讓程式執行時可以動態決定物件參考所要執行的方法

    多型允許在程式中使用名稱相同的方法或屬性

    我的問題是之前看過的介面都是先定義 , 然後有個類別宣告使用哪個介面 , 從沒看過介面可以這樣當做方法的參數.......

    由於書本寫的不詳細 , 所以請知道的大大替我解說一下 , 謝謝

    2015年11月13日 上午 07:24
  • 從沒看過介面可以這樣當做方法的參數.......

    那麼你現在知道可以這樣用了,恭喜你經驗值又增加了。


    理直氣和,切記。

    個人

    2015年11月13日 上午 07:50
  • 氣泡排序

    選擇排序

    程式是選擇排序而不是氣泡排序?

    因為tmp要宣告和obj[j]相同的變數型態,才能存取數值...

    • 已標示為解答 阿燦 2015年11月14日 上午 11:58
    2015年11月13日 上午 08:53
  • 感謝各位大大提供資料 , 小弟再慢慢研究
    2015年11月13日 上午 11:12
  • .Net Framework 型別大致這樣看

    實值型別 : struct , enum

    參考型別 : class, interface, delegate

    其實方法參數可以被視為是變數宣告 ,只是可以從呼叫者傳進來, C# 的變數宣告表示式就是 型別 變數名稱;

    所以, 當然可以這樣用.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。



    2015年11月13日 下午 12:49
    版主