Trần Lê Hùng Phi – Cấu trúc (Struct)

Giới thiệu

Các kiểu dữ liệu đã học qua như mảng và xâu giúp chúng ta thao tác trên dãy các số, chữ hay văn bản rất tốt. Nhưng chúng chi cho phép ta lưu trữ và xử lý các đối tượng cùng kiểu. Trong thực tế, các đối tượng mang nhiều thông tin khác nhau, mỗi thông tin này lại có một kiểu dữ liệu rất khác. Thầy lấy ví dụ thông tin về một cuốn sách gốm có:

Tựa đề

Tác giả

Năm xuất bản

Giá

Mã sách

Chương trình máy tính phải có khả năng lưu trữ được các thông tin trên vào một đối tượng gọi là sách. Hầu hết các ngôn ngữ lập trình đều có cách thức cho chúng ta làm việc này một cách dễ dàng. Trong C++, người ta dùng kiểu struct để định nghĩa dạng dữ liệu như vậy.

Khai báo struct

Cách 1: Khai báo trực tiếp

Struct [tên kiểu] {

thuộc tính 1: kiểu;

thuộc tính 2: kiểu;

thuôc tính 3: kiểu;

…..

thuộc tính n: kiểu;

};

Trong đó

Tên kiểu là tên tùy chọn do các em tự đặt để dùng về sau.

Các thuộc tính bên trong là các thông tin của một đối tượng, mỗi thông tin này có một kiểu riêng như int i, double j,….

Sau dấu mốc đóng nhớ có chấm phẩy “;”

Ví dụ sau đây khai báo một cấu trúc Books để mô tả thông tin các cuốn sách

  1. struct Books

  2. {

  3. char title[50];

  4. char author[50];

  5. char subject[100];

  6. int book_id;

  7. };

Lưu ý cấu trúc Books này chưa đựa cấp phát bộ nhớ và cũng không sử dụng được. Khi nào khai báo biến thuộc kiểu struct đó thì bộ nhớ mới cấp cho biến với kích thước bằng tổng các thuộc tính cộng lại. Và đương nhiên, mọi thao tác là thông qua biến.

ví dụ:

struct Books book1, book2;

Chúng ta vừa khai báo hai biến book1, book2 có kiểu Books và mọi thao tác trên struct Books chỉ có thể thông qua hai biến này.

Truy xuất vào thuộc tính của struct

Để truy xuất được vào từng thuộc tính của struct, ta dùng dấu chấm “.”

ví dụ:

book1.title;// truy xuất vào thuộc tính titil của book1

Sau khi đã biết cách truy xuất vào từng thuộc tính của một struct, thì mọi việc xử lý của nó tương tự như trên các biến đơn thông thường.

Ví dụ sau đây mô tả cách làm việc với với struct, với nhiệm vụ và gán thông tin vào hai quyển sách book1, book2 và in thông tin đó lên màn hình.

  1. #include <iostream>

  2. #include <cstring>

  3. using namespace std;

  4. struct Books

  5. {

  6. char title[50];

  7. char author[50];

  8. char subject[100];

  9. int book_id;

  10. };

  11. int main( )

  12. {

  13. struct Books Book1; // Declare Book1 of type Book

  14. struct Books Book2; // Declare Book2 of type Book

  15. // book 1 specification

  16. strcpy( Book1.title, “Learn C++ Programming”);

  17. strcpy( Book1.author, “Chand Miyan”);

  18. strcpy( Book1.subject, “C++ Programming”);

  19. Book1.book_id = 6495407;

  20. // book 2 specification

  21. strcpy( Book2.title, “Telecom Billing”);

  22. strcpy( Book2.author, “Yakit Singha”);

  23. strcpy( Book2.subject, “Telecom”);

  24. Book2.book_id = 6495700;

  25. // Print Book1 info

  26. cout << “Book 1 title : ” << Book1.title <<endl;

  27. cout << “Book 1 author : ” << Book1.author <<endl;

  28. cout << “Book 1 subject : ” << Book1.subject <<endl;

  29. cout << “Book 1 id : ” << Book1.book_id <<endl;

  30. // Print Book2 info

  31. cout << “Book 2 title : ” << Book2.title <<endl;

  32. cout << “Book 2 author : ” << Book2.author <<endl;

  33. cout << “Book 2 subject : ” << Book2.subject <<endl;

  34. cout << “Book 2 id : ” << Book2.book_id <<endl;

  35. return 0;

  36. }

Khi chạy chương trình, các em sẽ thấy kết quả chư sau:

Book 1 title : Learn C++ Programming

Book 1 author : Chand Miyan

Book 1 subject : C++ Programming

Book 1 id : 6495407

Book 2 title : Telecom Billing

Book 2 author : Yakit Singha

Book 2 subject : Telecom

Book 2 id : 6495700

Truyền struct vào hàm

Truyền struc và hàm tương tự như các biến bình thường khác, ví dụ sau đây thực hiện lại in thông tin quyển sách như trên, nhưng giờ chúng ta dùng hàm để in thông tin sách, rồi gọi hàm đó cho hai quyển sách:

  1. #include <iostream>

  2. #include <cstring>

  3. using namespace std;

  4. void printBook( struct Books book );

  5. struct Books

  6. {

  7. char title[50];

  8. char author[50];

  9. char subject[100];

  10. int book_id;

  11. };

  12. int main( )

  13. {

  14. struct Books Book1; // Declare Book1 of type Book

  15. struct Books Book2; // Declare Book2 of type Book

  16. // book 1 specification

  17. strcpy( Book1.title, “Learn C++ Programming”);

  18. strcpy( Book1.author, “Chand Miyan”);

  19. strcpy( Book1.subject, “C++ Programming”);

  20. Book1.book_id = 6495407;

  21. // book 2 specification

  22. strcpy( Book2.title, “Telecom Billing”);

  23. strcpy( Book2.author, “Yakit Singha”);

  24. strcpy( Book2.subject, “Telecom”);

  25. Book2.book_id = 6495700;

  26. // Print Book1 info

  27. printBook( Book1 );

  28. // Print Book2 info

  29. printBook( Book2 );

  30. return 0;

  31. }

  32. void printBook( struct Books book )

  33. {

  34. cout << “Book title : ” << book.title <<endl;

  35. cout << “Book author : ” << book.author <<endl;

  36. cout << “Book subject : ” << book.subject <<endl;

  37. cout << “Book id : ” << book.book_id <<endl;

  38. }

Chạy chương trình trên các em cũng thấy kết quả như ví dụ 1:

  1. Book title : Learn C++ Programming

  2. Book author : Chand Miyan

  3. Book subject : C++ Programming

  4. Book id : 6495407

  5. Book title : Telecom Billing

  6. Book author : Yakit Singha

  7. Book subject : Telecom

  8. Book id : 6495700

Dùng định nghĩa Typedef (định nghĩa kiểu)

Với cách định nghĩa này, coi như chúng ta tạo ra được một kiểu mới, sau đó sử dụng kiểu bình thường như các kiểu chuẩn khác mà không cần phải kèm từ struct đi theo nữa

Ví dụ:

  1. typedef struct

  2. {

  3. char title[50];

  4. char author[50];

  5. char subject[100];

  6. int book_id;

  7. }Books;

Ví dụ trên định nghĩa một kiểu tên là Books với cấu trúc có 4 thuộc tính, bây giờ sử dụng nó để khai báo biến như sau:

  1. Books Book1, Book2;

Các em thấy rõ ràng khai báo gọn hơn, và tức nhiên khi truyền vào hàm cũng như vậy.