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

Ngôn ngữ lập trình C - Chương 3 ppsx

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 (446.63 KB, 39 trang )

Ch
Ch
−¬
−¬
ng
ng
3
3
C
C
¸
¸
c
c
ki
ki
Ó
Ó
u
u
d
d
÷
÷
li
li
Ö
Ö
u ph
u ph
ø


ø
c h
c h
î
î
p
p
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
2
3.1 C++ v
3.1 C++ v
µ
µ
c
c
¸
¸
c ki
c ki
Ó
Ó
u d
u d
÷
÷
li
li
Ö
Ö

u ph
u ph
ø
ø
c h
c h
î
î
p
p
 3.1.1 Kiu d liu trong ngôn ng lp trình
– Kiu c s (vô hng)
• Gm các kiu d liu kí t, s (nguyên, thc), có th c kiu lôgic.
– Là các kiu c bn trong hu ht các ngôn ng lp trình.
• S dng khi cn biu din các d liu nguyên t, đn gin
– Kh nng biu din d liu b hn ch.
– Kiu phc hp (bc cao, dn xut)
• Kiu d liu phc hp: đc to thành t các kiu c s
– Còn gi là kiu bc cao hay kiu dn xut.
– Thc t lp trình đòi hi các kiu d liu phc tp
• Kiu d liu phc hp å tính cu trúc ca d liu å tng kh
nng biu din d liu.
– S dng trong các chng trình đòi hi kh nng biu din d liu
phc tp hn.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3
3.1 C++ v
3.1 C++ v
µ

µ
c
c
¸
¸
c ki
c ki
Ó
Ó
u d
u d
÷
÷
li
li
Ö
Ö
u ph
u ph
ø
ø
c h
c h
î
î
p
p
 3.1.2 Kiu d liu phc hp trong C++
– Các kiu d liu phc hp trong C++
• Kiu lit kê (enum)

• Kiu mng: mng mt chiu, mng nhiu chiu.
• Kiu cu trúc (struct): cu trúc, kiu hp (union), kiu trng bit.
– Kt hp các kiu d liu trong C++
• Có th t hp các kiu c s, phc hp vi nhau.
– Ví d: khai báo mt mng các cu trúc, hay khai báo mt cu trúc có
thành phn là mng, …
– t tên kiu d liu bng typedef trong C++
• Cú pháp: typedef tên_kiu_đã_có tên_mi;
• T khóa typedef thng s dng đ đt tên mt kiu d liu phc
hp å có th dùng tên đó đ khai báo bin sau này.
– Trong C, typedef thng dùng đ đt tên cho kiu cu trúc.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
4
3.1 C++ v
3.1 C++ v
µ
µ
c
c
¸
¸
c
c
ki
ki
Ó
Ó
u d
u d

÷
÷
li
li
Ö
Ö
u ph
u ph
ø
ø
c h
c h
î
î
p
p
 3.1.3 Kiu lit kê
– Khái nim: tp hp các giá tr đc lit kê tng minh
– Cú pháp: enum kiu_lit_kê {các_phn_t} các_bin;
• VD: enum Thu {T2, T3, T4, T5, T6, T7, CN} t1, t2;
• Có th có các khai báo bin th (lc b mt s thành phn), ví d
không có tên kiu, tên bin hay c tên kiu ln tên bin.
• Khai báo bin: Thu t3, t4;
– Chú ý: trong C bin enum thc cht là bin nguyên, tên sau t khóa
enum cha đc coi là tên kiu
å
phi khai báo bin theo cú pháp:
enum kiu_lit_kê bin_lit_kê;
– Chuyn kiu gia enum và int
• Có th chuyn kiu t đng t enum sang int

•  chuyn t kiu int sang enum phi dùng toán t ép kiu
– VD: int m=2; t1=(Thu)m;
– Trong C có th gán trc tip bin int cho bin enum.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
5
3.2 M
3.2 M


ng
ng
 3.2.1 Khai báo và đnh ngha mng
