Xem mẫu
- K THU T L P TRÌNH C
Chương 5: Xây d ng hàm
bangtqh@hotmail.com
04/2010
Khái ni m hàm (function)
• Hàm (function) là m t dãy các l nh nh m
th c hi n m t công vi c nào đó, thư ng
đư c s d ng nhi u l n
• Ví d
– Hàm tính sin, cos, tan, … trong toán h c
– Hàm tính max, min, TBC, TBN c a dãy s , …
• M t chương trình C là m t dãy các hàm,
trong đó có m t hàm chính, ñư c đ t tên là
main
• Trong C không ch p nh n khái ni m hàm
l ng trong hàm
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 2
- 04/2010
Ví d hàm trong C
#include
#include
float max2so(float a, float b); /* Nguyên m u c a hàm */
void main() /* b t đ u hàm chính */
{
float x, y;
printf(“Nh p vào 2 s : ”);
scanf(“%f%f”, &x, &y);
printf(“Giá tr l n nh t c a %f và %f là %f\n”, x, y,
max2so(x, y));
getch();
} /* k t thúc hàm main */
/* đ nh nghĩa hàm max2so */
float max2so(float a, float b)
{
float max; /* khai báo bi n c c b */
max = a > b ? a : b;
return max;
}
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 3
04/2010
Hàm trong C
• Đ nh nghĩa hàm
– Cú pháp
ki u_d _li u_tr _v _c a_hàm TÊNHÀM ([khai_báo_các_tham_s ])
{
/* các khai báo dùng riêng bên trong hàm n u có; */
/* các l nh bên trong hàm; */
[return giá_tr _tr _v ;]
}
– Đ nh nghĩa hàm có th ñ t trư c ho c sau hàm main
• N u đ nh nghĩa hàm đ t sau hàm main thi ph i khai báo
nguyên m u hàm (prototype) ñ u chương trình
• Nên đ nh nghĩa hàm sau hàm main và khai báo nguyên m u
hàm
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 4
- 04/2010
Hàm trong C
• Đ nh nghĩa hàm
– Ki u d li u tr v c a hàm và ki u d li u tham s là
ki u d li u chu n ho c do ngư i l p trình đ nh nghĩa
– Tên hàm và tên tham s ñ t theo quy t c tên bi n
– Câu l nh return là tùy ch n
• N u hàm không tr v giá tr , thì không c n có l nh return
• N u hàm tr v giá tr thì b t bu c ph i có l nh return, trong
trư ng h p này giá tr tr v ph i có cùng ki u v i ki u d
li u tr v c a hàm
– N u hàm không tr v giá tr thì khai báo ki u tr v c a
hàm là void
– N u hàm không có tham s hình th c có th s d ng t
khóa void, ho c không khai báo gì c
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 5
04/2010
Hàm trong C
• Lưu ý
– Không cho phép đ nh nghĩa m t hàm
bên trong hàm khác
– Các tham s hình th c và các bi n đ nh
nghĩa bên trong hàm (bi n c c b ) ch
đư c s d ng bên trong hàm đó
• Bài t p ví d
– Vi t hàm ki m tra 3 s th c có là 3 c nh
c a tam giác
– M r ng: n u là 3 c nh tam giác thì xác
đ nh đó là tam giác gì (cân, vuông, đ u)
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 6
- 04/2010
Hàm trong C
• L i g i hàm
– Hàm đư c s d ng thông qua l i g i hàm
– Cú pháp: tên_hàm ( [danh sách các tham s th c] );
– C n phân bi t
• Tham s hình th c hay ñ i: xu t hi n trong đ nh nghĩa hàm
• Tham s th c: xu t hi n trong l i g i hàm
– Ví d
max2so(12, 341);
– Lưu ý
• S tham s th c ph i b ng s tham s hình th c
• Ki u các tham s th c ph i phù h p v i ki u c a các tham
s hình th c
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 7
04/2010
Hàm trong C
• Ví d : vi t hàm tính giá tr n!
#include
#include
long giai_thua(int n); /* nguyên m u hàm */
void main(){
int n;
long gt;
printf("\nn = "); scanf("%d", &n); /* Đ c s n */
gt = giai_thua(n); /* g i hàm tính giai th a */
printf("\n n! = %ld\n", gt); /* In ra k t qu */
getch();
}
long giai_thua(int n) {
int i;
long gt = 1;
if (n < 0) gt = 0;
else
for (i=2; i
- 04/2010
Hàm - các khái ni m
• Tên hàm
• Ki u giá tr tr v c a hàm
• Đ i hay tham s hình th c
• Thân hàm
• Nguyên m u hàm / khai báo hàm
• L i g i hàm
• Tham s th c
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 9
04/2010
Bi n toàn c c, bi n c c b
• Bi n toàn c c: đư c khai báo bên ngoài thân hàm,
thư ng ñ u chương trình
• Bi n c c b : đư c khai báo bên trong thân hàm
• Ph m vi ho t đ ng
– Bi n toàn c c đư c s d ng k t v trí khai báo đ n cu i
chương trình
– Bi n c c b ch ñư c s d ng bên trong hàm đó.
• Th i gian s ng
– Bi n toàn c c b h y khi chương trình k t thúc
– Sau khi hàm k t thúc ho t đ ng thì các tham s hình th c
và các bi n c c b s b h y
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 10
- 04/2010
Bi n toàn c c, bi n c c b
• Ví d #include
#include
int i; /* Bi n toàn c c */
void vi_du(void);
void main(){
for(i=1; i
- 04/2010
Bi n toàn c c, bi n c c b
• Ví d v ph m vi ho t đ ng bi n
#include
#include
int a = 5; /* Bi n toàn c c */
void ham_vi_du() {
int cuc_bo = 1; /* Bi n c c b */
int a = 10; /* Bi n c c b */
printf(“Bi n c c b trong hàm ví d :\n cuc_bo = %d\n a = %d\n”,
cuc_bo, a);
}
void main() {
int cuc_bo = 100; /* Bi n c c b */
ham_vi_du(); /* G i hàm ví d */
printf(“Bi n c c b trong hàm main:\n cuc_bo = %d\n”, cuc_bo);
printf(“Bi n toàn c c:\n a = %d\n”, a);
getch();
}
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 13
04/2010
Bi n c c b ñ ng & tĩnh
• Bi n c c b ñư c chia làm hai lo i
– Bi n c c b ñ ng
• Bi n đư c c p phát b nh t ñ ng m i khi có l i
g i hàm
• Bi n c c b ñ ng không lưu gi giá tr m i khi hàm
k t thúc (t c b gi i phóng kh i b nh )
– Bi n c c b tĩnh
• Bi n c c tĩnh đư c khai báo bên trong thân hàm
nhưng v n t n t i ngay c khi hàm đã k t thúc
ho t đ ng
• Bi n c c b tĩnh đư c khai báo v i t khóa static
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 14
- 04/2010
Bi n c c b ñ ng & tĩnh
• Ví d #include
#include
void vi_du(void);
void main(){
int n;
for (n=1; n
- 04/2010
Ki u con tr (pointer)
• Đ a ch (address)
– V i m i bi n có các khái ni m:
• Tên bi n, ki u bi n, giá tr bi n
– Ví d :
• int i = 1;
• Bi n i ki u s nguyên có giá tr là 1
• Máy tính c p phát m t vùng nh 2 byte liên t c đ lưu tr giá
tr c a bi n i
– Đ a ch bi n là s th t c a byte đ u tiên trong dãy các
byte liên t c nhau máy dành đ lưu tr giá tr bi n
– Đ l y đ a ch bi n, s d ng toán t “&”
• Ví d : &i
– Lưu ý, máy tính phân bi t các ki u đ a ch : đ a ch ki u int,
đ a ch ki u float, đ a ch ki u long, …
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 17
04/2010
Ki u con tr (pointer)
• Con tr (pointer)
– Là m t bi n dùng đ ch a đ a ch
– Có nhi u lo i con tr tương ng v i các ki u đ a ch khác
nhau
• Ch ng h n, con tr ki u int tương ng đ a ch ki u int, …
– Cú pháp khai báo con tr
ki u_d _li u *tên_con_tr ;
– Ví d
int i, j, *pi, *pj;
pi = &i; /* pi là con tr ch a ñ a ch bi n i */
pj = &j; /* pj là con tr ch a ñ a ch bi n j */
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 18
- 04/2010
Ki u con tr (pointer)
• Gi s có
– px là con tr ñ n bi n x, thì các cánh vi t x và *px là
tương đương nhau
• Ví d
int x, y, *px, *py;
px = &x;
py = &y;
x = 3; /* tương đương v i *px = 3 */
y = 5; /* tương đương v i *py = 5 */
/* Các câu l nh dư i đây là tương ñương: */
x = 10*y;
*px = 10*y;
x = 10*(*py);
*px = 10*(*py);
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 19
04/2010
Truy n tham s cho hàm
• Xét ví d
#include
#include
void hoan_vi(int a, int b); /* nguyên m u hàm, prototype */
void main(){
int n=10, p=20;
printf(" Trư c khi g i hàm : %d %d\n", n, p);
hoan_vi(n, p);
printf(" Sau khi g i hàm : %d %d\n", n, p);
getch();
}
void hoan_vi(int a, int b){
int t;
printf(" Trư c khi hoán v : %d %d\n", a, b);
t=a;
a=b;
b=t;
printf(" Sau khi hoán v : %d %d\n", a, b);
}
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 20
- 04/2010
Do cơ ch bi n c c b Chương trình trên
hay tham s hình th c cho k t qu
b gi i phóng b nh không đúng !
khi hàm k t thúc
• Hãy truy n tham s th c
cho hàm là đ a ch bi n thay
vì truy n giá tr bi n
• S d ng tham s là con
tr
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 21
04/2010
#include
#include
void hoan_vi(int *a, int *b); /* nguyên m u hàm, prototype */
void main(){
int n=10, p=20;
printf(" Trư c khi g i hàm : %d %d\n", n, p);
hoan_vi(&n, &p);
printf(" Sau khi g i hàm : %d %d\n", n, p);
getch();
}
void hoan_vi(int *a, int *b){
int t;
printf(" Trư c khi hoán v : %d %d\n", *a, *b);
t=*a;
*a=*b;
*b=t;
printf(" Sau khi hoán v : %d %d\n", *a, *b);
}
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 22
- 04/2010
Truy n tham s cho hàm
• Khi nào thì dùng tham s là con tr ?
– C n phân bi t hai lo i tham s hình th c
• Tham s hình th c ch nh n giá tr truy n vào
đ hàm thao tác, trư ng h p có th g i là
tham s vào
• Tham s hình th c dùng đ ch a k t qu c a
hàm, trư ng h p này có th g i là tham s ra
– Đ i v i tham s ra ta ph i s d ng ki u con
tr
• Bài t p
– Gi i thích tham s c a l nh scanf
– Vi t hàm gi i phương trình b c hai
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 23
04/2010
Hàm đ quy trong C
• Là hàm mà t trong thân hàm có
l i g i t i chính hàm đó
• Hàm đ quy ñư c xây d ng d a
trên đ nh nghĩa đ quy trong toán
h c
• Ví d : ñ nh nghĩa giai th a c a n
(n!)
n! = 1.2.3…n
Ho c
n! = 1 khi n = 0
n.(n-1)! khi n >= 1
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 24
- 04/2010
Hàm đ quy trong C
– Vi t hàm đ quy tính n!
long giai_thua (int n){
if (n==0)
return(1);
else
return (n * giai_thua(n-1));
}
– S d ng hàm đ quy c n m t b nh x p ch ng LIFO
(Last In, First Out stack) đ lưu tr các giá tr trung gian
– Gi i thích cơ ch ho t đ ng hàm giai_thua v i l i g i hàm
giai_thua(3)
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 25
04/2010
Hàm đ quy trong C
• Đi u gì x y ra n u có l i g i hàm sau
k = giai_thua(-1);
• Kh c ph c ?
• H n ch c a hàm đ quy
– Dùng nhi u b nh
• Hãy vi t l i hàm giai_thua s d ng vòng l p
• So sánh hai cách vi t đ quy và l p
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 26
- 04/2010
Hàm đ quy trong C
• Hàm đ quy thư ng phù h p đ gi i quy t
các bài toán có ñ c trưng
– Bài toán d dàng gi i quy t trong m t s trư ng
h p riêng, ñó chính là đi u ki n d ng đ quy
– Trong trư ng h p t ng quát, bài toán suy v
cùng d ng nhưng giá tr tham s b thay ñ i
• Ví d : Tìm ư c s chung l n nh t c a hai
s nguyên dương
– Ư c s chung l n nh t c a hai s nguyên
dương đư c đ nh nghĩa như sau
• n u x = y thì usc(x, y) = x
• n u x > y thì usc(x, y) = usc(x-y, y)
• n u x < y thì usc(x, y) = usc(x, y-x)
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 27
04/2010
int usc(int x, int y){ 1. Vi t l i hàm usc dùng vòng
if (x == y) l p
return (x); 2. Hãy vi t chương trình s
else if (x > y) d ng hàm đ quy ñ t o
return usc(x-y, y);
dãy s Fibonacci
else
return usc(x, y-x); – Dãy s Fibonacci là dãy
} s F1, F2, F3, .... Fn có
quy lu t:
Fn = Fn-1 + Fn-2
V i F1=1, F2=1
– Vd: 1, 1, 2, 3, 5, 8, 13, 21, ...
3. Vi t hàm đ quy ñ o
Hàm đ quy tìm Ư c s chung
ngư c 1 xâu ký t s b t kỳ
l n nh t c a 2 s x, y nh p t bàn phím
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 28
- 04/2010
Hàm chu n trong C
• Là các đã đư c đ nh nghĩa s n
• printf, scanf, puts, gets, … (thư vi n stdio.h)
• clrscr, getch, getche, … (thư vi n conio.h)
• rand, randomize, … (thư vi n stdlib.h)
• abs, fabs, sqrt, sin, cos, tan, … ( thư vi n math.h)
• …
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 29
04/2010
bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 30
nguon tai.lieu . vn