Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: [VC++]Cùng nhau làm một cuốn tử điển chơi!

  1. #1
    No Avatar
    athaygiao Khách

    Mặc định [VC++]Cùng nhau làm một cuốn tử điển chơi!

    Chào các bác. Em chỉ là Newbie thôi, Sinh viên năm thứ hai nhưng cũng ham mê tìm tòi. Em đang mò trên VC++ 6 thấy khá là hay. Em đang thiết kế 1 cuốn từ điển, làm thấy hay nhưng mà mắc quá. Cái phần thiết kế các đối tượng trong đó cứ mắc linh tinh.
    Ý tưởng đơn giản như sau:
    -Tra từ anh việt, việt - anh.
    -NGười dùng có thể thêm từ mới.
    Nếu bác là một nhà phân tích hệ thống bác bảo em phải bắt đầu thế nào? Thật sự là em đang rối về việc phân tích đối tượng vì lần đầu viết phần mềm mà. Các bác có kinh nghiệm chỉ em cách phân tích các lớp và lớp kế thừa, cái nào kế thừa cái nào. Em xin cảm ơn....
    ----------------

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Tham khảo bài viết này xem!

    Code:
    Công cụ cần thiết nhất khi học ngoại ngữ chính là từ điển. Chắc hẳn các bạn cũng như tôi luôn cảm thấy vất vả khi phải tra từ trên cuốn từ điển dày cộp. Giải pháp đáng giá là sử dụng ứng dụng từ điển trên máy vi tính. Mặc dù hiện nay các ứng dụng từ điển đã có nhiều nhưng vốn là dân tin học, tôi đã quyết định tự xây dựng cho mình một ứng dụng từ điển riêng.
    
    Cơ sở dữ liệu
    
    Phần quan trọng nhất đối với một ứng dụng từ điển chính là cơ sở dữ liệu (CSDL). Việc xây dựng CSDL cho từ điển phải đảm bảo được khả năng truy cập nhanh bởi dữ liệu của từ điển thường khá lớn, lên tới hàng chục nghìn từ. Thật may, DICT.ORG (www.dict.org) đã xây dựng một format (định dạng) từ điển rất dễ sử dụng, format này đã được dùng để xây dựng những bộ từ điển khá lớn. Dict format được mô tả như sau: toàn bộ CSDL được chứa trong 2 file, một file chứa nghĩa của từ và một file index. File index bao gồm tên từ, vị trí nghĩa của từ bắt đầu trong file chứa nghĩa và độ dài của nghĩa. Vị trí bắt đầu và độ dài của nghĩa được mã hoá theo cách như sau: Sử dụng 64 chữ cái: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
    
    chữ cái A tương đương số 0, chữ cái B tương đương số 1 v.v... Giữa từ, vị trí bắt đầu và độ dài nghĩa phân cách nhau bởi ký tự tab (ASCII 9). Mỗi dòng trong file index chứa dữ liệu của một từ. Các dòng phân cách nhau bởi ký tự xuống dòng (ASCII 10).
    
    Ví dụ trong file index của từ điển Đức-Việt có một dòng như sau:
    
    Abdeckung kbpP D3
    
    Như vậy nghĩa của từ Abdeckung trong file chứa nghĩa sẽ bắt đầu tại offset kbpP (theo mã 64 ký tự) và có độ dài là D3.
    
    Việc chuyển từ mã cơ số 64 về cơ số 10 được thực hiện như sau:
    
    Đối với vị trí bắt đầu: kbpP. Ta có k (ở cơ số 64) = 36 (ở cơ số 10), b = 27, p = 41, P = 15. Như vậy chuyển sang cơ số 10, mã kbpP có giá trị là: 36*643 + 27*642 + 41*641 + 15*640 = 9550415
    
    Đối với độ dài nghĩa: D3. Ta có D = 3, 3 = 55. Như vậy chuyển sang cơ số 10, mã D3 ở cơ số 64 có giá trị là: 247.
    
    File index được sắp xếp để giảm bớt thời gian tìm kiếm. Việc mã hoá theo cơ số 64 như trên giúp cho kích thước file index giảm xuống rất nhiều so với không mã hóa.
    
    Còn cấu trúc của file chứa nghĩa gồm các phần như sau:
    @headword
    * tu loai (noun, verb...)
    
    - dinh nghia 1
    = cau vi du cho dinh nghia 1 + nghia cua cau do
    
    - dinh nghia 2
    = cau vi du cho dinh nghia 2 + nghia cua cau do
    * tu loai
    
    - dinh nghia 3
    
    Nghĩa của mỗi từ gồm một phần như trên, các nghĩa của mỗi từ nối tiếp nhau liên tục.
    
    Như vậy, các bạn hoàn toàn có thể xây dựng cho mình các bộ từ điển riêng. Tuy nhiên, công việc nhập dữ liệu lại không hề đơn giản chút nào. Nhưng, lại một lần nữa, chúng ta thật may mắn vì có một số bạn đã bỏ công nhập sẵn một số bộ từ điển thông dụng. Các bạn có thể tham khảo thêm tại: www.ttdomain.net/ttdownload/, www.informatik.uni-leipzig.de/~duc/Dict/, huybien.vze.com... Ngoài ra còn rất nhiều bộ từ điển chuyên dụng khác nữa, các bạn có thể tham khảo thêm ở các địa chỉ trên hoặc tại www.dict.org.
    
    Xây dựng chương trình
    
    Ở đây tôi xin trình bày cách sử dụng ngôn ngữ Visual C++ 6.0 và thư viện MFC. Các bạn hoàn toàn có thể sử dụng các ngôn ngữ khác. Trong khuôn khổ bài viết, tôi chỉ xin đưa ra những phần chủ yếu nhất. Các phần như thiết kế giao diện, bố trí giao diện v.v... các bạn có thể tham khảo chương trình mẫu và tự sáng tạo thêm.
    
    1. Các thành phần giao diện cơ bản:
    
    • Edit Box: dùng để nhập từ. Cài biến cho điều khiển: 'Variable name: m_word, Category: Value, Type: Cstring;'
    
    • WebBrowser: dùng để hiện nghĩa của từ. Việc sử dụng WebBrowser chỉ nhằm mục đích hiển thị nghĩa trực quan và sinh động hơn bằng cách xử lý chuỗi (sẽ được đề cập sau này). Bạn có thể thêm điều khiển ActiveX Web Browser vào ứng dụng của mình bằng cách chọn Project->Add to Project->Components And Controls, chọn trong thư mục Registered ActiveX Controls điều khiển Microsoft Web Browser. Cài biến cho điều khiển: 'Variable name : m_wordmean;'
    
    • Listbox, dùng để hiện danh sách từ. Cài biến cho điều khiển: 'Variable name: m_wordlist; Category: Control;'
    
    • Listbox, dùng để lưu trữ dữ liệu về từ. Cài biến cho điều khiển: 'Variable name: m_worddata, Category:Control;'
    
    2. Mã chương trình:
    
    • Nạp dữ liệu vào các list box: bạn đặt phần mã này ở sự kiện WM_OnInitDialog() để dữ liệu được nạp ngay từ lúc khởi động chương trình. Ở đây, bạn thay tên file index bằng tên file tương ứng với từ điển bạn sử dụng.
    
    FILE *inFile;
    
    inFile = fopen ('mydic.index','r');
    
    if (inFile == NULL){
    
    MessageBox ('Cannot open index file');
    
    }else {
    
         char * line;
    
         char lineBuf[100];
    
         line = (char *) lineBuf;
    
         m_wordlist.ResetContent();
    
         m_worddata.ResetContent();
    
         CString word = '';
    
         CString sWord = '';
    
         CString sData = '';
    
         while (!feof(inFile)){
    
            fgets(line,99,inFile);
    
            if (strlen(line)>=2){
    
                word = line;
    
                int pos = word.Find('\t',0);
    
                sWord = word.Left(pos);
    
         sData = word.Mid(pos+1,word.
    
                          GetLength()-pos-1);
    
         if (sData.Find('\n',0) > 0){
    
            sData = sData.Left(sData.
    
                          GetLength()-1); }
    
         if (sWord.GetLength()>=1){
    
            m_wordlist.AddString(sWord);
    
            m_worddata.AddString(sData);}
    
    } } }
    
    fclose(inFile);
    
    • Hàm chuyển từ mã cơ số 64 sang cơ số 10
    
    int GetDemicalValue (CString str){
    
       CString base64 = 'ABCDEFGHIJKLM-NOPQRSTUVWXYZabcdefghijklmnopqrstu-vwxyz0123456789+/';
    
        int decValue = 0;
    
        int len = str.GetLength();
    
        for (int i = 0; i<len; i++){
    
              int pos = base64.Find(str.
    
                     GetAt(i),0);
    
              decValue += (int)pow(64,len-i-
    
                                1)*pos;
    
     }
    
    return decValue;
    
    }
    
    • Hàm xử lý chuỗi ký tự nghĩa. Như đã đề cập ở trên, tôi sử dụng điều khiển Web Browser để hiển thị nghĩa cho thêm phần sinh động. Hàm này có tác dụng xử lý chuỗi ký tự nghĩa bằng cách thêm các tag HTML để nghĩa được thể hiện sinh động hơn ví dụ như: các nghĩa con thì in đậm, chữ đỏ, các ví dụ thì in nghiêng, chữ xanh v.v...
    
    CString ChangeStyle(CString wordmean){
    
       CString meaning = wordmean;
    
       meaning = meaning.Right(meaning.GetLength()-1);
    
       int pos = meaning.Find('\n',1);
    
       meaning.Insert(pos,'</b>');
    
       meaning = '<b>' + meaning;
    
       meaning.Replace('\n','<br>');
    
       meaning.Replace('{','<font color=\'#FF0000\'><b>');
    
       meaning.Replace('}','</b></font>');
    
       meaning.Replace('[','<font color=\'#FF0000\'><b>');
    
       meaning.Replace(']','</b></font>');
    
       meaning.Replace('+',' ');
    
       return meaning;
    
    }
    
    • Hàm lấy nghĩa của từ: hàm này có tác dụng đọc từ file chứa nghĩa để lấy nghĩa của từ, sau đó xử lý chuỗi nghĩa rồi ghi ra file temp.htm. Nếu lấy nghĩa thành công, hàm trả về giá trị TRUE, nếu lấy nghĩa không thành công, hàm trả về giá trị FALSE. Bạn thay tên file mydict.dict bằng tên của file từ điển tương ứng.
    
    BOOL CXDictDlg::GetMeaning (){
    
        CFile f;
    
        CString meaning='';
    
        if (f.Open('mydic.dict',CFile::modeRead) == FALSE) {
    
             meaning = 'Can not open database file!';
    
    } else {
    
          CString sOffLen;
    
          m_worddata.GetText(m_wordlist.GetCurSel(),sOffLen);
    
          int pos = sOffLen.Find('\t',0);
    
          CString sOff = sOffLen.Left(pos);
    
          CString sLen = sOffLen.Right(sOffLen.GetLength()-pos-1);
    
          int iOff = GetDemicalValue(sOff);
    
          int iLength = GetDemicalValue(sLen);
    
          int temp = f.Seek(iOff,CFile::begin);
    
          char buff[64];
    
          DWORD dwRead;
    
          do {
    
             if (iLength>=64)
    
               dwRead = f.Read(buff,64);
    
         else
    
              dwRead = f.Read(buff,iLength);
    
              iLength -= dwRead;
    
              CString stemp = buff;
    
              stemp = stemp.Left(dwRead);
    
              meaning += stemp;
    
         }while (iLength>0);
    
          f.Close();
    
    }
    
    meaning = ChangeStyle(meaning);
    
    CString strHtml('');
    
    strHtml += '<html>\n<head>\n';
    
    strHtml += '<meta http-equiv=\'Content-Type\' content=\'text/html; charset=utf-8\'>\n';
    
    strHtml += '</head>\n<body>\n';
    
    strHtml += meaning + '\n</body>\n</html>';
    
    CFile f2;
    
    if (f2.Open('temp.htm',CFile::modeCreate | CFile::modeWrite) == FALSE){
    
             MessageBox('Cannot write meaning file!','Error!');
    
             return 0;
    
    }
    
    f2.Write(strHtml,strHtml.GetLength());
    
    f2.Close();
    
    return 1;
    
    }
    
    • Hiển thị nghĩa của từ, bạn cài đoạn mã này vào sự kiện DoubleClick của điều khiển list box.
    
    BOOL gm = GetMeaning();
    
    if (gm){
    
           m_wordlist.GetText(m_wordlist.GetCurSel(),m_word);
    
           UpdateData(FALSE);
    
              // Lay duong dan cua thu muc hien thoi
    
           DWORD cchCurDir;
    
           LPTSTR lpszCurDir;
    
           TCHAR buffer[MAX_PATH];
    
            lpszCurDir = buffer;
    
          GetCurrentDirectory(cchCurDir, lpszCurDir);
    
          CString str = lpszCurDir;
    
          str = 'file://'+str+'\\temp.htm';
    
    //Hien thi nghia cua tu
    
    m_wordmean.Navigate
    
    (str,NULL,NULL,NULL,NULL);
    
    }else {
    
          MessageBox('Can't get the meaning of the word');
    
    }
    
    • Tìm kiếm từ trong list box tương ứng với sự thay đổi trong từ nhập trong điều khiển Edit. Bạn cài đặt phần mã này vào sự kiển EN_CHANGE của điều khiển Edit. Như vậy mỗi khi bạn đánh 1 ký từ vào điều khiển Edit, chương trình sẽ tự động tìm một từ gần giống nhất trong danh sách các từ.
    
    UpdateData(TRUE);
    
    m_wordlist.SelectString(-1,m_word);
    
    Sau khi xây dựng thành công, chương trình sẽ có giao diện như hình.
    
    Trên đây, tôi đã trình bày cách thức xây dựng một ứng dụng từ điển đơn giản. Với những sáng tạo và các kiến thức đã có, bạn hoàn toàn có thể bổ sung những khả năng mới cho ứng dụng từ điển này để nó không thua kém các phần mềm từ điển thương mại. Ngoài ra, với một format từ điển khá đơn giản như trên, bạn có thể dễ dàng xây dựng thêm một ứng dụng nữa để tạo từ điển mới một cách tự động.
    
    Tôi cũng xin giới thiệu cho bạn một số địa chỉ các phần mềm có sử dụng các bộ từ điển theo chuẩn của DICT.ORG để các bạn tham khảo thêm:
    
    • Trang Web của Hồ Ngọc Đức, www.informatik.uni-leipzig.de/~duc/Dict/, tại đây bạn có thể tra từ điển trực tuyến hoặc download ứng dụng viết bằng Java và các file từ điển để chạy trực tiếp trên máy.
    
    o PowerClick, www.ttdomain.net/ttdownload. Phần mềm đã được giới thiệu trên TGVT - PCW VN A 7/2004, có khả năng tra theo kiểu Click and See trên một số ứng dụng.
    
    • E-lexicon, www.edusoft.com.vn. Phần mềm đã được giới thiệu trên TCVT - PCW VN A 7/2004, làm việc theo mô hình Client - Server.
    
    • MultiDictionary, http://huybien.vze.com/. Ứng dùng đa từ điển, giao diện đẹp, có khả năng phát âm các tiếng Anh, Nga, Pháp, Đức.
    
    Chúc các bạn thành công và hài lòng với ứng dụng từ điển của mình.
    
    Trần Bình An
    b_v_a_l@yahoo.com
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    No Avatar
    lychailon Khách

    Trích dẫn Nguyên bản được gửi bởi athaygiao Xem bài viết
    Chào các bác. Em chỉ là Newbie thôi, Sinh viên năm thứ hai nhưng cũng ham mê tìm tòi. Em đang mò trên VC++ 6 thấy khá là hay. Em đang thiết kế 1 cuốn từ điển, làm thấy hay nhưng mà mắc quá. Cái phần thiết kế các đối tượng trong đó cứ mắc linh tinh.
    Ý tưởng đơn giản như sau:
    -Tra từ anh việt, việt - anh.
    -NGười dùng có thể thêm từ mới.
    Nếu bác là một nhà phân tích hệ thống bác bảo em phải bắt đầu thế nào? Thật sự là em đang rối về việc phân tích đối tượng vì lần đầu viết phần mềm mà. Các bác có kinh nghiệm chỉ em cách phân tích các lớp và lớp kế thừa, cái nào kế thừa cái nào. Em xin cảm ơn....
    ----------------
    Đặt câu hỏi đúng để tìm ra được câu trả lời hay ! Các đối tượng thường là các danh từ trong đề bài.

    Ý tưởng đơn giản như sau:
    -Tra từ anh việt, việt - anh.
    -NGười dùng có thể thêm từ mới.

    Vậy là ít nhất tìm thấy 3 đối tượng : Từ Anh, Từ Việt, Từ Mới.

    Sau khi tìm thấy các đối tượng mức sơ cấp , ta lại tìm các điểm chung, riêng của chúng để đánh giá lần nữa.

    3 đối tượng tìm thấy được có cái chung là : Từ.

    Tiếp tục tìm các đặc điểm của các đối tượng : gồm có các thuộc tính, tính chất gì, có các hành động nào ( dùng phép nhân hóa ).

    Từ : tính từ, động từ, danh từ,....

    Muốn tìm đúng , đủ các thuộc tính thì phải nhờ các chuyên gia hay ai đó làm công việc có liên quan tới đối tượng mà ta làm việc, trao đổi với họ để tìm ra các đặc điểm mà mình cần.

    Nếu đây là bài thiết kế csdl thì tui đã tìm được 3 bảng: TừAnh(index, Từ), TừViệt( index, Từ). TừLoại(index, PhanLoai).

  4. #4
    No Avatar
    athaygiao Khách

    Cảm ơn 2 bác Dreaminess và lychailon
    Em sẽ cố gắng.
    Theo phân tích của bác lychailon tức là mình phải xây dụng một lớp là:
    Từ loại
    Sau đó xây dựng 3 lớp từ là từ tiếng an,từviệt,từ mới là các lớp kế thừa của lớp từ
    Em sẽ lưu bằng danh sách liên kết đúng không ạ.
    Nhưng mà xin hỏi là mình có thể sử dụng sẵn data của các cuốn từ điển khác như Lạc Việt,... không ạ!

  5. #5
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Trích dẫn Nguyên bản được gửi bởi athaygiao Xem bài viết
    Cảm ơn 2 bác Dreaminess và lychailon
    Em sẽ cố gắng.
    Theo phân tích của bác lychailon tức là mình phải xây dụng một lớp là:
    Từ loại
    Sau đó xây dựng 3 lớp từ là từ tiếng an,từviệt,từ mới là các lớp kế thừa của lớp từ
    Em sẽ lưu bằng danh sách liên kết đúng không ạ.
    Nhưng mà xin hỏi là mình có thể sử dụng sẵn data của các cuốn từ điển khác như Lạc Việt,... không ạ!
    Mình xin giúp bạn 1 ý tưởng để xây dựng từ điển, về cách tổ chức từ điển thì bạn nên xây dựng cấu trúc dữ liệu dạng bảng băm (cụ thể ở đây là bảng băm biểu diễn bằng DSLK), như thế tốc độ tìm kiếm sẽ nhanh hơn.

  6. #6
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định [VC++]Cùng nhau làm một cuốn tử điển chơi!

    Đầy phần mềm từ điển ra đấy rồi, làm làm chi cho mệt, cái này chỉ khó ở chỗ xây dựng dữ liệu về từ thôi, ai có 1 dữ liệu đầy đủ nào
    Life:\> dir

  7. #7
    No Avatar
    athaygiao Khách

    Trích dẫn Nguyên bản được gửi bởi hoanglinh9466 Xem bài viết
    Đầy phần mềm từ điển ra đấy rồi, làm làm chi cho mệt, cái này chỉ khó ở chỗ xây dựng dữ liệu về từ thôi, ai có 1 dữ liệu đầy đủ nào
    Em muốn tự viết 1 cuốn mà!

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

    Chào bạn athaygiao mình đoán bạn đang phải làm bài tập lớn C++ phải không đưa bài lên đây để hỏi tốt quá rồi. Diễn đàn này quá nhiều cao thủ, mình cũng đang làm một project dictionary và nhờ anh hàng xóm là lập trình viên có nhiều kinh nghiệm hướng dẫn nếu có gì hay mình sẽ xin chia sẻ cho tất cả mọi người CDCV.
    Trên đỉnh vinh quang không có dấu chân kẻ lười biếng

  9. #9
    No Avatar
    athaygiao Khách

    Trích dẫn Nguyên bản được gửi bởi Goliats Xem bài viết
    Chào bạn athaygiao mình đoán bạn đang phải làm bài tập lớn C++ phải không đưa bài lên đây để hỏi tốt quá rồi. Diễn đàn này quá nhiều cao thủ, mình cũng đang làm một project dictionary và nhờ anh hàng xóm là lập trình viên có nhiều kinh nghiệm hướng dẫn nếu có gì hay mình sẽ xin chia sẻ cho tất cả mọi người CDCV.
    Mình ko có ai hướng dẫn nên mới lên mạng. Cũng không đơn giản chút nào mà lịch thi các môn khác thì chồng chất. Mong các cao thủ chỉ giáo

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

    Mình có 1 ví dụ về từ điển làm trong DOS, các bạn down về thử nhé (tiếc là không có mã nguồn)
    http://www.zshare.net/download/dictionary-zip-fj3.html

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

  1. Cùng nhau đón tết ^^
    Gửi bởi hoang201222 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: 16-01-2013, 02:27 PM
  2. Lập trình C Sửa lỗi : Kiểm tra SNT cùng nhau
    Gửi bởi thao260694 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 30-11-2012, 11:06 PM
  3. Tại sao khi cùng 1 kiểu dữ liệu nhưng lại có số bit khác nhau
    Gửi bởi learntofly1 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 23-10-2012, 07:33 PM
  4. Trả lời: 1
    Bài viết cuối: 11-05-2012, 11:44 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