Tải bản đầy đủ (.pdf) (4 trang)

Kỹ thuật lập trình - Cấu trúc ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (75.57 KB, 4 trang )

Chươ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)
-
Khai báo kiểu sinh viên:
typedef struct SinhVien
{
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.
Truy 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)

Chú ý: có thể gán trực tiếp 2 biến cấu trúc
cùng kiểu.

Ví dụ: sv1 = sv2; sv1 = lop[10];

Nếu p là 1 con trỏ cấu trúc thì phép truy xuất
thành phần của p như sau:

Ví dụ: SinhVien *p;

p=&sv1

Khi đó: p->hoTen tương đương với sv1.hoTen
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);
}
Một số ví dụ về sử dụng struct

Ví dụ 1: Thực hiện các phép toán trên phân
số.

//Biểu diễn phân số:

typedef struct PhanSo


{

int tu;

int mau;

}

PhanSo p,p1,p2;
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);

}
Một số ví dụ về sử dụng struct (tt)

//hàm cộng 2 phân số:


PhanSo cong(PhanSo p, PhanSo q)

{

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)

//hàm nhân 2 phân số:

PhanSo nhan(PhanSo p, PhanSo q)

{

PhanSo t;

t.tu=p.tu*q.tu;

t.mau=p.mau*q.mau;

rutGon(&t);


return t;

}
Hỏi đáp

×