Chiều sâu C++

Hướng dẫn về ngôn ngữ C++

Các phần đầu của hướng dẫn này trình bày về nội dung cơ bản đã trình bày trong hai học phần cuối, đồng thời cung cấp thêm thông tin về các khái niệm nâng cao. Trong mô-đun này, chúng ta sẽ tập trung vào bộ nhớ động cùng thông tin chi tiết khác về các đối tượng và lớp. Chúng tôi cũng ra mắt một số chủ đề nâng cao, chẳng hạn như tính kế thừa, tính đa hình, mẫu, ngoại lệ và không gian tên. Chúng ta sẽ nghiên cứu những điều này sau trong khoá học C++ nâng cao.

Thiết kế hướng đối tượng

Đây là một hướng dẫn tuyệt vời về thiết kế hướng đối tượng. Chúng tôi sẽ áp dụng phương pháp được trình bày tại đây trong dự án của học phần này.

Tìm hiểu qua ví dụ 3

Trong học phần này, chúng ta sẽ tập trung vào việc thực hành thêm về con trỏ, thiết kế hướng đối tượng, mảng đa chiều và lớp/đối tượng. Hãy xem các ví dụ sau. Chúng ta chưa thể nhấn mạnh đủ rằng chìa khoá để trở thành một lập trình viên giỏi là thực hành, thực hành và thực hành!

Bài tập số 1: Thực hành thêm với con trỏ

Nếu bạn cần thực hành thêm về con trỏ, hãy đọc tài nguyên này, trong đó đề cập mọi khía cạnh của con trỏ và nhiều ví dụ về chương trình.

Kết quả của chương trình sau đây là gì? Vui lòng không chạy chương trình mà hãy vẽ hình ảnh bộ nhớ để xác định kết quả.

void Unknown(int *p, int num);
void HardToFollow(int *p, int q, int *num);

void Unknown(int *p, int num) {
  int *q;

  q = #
  *p = *q + 2;
  num = 7;
}

void HardToFollow(int *p, int q, int *num) {
  *p = q + *num;
  *num = q;
  num = p;
  p = &q;
  Unknown(num, *p);
}

main() {
  int *q;
  int trouble[3];

  trouble[0] = 1;
  q = &trouble[1];
  *q = 2;
  trouble[2] = 3;

  HardToFollow(q, trouble[0], &trouble[2]);
  Unknown(&trouble[0], *q);

  cout << *q << " " << trouble[0] << " " << trouble[2];
}

Sau khi bạn xác định được kết quả theo cách thủ công, hãy chạy chương trình để xem bạn có chính xác không.

Bài tập số 2: Thực hành thêm với lớp và đối tượng

Nếu bạn cần thực hành thêm với các lớp và đối tượng, thì đây là tài nguyên cho thấy quá trình triển khai 2 lớp nhỏ. Dành thời gian để thực hiện các bài tập thể dục.

Bài tập số 3: Mảng đa chiều

Hãy cân nhắc chương trình sau: 

const int kStudents = 25;
const int kProblemSets = 10;

// This function returns the highest grade in the Problem Set array.
int get_high_grade(int *a, int cols, int row, int col) {
  int i, j;
  int highgrade = *a;

  for (i = 0; i < row; i++)
    for (j = 0; j < col; j++)
      if (*(a + i * cols + j) > highgrade)  // How does this line work?
        highgrade = *(a + i*cols + j);
  return highgrade;
}

int main() {
 int grades[kStudents][kProblemSets] = {
   {75, 70, 85, 72, 84},
   {85, 92, 93, 96, 86},
   {95, 90, 83, 76, 97},
   {65, 62, 73, 84, 73}
 };
 int std_num = 4;
 int ps_num = 5;
 int highest;

 highest = get_high_grade((int *)grades, kProblemSets, std_num, ps_num);
 cout << "The highest problem set score in the class is " << highest << endl;

 return 0;
}

