Struct là gì ? | sentayho.com.vn

Struct là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần được truy nhập thông qua một tên.

Khái niệm cấu trúc

Một cấu trúc bao gồm các mẫu dữ liệu (không nhất thiết cùng kiểu) được nhóm lại với nhau.



Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới cho phép người dùng sử dụng chúng để khai báo các biến kiểu cấu trúc.

Các biến trong cấu trúc được gọi là các phần tử của cấu trúc hay thành phần của cấu trúc

Khai báo biến cấu trúc

Khởi tạo cấu trúc

  • Giống như các biến khác và mảng, các biến kiểu cấu trúc có thể được khởi tạo tại thời điểm khai báo
  • Các biến emp1 và emp2 có kiểu employee có thể được khai báo và khởi tạo như sau:

struct employee emp1 = {346, “Abraham”}; struct employee emp2 = {347, “John”};

Truy cập phần tử của cấu trúc

  • Các phần tử của cấu trúc được truy cập thông qua việc sử dụng toán tử chấm (.), toán tử này còn được gọi là toán tử thành viên – membership.
  • Cú pháp:

structure_name.element_name

  • Ví dụ:

scanf(“%s”, sentayho.com.vn_name);

Gán sử dụng cấu trúc

  • Có thể sử dụng câu lệnh gán đơn giản để gán giá trị của một biến cấu trúc cho một biến khác có cùng kiểu
  • Chẳng hạn, nếu books1 và books2 là các biến cấu trúc có cùng kiểu, thì câu lệnh sau là hợp lệ

books2 = books1;

Sao chép cấu trúc

  • Do kiểu dữ liệu cấu trúc là phức tạp nên trong một số trường hợp không thể dùng câu lệnh gán trực tiếp, thì có thể sử dụng hàm memcpy(), đây là hàm có sẵn trong thư viện lập trình
  • Cú pháp:

memcpy (char * destn, char &source, int nbytes);

  • Ví dụ:

memcpy (&books2, &books1, sizeof(struct cat));

Cấu trúc lồng nhau

  • Một cấu trúc có thể lồng trong một cấu trúc khác. Tuy nhiên, một cấu trúc không thể lồng trong chính nó.

struct issue

{

char borrower [20]; char dt_of_issue[8]; struct cat books;

}issl;

  • Việc truy cập vào các phần tử của cấu trúc này tương tự như với cấu trúc bình thường khác,
  • Để truy cập vào phần tử của cấu trúc cat là một phần của cấu trúc issl

Mảng cấu trúc

  • Một kiểu cấu trúc phải được định nghĩa trước, sau đó một biến mảng có kiểu cấu trúc tương ứng mới được khai báo
  • Để truy cập vào thành phần author của phần tử thứ tư của mảng books ta làm như sau:

books[4].author

Khởi tạo các mảng cấu trúc

  • Mảng cấu trúc được khởi tạo bằng cách liệt kê danh sách các giá trị phần tử của nó dưới dạng liệt kê
  • Ví dụ:

Con trỏ đến cấu trúc

  • Con trỏ cấu trúc được khai báo bằng cách đặt dấu * trước tên của biến cấu trúc.
  • Toán tử -> được dùng để truy cập vào các phần tử của một cấu trúc sử dụng một con trỏ
  • Con trỏ cấu trúc được truyền vào hàm, cho phép hàm thay đổi trực tiếp các phần tử của cấu trúc.

Từ khóa typedef

  • Một kiểu dữ liệu có thể được định nghĩa bằng cách sử dụng từ khóa typedef
  • Nó không tạo ra một kiểu dữ liệu mới, mà định nghĩa một tên mới cho một kiểu đã có.
  • Cú pháp: typedef type name;
    • Ví dụ: typedef float deci;
  • typedef không thể sử dụng với storage classes

Các cách Khai báo struct

Cách 1:

Ví dụ:

Cách 2:

Ví dụ:

Bài tập có hướng dẫn

Bài1: Khai báo cấu trúc HinhChuNhat cần thiết lưu trữ thông tin hình chữ nhật, sau đó thực hiện các chức năng: (Lưu ý: Viết chương trình dạng hàm). Yêu cầu:

Hướng dẫn: Bước 1: Tạo project mới (có thể xem lại bài viết Hướng dẫn Tạo Project Visual C++ trong Visual Studio 2012 Hoặc Hướng dẫn Dev-C++ căn bản) Bước 2: Khai báo thêm các thư viện cơ bản cho chương trình.

#include <conio.h> #include <stdio.h>

Bước 3: Khai báo struct HinhChuNhat cho chương trình.

struct HinhChuNhat { int Dai; int Rong; };

Bước 4: Viết các khai báo nguyên mẫu hàm cho chương trình như sau:

void NhapThongTinHCN(HinhChuNhat &pHcn); void XuatThongTinHCN(HinhChuNhat pHcn); void TinhChuViHcn(HinhChuNhat pHcn); void TinhDienTichHcn(HinhChuNhat pHcn);

Bước 5: Viết hàm main để thực thi chương trình.

void main() { HinhChuNhat hinhchunhat; NhapThongTinHCN(hinhchunhat); XuatThongTinHCN(hinhchunhat); TinhChuViHcn(hinhchunhat); TinhDienTichHcn(hinhchunhat); getch(); }

Bước 6: Viết các định nghĩa hàm cần thiết cho chương trình như sau:

void NhapThongTinHCN(HinhChuNhat &pHcn) { printf(“Moi ban nhap chieu dai hcn=”); scanf_s(“%d”,&pHcn.Dai); printf(“Moi ban nhap chieu rong hcn=”); scanf_s(“%d”,&pHcn.Rong); } //================================ void XuatThongTinHCN(HinhChuNhat pHcn) { printf(“Chieu dai hcn la=%d”,pHcn.Dai); printf(“nChieu rong hcn la=%d”,pHcn.Rong); } //=============================== void TinhChuViHcn(HinhChuNhat pHcn) { printf(“nChu vi hcn la=%d”,(pHcn.Dai+pHcn.Rong)*2); } //================================ void TinhDienTichHcn(HinhChuNhat pHcn) { printf(“nDien tich hcn la=%d”,pHcn.Dai*pHcn.Rong); }

Bài tập tương tự 1. Khai báo cấu trúc PhanSo cần thiết lưu trữ thông tin phân số, sau đó thực hiện các chức năng:

2. Khai báo cấu trúc NhanVien lưu trữ thông tin:

Sau đó thực hiện các chức năng:

Tính tiền phụ cấp chức vụ:

3. Hãy khai báo một cấu trúc mô tả một điểm trên tọa độ xOy. Sau đó viết hàm thực hiện các chức năng sau:

4. Cho thông tin điểm các môn học sau: NNLT, Tin học, Toán A1. Hãy khai báo một cấu trúc mô tả điểm các môn học của 1 sinh viên. Sau đó viết hàm thực hiện các chức năng sau:

Xem thêm: Mảng Struct và ví dụ ứng dụng