Mảng cấu trúc:

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 57 - 61)

3. Xây dựng và thực hiện các yêu cầu sau:

5.1.3 Mảng cấu trúc:

Như đã đề cập ở các chương trước, khi sử dụng một kiểu giá trị ( ví dụ như kiểu int ) ta có thể khai báo các biến và các mảng kiểu đó.

Ví dụ như khai báo : int a,b,c[10];

cho ta hai biến nguyên là a,b và một mảng ngun c có 10 phần tử.

Hồn tồn tương tự như vậy : ta có thể sử dụng một kiểu cấu trúc đã mô tả để khai báo các cấu trúc và mảng cấu trúc.

struct tên_kiểu_cấu_trúc_đã_định_nghĩa tên_mảng_cấu_trúc[số phần tử của mảng];

Ví dụ :

Ví dụ 1 :

Giả sử kiểu cấu trúc canbo đã được định nghĩa như mục trên. Khi đó dịng khai báo :

struct canbo cb1,cb2,nhom1[10],nhom2[7]; sẽ cho :

Hai biến cấu trúc cb1 và cb2.

Hai mảng cấu trúc nhom1 co 10 phần tử và nhom2 có 7 phần tử và mỗi phần tử của hai nhóm này có kiểu canbo.

Ví dụ 2 :

Đoạn chương trình sau sẽ tính tổng lương cho các phần tử nhóm 1: double tongluong=0;

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

tongluong+=nhom1[i].luong;

Chú ý :

Khơng cho phép sử dụng phép tốn lấy địa chỉ đối với các thành phần của mảng cấu trúc khác kiểu nguyên. Chẳng hạn không cho phép sử dụng câu lệnh sau :

scanf("%f",&nhom1[5].luong);

Trong trường hợp này ta dùng biến trung gian. Phép gán cấu trúc :

Có thể thực hiện phép gán trên các biến và phần tử mảng cấu trúc cùng kiểu như sau :

 Gán hai biến cấu trúc cho nhau

 Gán biến cấu trúc cho phần tử mảng cấu trúc  Gán phần tử mảng cấu trúc cho biến cấu trúc  Gán hai phần tử mảng cấu trúc cho nhau

Mỗi một phép gán trên tương đương với một dãy phép gán các thành phần tương ứng.

Ví dụ :

Đoạn chương trình sau minh hoạ cách dùng phép gán cấu trúc để để sắp xếp n thí sinh theo thứ tự giảm của tổng điểm :

struct thisinh {

char ht[25]; float td; } tg,ts[100];

for (i=1;i<=n-1;++i) for (j=1;j<=n;++j) if (ts[i].td<ts[j].td) { tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; }

Con trỏ cấu trúc và địa chỉ cấu trúc :

Con trỏ và địa chỉ : Ta xét ví dụ sau : struct ngay { int ngaythu; char thang[10]; int nam; }; struct nhancong { char ten[20]; char diachi[25]; double bacluong; struct ngay ngaysinh; };

Nếu khai báo :

struct nhancong *p,*p1,*p2,nc1,nc2,ds[100]; ta có :

 p, p1, p2 là con trỏ cấu trúc  nc1, nc2 là các biến cấu trúc  ds là mảng cấu trúc

Con trỏ cấu trúc dùng để lưu trữ địa chỉ của biến cấu trúc và mảng cấu trúc. Ví dụ :

p1=&nc1; /* Gửi địa chỉ nc1 vào p1 */ p2=&ds[4]; /* Gửi địa chỉ ds[4] vào p2 */ p=ds; /* Gửi địa chỉ ds[0] vào p */

Truy nhập qua con trỏ: Có thể truy nhập đến các thành phần thông qua con trỏ theo một trong hai cách sau :

Cách một : Tên_con_trỏ->Tên_thành_phần Cách hai : (*Tên_con_trỏ).Tên_thành_phần Ví dụ : nc1.ngaysinh.nam p1-> ngaysinh.nam ds[4].ngaysinh.thang (*p2). ngaysinh.thang Phép gán qua con trỏ: Giả sử ta gán : p1=&nc1; p2=&ds[4]; Khi đó có thể dùng : *p1 thay cho nc1 *p2 thay cho ds[4] 5.2 Kiểu hợp

- Định nghĩa: Hợp (union) là khối bộ nhớ dùng để lưu trữ dữ liệu với kiểu khác nhau. Khác với struct, các đối tượng dữ liệu có thể có cùng địa chỉ vùng nhớ lưu trữ. Khai báo cũng tương tự như struct.

- Khai báo: union automobile { int year; char model[8]; int engine_power; float weight; };

- Định nghĩa biến kiểu hợp:

union automobile sedan, pick_up, sport_utility; - Tổng hợp từ khai báo và định nghĩa biến cấu trúc:

union automobile { int year;

char model[8]; int engine_power; float weight;

} sedan, pick_up, sport_utility;

Tên tag bỏ qua nếu ta chỉ định nghĩa 1 lần và không định nghĩa các biến khác nữa. union { int year; char model[8]; int engine_power; float weight;

} sedan, pick_up, sport_utility;

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 57 - 61)