2. Nhập/xuất dữliệu
5.3.1.1. Khởi tạo giá trị cho cấu trúc
Ta có thể khởi tạo giá trị cho cấu trúc ngoài, cấu trúc tĩnh, màng cấu trúc ngoài và mảng cấu trúc tĩnh bằng cách viết vào sau khai báo của chúng một danh sách các giá trị cho các trường
Ví dụ 5.3.3 struct address { char ho_ten[30]; int sonha; char duong[30]; char quan[20]; };
struct address X={“Tran Hai Yen”,13,’’Ton Due Thang”,’’Dong Da”};
Đoạn chương trình này định nghĩa một kiểu cấu trúc có tên là address và khai báo một biến cấu trúc có tên là X và khởi tạo giá trị cho các trường của nó như sau:
x.hoten có giá trị là “Tran Hai Yen” x.sonha có giá trị là 13
x.duong có giá trị là “Ton Due Thang” x.quan có giá trị là “Dong Da”
Ví dụ 5.3.4 struct date { int ngay; int thang; int nam; } ngay_sinh[]= { {31, 10,1976}, {30, 11,1978}, {14, 12,1980}, {10,9, 1983} };
Tương tự như đối với các mảng khác, khi khởi tạo một mảng cấu trúc ta khơng cần chỉ rõ kích cỡ của nó. Lúc đó kích cỡ của các mảng được khởi tạo sẽ được xác định một cách chính xác khi dịch chương trình thơng qua số các bộ khởi tạo.
Lưu ý:
- Chỉ cho phép khởi tạo giá trị cho các biến cấu trúc và màng cấu trúc ngoài (tĩnh). Chúng sẽ nhận giá trị 0 nếu không được khởi tạo.
- số bộ khởi tạo của mảng cấu trúc không được vượt quá kích thước của mảng trong khai báo. Mỗi bộ khởi tạo là giá trị của một phần tử của màng cấu trúc. Nếu kích thước của mảng là n và sổ bộ khởi tạo là m thì chỉ có m phần tử đầu của mảng được khởi tạo, n-m phần tử còn lại nhận giá fri 0.
- Việc khởi tạo sẽ được thực hiện một lần khi dịch chương trình.
5.3.I.2. Phép gán cẩu trúc
Ta 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:
1. Gán hai biến cấu trúc cho nhau.
2. Gán biến cho phần tử của màng cấu trúc. 3. Gán phần tử mảng cấu trúc cho biến. 4. Gán hai phần tử mảng cấu trúc cho nhau.
Điều này hoàn toàn tương tự như trong ngôn ngữ Pascal. Mỗi phép gán nói trên tương đương với một dãy phép gán các trường tương ứng.
Ví dụ 5.3.5:
Với khai báo biến struct address { char ho_ten[30]; int sonha; char duong[30]; char quan[20]; }X, Y; Thì câu lệnh X=Y Sẽ cho kết quả là:
x.ho ten nhận giá trị của Y.ho ten; x.sonha = Y.sonha;
x.duong nhận giá trị của Y.duong; x.quan nhận giá trị của Y.quan;
Lưu ý:
Khác với Pascal có phép so sánh bằng nhau và khác nhau giữa hai bản ghi, trong c thì khơng cho phép so sánh hai cấu trúc với nhau. Để minh họa cho các kiến thức trong hai phần 5.1, 5.2 và 5.3 ta xét ví dụ tổng hợp sau:
Ví dụ 5.3.6 : Viết chương trình xây dựng cấu trúc cho sinh viên với
các thông tin như sau: Họ tên
Ngày sinh Điểm tổng kết Yêu cầu thực hiện:
- Nhập thông tin cho một danh sách sinh viên và sau đó in thơng tin đó ra màn hình.
- Sắp xếp lại danh sách theo thứ tự giảm dần của điểm tổng kết và in lại danh sách sau khi đã sắp xếp.
#include <conio.h> #include <stdio.h> #include <string.h> struct sv { char ten[30]; char ns[15]; float dtk; /* ngay sinh */ /* diem tong ket */ };
svtg; sv ds[100]; int n,ij;
void main() {
printf("\n Nhap so sinh vien cua danh sach n="); scanf("%d",&n);
for (i=0;i<n;i++) {
fflush(stdin);
printf("\n Nhap ten:"); gets(ds[i].ten);
printf("\n Nhap ngay sinh:"); gets(ds[i].ns);
printf("\n Nhap diem tong ket:"); scanf("%f’,&ds[i].dtk);
}
/* in danh sach truoc khi sap xep */
printf("\n Danh sach truoc khi sap xep la:"); for (i=0;i<n;i++)
printf("\n %30s sinh ngay %10s co dtk la %4.1f', ds[i].ten, ds[i].ns,ds[i].dtk);
/* sap xep danh sach */ for (i=0;i<n-l;i++) for (j=i+l;j<nỹ++) if (ds[i].dtk<ds[j].dtk) { tg=ds[i]; ds[i]=ds[j]; ds[j]=tg; }
/* in ra danh sach sau khi sap xep */ printf("\n Danh sach sau khi sap xep la:"); for (i=0;i<n;i++)
printf("\n %30s sinh ngay %10s co dtk la %4.1 f',ds[i].ten,ds[i].ns,ds[i].dtk);
getch(); }