Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 2 trên tổng số 2 Đầu tiênĐầu tiên 12
Từ 11 tới 18 trên tổng số 18 kết quả

Đề tài: nạp chồng toán tử [] - binary search tree

  1. #11
    Ngày gia nhập
    12 2017
    Bài viết
    5

    Mặc định nạp chồng toán tử [] - binary search tree

    đoạn trên vẫn là code của mình mà
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #12
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Code mới đấy. Mình chỉ chữa mỗi 1 đoạn ấy thôi. Mình e rằng trong chương trình còn vài chỗ sai khác nhưng muốn làm chúng bộc lộ phải viết hàm main() khác lớn hơn. Cho hàm main() hiện thời chạy được, chỉ chữa 1 chỗ ấy là đủ, ngoài đoạn code mà bạn đã tự chữa [#7].
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #13
    Ngày gia nhập
    12 2017
    Bài viết
    5

    mình thấy đoạn code mới của bạn giống hoàn toàn code cũ của mình, và mình cũng chạy chương trình ra được như thế, nhưng vấn đề mình cần là phần nạp chồng chỉ số [] kia cơ

  4. #14
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    mình thấy đoạn code mới của bạn giống hoàn toàn code cũ của mình,
    OK. Vậy là bạn không thấy sự khác nhau giữa 2 đoạn code. Thế bạn có thấy sự khác nhau giữa 2 đoạn văn dưới đây không?

    nhưng khi xuống hàm main, mình không biết viết sao, chạy kết quả ra toàn Invalid key
    và mình cũng chạy chương trình ra được như thế
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #15
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    472

    Trích dẫn Nguyên bản được gửi bởi Tai2 Xem bài viết
    bạn xem chương trình này giúp mình với, hàm main giờ viết sao?

    #include<iostream>
    using namespace std;

    class Tree {
    private:
    struct node {
    int key;
    float data;
    node* left;
    node* right;
    };
    node* root;

    node* makeEmpty(node* t);
    node* insertprivate(int x, float y, node* t);
    node* findMin(node* t);
    node* removeprivate(int x, float y, node* t);
    void inorderprivate(node* t);
    node* findprivate(node* t, int x);
    int countprivate(node* t);
    node* findNodeWithKey(int index, node* t);

    public:
    Tree();
    ~Tree();
    void insert(int x, float y);
    void remove(int x, float y);
    void inorder();
    void find(int x);
    int count();
    float& operator[](int index);

    };

    Tree::Tree() {
    root = NULL;
    }

    Tree::~Tree() {
    root = makeEmpty(root);
    }

    Tree::node* Tree::makeEmpty(node* t) {
    if (t == NULL)
    return NULL;
    {
    makeEmpty(t->left);
    makeEmpty(t->right);
    delete t;
    }
    return NULL;
    }

    void Tree::insert(int x, float y) {
    root = insertprivate(x, y, root);
    }

    Tree::node* Tree::insertprivate(int x, float y, node* t)
    {
    if (t == NULL)
    {
    t = new node;
    t->key = x;
    t->data = y;
    t->left = t->right = NULL;
    }
    else if (x < t->key)
    t->left = insertprivate(x, y, t->left);
    else if (x > t->data)
    t->right = insertprivate(x, y, t->right);
    return t;
    }

    void Tree::remove(int x, float y) {
    root = removeprivate(x, y, root);
    }

    Tree::node* Tree::removeprivate(int x, float y, node* t) {
    node* temp;
    if (t == NULL)
    return NULL;
    else if (x < t->key)
    t->left = removeprivate(x, y, t->left);
    else if (x > t->key)
    t->right = removeprivate(x, y, t->right);
    else if (t->left && t->right)
    {
    temp = findMin(t->right);
    t->key = temp->key;
    t->right = removeprivate(t->key, t->data, t->right);
    }
    else
    {
    temp = t;
    if (t->left == NULL)
    t = t->right;
    else if (t->right == NULL)
    t = t->left;
    delete temp;
    }

    return t;
    }

    void Tree::inorder() {
    inorderprivate(root);
    cout << endl;
    }

    void Tree::inorderprivate(node* t) {
    if (t == NULL)
    return;
    inorderprivate(t->left);
    cout << t->key << "( " << t->data << " )\t";
    inorderprivate(t->right);
    }

    void Tree::find(int x) {
    root = findprivate(root, x);
    }

    Tree::node* Tree::findprivate(node* t, int x) {
    if (t == NULL)
    return NULL;
    else if (x < t->data)
    return findprivate(t->left, x);
    else if (x > t->data)
    return findprivate(t->right, x);
    else
    return t;
    }

    Tree::node* Tree::findMin(node* t)
    {
    if (t == NULL)
    return NULL;
    else if (t->left == NULL)
    return t;
    else
    return findMin(t->left);
    }

    int Tree::countprivate(node* t)
    {
    if (t == NULL)
    return 0;
    else
    return (countprivate(t->right) + countprivate(t->left)) + 1;
    }

    int Tree::count()
    {
    cout << "Count = " << countprivate(root);
    cout << endl;
    return 0;
    }

    float& Tree::operator[](int index) {
    node* t = findNodeWithKey(index, root);
    if (t) return t->data;
    }

    Tree::node* Tree::findNodeWithKey(int index, node* t) {
    if (!t || t->key == index) return t;
    return findNodeWithKey(index, index < t->key ? t->left : t->right);
    }

    int main() {

    Tree* bst = new Tree();
    bst->insert(20, 0.1);
    bst->insert(25, 0.2);
    bst->insert(10, 0.5);
    bst->inorder();
    bst->count();
    bst->remove(20, 0.1);
    bst->inorder();
    bst->count();
    //Tree A;
    //cout << "A[key] = " << ;
    return 0;
    }
    Code của bạn là
    C++ Code:
    1. Tree::node* Tree::insertprivate(int x, float y, node* t)
    2. {
    3. if (t == NULL)
    4. {
    5. t = new node;
    6. t->key = x;
    7. t->data = y;
    8. t->left = t->right = NULL;
    9. }
    10. else if (x < t->key)
    11. t->left = insertprivate(x, y, t->left);
    12. else if (x > t->data)//<----------------------------sai ở dòng này này
    13. t->right = insertprivate(x, y, t->right);
    14. return t;
    15. }
    Ada đã sửa lại là
    C++ Code:
    1. Tree::node* Tree::insertprivate(int x, float y, node* t)
    2. {
    3. if (t == NULL)
    4. {
    5. t = new node;
    6. t->key = x;
    7. t->data = y;
    8. t->left = t->right = NULL;
    9. }
    10. else if (x < t->key)
    11. t->left = insertprivate(x, y, t->left);
    12. else if (x > t->key)//<------------------------Ada đã sửa dòng này này
    13. t->right = insertprivate(x, y, t->right);
    14. return t;
    15. }

    - - - Nội dung đã được cập nhật ngày 28-03-2020 lúc 07:51 PM - - -

    Trích dẫn Nguyên bản được gửi bởi Tai2 Xem bài viết
    mình thấy đoạn code mới của bạn giống hoàn toàn code cũ của mình, và mình cũng chạy chương trình ra được như thế, nhưng vấn đề mình cần là phần nạp chồng chỉ số [] kia cơ
    Rút kinh nghiệm chút đi
    Đó không phải là nạp chồng(override)
    Mà là "overload" có thể tạm dịch là quá tải

  6. #16
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Mặc định nạp chồng toán tử [] - binary search tree

    Cảm ơn, khoaph.

    Từ "nạp chồng" là dịch từ overload. Ai đó, chắc phải là một thầy có uy tín trong ngành CNTT, đã dịch như thế, nên không ai dám cãi. Nhưng thật ra, đó là chỉ thấy ngọn mà không thấy gốc. Gốc của load là "tải", còn "nạp" chỉ là ngọn. Và trong trường hợp này, overload xảy ra ngay từ ngữ nghĩa của mã nguồn, chứ không phải là một quá trình run-time, nên không hề có "nạp".

    Còn override là chuyện khác. Mình không nghĩ có thể dịch từ này thành "nạp chồng" bởi vì như thế đi quá xa nguyên bản, là cưỡi, đè, dẫm, lấn lướt, vượt qua, bác, phủ quyết, dùng quyền ưu tiên, bãi bỏ (chế độ cũ), thu hồi (quyết định của cấp dưới),...

    - - - Nội dung đã được cập nhật ngày 28-03-2020 lúc 08:22 PM - - -

    Nhân tiện, trong những ngày làm việc tại nhà vì dịch bệnh, mình tìm mua 1 cặp loa nghe nhạc. Mỗi thùng loa có 2 loa (driver) là loa thanh (tweeter) và loa trầm (woofer). Nhưng khi tìm trên mạng, các hãng kỹ thuật âm thanh VN đều dịch driver là "trình điều khiển". Mình hy vọng họ không phải là người Việt.
    Đã được chỉnh sửa lần cuối bởi Ada : 28-03-2020 lúc 08:28 PM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #17
    Ngày gia nhập
    12 2017
    Bài viết
    5

    thật sự xin lỗi vì mình nhìn không kỹ, cũng rất cảm ơn vì sự nhiệt tình của bạn

    - - - Nội dung đã được cập nhật ngày 29-03-2020 lúc 01:51 AM - - -

    cảm ơn bạn đã chỉ ra và góp ý

  8. #18
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    586

    Mục đích của operator[] là dùng một cây nhị phân bằng cách viết tương tự như một mảng.

    Thí dụ,

    C++ Code:
    1. Tree T, U;
    2. double x = T[9];
    3. double y = T[n];
    4. T[10] = 3.14;
    5. T[n] = 3.14;
    6. T[i] = T[j];
    7. for(int i=0; i<T.last(); i++) {T[i] = U[i];}
    8. // Mảng không làm được trò này. Nhưng cây nhị phân thì phải làm được.
    9. T = U;
    10. if( T == U ) ...
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi Ada : 29-03-2020 lúc 02:50 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