You are on page 1of 17

Đại Học Công Nghiệp Thành Phố Hồ Chí Minh

**********************

BÀI 9: KIỂU DỮ LIỆU CẤU TRÚC

Bộ môn: Điện Tử Máy Tính


GV: Lê Lý Quyên Quyên
BÀI 9: KIỂU DỮ LIỆU CẤU TRÚC

1 Định nghĩa

2 Khai báo kiểu dữ liệu

3 Truy xuất

4 Các ví dụ minh họa

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


1.Định nghĩa
Kiểu dữ liệu cấu trúc (struct):
Là một kiểu dữ liệu do người dùng định nghĩa bằng cách gom
nhóm các kiểu dữ liệu cơ bản có sẵn trong C thành một kiểu dữ
liệu phức hợp nhiều thành phần.
Kiểu dữ liệu cấu trúc có thể lồng nhau.
Cú pháp: struct < tên cấu trúc >{
Các kiểu dữ liệu thành phần ;
};

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


1.Định nghĩa
Ví dụ 1: Định nghĩa kiểu dữ liệu SINHVIEN gồm các thành phần:
Mã số sinh viên: chuỗi tối đa 10 ký tự
Họ và tên: chuỗi tối đa 25 ký tự
Ngày tháng năm sinh: chuỗi tối đa 15 ký tự
Điểm trung bình: kiểu float
struct SINHVIEN{
char mssv[10];
char hoten[25];
char ngaysinh[15];
float dtb;
};
Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính
1.Định nghĩa
Kiểu dữ liệu cấu trúc có thể lồng nhau.
Ví dụ 2:
Định nghĩa kiểu dữ liệu của học sinh HOCSINH gồm:
Mã số học sinh (MSHS): chuỗi có tối đa 5 ký tự.
Họ tên (hoten): chuỗi có tối đa 30 ký tự.
Ngày tháng năm sinh (ngaysinh): kiểu DATE.
Địa chỉ (diachi): chuỗi có tối đa 50 ký tự.
Giới tính: chuỗi có tối đa 3 ký tự
Điểm trung bình (diemtb): kiểu float

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


1.Định nghĩa
Kiểu dữ liệu cấu trúc có thể lồng nhau.
Ví dụ 2: Định nghĩa kiểu dữ liệu của học sinh HOCSINH như sau:

struct DATE{ struct HOCSINH {


char thu[5]; char MSHS[6];
unsigned char ngay; char hoten[31];
unsigned char thang; struct DATE ngaysinh;
int nam; char diachi[51];
}; unsigned char phai[4];
float diemtb;
};

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


2.Khai báo kiểu dữ liệu
 Khi ta định nghĩa kiểu dữ liệu tức là ta có một kiểu dữ liệu
mới, muốn sử dụng ta phải khai báo biến. Cú pháp khai báo
kiểu dữ liệu cũng giống như cách khai báo của các kiểu dữ
liệu chuẩn.
 Cú pháp : struct < tên cấu trúc > < tên biến >
hoặc
< tên cấu trúc > < tên biến >

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


2.Khai báo kiểu dữ liệu
Ví dụ 3: Định nghĩa và khai báo kiểu dữ liệu của nhanvien như sau:
Khai báo biến nv có kiểu dữ liệu Có thể vừa tạo cấu
cấu trúc là nhanvien trúc vừa khai báo:
struct nhanvien struct nhanvien
{ {
int manv; int manv;
char hoten[25]; char hoten[25];
}; }nv;
struct nhanvien nv;
hoặc nhanvien nv;

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


2.Khai báo kiểu dữ liệu
 Ngoài ra còn có thể khai báo theo kiểu con trỏ như sau:

Cú pháp : struct < tên cấu trúc > *< tên biến > ;

Ví dụ 4:
DATE *y; //Khai báo con trỏ kiểu cấu trúc DATE
y = (DATE *) malloc (sizeof (DATE)) ;

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


3.Truy xuất
Để truy xuất một thành phần dữ liệu nào đó bên trong cấu trúc
ta có 2 trường hợp truy xuất như sau :
1.Biến x là một biến cấu trúc thông thường, ta dùng toán tử
dấu chấm “.”
Cú pháp : < Tên cấu trúc >.< Biến thành phần >;

