Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 27 kết quả

Đề tài: Bảng Băm ứng dụng Từ Điển (phương pháp kết nôi trực tiếp)

  1. #1
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Mặc định Bảng Băm ứng dụng Từ Điển (phương pháp kết nôi trực tiếp)

    Link Download Code(box.net)

    Bảng băm ứng dụng từ điển (phương pháp kết nối trực tiếp giải quyết sung đột bằng DSLK đơn) Cài đặt bằng C++.
    Rất mong sự góp ý của bác pro.
    PHP Code:
    /*Program Ung dung bang bam (phuong phap ket noi truc tiep)
     lam Tu Dien cai dat bang C++ (giai quyet sung dot bang DSLK don)
     ·  Date: 22/2/2008
    -------------------------------------------------------------------------
    VU THANH NAM - CONG NGHE THANG LONG
    MA SV: A0707
    Email: iamvtn@gmail.com
    Y!M  : iamvtn
    Skype: iamvtn
    Copyright (C) 2008 iamvtn - All Rights Reserved
    Debug by Borland C++ 5.02
    *************************************************************************
    */
    #include <iostream.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <cstring.h>
    #include <stdio.h>
    #define M 26  // so Buckets

    class Dictionary;
    class 
    Node  // lop node
    {
          private:
           
    char word[100];  // truong word la mot tu tieng anh
          
    char mean[100];  // truong mean la nghia cua tu
          
    Node *next;      // truong next chi nut tiep theo khi nut bi xung dot
       
    public:
           
    Node();
          
    Node (Node *k);
          
    Node(char nword[],char nmean[]);
          
    Node(char nWord[]);
          
    void displayWord();
          
    void displayMeaning();
          
    void Input();
       
    friend class Dictionary;
    };

    void Node::Input()             // Ham nhap tu va nghia cho Node
    {
        
    cout<<"\nInput word: ";
        
    gets(word);
        
    cout<<"Mean: ";
        
    gets(mean);
    };

    void Node::displayWord()
    {
        
    cout<<"\n\t\tWord:"<<word;
    }

    void Node::displayMeaning()
    {
        
    cout<<"\t\tMean:"<<mean;
    }

    Node::Node(char nWord[])
    {
        
    strcpy(word,nWord);
        
    next=NULL;
    }

    Node::Node(char nword[],char nmean[])
    {
        for(
    int i 0;100i++)
        {
            
    word[i] = '\0';
            
    mean[i] = '\0';
        }
        
    strcpy(word,nword);
        
    strcpy(mean,nmean);
        
    next NULL;
    }

    Node::Node()
    {
        for(
    int i 0;100i++)
        {
            
    word[i] = '\0';
            
    mean[i] = '\0';
        }
       
    next NULL;
    };

    Node::Node(Node *k)
    {
        for(
    int i 0;100i++)
        {
            
    word[i] = '\0';
            
    mean[i] = '\0';
        }
         
    strcpy(word,k->word);
            
    strcpy(mean,k->mean);
            
    next NULL;
    }

    class 
    Dictionary   /////////////////////////////////////////////////// lop tu dien
    {
       private:
          
    Node *Bucket[M]; // Mang cac bucket
       
    public:
          
    Dictionary();

          
    bool Isempty();                         // Kiem tra xem bang bam co rong khong

          
    int  HashFunc(char c);                         // Ham bam

          
    void Insert(char nWord[],char nMean[]); // Ham nay de chen ca word va mean vao bang bam
          
    void Insert (Node *k);                         // Ham nay de chen khoa k vao bang bam
          
    void Place (int bNode *k);                // Ham nay de chen Node k vao bucket thu b

         
    void FindNode(int key,Node *k);           // Tim theo key
          
    void Find(char word[]);                  // Tim theo tu

          
    void DeleteNode(int keyNode *k);       // Xoa theo key
          
    void Delete(char word[]);                // Xoa theo tu

          
    void Display();                                 // Duyet toan bo bucket
    };

    bool Dictionary::Isempty()
    {
        
    int dem 0;
        for(
    int i 0;M;i++)
       {
            if(
    Bucket[i] != NULL)
              
    dem ++;
       }
       if(
    dem == 0)
           return 
    true;
       else
           return 
    false;
    }

    Dictionary::Dictionary()
    {
        for(
    int i 0;M;++)
        {
            
    Bucket[i] = 0;
        }
    }

    void Dictionary::DeleteNode(int key,Node *k)    // Xoa theo key
    {
       
    Node *temp Bucket[key];
       
    Node *node Bucket[key];
       if(
    node == NULL)
       {
           
    cout<<"Khong co tu nay ";
       }
       else
       {
          if(
    strcmpi(Bucket[key]->word,k->word)==0)
           {
               
    Bucket[key] = Bucket[key]->next;
           }
           while(
    temp != NULL)
           {
                if(
    strcmpi(temp->word,k->word) == 0)
                 break;
                      
    node temp;
                      
    temp temp->next;
          }
          if(
    temp != NULL)
          {
              
    node->next temp->next;
             
    node NULL;
               
    delete node;
              
    temp->next NULL;
              
    delete temp;
          }
          else
              
    cout<<"Khong co tu nay ";
       }
    }

    void Dictionary::Delete(char nWord[])              // Xoa theo tu
    {
        if(
    Isempty() == true)
           
    cout<<"\nTu Dien rong \n";
        
    int t HashFunc(nWord[0]);
            
    Node temp = new Node(nWord);
            
    DeleteNode(t,temp);
    }

    void Dictionary::FindNode(int key,Node newnode)       // Tim theo Node
    {
           if(
    Bucket[key]==NULL)
          {
                 
    cout<<"Khong co tu nay!"<<endl;
          }
          else
          {
              
    Node temp Bucket[key];
              
    int d 0;
              while(
    temp!=NULL)
              {
                  if(
    strcmpi(temp->word,newnode->word) == 0)
                  {
                      
    temp->displayWord();
                      
    temp->displayMeaning();
                            
    d++;
                  }
                  
    temp=temp->next;
              }
              if (
    == 0)
              {
                  
    cout<<endl<<"Khong co tu nay!"<<endl;
              }
          }
    };

    void Dictionary::Find(char nWord[])            // Tim theo tu
    {
        if(
    Isempty())
        
    cout<<"\nTu Dien rong: \n";
        
    int t HashFunc(nWord[0]);
            
    Node temp = new Node(nWord);
            
    FindNode(t,temp);
    };

    int Dictionary::HashFunc(char c)    // Ham bam (neu ky tu la a thi tra ve 0 ..... z thi tra ve 25)
    {
        
    int a=c;
        if (
    >= 97)       // su dung bang ma ASCII
            
    32;
        return (
    65);
    };


    void Dictionary::Place(int bNode *k)  // Ham nay de chen Node k vao bucket thu b
    {
       if (
    Bucket[b] == 0)
       {
           
    Bucket[b] = k;
       }
       else
       {
           
    Node temp Bucket[b];
           while (
    temp->next != NULL)
           {
               
    temp temp->next;
           }
           
    temp->next k;
       }
    };

    void Dictionary::Insert(char nWord[],char nMean[])   // Ham insert nghia va tu vao bucket
    {
        
    Node newNode = new Node(nWord,nMean);
        
    int t HashFunc(nWord[0]);
        
    Place(t,newNode);
    };

    void Dictionary::Insert(Node *k)         // Ham insert mot Node vao bucket
    {
          
    int b ;
            
    HashFunc(k->word[0]);
            
    Place(b,k);
    };

    void Dictionary::Display()                           // Duyet toan bo bucket
    {
        if(
    Isempty() == true)
           
    cout<<"\nTu Dien rong \n";
        
    Node temp;
        for (
    int i=0;i<M;i++)
           {
            
    temp Bucket[i];
            while(
    temp!=NULL)
            {
                
    temp->displayWord();
                
    temp->displayMeaning();
                            
    cout<<endl;
                
    temp temp->next;
            }
       }
    };

    void Menu(Dictionary &td)
    {
        
    int choice;
        
    cout<<"\t\t\t    Tu dien ung dung Bang Bam"<<endl<<endl;
       
    cout<<"\t\t\t    1/. Them tu khoa vao cay "<<endl<<endl;
       
    cout<<"\t\t\t    2/. Xoa Bot tu khoa "<<endl<<endl;
       
    cout<<"\t\t\t    3/. Tra cuu tu "<<endl<<endl;
       
    cout<<"\t\t\t    4/. Hien thi cay hien tai "<<endl<<endl;
       
    cout<<"\t\t\t    5/. De thoat khoi chuong trinh "<<endl<<endl<<endl;
       
    cout<<"\t\t\t      Moi ban chon mot chuc nang  ";
       
    cin>>choice;
       switch(
    choice)
       {
           case 
    1:
           {
              
    int n;
              
    system("cls");
             
    cout<<"\nBan muon chen bao nhieu tu khoa: ";
             
    cin>>n;
             for(
    int i 0;n;i++)
             {
                   
    Node *data=new Node;
                 
    data->Input();
                 
    td.Insert(data);
             }
             
    cout<<"\n\n Tu Dien sau khi da chen\n";
             
    td.Display();
             
    getch();
             
    system("cls");
             
    Menu(td);
          }
          case 
    2:
          {
              
    system("cls");
             
    char word[100];
             
    cout<<endl;
             
    cout<<"Nhap tu muon xoa: ";
             
    gets(word);
             
    td.Delete(word);
             
    cout<<endl<<"\nDanh sach sau khi xoa:";
             
    td.Display();
             
    getch();
             
    system("cls");
             
    Menu(td);
          }
          case 
    3:
          {
              
    system("cls");
             
    char word[100];
             
    cout<<endl;
             
    cout<<"Nhap tu muon tim: ";
             
    gets(word);
             
    td.Find(word);
             
    getch();
             
    system("cls");
             
    Menu(td);
          }
          case 
    4:
          {
              
    system("cls");
              
    td.Display();
             
    getch();
             
    system("cls");
             
    Menu(td);
          }
          case 
    5:
          {
               exit(
    0);
          }
          default:
           {
              
    system("cls");
               
    cout<<"\n\tKhong co chuc nang nay: ";
             
    getch();
             
    system("cls");
             
    Menu(td);
          }
       }

    };

    void main()
    {
       
    textmode(C4350);// noi rong man hinh console
        
    Dictionary td;
        
    Menu(td);
    }; 
    Dán code lên diễn đàn làm lệch hết cả dòng code (chán).
    Đã được chỉnh sửa lần cuối bởi iamvtn : 22-02-2008 lúc 11:34 AM.

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Kid thấy cái quan trọng là xử lí file dữ liệu, nó khó hơn. Không biết cậu làm cái đề tài này chủ yếu để mô tả bảng băm hay là để làm cái từ điển đây.

  3. #3
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Kid thấy cái quan trọng là xử lí file dữ liệu, nó khó hơn. Không biết cậu làm cái đề tài này chủ yếu để mô tả bảng băm hay là để làm cái từ điển đây.
    Uhm cái đề tài này chỉ yếu để mô tả bảng băm, việc xử file bằng C++ khá phức tạp (nhưng hoàn toàn làm được), tớ sẽ bổ sung sau.
    Thật ra bài này vẫn không hay ở chỗ khi chèn một phần tử vào Bucket thì chỉ đơn thuần là chèn cuối, như vậy không đúng với từ điển lắm nhỉ phải vừa chèn vào vừa sắp xếp các ký tự trong bucket thì hay hơn.
    Giờ tớ cực bận nên bài này để đấy khi nào thi xong tớ sẽ bổ sung tiếp. .

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    #include <cstring.h>
    hi hi, cái này bác iamvtn chế ra nha, bắt quả tang tại trận .
    Mà mình thấy sao cậu không dùng c++ string nhỉ, dùng Cstring thấy cực quá. Hàm gets xài cũng nguy hiểm.
    việc xử file bằng C++ khá phức tạp (nhưng hoàn toàn làm được), tớ sẽ bổ sung sau.
    Mình cũng có biết sơ sơ về phần này, nếu cần thì pm mình nhá T_T.
    Good Code ! Ăn cắp xài nha T_T !

  5. #5
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    hi hi, cái này bác iamvtn chế ra nha, bắt quả tang tại trận .
    Mà mình thấy sao cậu không dùng c++ string nhỉ, dùng Cstring thấy cực quá. Hàm gets xài cũng nguy hiểm.

    Mình cũng có biết sơ sơ về phần này, nếu cần thì pm mình nhá T_T.
    Good Code ! Ăn cắp xài nha T_T !
    Ác cstring.h là thư viện trong C++ mà, tớ toàn dùng gets() dễ sài .
    À cậu update bài của minh lên nhá, ghi các ký tự mình nhập vào một file và sau khi xuất ra thì đọc ngược lại file đó .
    Thank cậu nhá.

  6. #6
    Ngày gia nhập
    03 2008
    Bài viết
    1

    Mặc định Bảng Băm ứng dụng Từ Điển (phương pháp kết nôi trực tiếp)

    mình đang co bài tập tạo từ điển dùng bảng băm và lưu từ điển vào tập tin.nhưng mình không tìm được file từ điển nào cả.file từ điển của mình yêu cầu: loai của từ, phiên âm quốc tế,các nghĩa có thể có.Ai có cho mình share với.thanks trước nha.

  7. #7
    Ngày gia nhập
    04 2008
    Bài viết
    19

    Wink hàm băm chuyển 1 dãy ký tự từ char qua int

    mình đang cần 1 chương trình dùng hàm băm để chuyển 1 dãy kí tự từ char qua int ai biết xin giúp đỡ.thank u!

  8. #8
    Ngày gia nhập
    02 2008
    Bài viết
    18

    Trích dẫn Nguyên bản được gửi bởi hieuto Xem bài viết
    mình đang cần 1 chương trình dùng hàm băm để chuyển 1 dãy kí tự từ char qua int ai biết xin giúp đỡ.thank u!
    C++ Code:
    1. int Dictionary::HashFunc(char c)    // Ham bam (neu ky tu la a thi tra ve 0 ..... z thi tra ve 25)
    2. {
    3.     int a=c;
    4.     if (a >= 97)       // su dung bang ma ASCII
    5.         a = a - 32;
    6.     return (a % 65);
    7. };
    Đã được chỉnh sửa lần cuối bởi Counter-Strike : 08-04-2008 lúc 10:18 AM.

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

    cho tui hỏi, ý nghĩa băm char là gì

    int Dictionary::CharHashFunc(char c)
    {
    return c; //không cần băm biếc gì cả
    };

    băm chuỗi mới có ý nghĩa chứ không cần băm char

    Theo Mình hiểu thì số 65 để giới hạn giá trị của nó trong range của mảng, nhưng ở trên lại thấy

    #define M 26 // so Buckets
    Như vậy 65 trong hàm hash có ý nghĩa gì, tại sao là 65, mà không phải là số khác!!

    Nếu viết thế này được ko
    Code:
    int Dictionary::HashFunc(char c)   
    {
        return (c % 65);
    };
    Nói chung là chưa hiểu rõ lắm ý đồ của iamvtn
    Đã được chỉnh sửa lần cuối bởi nguyentuan2 : 08-04-2008 lúc 09:36 AM.

  10. #10
    Ngày gia nhập
    01 2007
    Nơi ở
    Somewhere I belong
    Bài viết
    168

    Trích dẫn Nguyên bản được gửi bởi nguyentuan2 Xem bài viết
    cho tui hỏi, ý nghĩa băm char là gì

    int Dictionary::CharHashFunc(char c)
    {
    return c; //không cần băm biếc gì cả
    };

    băm chuỗi mới có ý nghĩa chứ không cần băm char

    Theo Mình hiểu thì số 65 để giới hạn giá trị của nó trong range của mảng, nhưng ở trên lại thấy

    #define M 26 // so Buckets
    Như vậy 65 trong hàm hash có ý nghĩa gì, tại sao là 65, mà không phải là số khác!!

    Nếu viết thế này được ko
    Code:
    int Dictionary::HashFunc(char c)   
    {
        return (c % 65);
    };
    Nói chung là chưa hiểu rõ lắm ý đồ của iamvtn
    Ui em chào bác, lâu lắm mới thấy bác post bài,
    Hè hè. Ý của em thế này.
    Code:
    #define M 26  // so Buckets
    Tức là bảng băm sẽ có 26 bucket
    0 -> A
    1 -> B
    2 -> C
    3 -> D
    ........
    25 -> Z

    khi ta truyền một xâu ký tự hàm băm sẽ chuyển phần tử đầu tiên trong xâu về các bucket thích hợp.
    VD: khi ta nhập xâu. Anh Nam đẹp trai thì xâu đó sẽ được chèn vào Bucket đầu tiên.
    0 -> Anh Nam đẹp trai

    Còn về số 65 tức là thế này ạ.
    Code:
     
        int a=c;
        if (a >= 97)       // su dung bang ma ASCII
            a = a - 32;
        return (a % 65);
    int a = c tức là ép char c về kiểu int
    ký tự a->z sẽ là từ 97->122 trong bảng mã ASCII
    vì vậy em phải trừ đi 32 và % cho 65 để chả về từ 0->25 thôi, cái này chỉ là phép tính số học thôi bác ạ. .
    In code we trust

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

  1. Borland C++ Lỗi lỗi khi ứng dụng bảng băm vào thiết kế từ điển tiếng anh
    Gửi bởi dungc13 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 09-09-2013, 09:15 AM
  2. Bài tập giải thuật lỗi khi ứng dụng bảng băm vào thiết kế từ điển tiếng anh
    Gửi bởi dungc13 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 09-09-2013, 12:36 AM
  3. Băm kí tự tiếng Việt như thế nào?
    Gửi bởi gunrose trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 20-03-2011, 08:37 AM
  4. bảng băm đóng, bảng băm mở trong lập trình C#?
    Gửi bởi mysad trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 11-12-2010, 01:20 PM
  5. Lập trình C++ Từ điển sử dụng bảng băm và cây AVL!
    Gửi bởi kidqn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 05-08-2010, 07:00 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