Giáo trình Lập trình C căn bản Trang 99
Bài 10 :
CÁC KIỂU DỮ LIỆU TỰ TẠO
10.1 Mục tiêu
Sau khi hoàn tất bài này học viên sẽ hiểu và vận dụng các kiến thức kĩ năng cơ bản sau:
- Ý nghĩa, cách khai structure, emum
- Nhập, xuất structure.
- Khởi tạo structure, enum
- Một số kỹ thuật thao tác trên structure, enum
- Dùng struct tham số cho hàm.
10.2 Nội dung
10.2.1 Structure
Đối với mảng, chỉ có thể lưu nhiều thông tin có cùng kiểu dữ liệu. Nhưng với structure ta có
thể lưu thông tin như một mảng có nhiều kiểu dữ liệu khác nhau.
10.2.1.1 Khai báo kiểu structure
Ví dụ 1
: khai báo một structure về thông tin nhân viên
từ khóa tên struct
struct nhanvien
{
Các thành int manv; các phần tử của struct
phần được char hoten[30];
bọc trong móc };
dấu chấm phẩy kết thúc struct
Hanoi Aptech Computer Education Center
nhanvien int manv char hoten[30]
Ví dụ trên định nghĩa kiểu dữ liệu mới có tên là struct nhanviên. Mỗi biến kiểu này gồm 2
phần tử: biến nguyên có tên là manv và biến chuỗi có tên hoten.
)
struct phải viết bằng chữ thường
10.2.1.2 Cách khai báo biến có kiểu structure
Ví dụ 2
: struct nhanvien nv; hoặc nhanvien nv;
Khai báo biến nv có kiểu struct nhanvien
)
vừa tạo structure nhanvien vừa khai báo biến nv
struct nhanvien
{
int manv;
char hoten[30];
} nv;
10.2.1.3 Tham chiếu các phần tử trong structure
nv manv hoten[30]
nv.manv nv.hoten
Để tham chiếu đến manv trong nv ta viết như sau: nv.manv (là biến có kiểu int)
Giáo trình Lập trình C căn bản Trang 100
Hanoi Aptech Computer Education Center
)
Đối với biến khai báo kiểu con trỏ nhanvien *nv thì tham chiếu đến phần tử manv:
nv -> manv.
Ví dụ 3
: Nhập và in danh sách nhân viên.
Dòng File Edit Search Run Compile Debug Project Option Window Help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/* Danh sach nhan vien */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 50
void main(void)
{
struct nhanvien
{
int manv;
char hoten[30];
};
nhanvien snv[MAX];
char ctam[10];
int i, in;
printf("Nhap vao so nhan vien: ");
gets(ctam);
in = atoi(ctam);
//Nhap danh sach nhan vien
for(i = 0; i < in; i++)
{
printf("Nhap vao ma nhan vien thu %d: ", i + 1);
gets(ctam);
snv[i].manv = atoi(ctam);
printf("Nhap vao ho ten: ");
gets(snv[i].hoten);
}
//in danh sach nhan vien
for(i = 0; i < in; i++)
printf("%5d %s\n", snv[i].manv, snv[i].hoten);
getch();
}
F1 Help Alt-F8 Next Msg Alt-F7 Prev Msg Alt - F9 Compile F9 Make F10 Menu
)
Kết quả in ra màn hình
Nhap vao so nhan vien: 2
Nhap vao ma nhan vien thu 1: 123
Nhap vao ho ten: Le Thuy Doan Trang
Nhap vao ma nhan vien thu 2: 35
Chạy và thử lại chương trình với dữ liệu khác.
Quan sát kết quả.
Giáo trình Lập trình C căn bản Trang 101
Hanoi Aptech Computer Education Center
Nhap vao ho ten: Le Nguyen Tuan Anh
123 Le Thuy Doan Trang
35 Le Nguyen Tuan Anh
_
)
Trong chương trình trên dùng tổ hợp 2 dòng 20 và 21 gồm 2 lệnh gets, atoi để
nhập một số nguyên tránh lỗi do scanf và vùng đệm bàn phím gây ra.
10.2.1.4 Khởi tạo structure
Ví dụ 4
: Nhập vào bảng số xe, cho biết xe đó đăng kí ở tỉnh nào.
Dòng File Edit Search Run Compile Debug Project Option Window Help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* Xac dinh bien so xe */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 6
void main(void)
{
struct tinh
{
int ma;
char *ten;
};
tinh sds[MAX] = {{60, "Dong Nai"}, {61, "Binh Duong"}, {62, "Long An"},
{63, "Tien Giang"}, {64, "Vinh Long"}, {65, "Can Tho"}};
char ctam[10];
int i, in;
printf("Nhap vao bien so xe: ");
gets(ctam);
in = atoi(ctam);
for(i = 0; i < MAX; i++)
if (sds[i].ma == in)
printf("Xe dang ki o tinh %s.\n", sds[i].ten);
getch();
}
F1 Help Alt-F8 Next Msg Alt-F7 Prev Msg Alt - F9 Compile F9 Make F10 Menu
)
Kết quả in ra màn hình
Nhap vao bien so xe: 62F5-1152
Xe dang ki o tinh Long An
_
Chạy và thử lại chương trình với 65H5-1246,
60F4-7712, 64F1-4542
Quan sát kết quả.
)
Dòng 22 đổi chuỗi sang số nguyên, ở ví dụ trên sau khi dòng này thực hiện giá trị
của in = 62.
Giáo trình Lập trình C căn bản Trang 102
Hanoi Aptech Computer Education Center
10.2.1.5 Structure lồng nhau
Ví dụ
5: Nhập và in danh sách nhân viên.
Dòng File Edit Search Run Compile Debug Project Option Window Help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* Danh sach nhan vien */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 50
void main(void)
{
struct giacanh
{
char vo_chong[30];
char con;
};
struct nhanvien
{
int manv;
char hoten[30];
giacanh canhan;
};
nhanvien snv[MAX];
char ctam[10];
int i, in;
printf("Nhap vao so nhan vien: ");
gets(ctam);
in = atoi(ctam);
//Nhap danh sach nhan vien
for(i = 0; i < in; i++)
{
printf("Nhap vao ma nhan vien thu %d: ", i + 1);
gets(ctam);
snv[i].manv = atoi(ctam);
printf("Nhap vao ho ten: ");
gets(snv[i].hoten);
printf("Cho biet ten vo (hoac chong): ");
gets(snv[i].canhan.vo_chong);
printf("So con: ");
gests(ctam);
}
Giáo trình Lập trình C căn bản Trang 103
Hanoi Aptech Computer Education Center
44
45
46
47
48
49
50
//in danh sach nhan vien
for(i = 0; i < in; i++)
{
printf("Ma so: %d\nHo ten: %s\n Ho ten vo (hoac chong): %s\nSo con: %d",
snv[i].manv, snv[i].hoten, snv[i].canhan.vo_chong, snv[i].canhan.con);
getch();
}
F1 Help Alt-F8 Next Msg Alt-F7 Prev Msg Alt - F9 Compile F9 Make F10 Menu
)
Kết quả in ra màn hình
Nhap vao so nhan vien: 3
Nhap vao ma nhan vien thu 1: 123
Nhap vao ho ten: Le Thuy Doan Trang
Nhap vao ma nhan vien thu 2: 35
Nhap vao ho ten: Le Nguyen Tuan Anh
123 Le Thuy Doan Trang
35 Le Nguyen Tuan Anh
_
Chạy và thử lại chương trình với dữ liệu khác.
Quan sát kết quả.
)
Trong chương trình trên dùng tổ hợp 2 dòng 20 và 21 gồm 2 lệnh gets, atoi để
nhập một số nguyên tránh lỗi do scanf và vùng đệm bàn phím gây ra.
10.2.1.6 Truyền structure sang hàm
Giống như mảng, bạn có thể truyền vào hàm qua tham biến.
Ví dụ 6
: Sửa lại ví dụ 3, sử dụng hàm cho nhập và in danh sách
Dòng File Edit Search Run Compile Debug Project Option Window Help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Danh sach nhan vien */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 50
//Khai bao structure toan cuc
struct nhanvien
{
int manv;
char hoten[30];
};
//Khai bao prototype
void input(nhanvien, int);
void output(nhanvien, int);
//Ham nhap danh sach
void input(nhanvien snv[], int in)