Chương 8. Hàm trong C

I.Khaibáohàm II. Địnhngh ĩahàm III. Sử dụnghàm IV.Contr ỏ trỏ tớihàm V.Xây d ựngth ư việnhàm

1

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

I. Khai báo hàm

1.Gi ớithi ệu về hàm 2.Cúphápkhaibáohàm 3.Cáctham s ố trongkhaibáohàm

2

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

1. Giới thiệu về hàm † TrongC t ất cả cácch ươngtrìnhcon đều gọilàhàm. ư việncó s ẵn,ng ười lậptrìnhcó † Ngoàicáchàmth

† Khaibáohàm(functiondeclarationorprototype)là

thể tự tạoracáchàm. Để tạora m ộthàmng ười lập trìnhph ảikhaibáovà địnhngh ĩanó.

† Địnhngh ĩahàm(functiondefinition)làxác

xác địnhtên c ủahàm,ki ểu dữ liệutr ả về, số lượng tham số vàki ểu của từngtham s ố.

định ệnh

† CáchàmtrongCkhông l

côngvi ệcmàhàm s ẽ thựchi ệnthôngquacác l củahàm.

ồngnhau, t ứclàtrong m ột

3

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

hàmtakhôngth ểđị nhngh ĩa mộthàmkhác.

2. Cú pháp khai báo hàm

†Cúphápkhaibáohàm n

ằmtrên m ộtdòng, k ết

thúc bằng dấuch ấmph ẩy. Kiểu_trả_về Tên_hàm(Kiểu_1Tên_tham_s ố_1,Ki ểu_2Tên_tham_s ố_2,…); Ví dụ: floatinchtomet(floatx); intcong(inta,intb);

†Mộtkhaibáohàmkhôngchobi

ếtnh ữnggìcó

ỉ báochotrìnhbiên d

ịch

trongthânhàm.Nóch biết về tênhàm,ki ểu củahàm, s ố lượngcáctham số vàki ểu củacáctham s ố.

4

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

2. Cú pháp khai báo hàm (ti ếp)

† Khaibáohàmcóth

ểđặ t ở bất kỳ đâutr ướckhi g ọi

đuôi.h,còncác

định ư việncó đuôiobjho ặc

† Nếuhàm được địnhngh ĩa ở đâu đótr ướckhi g ọihàm ẫnnên

hàm. Tốtnh ấtlà đểởđầ u tệpch ứach ươngtrìnhchính (chứahàmmain)ho ặc để trước mộthàm s ẽ gọinó. Trongcácch ươngtrìnhnhi ềufilethìcáckhaibáohàm thường để trongcácfileheadercó nghĩahàm để trongcácfileth lib.

ấtlàtrongcácch ươngtrìnhcó

ươngtrình n ằmtrênnhi ều

5

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

thìcóth ể không cầnkhaibáohàm.Tuynhiên v cókhaibáohàmnh nhiềuhàm l ớnhaycácch file.

3. Các tham số trong khai báo hàm

†Nếuhàmkhôngcótham s

ố thìtrong d ấu ngoặc đơn củakhaibáohàm để trống.Ví d ụ: intxoa();

†Tên củacáctham s ố trongkhaibáohàmcó

thể không cầnxác định.Ví d ụ: floatinchtomet(float,float);

6

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

II. Định nghĩa hàm

1.Cúpháp địnhngh ĩahàm 2. Lệnhreturn 3.Hàmkhôngtr ả về giátr ị

7

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

1. Cú pháp định nghĩa hàm

Kiểu_trả_về Tên_hàm(Kiểu_1Tên_tham_s ố_1,Ki ểu_2Tên_tham_s ố_2,…) {

//Các lệnh củahàm để đây

Thân hàm

Không có dấu chấm phẩy

} Ví dụ: intcong(inta,intb) {

intz; z=a+b; returnz;

}

8

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

1. Cú pháp định nghĩa hàm (tiếp)

địnhngh ĩahàmgi ống ỉ kháclàkhôngcó d ấu ố bắtbu ộcph ảicó

†Dòng đầutiêntrong trongkhaibáohàm,ch chấmph ẩyvàcáctham s tên.

†Khi đãcókhaibáohàmthì

ệp.h,còncác

địnhngh ĩahàm ặc để trong một thường để sauhàmmainho tệpobj(lib). Để quen dần vớivi ệcvi ếtcác ết chươngtrình l ớn,khith ựchànhchúngtavi cáckhaibáohàmtrong t định nghĩahàm để trong tệp.obj(lib).

9

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

2. Lệnh return

† Lệnhreturn

được sử dụngtrong m ộthàm. L ệnh

returnth ựchi ệnhaich ức năng: n Làmcho m ộthàmtr ở về chươngtrình g ọinó. n Đượcdùng để trả về mộtgiátr ị. † Cúphápdùng l ệnhreturnnh ư sau:

† Lệnhreturncóth

hoặc returnGiá_tr ị_trả_về; return;

ể dùng ở bất kỳ vị trínàotrong

† Vớicáchàmcótr

hàmnh ưngth ường ở cuốihàm.

ả về giátr ị thì lệnhreturn b ắtbu ộc

10

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

phảicó.

3. Hàm không trả về giá trị

†Vớicáchàmkhôngtr

ả về giátr ị thìkhikhai

ảikhaibáoki

ểu

báovà địnhngh ĩahàmtaph trả về làvoid.Ví d ụ: voidchao();

†Nếu sử dụng lệnhreturntronghàmkhôngtr

về giátr ị thìch ỉ dùng được dạng: return;

11

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

III. Sử dụng hàm

1. Lời gọihàm 2.Truy ền đối số theogiátr ị 3.Truy ềncontr ỏ tớihàm 4.Truy ền mảng tớihàm

12

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

1. Lời gọi hàm

† Mộthàm,saukhi

được địnhngh ĩavàkhaibáo,có

† Cúpháp g ọihàmnh ư sau:

thểđượ cth ựchi ện bằng một lệnh gọihàm(l ời gọi ể gọi từ hàm) ở đâu đótrongch ươngtrình.Cóth hàmmain,cóth ặccóth ể ể gọi từ mộthàmkhácho gọi từ mộthàmthànhviên c ủa lớp.

† Nếuhàm đượckhaibáovà

Tên_hàm(Danhsáchcác đối số, nếucó);

13

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

địnhngh ĩalàcócác ị cho ảitruy ềngiátr tham số thìkhi g ọihàmtaph hàmquacáctham s ố.Cácgiátr ị truyềnchohàm g ọi làcác đối số.Các đối số cóth ể là hằng,bi ến, mảng, contr ỏ,…

1. Lời gọi hàm (tiếp)

† Ví dụ:gi ả sử takhaibáo m ộthàm c ộnghaigiátr

† Lời gọi mộthàmcótr

float intcong(inta,intb); Ta gọihàmnàynh ư sau: cong(7,8);

ả về giátr ị cóth ể sử dụng ả

ểuth ức.Khi ấuch ấmph ẩy

14

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

trongcácbi ểuth ức,còn l ời gọi mộthàmkhôngtr về giátr ị khôngdùng đượctrongbi dùngtrongbi ểuth ứcthìkhôngcó d sau lời gọihàm.Ví d ụ: a =cong(7,8)+2;cout<

1. Lời gọi hàm (tiếp)

†Hoạt động của lời gọihàm

Cùng một mã được dùng cho tất cả các lời gọi hàm

void func1()

{

Lời gọi hàm

sdfghjkl sdfghjkl sdfghjkl

}

Chương trình gọi hàm sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl

15

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

Ví dụ về hàm

†Viếtch ươngtrìnhtính s ố cácch ỉnh hợpch ậpk t ừ n phần tử.Ch ươngtrìnhph ải sử dụnghàm để tínhgiai thừa.

16

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

2. Truyền đối số

†TrongC,các

đối số truyềnvàochohàmlà

truyềntheogiátr

ị. †Khitruy ền đối số chohàmtheogiátr ến mới(têncácbi

ị thì ếnnày ị củacác

hàm sẽ tạoracácbi làtên c ủacáctham s ố),copygiátr đối số vàocácbi ến mớivàthaotáctrêncác biến mớinày. B ởi vậysaukhi g ọihàmcác đối số không bị thay đổigiátr ị mặcdùbên tronghàmgiátr

ị của đối số bị thay đổi.

17

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

2. Truyền đối số theo giá trị (tiếp)

#include voidDoiCho(inta,intb); intmain() {

intx=12,y=15; printf("Truockhidoicho:x=%d,y=%d“,x,y); DoiCho(x,y); printf(“Saukhidoicho:x=%d,y=%d“,x,y); return0;

} voidDoiCho(inta,intb)//Khaibaodetruyendoisotheogiatri {

inttmp=a; a=b; b=tmp;

}

18

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

3. Truyền con trỏ tới hàm

†Để truyềncontr ỏ tớihàmtaph

ảith ựchi ện

hai bước: n Khaibáocáctham s nghĩa)làcontr ỏ.

ố (khikhaibáovà định

n Khi gọihàmthì đối số truyềnchohàmlà Ví dụ: voidDoiCho(int*a,int*b); intx=12,y=15; DoiCho(&x,&y);

19

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

địach ỉ.

3. Truyền con trỏ tới hàm (tiếp) † Khitruy ềncontr ỏ tớihàmthìbi ếndocontr ỏ trỏ tới

voidDoiCho(int*a,int*b); ... . DoiCho(&x,&y); ... . voidDoiCho(int*a,int*b) {

inttmp=*a; *a=*b; *b=tmp;

}

20

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

cóth ể bị thay đổi bởihàm. Ví dụ: Đổich ỗ giátr ị củahaibi ến

4. Truyền mảng tới hàm

† Khitên m ảng được sử dụngmàkhôngcóch

ỉ số địach ỉ bắt đầu của mảng.Do đó,

ố củahàmthìtham s

† Bởivì địach ỉ của mảng đượctruy ền tớihàmnên mọithay đổi củahàmlên m ảng sẽ giữ nguyênkhi hàm kếtthúc.

21

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

kèmtheothìnólà nếudùng m ảnglàm đối số truyền tới mộthàmthì chỉ có địach ỉ của mảng đượctruy ền tớihàmch ứ khôngph ảitoàn b ộ mảng. Điềunàycóngh ĩa rằng ố phảicó khikhaibáotham s kiểucontr ỏ.

4. Truyền mảng tới hàm

† Tóm lại,truy ền mảng tớihàm c ần: † Truyềnvàotênbi ến mảng † Truyềnvào s ố phần tử dữ liệu đangch ứatrong

biến mảng † Khikhaibáo, địnhngh ĩahàm,ph ảikhaibáohai

22

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

tham số:tham s ố thứ nhấtlàcontr ỏ,tham s ố thứ hailàki ểuint.

4. Truyền mảng tới hàm (tiếp)

† Ví dụ: Viết mộthàm đưaracácph ần tử của mảng voidprint(int*m,intn); .... . intx[7]={2,5,8,1,6,7,10}; .... . print(x,7); .... . voidprint(int*m,intn) {

inti; for(i=0;i

}

23

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

Ví dụ

ần tử.

ố nguyêncónph

ố nguyêncónph

ần tử.

1)Nh ậpvào1dãy s Viếthàmxóaph ần tử thứ mtrongdãy(1<= m<=n). 2)Nh ậpvào1dãy s Tính tổngdãy s ố.Trongch ươngtrìnhcókhai báo, địnhngh ĩahàmtính t ổngdãy s ố vàph ải dùng mảng động để chứadãy s ố. 3)Tính t ổngcácph ần tử củamatr ậnnguyên cókíchth ướcmxn.Y/ckhaibáo, địnhngh ĩa hàmtính t ổng.

24

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

Truyền mảng nhiều chiều tới hàm

Cách1(dùng m ảng tĩnh):

• Truyềnvàotênbi ến mảngnhi ềuchi ều • Truyềnvào s ố phần tử hiện tạitheocácchi ều • Khaibáo, địnhngh ĩa:tham s ố ứng với mảng ước với ố saucó

ậnnguyênkích

Ví dụ:Nh ậpvào m ộtmatr thướcmxn.Vi ếthàmtính t ổngcácph ần tử của matr ậntruy ềnvàoqua đối số.

25

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

đượckhaibáolà m ảngcócùngkíchth mảng đối số sẽ truyềnvào,haitham s kiểuint.

Truyền mảng nhiều chiều tới hàm

Cách2(dùng m ảng động):

• Truyềnvàotênbi ến mảngnhi ềuchi ều • Truyềnvào s ố phần tử hiện tạitheocácchi ều • Khaibáo, địnhngh ĩa:tham s ố ứng mảng được

khaibáolàcontr

Ví dụ:Nh ậpvào m ộtmatr thướcmxn.Vi ếthàmtính t ổngcácph ần tử của matr ậntruy ềnvàoqua đối số.

