• Con tr hàm có th dùng làm tham s hình th c cho hàm... Nói chung nó ch áp d ng cho ki u int hay char.
Trang 1Ch −¬ ng 4
Hμm vμ ph−¬ng ph¸p
Trang 5– B trí ch ng trình trong nhi u t p tin tách bi t.
– S d ng t p tin tiêu đ å thu n l i cho vi c th ng nh t ch ng trình,
d dàng hi u ch nh và b o trì ch ng trình.
Trang 64.2 Hµm
4.2.1 Khai báo và đ nh ngh a hàm
– C u trúc t ng quát c a hàm:
[ki u_giá_tr _tr _v ] tên_hàm([danh_sách_tham_s ]){
khai báo & l nh;
• Tr l i quy n đi u khi n (và giá tr ) cho hàm:
– Dùng l nh return [bi u_th c];
– L nh return có th vi t b t k đâu trong thân hàm.
– Khi hàm không tr v giá tr , ch c n vi t return;
– Trong C không c n l nh return n u hàm không tr v giá tr
Trang 74.2 Hµm
4.2.1 Khai báo và đ nh ngh a hàm
– Ki u giá tr tr v :
• Hàm không tr v giá tr å ki u_giá_tr _tr _v là void.
• Không vi t ki u giá tr tr v å ng m đ nh là int
• Không cho tr v ki u m ng.
– Danh sách tham s :
• Các tham s hình th c (cùng v i ki u t ng ng) cách nhau b ng
d u “,” không h n ch ki u (có th là ki u c s hay ph c h p).
• Hàm không có tham s å danh_sách_tham_s là void.
– Lúc này danh sách tham s c ng có th đ tr ng.
• Không vi t ki u tham s å ng m đ nh là int.
• Chú ý: trong C có th khai báo ki u tham s riêng ra sau, ví d :
double func(a,b) int a; float b;
Trang 84.2 Hµm
4.2.1 Khai báo và đ nh ngh a hàm
– Khai báo hàm nguyên m u:
• T t c hàm dùng trong ch ng trình ph i khai báo nguyên m u.
– Trong nguyên m u có th b tên các tham s (ch c n khai báo ki u) – C++ cho phép ép ki u tham s truy n vào cho phù h p.
• Trong C có th không khai báo nguyên m u, ho c ch c n khai báo tên hàm và giá tr tr v , không c n danh sách ki u tham s
– N u không khai báo, C t t o ra nguyên m u v i ki u tr v là int.
– T p tin tiêu đ (header file):
• M i th vi n trong C++ đ u có m t t p tin tiêu đ d ng *.h.
– T p tin này ch a khai báo c a các hàm trong th vi n (nguyên m u),
đ nh ngh a c a các ki u d li u, h ng dùng trong hàm đó.
• Ng i l p trình có th t o các t p tin tiêu đ riêng cho mình.
Trang 94.2 Hµm
4.2.1 Khai báo và đ nh ngh a hàm
– Con tr hàm:
• Gi ng nh bi n, m i hàm đ u có đ a ch å có th khai báo m t con tr hàm tr đ n hàm đó.
• Khai báo con tr hàm:
[ki u_gtr _tr _v ](*tên_bi n_tr _hàm) ([dsách_ths ]);
– VD: int(*fp) (int n, float x);
• Ý ngh a các thành ph n trong khai báo con tr hàm gi ng nh khai báo hàm.
• Mu n s d ng phép gán, con tr hàm ph i t ng thích v i hàm c
v ki u giá tr tr v l n danh sách tham s
• Con tr hàm có th dùng làm tham s hình th c cho hàm.
– Khi đó trong l i g i hàm, có th dùng tên hàm làm tham s th c.
Trang 104.2 Hµm
4.2.2 Tham s và giá tr tr v trong l i g i hàm
– Tham s và truy n tham s
• Tham s
– Tham s hình th c: đ i di n cho tham s th c (s truy n cho hàm)
Ki u giá tr c a tham s hình th c å quy t đ nh ki u tham s th c.
– Tham s th c: thông tin đ c truy n trong l i g i hàm M i tham s
th c t ng ng v i m t tham s hình th c.
• Truy n tham s
– Truy n theo tr (tham tr ): b n sao giá tr đ c truy n cho hàm (tham
tr ) å vi c thay đ i giá tr đ c truy n vào trong thân hàm không nh
h ng đ n giá tr ban đ u c a bi n.
– Truy n theo bi n (tham bi n): b n thân bi n đ c truy n cho hàm (tham bi n) å vi c thay đ i trong hàm s làm thay đ i giá tr bi n.
– Chú ý 1: trong C++ t t c tham s đ c truy n theo tr
– Chú ý 2: n u tham s truy n vào có kích th c l n (ví d nh c u trúc) ho c c n thay đ i giá tr bi n, nên truy n theo bi n.
Trang 114.2 Hµm
4.2.2 Tham s và giá tr tr v trong l i g i hàm
– Tham s và truy n tham s (ti p)
• Tham s hình th c c a hàm là con tr
– Trong C++ mu n truy n theo bi n có th s d ng con tr – Tham s hình th c là con tr å trong thân hàm có th thay đ i giá tr
bi n mà con tr đó tr đ n.
– M t s chú ý khi tham s hình th c là m ng (m t chi u, nhi u chi u).
• Tham s hình th c c a hàm là tham chi u
– Có th truy n tham s cho hàm b ng tham chi u å hàm s thao tác
tr c ti p trên bi n đó ~ truy n theo bi n.
– Vi c kh i t o tham s hình th c s th c hi n trong m i l i g i hàm – Tham s ng v i tham s hình th c là tham chi u ph i là bi n, tr
tr ng h p có t khóa const đ ng tr c khai báo tham s hình th c.
– Có th dùng tham chi u cho bi n tr , ví d : int *&adr;
Trang 124.2 Hµm
4.2.2 Tham s và giá tr tr v trong l i g i hàm
– Tham s và truy n tham s (ti p)
• Tham s hình th c c a hàm là con tr hàm
– Các hàm đ c g i trong hàm khác nên khai báo tr c.
– Có th g i hàm theo nhi u cách Ví d : f(x,m), (f)(x,m), (*f)(x,m) – Không có s khác bi t gi a vi c g i b ng tên hàm hay con tr hàm.
• Tham s ng m đ nh trong l i g i hàm
– C++ cho phép t o giá tr m c đ nh cho các tham s
– Giá tr ng m đ nh có th là bi u th c (không nhât thi t ph i là h ng).
– Khi khai báo nguyên m u, giá tr ng m đ nh c ng ph i kh i gán.
– Các tham s ng m đ nh ph i đ t cu i cùng trong danh sách tham s hình th c.
– Khi g i hàm, các tham s thi u ph i cu i cùng (tính t trái å ph i).
– Chú ý: khai báo giá tr ng m đ nh cho m t tham s là bi n tr å
ph i vi t d u * và d u = cách nhau.
Trang 13[ki u_giá_tr _tr v ] &tên_hàm ([danh_sách_ths ]){
khai báo & l nh;
}
• Chú ý r ng lúc này, l nh return ph i tr v m t bi n toàn c c
(t c là không ph i bi n đ c khai báo trong hàm).
– Bi n toàn c c là đ ta có th s d ng tham chi u c a hàm.
• V i giá tr tr v là tham chi u, ta có th s d ng phép gán cho tên hàm (gi ng nh gán giá tr cho bi n).
Trang 14• Hàm inline:
– C++ cho phép t o ra các hàm đ c thay th tr c ti p thành mã l nh máy ngay t i ch g i (inline).
– khai báo và đ nh ngh a hàm inline, ch c n thêm t khóa inline
Trang 154.2 Hµm
4.2.3 Các v n đ khác v hàm
– Hàm vi t t i ch (ti p)
• H n ch c a trình d ch đ i v i hàm inline:
– Không x lý theo cách inline v i các hàm ch a bi n static, l nh chu
trình, l nh goto, l nh switch, hàm đ quy, …
– Ngay c khi không có nh ng h n ch trên, n u b nh ch ng trình
đã quá l n, trình d ch c ng b qua yêu c u inline.
– Hàm main và tham s dòng l nh
• Hàm main đ y đ có hai tham s hình th c nh sau:
void main (int agrc, char *agrv[]) { … }
– agrc : s tham s đ c đ a vào.
– agrv[] : m ng các tham s đ a vào, cách nhau b i d u cách.
• Khai báo này đ c dùng khi c n s d ng các tham s dòng l nh cho vi c th c thi ch ng trình.
Trang 164.3 Chång hµm vµ chång phÐp to¸n
4.3.1 nh ngh a ch ng hàm
– Ch ng hàm
• C++ cho phép s d ng cùng m t tên đ đ nh ngh a các hàm khác nhau (khác ki u giá tr tr v và danh sách ki u các tham s ) å
ch ng hàm (overloading).
• VD: int max (int a, int b);
float max (float x, float y);
• Ch ng hàm còn đ c g i là đa d ng hóa hàm, t i b i hàm.
• Vi c xác đ nh g i hàm nào khi trong ch ng trình có hàm trùng tên là do trình d ch đ m nhi m.
– Trình d ch d a vào s khác nhau c a t p tham s đ đ i tên các hàm
å các hàm có tên khác nhau sau khi d ch.
– N u hai hàm có tên và t p tham s trùng nhau, trình d ch s báo l i, k
c khi ki u tr v khác nhau.
Trang 174.3 Chång hµm vµ chång phÐp to¸n
4.3.1 nh ngh a ch ng hàm
– Quy t c xác đ nh hàm phù h p khi g i hàm
• C n c vào s l ng và ki u c a các tham s đ g i hàm.
– Khi không có hàm nào có b tham s cùng ki u, trình d ch ch n hàm
có b tham s g n ki u nh t (b ng phép chuy n ki u).
– N u đã theo quy t c mà có h n m t hàm phù h p, trình d ch s báo l i.
• N u hàm có m t tham s å trình d ch tìm ki m hàm phù h p
t ng ng theo th t u tiên sau:
– Có tham s t ng ng th c s : phân bi t các ki u d li u khác nhau (c v d u).
– Có tham s t ng ng g n nh t (sau các chuy n đ i ki u d li u t
đ ng: char và short å int, float å double).
– Có tham s t ong ng sau các chuy n đ i ki u đ c C++ ch p nh n.
– Có tham s t ong ng sau các chuy n đ i ki u do ng i dùng đ nh ngh a.
Trang 184.3 Chång hµm vµ chång phÐp to¸n
4.3.1 nh ngh a ch ng hàm
– Quy t c xác đ nh hàm phù h p khi g i hàm (ti p)
• Theo th t u tiên trên, n u có h n m t hàm phù h p t i m t
m c u tiên, trình d ch s báo l i không xác đ nh đ c hàm.
• N u hàm có nhi u tham s , trình d ch xác đ nh hàm phù h p theo quy t c sau:
Trang 19– Nên dùng các phép chuy n đ i ki u (n u c n) đ t p tham s trong l i
g i hàm hoàn toàn trùng v i t p tham s c a m t hàm c n đ n, tránh
s nh p nh ng cho trình d ch.
• Ch ng hàm và g i hàm v i tham s có giá tr ng m đ nh có th
d n t i l i biên d ch.
– Khi g i hàm mà m t s tham s ng m đ nh b khuy t å có th có hai
l i g i hàm hoàn toàn gi ng h t nhau å trình d ch không xác đ nh
đ c hàm phù h p.
Trang 21• V i phép toán có hai toán h ng, hàm phép toán c n có hai tham s (ví d 1).
– Chú ý th t tham s v i các phép toán không giao hoán.
• V i phép toán có m t toán h ng, hàm phép toán có m t tham s (ví d 2).
• Thân c a hàm phép toán đ c vi t nh thân hàm thông th ng.
Trang 22– Có th k t h p nhi u phép toán khác nhau đ vi t công th c Có th s
d ng d u ngo c tròn đ quy đ nh th t các phép toán.
– Quy t c u tiên và trình t th c hi n các phép toán đ nh ngh a ch ng không có gì thay đ i so v i phép toán nguyên th y.
• Có m t s phép toán không th đ nh ngh a ch ng M t s phép toán khác ph i tuân theo m t vài ràng bu c nh t đ nh.
– Nên tuân theo m t s quy t c và có chi n l c s d ng đúng đ n.
– Xem các ví d chi ti t trong TLTK.
Trang 23– M t ph n có th gi i quy t đ c ngay.
– Ph n còn l i ch a th gi i quy t ngay, tuy nhiên nó gi ng bài toán ban
đ u v i đ ph c t p th p h n (~đ n gi n h n).
– Do bài toán m i gi ng bài toán ban đ u nên hàm có th g i đ n chính
nó đ gi i å ta có l i g i đ quy (hay b c đ quy).
• Nói chung đ quy là m t v n đ khá ph c t p, đ hi u đ c th u đáo ph i có ki n th c sâu v khoa h c máy tính.
Trang 244.4 §Ö quy
4.4.1 T ng quan v k thu t đ quy
– L u ý trong s d ng đ quy
• Vi c đ quy ph i k t thúc đ c sau h u h n b c:
– Sau m i l n g i đ quy, bài toán tr nên đ n gi n h n Vi c g i đ quy
k t thúc khi bài toán tr thành tr ng h p c s (hay suy bi n).
– Sau khi hàm đ quy gi i bài toán treong tr ng h p c s , nó tr l i
Trang 254.4 §Ö quy
4.4.1 T ng quan v k thu t đ quy
– L u ý trong s d ng đ quy (ti p)
• So sánh k thu t đ quy và ph ng pháp l p
– quy và l p đ u liên quan đ n quá trình l p Chúng có m t s đ c
đi m t ng t nhau (ki m tra đi u ki n k t thúc, c ch đ k t thúc,
tr ng h p l p vô h n, …).
– Ph ng pháp l p s d ng vòng l p, còn đ quy s d ng liên t c các l i
g i hàm å t n th i gian x lý và b nh (m i l n g i hàm ph i l u các bi n, ng c nh hi n t i, đ a ch quay v , …).
• Dùng đ quy hay l p ?
– Ph ng pháp l p có u đi m th c hi n nhanh, ch ng trình rõ ràng,
ti t ki m b nh , …
– quy th ng đ c s d ng trong nh ng bài toán ph c t p, ch có
th đ nh ngh a b ng các công th c đ quy, ho c các bài toán c n di n
đ t tr c quan và d hi u quá trình gi i quy t bài toán.
Trang 26} }
• Áp d ng : vi t ch ng trình và mô t quá trình đ quy tính n!
Trang 27– Khi c p phát đ ng, vùng này m r ng lên, khi gi i phóng, å thu h p.
• Vùng ng n x p (stack) (ch a các đ i t ng d li u c c b ).
– Khi s d ng hàm, kh i, …vùng này m r ng xu ng, khi ra kh i hàm,
kh i, … å thu h p.
• gi a 2 vùng nh đ ng trên là vùng nh t do, đ c dùng đ cung c p b nh cho c hai vùng đó.
– Tìm hi u thêm v c ch qu n lý b nh c a máy tính trong TLTK.
Trang 28– Thông th ng có hai ph m vi: c c b (bên trong m t kh i, m t hàm)
và toàn c c (t v trí khai báo đ n cu i ch ng trình).
• C p l u tr (storage class) đ c xác đ nh theo vùng b nh c p phát cho đ i t ng đó.
– Thông th ng có hai c p l u tr : t nh (c p phát b nh vùng c p phát t nh) và đ ng (c p phát b nh vùng heap).
Trang 294.5 T ch c b nh và qu¶n lý d÷ liÖu
4.5.2 Phân vùng l u tr và ph m vi s d ng
– Th hi n trong C++:
• Trong C++, các khái ni m trên đ c th hi n b i các t khóa
auto, extern, static, register và v trí khai báo :
– C ng là khai báo bi n c c b nh ng yêu c u trình d ch l u giá tr khai
báo trong các thanh ghi (å x lý nhanh h n) Yêu c u này s b b qua n u không còn đ thanh ghi Nói chung nó ch áp d ng cho ki u
int hay char.
– Ngày nay các trình d ch đã có kh n ng nh n bi t các bi n hay dùng
đ đ a vào thanh ghi, không c n thi t ph i có các t khóa này n a.
Trang 30– khai báo bi n c c b t nh å dùng t khóa static.
– Tuy không có tác d ng ngoài hàm khai báo nh bi n toàn c c,
nh ng bi n t nh c c b v n duy trì đ c giá tr c a chúng gi a các l n
g i hàm å có th s d ng trong l i g i hàm l n sau.
• T khóa extern:
– Cho phép s d ng tên bi n trên ph m vi nhi u t p tin ( đ c vi t và
d ch đ c l p sau đó liên k t v i nhau).
– T khóa extern tr c tên bi n báo cho trình d ch bi t bi n đó đã
đ c khai báo đâu đó r i å không ph i c p phát b nh n a.
– TC++3.0 cho phép vi t ch ng trình trên nhi u t p tin và liên k t v i nhau b ng cách s d ng t p tin project (*.prj).
Trang 31– Nhãn (tên : ) có ph m vi trong hàm (switch, goto).
– i t ng khai báo ngoài hàm å ph m vi t p.
– Bi n toàn c c, đ nh ngh a hàm, hàm nguyên m u å ph m vi t p.
– i t ng khai báo trong kh i { } å ph m vi kh i.
– Bi n c c b khai báo đ u hàm, tham s c a hàm å ph m vi kh i.
– Danh sách tham s hàm nguyên m u å ph m vi hàm nguyên m u (hàm nguyên m u không yêu c u tên, n u có å trình d ch b qua å
có th dùng l i các tên đó n i khác).
Trang 324.5 T ch c b nh và qu¶n lý d÷ liÖu
4.5.2 Phân vùng l u tr và ph m vi s d ng
– T p tin Project:
• Ch ng trình l n å n u đ trong 1 t p å l n, khó đ c, khó theo dõi, kích th c l n.
• kh c ph c tr ng i trên å vi t trên nhi u t p khác nhau, liên
d ng trong ch ng trình Th t c a chúng không quan tr ng.
• Thao tác trên m t t p tin Project : xem TLTK.
Trang 33• Có th tham kh o sách ti ng Vi t, chú ý hai cu n sách (v ngôn
Trang 34#ifdef (~#if define (tên_macro)
#ifndef (~#if !define (tên_macro))
v i c u trúc t ng t nh #if.
– M t s ch th ti n x lý khác
• Ch th #error
• Ch th #line
Trang 354.6 c thêm
4.6.3 Thu t toán và đ ph c t p tính toán
– Tham kh o các tài li u v thu t toán
• Trong giáo trình SV ch m i có khái ni m chung v thu t toán.
• hi u sâu v thu t toán và thao tác thành th o å ph i đ c thêm các tài li u chuyên sâu.
• Nên thao tác thành th o trên các thu t toán c b n và các c u trúc
d li u c b n.
• Nên tìm hi u thêm các thu t toán nâng cao và các c u trúc d li u
ph c t p h n.
– Thu t toán và đ ph c t p tính toán
• Tìm hi u thêm các thu t toán s p x p và tìm ki m ( đ ph c t p tính toán, u nh c đi m, tr ng h p áp d ng, ).
• Tìm hi u thêm v đ ph c t p tính toán (phân tích thu t toán).
Trang 364.6 c thêm
4.6.4 Các v n đ khác
– S đ c cung c p trong bài gi ng trên l p