Lp trình căn bn
Chương IX: KIU CU TRÚC
Hc xong chương này, sinh viên s nm được các vn đề sau:
Khái nim v kiu cu trúc.
Cách s dng kiu cu trúc.
Con tr cu trúc.
I. KIU CU TRÚC TRONG C
I.1 Khái nim
Kiu cu trúc (Structure) là kiu d liu bao gm nhiu thành phn có kiu khác
nhau, mi thành phn đưc gi là mt trường (field)
S khác bit gia kiu cu trúc và kiu mng là: các phn t ca mng là cùng
kiu còn các phn t ca kiu cu trúc có th có kiu khác nhau.
Hình nh ca kiu cu trúc được minh ha:
1 2 3 4 5 6 7
Trường
Đây là cu trúc có 7 trường
Còn kiu mng có dng:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Phn t
Đây là mng có 15 phn t
I.2 Định nghĩa kiu cu trúc
Cách 1:
struct <Tên cu trúc>
{
<Kiu> <Trường 1> ;
<Kiu> <Trường 2> ;
……..
<Kiu> <Trường n> ;
};
Cách 2: S dng t khóa typedef để định nghĩa kiu:
typedef struct
{
<Kiu> <Trường 1> ;
<Kiu> <Trường 2> ;
……..
Trang 98
Lp trình căn bn
<Kiu> <Trường n> ;
} <Tên cu trúc>;
Trong đó:
- <Tên cu trúc>: là mt tên được đặt theo quy tc đặt tên ca danh biu; tên
này mang ý nghĩa s là tên kiu cu trúc.
- <Kiu> <Trường i> (i=1..n): mi trường trong cu trúc có d liu thuc kiu
gì (tên ca trường phi là mt tên được đặt theo quy tc đặt tên ca danh biu).
Ví d 1: Để qun lý ngày, tháng, năm ca mt ngày trong năm ta có th khai
báo kiu cu trúc gm 3 thông tin: ngày, tháng, năm.
struct NgayThang
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
};
typedef struct
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
} NgayThang;
Ví d 2: Mi sinh viên cn được qun lý bi các thông tin: mã s sinh viên, h
tên, ngày tháng năm sinh, gii tính, địa ch thường trú. Lúc này ta có th khai báo mt
struct gm các thông tin trên.
struct SinhVien
{
char MSSV[10];
char HoTen[40];
struct NgayThang NgaySinh;
int Phai;
char DiaChi[40];
};
typedef struct
{
char MSSV[10];
char HoTen[40];
NgayThang NgaySinh;
int Phai;
char DiaChi[40];
} SinhVien;
I.3 Khai báo biến cu trúc
Vic khai báo biến cu trúc cũng tương t như khai báo biến thuc kiu d liu
chun.
pháp:
- Đối vi cu trúc được định nghĩa theo cách 1:
struct <Tên cu trúc> <Biến 1> [, <Biến 2>…];
- Đối vi các cu trúc được định nghĩa theo cách 2:
<Tên cu trúc> <Biến 1> [, <Biến 2>…];
Ví d: Khai báo biến NgaySinh có kiu cu trúc NgayThang; biến SV có kiu
cu trúc SinhVien.
struct NgayThang NgaySinh;
struct SinhVien SV;
NgayThang NgaySinh;
SinhVien SV;
Trang 99
Lp trình căn bn
II. CÁC THAO TÁC TRÊN BIN KIU CU TRÚC
II.1 Truy xut đến tng trường ca biến cu trúc
Cú pháp: <Biến cu trúc>.<Tên trường>
Khi s dng cách truy xut theo kiu này, các thao tác trên <Biến cu
trúc>.<Tên trường> ging như các thao tác trên các biến ca kiu d liu ca <Tên
trường>.
Ví d : Viết chương trình cho phép đọc d liu t bàn phím cho biến mu tin
SinhVien và in biến mu tin đó lên màn hình:
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
} NgayThang;
typedef struct
{
char MSSV[10];
char HoTen[40];
NgayThang NgaySinh;
int Phai;
char DiaChi[40];
} SinhVien;
/* Hàm in lên màn hình 1 mu tin SinhVien*/
void InSV(SinhVien s)
{
printf("MSSV: | Ho va ten | Ngay Sinh | Dia chi\n");
printf("%s | %s | %d-%d-%d | %s\n",s.MSSV,s.HoTen,
s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi);
}
int main()
{
SinhVien SV, s;
printf("Nhap MSSV: ");gets(SV.MSSV);
printf("Nhap Ho va ten: ");gets(SV.HoTen);
printf("Sinh ngay: ");scanf("%d",&SV.NgaySinh.Ngay);
printf("Thang: ");scanf("%d",&SV.NgaySinh.Thang);
printf("Nam: ");scanf("%d",&SV.NgaySinh.Nam);
printf("Gioi tinh (0: Nu), (1: Nam): ");scanf("%d",&SV.Phai);
flushall();
printf("Dia chi: ");gets(SV.DiaChi);
InSV(SV);
s=SV; /* Gán tr cho mu tin s*/
InSV(s);
getch();
return 0;
}
Trang 100
Lp trình căn bn
Lưu ý:
- Các biến cu trúc có th gán cho nhau. Thc cht đây là thao tác trên toàn b
cu trúc không phi trên mt trường riêng r nào. Chương trình trên dòng s=SV là mt
ví d.
- Vi các biến kiu cu trúc ta không th thc hin được các thao tác sau đây:
o S dng các hàm xut nhp trên biến cu trúc.
o Các phép toán quan h, các phép toán s hc và logic.
Ví d: Nhp vào hai s phc và tính tng ca chúng. Ta biết rng s phc là
mt cp (a,b) trong đó a, b là các s thc, a gi là phn thc, b là phn o. (Đôi khi
người ta cũng viết s phc dưới dng a + ib trong đó i là mt đơn v o có tính cht
i2=-1). Gi s phc c1=(a1, b1) và c2=(a2,b2) khi đó tng ca hai s phc c1 và c2 là
mt s phc c3 mà c3=(a1+a2, b1+b2). Vi hiu biết như vy ta có th xem mi s
phc là mt cu trúc có hai trường, mt trường biu din cho phn thc, mt trường
biu din cho phn o. Vic tính tng ca hai s phc được tính bng cách ly phn
thc cng vi phn thc và phn o cng vi phn o.
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
float Thuc;
float Ao;
} SoPhuc;
/* Hàm in s phc lên màn hình*/
void InSoPhuc(SoPhuc p)
{
printf("%.2f + i%.2f\n",p.Thuc,p.Ao);
}
int main()
{
SoPhuc p1,p2,p;
clrscr();
printf("Nhap so phuc thu nhat:\n");
printf("Phan thuc: ");scanf("%f",&p1.Thuc);
printf("Phan ao: ");scanf("%f",&p1.Ao);
printf("Nhap so phuc thu hai:\n");
printf("Phan thuc: ");scanf("%f",&p2.Thuc);
printf("Phan ao: ");scanf("%f",&p2.Ao);
printf("So phuc thu nhat: ");
InSoPhuc(p1);
printf("So phuc thu hai: ");
Trang 101
Lp trình căn bn
InSoPhuc(p2);
p.Thuc = p1.Thuc+p2.Thuc;
p.Ao = p1.Ao + p2.Ao;
printf("Tong 2 so phuc: ");
InSoPhuc(p);
getch();
return 0;
}
Kết qu thc hin chương trình:
II.2 Khi to cu trúc
Vic khi to cu trúc có th được thc hin trong lúc khai báo biến cu trúc.
Các trường ca cu trúc được khi to được đạt gia 2 du { và }, chúng được phân
cách nhau bi du phy (,).
Ví d: Khi to biến cu trúc NgaySinh:
struct NgayThang NgaySinh ={29, 8, 1986};
III. CON TR CU TRÚC
III.1 Khai báo
Vic khai báo mt biến con tr kiu cu trúc cũng tương t như khi khai báo
mt biến con tr khác, nghĩa là đặt thêm du * vào phía trước tên biến.
Cú pháp: struct <Tên cu trúc> * <Tên biến con tr>;
Ví d: Ta có th khai báo mt con tr cu trúc kiu NgayThang như sau:
struct NgayThang *p;
/* NgayThang *p; // Nếu có định nghĩa kiu */
III.2 S dng các con tr kiu cu trúc
Khi khai báo biến con tr cu trúc, biến con tr chưa có địa ch c th. Lúc này
nó ch mi được cp phát 2 byte để lưu gi địa chđược ghi nhn là con tr ch đến
1 cu trúc, nhưng chưa ch đến 1 đối tượng c th. Mun thao tác trên con tr cu trúc
hp l, cũng tương t như các con tr khác, ta phi:
- Cp phát mt vùng nh cho nó (s dng hàm malloc() hay calloc)
- Hoc, cho nó qun lý địa ch ca mt biến cu trúc nào đó.
Ví d: Sau khi khi to giá tr ca cu trúc:
struct NgayThang Ngay = {29,8,1986};
Trang 102