26

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

ỏ,cáctham s ố saulàki ểuint. ậnnguyênkích

Truyền xâu ký tự tới hàm

• Chỉ truyềnvàotênbi ếnxâu • Tham số ứng vớibi ếnxâu đượckhaibáolà

contr ỏ trỏ tớiki ểuchar

• Ví dụ:Vi ếthàmtínhgiátr

ị của số nhị phân

đượctruy ềnvàochohàm d ưới dạngxâuký tự.

27

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

Hàm trả về mảng • Làtr ả về tênbi ến mảngnênki ểutr ả về là

contr ỏ

• Mảngtr ả về phảilà m ảng động

• BTVN:1)Vi

ếthàm c ộnghaimatr

ận số thựckíchth ướcmxnvàhàm đưamatr ậnra mànhìnhtheo d ạnghàng, c ột. 2)Vi ếthàmnhânhaimatr

ận Cmxn= Amxp* Bpxn

28

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

Hàm trả về xâu ký tự

• Làtr ả về tênbi ếnxâunênki

ểutr ả về làcon

trỏ trỏ tớiki ểuchar.

• Xâuký t ự trả về phảilàbi ếnxâu động

• Ví dụ:Vi ếthàmtr ả về xâuký t ự số nhị phân của số nguyên đượctruy ềnvàoqua đối số.

29

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

IV. Con trỏ trỏ tới hàm

†Một đặc điểm rất mạnh củaClàcontr

ảilàbi

ỏ hàm. ếnnh ưngnó Mặcdùhàmkhôngph vẫncó địach ỉ trong bộ nhớ. Địach ỉ nàycó thể chứatrong m ộtcontr ỏ.Vì địach ỉ của hàmch ứatrongcontr ỏ nêntacóth ể sử dụng contr ỏ thaychotênhàm.

†Để có địach ỉ củahàmtadùngtênhàmkhông

có đối số (giốngnh ư tênbi ến mảnglà địach ỉ của mảng).

30

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

IV. Con trỏ trỏ tới hàm (tiếp)

† Để cócontr ỏ cóth ể chứa địach ỉ củahàmtakhai

đótakhaibáocon

ỏ hàm

địach ỉ củahàmTongcho p

31

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

báocontr ỏ trỏ tớiki ểugi ốngki ểutr ả về củahàm, ố củahàm đặttrongngo ặc theosaulàcáctham s ố kiểu đơn.Ví d ụ:gi ả sử hàmTongcóhaitham s int,ki ểutr ả về cũnglàint.Khi trỏ trỏ tớihàmnàynh ư sau: intTong(inta,intb);//Khaibaohàm int(*p)(inta,intb);//Khaibáocontr p=Tong;//Gán (*p)(10,15);//G ọihàmTongquacontr ỏ

IV. Con trỏ trỏ tới hàm (tiếp)

†Ví dụ:Vi ếtch ươngtrìnhtính t ổng,hi ệu,tích vàth ương củahai s ố nguyênnh ậpvào t ừ bàn phím.Ch ươngtrìnhyêu c ầung ười sử dụng lựach ọn mộttrongcáccáchtính.

32

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

V-Xây dựng thư viện hàm

1)Cáckhaibáohàm để trong tệpheader(.h) 2)Các địnhngh ĩahàm để trong tệp.cpp 3)Biên d ịch tệp địnhngh ĩahàmthành t ệp.obj

bcc32–cvd.cpp 4) Tạo tệpth ư việnhàmcó đuôi.lib b ằngtrìnhtlib.

Vd:tlibthuvien.lib+ctc1.obj,ctc2.obj

5) Tệp.hvà.lib để trongcùngth ư mục với tệpch ương

trình.Thêm đường dẫnvào t ệp cấuhìnhtlink32.cfg ệpch ươngtrình ư việnhàmtrong t 6)Khaibáoth

33

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng

chính:#include”thuvien.h”

Ví dụ

ứahàmtìm

Xây dựngth ư việnhàmch USCLNvàki ểmtra m ột số nguyêncóph ảilà số nguyên tố không. Sử dụngth ư việnhàm,nh ậpvào2 s ố nguyên dương,tìmUSCLN c ủa2 s ố nguyên đãnh ập vàchobi ết2 s ố đócóph ảilà s ố nguyên tố không.

34

Lập trình nâng cao -Ch ương 08 -Ngô Công Th ắng