Khi bạn có khai báo trên thì trong ch−ơng trình bạn có thể dùng nó nh− một kiểu dữ liệu thông dụng
VD:
Đầu ch−ơng trình sau dấu { bạn viết: danhsách:sinhviên, sv[10]; Với khai báo này bạn có 1 biến cấu trúc tên là danhsách có 10 phần tử và có kiểu là sinhviên. Mảng cấu trúc có kiểu là danh sách.
Bạn nên nhớ là trong C phân biệt chữ hoa và th−ờng, cho nên khi đặt tên bạn phải thống nhất. Tốt nhất bạn nên viết th−ờng cả, và thêm 1 chú ý nữa là đặt tên nên ngắn gọn, dễ nhớ VD:ht <=>họtên.qq<=>quêquán...
Cách truy nhập:
Có một cách truy nhập duy nhất đó là:
Tên biến cấu trúc.tên tr−ờng; (ngăn cách giữa tên biến và tr−ờng là dấu (.)).
Còn một kiểu cấu trúc lồng nữa Tôi xẽ giới thiệu sau, vì Tôi muốn bạn làm quen dần dần, để chánh sự choáng ngợp kiến thức.
4. Ví dụ :
Phần I Tôi đã cho bạn công cụ làm việc đó là các vòng lặp. Và phần II này bạn
đã có nguyên liệu(là dữ liệu đầu vào). Bây giờ là lúc bạn có thể chế biến nó thành sản phẩm nh− ý muốn. Tôi xin làm mọt vài ví dụ mẫu, từ đó bạn có thể phát triển thành những gì mà bạn muốn.
Chú ý: Khi nhập dữ liệu kiểu char, bạn nên dùng câu lệnh gets(); để nhập ,
tr−ớckhi nhập bạn phải xóa bộ đệm bàn phím bằng câu lệnh: fflush(stdin);
Còn khi in thì vẫn dùng printf nh− bình th−ờng.
VD1:
Hãy nhập vào một danh sách cán bộ có 10 sinh viên mỗi cán bộ gồm 4 tr−ờng : họ tên, công, bậc l−ơng, và l−ơng(l−ơng = bậc l−ơng*công) .Sau khi nhập xong thì cuối cùng cho hiện danh sách đó ra màn hình. Với 1 chú ý là bạn phải dùng 1 biến trung gian để nhập giá trị cho các biến có kiểu là số thực nếu không khi nhập máy sẽ bị treọ
Ch−ơng trình : #include<coniọh>
#include<string.h> typedef struct { char ht[20]; int cong; float luong; float bluong; }cb; main() { clrscr(); cb a[10]; float l,bl; int c, i; for(i=0;i<3;i++) {
printf(" nhap ho ten nguoi thu: %d \n",i); fflush(stdin);
gets(a[i].ht);
printf(" nhap ngay cong:\n"); scanf("%d",&c); a[i].cong=c; printf(" nhap bac luong:\n");scanf("%f",&bl); a[i].bluong=bl; a[i].luong=a[i].cong*a[i].bluong;
}
printf("\n ***************KET QUA*******************"); for(i=0;i<3;i++)
{
printf("\n ho ten %d nguoi thu: %s",i, a[i].ht ); printf("\n ngay cong: %4d",a[i].cong);
printf("\n bac luong:%4.2f",a[i].bluong); printf("\n luong:% 4.2f",a[i].luong); }
getch(); }
Có lẽ ch−ơng trình này không cần giải thích gì hơn, vì nó cũng khá đơn giản. Nh−ng một điều chú ý cho là: Khi bạn nhập giá trị cho biến thực bạn không đ−ợc nhập trực tiếp, mà phải nhập thông qua 1 biến trung gian vì nếu nhập trực tiếp nh− vậy máy xẽ bị treọ
VD2:
Ví dụ có kết hợp với việc sử dụng hàm và con trỏ:
Hãy nhập vào từ bàn phím số liệu cho n sinh viên. Cấu trúc mỗi sinh viên gồm 3 tr−ờng là: họ tên, quê quán và tuổị Yêu cầu sử dụng 3 hàm
Hàm void sxếp(sinhviên *p; int n); để sắp xếp tăng dần theo thứ tự tăng dần của tuổịVì hàm này sau khi làm nhiệm vụ sắp xếp nó phải trả lại kết quả sắp xếp cho hàm main(), cho nên đối phải là con trỏ.
Hàm void in(sinhviên p;int n);để in kết quả sau khi sắp xếp.
Hàm main() là hàm chính để nhập dữ liệu và đ−a ra lời gọi đến các hàm khác khi cần thiết. Ch−ơng trình: #include<stdiọh> #include<coniọh> #include<string.h> typedef struct { char ht[40]; char qq[40] ; int t; }sinhvien;
void sxep(sinhvien *p,int n); void in(sinhvien p);
void sxep(sinhvien *p,int n) { int i,j; sinhvien tg; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(p[i].t>p[j].t) {
tg=p[i]; p[i]=p[j]; p[j]=tg; } } void in(sinhvien p) {
printf("\n ten nguoi: 5%s",p.ht); printf("\n que quan %s: ",p.qq); printf("\n tuoi:%d",p.t); } main() { clrscr(); sinhvien *p,ds[20]; int i,j,n;
printf("nhap so sinh vien n:="); scanf("%d",&n); for(i=0;i<n;i++)
{
fflush(stdin);
printf("\n nhap ten nguoi: %d",i);gets(ds[i].ht); printf("\n nhap que quan : "); gets(ds[i].qq); printf("\n nhap tuoi:"); scanf("%d",&ds[i].t);
}
sxep(ds,n); /* lời gọi hàm*/ for(i=0;i<n;i++)
in(ds[i]); /* lời gọi hàm*/ getch();
}
Giải thích quá trình làm việc: Sau khi soát lỗi xong, máy vào hàm chính bắt nhập vào n và thực hiện việc nhập dữ liệu vào biến cấu trúc có tên là danh sách. Nhập xong nó thấy có lời gọi hàm sxếp, biến t−ơng ứng là ds và nó đem biến này gán vào đối t−ơng ứng là con trỏ *p. Con trỏ p nhận địa chỉ của ds và thực hiện công việc sắp xếp,
sau khi sắp xếp nó lại chả kết quả về cho đối t−ơng ứng của nó là ds, tiếp theo nó gặp vòng for và cứ 1 giá trị của i nó lại gọi hàm in(ds[i]) một lần, và thực hiện việc in. Vì nó gửi(truyền) dữ liệu từ ds cho p, và p làm nhiệm vụ in ngay tại hàm in(p) mà không đem kết quả trở lại, cho nên ta không cần dùng con trỏ *p
Chú ý:
Có 2 cách gọi hàm đó là: 1. Truyền 1 lúc cả danh sách:
khi đó lời gọi hàm t−ơng ứng là (lấy trên làm ví dụ): sxếp(ds); /*trong hàm in có vòng for*/
2. Truyền từng phần tử 1: khi đó lời gọi là:
for(i=0;i<n;i++) /* trong hàm in(ds) không có vòng for*/
in(ds[i]); /* lời gọi hàm*/
Bạn nên cố gắng phân biệt hai tr−ờng hợp này, vì nó thể hiện tính đúng dắn của
thuật toán. Chứng minh cụ thể bằng ví dụ trên nếu bạn đ−a ra lời gọi hàm sxếp là:
for(i=0;i<n;i++)
Sxếp(ds[i]); vì truyền từng phần tử 1 nên nó lấy gì ra để so sánh.
Nh−ng đối với hàm in(ds); thì khác, vì nó truyền 1 lần 1 phần tử, hay truyền 1 lần nhiều phần tử cũng đ−ợc. Đôi lúc bạn phải tính đến sự thuận tiện của giải thuật. Vì giả sử Tôi kết hợp hàm tìm(ds) (chỉ tìm 1 ng−ời) với hàm in(ds), khi đó bạn dùng lời gọi hàm in theo cách 1 là vô cùng rở hơi (bạn thử nghĩ mà xem tại sao vậỷ)
Kết luận:
Trong phần này bạn chỉ cần hiểu 2 điều sau là bạn đã nắm khá vững vấn đề:
1. Bạn hiểu đ−ợc việc l−u trữ của máy tính => có mấy cách và phần này đang áp dụng cách nàọ?
2. Bạn hiểu việc sử dụng hàm và con trỏ nh− thế nàỏ. Khi nào thì dùng con trỏ, và việc truyền giá trị cho đối t−ơng ứng ra saỏ.
Phần này Tôi không cho bài tập vì nếu nh− bạn hiểu đ−ợc các ví dụ trên thì bạn có thể tự ra đề cho mình đ−ợc. Hoặc là trong sách có rất nhiều mong tự tham khảọ