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
-
struct Books
-
{
-
char title[50];
-
char author[50];
-
char subject[100];
-
int book_id;
-
};
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.
-
#include <iostream>
-
#include <cstring>
-
-
using namespace std;
-
-
struct Books
-
{
-
char title[50];
-
char author[50];
-
char subject[100];
-
int book_id;
-
};
-
-
int main( )
-
{
-
struct Books Book1; // Declare Book1 of type Book
-
struct Books Book2; // Declare Book2 of type Book
-
-
// book 1 specification
-
strcpy( Book1.title, “Learn C++ Programming”);
-
strcpy( Book1.author, “Chand Miyan”);
-
strcpy( Book1.subject, “C++ Programming”);
-
Book1.book_id = 6495407;
-
-
// book 2 specification
-
strcpy( Book2.title, “Telecom Billing”);
-
strcpy( Book2.author, “Yakit Singha”);
-
strcpy( Book2.subject, “Telecom”);
-
Book2.book_id = 6495700;
-
-
// Print Book1 info
-
cout << “Book 1 title : ” << Book1.title <<endl;
-
cout << “Book 1 author : ” << Book1.author <<endl;
-
cout << “Book 1 subject : ” << Book1.subject <<endl;
-
cout << “Book 1 id : ” << Book1.book_id <<endl;
-
-
// Print Book2 info
-
cout << “Book 2 title : ” << Book2.title <<endl;
-
cout << “Book 2 author : ” << Book2.author <<endl;
-
cout << “Book 2 subject : ” << Book2.subject <<endl;
-
cout << “Book 2 id : ” << Book2.book_id <<endl;
-
-
return 0;
-
}
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:
-
#include <iostream>
-
#include <cstring>
-
-
using namespace std;
-
void printBook( struct Books book );
-
-
struct Books
-
{
-
char title[50];
-
char author[50];
-
char subject[100];
-
int book_id;
-
};
-
-
int main( )
-
{
-
struct Books Book1; // Declare Book1 of type Book
-
struct Books Book2; // Declare Book2 of type Book
-
-
// book 1 specification
-
strcpy( Book1.title, “Learn C++ Programming”);
-
strcpy( Book1.author, “Chand Miyan”);
-
strcpy( Book1.subject, “C++ Programming”);
-
Book1.book_id = 6495407;
-
-
// book 2 specification
-
strcpy( Book2.title, “Telecom Billing”);
-
strcpy( Book2.author, “Yakit Singha”);
-
strcpy( Book2.subject, “Telecom”);
-
Book2.book_id = 6495700;
-
-
// Print Book1 info
-
printBook( Book1 );
-
-
// Print Book2 info
-
printBook( Book2 );
-
-
return 0;
-
}
-
void printBook( struct Books book )
-
{
-
cout << “Book title : ” << book.title <<endl;
-
cout << “Book author : ” << book.author <<endl;
-
cout << “Book subject : ” << book.subject <<endl;
-
cout << “Book id : ” << book.book_id <<endl;
-
}
Chạy chương trình trên các em cũng thấy kết quả như ví dụ 1:
-
Book title : Learn C++ Programming
-
Book author : Chand Miyan
-
Book subject : C++ Programming
-
Book id : 6495407
-
Book title : Telecom Billing
-
Book author : Yakit Singha
-
Book subject : Telecom
-
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ụ:
-
typedef struct
-
{
-
char title[50];
-
char author[50];
-
char subject[100];
-
int book_id;
-
}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:
-
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.