Top Banner
LẬP TRÌNH CƠ BẢN Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT HÀM 1
46

HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

Sep 10, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

LẬP TRÌNH CƠ BẢN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

HÀM

LẬP TRÌNH CƠ BẢN

1

Page 2: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

NỘI DUNG

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

Page 3: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Một chương trình được kiến trúc từ các mảnhnhỏ hoặc các thành phần nhỏ hơn.� Các mảnh nhỏ được gọi là các modules

� Các module như vậy gọi là các chương trình con.

� Trong C chương trình con được gọi là hàm

GIỚI THIỆU

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Trong C chương trình con được gọi là hàm

� Mỗi mảnh được quản lý tốt hơn trong chươngtrình gốc (original program)

� Hàm có hai loại:� Hàm chuẩn và

� Hàm tự định nghĩa.

Page 4: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Một số hàm trong các thư viện hay dùng:� stdio.h : Thư viện chứa các hàm vào/ ra chuẩn(standard input/output). Gồm các hàm printf(),scanf(), getc(), putc(), gets(), puts(), fflush(),fopen(), fclose(), fread(), fwrite(), getchar(),putchar(), getw(), putw()…

HÀM CHUẨN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

putchar(), getw(), putw()…

� conio.h : Thư viện chứa các hàm vào ra trong chế độDOS (DOS console). Gồm các hàm clrscr(), getch(),getche(), getpass(), cgets(), cputs(), putch(),clreol(),…

� math.h: Thư viện chứa các hàm tính toán gồm các hàm abs(), sqrt(), log(). log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…

Page 5: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Một số hàm trong các thư viện hay dùng:� alloc.h: Thư viện chứa các hàm liên quan đến việcquản lý bộ nhơ. Gồm các hàm calloc(), realloc(),malloc(), free(), farmalloc(), farcalloc(), farfree(), …

� io.h: Thư viện chứa các hàm vào ra cấp thấp. Gồmcác hàm open(), _open(), read(), _read(), close(),

HÀM CHUẨN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

các hàm open(), _open(), read(), _read(), close(),_close(), creat(), _creat(), creatnew(), eof(),filelength(), lock(),…

� graphics.h: Thư viện chứa các hàm liên quan đến đồhọa. Gồm initgraph(), line(), circle(), putpixel(),getpixel(), setcolor(), .v.v…

Page 6: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm có giá trị trả về:<kiểu kết quả> Tên hàm([<kiểu t_số> <tham số>][,<kiểu t_số> <tham số>][,…])