Có một dòng trong chương trình được đánh dấu là "Dòng này hoạt động như thế nào?" – bạn có thể tìm ra không? Đây là phần giải thích của chúng tôi.

Viết một chương trình khởi chạy một mảng 3 độ mờ và điền giá trị chiều thứ 3 bằng tổng của cả ba chỉ mục. Đây là giải pháp của chúng tôi.

Bài tập số 4: Ví dụ về thiết kế OO mở rộng

Sau đây là ví dụ chi tiết về thiết kế hướng đối tượng, trong toàn bộ quy trình từ đầu đến cuối. Mã hoàn thiện được viết bằng ngôn ngữ lập trình Java, nhưng bạn sẽ có thể đọc qua mã đó dựa trên những gì bạn đã thực hiện.

Hãy dành thời gian để xem xét toàn bộ ví dụ này. Đây là một hình minh hoạ tuyệt vời về quy trình này và các công cụ thiết kế hỗ trợ quy trình này.

Kiểm thử đơn vị

Giới thiệu

Kiểm thử là một phần quan trọng trong quy trình kỹ thuật phần mềm. Kiểm thử đơn vị là một loại kiểm thử cụ thể, nhằm kiểm tra chức năng của một mô-đun mã nguồn nhỏ và đơn lẻ.Quá trình kiểm thử đơn vị luôn do kỹ sư thực hiện và thường được thực hiện cùng lúc khi họ lập trình mô-đun. Các trình điều khiển kiểm thử bạn dùng để kiểm thử các lớp Composer và Cơ sở dữ liệu là ví dụ về kiểm thử đơn vị.

Kiểm thử đơn vị có các đặc điểm sau. Chúng...

  • kiểm thử một thành phần riêng biệt
  • mang tính tất định
  • thường ánh xạ vào một lớp
  • tránh phụ thuộc vào tài nguyên bên ngoài, ví dụ: cơ sở dữ liệu, tệp, mạng
  • thực thi nhanh
  • có thể chạy theo thứ tự bất kỳ

Các tổ chức kỹ thuật phần mềm lớn có các khung và phương pháp tự động để hỗ trợ và đảm bảo tính nhất quán cho quá trình kiểm thử đơn vị. Có một số khung kiểm thử đơn vị nguồn mở tinh vi mà chúng ta sẽ tìm hiểu về sau trong bài học này. 

Các thử nghiệm xảy ra trong quá trình thử nghiệm đơn vị được minh hoạ dưới đây.

Lý tưởng nhất là chúng tôi sẽ kiểm tra những nội dung sau:

  1. Giao diện mô-đun được kiểm thử để đảm bảo thông tin được đưa vào và ra một cách chính xác.
  2. Cấu trúc dữ liệu cục bộ được kiểm tra để đảm bảo lưu trữ dữ liệu đúng cách.
  3. Các điều kiện giới hạn được kiểm thử để đảm bảo mô-đun hoạt động đúng cách tại những ranh giới hạn chế hoặc hạn chế việc xử lý.
  4. Chúng tôi kiểm thử các đường dẫn độc lập thông qua mô-đun để đảm bảo mỗi đường dẫn và theo đó mỗi câu lệnh trong mô-đun được thực thi ít nhất một lần. 
  5. Cuối cùng, chúng ta cần kiểm tra xem lỗi có được xử lý đúng cách hay không.

Mức độ bao phủ của mã

Trên thực tế, quy trình kiểm thử không thể đạt được "mức độ sử dụng mã" hoàn chỉnh. Mức độ sử dụng mã là một phương thức phân tích giúp xác định phần nào của hệ thống phần mềm đã được bộ trường hợp kiểm thử thực thi (bao gồm) và phần nào chưa được thực thi. Nếu cố gắng đạt được mức độ sử dụng 100%, chúng ta sẽ dành nhiều thời gian viết mã kiểm thử đơn vị hơn là viết mã thực tế! Hãy cân nhắc việc tạo bài kiểm thử đơn vị cho tất cả đường dẫn độc lập của các đường dẫn sau. Điều này có thể nhanh chóng trở thành một vấn đề theo cấp số nhân.

Trong sơ đồ này, các đường màu đỏ không được kiểm thử, còn các đường không có màu sẽ được kiểm thử.

Thay vì cố gắng đạt được mức độ sử dụng 100%, chúng tôi tập trung vào các thử nghiệm giúp tăng niềm tin rằng mô-đun đang hoạt động đúng cách. Chúng tôi kiểm thử những nội dung như:

  • Trường hợp rỗng
  • Kiểm thử theo phạm vi, ví dụ: kiểm thử giá trị dương/âm
  • Trường hợp hiếm
  • Các trường hợp lỗi
  • Kiểm thử các đường dẫn có nhiều khả năng thực thi nhất

Khung kiểm thử đơn vị

Hầu hết các khung kiểm thử đơn vị đều sử dụng câu nhận định để kiểm thử các giá trị trong quá trình thực thi một đường dẫn. Xác nhận là các câu lệnh kiểm tra xem một điều kiện có đúng hay không. Kết quả của câu nhận định có thể là thành công, lỗi không nghiêm trọng hoặc lỗi nghiêm trọng. Sau khi thực hiện xác nhận, chương trình sẽ tiếp tục bình thường nếu kết quả thành công hoặc không nghiêm trọng. Nếu xảy ra lỗi nghiêm trọng, thì hàm hiện tại sẽ bị huỷ.

Các bài kiểm thử bao gồm mã thiết lập trạng thái hoặc thao tác với mô-đun của bạn, cùng với một số câu nhận định xác minh kết quả dự kiến. Nếu tất cả các câu nhận định trong một kiểm thử đều thành công (nghĩa là trả về đúng giá trị) thì kiểm thử sẽ thành công; nếu không thì kiểm thử sẽ không thành công.

Mỗi trường hợp kiểm thử chứa một hoặc nhiều hoạt động kiểm thử. Chúng tôi nhóm các bài kiểm thử thành các trường hợp kiểm thử phản ánh cấu trúc của mã được kiểm thử. Trong khoá học này, chúng ta sẽ dùng CPPUnit làm khung kiểm thử đơn vị. Với khung này, chúng ta có thể viết mã kiểm thử đơn vị bằng C++ và chạy tự động, đưa ra một báo cáo về việc kiểm thử thành công hay thất bại.

Cài đặt CPPUnit

Tải mã CPPUnit xuống từ SourceForge. Tìm một thư mục thích hợp và đặt tệp tar.gz vào đó. Sau đó, hãy nhập các lệnh sau (trong Linux, Unix), thay thế tên tệp cppunit thích hợp:

gunzip filename.tar.gz
tar -xvf filename.tar

Nếu đang làm việc trên Windows, bạn có thể phải tìm một tiện ích để trích xuất các tệp tar.gz. Bước tiếp theo là biên dịch thư viện. Thay đổi thành thư mục cppunit. Ở đó có tệp INSTALL cung cấp hướng dẫn cụ thể. Thông thường, bạn cần chạy:

./configure
make install

Nếu bạn gặp sự cố, hãy tham khảo tệp INSTALL. Các thư viện thường nằm trong thư mục cppunit/src/cppunit. Để kiểm tra xem quá trình biên dịch có hoạt động hay không, hãy chuyển đến thư mục cppunit/examples/simple và nhập "make". Nếu mọi thứ đều biên dịch được thì nghĩa là bạn đã hoàn tất.

Bạn có thể tham khảo một hướng dẫn rất hữu ích tại đây. Vui lòng xem hướng dẫn này và tạo lớp số phức cũng như các chương trình kiểm thử đơn vị liên quan. Có một số ví dụ bổ sung trong thư mục cppunit/examples.

Tại sao tôi phải làm việc này?

Việc kiểm thử đơn vị là cực kỳ quan trọng trong ngành vì một số lý do. Bạn đã quen thuộc với một lý do: Chúng ta cần có cách nào đó để kiểm tra công việc trong khi phát triển mã. Ngay cả khi đang phát triển một chương trình rất nhỏ, chúng tôi theo bản năng sẽ viết một số loại trình kiểm tra hoặc trình điều khiển để đảm bảo chương trình của chúng tôi hoạt động như mong đợi.

Với kinh nghiệm lâu năm, các kỹ sư biết rằng cơ hội để một chương trình hoạt động được trong lần thử đầu tiên là rất nhỏ. Hoạt động kiểm thử đơn vị được xây dựng dựa trên ý tưởng này bằng cách tạo các chương trình kiểm thử có tính năng tự kiểm tra và lặp lại. Các câu nhận định này thay thế cho kết quả kiểm tra đầu ra theo cách thủ công. Ngoài ra, do kết quả kiểm thử cũng dễ diễn giải (kiểm thử thành công hoặc không thành công), nên bạn có thể chạy các bài kiểm thử nhiều lần, tạo ra một lưới an toàn giúp mã của bạn dễ thay đổi hơn.

Hãy đặt điều này một cách cụ thể: Khi bạn gửi mã hoàn chỉnh của mình vào CVS lần đầu tiên, mã sẽ hoạt động hoàn hảo. Và nó tiếp tục hoạt động hoàn hảo trong một thời gian. Sau đó, một ngày, có người khác thay đổi mã của bạn. Sớm hay muộn thì sẽ có người phá mã của bạn. Bạn có cho rằng họ sẽ tự chú ý không? Không có khả năng. Tuy nhiên, khi bạn viết chương trình kiểm thử đơn vị, có những hệ thống có thể tự động chạy chúng mỗi ngày. Đây được gọi là các hệ thống tích hợp liên tục. Vì vậy, khi kỹ sư đó X làm hỏng mã của bạn, hệ thống sẽ gửi những email không phù hợp cho họ cho đến khi họ khắc phục được lỗi đó. Kể cả khi kỹ sư X là BẠN!

Ngoài việc giúp bạn phát triển phần mềm và sau đó giữ cho phần mềm đó an toàn khi có thay đổi, kiểm thử đơn vị:

  • Tạo một thông số kỹ thuật thực thi và tài liệu luôn đồng bộ với mã. Nói cách khác, bạn có thể đọc một bài kiểm thử đơn vị để tìm hiểu về hành vi mà mô-đun hỗ trợ.
  • Giúp bạn tách biệt các yêu cầu với việc triển khai. Vì bạn đang xác nhận hành vi dễ thấy bên ngoài, nên bạn có cơ hội suy nghĩ về hành vi đó một cách rõ ràng thay vì kết hợp các ý tưởng về cách triển khai hành vi đó.
  • Hỗ trợ thử nghiệm. Nếu bạn có lưới an toàn để cảnh báo khi bạn phá vỡ hành vi của một mô-đun, có nhiều khả năng bạn sẽ thử và định cấu hình lại thiết kế của mình.
  • Cải thiện thiết kế của bạn. Thông thường, việc viết chương trình kiểm thử đơn vị kỹ lưỡng yêu cầu bạn phải tăng khả năng kiểm thử mã. Mã có thể kiểm thử thường là mã mô-đun hơn so với mã không thể kiểm thử.
  • Đảm bảo chất lượng cao. Một lỗi nhỏ trong hệ thống quan trọng có thể khiến công ty mất hàng triệu đô la hoặc thậm chí là mất niềm tin hoặc sự hài lòng của người dùng. Mạng lưới an toàn mà các bài kiểm thử đơn vị cung cấp sẽ làm giảm khả năng này. Bằng cách phát hiện lỗi sớm, họ cũng giúp nhóm đảm bảo chất lượng dành thời gian xử lý các tình huống lỗi phức tạp và khó khăn hơn, thay vì báo cáo những lỗi rõ ràng.

Dành chút thời gian để viết kiểm thử đơn vị bằng CPPUnit cho ứng dụng cơ sở dữ liệu Composer. Hãy tham khảo thư mục cppunit/examples/ để được trợ giúp.

