Đ 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