Chương 3
Hàm (Function)
Lp trình đơn th
M
i module có d
li
u riêng
độ
c l
p v
i module khác
Main Program(Also a module)
Data
Module
1
+
Data Data
1
Procedure
1
Module
2
+
Data Data
2
Procedure
2
Procedure
3
Lp trình đơn th(tt)
“Chia để tr”: phân rã bài toán thành các bài
toán con cho đến khi “bài toán con” nhn
được “đủ nh”.
Mi “bài toán con” được gii quyết bng mt
module, độc lp vi các module khác.
Trong C mi module chính 1 hàm.
Phân tích: top down.
Thiết kế: bottom up.
Lp trình đơn th(tt)
Bài toán ban đầu
module1 module2 ...
module11 module12
modulek
...
phân tích
thiết kế
Ưu đim ca phương pháp lp trình đơn th?
pháp ca hàm
<type_function> f_name(parameters)
{
/* các khai báo cc b*/
/* các câu lnh */
[return <Exp>;] /* có th hoc không*/
}
pháp ca hàm (tt)
d
1:
void chao()
{
printf(“\nxin chao”);
}
d
2:
int tong(int n)
{
int i,t=0;
for(i=1;i<=n;++i)t=t+i;
return t;
}
pháp ca hàm (tt)
d3:
int ucln(int x, int y)
{
while(x*y)
if(x>y)x=x%y;
else y=y%x;
return (x+y);
}
Li gi hàm
d:
chao();
kq1=tong(12); kq2=tong(kq1);
kq3=ucln(kq1,15);
thkhông có
<tên_hàm>([danh sách tham sthc])
Các bước thc hin li gi hàm
Gisint a, b, kq; là các biến toàn cc và
a=6; b=8;
Xét li gi hàm: kq = ucln(a,b); (*)
Khi đó các bước sau đây được thc hin:
B1: Lưu địa chca câu lnh kếtiếp sau li gi
hàm (*) làm địa chquay vsau khi kết thúc
hàm.
B2: Cp phát vùng nhcho các tham s các
biến cc b.
Các bước thc hin li gi hàm (tt)
6 8
a b
Data Segment
Stack Segment
x y
kq
(bước 2)
Các bước thc hin li gi hàm (tt)
B3: Sao chép giá trca tham sthc
cho tham shình thc
6 8
a b
6 8
x y
kq
Các bước thc hin li gi hàm (tt)
B4: Thc hin các câu lnh trong thân
hàm.
6 8
a b
0 2
x y
kq
Các bước thc hin li gi hàm (tt)
B5: Trli kết qubi lnh return.
6 8
a b
0 2
x y
kq
2
Các bước thc hin li gi hàm (tt)
B6: Gii phóng các
vùng nhđã cấp phát
B2, ly địa ch đã
lưu B1 thc hin
tiếp chương trình.
6 8
a b
2
kq
Cơ chếtruyn tham tr
Giá trca tham sthc được sao chép
cho tham shình thc.
Tham sthc luôn luôn được bo toàn.
Như dtrên giá trca a và b sau
khi thc hin (*) vn không thay đổi
(trong khi x và y đã thay đổi).
Con tr(pointer) và cơ chế truyn
địa ch
Định nghĩa: con tr biến dùng để cha
địa chca biến khác.
Khai báo:
d:
<kiu_ct> *<tên_ct>;
int *p;
Khai báo con tr
kiu nguyên int
Cách sdng con tr
Dùng tên con tr
, gi
ng nh
ư
m
t bi
ế
n bình th
ườ
ng.
Dùng d
ng khai báo *<tên_ct>, cho k
ế
t qu
d
li
u
con tr
ỏ đang
“tr
t
i.
th
dùng các phép toán
đố
i v
i con tr
(ph
n sau)
d
:
int x=13, *p;
p=&x; //p tr
t
i x.
printf(“\n%d duoc luu tai dia chi %p”,x,p);
printf(“\np dang tro toi du lieu la %d”,*p);
Cách sdng con tr(tt)
13
&x
x=*p
p
Truyn địa ch
Trong nhng trường hp cn làm cho
tham sthc bị thay đổi thì phương
pháp truyn tham trị không đáp ng
được. Vy cn có mt phương pháp
khác, đó là:
Tham shình thc nhn địa chca
tham sthc (nên tham shình thc
phi là mt con tr).
Truyn địa ch
d:
void hoan_vi(int *x, int *y)
{
int t=*x;
*x=*y;
*y=t;
}
Gisint a,b là các biến toàn cc và a=5; b=7;
Xét li gi hàm: hoan_vi(&a,&b); khi đó: