Trường Đ i h c Khoa h c T  nhiên ạ ọ ệ Khoa Công ngh  thông tin ọ B  môn Tin h c c

ơ sở

TIN H C CỌ Ơ S  AỞ

ương Đ ng Bình Ph dbphuong@fit.hcmuns.edu.vn

HÀM (FUNCTION)

1

&

VC

N i dung

BB

Khái niệm và Cú pháp

1

Tầm vực

2

Tham số và lời gọi hàm

3

Đệ quy

4

22

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

ặ ấ Đ t v n đ

BB

ế Vi ng trình tính S = a! + b! + c! v i a, b, c

Chương trình chính

Nhập a, b, c > 0

Tính S = a! + b! + c!

Xuất kết quả S

Nhập a > 0

Nhập b > 0

Nhập c > 0

Tính s1=a!

Tính s2=b!

Tính s3=c!

33

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

t ch ố ươ ậ ừ ươ là 3 s  nguyên d ớ  bàn phím. ng nh p t

&

VC

ặ ấ Đ t v n đ

BB

ạ ệ ậ 3 đo n l nh nh p a, b, c > 0

do {

printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &a);

} while (a <= 0);

do {

printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &b);

} while (b <= 0);

do {

printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &c);

} while (c <= 0);

44

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

ặ ấ Đ t v n đ

BB

ạ ệ 3 đo n l nh tính s1 = a!, s2 = b!, s3 = c!

{ Tính s1 = a! = 1 * 2 * … * a } s1 = 1; for (i = 2; i <= a ; i++) s1 = s1 * i;

{ Tính s2 = b! = 1 * 2 * … * b } s2 = 1; for (i = 2; i <= b ; i++) s2 = s2 * i;

{ Tính s3 = c! = 1 * 2 * … * c } s3 = 1; for (i = 2; i <= c ; i++) s3 = s3 * i;

55

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Đ t v n

ặ ấ đề

BB

ả Gi Vi

i pháp =>  ạ ệ ề ầ ử ụ ầ ế t 1 l n và s  d ng nhi u l n  Đo n l nh nh p t ng quát, v i n = a, b, c ớ ậ ổ

do {

printf(“Nhap mot so nguyen duong: ”); scanf(“%d”, &n);

} while (n <= 0);

ừ ổ ạ ệ  Đo n l nh tính giai th a t ng quát, n = a, b, c

{ Tính s = n! = 1 * 2 * … * n } s = 1; for (i = 2; i <= n ; i++)

s = s * i;

66

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Hàm

BB

Khái ni mệ ạ  M t ộ đo n ch ương trình có tên, đầu vào và

ế ộ ố ấ đề

đầu ra.  Có ch c nứ ả ăng gi ệ t cho ch chuyên bi ề ầ ọ ớ i quy t m t s  v n  ương trình chính. ố  Được g i nhi u l n v i các tham s  khác

nhau.

ầ  Được s  d ng khi có nhu c u:

ử ỗ

ả ế

• Tái s  d ng. • S a l

i và c i ti n.

77

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ử ụ ử ụ

&

VC

Hàm

BB

Cú pháp

([danh sách tham số]) {

[return ;]

}  Trong đó

char, int, long,

ấ ỳ ủ ả ề

ả ề ế

 : ki u b t k  c a C ( ể float,…). N u không tr  v  thì là

void.

ả ề

: theo quy t c ắ đặt tên định danh. •  : ố ứ đầu vào  tham s  hình th c  ấ , ằ ế gi ng khai báo bi n, cách nhau b ng d u  •  : tr  v  cho hàm qua l nh  return.

88

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

ế

Các bước vi

t hàm

BB

định các thông tin sau đây:

Đầu vào 1

Tên hàm

Đầu vào 2

Đầu ra (nếu có)

Đầu vào n

Các công việc sẽ thực hiện

99

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ầ C n xác  ầ  Tên hàm.  Hàm s  th c hi n công vi c gì. ệ ẽ ự  Các đ u vào (n u có). ế ầ  Đ u ra (n u có). ế

&

VC

Hàm

BB

Ví d  1ụ

ấ ổ ố

 Tên hàm: XuatTong  Công vi c: ệ tính và xu t t ng 2 s  nguyên  Đ u vào:  ầ hai s  nguyên x và y  Đ u ra:  ầ không có

void XuatTong(int x, int y) {

int s; s = x + y; printf(“%d cong %d bang %d”, x, y, s);

}

