Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên...

17
Hàm Hàm - Function Function

Transcript of Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên...

Page 1: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Hàm Hàm -- FunctionFunction

Page 2: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Hàm Hàm -- FunctionFunction

MộtMột sốsố nguyênnguyên tắctắc CáchCách khaikhai báobáo vàvà gọigọi thựcthực hiệnhiện PrototypePrototype củacủa hàmhàm TruyềnTruyền thamtham sốsố chocho hàmhàm BiếnBiến toàntoàn cục,cục, biếnbiến cụccục bộ,bộ, biếnbiến static,static, biếnbiến thanhthanh ghi,ghi,

…… CáchCách thứcthức CC thựcthực hiệnhiện cáccác lờilời gọigọi hàmhàm –– stackstack..

Page 3: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Một số nguyên tắcMột số nguyên tắc CácCác hàmhàm trongtrong NNLTNNLT CC đềuđều ngangngang cấpcấp vớivới nhaunhau::

HàmHàm khôngkhông đượcđược khaikhai báobáo lồnglồng nhaunhau.. ThứThứ tựtự khaikhai báobáo khôngkhông quanquan trọngtrọng..

HàmHàm cócó thểthể nhậnnhận vàvà xửxử lýlý nhiềunhiều thamtham sốsố hoặchoặc khôngkhông cócóthamtham sốsố nàonào

HàmHàm cócó thểthể trảtrả vềvề mộtmột giágiá trịtrị hoặchoặc khôngkhông.. BiếnBiến khaikhai báobáo trongtrong hàmhàm FF chỉchỉ cócó giágiá trịtrị trongtrong F,F, khôngkhông sửsử

dụngdụng đượcđược biếnbiến nàynày trongtrong cáccác hàmhàm kháckhác đượcđược..

Page 4: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Ví dụ: hàm tính xVí dụ: hàm tính xnn

double Power(double x, int n){

double result = 1;

for(int i=1; i< n; i++)result *= x;

return result;}

nhận vào 2 tham số khi được gọikiểu của giá trị trả về

giá trị được trả về qua lệnh return

Page 5: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Ví dụ: gọi thực hiện hàm PowerVí dụ: gọi thực hiện hàm Power

#include <stdio.h>

double Power(double, int);

int main(){

double m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(3.5, 4));return 0;

}

Chỉ thị cho chương trình biết prototype của hàm Power

3.5 và 4: 2 tham số thực sự

Page 6: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Một số lỗi thường gặpMột số lỗi thường gặp

#include <stdio.h>

int main(){

int m = Power(2, 3);printf(“3.5 ^ 4 = %lf”, Power(4));return 1.0;

}

Compiler không hiểu được hàm Power

giá trị trả về không khớp kiểu

hàm Power thiếu tham số

Page 7: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

PrototypesPrototypes DòngDòng khaikhai báobáo

double Power(double, int);

đượcđược hiểuhiểu làlà khaikhai báobáo prototypeprototype củacủa hàmhàm PowerPower ĐượcĐược dùngdùng khikhi chươngchương trìnhtrình sửsử dụngdụng mộtmột hàmhàm trướctrước khikhi

khaikhai báobáo.. KhaiKhai báobáo prototypeprototype thôngthông báobáo chocho trìnhtrình biênbiên dịchdịch biếtbiết kiểukiểu

củacủa giágiá trịtrị trảtrả vềvề vàvà mômô tảtả chichi tiếttiết vềvề cáccác thamtham sốsố củacủa hàmhàm.. CácCác hàmhàm thưthư việnviện chuẩnchuẩn đượcđược khaikhai báobáo prototypeprototype trongtrong cáccác

tậptập tintin headerheader (stdio(stdio..h,h, conioconio..h,h, ……)).. CácCác hàmhàm dodo lậplập trìnhtrình viênviên tựtự xâyxây dựngdựng phảiphải tựtự khaikhai báobáo

prototypeprototype..

Page 8: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Hàm: dạng tổng quátHàm: dạng tổng quát

