Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Sắp xếp mảng theo yêu cầu

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    50

    Talking Sắp xếp mảng theo yêu cầu

    Bài này mình sử dụng đẻ xắp sếp mảng theo một yêu cầu nào đó(tăng hoặc giảm), với một cách sáp xếp cũng theo yêu cầu người dùng(heapsort,quick sỏt,selectsort......), nhưng khi chạy mọi thằng kia điều ổn chỉ có thằng quicksort là không nhưng chả biết sai chổ nào!!!!tức quá
    C++ Code:
    1. #include<iostream.h>
    2. int *a;
    3. int n;
    4. void qs(int *a,int l,int r);
    5. void Permute(int &x,int &y);
    6. void Permute(int &x,int &y)
    7. {
    8.     int t;
    9.     t=x;
    10.     x=y;
    11.     y=t;
    12. }
    13.  
    14. void qs(int *a,int l,int r,int(*Compare)(int,int))
    15. {
    16.     int i,j;
    17.     int x;
    18.     x=a[(l+r)/2];
    19.     i=l;
    20.     j=r;
    21.     do
    22.     {
    23.         while(Compare(x,a[i])) i++;
    24.         while(Compare(a[j],x)) j--;
    25.         if(i<=j)
    26.         {
    27.             Permute(a[i],a[j]);
    28.             i++;
    29.             j--;
    30.         }
    31.     }while(i<j);
    32.     if(l<j) qs(a,l,j,Compare);
    33.     if(i<r) qs(a,i,r,Compare);
    34. }
    35.  
    36. int Increase(int x,int y)
    37. {
    38.     return x>=y;
    39. }
    40.  
    41. int Decrease(int x,int y)
    42. {
    43.     return x<=y;
    44. }
    45. class Sort
    46. {
    47. public:
    48.     void virtual sort(int(*Compare)(int,int))=0;
    49. };
    50.  
    51. class SelectSort:public Sort
    52. {
    53. public:
    54.     void sort(int(*Compare)(int,int))
    55.     {
    56.         int t;
    57.         for(int i=1;i<n;i++)
    58.         {
    59.             t=i;
    60.             for(int j=i+1;j<=n;j++)
    61.                 if(Compare(a[i],a[j]))
    62.                     t=j;
    63.                 if(t!=i) Permute(a[i],a[t]);
    64.         }
    65.     }
    66. };
    67.  
    68. class InterchangeSort:public Sort
    69. {
    70. public:
    71.     void sort(int(*Compare)(int ,int ))
    72.     {
    73.         for(int i=1;i<n;i++)
    74.             for(int j=i+1;j<=n;j++)
    75.                 if(Compare(a[i],a[j]))
    76.                     Permute(a[i],a[j]);
    77.     }
    78. };
    79.  
    80. class QuickSort:public Sort
    81. {
    82. public:
    83.     void sort(int(*Compare)(int,int))
    84.     {
    85.         int l=1,r=n;
    86.         qs(a,l,r,Compare);
    87.     }
    88. };
    89.  
    90. class ToolSort
    91. {
    92. public:
    93.     Sort *t;
    94. public:
    95.     ToolSort()
    96.     {
    97.         t=NULL;
    98.     }
    99.     ToolSort(Sort *a)
    100.     {
    101.         t=a;
    102.     }
    103.     void ChangeTool(Sort *b)
    104.     {
    105.         t=b;
    106.     }
    107.     void ThucThi(int(*Compare)(int,int))
    108.     {
    109.         t->sort(Compare);
    110.     }
    111.     void Import()
    112.     {
    113.         cout<<"Nhap so phan tu can sap xep: ";
    114.         cin>>n;
    115.         a=new int[n+1];
    116.         for(int i=1;i<=n;i++)
    117.         {
    118.             cout<<"a["<<i<<"]= ";
    119.             cin>>a[i];
    120.         }
    121.     }
    122.     void Export()
    123.     {
    124.         cout<<"\nCac phan tu sau khi duoc sap xep: ";
    125.         for(int i=1;i<=n;i++)
    126.             cout<<a[i]<<"  ";
    127.     }
    128. };
    129.  
    130. void main()
    131. {
    132.     ToolSort *t;
    133.     t->Import();
    134.     t=new ToolSort(new InterchangeSort);
    135.     t->ThucThi(Decrease);
    136.     t->Export();
    137.     t->ChangeTool(new SelectSort);
    138.     t->ThucThi(Increase);
    139.     t->Export();
    140.     t->ChangeTool(new QuickSort);
    141.     t->ThucThi(Decrease);
    142.     t->Export();
    143. }
    Chú ý mắc lỗi lần nữa thì sẽ xử lý theo quy định như pete đã nêu.Alviss
    Đã được chỉnh sửa lần cuối bởi Alviss : 20-10-2007 lúc 12:04 AM.

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mới nhìn vào hàm main trước, thấy sai tổ chãng:
    Code:
    ToolSort *t;
    t->Import();
    Con trỏ t khởi tạo chưa mà đã gọi member function Import() ????????????? Chưa chết cái đùng là may rồi đó, ở đó mà đòi chạy tới QuickSort.

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    class ToolSort
    {
    public:
    Sort *t;
    public:
    ToolSort()
    {
    t=NULL;
    }
    ToolSort(Sort *a)
    {
    t=a;
    }
    Đã được anh TQN đề cập ở trên.
    Con trỏ mới được định nghĩa chưa khởi tạo <cấp phát bộ nhớ động>

    t=NULL; <--- gán giá trị chứ không phải là cấp phát bộ nhớ.

    set breakpoint tại đây là thấy.
    None!

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    50

    chết xin lỗi mọi người nữa, tai sao bài này có một số trường hợp chạy được ví dụ bạn nhập 1 8 2 4 6 thi nó vẫn chạy mà, nhưng cũng có khi nhập nhừg số khác lại no run

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    cậu đang phụ thuộc vào hành xử của tưng compiler
    vẫn chạy là vì làm Import chưa đụng đến property member

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Sắp xếp mảng theo yêu cầu

    chết xin lỗi mọi người nữa, tai sao bài này có một số trường hợp chạy được ví dụ bạn nhập 1 8 2 4 6 thi nó vẫn chạy mà, nhưng cũng có khi nhập nhừg số khác lại no run
    Thì do code của cậu mà. Code kiểu đó thì chỉ chờ hên xui thôi. Nếu hên, không phải vùng nhớ rác thì chạy được, không thì die lúc nào không hay. Vậy thôi.
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Cậu chanphat01001 đang dùng compiler gì, TC++ trên DOS phải không ?
    Và code này không phải do cậu viết hoàn toàn, cậu có copy hay dựa vào code # phải không ? Vì đã biết dùng tới abstract, con trỏ hàm, kế thừa tốt như vầy thì không thể mắc lỗi sơ đẵng như vậy được.

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Đúng là code này vẫn chạy được, vì hàm Import chỉ modify và access tới global data: con trỏ a và int n. Đây là lỗi của tui 1 phần, chưa kiểm tra kỹ.
    Tui đã copy code này về, compile, chạy IDA để phân tích mã ASM của nó. Bảng table function của class ToolSort đã được khởi tạo sẵn, và do class ToolSort không có virtual table nên compiler không sinh code this->function mà sinh code function(ecx<-this...). Tức là khi chúng ta gọi:
    Code:
    ToolSort *t;
    t->Import();
    Compiler sinh code gọi tới hàm Import, tryền con trỏ this là t (với giá trị rác, trên VC++ 6 là 0xCCCCCCCC) thông qua thanh ghi ECX. Bên trong hàm Import, do chỉ modify và access global data, nên con trỏ this này không được access tới và không gây ra lỗi.
    Nên nhớ trường hợp này chạy được là may rủi. Và đây là điều tối kỵ, ct máy tính không chấp nhận chuyện may rủi, vui thì chạy, buồn thì crash. Mọi thứ phải nằm trong tầm kiểm soát của ct và coder. Có vậy mà còn chưa chắc đấy, sau này khi các cậu đi làm, các cậu sẽ gặp hoài trường hợp, ct chạy tốt trên máy coder phát triển ct, trên máy test, mà lúc delivery cho khách hàng thì lại crash hoặc chạy lên thì exit mất tiêu. Lúc này mới mệt vì khách hàng có thể ở Nhật, US. Khi đó, nội chuyện mail qua mail lại cũng đủ làm các cậu mệt rồi, rồi setup tool, hệ thống để remote debug, remove capture....
    Có 1 nguyên tắc lập trình mà tui thường nói đi nói lại: "Trước khi dùng tới một biến, phải chắc chắn biến đó đã được khởi tạo và có trị hợp lệ."
    Đã được chỉnh sửa lần cuối bởi TQN : 22-10-2007 lúc 12:03 AM.

  9. #9
    Ngày gia nhập
    10 2007
    Bài viết
    50

    thanks TQN

Các đề tài tương tự

  1. Cài nhạc chờ theo bài hát yêu thích
    Gửi bởi quatangamnhac trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 19-07-2013, 03:53 PM
  2. Thiết kế áo theo yêu cầu, chuyên cung cấp áo đôi tình yêu, mẫu mã đẹp hợp thời trang
    Gửi bởi aodoixinh.com trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-10-2012, 04:45 PM
  3. bài toán sắp xếp số bạn nam và nữ theo yêu cầu - ai giúp mình với
    Gửi bởi tuan12toan trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 8
    Bài viết cuối: 27-01-2012, 11:02 PM
  4. Xác định tọa độ x,y của 1 vị trí theo yêu cầu trong ảnh
    Gửi bởi hoangkasu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 18-07-2010, 07:58 PM
  5. Hàm search với kiểu dữ liệu bất kì theo một yêu cầu bất kì
    Gửi bởi chanphat01001 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 08-06-2008, 10:54 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn