1 of 30

BÀI 12: CON TRỎ SỐ HỌC�VÀ HÀM

Giáo viên: PHAN THIỆN HUỆ

Gmail: thayhuetnh@gmail.com

SĐT, Zalo: 0382.1682.32

Blog: thayhuetnh.blogspot.com

1

Chương III: NGÔN NGỮ LẬP TRÌNH C++

2 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

- Hàm là một chương trình con trong chương trình lớn. Hàm nhận (hoặc không) các đối số số và trả lại (hoặc không) một giá trị cho chương trình gọi nó.

- Trong trường hợp không trả lại giá trị, hàm hoạt động như một thủ tục trong các NNLT khác.

- Một chương trình là tập các hàm, trong đó có một hàm chính với tên gọi main(), khi chạy chương trình, hàm main() sẽ được chạy đầu tiên và gọi đến hàm khác. Kết thúc hàm main() cũng là kết thúc chương trình.

Ví dụ 1:

2

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

3 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

- Hàm giúp cho việc phân đoạn chương trình thành những môđun riêng rẽ, hoạt động độc lập với ngữ nghĩa của chương trình lớn. Hàm có một số đặc trưng:

• Nằm trong hoặc ngoài văn bản có chương trình gọi đến hàm. Trong một văn bản có thể chứa nhiều hàm,

• Được gọi từ chương trình chính (main), từ hàm khác hoặc từ chính nó (đệ quy),

• Không lồng nhau.

• Có 3 cách truyền giá trị: Truyền theo tham trị, tham biến và tham trỏ.

3

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

4 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

a. Khai báo

- Một hàm thường làm chức năng: tính toán trên các tham số và cho lại giá trị kết quả, hoặc chỉ đơn thuần thực hiện một chức năng nào đó, không trả lại kết quả tính toán. Thông thường kiểu của giá trị trả lại được gọi là kiểu của hàm.

- Các hàm thường được khai báo ở đầu chương trình. Các hàm viết sẵn được khai báo trong các file nguyên mẫu *.h. Do đó, để sử dụng được các hàm này, cần có chỉ thị #include ở ngay đầu chương trình.

4

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

5 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

a. Khai báo

Khai báo một hàm như sau:

<kiểu giá trị trả lại> <tên hàm> (danh sách tham số);

trong đó, kiểu giá trị trả lại còn gọi là kiểu hàm và có thể nhận kiểu chuẩn bất kỳ của C++ và cả kiểu của người sử dụng tự tạo. Đặc biệt nếu hàm không trả lại giá trị thì kiểu của giá trị trả lại được khai báo là void.

Ví dụ:

5

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

6 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

a. Khai báo

Ví dụ:

int bp(int); // Khai báo hàm bp, có đối số số kiểu int và kiểu hàm là int

int rand100(); // Không đối số số, kiểu hàm (giá trị trả lại) là int

void alltrim(char[]) ; // đối số số là mảng kí tự, hàm không trả lại giá trị (không kiểu).

cong(int, int); // Hai đối số số kiểu int, kiểu hàm là int (ngầm định).

6

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

7 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

b. Định nghĩa hàm

Cấu trúc một hàm bất kỳ được bố trí cũng giống như hàm main() trong các phần trước. Cụ thể:

• Hàm có trả về giá trị

<kiểu hàm><tên hàm> (danh sách tham số)

{

khai báo cục bộ của hàm ; // chỉ dùng cho hàm này

dãy lệnh của hàm ;

return (biểu thức trả về); // có thể nằm đâu đó trong dãy lệnh.

}

7

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

8 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

b. Định nghĩa hàm

• Hàm không trả về giá trị (thủ tục)

Nếu hàm không trả lại giá trị (tức kiểu hàm là void), khi đó có thể có hoặc không có câu lệnh return, nếu có thì đằng sau return sẽ không có biểu thức giá trị trả lại.

Ví dụ 3 : Hàm xoá màn hình 100 lần,

void xmh() //xmh la xoa man hinh

{ int i;

for (i=1; i<=100; i++); system(“cls”);

return ;

}

8

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

9 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.1. Khai báo và định nghĩa hàm

c. Chú ý về khai báo và định nghĩa hàm

• Danh sách đối số trong khai báo hàm có thể chứa hoặc không chứa tên đối số.

• Cuối khai báo hàm phải có dấu chấm phẩy (;), trong khi cuối dòng đầu tiên của định nghĩa hàm không có dấu chấm phẩy.

• Hàm có thể không có đối số (danh sách đối số rỗng), tuy nhiên cặp dấu ngoặc sau tên hàm vẫn phải được viết.

Ví dụ system(“cls”), lamtho(), vietgiaotrinh(), …

9

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

10 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.2 Các loại biến và phạm vi

a. Biến cục bộ

Là các biến được khai báo trong thân của hàm và chỉ có tác dụng trong hàm này, kể cả các biến khai báo trong hàm main() cũng chỉ có tác dụng riêng trong hàm main().