{

[Khai báo biến cục bộ và các câu lệnh thực

ĐỊNH NGHĨA HÀM

int max(int a, int b){return (a>b) ? a:b;}

int max(int a, int b){return (a>b) ? a:b;}

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

[Khai báo biến cục bộ và các câu lệnh thực hiện hàm]

return [<Biểu thức>];

}

Page 7: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm có giá trị trả về:� Ví dụ: Hàm trả về giá trị lớn nhất trong hai sốint max(int a, int b)

{

ĐỊNH NGHĨA HÀM

int max(int a, int b){return (a>b) ? a:b;}

int max(int a, int b){return (a>b) ? a:b;}

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

return (a>b) ? a:b;

}

Page 8: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm không có giá trị trả về:void Tên hàm([<kiểu t_số> <tham số>][,<kiểu t_số> <tham số>][,…])

{

[Khai báo biến cục bộ và các câu lệnh thực

ĐỊNH NGHĨA HÀM

int max(int a, int b){return (a>b) ? a:b;}

int max(int a, int b){return (a>b) ? a:b;}

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

[Khai báo biến cục bộ và các câu lệnh thực hiện hàm]

[return [<Biểu thức>];]

}� Chú ý: Nếu hàm không trả lại giá trị (tức kiểu void),khi đó có thể có hoặc không có câu lệnh return

Page 9: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm không có giá trị trả về:� Ví dụ: Hàm in trình bày

void In()

{

int i;

ĐỊNH NGHĨA HÀM

int max(int a, int b){return (a>b) ? a:b;}

int max(int a, int b){return (a>b) ? a:b;}

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

int i;

for (i=1; i<=80; i++)

printf("=");

printf("\n");

for (i=1; i<=80; i++)

printf("=");

//return ;

}

Page 10: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm với đối số mặc định:<kiểu kết quả> Tên hàm([<kiểu t_số> <tham số>][,<kiểu t_số> <tham số>[=<Giá trị mặc định>]][,…])

{ [Khai báo]

ĐỊNH NGHĨA HÀM

int max(int a, int b){return (a>b) ? a:b;}

int max(int a, int b){return (a>b) ? a:b;}

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

{ [Khai báo]

[return [<Biểu thức>];]

}� Chú ý: Các tham số có giá trị mặc định phải đượckhai báo liên tục và xuất hiện cuối cùng trong danhsách tham số.

Page 11: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm với đối số mặc định:� Ví dụ:#include <stdio.h>

#include <conio.h>

int tong(int x, int y, int z=0, int v=0)

ĐỊNH NGHĨA HÀM

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

{ return x+y+z+v; }

main()

{

printf("\n Tong cua 5,6,7,8 la= %d", tong(5,6,7,8));

printf("\n Tong cua 5,6,7 la= %d", tong(5,6,7));

printf("\n Tong cua 5,6 la= %d", tong(5,6));

getch();

}

Page 12: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Ví dụ 1:

int max(int a, int b) { return (a > b) ? a: b ; }

Nếu c = max(3, 5) thì= 5.

Nếu c = max(3.0, 5.0) ta sẽ có c =?.

KHAI BÁO HÀM TRÙNG TÊN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

Nếu c = max(3.0, 5.0) ta sẽ có c =?.

Page 13: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Hàm trùng tên hay còn gọi là hàm chồng (đè). Đây

là một kỹ thuật cho phép sử dụng cùng một tên gọi

cho các hàm "giống nhau" (cùng mục đích) nhưng

xử lý trên các kiểu dữ liệu khác nhau hoặc trên số

KHAI BÁO HÀM TRÙNG TÊN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

lượng dữ liệu khác nhau.

� Nhiều hàm có thể được định nghĩa chồng (với cùng

tên gọi giống nhau) nếu chúng thoả các điều kiện:

� Số lượng các tham đối trong hàm là khác nhau, hoặc

� Kiểu của tham đối trong hàm là khác nhau.

Page 14: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Ví dụ 1:#include <stdio.h>

#include <conio.h>

int max(int a, int b) { return (a > b) ? a: b ; }

int max(int a, int b, int c) {return max(a,b)>c ? max(a,b):c;}

float max(float a, float b) { return (a > b) ? a: b ; }

char max(char a, char b) { return (a > b) ? a: b ; }

KHAI BÁO HÀM TRÙNG TÊN

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

long max(long a, long b) { return (a > b) ? a: b ; }

double max(double a, double b) { return (a > b) ? a: b ; }

int main()

{ printf("Max=%d", max(3,5));

printf("Max=%d", max(3,7,6));

printf("Max=%f", max(3.0,5.0));

printf("Max=%c", max('O','K'));

getch();

return 0;

}

Page 15: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền tham trị:� Mặc nhiên, việc truyền tham số cho hàmtrong C/C++ là truyền theo giá trị;

� Nghĩa là các giá trị thực (tham số thực) khôngbị thay đổi giá trị khi truyền cho các tham số

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

bị thay đổi giá trị khi truyền cho các tham sốhình thức

Page 16: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền tham trị:#include <stdio.h>

#include <conio.h>

int Tong(int a, int b)

{ a=a+1; b=b+1;

printf("\n Trong than ham a=%d ,b=%d",a,b);

return a+b;}

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

return a+b;}

int main()

{ int a, b;

printf("\n Nhap vao 2 so nguyen a, b:"); scanf("%d%d",&a,&b);

printf("\n Truoc khi goi ham a=%d ,b=%d",a,b);

printf("\n Tong=%d",Tong(a,b));

printf("\n Sau khi goi ham a=%d ,b=%d",a,b);

getch();return 0;}

Page 17: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền tham trị:

TRUYỀN THAM SỐ

Trước và sau khi gọi hàm Trước và sau khi gọi hàm

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

khi gọi hàm giá trị a, b không đổi

khi gọi hàm giá trị a, b không đổi

Page 18: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền tham trị:#include <stdio.h>

#include <conio.h>

int hoanvi(int a, int b)

{ int t;

t=a; /*Đoạn này hoán vị giá trị của 2 biến a, b*/

a=b; b=t;

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

a=b; b=t;

printf("\n Ben trong ham a=%d , b=%d",a,b);

return 0;}

int main()

{ int a, b;

printf("\n Nhap vao 2 so nguyen a, b:"); scanf("%d%d",&a,&b);

printf("\n Truoc khi goi ham hoan vi a=%d ,b=%d",a,b);

hoanvi(a,b);

printf("\n Sau khi goi ham hoan vi a=%d ,b=%d",a,b);

getch(); return 0;}

Page 19: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền tham trị:

TRUYỀN THAM SỐ

Trước và sau khi gọi hàm giá trị a, b

Trước và sau khi gọi hàm giá trị a, b

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� ? Muốn thay đổi giá trị a và b sau khi gọihàm ta cần theo một kỹ thuật khác, nhờvào vai trò của biến con trỏ và tham chiếu.

giá trị a, b không đổigiá trị a, b không đổi

Page 20: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ� Việc đầu tiên khi chương trình thực hiện một hàmlà tạo ra các biến mới (các ô nhớ mới, độc lập vớicác ô nhớ a, b đã có sẵn) tương ứng với các thamsố hình thức, trong trường hợp này cũng có tên là

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

số hình thức, trong trường hợp này cũng có tên làa, b và gán nội dung của a, b (ngoài hàm) cho a, b(mới).

� Và việc cuối cùng của chương trình sau khi thựchiện xong hàm là xoá các biến mới này. Do vậynội dung của các biến mới thực sự là có thay đổi,nhưng không ảnh hưởng gì đến các biến a, b cũ.

Page 21: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

Page 22: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ� �Không thực hiện trên các biến tạm mà phảithực sự thực hiện trên các biến ngoài.

� Muốn vậy thay vì truyền giá trị của các biếnngoài cho đối, bây giờ ta sẽ truyền địa chỉ của

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

ngoài cho đối, bây giờ ta sẽ truyền địa chỉ củanó cho đối, và các thay đổi sẽ phải thực hiệntrên nội dung của các địa chỉ này.

� Đó chính là lí do ta phải sử dụng con trỏ đểlàm tham số hình thức thay cho biến thường.

Page 23: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ:void hoanvi(int *p, int *q)

{

int t; // khai báo biến tạm t

t = *p ; /* đặt giá trị của t bằng nội dung

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

t = *p ; /* đặt giá trị của t bằng nội dung nơi p trỏ tới */

*p = *q ; /* thay nội dung nơi p trỏ bằng nội dung nơi q trỏ */

*q = t ; /* thay nội dung nơi q trỏ tới bằng nội dung của t */

}

Page 24: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ:� Với cách tổ chức hàm như vậy rõ ràng nếu ta cho p trỏtới biến a và q trỏ tới biến b thì hàm hoanvi sẽ thực sựlàm thay đổi nội dung của a, b chứ không phải của p,q.

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Từ đó lời gọi hàm sẽ là hoanvi(&a, &b) (tức truyền địachỉ của a cho p, p trỏ tới a và tương tự q trỏ tới y).

Page 25: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ:� Như vậy có thể tóm tắt 3 đặc trưng để viết mộthàm làm thay đổi giá trị biến ngoài như sau:� Đối của hàm phải là con trỏ (ví dụ int *p);

� Các thao tác liên quan đến đối này (trong thân hàm)

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Các thao tác liên quan đến đối này (trong thân hàm)phải thực hiện tại nơi nó trỏ đến (ví dụ *p = …);

� Lời gọi hàm phải chuyển địa chỉ cho p (ví dụ &a).

Page 26: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ:� Ví dụ: Giải phương trình bậc 2

int gptb2(float a, float b, float c, float *p, float *q)

{ float d ; // để chứa ∆

d = (b*b) - 4*a*c ;

if (d < 0) return 0 ;

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

if (d < 0) return 0 ;

else

if (d == 0)

{ *p = -b/(2*a) ; return 1 ; }

else

{ *p = (-b + sqrt(d))/(2*a) ;

*q = (-b - sqrt(d))/(2*a) ;

return 2 ;}

}

Page 27: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo con trỏ:� Ví dụ: Giải phương trình bậc 2main()

{ float a, b, c ; // các hệ số

float x1, x2 ; // các nghiệm

printf("Nhập hệ số: "); scanf(“%f %f %f”,&a, &b, &c);

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

printf("Nhập hệ số: "); scanf(“%f %f %f”,&a, &b, &c);

switch (gptb2(a, b, c, &x1, &x2))

{ case 0:

printf("Phương trình vô nghiệm");break;

case 1:

printf("Phương trình có nghiệm kép x = %f", x1); break;

case 2:

printf("Phương trình có 2 nghiệm phân biệt:\n");

printf("x1 = %f , và x2 = %f", x1, x2);break; }

}

Page 28: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo tham chiếu:� Một biến có thể được gán cho một bí danhmới, và khi đó chỗ nào xuất hiện biến thì cũngtương đương như dùng bí danh và ngược lại.

Một bí danh như vậy được gọi là một biến

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Một bí danh như vậy được gọi là một biếntham chiếu, nghĩa thực tế của nó là cho phép"tham chiếu" tới một biến khác cùng kiểu củanó, tức sử dụng biến khác nhưng bằng tên củabiến tham chiếu.

Page 29: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo tham chiếu:� Có thể tạm phân biến thành 3 loại:

� Biến thường với tên thường,

� Biến con trỏ với dấu * trước tên, và

� Biến tham chiếu với dấu &.

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Biến tham chiếu với dấu &.

<kiểu biến> &<tên biến tham chiếu> = <tên biến được tham chiếu>;

Page 30: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo tham chiếu:int hung, dung ; // khai báo các biến nguyên hung, dung

int &ti = hung; // khai báo biến tham chiếu ti, teo tham chiếu đến

int &teo = dung; // hung dung. ti, teo là bí danh của hung, dung

hung = 2 ;

ti ++; // tương đương hung ++;

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

ti ++; // tương đương hung ++;

printf(“%d, %d“,hung, ti); // 3 3

teo = ti + hung ; // tương đương dung = hung + hung

dung ++ ; // tương đương teo ++printf(“%d, %d“,dung,teo); // 7 7

Page 31: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo tham chiếu:void hoanvi(int &a, int &b)

{

int t ;

t = a;

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

t = a;

a = b;

b = t;

}

Page 32: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Truyền theo tham chiếu:� Chú ý:

� Biến tham chiếu phải được khởi tạo khi khai báo;

� Tuy giống con trỏ nhưng không dùng được cácphép toán con trỏ cho biến tham chiếu. Nói chung

TRUYỀN THAM SỐ

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

phép toán con trỏ cho biến tham chiếu. Nói chungchỉ nên dùng trong truyền đối cho hàm.

� Một hàm viết dưới dạng đối tham chiếu sẽ đơngiản hơn rất nhiều so với đối con trỏ và giốngvới cách viết bình thường (truyền theo thamtrị), trong đó chỉ có một khác biệt đó là các đốikhai báo dưới dạng tham chiếu.

Page 33: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� So sánh truyền theo con trỏ và tham chiếu:

TRUYỀN THAM SỐ

Con trỏ Tham chiếu

Đối của hàm phải là con trỏ (ví dụ int *p);

Đối của hàm phải là tham chiếu (ví dụ int &p);

Các thao tác liên quanđến đối này trong thân

Các thao tác liên quan đến đối này phải thực hiện tạinơi nó trỏ đến, tức địa chỉ cần thao tác. Với một thao

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

đến đối này trong thânhàm phải thực hiện tạinơi nó trỏ đến (ví dụ*p = …);

nơi nó trỏ đến, tức địa chỉ cần thao tác. Với một thaotác trên biến tham chiếu thực chất là thao tác trênbiến được nó tham chiếu nên trong hàm chỉ cần viếtp trong mọi thao tác (thay v. *p như trong con trỏ);

Lời gọi hàm phảichuyển địa chỉ cho p(ví dụ &a).

Lời gọi hàm phải chuyển địa chỉ cho p. Vì bản thân pkhi tham chiếu đến biến nào thì sẽ chứa địa chỉ củabiến đó, do đó lời gọi hàm chỉ cần ghi tên biến, ví dụx (thay vì &x như đối với truyền theo con trỏ).

Page 34: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� So sánh 3 cách truyền:

TRUYỀN THAM SỐ

Tham trị Con trỏ Tham chiếu

Khai báo void hoanvi(int a, int b)

void hoanvi(int *a, int *b)

void hoanvi(int &a, int &b)

Lệnh t=a; a=b; b=t; t=*a; *a=*b; *b=t; t=a; a=b; b=t;

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

Lệnh t=a; a=b; b=t; t=*a; *a=*b; *b=t; t=a; a=b; b=t;

Lời gọi hoanvi(a,b) hoanvi(&a,&b) hoanvi(a,b)

Tác dụng a, b không thay đổikhi ra khỏi hàm

a, b thay đổi khi rakhỏi hàm

a, b thay đổi khira khỏi hàm

Page 35: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Một hàm được gọi là đệ quy nếu bên trongthân hàm có lệnh gọi đến chính nó.

� Khi hàm gọi đệ qui đến chính nó, thì mỗilần gọi máy sẽ tạo ra một tập các biến cụcbộ mới hoàn toàn độc lập với tập các biến

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

bộ mới hoàn toàn độc lập với tập các biếncục bộ đã được tạo ra trong các lần gọitrước.

Page 36: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Ví dụ:� Không đệ quylong int gt1(int n) /* Tính n! v?i n>=0*/

{

long int gtphu=1;

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

long int gtphu=1;

int i;

for (i=1;i<=n;++i)

gtphu*=i;

return gtphu;

}

Page 37: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Ví dụ:� Dùng đệ quy

long int gt2(int n)

{

if (n==0 || n==1)

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

if (n==0 || n==1)

return 1;

else

return(n*gt2(n-1));

}

Page 38: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Cấu trúc chung của hàm đệ quyif (trường hợp suy biến)

{

trình bày cách giải // giả định đã có cách giải

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

định đã có cách giải

}

else // trường hợp tổng quát

{

gọi lại hàm với tham đối "bé" hơn

}

Page 39: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Cấu trúc chung của hàm đệ quy� Ví dụ:

� Tính dãy Fibonacci: 0, 1, 1, 2, 3, 5, 8...� fib( n ) = fib( n - 1 ) + fib( n – 2 )

long fibonacci( long n )

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

long fibonacci( long n )

{

if (n == 0 || n == 1) // base case

return n;

else

return fibonacci( n - 1) +fibonacci( n – 2 ); }

Page 40: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Cấu trúc chung của hàm đệ quy� Ví dụ:

HÀM ĐỆ QUY

f( 3 )

f( 1 )f( 2 ) +return

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

f( 1 )f( 2 )

f( 1 ) f( 0 ) return 1

return 1 return 0

return +

+return

Page 41: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Nhận xét:� Chương trình viết rất gọn,

� Việc thực hiện gọi đi gọi lại hàm rất nhiều lầnphụ thuộc vào độ lớn của đầu vào. Mỗi lần gọinhư vậy chương trình sẽ mất thời gian để lưu

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

như vậy chương trình sẽ mất thời gian để lưugiữ các thông tin của hàm gọi trước khi chuyểnđiều khiển đến thực hiện hàm được gọi. Mặtkhác các thông tin này được lưu trữ nhiều lầntrong ngăn xếp sẽ dẫn đến tràn ngăn xếp nếun lớn.

Page 42: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Nhận xét:� Hàm đệ qui so với hàm có thể dùng vòng lặpthì đơn giản hơn, tuy nhiên với máy tính khidùng hàm đệ qui sẽ dùng nhiều bộ nhớ trênngăn xếp và có thể dẫn đến tràn ngăn xếp. Vì

HÀM ĐỆ QUY

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

ngăn xếp và có thể dẫn đến tràn ngăn xếp. Vìvậy khi gặp một bài toán mà có thể có cáchgiải lặp (không dùng đệ qui) thì ta nên dùngcách lặp này. Song vẫn tồn tại những bài toánchỉ có thể giải bằng đệ qui.

Page 43: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Bài 1. Viết chương trình cho phép nhập vào tọađộ trên mặt phẳng XOY ba đỉnh của tam giácABC, và tọa độ của điểm M; đưa ra kết luận về vịtrí tương đối của M so với ABC : M nằm trong,trên cạnh hay nằm ngoài ABC.

BÀI TẬP

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

trên cạnh hay nằm ngoài ABC.

� Bài 2. Xây dựng hàm đệ quy tính USCLN(a,b):� a=b*q+r

� Nếu r=0 thì USCLN=b ngược lại USCLN(a,b)=USCLN(b,r)

Page 44: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Bài 1. Viết chương trình cho phép nhập vào tọađộ trên mặt phẳng XOY ba đỉnh của tam giácABC, và tọa độ của điểm M; đưa ra kết luận về vịtrí tương đối của M so với ABC : M nằm trong,trên cạnh hay nằm ngoài ABC.

BÀI TẬP THỰC HÀNH

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

trên cạnh hay nằm ngoài ABC.

� Bài 2. Xây dựng hàm đệ quy tính USCLN(a,b):� a=b*q+r

� Nếu r=0 thì USCLN=b ngược lại USCLN(a,b)=USCLN(b,r)

Page 45: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Bài 3. Viết chương trình tính các tổng sau:� a) A=1 + 2 + ... + n

� b) B=1/2 + 2/3 + ... +n/(n+1)