Ví dụ 5:
DATE x; //khai bao bien x kieu DATE
x.ngay = 5; //gan ngay bang 5
Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính
3.Truy xuất
2.Biến x là một biến con trỏ, ta dùng toán tử mũi tên “->“
(Gồm dấu trừ ‘-‘ và dấu lớn hơn ‘>’).
Cú pháp : < Tên cấu trúc > -> < Biến thành phần >;

Ví dụ 6:
DATE *x; //khai bao bien x kieu con tro DATE
x -> ngay = 5; //gan ngay bang 5

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


3.Truy xuất
 Đối với kiểu dữ liệu có struct lồng nhau phải truy cập đến
thành phần cuối cùng có kiểu dữ liệu cơ bản.
Ví dụ 7: Giả sử, có kiểu HOCSINH khai báo như Ví dụ 2
Muốn in học sinh A sinh vào tháng mấy ta phải truy cập như sau:

HOCSINH hs; //khai bao bien hs kieu HOCSINH


printf(“Thang sinh cua hoc sinh A la: %d”,(hs.ngaysinh).thang);

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


4.Các ví dụ minh họa
Ví dụ 1 : Nhập dữ liệu 1 sinh viên: Họ &tên, Ngày tháng năm sinh, MSSV, ĐTB. In ra thông
tin: “Sinh vien xxxxxxxx , Ngay sinh: xxxxxxxx, MSSV : xxxxxxxx, ĐTB: xxx”
Tạo dữ liệu kiểu struct để lưu thông tin sinh viên

main (void) {
#include <stdio.h>
sinhvien a;
#include <conio.h> printf ("Thong tin sinh vien \n ");
printf("Nhap Ho & ten: ");
struct sinhvien printf ("Ho va ten sinh vien: %s \n ",a.ten);
gets (a.ten); printf ("Ngay sinh : %s \n ",a.ngaysinh);
{
printf("Nhap ngay sinh: "); printf ("MSSV : %d\n ",a.mssv);
char ten[20];
scanf ("%s",&a.ngaysinh); printf ("DTB : %.2f\n ",a.dtb);
char ngaysinh[20];
printf("Nhap MSSV: "); getch();
int mssv;
scanf ("%d",&a.mssv); }
float dtb;
printf("Nhap DTB: ");
};
scanf ("%f",&a.dtb);

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


4.Các ví dụ minh họa

Ví dụ 2 : Nhập dữ liệu n sinh viên (0<n<=50): Họ &tên, Ngày tháng


năm sinh, MSSV, ĐTB. In ra thông tin sinh viên:
STT HO&TEN NGAY SINH MSSV DTB
xx xxxxxxxx xxxxxxxx xxxxxxxx xx
Sử dụng mảng có n phần tử kiểu dữ liệu struct

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


4.Các ví dụ minh họa
Ví dụ 2 : #include <stdio.h>
void nhap(sinhvien a[],int n){
#include <conio.h>
for (int i=0;i<n;i++){
int n;
fflush(stdin);//xóa bộ nhớ đệm
struct sinhvien{
printf("Nhap Ho & ten sv thu %d: ",i+1);
char ten[20];
gets(a[i].ten);
char ngaysinh[20];
printf("Nhap ngay sinh: ");
int mssv;
scanf ("%s",&a[i].ngaysinh);
float dtb;
printf("Nhap MSSV: ");
};
scanf ("%d",&a[i].mssv);
void nhapsoluong(){
printf("Nhap DTB: ");
do{
scanf ("%f",&a[i].dtb);
printf("Nhap so luong sinh vien:");
}
scanf("%d",&n);
}
}
while(n<1||n>50);}
Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính
4.Các ví dụ minh họa
Ví dụ 2: (tt)
void xuat(sinhvien a[],int n){
printf ("-------------Danh sach sinh vien------------- \n ");
printf("STT HO&TEN NGAY SINH MSSV DTB\n");
for (int i=0;i<n;i++)
printf ("%d %10s %5s %5d %0.2f \n",i+1,a[i].ten,a[i].ngaysinh,a[i].mssv,a[i].dtb);
}
main (void) {
sinhvien a[50];
nhapsoluong();
nhap(a,n);
xuat(a,n);
getch();
}

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


YÊU CẦU BUỔI HỌC 9

Sinh viên viết code chạy ví dụ 1, 2 ở phần 4

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính

You might also like