Chƣơng 4 HÀM - FUNCTION - thayphet.net fileBắt đầu và kết thúc bằng các dấu { }....

38
1 Chƣơng 4 HÀM - FUNCTION Giảng Viên: ThS. Dƣơng Thành Phết Email: [email protected] Website: http://www.thayphet.net Tel: 0918158670 facebook.com/duongthanhphet KỸ THUẬT LẬP TRÌNH C/C++ TRƢỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN

Transcript of Chƣơng 4 HÀM - FUNCTION - thayphet.net fileBắt đầu và kết thúc bằng các dấu { }....

1

Chƣơng 4

HÀM - FUNCTION

Giảng Viên: ThS. Dƣơng Thành Phết

Email: [email protected]

Website: http://www.thayphet.net

Tel: 0918158670 – facebook.com/duongthanhphet

KỸ THUẬT LẬP TRÌNH C/C++

TRƢỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH

KHOA CÔNG NGHỆ THÔNG TIN

http://www.thayphet.net

NỘI DUNG

1. Khái niệm

2. Khai báo và sử dụng hàm

3. Tham số và truyền tham số cho hàm

4. Nguyên tắc xây dựng hàm

5. Hàm đệ quy

http://www.thayphet.net

3

CẤU TRÚC CHƢƠNG TRÌNH C/C++

3

Khai báo

Cài đặt hàm

Hàm main()

CH

ƯƠ

NG

TR

ÌNH

C

Khai báo thư viện

Khai báo hàm

Khai báo hằng số …

Cài đặt tất cả những hàm con

đã được khai báo

Gọi thực hiện các hàm theo

yêu cầu của bài toán

http://www.thayphet.net

4

1. KHÁI NIỆM

1.1. Hàm-Function là gì?

“Hàm là môt đoan chương trinh đôc lâp thưc hiên tron

ven môt công viêc nhât đinh sau đó trả vê gia tri cho

chương trinh goi nó, hay nói cach khac hàm là sư chia

nhỏ cua chương trinh”

4

http://www.thayphet.net

5

1. KHÁI NIỆM

1.2. Mục đich sử dụng hàm:

Khi co môt công việc giống nhau cần thực hiện ơ nhiều

vi tri.

Khi cần chia môt chương trinh lơn phức tap thành các

đơn thê nho (hàm con) đê chương trinh được trong

sáng, dê hiêu trong việc xư ly, quản ly việc tinh toán va

giải quyêt vấn đê.

5

http://www.thayphet.net

6

Cú pháp:

6

2. KHAI BÁO VÀ SỬ DỤNG HÀM

Type Tênhàm(các tham số){

Khai báo các biên cục bô;

Các câu lệnh;

[return [biêu thức];]

}

Type: Kiêu dữ liệu giá tri trả về của hàm

Kiêu dữ liệu trả về của hàm gồm 2 loai

void: Không trả về giá tri

float / int / long / char */ kiêu cấu trúc / … : Trả về

giá tri kêt quả có kiêu dữ liệu tương ứng

2.1. Khai báo

Thân hàm

http://www.thayphet.net

7

Vi dụ: Hàm tinh tổng giá tri 2 số nguyên

7

2. KHAI BÁO VÀ SỬ DỤNG HÀM

2.1. Khai báo

int Tong(int a, int b){

int s=0;

s=a+b;

return s;

}

Vi dụ: Hàm kiêm tra n co phải là số dương

bool KTDuong(int n){

if n>0

return true;

else

return false;

}

http://www.thayphet.net

8

Tên hàm: Đặt tên ngắn gọn phản ánh đúng chức năng

thực hiện của hàm

8

Danh sách các tham số (nêu có): Đầu vào của hàm

(trong môt số trường hợp có thể là đầu vào và đầu ra

cua hàm nếu kết quả đầu ra có nhiêu giá tri - Tham số

này goi là tham chiếu)

Thân hàm:

Bắt đầu và kêt thúc bằng các dấu { }.

Trong thân hàm chứa các câu lệnh cần thiêt đê thực

hiện yêu cầu đề ra cho hàm.

Thân hàm có thê có câu lệnh return, giá tri của biêu

thức lệnh return sẽ được gán cho lời gọi hàm.

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

9

int Tong(int a, int b)

{

int s=a+b;

return s;

}

void main()

{

int kq = Tong (12, 3);

cout<<“Tong cua 12 va 3: “<<kq;

} 9

Truyền đối số

Tham số

Gọi hàm

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

10

10

2.2 Nguyên tác hoạt động của hàm

Lời gọi hàm có dang:

Tên hàm([Danh sách các tham số thực])

Khi gặp lời gọi chương trình sẽ dời chỗ đên hàm

tương ứngTheo trình tự:

Cấp phát bô nhơ cho các biên cục bô.

Gán giá tri của các tham số thực cho các tham số

hình thức tương ứng.

Thực hiện các câu lệnh trong thân hàm.

Khi gặp câu lệnh return hoặc dấu } cuối cùng của

thân hàm thì chương trình sẽ xoá các tham số,

biên cục bô và ra khỏi hàm.

Câu lệnh return có chứa biêu thức thì giá tri của

biêu thức được gán cho hàm. Giá tri của hàm sẽ

được sử dụng trong các biêu thức chứa nó.

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

11

2.3. HÀM KHÔNG CÓ GIÁ TRỊ TRẢ VỀ (KIỂU VOID)

Cài đặt

void TênHàm([danh sach cac tham sô]){

Khai bao cac biến cuc bô

Cac câu lênh / khối lênh hay lời goi đến hàm khac.

}

11

Gọi hàm

TênHàm(danh sách tên các đối số);

Những phương thức loai này thường rơi vào những nhom chức

năng: Nhâp / xuất dữ liệu , thống kê, sắp xêp, liệt kê.

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

12

Ví dụ 1: Viêt chương trinh nhâp số nguyên dương n và in

ra màn hinh các ươc số của n

Phân tich bài toán:

Input:

n (tham số)

Kiêu dữ liệu: số nguyên dương (int).

Output:

In ra các ươc số của n (dữ liệu trả về của hàm)

Xuất ra màn hinh Không trả về giá tri (Kiêu void)

Xác đinh tên hàm: Hàm này dung in ra các ươc số của

n nên co thê đặt là LietKeUocS Khai báo hàm:

void LietKeUocSo(int n); 12

2.3. HÀM KHÔNG CÓ GIÁ TRỊ TRẢ VỀ (KIỂU VOID)

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

13

File khaibao.h

#include “iostream”

using namespace std;

void LietKeUocSo(int n);

13

File caidat.cpp

#include “khaibao.h”

void LietKeUocSo(int n){

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

if (n % i == 0)

cout<<i<<“\t”;

}

File Chuongtrinh.cpp

#include “khaibao.h”

void main(){

int n;

cout<<"Nhap so nguyen duong n: ";

cin>>n;

cout<<"Cac uoc so cua “<<n<<“: “;

LietKeUocSo(n);

}

http://www.thayphet.net

14

2.4. HÀM TRẢ VỀ 1 GIÁ TRỊ

Cài đặt

<Kiểu dư liêu> TênHàm([danh sach cac tham số]){

<Kiểu dư liêu trả vê> kq;

Khai bao cac biến cuc bô

Cac câu lênh / khối lênh hay lời goi đến hàm khac.

return kq;

}

14

Gọi hàm

<Kiểu dư liêu > Tên biến = TênHàm (Cac tham số);

Những phương thức này thường rơi vào các nhóm: Tính tổng,

tích, trung bình, đếm, kiểm tra, tìm kiếm

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

15

Ví dụ 2: Viêt chương trinh nhâp số nguyên dương n và tinh

tổng: Sn=1+2+3+ . . .+n ; vơi n>0

Phân tich bài toán:

Input:

n (tham sô)

Kiêu dư liệu: sô nguyên dương (int).

Output:

Tra vê gia tri của S. S là tổng các sô nguyên dương nên S cung là sô nguyên dương Kiêu tra vê của hàm là int (hoặc long).

Xác đinh TênHàm:

Dung tinh tổng S nên co thê đặt là TongS

int Tong(int n);

15

2.4. HÀM TRẢ VỀ 1 GIÁ TRỊ

2. KHAI BÁO VÀ SỬ DỤNG HÀM

http://www.thayphet.net

16

File khaibao.h #pragma once #include <iostream.h> int TongS(int n);

16

File caidat.cpp #include “khaibao.h” int TongS(int n){ int kq = 0; for (int i = 1; i <= n; i++) kq + = i; return kq; }

File main.cpp #include “khaibao.h” void main(){ int n, S; cout<<"Nhap vao so nguyen n: "; cin>>n; S = TongS(n); cout<<"Tong tu 1 den n: " <<S; }

http://www.thayphet.net

17

3. THAM SỐ VÀ TRUYỀN THAM SỐ

17

3.1. Tham số hình thức và tham số truyền

int Tong(int a, int b)

{

int s=a+b;

return s;

}

void main()

{

int x=12, y=3;

int kq = Tong (x, y);

cout<<“Tong cua 12 va 3: “<<kq;

}

Truyền tham số

Tham số hình thức

Tham số hình thức là biên được

liệt kê trong danh sách tham số

(phần đầu của đinh nghĩa hàm).

Tham số thực (Tham số truyền)

là giá tri cụ thê của biên đo tai thời

điêm chay.

http://www.thayphet.net

18

3. THAM SỐ VÀ TRUYỀN THAM SỐ

18

Tham số chứa dữ liệu đầu vào

3.2. Tham số là tham tri

void HoanVi(int a, int b){

int tam = a;

a = b;

b = tam;

printf("Trong HoanVi: a = %d; b=%d“,a,b);

}

void main(){

int a = 5, b = 21;

printf("Truoc khi HoanVi: a =%d, b=%d “,a,b);

HoanVi(a, b);

printf("Sau khi goi HoanVi: a =%d, b=%d»,a,b);

}

http://www.thayphet.net

19

3. THAM SỐ VÀ TRUYỀN THAM SỐ

19

Tham số làm kêt quả đầu ra

Tham số vừa làm đầu vào và đầu ra

Dùng dấu & phía trươc tên tham số khi cài đặt hàm

3.3. Tham số là tham chiếu (tham biến)

void HoanVi(int &a, int &b){

int tam = a; a = b;

b = tam;

cout<<"Trong HoanVi: a = “<<a<<“ ;b = “<<b;

}

void main(){

int a = 5, b = 21;

cout<<"Truoc khi HoanVi: a = “<<a<<“ ; b = “<<b;

HoanVi(a, b);

cout<<"Sau khi goi HoanVi: a = “<<a<<“ ;b = “<<b;

}

http://www.thayphet.net

20

3. THAM SỐ VÀ TRUYỀN THAM SỐ

20

3.4. Tham số mặc đinh Tham số mặc đinh là tham số của được gán giá tri mặc

đinh khi khai báo.

Khi gọi hàm, nêu không cung cấp giá tri cho đối số thì

giá tri mặc đinh của tham số sẽ được sử dụng.

Còn nêu cung cấp giá tri khác cho đối số thì giá tri đo

sẽ được sử dụng.

http://www.thayphet.net

21

3. THAM SỐ VÀ TRUYỀN THAM SỐ

21

3.4. Tham số mặc đinh

void PrintValues(int nValue1, int nValue2=10)

{

cout << "1st value: " << nValue1 << endl;

cout << "2nd value: " << nValue2 << endl;

}

void main()

{

PrintValues(1); // nValue2 se su dung mac dinh la 10

PrintValues(3, 4); // nValue2 se su dung la 4 khong phai 10

}

Chương trinh xuất ra:

1st value: 1

2nd value: 10

1st value: 3

2nd value: 4

http://www.thayphet.net

22

4. NGUYÊN TẮC KHI XÂY DỰNG HÀM

Trươc khi xây dựng hàm phải trả lời những câu hỏi sau:

Hàm trả về gì? Xác đinh kiêu dữ liệu trả về của hàm

Hàm làm gì? Xác đinh tên hàm

Cần thông tin gì đê hàm xử lý? Xác đinh tham số

Ứng vơi mỗi thông tin đã xác đinh, xác đinh xem đã có

giá tri trươc khi vào hàm chưa,

- Nêu chưa có Tham chiêu

- Nêu có mà sau khi thực hiện xong hàm vẫn không

thay đổi Tham tri (không là tham chiêu)

- Nêu có mà sau khi thực hiện xong hàm thì giá tri cung

bi thay đổi theo Tham chiêu 22

http://www.thayphet.net

23

5. HÀM ĐỆ QUY

23

1. KHÁI NIỆM

Kỹ thuât lâp trình đệ qui là:

Phương pháp (GiảI thuât) lâp trình dươi dang hàm

con mà môt hàm được gọi co tinh đê qui nghĩa là:

”Trong thân cua hàm đó có lênh goi lai chinh nó môt

cach tường minh hay tiêm ân”

Phân loại đê qui:

Đệ qui tuyên tinh.

Đê qui nhi phân.

Đê qui phi tuyên.

Đê qui hô tương.

http://www.thayphet.net

24

5. HÀM ĐỆ QUY

24

5.2. ĐỆ QUI TUYÊN TINH

Trong thân hàm có duy nhât môt lời goi hàm goi lai chinh

nó môt cach tường minh.

<Kiêu dữ liệu> TenHam (<danh sách tham số>)

{

if (điều kiện dừng)

//Trả về giá tri hay kêt thúc công việc

//Thực hiện môt số công việc (nêu co)

…TenHam (<danh sách tham số>);

//Thực hiện môt số công việc (nêu co)

}

http://www.thayphet.net

25

5. HÀM ĐỆ QUY

25

5.2. ĐỆ QUI TUYÊN TINH

long Giaithua (int n)

{

if(n==1)

return 1;

return n*Giaithua(n-1);

}

Vi dụ 1: Tinh vơi n>0

- Điêu kiên dưng: S(0) = S(1)= 1.

- Qui tăc (công thưc) tinh: S(n) = n*S(n-1)

nnnS *....*2*1!)(

http://www.thayphet.net

26

5. HÀM ĐỆ QUY

26

5.2. ĐỆ QUI TUYÊN TINH nnnS *....*2*1!)(

5n 5n 4n 3n 2n

GiaiThua(5)main()

5 4 23 1

12624120

GiaiThua(2)GiaiThua(4) GiaiThua(3)

1n

GiaiThua(1)

Cách thức hoạt động của đệ qui

Khi co lệnh gọi hàm S= gt(5); thì

Sẽ ghi nhơ là: gt(5)= 5 * gt(4); và đi tinh gt(4)

Kê tiêp máy lai ghi nhơ: gt(4):= 4 * gt(3); và đi tinh gt(3)

Kê tiêp máy lai ghi nhơ: gt(3):= 3 * gt(2); và đi tinh gt(2)

Kê tiêp máy lai ghi nhơ: gt(2):= 2 * gt(1); và đi tinh gt(1)

Theo đinh nghĩa của hàm thi: gt(1):= 1;

Máy sẽ quay ngược lai:

gt(2)= 2 * 1 = 2

Tiêp tục: gt(3)= 3 * 2 = 6;

gt(4)= 4 * 6 = 24

gt(5)= 5 *24=120

Kêt quả cuối cung trả về là 120

http://www.thayphet.net

27

5. HÀM ĐỆ QUY

27

5.2. ĐỆ QUI TUYÊN TINH nnnS *....*2*1!)(

5n 5n 4n 3n 2n

GiaiThua(5)main()

5 4 23 1

12624120

GiaiThua(2)GiaiThua(4) GiaiThua(3)

1n

GiaiThua(1)

Cách thức hoạt động của đệ qui

Khi co lệnh gọi hàm S= gt(5); thì

Sẽ ghi nhơ là: gt(5)= 5 * gt(4); và đi tinh gt(4)

Kê tiêp máy lai ghi nhơ: gt(4):= 4 * gt(3); và đi tinh gt(3)

Kê tiêp máy lai ghi nhơ: gt(3):= 3 * gt(2); và đi tinh gt(2)

Kê tiêp máy lai ghi nhơ: gt(2):= 2 * gt(1); và đi tinh gt(1)

Theo đinh nghĩa của hàm thi: gt(1):= 1;

Máy sẽ quay ngược lai:

gt(2)= 2 * 1 = 2

Tiêp tục: gt(3)= 3 * 2 = 6;

gt(4)= 4 * 6 = 24

gt(5)= 5 *24=120

Kêt quả cuối cung trả về là 120

http://www.thayphet.net

28

5. HÀM ĐỆ QUY

28

5.3. ĐỆ QUI NHỊ PHÂN

<Kiêu dữ liệu hàm> TenHam (<danh sách tham số>)

{

if (điều kiện dừng)

//Trả về giá tri hay kêt thúc công việc

//Thực hiện môt số công việc (nêu co)

….TenHam (<danh sách tham số>);

//Thực hiện môt số công việc (nêu co)

. . . TenHam (<danh sách tham số>);

//Giải quyêt vấn đề con lai

//Thực hiện môt số công việc (nêu co)

}

Trong thân cua hàm có hai lời goi hàm goi lai chinh nó môt

cach tường minh.

http://www.thayphet.net

29

5. HÀM ĐỆ QUY

29

5.3. ĐỆ QUI NHỊ PHÂN

Vi dụ: Tinh số hang thứ n của dãy Fibonaci được đinh

nghĩa như sau:

f1 = f0 =1 ;

fn = fn-1 + fn-2 ; (n>1)

Điêu kiên dưng: f(0) = f(1) = 1.

long Fibonaci (int n)

{

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

return 1;

return Fibonaci(n-1) + Fibonaci(n-2);

}

http://www.thayphet.net

30

5. HÀM ĐỆ QUY

30

5.4. ĐỆ QUI PHI TUYÊN

<Kiêu dữ liệu> TenHam (<danh sách tham số>) { for (int i = 1; i<=n; i++) { //Thực hiện môt số công việc (nêu co) if (điều kiện dừng) //Trả về giá tri hay kêt thúc công việc else { //Thực hiện môt số công việc (nêu co) TenHam (<danh sách tham số>); } } }

Trong thân cua hàm có lời goi hàm goi lai chinh nó được

đăt bên trong vong lăp.

http://www.thayphet.net

31

5. HÀM ĐỆ QUY

31

5.4. ĐỆ QUI PHI TUYÊN

Vi dụ: Tinh số hang thứ n của dãy {Xn} đinh nghĩa như sau:

X0 =1 ;

Xn = n2X0 + (n-1)2X1 + … + 12Xn-1 ; (n≥1)

Điêu kiên dưng:X(0) = 1.

long TinhXn (int n)

{

if(n==0)

return 1;

long s = 0;

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

s = s + i * i * TinhXn(n-i);

return s;

}

http://www.thayphet.net

32

5. HÀM ĐỆ QUY

32

Trong thân của hàm này co lời gọi hàm đên hàm kia và

trong thân của hàm kia co lời gọi hàm tơi hàm này.

5.5. ĐỆ QUI TƢƠNG HỖ

<Kiêu dữ liệu> TenHam2 (<danh sách tham số>);

<Kiêu dữ liệu> TenHam1 (<danh sách tham số>)

{

//Thực hiện môt số công việc (nêu co)

…TenHam2 (<danh sách tham số>);

//Thực hiện môt số công việc (nêu co)

}

<Kiêu dữ liệu> TenHam2 (<danh sách tham số>)

{

//Thực hiện môt số công việc (nêu co)

…TenHam1 (<danh sách tham số>);

//Thực hiện môt số công việc (nêu co)

}

http://www.thayphet.net

33

5. HÀM ĐỆ QUY

33

5.5. ĐỆ QUI TƢƠNG HỖ Vi dụ: Tinh số hang thứ n của hai dãy {Xn}, {Yn} được đinh nghĩa

như sau:

X0 =Y0 =1 ;

Xn = Xn-1 + Yn-1; (n>0)

Yn = n2Xn-1 + Yn-1; (n>0)

Điêu kiên dưng:X(0) = Y(0) = 1.

long TinhYn(int n);

long TinhXn (int n){

if(n==0)

return 1;

return TinhXn(n-1) + TinhYn(n-1);

}

long TinhYn (int n){

if(n==0)

return 1;

return n*n*TinhXn(n-1) + TinhYn(n-1);

}

http://www.thayphet.net

34

BÀI TẬP

Viêt chương trinh dung hàm cho các bài toán sau:

1. Viêt chương trinh tinh diện tich và chu vi của hinh

chữ nhât vơi chiều dài và chiều rông được nhâp từ

bàn phim.

2. Viêt chương trinh tinh diện tich và chu vi hinh tron vơi

bán kinh được nhâp từ bàn phim.

3. Nhâp vào 3 số thực a, b, c và kiêm tra xem chúng co

thành lâp thành 3 canh của môt tam giác hay không?

Nêu co hãy tinh diện tich, chiều dài mỗi đường cao

của tam giác và in kêt quả ra màn hinh.

4. Viêt chương trinh nhâp 2 số nguyên dương a, b. Tim

USCLN và BSCNN của hai số nguyên đo 34

http://www.thayphet.net

35

5. Viêt chương trinh nhâp số nguyên dương n, tinh tổng

các ươc số dương của n.

Vi dụ: Nhâp n=6

Tổng cac ước số tư 1 đến n: 1+2+3+6=12.

6. Nhâp vào giờ, phút, giây. Kiêm tra xem giờ, phút,

giây đo co hợp lệ hay không? In kêt quả ra màn hinh.

7. Viêt chương trinh tinh tiền thuê máy dich vụ Internet và in ra màn hinh kêt quả. Vơi dữ liệu nhâp vào là giờ bắt đầu thuê (GBD), giờ kêt thúc thuê (GKT), số máy thuê (SoMay).

Điều kiện cho dữ liệu nhâp: 6<=GBD<GKT<=21. Giờ là số nguyên.

Đơn giá: 2500đ cho mỗi giờ máy trươc 17:30 và 3000đ cho mỗi giờ máy sau 17:30.

35

BÀI TẬP

http://www.thayphet.net

36

8. Viêt chương trinh tinh tiền lương ngày cho công nhân, cho biêt trươc giơ vào ca, giơ ra ca của mỗi người.

Gia sƣ răng:

Tiền tra cho mỗi giơ trươc 12 giơ là 6000đ va sau 12 giơ là 7500đ.

Giơ vào ca sơm nhất là 6 giơ sáng va giơ ra ca trê nhất là 18 giơ (Gia sư giơ nhâp vào nguyên).

9. Viêt chương trinh nhâp sô nguyên dương n gồm k chư sô, đêm xem n co bao nhiêu chư sô là sô nguyên tô.

36

BÀI TẬP

http://www.thayphet.net

37

37

1. Tim USCLN của 2 số nguyên dương a,b

2. Tính S=1+2+3+….+n vơi n>0

3. Tính S=1+1.2+1.2.3+…..+1.2.3…n vơi n>0

4. Tính P(x,y) = xy

5. Tính

BÀI TẬP

Viêt chương trinh dung hàm đệ quy cho các bài toán sau:

38

The End.