� c) C= -1 + 2 - 3 + 4 - ... + (-1)nn

� Bài 4. Viết chương trình nhập vào một dãy số

BÀI TẬP THỰC HÀNH

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Bài 4. Viết chương trình nhập vào một dãy sốthực, dãy số được kết thúc khi nhập số 0. Tínhtổng số phần tử đã nhập vào và trung bình cộngcủa dãy đó.

� Bài 5. Viết chương trình tính số Pi với sai sốeps=1E-5 theo công thức: Pi=1-1/3+1/5-1/7+…..

Page 46: HÀM - fit.mta.edu.vnfit.mta.edu.vn/files/FileMonHoc/Bai4_Ham.ppt [Compatibility M.pdf · Một số hàm trong các thư viện hay dùng: stdio.h : Thư viện chứa các hàm

� Bài 6. Viết chương trình tính gần đúng với độchính xác esp (e=0.0001) theo công thức xấp xỉ :

BÀI TẬP THỰC HÀNH

!...

!2!11

2

n

xxxe

nx

++++=

Biên soạn: Chu Thị Hường – Bộ môn HTTT – Khoa CNTT

� Bài 7. Viết các hàm số :� Với

� với hay

xexf x ln3)( +=2/0 π≤< x

xxxxf sin*)( −= 0≤x 2/π≥x