kiểu trả về tên hàm(danh sách tham số hình thức){

//khai báo các biến của hàm

//các lệnh thực thi

return giá trị trả về; //hàm void không có giá trị trả về}

header của hàm

thân (body) hàm

Page 9: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

float g=6.5;void main(){

int i = 5, j, k = 2;float f = 2.8F;d = 3.7;

}void F(int v){

double d, e = 0.0, f;i++; g--;f = 0.0;

}

Tầm tác dụng của biếnTầm tác dụng của biến BiếnBiến toàntoàn cụccục::

KhôngKhông thuộcthuộc khốikhốinào,nào, cócó táctác dụngdụngtrongtrong toàntoàn chươngchươngtrìnhtrình kểkể từtừ khikhi khaikhaibáobáo

BiếnBiến cụccục bộbộ:: khaikhaibáobáo trongtrong mộtmột khối,khối,chỉchỉ cócó táctác dụngdụngtrongtrong khốikhối nàynày

compiler không chấp nhận “d”, “i”

“f” của hàm F, không phải của main

Page 10: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Truyền tham số cho hàmTruyền tham số cho hàmCC hỗhỗ trợtrợ 22 cáchcách truyềntruyền thamtham sốsố::

TruyềnTruyền thamtham sốsố bởibởi giágiá trịtrị ((truyềntruyền giágiá trịtrị -- callcall bybyvalue)value)

TruyềnTruyền thamtham sốsố bởibởi địađịa chỉchỉ ((truyềntruyền địađịa chỉchỉ -- callcallbyby address)address)

MởMở rộngrộng vớivới C++C++ TruyềnTruyền thamtham chiếuchiếu (call(call byby reference)reference)

Page 11: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Truyền giá trịTruyền giá trị

HàmHàm sẽsẽ xửxử lýlý trêntrên bảnbản saosao củacủa thamtham sốsố HàmHàm khôngkhông thểthể thaythay đổiđổi giágiá trịtrị củacủa thamtham sốsố đượcđược.. ĐượcĐược dùngdùng trongtrong cáccác trườngtrường hợphợp cầncần chuyểnchuyển dữdữ liệuliệu

vàovào bênbên trongtrong hàmhàm đểđể xửxử lý,lý, tínhtính toántoán CácCác víví dụdụ trêntrên đềuđều dùngdùng kiểukiểu truyềntruyền thamtham sốsố bởibởi giágiá trịtrị VíVí dụdụ hàmhàm cócó sẵnsẵn củacủa CC truyềntruyền giágiá trịtrị::

floatfloat sqrt(float)sqrt(float);; doubledouble pow(double,pow(double, double)double);;

Page 12: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Truyền giá trị Truyền giá trị -- ví dụví dụ#include <stdio.h>void change(int v);

int main(){

int var = 5;change(var);printf("main: var = %i\n", var);return 0;

}

void change(int v){

v *= 100;printf("change: v = %i\n", v);

}

change: v = 500main: var = 5

hàm change không thay đổi giá trị của “var”

Page 13: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Truyền địa chỉTruyền địa chỉ HàmHàm sẽsẽ xửxử lýlý trêntrên chínhchính thamtham sốsố nhờnhờ vàovào địađịa chỉchỉ

củacủa chúngchúng HàmHàm cócó thểthể thaythay đổiđổi giágiá trịtrị củacủa thamtham sốsố.. ĐượcĐược dùngdùng trongtrong cáccác trườngtrường hợphợp cầncần chuyểnchuyển dữdữ liệuliệu

làlà kếtkết quảquả xửxử lýlý đượcđược bênbên trongtrong hàmhàm rara “ngoài”“ngoài” chochocáccác hàmhàm kháckhác sửsử dụngdụng..

Ví dụ hàm có sẵn của C truyền địa chỉ:Ví dụ hàm có sẵn của C truyền địa chỉ:int scanf(const char *format, adr1, adr2, …);int scanf(const char *format, adr1, adr2, …);

functionfunctioninputsinputs outputsoutputs

Page 14: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Truyền địa chỉ Truyền địa chỉ -- ví dụví dụ#include <stdio.h>void change(int *v);

int main(){

int var = 5;change(&var);printf("main: var = %i\n", var);return 0;

}

void change(int *v){

(*v) *= 100;printf("change: *v = %i\n", (*v));

}

change: *v = 500main: var = 500

v: tham số địa chỉ của số int, khai báo với dấu *

truyền địa chỉ của “var” vào hàm change

Page 15: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

Phương thức trao đổi dữ liệuPhương thức trao đổi dữ liệu CC dùngdùng 11 stackstack đểđể lưulưu trữtrữ cáccác biếnbiến cụccục bộbộ vàvà cáccác chuyểnchuyển

cáccác thamtham sốsố chocho hàmhàm vớivới mỗimỗi lầnlần gọigọi hàmhàm thựcthực hiệnhiện HàmHàm gọigọi (O)(O) cấtcất cáccác thamtham sốsố vàovào stackstack.. GọiGọi thựcthực hiệnhiện hàmhàm đượcđược gọigọi (F)(F).. FF nhậnnhận lấylấy cáccác thamtham sốsố từtừ stackstack FF tạotạo cáccác biếnbiến cụccục bộbộ ứngứng vớivới cáccác thamtham sốsố trêntrên stackstack KhiKhi kếtkết thúc,thúc, FF cậpcập nhậtnhật giágiá trịtrị cáccác thamtham sốsố (ref)(ref) vàvà trảtrả điềuđiều

khiểnkhiển chocho OO OO nhậnnhận lấylấy cáccác giágiá trịtrị mớimới củacủa thamtham sốsố cũngcũng nhưnhư giágiá trịtrị trảtrả

vềvề

Page 16: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

#include <stdio.h>double power(int, int);int main(void){

int x = 2;double d;d = power(x, 5);printf("%lf\n", d);return 0;

}double power(int n, int p){

double result = n;while(--p > 0)

result *= n;return result;

}

main: x2

main: d?

power: p5power: n2

power: result32.0

Phương thức trao đổi dữ liệuPhương thức trao đổi dữ liệu

32.0

Page 17: Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên tắc Cách khai báo và gọithựchiện Prototype củahàm Truyềntham sốcho

TổngTổng kếtkết

KhaiKhai báobáo vàvà gọigọi thựcthực hiệnhiện hàmhàm KhaiKhai báobáo prototypesprototypes TầmTầm táctác dụngdụng củacủa biếnbiến TruyềnTruyền thamtham sốsố chocho hàmhàm VấnVấn đềđề tổtổ chứcchức dữdữ liệuliệu trongtrong chươngchương trìnhtrình