1010

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Hàm

BB

Ví d  2ụ

ả ề ổ ố

ị  Tên hàm: TinhTong  Công vi c: ệ tính và tr  v  t ng 2 s  nguyên  Đ u vào:  ố ầ hai s  nguyên x và y  Đ u ra:  ộ ố ầ m t s  nguyên có giá tr  x + y

int TinhTong(int x, int y) {

int s; s = x + y; return s;

}

1111

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Chương trình con ­ Function

BB

Ví d  3ụ

ấ ổ ậ ố

không có

 Tên hàm: NhapXuatTong  Công vi c: ệ nh p và xu t t ng 2 s  nguyên  Đ u vào:  ầ  Đ u ra:  ầ không có

void NhapXuatTong() {

int x, y; printf(“Nhap 2 so nguyen: ”); scanf(“%d%d”, &x, &y); printf(“%d cong %d bang %d”, x, y, x + y);

}

1212

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

T m v c

BB

Khái ni mệ ạ ả ủ ế ệ

ấ ả

• Toàn c c: ụ khai báo trong ngoài t

ể t c  các hàm (k   ương

ả c  hàm main) và có tác d ng lên toàn b  ch trình. • C c b :  ụ

ộ ẽ ị

ế

ộ khai báo trong hàm ho c kh i { } và ch  có  ỉ ố ể ả ố đó (k  c   ụ ả tác d ng trong b n thân hàm ho c kh i  ớ ỏ ộ ụ ế kh i con nó). Bi n c c b  s  b  xóa kh i b  nh   ố khi k t thúc kh i khai báo nó.

1313

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

 Là ph m vi hi u qu  c a bi n và hàm.  Bi n:ế

&

VC

T m v c

BB

int a;

int Ham1() {

int a1;

}

int Ham2() {

int a2; {

int a21;

}

}

void main() {

int a3;

}

1414

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

M t s  l

ộ ố ưu ý

BB

ầ đề

ẫ Thông thường người ta thường đặt ph n tiêu  prototype) trên hàm