Cách Google hoạt động

Giới thiệu

Hãy tưởng tượng một nhà sư ở thời Trung cổ đang xem hàng nghìn bản thảo trong các kho lưu trữ của tu viện của mình.“Đây là bài hát của Aristotle ở đâu...”

thư viện đơn nhà

May mắn thay, các bản thảo được sắp xếp theo nội dung và được ghi chú bằng những ký hiệu đặc biệt để tạo điều kiện cho việc truy xuất thông tin trong mỗi bản thảo. Nếu không có cách sắp xếp như vậy, sẽ rất khó để tìm được bản thảo liên quan.

Hoạt động lưu trữ và truy xuất thông tin dạng văn bản từ các bộ sưu tập lớn được gọi là Truy xuất thông tin (IR). Hoạt động này ngày càng trở nên quan trọng qua nhiều thế kỷ, đặc biệt là với những phát minh như giấy và báo in. Trước đây, khu vực này từng là nơi chỉ có ít người ở. Tuy nhiên, hiện nay, có hàng trăm triệu người tham gia truy xuất thông tin mỗi ngày khi họ sử dụng công cụ tìm kiếm hoặc tìm kiếm trên máy tính.

Bắt đầu thu thập thông tin

chú mèo đội mũ

Tiến sĩ Seuss đã viết 46 cuốn sách cho trẻ em trong suốt 30 năm. Các cuốn sách của ông kể về mèo, bò và voi, về những ai, cười toe toét và con khủng long. Bạn có nhớ những sinh vật nào được nhắc đến trong câu chuyện nào không? Trừ phi bạn là cha mẹ, chỉ có trẻ em mới có thể cho bạn biết tập hợp các câu chuyện của Tiến sĩ Seuss về các sinh vật:

(COW và BEE) hoặc CROWS

Chúng tôi sẽ áp dụng một số mô hình truy xuất thông tin kiểu cũ để giúp giải quyết vấn đề này.

Một phương pháp hiển nhiên là brute force: Lấy tất cả 46 câu chuyện của Tiến sĩ Seuss và bắt đầu đọc. Đối với mỗi cuốn sách, hãy lưu ý xem(các) cuốn sách nào có chứa từ COW và BEE, đồng thời tìm những cuốn sách có chứa từ CROWS. Máy tính tốc độ nhanh hơn nhiều so với chúng ta. Nếu có tất cả văn bản trong sách của Tiến sĩ Seuss ở dạng kỹ thuật số, chẳng hạn như tệp văn bản, chúng ta có thể chỉ cần duyệt qua các tệp đó. Đối với một bộ sưu tập nhỏ như sách của Tiến sĩ Seuss, kỹ thuật này sẽ có hiệu quả.

Tuy nhiên, trong nhiều trường hợp, chúng tôi cần được hỗ trợ thêm. Ví dụ: việc thu thập tất cả dữ liệu hiện đang trực tuyến quá lớn nên grep không xử lý được. Ngoài ra, chúng tôi không chỉ muốn những tài liệu khớp với điều kiện của mình, mà chúng tôi đã quen với việc xếp hạng những tài liệu theo mức độ liên quan.

Một phương pháp khác ngoài grep là tạo chỉ mục của các tài liệu trong một tập hợp trước khi thực hiện tìm kiếm. Chỉ mục trong IR tương tự như chỉ mục ở mặt sau của một cuốn sách giáo khoa. Chúng tôi lập một danh sách tất cả các từ (hay thuật ngữ) trong mỗi câu chuyện của Tiến sĩ Seuss, bỏ các từ như "the", "and" và các giới từ, giới từ khác, v. v. (những từ này được gọi là từ dừng). Sau đó, chúng tôi trình bày thông tin này theo cách giúp người dùng dễ dàng tìm thấy các thuật ngữ và xác định tin bài chứa những thuật ngữ đó.

Một cách biểu diễn khả thi là ma trận gồm các tin bài ở trên cùng và các thuật ngữ được liệt kê ở mỗi hàng. Số "1" trong một cột cho biết cụm từ đó xuất hiện trong tin bài cho cột đó.

bảng sách và từ

Chúng ta có thể xem từng hàng hoặc cột dưới dạng vectơ bit. Vectơ bit của một hàng cho biết những tin bài mà cụm từ đó sẽ xuất hiện. Vectơ bit của một cột cho biết thuật ngữ nào sẽ xuất hiện trong câu chuyện.

Quay lại bài toán ban đầu:

(COW và BEE) hoặc CROWS

Chúng tôi lấy vectơ bit cho các thuật ngữ này và trước tiên thực hiện bit AND, sau đó thực hiện bit OR trên kết quả.

(100001 và 010011) hoặc 000010 = 000011

Câu trả lời: “Ông Brown Can Moo! Can You?” và “The Lorax”. Đây là hình minh hoạ về mô hình Truy xuất Boolean, là mô hình "khớp chính xác".

Giả sử chúng ta mở rộng ma trận để đưa mọi câu chuyện của Tiến sĩ Seuss và mọi thuật ngữ có liên quan vào các câu chuyện này. Ma trận sẽ tăng lên đáng kể và một quan trọng quan trọng là hầu hết các mục nhập sẽ bằng 0. Có thể ma trận không phải là cách biểu diễn tốt nhất cho chỉ mục. Chúng ta cần tìm cách để chỉ lưu trữ số 1.

Một số tính năng nâng cao

Cấu trúc dùng trong IR để giải quyết vấn đề này được gọi là chỉ số đảo. Chúng tôi lưu giữ một từ điển về các thuật ngữ, và sau đó đối với mỗi thuật ngữ, chúng tôi có một danh sách để ghi lại các tài liệu chứa thuật ngữ đó. Danh sách này được gọi là danh sách bài đăng. Danh sách được liên kết riêng sẽ rất phù hợp để thể hiện cấu trúc này như phần dưới đây.

Nếu chưa hiểu rõ về danh sách được liên kết, bạn chỉ cần tìm "danh sách được liên kết trong C++" trên Google. Bạn sẽ tìm thấy nhiều tài nguyên mô tả cách tạo danh sách cũng như cách sử dụng danh sách đó. Chúng ta sẽ tìm hiểu kỹ hơn về vấn đề này trong một học phần sau.

Xin lưu ý rằng chúng tôi sử dụng Mã tài liệu (DocIDs) thay vì tên câu chuyện. Chúng tôi cũng sắp xếp các DocID này để hỗ trợ quá trình xử lý truy vấn.

Chúng tôi xử lý một truy vấn như thế nào? Đối với bài toán ban đầu, trước tiên, chúng ta sẽ tìm danh sách bài đăng của COW, sau đó là danh sách bài đăng của BEE. Sau đó, chúng tôi "hợp nhất" chúng lại với nhau:

  1. Duy trì điểm đánh dấu trong cả hai danh sách và xem qua đồng thời hai danh sách bài đăng.
  2. Ở mỗi bước, hãy so sánh DocID được trỏ đến bởi cả hai con trỏ.
  3. Nếu hai giá trị giống nhau, hãy đặt DocID đó vào một danh sách kết quả, nếu không, hãy chuyển con trỏ trỏ đến tài liệu nhỏ hơn.

Dưới đây là cách chúng ta có thể tạo chỉ mục đảo ngược:

  1. Gán DocID cho mỗi tài liệu quan tâm.
  2. Đối với mỗi tài liệu, hãy xác định các thuật ngữ có liên quan (mã thông báo).
  3. Đối với mỗi từ khoá, hãy tạo một bản ghi bao gồm từ khoá, DocumentID nơi tìm thấy từ khoá và tần suất trong tài liệu đó. Xin lưu ý rằng có thể có nhiều bản ghi cho một cụm từ cụ thể nếu cụm từ đó xuất hiện trong nhiều tài liệu.
  4. Sắp xếp bản ghi theo từ khoá.
  5. Tạo từ điển và danh sách bài đăng bằng cách xử lý các bản ghi riêng lẻ cho một cụm từ, đồng thời kết hợp nhiều bản ghi cho các cụm từ xuất hiện trong nhiều tài liệu. Tạo danh sách được liên kết của các DocID (theo thứ tự được sắp xếp). Mỗi thuật ngữ cũng có một tần suất là tổng tần suất trên tất cả các bản ghi của một thuật ngữ.

