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: Từ điển đơn giản sử dụng bảng băm viết bằng C++

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

    Arrow Từ điển đơn giản sử dụng bảng băm viết bằng C++

    1) Đây là chương trình từ điển đơn giản, ứng dụng bảng băm và truy xuất file ngẫu nhiên, khi tra từ nào thì sẽ chỉ load những từ có chữ cái đầu trùng với từ tra mà thôi. Vd: Tra từ “apple” thì nó load hết file “A.txt” vào bảng băm, tra tiếp từ “ball” thì nó load tiếp “B.txt” vào bảng băm. Sau đó nó tìm trên bảng băm rồi in ra nghĩa của từ.

    2) Từ điển này đã chuẩn bị cơ sở dữ liệu là 26 file text tương ứng với 26 chữ cái, có lưu các record có kiểu là Record gồm 3 thành phần:
    a) Số thứ tự (OrderNumber) để chỉnh sửa từ và nghĩa của từ.
    b) Từ (word)
    c) Nghĩa (mean, viết ngắn lại từ meaning ^^)

    3) Đã có 2 file "A.txt" và "B.txt" có dữ liệu sẵn. Mỗi file gồm 12 từ. Hãy tra thử vài từ như "ant", "apple", "ball", ...

    4) Nếu muốn thêm cơ sở dữ liệu cho từ C, D, E, …, Z thì bạn dùng phần databaseOperation của chương trình. Nếu muốn xem file “A.txt” có những từ gì thì vào phần databaseOperation chọn “Create text file”. Lúc này trong thư mục sẽ hiện ra file “out.txt” có những từ trong file “A.txt”.

    5) Cả project đã được upload, down về là xài được.

    5) Nhập vào có lỗi gì thì nói cho em biết với (chương trình của em còn nhiều chỗ khó hiểu chỉ có em mới hiểu ^^). Mong nhận được sự góp ý của các anh và các bạn.

    Ghi chú: compiler VC++08, WindowsXP. No portable (Windows only).
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 08-07-2009 lúc 04:11 PM.

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Cái này rất hay, nếu khai thác được từ diển của lạc việt hoặc một từ điển nguồn mở nào khác thì tốt quá.

    Mong rằng trong thời gian tới mình sẽ học tập và phát triển nó hơn nữa.

  3. #3
    Ngày gia nhập
    10 2008
    Nơi ở
    sài gòn
    Bài viết
    422

    híc híc,đã làm trên VS2008 mà cậu không làm trên MFC luôn đi:(

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

    hic, tớ chưa học MFC. Cảm ơn nhé ^^!

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

    Down load về sao có chỗ này hơi lạ nhỉ :
    C++ Code:
    1. Record::Record(const Record &record);
    Cái này trong class Definition.
    Rất nhiều hàm pass copy của 1 object :
    C++ Code:
    1. void setWord(string wordz);
    Tại sao em không dùng const string& wordz ?
    Hàm này viết quá cẩu thả :
    C++ Code:
    1. void DictInterface::switchTask()
    2. {
    3.     int choice;
    4.  
    5.     do
    6.     {
    7.         instruction();
    8.         cout << "Enter your choice: ";
    9.         cin >> choice;
    10.         cin.ignore();
    11.  
    12.         switch( choice )
    13.         {
    14.             case 1:
    15.                 lookUp();
    16.                 break;
    17.  
    18.             case 2:
    19.                 updateDatabase();
    20.                 delay( 1 );
    21.                 break;
    22.  
    23.             case 3:
    24.                 break;
    25.  
    26.             default:
    27.                 continue;
    28.         }
    29.     }
    30.     while( choice != 3 );
    31. }
    - Khi user nhập sai 1 trong 3 lựa chọn, nhiệm vụ của nó chỉ là in ra lại thôi sao ? Vậy nếu anh không đọc code thì làm sao anh biết xài Dictionary của em ?
    - Khi anh chọn 1 loopUp -> nhập vào love -> nó báo "Couldn't open. There is error." ? Tại sao nhỉ ?
    - Hàm này :
    C++ Code:
    1. bool Dictionary::isBucketEmpty( int index ) const
    2. {
    3.     return heads[ index ] == sentinel;
    4. }
    Giả nếu index out of range thì sao đây em ?
    Chỗ này em gọi std::exit( 1 );
    C++ Code:
    1. if( !storeFile )
    2.     {
    3.         cout << "Couldn't open. There is error" << endl;
    4.         exit( 1 );
    5.     }
    Khi exit() nó sẽ gọi terminate() mà terminate gọi rồi thì tất cả automic local variable sẽ không bao giờ được gọi destructor->delete...etc -> 100% là cứ mỗi lần không mở thấy file là resource leak !!!
    Đã được chỉnh sửa lần cuối bởi rox_rook : 18-12-2008 lúc 02:33 PM.

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Arrow Reply

    1) Cái lỗi đầu em thấy đâu có sai đâu, sách nó viết copy constructor như vậy mà.

    2) Lỗi thứ 2 đúng là ẩu thật, em đã sửa.

    3) Lỗi thứ 3 em thêm dòng “Please enter again” trên ‘continue’. Anh tra từ “love” không có là do chưa có file “L.txt”, anh phải tạo ra file “L.txt” rồi nhập từ love và nghĩa của nó vào thông qua phần updateDatabase (Lưu ý là không nhập vào record thứ 10). Tại em lười tạo 26 file nên chỉ tạo ra file “A.txt” và “B.txt” trước thôi. Còn nếu có đủ 26 file thì không bao giờ hiện ra dòng “COULDN’T…”. Vì em đã bắt exception ở:
    Code:
    		cout << "Word needs searching: ";
    		cin.getline(word, A);
    		if(!isalpha(word[0]))
    			throw Exception("Must WORD\n");
    4) Lỗi thứ 4 không bao giờ xảy ra trong code này, vì nó được dùng ở 1 chỗ duy nhất mà chỗ này i chỉ chạy từ 0 đến M và mảng heads cũng là M phần tử. Dù có thay M (phải là số nguyên tố) bằng bao nhiêu thì nó cũng không “out of range” đâu.
    Code:
    	for(i = 0; i < M; i++)
    		if(searchKey % M == heads[i]->key)
    		{
    			p = heads[i];
    			break;
    		}
    	// if bucket is not empty, traverse ordered list
    	if(!isBucketEmpty(i))
    	...
    5) Mấy chỗ open file em đã sửa: nếu không thành công thì return 0. Còn chỗ này không biết làm sao, không thể return được vì đây là hàm dựng.
    Code:
    	
    Database::Database(string fileName)
    {
    	try
    	{
    		storeFile.open(fileName.c_str());
    		if(!storeFile)
    			throw logic_error("COULDN'T OPEN FILE\n");	
    		cout << "File: " << static_cast<char>(toupper(fileName[0])) << ".txt\n\n";
    	}
    	catch(logic_error &error)
    	{
    		cout << error.what() << endl;
    		exit(1); // chỗ này không exit thì làm sao bây giờ T.T
    	}
    }
    Để tra thử thành công, anh nhập thử từ "ant" xem, nó ra là "con kiến" ^^

    Link download đã update.
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 18-12-2008 lúc 08:29 PM.

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

    3) Lỗi thứ 3 em thêm dòng “Please enter again” trên ‘continue’. Anh tra từ “love” không có là do chưa có file “L.txt”, anh phải tạo ra file “L.txt” rồi nhập từ love và nghĩa của nó vào thông qua phần updateDatabase (Lưu ý là không nhập vào record thứ 10). Tại em lười tạo 26 file nên chỉ tạo ra file “A.txt” và “B.txt” trước thôi. Còn nếu có đủ 26 file thì không bao giờ hiện ra dòng “COULDN’T…”. Vì em đã bắt exception ở:
    Khi anh đọc instructor của em, nó có nói cho anh biết không nhỉ ? Mỗi lần anh chạy code của em anh phải post hỏi em tại sao không chạy à ! Tập viết robost-code và bug-free.
    - Validate input của em là khá lỏng lẻo, tại sao anh nói như vậy ? Khi em yêu cầu nhập vào 1-2-3 nếu anh nhập vào 1 char or string -> game-over -> validate input đâu ?
    - Anh đọc code em tới class Dictionary anh tá hỏa vì cách mà em dùng pointer là quá sức sexy !
    Class Node của em nhập vào 1 con trỏ không phải const -> em làm thế này để làm gì ? Nói idea tại sao em dùng như vậy ? Có thể anh hiểu sai ý em nhưng đối với anh, constructor always take a value as "const", có lý do gì construct dữ liệu cho thuộc tính mà cần chỉnh sữa dữ liệu ?
    Và nó dẫn tới :
    C++ Code:
    1. Node* search( Record* recordz );
    2. void  load( Record* recordz );
    3. void  insert( Record* recordz );
    Cả 3 thằng này không thể nhận vào const !!! Tại sao insert 1 dữ liệu và search, hoặc load 1 dữ liệu phải cần modify dữ liệu ? Anh không hiểu ý tưởng design này của em.
    - Ý tưởng design thứ 2 mà em mắc sai lầm là làm cho Node và Record tightly coupling, em nên để 1 class List template handle bất kì loại dữ liệu nào và Record sẽ là 1 kiểu của nó. Vì sao phải như vậy ? Vì giả nếu em cần chỉnh sữa 1 phiên bản mới của Record -> em phải chỉnh sữa toàn bộ class Node -> no reusable idea here ! 2 class này phụ thuộc vào nhau là không đúng.
    - Dùng linklist cho look-up, search và delete frequently là quá tồi, binary-tree hay AVL-tree should be a better choice here.
    1) Cái lỗi đầu em thấy đâu có sai đâu, sách nó viết copy constructor như vậy mà.
    Em đọc từ sách nào viết thì post cho anh xem, scope resolution trong class definition thì anh mới thấy lần đầu, g++ của anh không cho xài như vậy, em có chắc Visual C++ làm như vậy được không ?
    C++ Code:
    1. void DictInterface::delay(time_t n)
    Delay nên là global function hoặc static func hoặc func của class Utility, tại sao DictInterface lại có thêm delay làm gì trong khi nó chẳng liên quan gì đến class này cả.
    - Exception của em :
    C++ Code:
    1. Database::Database( const string& fileName )
    2. {
    3.     storeFile.open( fileName.c_str() );
    4.     if( !storeFile )
    5.         throw logic_error( "COULDN'T OPEN FILE\n" );
    6. }
    Constructor sẽ throw exception đúng chưa ? Now watch :
    C++ Code:
    1. try
    2.     {
    3.         cout << "Alphabet you need to update: ";
    4.         cin >> alphabet;
    5.         if(isdigit(alphabet))
    6.             throw Exception("Must ALPHABET\n");
    7.  
    8.         fileName[0] = alphabet;
    9.         db = new Database(fileName);
    10.         db->instruction();
    11.         db->switchAction();
    12.         delete db;
    13.     }
    14.     catch(Exception &error)
    15.     {
    16.         cout << error.what() << endl;
    17.     }
    -> nếu db = new Databse( fileName ); throw exception -> điều gì xảy ra ? Khi constructor của 1 class chưa hoàn thành( reach the } bracket ) thì destructor của class đó sẽ không bao giờ được gọi -> nó sẽ gọi ngay terminate -> và thằng này gọi tiếp abort() và "program của em" end in dead -> dòng này sẽ không bao giờ được chạm tới delete db;
    Đã được chỉnh sửa lần cuối bởi rox_rook : 19-12-2008 lúc 09:28 AM.

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

    Em nó mới học code mà RR bắt vậy nó tẩu hỏa nhập ma mất, từ từ chỉnh dần thôi em. Với lại, có một số cái, OS lo dọn dẹp cho em khi ct end hoặc bị bóp cổ chết bất tử.
    Hồi xưa, khi anh review code của các coder trong team anh, tui nó la làng: anh N. khắt khe quá. Vậy mà sau này, khi anh đã nghỉ việc, tụi nó gặp anh lại cảm ơn anh, nhờ anh mà tui em mới khá lên. Giờ tui nó review code của các mem mới càng khó, khắt khe hơn nữa. Bây giờ thì đám cn cơ khí của anh la làng với anh: khó, khắt khe, 100%. Nhờ vậy mà máy móc bớt hư vặt, chạy ổn định đấy em à.
    Lúc anh mới vào cty, có một quan niệm cực kỳ sai lầm là code thì ai viết cũng được, viết sao cũng được, miễn chạy được, đúng yêu cầu về tiến độ, thời gian cho khách hàng là được. Chính vì vậy mà các project bug tùm lum, fix từ năm này qua năm khác, nhìn code là nãn, xóa, comment thêm bớt tá lã. Từ từ rồi mới có được suy nghỉ trong cty anh: code kỹ, cẩn thận, bug free, robot, rock... đánh sao cũng không sụm.
    Trong mắt anh, tới bây giờ, thằng coder vẫn có giá trị hơn thằng team leader, PM: chỉ giỏi nói, bốc phét, mail, document bậy bạ, chả được trò trống gì. Lúc nào mở miệng ra cũng công nghệ mới này, mới nọ, chỉ toàn cưỡi ngựa xem hoa, chả nắm sâu được chút nào cả.
    Đã được chỉnh sửa lần cuối bởi TQN : 19-12-2008 lúc 10:41 AM.

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

    Em nó mới học code mà RR bắt vậy nó tẩu hỏa nhập ma mất, từ từ chỉnh dần thôi em.
    T_T Dạ em hiểu rồi, em không có ý gì cả, em bắt lỗi trên ý nghĩa tích cực mà , tại em mới thi xong nên có hứng quá nên đọc cho kĩ thì thấy có nhiều chỗ như vậy nên em mới... hì hì T_T. Với lại em nghĩ làm cái gì cũng nên làm cho hoàn chỉnh, kĩ lưỡng thì học được nhiều hơn đó anh vì anh có nhớ lúc xưa em viết cái class số binary cho 1 tên nào đó không, em cứ nôn cho nó chạy ra kết quả trong khi mấy yếu tố phụ thì chẳng để ý.
    - Dù gì lâu rồi cũng không gặp anh ! Chúc anh cuối năm nhiều sức khỏe ạ !

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

    1) Lớp Record và Node em không có ý định reuse nó. Vì nó chỉ dùng cho từ điển này thôi.

    2) Tại em chỉ muốn chạy một file là Driver.cpp nên để cả định nghĩa hàm thành viên mỗi lớp vào nguyên mẫu lớp thành 1 file header luôn cho gọn.

    3) Cái gì const được, em const hết rồi.

    4) Em đã cho hàm delay vào Utility, đã bắt exception ở chỗ Enter choice, anh Rook thử nhập sai xem ^^. Chỉ còn 1 chỗ new Database không biết throw catch thế nào T.T. Chỗ đó khó chịu quá, chưa gặp bao giờ.

    5) Vì mới học xong bảng băm nên em chỉ xài bảng băm để làm thôi, còn AVL thì mai mốt tính, em sắp thi rồi T.T.

    link updated

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

  1. Code từ điển đơn giản bằng bảng băm bằng C++ muốn đổi sang C
    Gửi bởi winandworld trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 21-11-2016, 01:44 PM
  2. Code C đề tài Từ điển đơn giản sử dụng bảng băm viết bằng C
    Gửi bởi hoatxitin trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 21-05-2013, 12:40 AM
  3. 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
  4. Làm sao kết hợp bảng băm và cây AVL để viết từ điển
    Gửi bởi kidqn trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 2
    Bài viết cuối: 06-08-2010, 07:15 PM
  5. Viết Chương trình từ­ Điển dùng Bảng Băm (mọi người giúp mình với nha)
    Gửi bởi hoainam11211 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: 30-09-2009, 10:34 PM

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