• Không có kết quả nào được tìm thấy

Structure

Trong tài liệu Index of /cnpm/pth02001/ThamKhao (Trang 99-105)

BÀI 10 : CÁC KIỂU DỮ LIỆU TỰ TẠO

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)

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ả.

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.

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);

}

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)

Hanoi Aptech Computer Education Center 22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

{

char ctam[10];

for(int 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);

} }

//Ham in danh sach ra man hinh void output(nhanvien snv[], int in) {

for(i = 0; i < in; i++)

printf("%5d %s\n", snv[i].manv, snv[i].hoten);

}

void main(void) {

nhanvien snv[MAX];

char ctam[10];

int i, in;

printf("Nhap vao so nhan vien: ");

gets(ctam);

in = atoi(ctam);

input(snv, in);

output(snv, in);

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ả.

)

Giải thích chương trình

Ở chương trình này ta phải khai báo struct nhanvien là biến toàn cục, vì khi định nghĩa hàm input và output có sử dụng kiểu dữ liệu struct nhanviên.

)

Bạn lưu ý rằng khi truyền struct sang hàm, không tạo bản sao mảng mới. Vì vậy struct truyền sang hàm có dạng tham biến. Nghĩa là giá trị của các phần tử trong struct sẽ bị ảnh hưởng nếu có sự thay đổi trên chúng.

Ví dụ 7: Sửa lại ví dụ 6, từ dòng 20 đến dòng 32 như sau:

//Ham nhap tung nhan vien nhanvien newnv()

{

nhanvien snv;

printf("Ma nhan vien: ");

gets(ctam);

snv.manv = atoi(ctam);

printf("Ho ten: ");

gets(snv.hoten);

return (snv);

}

//Ham nhap danh sach nhan vien void input(nhanvien snv[], int in) {

for(int i = 0; i < in; i++) {

printf("Nhap vao nhan vien thu %d: ", i + 1);

snv[i] = newnv();

} }

)

Hàm newnv có kiểu trả về là struct nhanvien

Trong tài liệu Index of /cnpm/pth02001/ThamKhao (Trang 99-105)