Chương 5Cấu trúc structure Đặt vấn đề Đểbiểu diễn một dãy các phần tử cùng kiểu ta đã biết sử dụng mảng.. Tuy nhiên khi các phần tử không cùng kiểu chẳng hạn, dữ liệu về một sinh viên g
Trang 1Chương 5
Cấu trúc (structure)
Đặt vấn đề
Đểbiểu diễn một dãy các phần tử cùng kiểu ta đã biết sử dụng mảng Tuy nhiên khi các phần tử không cùng kiểu chẳng hạn, dữ liệu về một sinh viên gồm:
- mã sinh viên (là một chuỗi)
- họ tên sinh viên (chuỗi)
- điểm trung bình (số thực)
- giới tính (số nguyên)
-
thì mảng không còn phù hợp
Trong C cấu trúc được dùng để biểu diễn những đối tượng như vậy
Định nghĩa: Cấu trúc (struct) là dãy hữu hạn các phần tử (có thể
không cùng kiểu dữ liệu với nhau) gọi là các trường hay các thành phần của cấu trúc đó
Khai báo kiểu cấu trúc
Định nghĩa kiểu dữ liệu trước:
Khai báo biến sau:
Ví dụ:
- khai báo số phức:
typedef struct SoPhuc
{
float phanThuc;
float phanAo;
};
SoPhuc z,z1,z2; //khai báo các biến SoPhuc.
typedef struct <tênkiểu CT>
{
//khai báo các thành phần };
<tênkiểu CT> <biến CT>;
Khai báo kiểu cấu trúc (tt)
{ char ma[10];
char hoTen[30];
float diemTB;
int gTinh;
};
SinhVien sv1,sv2;
SinhVien lop[50]; //khai báo mảng lop gồm 50 sv.
Trang 2Truy xuất dữ liệu biến cấu trúc
Qui tắc: để truy xuất dữ liệu biến cấu trúc ta phải truy xuất từng
thành phần của nó, theo cú pháp:
Ví dụ: với các biến đã khai báo ở ví dụ trước ta có thể truy xuất
như sau:
printf(“%0.2f”,z.phanThuc);//in phần thực z
for(i=0;i<50;++i)gets(lop[i].hoTen);//nhập dssv
Chú ý: trong C không có phép toán lấy địa chỉ một thành phần của
cấu trúc Tức là phép toán: &sv.diemTB và câu lệnh
scanf(“%f”,&sv.diemTB) là không hợp lệ
Đểkhắc phục điều này ta có thể sử dụng biến trung gian:
scanf(“%f”,&tam);//tam là biến trung gian.
sv.diemTB=tam;
<tên biến>.<tên thành phần>
Truy xuất dữ liệu biến cấu trúc (tt)
cùng kiểu.
thành phần của p như sau:
p=&sv1
p-><tên thành phần>
Mảng cấu trúc
Nhận xét: Cách truy xuất mảng cấu trúc tương tự như
mảng thông thường Tức là phải truy xuất từng phần
tử của mảng tuy nhiên với mỗi phần tử của mảng ta
áp dụng quy tắc truy xuất đối với biến cấu trúc.
Ví dụ: 2 hàm sau đây đều in danh sách lớp ra màn
hình:
void inDS1(SinhVien lop[], int n)
{
int i;
for(i=0;i<n;++i)
printf(“\nlop[i].hoTen);
}
Mảng cấu trúc (tt)
void inDS2(SinhVien *p, int n) {
int i;
for(i=0;i<n;++i) printf(“\n(p+i)->hoTen);
}
Trang 3Một số ví dụ về sử dụng struct
số.
{
int tu;
int mau;
}
Một số ví dụ về sử dụng struct (tt)
//hàm in phân số ra màn hình:
void inPS(PhanSo p)
{
printf(“%d/%d”,p.tu,p.mau);
}
//hàm tìm ước chung lớn nhất của 2 số nguyên:
int ucln(int x, int y)
{
while(x*y)
if(x>y)x=x%y;
else y=y%x;
return (x+y);
}
Một số ví dụ về sử dụng struct (tt)
//hàm rút gọn phân số:
void rutGon(PhanSo *p)
{
int d;
d=ucln(p->tu,p->mau);
p->tu=(p->tu)/d;
p->mau=(p->mau)/d;
}
Một số ví dụ về sử dụng struct (tt)
//hàm nhập 1 phân số từ bàn phím:
void nhapPS(PhanSo *p)
{
int tam;
printf(“\ntu so = “);scanf(“%d”,&tam);
p->tu=tam;
printf(“\nmau so = “);scanf(“%d”,&tam);
p->mau=tam;
if(mau<0)
{
tu=-tu;
mau=-mau;
}
rutGon(p);
}
Trang 4Một số ví dụ về sử dụng struct (tt)
{
PhanSo t;
t.tu=p.tu*q.mau+p.mau*q.tu;
t.mau=p.mau*q.mau;
rutGon(&t);
return t;
}
Một số ví dụ về sử dụng struct (tt)
{
PhanSo t;
t.tu=p.tu*q.tu;
t.mau=p.mau*q.mau;
rutGon(&t);
return t;
}
Hỏi đáp