hàm/nguyên m u hàm ( main và ph n ầ định nghĩa hàm dưới hàm main.

void XuatTong(int x, int y);

// prototype

void main() {

}

void XuatTong(int x, int y) {

printf(“%d cong %d bang %d”, x, y, x + y);

}

1515

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Các cách truy n tham s

BB

ố d ng giá tr

ở ạ ể ứ ể ằ ưng

ậ Truy n Giá tr  (Call by Value) ị  Truy n ề đối s  cho hàm  ị.  Có th  truy n h ng, bi n, bi u th c nh ế ề ị. hàm ch  s  nh n giá tr

đổi

ầ ệ ị ủ không có nhu c u thay  ự ố sau khi th c hi n hàm. ỉ ẽ  Được s  d ng khi  ử ụ giá tr  c a tham s

void TruyenGiaTri(int x) {

… x++;

}

1616

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Các cách truy n tham s

BB

ề ị

ở ạ Truy n Đ a ch  (Call by Address) ỉ  Truy n ề đối s  cho hàm  ố d ng địa chỉ (con

tr ).ỏ

ề ố ị cho tham s  này.

đổi giá tr  ị

 Không được truy n giá tr  Được s  d ng khi có  ử ụ ủ c a tham s ầ nhu c u thay  ệ ự ố sau khi th c hi n hàm.

void TruyenDiaChi(int *x) {

… *x++;

}

1717

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Các cách truy n tham s

BB

ề ế Truy n Tham chi u (Call by Reference) (

ố ở ạ C++) địa chỉ (con

tr ). Đỏ

ố d ng  & trong khai báo. ị cho tham s  này.

 Truy n ề đối s  cho hàm  ược b t ắ đầu b ng ằ  Không được truy n giá tr ề  Được s  d ng khi  ử ụ đổi giá trị

ủ c a tham s ầ có nhu c u thay  ệ ự ố sau khi th c hi n hàm.

void TruyenThamChieu(int &x) {

… x++;

}

1818

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Các cách truy n tham s

BB

Lưu ý

ể ề ố  Trong m t hàm, các tham s  có th  truy n

ộ ề theo nhi u cách.

void HonHop(int x, int &y) {

… x++; y++;

}

1919

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Các cách truy n tham s

BB

Lưu ý

ộ ả ề để tr  v  giá

 S  d ng  ử ụ ị tr  cho ch ế tham chi u là m t cách  ương trình.

int TinhTong(int x, int y) {

return x + y;

} void TinhTong(int x, int y, int &tong) {

tong = x + y;

} void TinhTongHieu(int x, int y, int &tong, int &hieu) {

tong = x + y; hieu = x – y;

2020

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

}

&

VC

ờ ọ

L i g i hàm

BB

ờ ề đồng th i truy n các  G i tên c a hàm

ọ ằ ứ ể

ặ ằ

ặ ố ị được được đặt trong c p d u

Cách th c hi n ệ đối s  ố ủ ố ế (h ng, bi n, bi u th c) cho các tham s  theo   ứ ự đã được khai báo trong hàm. đúng th  t  Các bi n ho c tr  này cách nhau b ng d u  ấ , ế  Các đối s  này  ấ ngo c ặ đơn ( )

2121

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

 (<đối s  1>ố ,… , <đối s  n>ố );

&

VC

ờ ọ

L i g i hàm

BB

2222

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

Ví dụ

&

VC

ờ ọ

L i g i ch

ương trình con

BB

2323

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

Ví dụ

&

VC

Đ  quy

BB

ể ọ ộ Khái ni mệ  M t chộ ương trình con có th  g i m t ch ương

ố ầ ọ ừ trình con khác.  N u ế g i chính nó ọ  S  l n g i này ph i có gi ự đệ quy.  thì được g i là s   ể ớ ạ  (đi m d ng) ả i h n

Ví dụ

ẽ đi tính S(n­1)

2424

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ự  Tính S(n) = n! = 1*2*…*(n­1)*n  Ta th y S(n) = S(n­1)*n  V y thay vì tính S(n) ta s   ậ  Tương t tính S(n­2), …, S(2), S(1), S(0) = 1

&

VC

Đ  quy

BB

Ví dụ

int GiaiThua(int n) {

if (n == 0)

return 1;

else

return GiaiThua(n – 1) * n;

} int GiaiThua(int n) {

if (n > 0)

return GiaiThua(n – 1) * n;

else

return 1;

}

2525

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

&

VC

Bài t p th c hành

BB

5. Bài 4, 5, 6, 7, 8 trang 140­141 chương 8 (Câu l nh ệ

ự ường.  th  hoa sang ký t ấ ương trình b c nh t. ương trình b c hai. i ph i ph

ộ đổi m t ký t ả ả ả ề ậ ậ ấ ủ ế ế ế ế ỏ ề đi u ki n và r  nhánh) a. Vi b. Vi c. Vi d. Vi ệ t hàm  ủ ụ t th  t c gi ủ ụ t th  t c gi ố ị t hàm tr  v  giá tr  nh  nh t c a 4 s

nguyên.

2626

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ế ế ủ ụ ủ ụ ố ố ắ e. Vi f. Vi ị t th  t c hoán v  hai s  nguyên. ế t th  t c s p x p 4 s  nguyên t ăng d n.ầ

&

VC

Bài t p th c hành

BB

ậ ặ 6. Bài t p 3 trang 155 ch

ự ệ ậ ệ ương 9 (Câu l nh l p). Hàm  ương n và th c hi n:

ủ ố đó.

ương. ố .

.

.

2727

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ổ ổ ổ ộ ố nh n vào m t s  nguyên d ả ề ố đảo c a s   a. Tr  v  s   ả ả ề ố đối x ng (Tr  v  True/False) b. Có ph i là s   ả ố c. Có ph i là s  chính ph ố ả d. Có ph i là s  nguyên t ữ ố ẻ e. T ng các ch  s  l ữ ố f. T ng các ch  s  nguyên t ữ ố g. T ng các ch  s  chính ph ố ương.

&

VC

Bài t p th c hành

BB

ậ ặ 7. Bài t p 4 trang 156 ch

ự ệ ậ ệ ương 9 (Câu l nh l p). Hàm  ương n và th c hi n:

ộ ố nh n vào m t s  nguyên d a. S = 1 + 2 + … + n b. S = 12 + 22 + … + n2 c. S = 1 + 1/2 + … + 1/n d. S = 1 * 2 * … * n e. S = 1! + 2! + … + n! ủ ả ề ố

2828

Tin h c cọ

ở ơ s  A ­

Đặng Bình Phương

ầ ử ủ 7. Hàm tr  v  USCLN c a 2 s  nguyên. 8. c a dãy Fibonacy. In ra n ph n t