Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên...
Transcript of Hàm - Functionuet.vnu.edu.vn/~sonpb/THCS4/Lecture04-Ham.pdf · Hàm - Function Mộtsốnguyên...
Hàm Hàm -- FunctionFunction
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..
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..
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
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ự
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ố
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..
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
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
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)
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);;
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”
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
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
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ề
#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
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