Đ i H c Bách Khoa Hà N i ộ ạ ọ Vi n Đi n T - Tin H c ọ ử ệ
ệ
Ngôn ng l p trình C/C++
ữ ậ
Ch ươ ấ
1
ng 6: Hàm và c u trúc ng trình ch ươ
Các n i dung chính
ộ
ng trình ộ ươ
ươ
2
t trong ch ng trình • C u trúc m t ch ấ • Hàm • Cách t ch c ch • M t s lo i bi n đ c bi ế ổ ứ ộ ố ạ ng trình ệ ặ ươ
C u trúc m t ch
ng trình
ấ
ộ
ươ
• Mô hình h ướ ng ch c năng ứ
main
F1
F2
F3
F1.1
F1.2
F1.3
F2.1
F2.2
F2.3
F3.1
F3.2
3
C u trúc m t ch
ng trình
ấ
ộ
ươ
ng trình gi i PT • VD: các ch c năng c a ch ứ ủ ươ ả
b c 2ậ
main
Tính delta
Nh p các ậ h sệ ố
Tính các nghi mệ
4
Hàm
ấ ộ
5
• Khái ni m ệ • Phân lo iạ • C u trúc m t hàm • Các thao tác c b n trên hàm ơ ả
Hàm
ủ
ỗ ươ c cài đ t b ng
ng trình đ
ng trình. M i ặ ằ
– Là m t đ n v ch c năng c a ch ị ứ ượ
ủ
ứ ộ
c g i là “ch
ng trình con”
ươ
ề – Nên hàm còn đ ạ
ượ ọ • Phân lo i: trong C phân làm 2 lo i hàm: ạ ng trình ươ
– Hàm main: là hàm chính c a ch – Hàm con: là các hàm còn l
ủ iạ
6
• Khái ni m:ệ ộ ơ ch c năng c a ch ươ m t ho c nhi u hàm ặ
Hàm
ủ
• C u trúc c a m t hàm: g m 2 ph n ầ ộ
i g m tên hàm, ki u giá tr tr v ( ể
ị ả ề void
ồ ạ ồ
ho c m t ki u DL), và danh sách các tham s (có th r ng)
ộ
ố
ấ – Ph n đ u ầ ầ (header): l ể ặ – Ph n thân (body): là kh i l nh ch a các l nh cài đ t cho ch c ầ
ể ỗ ặ
ố ệ
ứ
ứ
ệ
năng c a hàm. ủ
Header
Body
float tinhDelta(float a, float b, float c) { float d; d = b*b – 4*a*c; return d; }
7
Hàm
ị
ớ ơ ả
ọ
8
• Các thao tác c b n v i hàm: – Đ nh nghĩa hàm (definition) – Khai báo hàm (declaration) – G i hàm (call)
Đ nh nghĩa hàm
ị
• Là ph n cài đ t chi ti ặ ầ • M i hàm c n ộ • Đ nh nghĩa này có th đ
t cho m t hàm ế ộ ỉ ộ đ nh nghĩa ầ có m t và ch m t ị c đ t tr ể ượ ặ ướ
ỗ ị
c ho c sau ặ
hàm main
ị
ể ả
ầ
ị
ị
t t
• Không cho phép đ t đ nh nghĩa hàm này l ng ồ ặ ị trong đ nh nghĩa c a hàm khác, k c hàm ủ ộ ế ấ ả ầ
main. • Khi đ nh nghĩa m t hàm c n ph i xác đ nh đ y ả ầ đ , chi ti t c các thành ph n c a hàm đó, ầ ủ ủ g m ph n đ u và ph n thân c a nó. ủ ầ ồ
ầ
9
Đ nh nghĩa hàm
ị
Header
• Cú pháp: T tên_hàm (T1 v1, T2 v2, …) {
Body
Lệnh 1; Lệnh 2;
…
}
10
Đ nh nghĩa hàm
ị
ể ữ ệ
ả ề
– Tên hàm – Ki u d li u tr v cho hàm (ki u hàm) – Tên, ki u d li u cho các tham s , và ki u tham ể
ể ố s (đ u vào, đ u ra, ho c c hai) ố ầ
ể ữ ệ ầ
ặ ả
tham s vào
tham s ra / ki u hàm
ố
ể
ố
Tên/Ch c ứ năng c a ủ hàm
11
• Ph n đ u hàm: c n xác đ nh ầ ầ ầ ị
Đ nh nghĩa hàm
ị
• Ph n thân hàm:
ầ
ử
ứ
ố ệ ể
ể ữ ệ
ầ ằ
ầ ế
ạ
ố ệ
– Các tham s trong ph n đ u hàm đ
ụ ộ ầ
ử ụ ố ữ ệ ụ ộ
ư
ầ
– Là kh i l nh ch a các l nh x lý cho ph n đ u hàm ệ – Có th khai báo thêm các ki u d li u (bi n/h ng) có ph m vi s d ng c c b trong kh i l nh thân hàm c s d ng nh ư ượ ử ụ ầ các d li u c c b , nh ng c n chú ý thêm đ n vai trò ế vào/ra c a chúng ủ
return (có ho c không
ầ
ể ứ
ặ
– Ph n này có th ch a các l nh ố ể ự
ệ có tham s ) đ th c hi n k t thúc kh i l nh (và có ố ệ ệ ế tr v giá tr cho hàm này n u có tham s ) ố ế
ả ề
ị
12
M t s ví d đ nh nghĩa hàm
ộ ố
ụ ị
• Đ nh nghĩa hàm tính USCLN(a,b) ị
ả ề
ị //Cách 1: hàm có giá tr tr v int uscln(int a, int b){ while(a!=b)
if(a>b) a -= b; else b -= a;
return a; }
13
M t s ví d
ộ ố
ụ
• Đ nh nghĩa hàm tính USCLN(a,b) ị
ị
ả ề
//Cách 2: hàm không có giá tr tr v void uscln(int a, int b, int* u){ while(a!=b)
if(a>b) a -= b; else b -= a;
*u = a; }
14
M t s ví d
ộ ố
ụ
• Đ nh nghĩa hàm tính t ng c a m t dãy a có n ổ ủ ộ
ị số
ả ề
ị
//Cách 1: hàm có giá tr tr v float sum(float a[], int N){
int i;
float sf=0;
for (i=0;i
}
15
M t s ví d
ộ ố
ụ
• Đ nh nghĩa hàm tính t ng c a m t dãy a có n
ổ ủ ộ
ị
số
ị
ả ề
//Cách 2: hàm không có giá tr tr v
void sum(float a[], int N, float* s){
int i;
float sf=0;
for (i=0;i
}
16
Khai báo hàm
ủ
ầ
• Là thao tác nh m thông báo c u trúc c a ph n
ấ
ằ
c khi g i hàm đó
ọ
đ u hàm tr
ầ
ướ
• Cú pháp:
Trong đó:
ể
ố
T tên_hàm (T1 v1, T2 v2, …);
Ti: ki u tham s
vi: tên tham số
ụ
ả
ả
ầ
• Khai báo hàm nh m 2 m c đích chính:
ằ
– Đ m b o vi c g i đúng hàm c n dùng
ệ ọ
– Giúp cho vi c tìm và liên k t hàm d dàng h n
ơ
ệ
ễ
ế
17
Khai báo hàm
• M t s l u ý khi khai báo hàm:
ng t
ươ
ữ ệ
ủ
nh v trí khai báo d li u, và
ụ ộ và toàn c cụ , ph ụ
ạ c c b
ộ ố ư
– V trí khai báo hàm t
ị
ạ
ộ
ị
ự ư ị
ph m vi c a hàm cũng có hai lo i
thu c vào v trí khai báo nh d li u
ư ữ ệ
ộ
ả
c khi g i hàm đã
ọ
ế
ế
ở
ướ
sau
ể ị
file khác thì c n ph i có ph n khai báo
ả
ặ ể ở
ầ
ọ
ầ
ầ
– Thao tác này không b t bu c ph i có, n u tr
ắ
có ph n đ nh nghĩa c a hàm này. Còn n u đ đ nh nghĩa
ủ
ị
khi g i hàm, ho c đ
này
ố
ọ
ư
ủ
ể ữ ệ ủ
ấ ị
– Các tham s c a hàm dùng khi đ nh nghĩa/khai báo đ
ố ủ
ị
ứ . Còn sau này khi g i hàm, các
ọ
– Khi khai báo thì tên c a các tham s không quan tr ng, và có th
ể
b đi, nh ng ki u d li u c a chúng thì nh t đ nh ph i đ y đ
ả ầ ủ
ỏ
c g i là
ượ ọ
tham s hình th c
tham s th c
ố
ố ự
c s d ng đ th ch cho các tham s hình th c này
s đ
ẽ ượ ử ụ
ể ế ỗ
ứ
ố
18
M t s ví d khai báo hàm
ộ ố
ụ
• int uscln(int a, int b);
• int uscln(int , int );
• int uscln(int aa, int bb);
19
• float sum(float a[], int n);
• float sum(float[], int);
G i hàmọ
c đ nh ộ ượ ị
• Khi mu n s d ng m t hàm đã đ
ố ử ụ
nghĩa, ta c n g i (call) hàm đó.
ọ
ầ
• Cú pháp:
tên_hàm (v1, v2, …);
20
Trong đó: vi: tên các tham s th c
ố ự
G i hàmọ
– Các tham s th c ph i kh p v i các tham s hình
ố
ả
ố ự
th c c v s l
– V i hàm có giá tr tr v , ta có th g i
ọ ộ ố ư
ứ ả ề ố ượ
ớ
ể ọ ở ả
ặ
ấ
c hai
cách, cách l y giá tr tr v đó ho c cách không
ị ả ề
c n l y giá tr đó.
ầ ấ
ị
21
• M t s l u ý khi g i hàm:
ớ
ớ
ng và ki u d li u
ể ữ ệ
ị ả ề
Ví d 1: ch
ụ
ươ
ủ
ổ
ng trình tính t ng c a
dãy số
#include
#include
#define N 5
int main(){
float sum(float [], int); //Khai báo hàm
float x[N] = {1.5,2,3.5,4,5.5};
ọ
//G i hàm
float s = sum (x,N);
printf("Tong cua day so =%.2f\n ",s);
getch();
}//end main
ị
float sum(float a[], int n){ //Đ nh nghĩa hàm
int i;
float sf=0;
for (i=0;i
22
Ví d 1ụ
23
• K t qu ch y ch ng trình: ả ạ ế ươ
Ví d 2: ch
ụ
ươ
ng trình tính USCLN
c a 2 s
ủ
ố
{
ọ
//G i hàm
#include
#include
int uscln(int a, int b); //Khai báo hàm
void main()
unsigned int x,y,u;
printf("nhap 2 so nguyen duong x, y : ");
scanf("%u%u", &x,&y);
u = uscln(x,y);
printf("USCLN (%d,%d) = %u",x,y,u);
getch();
ị
//Đ nh nghĩa hàm
}//end main
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
24
Ví d 2ụ
25
• K t qu ch y ch ng trình: ả ạ ế ươ
ng trình
T ch c ch
ứ
ổ
ươ
ầ ủ
ng trình n m trên 1 t p
ươ
ệ
ằ
ng trình trên nhi u t p
ề ệ
ng trình, thì
ươ
ầ ủ
khác nhau. Khi có nhi u t p ch
chúng th
ng đ
c t
• Trong C ta có th t ch c m t ch ng trình ể ổ ứ ộ ươ
ườ
ộ project.
26
theo 2 cách:
– T t c các ph n c a ch
ấ ả
– Chia các ph n c a ch
ươ
ề ệ
ch c trong m t
ượ ổ ứ
ng trình
T ch c ch
ứ
ổ
• M c đích c a vi c t
ng trình trên nhi u
ươ
ề ệ
ươ
trên nhi u t p
ch c ch
ệ ổ ứ
ề
ủ
ng trình thành các modul nh
ỏ
c cài đ t trên m t t p
ặ
ộ ệ
ồ
ể
ng trình theo nhóm g m nhi u
ề
ng trình ra làm
ế
ỗ
i l p trình, khi đó c n ph i chia ch
ươ
ộ
ầ
t c các modul đó l
ng
ụ
t p:ệ
– H tr vi c phân chia ch
ươ
ỗ ợ ệ
h n, và m i modul đó s đ
ơ
ẽ ượ
ỗ
– H tr vi c phát tri n ch
ươ
ỗ ợ ệ
ườ ậ
ả
ầ
i c n vi
ườ ầ
ề
ế
ố
ạ ớ
t m t ho c m t s
ộ ố
ặ
ả ắ
i v i nhau đ thành m t ch
ộ
ể
ươ
ng
nhi u modul, và m i ng
modul trong đó; sau đó đ n cu i cùng c n ph i l p ghép
t
ấ ả
trình hoàn ch nhỉ
ươ
– H tr vi c tái s d ng các thành ph n c a ch
ệ
ng trình
m t cách thu n ti n, qua vi c xây d ng các t p th vi n
ư ệ
ệ
ỗ ợ ệ
ộ
ầ ủ
ự
ử ụ
ệ
ậ
27
ng trình
ổ
T ch c ch
ứ
ươ
trên nhi u t p
ề ệ
• Có 2 lo i t p ch y u trong C:
ng có
ồ source file): th
– T p ch
ệ
ầ
ườ
ứ ị
ủ ế
ườ
ầ
ạ ệ
ươ
ở ộ
ủ
– T p ph n đ u (
ầ
ng có ph n m
ở
ng ch a các khai báo d
ữ
ườ
ệ
ệ
r ng là “.h”, là t p th
ộ
li u hay các hàm con
ệ
28
ủ ế
ng trình ngu n (
ph n m r ng là “.c”: là t p ch y u ch a đ nh
ệ
nghĩa c a các thành ph n d li u và hàm
ầ ữ ệ
ầ header file): th
ứ
Ví dụ
• Ch ổ ươ ố ồ
ng trình này ủ ươ
c t ổ
ch c trên 3 t p: ệ
ố
i g i
ứ ờ ọ
đ n các hàm tính t ng 1 dãy s và tính USCLN
ế
– myLib.c: ch a đ nh nghĩa các hàm tính t ng 1 dãy
ổ
ứ ị
s và tính USCLN
ố
– myLib.h: ch a khai báo cho các hàm tính t ng 1
ứ
ổ
dãy s và tính USCLN
ố
29
ng trình tính t ng c a 2 dãy s , r i tìm
ủ
USCLN c a 2 t ng đó. Ch
đ
ượ ổ ứ
– main.c: ch a hàm main(), trong đó ch a l
ứ
ổ
T p main.c
ệ
#include
#include
#include "myLib.h“
int main(int argc, char *argv[])
{
//float sum(float [], int);
float x[N] = {1,3,5,7,9,11};
float y[N] = {2,4,6,8,10,12};
float s1 = sum (x,N);
float s2 = sum (y,N);
printf("Tong cua day so 1 =%.0f\n",s1);
printf("Tong cua day so 2 =%.0f\n",s2);
printf("USCLN cua tong 2 day = %d\n",
uscln((int)s1,(int)s2));
system("PAUSE");
}
30
T p myLib.c
ệ
//#include "myLib.h“
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
float sum(float a[], int n){
int i;
float sf=0;
for (i=0;i
}
31
T p myLib.h
ệ
#define N 6
int uscln(int a, int b);
float sum(float [], int );
32
Các lo i bi n đ c bi
t
ế
ạ
ặ
ệ
ạ
ạ
ể ụ ộ
ờ
ư
ụ
ờ ủ ả ươ
ứ
ế
ạ
• Bi n ki u
ể static: là lo i bi n có ph m vi s
ử
ế
ế
d ng gi ng nh bi n non-static thông th
ng
ườ
ố
ụ
ư ế
i có
(có th c c b ho c toàn c c), nh ng l
ạ
ặ
ng
vòng đ i trong su t vòng đ i c a c ch
ố
trình
• Bi n ki u
ể extern: là bi n ngoài (external), t c là
ế
ộ
ượ
ứ
ả
ế
khi có m t bi n toàn c c mà ph m vi s d ng
ụ
c a nó v
ở
ệ
ủ
t p khác mu n s d ng bi n này thì ph i khai
ệ
khóa này.
báo bi n đó v i t
ử ụ
t ra ngoài t p chính ch a nó, thì
ế
ố ử ụ
ớ ừ
ế
33
Ví d v bi n
ụ ề ế static
#include
#include
int main(){
int i;
for (i=0;i<5;i++){
int x=0;
static int y=0;
x++;
y++;
printf("x=%d; y=%d\n",x,y);
}
system("PAUSE");
}
34
Ví d v bi n
ụ ề ế static
35
• K t qu ch y: ả ạ ế
Tóm t
t n i dung đã h c
ắ ộ
ọ
ng trình ấ ươ
• C u trúc các ch c năng c a m t ch
ộ
ứ
ủ
• Hàm con và các thao tác c b n
ơ ả
• Các cách t
ch c ch ng trình trên 1 t p và ổ ứ ươ ệ
t trong ch ng trình ế ặ ươ
36
nh bi n trên nhi u t p
ề ệ
• M t s lo i bi n đ c bi
ộ ố ạ
ệ
ư ế static và extern
C m n!
ả ơ
37
}
15
M t s ví d
ộ ố
ụ
• Đ nh nghĩa hàm tính t ng c a m t dãy a có n ổ ủ ộ
ị số
ị
ả ề //Cách 2: hàm không có giá tr tr v void sum(float a[], int N, float* s){
int i;
float sf=0;
for (i=0;i
}
16
Khai báo hàm
ủ
ầ
• Là thao tác nh m thông báo c u trúc c a ph n
ấ
ằ
c khi g i hàm đó
ọ
đ u hàm tr
ầ
ướ
• Cú pháp:
Trong đó:
ể
ố
T tên_hàm (T1 v1, T2 v2, …);
Ti: ki u tham s
vi: tên tham số
ụ
ả
ả
ầ
• Khai báo hàm nh m 2 m c đích chính:
ằ
– Đ m b o vi c g i đúng hàm c n dùng
ệ ọ
– Giúp cho vi c tìm và liên k t hàm d dàng h n
ơ
ệ
ễ
ế
17
Khai báo hàm
• M t s l u ý khi khai báo hàm:
ng t
ươ
ữ ệ
ủ
nh v trí khai báo d li u, và
ụ ộ và toàn c cụ , ph ụ
ạ c c b
ộ ố ư
– V trí khai báo hàm t
ị
ạ
ộ
ị
ự ư ị
ph m vi c a hàm cũng có hai lo i
thu c vào v trí khai báo nh d li u
ư ữ ệ
ộ
ả
c khi g i hàm đã
ọ
ế
ế
ở
ướ
sau
ể ị
file khác thì c n ph i có ph n khai báo
ả
ặ ể ở
ầ
ọ
ầ
ầ
– Thao tác này không b t bu c ph i có, n u tr
ắ
có ph n đ nh nghĩa c a hàm này. Còn n u đ đ nh nghĩa
ủ
ị
khi g i hàm, ho c đ
này
ố
ọ
ư
ủ
ể ữ ệ ủ
ấ ị
– Các tham s c a hàm dùng khi đ nh nghĩa/khai báo đ
ố ủ
ị
ứ . Còn sau này khi g i hàm, các
ọ
– Khi khai báo thì tên c a các tham s không quan tr ng, và có th
ể
b đi, nh ng ki u d li u c a chúng thì nh t đ nh ph i đ y đ
ả ầ ủ
ỏ
c g i là
ượ ọ
tham s hình th c
tham s th c
ố
ố ự
c s d ng đ th ch cho các tham s hình th c này
s đ
ẽ ượ ử ụ
ể ế ỗ
ứ
ố
18
M t s ví d khai báo hàm
ộ ố
ụ
• int uscln(int a, int b);
• int uscln(int , int );
• int uscln(int aa, int bb);
19
• float sum(float a[], int n);
• float sum(float[], int);
G i hàmọ
c đ nh ộ ượ ị
• Khi mu n s d ng m t hàm đã đ
ố ử ụ
nghĩa, ta c n g i (call) hàm đó.
ọ
ầ
• Cú pháp:
tên_hàm (v1, v2, …);
20
Trong đó: vi: tên các tham s th c
ố ự
G i hàmọ
– Các tham s th c ph i kh p v i các tham s hình
ố
ả
ố ự
th c c v s l
– V i hàm có giá tr tr v , ta có th g i
ọ ộ ố ư
ứ ả ề ố ượ
ớ
ể ọ ở ả
ặ
ấ
c hai
cách, cách l y giá tr tr v đó ho c cách không
ị ả ề
c n l y giá tr đó.
ầ ấ
ị
21
• M t s l u ý khi g i hàm:
ớ
ớ
ng và ki u d li u
ể ữ ệ
ị ả ề
Ví d 1: ch
ụ
ươ
ủ
ổ
ng trình tính t ng c a
dãy số
#include
#include
#define N 5
int main(){
float sum(float [], int); //Khai báo hàm
float x[N] = {1.5,2,3.5,4,5.5};
ọ
//G i hàm
float s = sum (x,N);
printf("Tong cua day so =%.2f\n ",s);
getch();
}//end main
ị
float sum(float a[], int n){ //Đ nh nghĩa hàm
int i;
float sf=0;
for (i=0;i
22
Ví d 1ụ
23
• K t qu ch y ch ng trình: ả ạ ế ươ
Ví d 2: ch
ụ
ươ
ng trình tính USCLN
c a 2 s
ủ
ố
{
ọ
//G i hàm
#include
#include
int uscln(int a, int b); //Khai báo hàm
void main()
unsigned int x,y,u;
printf("nhap 2 so nguyen duong x, y : ");
scanf("%u%u", &x,&y);
u = uscln(x,y);
printf("USCLN (%d,%d) = %u",x,y,u);
getch();
ị
//Đ nh nghĩa hàm
}//end main
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
24
Ví d 2ụ
25
• K t qu ch y ch ng trình: ả ạ ế ươ
ng trình
T ch c ch
ứ
ổ
ươ
ầ ủ
ng trình n m trên 1 t p
ươ
ệ
ằ
ng trình trên nhi u t p
ề ệ
ng trình, thì
ươ
ầ ủ
khác nhau. Khi có nhi u t p ch
chúng th
ng đ
c t
• Trong C ta có th t ch c m t ch ng trình ể ổ ứ ộ ươ
ườ
ộ project.
26
theo 2 cách:
– T t c các ph n c a ch
ấ ả
– Chia các ph n c a ch
ươ
ề ệ
ch c trong m t
ượ ổ ứ
ng trình
T ch c ch
ứ
ổ
• M c đích c a vi c t
ng trình trên nhi u
ươ
ề ệ
ươ
trên nhi u t p
ch c ch
ệ ổ ứ
ề
ủ
ng trình thành các modul nh
ỏ
c cài đ t trên m t t p
ặ
ộ ệ
ồ
ể
ng trình theo nhóm g m nhi u
ề
ng trình ra làm
ế
ỗ
i l p trình, khi đó c n ph i chia ch
ươ
ộ
ầ
t c các modul đó l
ng
ụ
t p:ệ
– H tr vi c phân chia ch
ươ
ỗ ợ ệ
h n, và m i modul đó s đ
ơ
ẽ ượ
ỗ
– H tr vi c phát tri n ch
ươ
ỗ ợ ệ
ườ ậ
ả
ầ
i c n vi
ườ ầ
ề
ế
ố
ạ ớ
t m t ho c m t s
ộ ố
ặ
ả ắ
i v i nhau đ thành m t ch
ộ
ể
ươ
ng
nhi u modul, và m i ng
modul trong đó; sau đó đ n cu i cùng c n ph i l p ghép
t
ấ ả
trình hoàn ch nhỉ
ươ
– H tr vi c tái s d ng các thành ph n c a ch
ệ
ng trình
m t cách thu n ti n, qua vi c xây d ng các t p th vi n
ư ệ
ệ
ỗ ợ ệ
ộ
ầ ủ
ự
ử ụ
ệ
ậ
27
ng trình
ổ
T ch c ch
ứ
ươ
trên nhi u t p
ề ệ
• Có 2 lo i t p ch y u trong C:
ng có
ồ source file): th
– T p ch
ệ
ầ
ườ
ứ ị
ủ ế
ườ
ầ
ạ ệ
ươ
ở ộ
ủ
– T p ph n đ u (
ầ
ng có ph n m
ở
ng ch a các khai báo d
ữ
ườ
ệ
ệ
r ng là “.h”, là t p th
ộ
li u hay các hàm con
ệ
28
ủ ế
ng trình ngu n (
ph n m r ng là “.c”: là t p ch y u ch a đ nh
ệ
nghĩa c a các thành ph n d li u và hàm
ầ ữ ệ
ầ header file): th
ứ
Ví dụ
• Ch ổ ươ ố ồ
ng trình này ủ ươ
c t ổ
ch c trên 3 t p: ệ
ố
i g i
ứ ờ ọ
đ n các hàm tính t ng 1 dãy s và tính USCLN
ế
– myLib.c: ch a đ nh nghĩa các hàm tính t ng 1 dãy
ổ
ứ ị
s và tính USCLN
ố
– myLib.h: ch a khai báo cho các hàm tính t ng 1
ứ
ổ
dãy s và tính USCLN
ố
29
ng trình tính t ng c a 2 dãy s , r i tìm
ủ
USCLN c a 2 t ng đó. Ch
đ
ượ ổ ứ
– main.c: ch a hàm main(), trong đó ch a l
ứ
ổ
T p main.c
ệ
#include
#include
#include "myLib.h“
int main(int argc, char *argv[])
{
//float sum(float [], int);
float x[N] = {1,3,5,7,9,11};
float y[N] = {2,4,6,8,10,12};
float s1 = sum (x,N);
float s2 = sum (y,N);
printf("Tong cua day so 1 =%.0f\n",s1);
printf("Tong cua day so 2 =%.0f\n",s2);
printf("USCLN cua tong 2 day = %d\n",
uscln((int)s1,(int)s2));
system("PAUSE");
}
30
T p myLib.c
ệ
//#include "myLib.h“
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
float sum(float a[], int n){
int i;
float sf=0;
for (i=0;i
}
31
T p myLib.h
ệ
#define N 6
int uscln(int a, int b);
float sum(float [], int );
32
Các lo i bi n đ c bi
t
ế
ạ
ặ
ệ
ạ
ạ
ể ụ ộ
ờ
ư
ụ
ờ ủ ả ươ
ứ
ế
ạ
• Bi n ki u
ể static: là lo i bi n có ph m vi s
ử
ế
ế
d ng gi ng nh bi n non-static thông th
ng
ườ
ố
ụ
ư ế
i có
(có th c c b ho c toàn c c), nh ng l
ạ
ặ
ng
vòng đ i trong su t vòng đ i c a c ch
ố
trình
• Bi n ki u
ể extern: là bi n ngoài (external), t c là
ế
ộ
ượ
ứ
ả
ế
khi có m t bi n toàn c c mà ph m vi s d ng
ụ
c a nó v
ở
ệ
ủ
t p khác mu n s d ng bi n này thì ph i khai
ệ
khóa này.
báo bi n đó v i t
ử ụ
t ra ngoài t p chính ch a nó, thì
ế
ố ử ụ
ớ ừ
ế
33
Ví d v bi n
ụ ề ế static
#include
#include
int main(){
int i;
for (i=0;i<5;i++){
int x=0;
static int y=0;
x++;
y++;
printf("x=%d; y=%d\n",x,y);
}
system("PAUSE");
}
34
Ví d v bi n
ụ ề ế static
35
• K t qu ch y: ả ạ ế
Tóm t
t n i dung đã h c
ắ ộ
ọ
ng trình ấ ươ
• C u trúc các ch c năng c a m t ch
ộ
ứ
ủ
• Hàm con và các thao tác c b n
ơ ả
• Các cách t
ch c ch ng trình trên 1 t p và ổ ứ ươ ệ
t trong ch ng trình ế ặ ươ
36
nh bi n trên nhi u t p
ề ệ
• M t s lo i bi n đ c bi
ộ ố ạ
ệ
ư ế static và extern
C m n!
ả ơ
37
}
16
Khai báo hàm
ủ
ầ
• Là thao tác nh m thông báo c u trúc c a ph n ấ ằ c khi g i hàm đó ọ
đ u hàm tr ầ
ướ
• Cú pháp:
Trong đó:
ể
ố
T tên_hàm (T1 v1, T2 v2, …); Ti: ki u tham s vi: tên tham số
ụ
ả
ả
ầ
• Khai báo hàm nh m 2 m c đích chính: ằ – Đ m b o vi c g i đúng hàm c n dùng ệ ọ – Giúp cho vi c tìm và liên k t hàm d dàng h n ơ ệ
ễ
ế
17
Khai báo hàm
• M t s l u ý khi khai báo hàm:
ng t
ươ
ữ ệ
ủ
nh v trí khai báo d li u, và ụ ộ và toàn c cụ , ph ụ
ạ c c b
ộ ố ư – V trí khai báo hàm t ị ạ ộ
ị
ự ư ị ph m vi c a hàm cũng có hai lo i thu c vào v trí khai báo nh d li u ư ữ ệ ộ
ả
c khi g i hàm đã ọ
ế ế
ở
ướ sau ể ị file khác thì c n ph i có ph n khai báo ả
ặ ể ở
ầ ọ
ầ
ầ
– Thao tác này không b t bu c ph i có, n u tr ắ có ph n đ nh nghĩa c a hàm này. Còn n u đ đ nh nghĩa ủ ị khi g i hàm, ho c đ này
ố
ọ
ư
ủ ể ữ ệ ủ
ấ ị
– Các tham s c a hàm dùng khi đ nh nghĩa/khai báo đ
ố ủ
ị ứ . Còn sau này khi g i hàm, các
ọ
– Khi khai báo thì tên c a các tham s không quan tr ng, và có th ể b đi, nh ng ki u d li u c a chúng thì nh t đ nh ph i đ y đ ả ầ ủ ỏ c g i là ượ ọ tham s hình th c tham s th c ố ố ự c s d ng đ th ch cho các tham s hình th c này s đ ẽ ượ ử ụ
ể ế ỗ
ứ
ố
18
M t s ví d khai báo hàm
ộ ố
ụ
• int uscln(int a, int b); • int uscln(int , int ); • int uscln(int aa, int bb);
19
• float sum(float a[], int n); • float sum(float[], int);
G i hàmọ
c đ nh ộ ượ ị
• Khi mu n s d ng m t hàm đã đ ố ử ụ nghĩa, ta c n g i (call) hàm đó. ọ ầ
• Cú pháp:
tên_hàm (v1, v2, …);
20
Trong đó: vi: tên các tham s th c ố ự
G i hàmọ
– Các tham s th c ph i kh p v i các tham s hình
ố
ả
ố ự th c c v s l
– V i hàm có giá tr tr v , ta có th g i
ọ ộ ố ư
ứ ả ề ố ượ ớ
ể ọ ở ả ặ
ấ
c hai cách, cách l y giá tr tr v đó ho c cách không ị ả ề c n l y giá tr đó. ầ ấ
ị
21
• M t s l u ý khi g i hàm: ớ ớ ng và ki u d li u ể ữ ệ ị ả ề
Ví d 1: ch ụ
ươ
ủ
ổ
ng trình tính t ng c a dãy số
#include
ị
float sum(float a[], int n){ //Đ nh nghĩa hàm
int i;
float sf=0;
for (i=0;i
22
Ví d 1ụ
23
• K t qu ch y ch ng trình: ả ạ ế ươ
Ví d 2: ch
ụ
ươ
ng trình tính USCLN
c a 2 s
ủ
ố
{
ọ
//G i hàm
#include
#include
int uscln(int a, int b); //Khai báo hàm
void main()
unsigned int x,y,u;
printf("nhap 2 so nguyen duong x, y : ");
scanf("%u%u", &x,&y);
u = uscln(x,y);
printf("USCLN (%d,%d) = %u",x,y,u);
getch();
ị
//Đ nh nghĩa hàm
}//end main
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
24
Ví d 2ụ
25
• K t qu ch y ch ng trình: ả ạ ế ươ
ng trình
T ch c ch
ứ
ổ
ươ
ầ ủ
ng trình n m trên 1 t p
ươ
ệ
ằ
ng trình trên nhi u t p
ề ệ
ng trình, thì
ươ
ầ ủ
khác nhau. Khi có nhi u t p ch
chúng th
ng đ
c t
• Trong C ta có th t ch c m t ch ng trình ể ổ ứ ộ ươ
ườ
ộ project.
26
theo 2 cách:
– T t c các ph n c a ch
ấ ả
– Chia các ph n c a ch
ươ
ề ệ
ch c trong m t
ượ ổ ứ
ng trình
T ch c ch
ứ
ổ
• M c đích c a vi c t
ng trình trên nhi u
ươ
ề ệ
ươ
trên nhi u t p
ch c ch
ệ ổ ứ
ề
ủ
ng trình thành các modul nh
ỏ
c cài đ t trên m t t p
ặ
ộ ệ
ồ
ể
ng trình theo nhóm g m nhi u
ề
ng trình ra làm
ế
ỗ
i l p trình, khi đó c n ph i chia ch
ươ
ộ
ầ
t c các modul đó l
ng
ụ
t p:ệ
– H tr vi c phân chia ch
ươ
ỗ ợ ệ
h n, và m i modul đó s đ
ơ
ẽ ượ
ỗ
– H tr vi c phát tri n ch
ươ
ỗ ợ ệ
ườ ậ
ả
ầ
i c n vi
ườ ầ
ề
ế
ố
ạ ớ
t m t ho c m t s
ộ ố
ặ
ả ắ
i v i nhau đ thành m t ch
ộ
ể
ươ
ng
nhi u modul, và m i ng
modul trong đó; sau đó đ n cu i cùng c n ph i l p ghép
t
ấ ả
trình hoàn ch nhỉ
ươ
– H tr vi c tái s d ng các thành ph n c a ch
ệ
ng trình
m t cách thu n ti n, qua vi c xây d ng các t p th vi n
ư ệ
ệ
ỗ ợ ệ
ộ
ầ ủ
ự
ử ụ
ệ
ậ
27
ng trình
ổ
T ch c ch
ứ
ươ
trên nhi u t p
ề ệ
• Có 2 lo i t p ch y u trong C:
ng có
ồ source file): th
– T p ch
ệ
ầ
ườ
ứ ị
ủ ế
ườ
ầ
ạ ệ
ươ
ở ộ
ủ
– T p ph n đ u (
ầ
ng có ph n m
ở
ng ch a các khai báo d
ữ
ườ
ệ
ệ
r ng là “.h”, là t p th
ộ
li u hay các hàm con
ệ
28
ủ ế
ng trình ngu n (
ph n m r ng là “.c”: là t p ch y u ch a đ nh
ệ
nghĩa c a các thành ph n d li u và hàm
ầ ữ ệ
ầ header file): th
ứ
Ví dụ
• Ch ổ ươ ố ồ
ng trình này ủ ươ
c t ổ
ch c trên 3 t p: ệ
ố
i g i
ứ ờ ọ
đ n các hàm tính t ng 1 dãy s và tính USCLN
ế
– myLib.c: ch a đ nh nghĩa các hàm tính t ng 1 dãy
ổ
ứ ị
s và tính USCLN
ố
– myLib.h: ch a khai báo cho các hàm tính t ng 1
ứ
ổ
dãy s và tính USCLN
ố
29
ng trình tính t ng c a 2 dãy s , r i tìm
ủ
USCLN c a 2 t ng đó. Ch
đ
ượ ổ ứ
– main.c: ch a hàm main(), trong đó ch a l
ứ
ổ
T p main.c
ệ
#include
#include
#include "myLib.h“
int main(int argc, char *argv[])
{
//float sum(float [], int);
float x[N] = {1,3,5,7,9,11};
float y[N] = {2,4,6,8,10,12};
float s1 = sum (x,N);
float s2 = sum (y,N);
printf("Tong cua day so 1 =%.0f\n",s1);
printf("Tong cua day so 2 =%.0f\n",s2);
printf("USCLN cua tong 2 day = %d\n",
uscln((int)s1,(int)s2));
system("PAUSE");
}
30
T p myLib.c
ệ
//#include "myLib.h“
int uscln(int a, int b){
while(a!=b)
if(a>b) a -= b;
else b -= a;
return a;
}
float sum(float a[], int n){
int i;
float sf=0;
for (i=0;i
}
31
T p myLib.h
ệ
#define N 6
int uscln(int a, int b);
float sum(float [], int );
32
Các lo i bi n đ c bi
t
ế
ạ
ặ
ệ
ạ
ạ
ể ụ ộ
ờ
ư
ụ
ờ ủ ả ươ
ứ
ế
ạ
• Bi n ki u
ể static: là lo i bi n có ph m vi s
ử
ế
ế
d ng gi ng nh bi n non-static thông th
ng
ườ
ố
ụ
ư ế
i có
(có th c c b ho c toàn c c), nh ng l
ạ
ặ
ng
vòng đ i trong su t vòng đ i c a c ch
ố
trình
• Bi n ki u
ể extern: là bi n ngoài (external), t c là
ế
ộ
ượ
ứ
ả
ế
khi có m t bi n toàn c c mà ph m vi s d ng
ụ
c a nó v
ở
ệ
ủ
t p khác mu n s d ng bi n này thì ph i khai
ệ
khóa này.
báo bi n đó v i t
ử ụ
t ra ngoài t p chính ch a nó, thì
ế
ố ử ụ
ớ ừ
ế
33
Ví d v bi n
ụ ề ế static
#include
#include
int main(){
int i;
for (i=0;i<5;i++){
int x=0;
static int y=0;
x++;
y++;
printf("x=%d; y=%d\n",x,y);
}
system("PAUSE");
}
34
Ví d v bi n
ụ ề ế static
35
• K t qu ch y: ả ạ ế
Tóm t
t n i dung đã h c
ắ ộ
ọ
ng trình ấ ươ
• C u trúc các ch c năng c a m t ch
ộ
ứ
ủ
• Hàm con và các thao tác c b n
ơ ả
• Các cách t
ch c ch ng trình trên 1 t p và ổ ứ ươ ệ
t trong ch ng trình ế ặ ươ
36
nh bi n trên nhi u t p
ề ệ
• M t s lo i bi n đ c bi
ộ ố ạ
ệ
ư ế static và extern
C m n!
ả ơ
37
22
Ví d 1ụ
23
• K t qu ch y ch ng trình: ả ạ ế ươ
Ví d 2: ch ụ
ươ
ng trình tính USCLN c a 2 s ủ
ố
{
ọ
//G i hàm
#include
#include
int uscln(int a, int b); //Khai báo hàm
void main()
unsigned int x,y,u; printf("nhap 2 so nguyen duong x, y : "); scanf("%u%u", &x,&y); u = uscln(x,y); printf("USCLN (%d,%d) = %u",x,y,u); getch();
ị
//Đ nh nghĩa hàm
}//end main int uscln(int a, int b){ while(a!=b)
if(a>b) a -= b;
else b -= a; return a;
}
24
Ví d 2ụ
25
• K t qu ch y ch ng trình: ả ạ ế ươ
ng trình
T ch c ch ứ
ổ
ươ
ầ ủ
ng trình n m trên 1 t p ươ ệ ằ ng trình trên nhi u t p
ề ệ ng trình, thì
ươ
ầ ủ khác nhau. Khi có nhi u t p ch chúng th
ng đ
c t
• Trong C ta có th t ch c m t ch ng trình ể ổ ứ ộ ươ
ườ
ộ project.
26
theo 2 cách: – T t c các ph n c a ch ấ ả – Chia các ph n c a ch ươ ề ệ ch c trong m t ượ ổ ứ
ng trình
T ch c ch ứ
ổ
• M c đích c a vi c t
ng trình trên nhi u
ươ ề ệ ươ
trên nhi u t p ch c ch ệ ổ ứ
ề
ủ
ng trình thành các modul nh ỏ
c cài đ t trên m t t p
ặ
ộ ệ ồ
ể
ng trình theo nhóm g m nhi u ề ng trình ra làm
ế
ỗ
i l p trình, khi đó c n ph i chia ch ươ ộ ầ
t c các modul đó l
ng
ụ t p:ệ – H tr vi c phân chia ch ươ ỗ ợ ệ h n, và m i modul đó s đ ơ ẽ ượ ỗ – H tr vi c phát tri n ch ươ ỗ ợ ệ ườ ậ ả ầ i c n vi ườ ầ ề ế ố ạ ớ
t m t ho c m t s ộ ố ặ ả ắ i v i nhau đ thành m t ch ộ ể
ươ
ng nhi u modul, và m i ng modul trong đó; sau đó đ n cu i cùng c n ph i l p ghép t ấ ả trình hoàn ch nhỉ
ươ
– H tr vi c tái s d ng các thành ph n c a ch ệ
ng trình m t cách thu n ti n, qua vi c xây d ng các t p th vi n ư ệ ệ
ỗ ợ ệ ộ
ầ ủ ự
ử ụ ệ
ậ
27
ng trình
ổ
T ch c ch ứ
ươ trên nhi u t p ề ệ • Có 2 lo i t p ch y u trong C:
ng có
ồ source file): th
– T p ch ệ ầ
ườ ứ ị
ủ ế
ườ
ầ
ạ ệ ươ ở ộ ủ – T p ph n đ u ( ầ
ng có ph n m ở ng ch a các khai báo d ữ
ườ
ệ
ệ r ng là “.h”, là t p th ộ li u hay các hàm con ệ
28
ủ ế ng trình ngu n ( ph n m r ng là “.c”: là t p ch y u ch a đ nh ệ nghĩa c a các thành ph n d li u và hàm ầ ữ ệ ầ header file): th ứ
Ví dụ
• Ch ổ ươ ố ồ
ng trình này ủ ươ
c t ổ ch c trên 3 t p: ệ
ố
i g i ứ ờ ọ đ n các hàm tính t ng 1 dãy s và tính USCLN ế – myLib.c: ch a đ nh nghĩa các hàm tính t ng 1 dãy
ổ
ứ ị s và tính USCLN ố
– myLib.h: ch a khai báo cho các hàm tính t ng 1
ứ
ổ
dãy s và tính USCLN
ố
29
ng trình tính t ng c a 2 dãy s , r i tìm ủ USCLN c a 2 t ng đó. Ch đ ượ ổ ứ – main.c: ch a hàm main(), trong đó ch a l ứ ổ
T p main.c
ệ
#include
uscln((int)s1,(int)s2));
system("PAUSE"); }
30
T p myLib.c
ệ
//#include "myLib.h“ int uscln(int a, int b){ while(a!=b)
if(a>b) a -= b;
else b -= a; return a;
} float sum(float a[], int n){
int i;
float sf=0;
for (i=0;i } 31 #define N 6
int uscln(int a, int b);
float sum(float [], int ); 32 ạ ạ ể ụ ộ
ờ ư
ụ
ờ ủ ả ươ ứ ế ạ • Bi n ki u
ể static: là lo i bi n có ph m vi s
ử
ế
ế
d ng gi ng nh bi n non-static thông th
ng
ườ
ố
ụ
ư ế
i có
(có th c c b ho c toàn c c), nh ng l
ạ
ặ
ng
vòng đ i trong su t vòng đ i c a c ch
ố
trình
• Bi n ki u
ể extern: là bi n ngoài (external), t c là
ế
ộ
ượ ứ ả ế
khi có m t bi n toàn c c mà ph m vi s d ng
ụ
c a nó v
ở
ệ
ủ
t p khác mu n s d ng bi n này thì ph i khai
ệ
khóa này.
báo bi n đó v i t ử ụ
t ra ngoài t p chính ch a nó, thì
ế
ố ử ụ
ớ ừ ế 33 #include int x=0;
static int y=0;
x++;
y++;
printf("x=%d; y=%d\n",x,y); }
system("PAUSE"); } 34 35 • K t qu ch y: ả ạ ế ng trình ấ ươ • C u trúc các ch c năng c a m t ch
ộ
ứ
ủ
• Hàm con và các thao tác c b n
ơ ả
• Các cách t
ch c ch ng trình trên 1 t p và ổ ứ ươ ệ t trong ch ng trình ế ặ ươ 36 nh bi n trên nhi u t p
ề ệ
• M t s lo i bi n đ c bi
ộ ố ạ
ệ
ư ế static và extern 37T p myLib.h
ệ
Các lo i bi n đ c bi
t
ế
ạ
ặ
ệ
Ví d v bi n
ụ ề ế static
Ví d v bi n
ụ ề ế static
Tóm t
t n i dung đã h c
ắ ộ
ọ
C m n!
ả ơ