– Kiu mng
• Là kiu d liu bao gm dãy liên tip các phn t cùng kiu.
• S chiu ca mng là không gii hn.
• Kích thc mng đc tính bng tng s phn t ca mng.
• Mng cho phép thao tác vi mt dãy các phn t d liu mt cách
thun tin hn, hiu qu hn.
– Khai báo mng
• Mng mt chiu: kiu_d_liu tên_mng[kích_thc];
• Mng nhiu chiu:
kiu_d_liu tên_mng[kích_thc][kích_thc][…]…;
• VD: int A[10];
long B[20][10];
float C[10][20][30];
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
6
3.2 M

3.2 M


ng
ng
 3.2.2 Thao tác vi bin mng
– Truy nhp vào phn t mng
• Mng mt chiu: tên_mng[ch_s]
– Ch s có th là s thc
å
C++ t đng chuyn sang kiu nguyên.
• Mng nhiu chiu: tên_mng[ch_s][ch_s][…]…
– iu này th hin đnh ngha mng trong C++ ( ≠ Pascal).
• Chú ý 1: C/C++ không kim tra vic tràn ch s
– Vic s dng ch s vt khi phm vi cho phép có th gây li, chng
hn có th làm thay đi các bin khác trong chng trình.
• Chú ý 2: Tên mng là đa ch phn t đu ca mng
– Tên mng là hng con tr, cha đa ch phn t đu tiên ca mng.
– a ch các thành phn ca mng n chiu đc tính cho các phn t
con n-1 chiu (không tính theo kiu d liu).
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
7
3.2 M
3.2 M


ng
ng
 3.2.2 Thao tác vi bin mng

– Nhp d liu cho bin mng
• Nhp trc tip
– S dng hàm scanf (hoc cú pháp cin>>) cho tng phn t mng.
– Chú ý: trong TC 2.0 ch cho phép dùng toán t đa ch vi mng s
nguyên (mng kiu int).
• S dng bin trung gian
– Cách này không ngn gn bng cách nhp trc tip nhng có th tin
li hn khi ta cn x lý trên giá tr nhp vào trc khi gán cho mt
phn t mng.
• Trong thc t ta thng dùng vòng lp for đ nhp d liu.
– Ch s mng là tng ng vi bin điu khin.
– Mng có bao nhiêu chiu
å
dùng by nhiêu vòng for.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
8
3.2 M
3.2 M


ng
ng
 3.2.2 Thao tác vi bin mng
– Khi đu giá tr khi khai báo mng
• Nu không khi đu, mng s đc gán giá tr 0.
• Cú pháp:
kiu_d_liu tên_mng[k.thc] = {g.tr_1,g.tr_2, }
kiu_d_liu tên_mng[k.thc][…] = {{g.tr_1.1,
g.tr_1.2, }, {g.tr_2.1, g.tr_2.2, }, }

– Nu không mô t đ giá tr
å
các giá tr còn li đc ly ngu nhiên
(thng là 0).
– Nu không mô t kích thc mng
å
trình dch t xác đnh da vào
s giá tr đc khi đu.
• Không đc khai báo khi đu giá tr cho mng khai báo trong
thân hàm (k c hàm main).
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
9
3.2 M
3.2 M


ng
ng
 3.2.3 Xâu kí t
– Khái nim xâu kí t
• Xâu kí t là mng mt chiu các kí t (kiu char).
– Trong xâu kí t có kí t kt thúc xâu ‘\0’ hay NULL (≠ kí t kiu char)
å
kích thc mng ln hn s ký t trong xâu là 1.
• Không tn ti các phép toán so sánh, gán… trên xâu
–  thc hin các phép toán này, phi vit các đon mã lnh x lý trên
mng hoc dùng th vin.
– Mng các xâu:
• Là mng 2 chiu đc bit.

• Có th đc khai báo nh là mng các con tr.
• Thao tác trên mng các xâu: tng t nh thao tác trên mng
thông thng.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.2 M
3.2 M


ng
ng
 3.2.3 Xâu kí t
– Vào/ra vi xâu kí t
• Dùng hàm printf, scanf vi đnh dng %s cho bin xâu
– Nên dùng ch th fflush(stdin) (hoc cin.clear() nu dùng các
phép toán
>> và <<) trc khi nhp xâu.
• Dùng hàm puts và gets vi đi s là tên xâu.
– Cho phép nhp c kí t trng (kt thúc nhp bng cách gõ Enter).
• Xâu kí t có th khi đu bng mt danh sách các hng kí t hoc
mt hng xâu kí t.
– Hai cách này là nh nhau.
– Các thao tác khác trên xâu
• Tham kho các hàm x lý xâu trong th vin string.h
• Các hàm thông dng: ctrcmp, strcpy, strcat, strlen, strchr…
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr
3.3 Con tr
á

á
v
v
µ
µ
m
m


ng
ng
 3.3.1 Con tr mng
– Con tr và mng mt chiu
• Tên mng là đa ch đu ca mng (là mt hng con tr).
– Có th gán tên mng cho mt bin tr
å
thao tác trên bin tr ~ thao
tác trên tên mng (~ thao tác trên đa ch các phn t mng).
– VD: int A[10];
int *p;
p = A;
p[5] = 100;
*(p+5) = 100;
• Chú ý: tên mng không phi là bin tr å không th thc hin
phép toán s hc con tr (cng, tr, …) trên tên mng.
– Nu thc hin các thao tác thay đi giá tr đi vi tên mng, trình dch
s báo li.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr

3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.1 Con tr mng
– Con tr và mng nhiu chiu
• Có th khai báo con tr cho tr đn mng nhiu chiu
– Chú ý trong cách xác đnh đa ch phn t mng: phn t mng  đây
là mng con (vi s chiu ít hn 1) ch không phi là kiu c s.
– Có th dùng con tr đ duyt các phn t ca mng nhiu chiu nhng
phi chuyn kiu cho phù hp
– Nu không chuyn kiu, C++ s báo li.
– VD: int *p; int A[20][10];
p = (int*)A; //p = A å báo li!
//Chú ý: Trong C ch
cnh báo và chng trình vn làm vic
• Con tr nhiu cp và mng nhiu chiu
– Có th s dng cp phát đng đ to ra mng nhiu chiu.
– Cp con tr ~ s chiu ca mng.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD

3.3 Con tr
3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.2 Mng con tr và cp phát b nh đng
– Mng các con tr
• Kiu phn t ca mng là bin tr å mng các con tr
å
to ra mng vi các phn t có v trí (trong b nh) bt kì.
– VD: int *p[3]; int k, m, n, ;
p[0] = &k; p[1] = &m; p[2] = &n;
• Vic thao tác trên các bin tr s không tác đng đn các phn t
mà chúng tr đn å có nhiu u đim (thi gian, b nh…).
– Ví d: đ sp xp mng ch cn đi ch các con tr.
• Nu các bin tr tr đn mng å mng ca các mng
– Khác vi mng hai chiu, các mng con có th có v trí bt kì
å
có th
thao tác trên các mng con mà không tác đng đn các mng đó.
– VD: int *p[3]; int A[10], B[20], C[30];

p[0] = A; p[1] = B; p[2] = C;
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr
3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.2 Mng con tr và cp phát b nh đng
– Cp phát đng cho mng
•  cp phát đng cho mng ta s dng các hàm malloc, calloc,
realloc, farmalloc, farcalloc, farrealloc…
•  gii phóng b nh s dng hàm free.
• Mng mt chiu: s dng con tr
– Lu ý chuyn kiu con tr tr v thành kiu con tr phù hp.
• VD:
– Cp phát b nh:
int *i_ptr;
// cp phát mng 10 phn t
i_ptr = (int *) calloc (10, sizeof(int));
– Gii phóng b nh cho con tr sau khi dùng xong:

free(i_ptr);
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr
3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.2 Mng con tr và cp phát b nh đng
– Cp phát đng cho mng (tip)
• Mng nhiu chiu: s dng con tr nhiu cp
– Lu ý chuyn kiu con tr tr v thành kiu con tr phù hp.
• VD:
– Cp phát mng con tr sau đócp phát cho các con tr thành phn:
int **i_ptr;
i_ptr = (int **) calloc(10, sizeof(int *));
for (int i=0; i<10; ++i)
i_ptr[i] = (int *) calloc (10, sizeof(int));
– Gii phóng b nh ln lt cho các con tr thành phn:
for ( int i=0; i<10; ++i)
free(i_ptr[i]);

Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr
3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.3 Thao tác vi vect và ma trn
– Các phép toán c bn vi vect và ma trn:
• Cng, tr, nhân ma trn
• Nghch đo, chuyn v
• Tính đnh thc
• …
– Cu trúc chung khai báo vect và ma trn
• Vect: mng 1 chiu, ma trn: mng 2 chiu.
• Có th s dng cp phát đng.
– Cài đt các thao tác trên vect và ma trn
• X lý trên mng 1 chiu và 2 chiu.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.3 Con tr

3.3 Con tr
á
á
v
v
µ
µ
m
m


ng
ng
 3.3.3 Thao tác vi vect và ma trn
å
Bài tp ln!
– c tài liu
– Lp trình cài đt
• Vào/ra d liu (nên kt hp vi vào/ra tp tin (xem chng 5)).
• Các thao tác x lý trên véct và ma trn (cng, tr, nhân, …).
• Các bài toán trên vect và ma trn (tính đnh thc, nghch đo,
chuyn v, …).
• Các bài toán khác.
• T chc thành các hàm (xem chng 4).
– Có th xây dng thành mt th vin.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó

ó
c
c
 3.4.1 Khai báo và đnh ngha cu trúc
– Kiu cu trúc
• Mt kiu d liu bao gm tp hp các kiu d liu khác nhau kt
hp vi nhau di mt tên chung.
• Cu trúc cho phép x lý mt phn t có nhiu thuc tính khác
nhau mt cách thng nht. Các thành phn d liu đc truy
nhp thông qua tên.
• Khái nim cu trúc trong C++ ~ bn ghi trong Pascal hay FoxPro.
– Khai báo cu trúc
• Khai báo kiu d liu cu trúc:
struct tên_kiu_cu_trúc {
khai báo các thành phn;
};
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.1 Khai báo và đnh ngha cu trúc
– Khai báo cu trúc (tip)
• Các thành phn trong cu trúc có th là bt kì kiu d liu nào đã
đc đnh ngha, k c mt cu trúc khác.
• Khai báo bin cu trúc:
tên_kiu_cu_trúc tên_bin;

• Khai báo đng thi cu trúc và bin:
struct tên_kiu_cu_trúc {
khai báo các thành phn;
} tên_các_bin;
– Vi cách này, khi khai báo có th không cn tên kiu cu trúc. Tuy vy
nu không có tên, d nhiên không khai báo đc thêm bin mi ngoài
các bin khai báo khi đnh ngha kiu.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.1 Khai báo và đnh ngha cu trúc
– Mt s chú ý vi kiu cu trúc trong C:
• Khác vi C++, trong C tên sau t khóa struct cha phi là tên
kiu å cha th dùng đ khai báo å phi khai báo theo cú pháp:
struct tên_kiu_cu_trúc tên_bin;
•  khc phc điu này, trong C có th dùng t khóa typedef đ
đnh ngha kiu cho cu trúc đc khai báo:
typedef struct tên_đã_khai_báo tên_kiu;
khi đócóth dùng tên_kiu đ khai báo bin.
• Cng có th dùng typedef ngay khi khai báo kiu d liu:
typedef struct tên_cu_trúc {
//tên có th không cn các thành phn
} các_kiu_cu_trúc;
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD

3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.2 Thao tác vi bin cu trúc
– Truy nhp vào thành phn cu trúc
• Truy nhp ti thành phn: bin_cu_trúc.tên_thphn
– Toán t “.” gi là toán t truy nhp thành phn cu trúc. Nu mt
thành phn nào ca cu trúc cng là cu trúc
å
có th dùng toán t
này đ truy nhp đn các thành phn ca cu trúc con.
• Truy nhp ti thành phn cu trúc con:
bin_cu_trúc.tên_thphn_1.tên_thphn_1.1
•  tránh dài dòng trong vit mã, có th dùng cách khai báo sau:
#define tên_rút_gn bin_cu_trúc.tên_thphn_1
å Có th vit li lnh trên: tên_rút_gn.tên_thphn_1.1
– Có th thc hin phép gán trên hai bin cu trúc cùng kiu.
• Phép gán cu trúc s gán tng ng d liu các thành phn.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.2 Thao tác vi bin cu trúc

– Nhp d liu cho bin cu trúc
• C++ không đa ra các phng tin đ nhp liu cho bin cu trúc
å ngi lp trình phi thc hin.
• Nhp trc tip:
– S dng hàm scanf (hoc cú pháp cin>>) vi các thành phn cu trúc.
– Chú ý: trong TC 2.0 ch cho phép dùng toán t đa ch vi thành phn
nguyên (thành phn kiu int).
• S dng bin trung gian:
– Khai báo mt bin trung gian đ nhp d liu sau đó gán cho bin
nguyên thy (phép gán cu trúc là hoàn toàn hp l).
– Cách này không ngn gn bng cách nhp trc tip nhng có th tin
li hn khi ta cn x lý trên giá tr nhp vào trc khi gán cho mt
thành phn cu trúc.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.2 Thao tác vi bin cu trúc
– Khi đu cho cu trúc
• Các thành phn ca cu trúc có th khi đu nh khi đu các
bin thông thng (xem thêm phn ví d cui chng).
– Có th khi đu cho mng cu trúc bng cách lit kê các thành phn
ca chúng khi khai báo.
• Mi chú ý đi vi khi đu cho mng (xem phn trc) cng đc
áp dng cho cu trúc:
– Ch cho phép khi đu đi vi cu trúc ngoài (tnh).

– Vi mng cu trúc, nu kích thc đã đc khai báo là N thì s b
khi đu không đc vt quá N.
– Nu không mô t đ s b giá tr, các phn t còn li nhn giá tr 0.
– Nu không khai báo kích thc, trình dch s cn c vào s b khi
đu đ xác đnh kích thc.
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó
ó
c
c
 3.4.3 Kiu hp và kiu trng bit
– Khái nim chung:
• Là các kiu cu trúc mà các thành phn (trong b nh) ca chúng
đc lu tr mt cách đc bit.
• Thng đc s dng trong các bài toán cn x lý  mc sâu v
h thng (bit – byte).
– Kiu hp (union)
• Khái nim
– Cha các kiu d liu khác nhau nhng dùng chung mt vùng nh.
– Kích thc ca union là kích thc ca phn t ln nht.
– Có th dùng union đ trích ra các byte ca s nguyên, hoc dùng đ
to ra các bin có th lu nhiu kiu d liu khác nhau, …
Bài ging C++. 14/10/2008
V.S.Nam. B/m KTHT, khoa CNTT, HXD
3.4 CÊu tr
3.4 CÊu tr
ó

ó
c
c
 3.4.3 Kiu hp và kiu trng bit
– Kiu hp (tip)
• Vic khai báo kiu hp hoàn toàn tng t nh khai báo kiu cu
trúc, khi đó thay cho t khóa
struct, ta dùng t khóa union.
– Vic đnh ngha bin, mng, con tr kiu hp cng nh cách thc truy
nhp các thành phn hoàn toàn tng t kiu cu trúc.
– Mt cu trúc có th có thành phn hp và ngc li.
• iu khác nhau duy nht ca kiu hp so vi kiu cu trúc là các
bin này dùng chung mt vùng nh.
– Vic thay đi giá tr ca mt trng
å
thay đi giá tr trng khác.
–  ln vùng nh đ đ cha đc thành phn kích thc ln nht.
• Kiu hp không tên: to ra các bin dùng chung vùng nh.
– Có th truy nhp trc tip các trng bng tên ca chúng.

×