Tham số của các hàm cũng được xem như biến cục bộ.

10

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

11 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.2 Các loại biến và phạm vi

b. Biến ngoài (biến toàn cục)

Là các biến được khai báo bên ngoài của tất cả các hàm. Vị trí khai báo của chúng có thể từ đầu văn bản chương trình hoặc tại một một vị trí bất kỳ nào đó giữa văn bản chương trình.

Thời gian tồn tại của chúng là từ lúc chương trình bắt đầu chạy đến khi kết thúc chương trình.

Ví dụ: TCCTBienCB

11

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

12 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12. 3. Lời gọi và sử dụng hàm

Lời gọi hàm được phép xuất hiện trong bất kỳ biểu thức, câu lệnh của hàm khác … Nếu lời gọi hàm lại nằm trong chính bản thân hàm đó thì ta gọi là đệ quy. Để gọi hàm ta chỉ cần viết tên hàm và danh sách các giá trị cụ thể truyền cho các đối số đặt trong cặp dấu ngoặc tròn ().

tên hàm(danh sách tham số thực sự) ;

− Danh sách tham số thực sự còn gọi là danh sách giá trị gồm các giá trị cụ thể để gán lần lượt cho các tham số hình thức của hàm.

− Danh sách tham số thực sự truyền cho tham số hình thức có số lượng bằng với số lượng đối số trong hàm và được truyền theo thứ tự tương ứng.

12

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

13 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12. 3. Lời gọi và sử dụng hàm

− Khi một hàm được gọi, nơi gọi tạm thời chuyển điều khiển đến thực hiện dòng lệnh đầu tiên trong hàm được gọi. Sau khi kết thúc thực hiện hàm, điều khiển lại được trả về thực hiện tiếp câu lệnh sau lệnh gọi hàm của nơi gọi.

Ví dụ: (VD1Ham) Giả sử ta cần tính giá trị của biểu thức 2x3 - 5x2 - 4x + 1, thay cho việc tính trực tiếp x3 và x2 , ta có thể gọi hàm luythua() trong ví dụ trên để tính các giá trị này bằng cách gọi nó trong hàm main() như sau:

13

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

14 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12. 4. Hàm với đối số mặc định

Từ thực tế đó C++ đưa ra một cú pháp mới về hàm sao cho một danh sách tham số thực sự trong lời gọi không nhất thiết phải viết đầy đủ nếu một số trong chúng đã có sẵn những giá trị định trước. Cú pháp này được gọi là hàm với tham số mặc định và được khai báo với cú pháp như sau:

<kiểu hàm><tên hàm>(đ1,…,đn,đmđ1=gt1,…,đmđm=gtm);

− Các đối số đ1, …, đn và đối số mặc định đmđ1, …, đmđm đều được khai báo như cũ nghĩa là gồm có kiểu đối số và tên đối số.

− Riêng các đối số mặc định đmđ1, …, đmđm có gán thêm các giá trị mặc định gt1, …, gtm.

14

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

15 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12. 4. Hàm với đối số mặc định

Chú ý:

Các đối số ngầm định phải được khai báo liên tục và xuất hiện cuối cùng trong danh sách đối số. Ví dụ:

int tong(int x, int y=2, int z, int t=1); // SAI vì các đối số mặc định không liên tục

void xoa(int x=0, int y) // SAI vì đối số mặc định không ở cuối

Ví dụ: (HamDSMD)

15

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

16 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.5. Khai báo hàm trùng tên

- 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ố lượng dữ liệu khác nhau.

- Ví dụ hàm sau tìm số lớn nhất trong 2 số nguyên:

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

- Nếu đặt c = max(3, 5) ta sẽ có c = 5. Tuy nhiên cũng tương tự như vậy nếu đặt c = max(3.0, 5.0) chương trình sẽ bị lỗi vì các giá trị (float) không phù hợp về kiểu (int) của đối số trong hàm max

16

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

17 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.5. Khai báo hàm trùng tên

- Tuy nhiên trong C và các NNLT cổ điển khác chúng ta buộc phải sử dụng một tên mới cho hàm "mới" này. Ví dụ:

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

Tương tự để thuận tiện ta sẽ viết thêm các hàm

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

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

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

Tóm lại ta sẽ có 5 hàm: max, cmax, fmax, lmax, dmax, việc sử dụng tên như vậy sẽ gây bất lợi khi cần gọi hàm

17

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

18 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.5. Khai báo hàm trùng tên

C++ cho phép ta có thể khai báo và định nghĩa cả 5 hàm trên với cùng 1 tên gọi ví dụ là max chẳng hạn. Khi đó ta có 5 hàm:

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

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

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

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

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

Và lời gọi hàm bất kỳ dạng nào như max(3,5), max(3.0,5), max('O', 'K') đều được đáp ứng.

18

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

19 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.5. Khai báo hàm trùng tên

Tóm lại 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 sau:

• Số lượng các tham số trong hàm là khác nhau, hoặc

• Kiểu của tham số trong hàm là khác nhau.

