file_goc_771413

56
Ngôn ngữ Lập trình C ++ Chương 5: Kiểu con trỏ và kiểu cấu trúc 1/56 CHƯƠNG 5: KIỂU CON TRỎ VÀ KIỂU CẤU TRÚC Mục tiêu Giới thiệu các kiến thức về kiểu Con trỏ và kiểu Cấu trúc: khái niệm, cách định nghĩa, khai báo biến con trỏ, biến cấu trúc, cách truy xuất dữ liệu bằng con trỏ và thao tác với từng thành phần của cấu trúc.

Upload: dangxoan200291

Post on 09-Nov-2015

1 views

Category:

Documents


0 download

DESCRIPTION

hay

TRANSCRIPT

Programming Languages (C)Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Mc tiêu
Gii thiu các kin thc v kiu Con tr và kiu Cu trúc: khái nim, cách nh ngha, khai báo bin con tr, bin cu trúc, cách truy xut d liu bng con tr và thao tác vi tng thành phn ca cu trúc.
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Ni dung
Mng con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Các phép toán trên con tr
Cp phát và gii phóng b nh cho con tr
5.1 Kiu Con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- a ch Là mt i lng dùng nh v (xác nh) v trí
i tng mun xác nh ây là các bin và các phn t (ô nh) cha d liu
xác nh c a ch ca mt i tng nào ó trong C++, ta s dng phép toán mt ngôi ly a ch là “&” theo cú pháp:
&itng
a ch và phép toán &
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
&Tenbien \\Ly a ch ca bin
Yêu cu:
Xác nh a ch ca i tng nu là mng, chui ký t?
a ch và phép toán &
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
cout<<&a[i]<<endl;
a ch và phép toán &
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Con tr là mt bin cha a ch ca bin khác.
Gi s P là con tr cha a ch ca bin x thì ta gi p tr ti x hay x c tr bi p.
Thông qua con tr, ta có th làm vic c vi ni dung ca ô nh mà con tr tr n.
Khai báo bin con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Trong ó:
- Kiu_d_liu là kiu d liu ca ô nh mà ta mun con tr tr ti.
- Du (*) nhm báo cho trình biên dch bit ang làm vic vi kiu d liu là kiu con tr
- tên_bin_con_tr cng c t theo quy tc t tên
=> Khai báo con tr có tên tên_bin_con_tr tr ti ô nh cha d liu có kiu_d_liu
Khai báo bin con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- S dng con tr
con tr có tênbincontr tr n bin (ô nh) có kiudliu ta cn phai gán con tr tênbincontr cho a ch ca bin(ô nh) cn tr n:
tênbincontr = a ch ca ô nh (bin) cn tr ti
Lu ý: Không th gán mt hng a ch c th cho bincontr
ly ni dung ô nh mà con tr tr ti ta s dng phép toán *.
Khai báo bin con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
int i=9, *q;
cout<<a<<endl;
cout<<p<<endl;
cout<<p1<<endl;
q=&i; cout<<q<<endl;
Khai báo bin con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Gán các con tr vi nhau (phi cùng kiu)
Các phép toán trên con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
p=&i; q=&j;
Các phép toán trên con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
+ Phép tng gim a ch:
p+n: Con tr tr n thành phn th n sau p
p-n: Con tr tr n thành phn th n trc p
Mt n v tng ca con tr bng kích thc ca bin c tr.
Chng hn, bin có kiu nguyên thì khi con tr tng hay gim mt n v tng ng vi 2 bytes
Các phép toán trên con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
int *p, i;
{
}
Các phép toán trên con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
+ Hiu 2 con tr: p – q
+ Phép toán so sánh: <, <=, >, >=…
Các phép toán này thng áp dng cho các con tr tr n các phn t ca cùng mt mng d liu
Các phép toán trên con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
+ Cp phát tnh
+ Cp phát ng
Cp phát và gii phóng b nh cho con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Cú pháp:
delete p;
delete[] p;
Cp phát và gii phóng b nh cho con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
cin>>*p;
p = new int;
Cp phát và gii phóng b nh cho con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Bài 1. Vit chng trình khai báo bin con tr kiu nguyên. Sau ó, nhp vào mt dãy gm 10 s nguyên. Hin th dãy ó ra màn hình:
Theo th t nhp vào
Theo th t ngc li
Bài 2. S dng con tr nhp vào mt dãy gm n s thc. Sau ó:
Hin th dãy va nhp ra màn hình
Hin th dãy va nhp ra màn hình sau khi ã sp xp
Cp phát và gii phóng b nh cho con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Lam thê nao ê inh nghia môt câu truc?
Cách khai báo biên cu trúc?
Lam thê nao ê lam viêc vi cac thanh phân cua câu truc?
5.2 Kiu cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Kiu cu trúc là kiu d liu bao gm nhiu thành phn có kiu khác nhau, mi thành phn c gi là mt trng (field)
Chng han, Sinh viên gôm nhiêu trng: ma sinh viên, ho tên, ngay thang nm sinh, gii tinh, quê quan, …
Khái nim
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Xác nh các kiu d liu n gin ca các bin thành phn c nhóm li trong cu trúc ó.
Cn ch ra: tên ca cu trúc và các thành phn ca nó. Phân bit thành phn này vi thành phn khác thông qua kiu d liu, tên bin và kt thúc bng du chm phy (;). Các thành phn ca cu trúc c t trong cp du móc nhn ({}) và dùng du chm phy (;) kt thúc vic nh ngha mt cu trúc.
nh ngha cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Cú pháp tng quát nh ngha mt kiu cu trúc nh sau:
struct Tên_kiu_cu_trúc
<Kiudl> <Bin 1>;
<Kiudl> <Bin 2>;
nh ngha cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
nh ngha cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Tên_kiu_cu_trúc <Bin 1>, <Bin 2>, …;
struct Ngaythang
struct Ngaythang
Khai báo bin cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Lu ý:
Có th va khai báo va khi to giá tr cho bin kiu cu trúc
- Không c phép gán trc tip mt b giá tr c th cho mt bin cu trúc.
Khai báo bin cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
};
Khai báo bin cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
};
Khai báo bin cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Nêu kiu struct c khai báo trc tt c các hàm, nó có hiu lc trong toàn b chng trình có s dng nó.
Nêu nó t bên trong mt hàm, thì ch có hàm ó c dùng nó.
- Thông thng kiu cu trúc c khai báo trong tp tiêu ê (.h) và c s dng trong chng trình bng lnh #include.
Phm vi ca cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Nêu biên cu trúc là thành phn trc tiêp ca mt cu trúc, ta truy cp theo cú pháp:
Tên_biên_cu_trúc.tên_thành_phn
- Nu bin cu trúc là thành phn trc tip ca mt cu trúc mà bn thân cu trúc này li là thành phn ca mt cu trúc khác ln hn, ta truy cp theo cú pháp:
Tên_bin_cu_trúc.tên_bin_cu_trúc.tên_thành_phn Tên_bin_cu_trúc.tên_bin_cu_trúc.tên_bin_cu_trúc.tên_thành_phn
- làm vic vi mt bin cu trúc, ta cn phi thao tác trên tng thành phn ca nó.
Truy cp thành phn ca cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Lu y:
i vi cu trúc, ta có th gán 2 giá tr bin cu trúc cho nhau. Phép gán này cng tng ng vi vic gán tng thành phn ca cu trúc
Truy cp thành phn ca cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
cout<<"Mon 1 : "; cin>>sv.Mon1;
cout<<"Mon 2 : "; cin>>sv.Mon2;
cout<<"Mon 3 : "; cin>>sv.Mon3;
hs = sv;
cout<<“Tong diem : "<<sv.Mon1+sv.Mon2+sv.Mon3<<endl;
cout<<“Tong diem : "<<hs.Mon1+hs.Mon2+hs.Mon3<<endl;
Truy cp thành phn ca cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Con tr cu trúc là con tr cha a ch ca mt bin cu trúc hoc mt vùng nh có kiu cu trúc nào ó.
Cách khi to mt con tr cu trúc:
+ Gán a ch ca mt bin cu trúc cho mt thành phn ca mng
+ Con tr c khi to bng vic s dng toán t new cp phát b nh
+ i vi con tr p tr n mng a, ta có th truy cp n các thành phn ca phn t mng:
p[i].Hoten; (p+i)->Hoten; *(p+i).Hoten;
Con tr cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
float Diem;
} lop[50];
Sinhvien *p;
cin.getline(lop[10].Hoten,30);
p = lop;
Con tr cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Các thành phn ca cu trúc cng ging nh các bin. Do ó, vic ly a ch ca các thành phn này cng tng t nh vi bin.
Chng hn: &Sinhvien.Hoten;
&Lop[10].Gioitinh;
a ch ca các thành phn cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Cách 1:
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.3 Cu trúc t tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.3 Cu trúc t tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.3 Cu trúc t tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.3 Cu trúc t tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.3 Cu trúc t tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Mng cu trúc là mng mà kiu phn t ca nó là kiu cu trúc.
Ví d: ta xét khai báo sau
Xây dng danh sách
sinh viên.
struct sinhvien
5.4 Mng cu trúc
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
5.5 Con tr và mng
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
- Con tr có th tr n mt bin hoc mt mng.
Khi ó, a ch ca mng chính là a ch ca phn t u tiên ca mng a[0]. a+i là a ch thành phn th i ca mng a.
Nu cho con tr *p tr n mng a ta gán: p=a hoc p=&a
Khi ó, giá tr d liu ca ca phn t a[0] là *p=a[0], phn t th i là *(p+i)=a[i]=*(a+i)
Chú ý: ta có th vit *(p+1), *(a+1), *(p++) nhng không th vit *(a++).
Con tr và mng mt chiu
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
cout<<"Nhap so phan tu cua mang n= "; cin>>n;
for (i=0;i<n;i++)
cout<<"In cac gia tri vua nhap "<<endl;
for (i=0;i<n;i++) cout<<a[i]; cout<<endl;
for (p=a;p<a+n;p++) cout<<*p; cout<<endl;
for (p=a,i=0;i<n;i++) cout<<*(p+i); cout<<endl;
for (i=0;i<n;i++) cout<<*(a+i); cout<<endl;
Con tr và mng mt chiu
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Mt con tr ký t có th xem nh mt xâu ký t, trong ó xâu chính là tt c các ký t k t byte con tr u tiên n byte “\0” gp u tiên. Vì vy, có th khai báo các xâu di dng con tr ký t nh sau:
char *st;
Con tr và xâu ký t
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Các hàm trên xâu vn c áp dng nh khai báo nó di dng mng ký t. Tuy nhiên, ta có th gán trc tip 2 xâu di dng con tr.
Ví d: char *st;
Con tr và xâu ký t
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Khi khai báo xâu dng con tr, thì nó vn cha cp phát b nh c th. Do ó, ta phi s dng toán t new xin cp phát b nh cho xâu vi dài cn thit.
Ví d 1: char *st, *s = new char[30];
strcpy(s, “Hello”);
st = s;
strcpy(s, “Hello”);
Con tr và xâu ký t
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
Khái nim chung
Mng con tr là mng mà các phn t ca nó là các con tr có cùng kiu.
Do phn t ca mng con tr là mt con tr tr n mt mng nào ó -> cho phép qun lý nhiu mng d liu cùng kiu.
5.6 Mng con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
kiudliu *tênmng[sphnt];
Tác dng: khai báo mng con tr có s phn t và kiu d liu c ch ra.
Chú ý: mng xâu ký t là trng hp riêng ca mng con tr nói chung, trong ó kiu d liu là kiu char
5.6 Mng con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
cin>>n;
cin.getline(Hoten[i],40);
for (i=0;i<n;i++)
cout<<Hoten[i]<<endl;
5.6 Mng con tr
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
BÀI TP THC HÀNH
1. Cho p, q là các con tr tr n ký t c. Gán *p = *q + 1. Khi ó, có th khng nh *q = *p – 1?
2. Cho p, q là 2 con tr tr n bin nguyên x = 10. Gán *p = *q + 5. Lúc này, giá tr ca *p và *q là bao nhiêu?
3. Cho p, q, r, s là các con tr tr n bin nguyên x = 5. Gán *q = *p + 1; *r = *q + 1; *s = *r + 1. *q = *s – 2. Hi giá tr ca bin x là bao nhiêu?
4. Không dùng mng, hãy nhp vào mt dãy s nguyên sau ó xut dãy ra màn hình theo th t ngc li.
5. Không dùng mng, hãy nhp vào mt dãy s nguyên sau ó in ra màn hình dãy ã c sp xp dãy theo chiu tng (hoc gim) dn?
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
BÀI TP THC HÀNH
6. Dùng con tr, nhp giá tr vào cho mt dãy các s thc. Sau ó, tìm và xut ra màn hình phn t ln nht và bé nht có trong dãy.
7. S dng con tr, nhp vào mt dãy ký t. Sau ó, tìm và thay th các ký t ‘a’ bng ký t ‘b’. Hin th ra màn hình dãy ký t trc và sau khi thay th.
8. Xây dng hàm nhp, xut, sp xp mng bt k bng cách s dng bin con tr làm tham s hình thc ca hàm. S dng các hàm trên vit chng trình nhp các giá tr vào cho mng sau ó xut ra màn hình các giá tr ca mng trc và sau khi sp xp
9. S dng con tr xây dng hàm tính tng 2 mng. Sau ó, xut ra màn hình kt qu tính c.
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
BÀI TP THC HÀNH
10. S dng con tr, nhp vào mt xâu ký t. Sau ó, m và xut ra màn hình tn sut xut hin các ký t trong xâu.
11. S dng con tr, nhp vào mt xâu ký t. Sau ó, m và xut ra màn hình các t có trong xâu.
12. Tính s ngày ã qua k t u nm cho n ngày hin ti. Quy c ngày c khai báo di dng cu trúc.
13. Nhp mt ngày tháng nm di dang cu trúc. Tính chính xác (k c nm nhun) s ngày ã qua bt u t ngày 1/ 1/ 1 n ngày va nhp.
14. Khai báo ngày tháng nm theo kiu cu trúc. Vit chng trình tính khong cách (s ngày) gia 2 tháng bt k
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
BÀI TP THC HÀNH
15. Vit chng trình nhp vào mt ngày tháng nm bt k. Xut ra màn hình ngày ó là th my nu ta xem ngày 1/ 1/ 1 là th 2.
16. Vit chng trình nhp vào 2 ngày nào ó ca tháng bt k ca nm bt k. Tính và hin th ra màn hình khong cách gia 2 ngày ó là bao nhiêu ngày.
17. Cho s phc di dng cu trúc gm có 2 phn là phn thc và phn o. Vit chng trình nhp vào 2 s phc bt k. Tính và xut ra màn hình kt qu tng, hiu, tích, thng ca chúng
18. Cho phân s di dng cu trúc gm 2 phn là t s và mu s. Vit chng trình nhp vào 2 phân s. Tính và hin th ra màn hình tng, hiu, tích, thng ca chúng sau khi ã rút gn.
Ngôn ng Lp trình C ++ Chng 5: Kiu con tr và kiu cu trúc
*/56
BÀI TP THC HÀNH
19. Vit chng trình nhp vào mt mng sinh viên, thông tin v mi sinh viên gm: Hoten, tuoi, quequan. Sp xp mng va nhp theo chiu tng dn ca chui. Sau ó, xut ra màn hình mng sau khi ã sp xp.
20. Cho hình ch nht di dng cu trúc gm chiu dài và chiu rng. Nhp vào mt mng các hình ch nht. Tính và xut ra màn hình chu vi, din tích tng ng ca mi hình.
21. To danh sách gm 10 s nguyên dng. Sau ó sp xp danh sách theo th t tng dn.
22. To danh sách LIFO gm 100 s nguyên t u tiên