Struct là gì ?

0
7221

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.

image001

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

Ví dụ:
struct cat
{   
                        char bk_name [25];
                        char author [20];
                        int edn;
                        float price;
 };       

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

– Khi một cấu trúc đã được định nghĩa, chúng ta có thể khai báo một hoặc nhiều biến sử dụng kiểu này.
– Ví dụ: struct cat books1;
– Câu lệnh này sẽ dành đủ vùng nhớ để lưu trữ tất cả các mục trong một cấu trúc.
image002

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
struct employee
{
   int no;
                        char name [20];
};
  • 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”, books1.bk_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,
issl.borrower
  • Để 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
issl.books.author

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
Ví dụ: struct cat books[50];
  • Để 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ụ:
struct unit
{
char ch;
int i;
};
struct unit series [3] ={{‘a’, 100}{‘b’, 200}{‘c’, 300}};

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ỏ
  • Ví dụ:

 

struct cat *ptr_bk;
ptr_bk = &books;
printf(“%s”,ptr_bk->author);
  • 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:

image003

Ví dụ:

image006

Cách 2:

image008

Ví dụ:

image010

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:

1.Nhập thông tin cho kiểu dữ liệu HinhChuNhat.
2.Xuất thông tin cho kiểu dữ liệu HinhChuNhat.
3.Tính chu vi hình chữ nhật
4.Tính diện tích hình chữ nhật

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:

Viết hàm nhập vào phân số.
Viết hàm xuất phân số.
Kiểm tra phân số mẫu phải khác 0.
Viết hàm tối giản phân số.
Viết hàm quy đồng 2 phân số.
Nhập vào 2 phân số. Tính tổng, hiệu, tích và thương của hai phân số.

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

Mã số nhân viên
Tên nhân viên
Số ngày công
Lương 1 ngày công
Chức vụ

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

Nhập thông tin cho 1 nhân viên.
Tính lương cho 1 nhân viên theo công thức : Luong= Số ngày công * Lương 1 ngày công.
Tính tiền thưởng cho nhân viên, biết rằng thưởng 50$ cho nhân viên làm trên 24 ngày.

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

Giám đốc: 100$
Phó giám đốc: 80$
Trưởng phòng: 40$
Phó phòng: 20$
Tính tiền lương thực lãnh cho nhân viên bằng lương + thưởng + 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:

Nhập, xuất điểm.
Kiểm tra điểm có nằm trên trục tung/trục hoành.
Tính khoảng cách giữa 2 điểm.
Tìm điểm đối xứng của 1 điểm qua trục tung/trục hoành

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:

Nhập, xuất thông tin điểm của 1 sinh viên.
Tính điểm trung bình 3 môn.
Xếp loại cho sinh viên đó theo điều kiện:
Xuất sắc: ĐTB>=9
Giỏi với: 8.0<=ĐTB<9
Khá với: 6.5<=ĐTB<8.0
Trung bình: 5.0<=ĐTB<6.5
Yếu: ĐTB<5

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.