19

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

20 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.6. Biến, đối số tham chiếu

- Một biến có thể được gán cho một bí danh mới, và khi đó chỗ nào xuất hiện biến thì cũng tươ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 tham 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ủa nó.

- Giống khai báo biến bình thường, tuy nhiên trước tên biến ta thêm dấu và (&).

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

Ví dụ: (BienThamChieu)

20

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

21 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.7. Các cách truyền tham số

Có 3 cách truyền tham số thực sự cho các tham số hình thức trong lời gọi hàm: tham trị, tham chiếu, dẫn trỏ.

Ví dụ: VDTTSo

21

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

22 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.7. Các cách truyền tham số

Giải PTB2----Tên chương trình HPTB2.CPP

VD: Nhập số nguyên N (1<=N<=105) và N dòng tiếp theo mỗi dòng chứa 3 số nguyên a, b, c là cơ số của PTB2 ax2+bx+c=0 (a#0). Tương ứng với mỗi bộ số hay thông báo 2 nghiệm (lấy 2 số lẻ), 1 nghiệm kép (lấy 2 số lẻ), PTVN.

22

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

 

PTB2.INP

PTB2.OUT

Test01

1 2 3

PTVN

Test02

1 2 1

-1.00

Test03

1 4 2

-3.41

-0.59

23 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Truyền mảng 1 chiều cho hàm

-Cách thứ nhất đối số được khai báo bình thường như khai báo biến mảng nhưng không cần có số phần tử kèm theo.

Ví dụ:

− int x[];

− float x[];

- Cách thứ hai khai báo đối số như một con trỏ kiểu phần tử mảng,

Ví dụ:

- int *p;

- float *p

23

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

24 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Truyền mảng 1 chiều cho hàm

Tên chương trình HAMNXMANG.CPP

VD: Nhập số nguyên N (1<=N<=1000) và dãy số nguyên a1,a2,…,an vào từ bàn phím. Nhập vào từ bàn phím số nguyên M (1<=M<=1000) sau đó xuất ra màn hình M phần tử a1,a2,…am.

24

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

25 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Truyền mảng 2 chiều cho hàm:

Đối số với mảng 2 chiều khai báo đối số cũng như lời gọi là phức tạp hơn nhiều so với mảng 1 chiều.

− Khai báo theo đúng bản chất của mảng 2 chiều float x[m][n] do C++ qui định

− Xem mảng float x[m][n] thực sự là mảng một chiều float x[m*n] và sử dụng cách khai báo như trong mảng một chiều

25

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

26 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Truyền mảng 2 chiều cho hàm:

Viết hàm nhập và tính tổng mảng HamTongM2C

VD1: Nhập 2 số nguyên ma, na (2<=ma, na<=100) là số dòng và cột của mảng a và các phần tử của mảng a. Nhập 2 số nguyên mb, nb (2<=mb, nb<=100) là số dòng và cột của mảng b và các phần tử của mảng b. Hãy viết hàm dùng để nhập 2 mảng, tính tổng 2 mảng.

26

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

27 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Đối số và giá trị trả lại là xâu kí tự

Giống các trường hợp đã xét với mảng 1 chiều, đối số của các hàm xâu kí tự có thể khai báo dưới 2 dạng: mảng kí tự hoặc con trỏ kí tự. Giá trị trả lại luôn luôn là con trỏ kí tự. Ngoài ra hàm cũng có thể trả lại giá trị vào trong các đối số con trỏ trong danh sách đối số.

VD:

27

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

28 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Hàm và mảng dữ liệu

Đối số và giá trị trả lại là xâu kí tự

Hàm tách họ tên

Ví dụ sau đây dùng để tách họ, tên của một xâu họ và tên. Ví dụ gồm 3 hàm. Hàm họ trả lại xâu họ (con trỏ kí tự). Hàm tên trả lại xâu tên (con trỏ kí tự). Hàm thứ ba cũng trả lại họ, tên nhưng cho vào trong danh sách tham số, do vậy hàm không trả lại giá trị (void). Để đơn giản ta qui ước xâu họ và tên không chứa các dấu cách đầu và cuối xâu, trong đó họ là dãy kí tự từ đầu cho đến khi gặp dấu cách đầu tiên và tên là dãy kí tự từ sau dấu cách cuối cùng đến kí tự cuối xâu.

28

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

29 of 30

BÀI 12: CON TRỎ SỐ HỌC VÀ HÀM

12.8. Tóm tắt:

  • Hàm trả về giá trị, không trả về giá trị
  • return có thể ở bất kỳ vị trí nào trong hàm
  • Hàm với đối số mặc định
  • Hàm trùng tên
  • Truyền tham trị, tham chiếu, dẫn trỏ
  • Truyền mảng, xâu cho hàm

29

Trường THPT chuyên Thoại Ngọc Hầu Tin học 10 Chuyên

Tổ Tin học Chương III

30 of 30

30

Cám ơn quý thầy cô và

các bạn đã lắng nghe