Dự án

Tìm một số tài liệu văn bản thuần tuý dài để bạn có thể thử nghiệm. Mục đích của dự án là tạo một chỉ mục đảo ngược từ các tài liệu, bằng cách sử dụng các thuật toán được mô tả ở trên. Bạn cũng cần tạo một giao diện để nhập truy vấn và một công cụ để xử lý các truy vấn đó. Bạn có thể tìm thấy một đối tác dự án trên diễn đàn.

Sau đây là quy trình có thể thực hiện để hoàn thành dự án này:

  1. Điều đầu tiên cần làm là xác định chiến lược để xác định các thuật ngữ trong tài liệu. Lập một danh sách tất cả các từ dừng mà bạn có thể nghĩ ra và viết một hàm để đọc qua các từ trong tệp, lưu các từ khoá và loại bỏ các từ dừng. Có thể bạn sẽ phải thêm nhiều từ dừng hơn vào danh sách của mình trong quá trình xem xét danh sách các thuật ngữ của một vòng lặp.
  2. Viết các trường hợp kiểm thử CPPUnit để kiểm thử hàm và một tệp makefile để kết hợp mọi thứ cho bản dựng của bạn. Kiểm tra tệp của bạn trong CVS, đặc biệt là khi bạn đang làm việc với các đối tác. Bạn nên nghiên cứu cách mở thực thể CVS của mình cho các kỹ sư từ xa.
  3. Thêm quá trình xử lý để bao gồm cả dữ liệu vị trí, tức là tệp nào và một cụm từ nằm ở đâu trong tệp? Bạn có thể muốn tìm ra một phép tính để xác định số trang hoặc số đoạn.
  4. Viết các trường hợp kiểm thử CPPUnit để kiểm thử chức năng bổ sung này.
  5. Tạo chỉ mục đảo ngược và lưu trữ dữ liệu vị trí trong bản ghi của mỗi thuật ngữ.
  6. Viết thêm các trường hợp kiểm thử.
  7. Thiết kế một giao diện để cho phép người dùng nhập truy vấn.
  8. Sử dụng thuật toán tìm kiếm mô tả ở trên, xử lý chỉ mục đảo ngược và trả về dữ liệu vị trí cho người dùng.
  9. Hãy nhớ bao gồm cả các trường hợp kiểm thử cho phần cuối cùng này.

Như chúng tôi đã làm với tất cả các dự án, hãy sử dụng diễn đàn và tính năng trò chuyện để tìm các đối tác dự án và chia sẻ ý tưởng.

Tính năng bổ sung

Một bước xử lý phổ biến trong nhiều hệ thống IR được gọi là gốc. Ý tưởng chính của việc bắt nguồn từ gốc là người dùng tìm kiếm thông tin về "truy xuất" cũng sẽ quan tâm đến các tài liệu có thông tin chứa "truy xuất", "đã truy xuất", "truy xuất", v.v. Các hệ thống có thể dễ gặp lỗi do xuất phát từ gốc kém, vì vậy, việc này khá phức tạp. Ví dụ: người dùng quan tâm đến việc "truy xuất thông tin" có thể nhận được tài liệu có tiêu đề "Thông tin về chó Golden Retriever" do lấy từ gốc. Một thuật toán hữu ích cho việc trả về gốc là thuật toán Porter.

Ứng dụng: Đi mọi nơi!

Hãy xem ứng dụng của các khái niệm này tại Panoramas.dk.