Вы находитесь на странице: 1из 86

Nhp mn lp trnh

ThS. ng Bnh Phng (dbphuong@fit.hcmus.edu.vn)


Gii thiu
Truyn tham s cho hm
Bin ton cc v bin cc b
Cc v d v ng dng hm trong lp trnh
Hm trong chng trnh nhiu tp tin
m ngun
Cc vn tm hiu m rng kin thc
ngh nghip
Thut ng v bi c thm ting Anh

10/7/2013 Khoa CNTT - H Khoa hc t nhin 2


Chng Chng trnh ln
trnh
c chia thnh cc
chng trnh con
Nhp
d liu
X l
Xut
kt qu
nh hn nhm d
dng phn chia v
kim tra cng vic
X l 1 X l 2 hay s dng li
Tip cn top-down
nhng b phn
trong lp trnh cu trc hon tt.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 4
Hm c cc c im sau:
C mt tn duy nht.
L mt thnh phn c lp.
Thc hin mt cng vic c th.
C th nhn cc i s.
C th tr v gi tr cho chng trnh gi n.
Hm
Cc i tng Thc hin Cc kt qu
c sn (i s) mt cng vic
c th no

10/7/2013 Khoa CNTT - H Khoa hc t nhin 5


return-type function_name(param-type param_name,
, param-type param_name);
Trong :
return-type: kiu ca gi tr hm s tr v, nu khng
tr v g c th kiu tr v s l void.
function_name: tn ca hm, th hin cng vic hm
s lm, nn bt u bng mt ng t.
param-name, param-type: tn v kiu tng ng ca
tham s hnh thc (formal parameter).
c kt thc bng du chm phy ;

10/7/2013 Khoa CNTT - H Khoa hc t nhin 6


return-type function_name(param-type param_name,
, param-type param_name)
{
// statements here
}
Trong :
Dng u l tiu hm (ging nguyn mu hm
nhng khng c ; v bt buc phi c tn tham s).
Tip theo l thn hm (t trong {}) cha cc cu
lnh hm s thc hin (phi c t nht mt lnh
return nu kiu tr v khng phi l void)
10/7/2013 Khoa CNTT - H Khoa hc t nhin 7
Hm c sn (trong ngn ng hoc do mt
hng phn mm vit bn hoc cho) nh:
Hm xut, nhp thng tin: printf(), scanf(),
Hm ton hc: sqrt(), pow(), abs(), sin(),
Hm do ngi lp trnh vit thm nh:
Hm xut, nhp thng tin: Nhp s dng, ...
Hm ton hc: Tnh cn bc 3, tnh cn bc n,
tnh giai tha, gii phng trnh bc 1, bc 2,
bc 4 i xng,
10/7/2013 Khoa CNTT - H Khoa hc t nhin 8
void main()
{ i s

int a = 7, b = 5;
float z = 9;
printf(a = %d\n, a);
printf(b = );
scanf(%d, &b);
z = (float)pow((double)b, (double)a);
}
Bin nhn gi tr
tr v ca hm
10/7/2013 Khoa CNTT - H Khoa hc t nhin 9
Hm tnh ( ) cha c trong
3

th vin math.h
3
hm 3
Lu :
0 = 0
3
= (, 1.0 3) > 0
(, 1.0 3) < 0

Khai bo hm: double sqrt3(double x);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 10


double sqrt3(double x) {
double y = 0; // temporary variable
if (x > 0)
y = pow(x, 1/(double)3);
else
if (x < 0)
y = -pow(-x, 1/(double)3);
return y; // returns result
} // end of function

10/7/2013 Khoa CNTT - H Khoa hc t nhin 11


Vit hm tnh ( , )

, hm (nu xc nh)

Lu :
Nu l th
lun xc nh.
0 = 0

= (, 1.0 ) > 0
(, 1.0 ) < 0
Nu chn th ch xc nh khi 0.


= , 1.0/
10/7/2013 Khoa CNTT - H Khoa hc t nhin 12
// Function name : sqrtN
// Description : calculates n-th root of x
// Parameter : double x
// Return type : double
// 0 if n < 0
// 1 if n = 0
// x^(1/n) if n odd
// x^(1/n) if n even and x >= 0
// 0 if n even and x < 0
double sqrtN(double x);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 13


double sqrtN(double x)
{
double y = 0;

if (n <= 0 || (n % 2 ==0 && x < 0))


return 0;
if (n % 2 != 0)
{
if (x > 0)
y = pow(x, 1.0/n);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 14


else // n odd and x <= 0
if (x < 0)
y = -pow(-x, 1.0/n);
}
else // n even and x > 0
y = pow(x, 1.0/n);

return y;
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 15


Cc cu lnh bn trong hm ch c thc
thi khi hm c gi t mt phn khc
ca chng trnh.
Khi gi hm, chng trnh c th truyn n
hm thng tin di dng mt hay nhiu i s.
main() { f1() { f2() {
call f1 call f2 }
} }

10/7/2013 Khoa CNTT - H Khoa hc t nhin 17


i s (argument) hay tham s thc
(actual parameter) l d liu ca chng
trnh truyn n hm c kiu d liu ng
vi tham s hnh thc c khai bo trong
nguyn mu hm. D liu ny thng
c hm s dng thc hin cng vic
ca n.
i s
2, 3, x

int SolveEq1(double a, double b, double &x);


10/7/2013 Khoa CNTT - H Khoa hc t nhin 18
C hai cch truyn i s
Truyn bng gi tr (pass by value)
i s khng i do hm to bn sao ca i s khi nhn.
Thng thng l d liu c sn.
Tham s hnh thc tng ng c gi l tham tr.
Truyn bng tham chiu (pass by reference): C++
i s c th thay i khi gi hm.
Thng thng l d liu cn tnh ton, xc nh.
Tham s hnh thc tng ng c gi l tham
chiu hay tham bin.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 19
int Inc(int x);
void main() {
int a = 9, b;
b = Inc(a); // a is passed by value
printf(a = %d, b = %d\n, a, b);
}
int Inc(int x) { int x = 9;

x++;
return x;
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 20


a ch
ca a

int Inc(int &x); // C++ int Inc(int *x); /* C */


void main() { void main() {
int a = 9, b; int a = 9, b;
b = Inc(a); b = Inc(&a);
printf(a = %d, printf(a = %d,
b = %d\n, a, b); b = %d\n, a, b);
} }
int Inc(int &x) { int Inc(int *x) {
x++; (*x)++;
return x; int *x = &a; return (*x);
} }
10/7/2013 Khoa CNTT - H Khoa hc t nhin 21
void f1(double x);
double x = 15.06;
void f2(double &x);
void f3(const double &x);
void main() {
Tn b nh
double a = 15.06; khi x ln
f1(a); // passed by value
f2(a); // passed by reference
f3(a); // passed by const reference
}
// defines f1(), f2(), f3() here

10/7/2013 Khoa CNTT - H Khoa hc t nhin 22


C hai cch gi hm
Mi hm u c th c gi bng cch s
dng tn hm km danh sch cc i s
trong mt cu lnh n. Nu hm c gi tr
tr v, gi tr ny s b b qua.
i vi cc hm c gi tr tr v, do cc hm
ny c quy thnh mt gi tr (do hm tr
v) nn chng l cc biu thc C hp l v c
th c s dng bt k ni u m mt
biu thc C c th c s dng.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 23
void DoSomething();
int Sum(int x, int y);
void main() {
DoSomething();
Sum(1, 2); // the return value is discarded
int x = Sum(1, 2);
int y = Sum(1, Sum(2, 3));
printf(%d\n, Sum(1, 2));
}
// defines DoSomething() and Sum() here

10/7/2013 Khoa CNTT - H Khoa hc t nhin 24


Nu c s dng cc hm c kiu tr v l
void nh mt biu thc th trnh bin dch
s pht sinh mt thng bo li.
void DoSomething();
void main() {
DoSomething();
int x = DoSomething(); // error
printf(%d\n, DoSomething()); // error
}
// defines DoSomething() here
10/7/2013 Khoa CNTT - H Khoa hc t nhin 25
Hy truyn i s vo hm lm cho
hm tng qut c th ti s dng.
int Sum() { // non generic
int x, y;
// inputs x, y here
return x + y;
}
int Sum(int x, int y) { // generic and thus reusable
return x + y;
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 26
Nn tn dng u im ca kh nng t
hm vo trong biu thc nhng trnh lm
cho cu lnh di dng, kh hiu.
int Sum(int x, int y);
void main() {
int a = 1, b = 2 , c = 3, x;
printf(%d, Sum(a, Sum(b, c))); // !!!
x = Sum(b, c);
printf(%d, Sum(a, x)); // better
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 27
L phm vi hiu qu ca bin khi c
khai bo trong chng trnh
Bin cc b (local variable)
c khai bo bn trong hm.
Ch c tc dng trong hm .
c khi to bi mt hng s hoc mt biu
thc tng ng vi kiu ca bin.
Bin cc b s b xa khi b nh ngay khi
kt thc hm.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 29
Bin ton cc (global variable)
c khai bo bn ngoi tt c cc hm (k
c hm main()).
C tc dng trn ton b chng trnh(!).
c khi to mt ln duy nht bi mt hng
s tng ng vi kiu ca n trc khi c
s dng bn trong cc hm (t ng c gn
gi tr 0 nu khng khi gn tng minh).
Ch c gii phng khi kt thc chng trnh.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 30


Bin ton cc Bin cc b
int x = 999; void f();
void f(); void main() {
void main() { int x = 999;
printf(%d\n, x); printf(%d\n, x);
f(); f();
} }
void f() { void f() {
printf(%d\n, x); printf(%d\n, x);
} }

10/7/2013 Khoa CNTT - H Khoa hc t nhin 31


int x = 1, y = 2;
void f() {
int x = 3;
printf(x = %d, y = %d\n, x, y);
if (y > 0) {
int z = 4;
printf(%d\n, z);
}
printf(x = %d\n, x);
printf(z = %d\n, z); // error
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 32
Bin ton cc (global variable) l cch gi
khc ca bin ngoi (external variable).
Ni ng ra, tm vc ca bin ngoi (hay
bin ton cc) l trong ton b m ngun
ca tp tin cha khai bo bin .
Cc chng trnh C c kch thc khng ln
ch c cha trong mt tp tin m ngun
nn tm vc l ton b chng trnh.
Bin ngoi c khai bo tng minh bng
t kha extern.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 33
int x = 999; // external/global variable
void f();
void main() {
extern int x;
printf(%d\n, x);
C th b t kha extern
f(); nu trong cng
} mt tp tin m ngun
void f() {
extern int x;
printf(%d\n, x);
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 34
Hn ch s dng bin ngoi/ton cc v iu ny
ph v tnh c lp n th (modular
independence), nguyn l trung tm ca lp tnh
cu trc.
c lp n th l tng mi hm hay n th
trong mt chng trnh cha tt c m ngun v
d liu cn thit thc hin cng vic ca n.
i vi cc chng trnh nh th vic s dng
chung bin ngoi/ton cc khng quan trng
nhng khi lm vic vi cc chng trnh ln hn
v phc tp hn th s qu rng buc vo bin
ngoi s ny sinh nhiu vn rc ri.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 35


Mi khi chng trnh thc thi li khai bo
bin cc b, mt bn sao ring bit ca
bin cc b c to ra.
Nu bin cc b c khai bo l tnh
(static) th bin ny s c to ra mt ln
duy nht ln u tin khi chng trnh
thc thi li khai bo ca n.
Khng nh bin ton cc, bin cc b tnh
khng b truy cp v thay i bi cc hm khc.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 36
void f() {
static int n = 0; // initialized once
int x = 0; // initialized n times
printf(n = %d, x = %d\n, n++, x++);
}
n = 0, x = 0
void main() { n = 0, x = 1
n = 0, x = 2
int i;
for (i = 0; i < 3; i++)
f();
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 37
C 3 loi d liu sau khi thc hin yu cu
gi hm:
D liu nhp: d liu c sn, cn thit thc
hin hm, thng c truyn dng tham tr
hoc tham bin.
D liu xut: d liu hm tnh ton c, thng
c tr v bng lnh return hoc dng tham
bin.
D liu trung gian: d liu do hm to ra trong
qu trnh thc hin cng vic, thng phc v
cho vic tnh ton d liu xut.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 38


// returns f(x, y) = ax + by and reverses the signs of a, b if f < 0
int Calculate(float &a, float &b, float x, float y) {
int temp1, temp2, f;
temp1 = a * x;
temp2 = b * y;
f = temp1 + temp2;
if (f < 0) { D liu nhp?
a = -a; D liu trung gian?
b = -b; D liu xut?
}
return f;
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 39


Vit chng trnh gii phng trnh bc 1:
+ = 0 ,
Cch 1: Vit trc tip ngay trong hm main()
(nhp a, b ri xt tng trng hp in ra
kt qu). Cch ny khng th dng li sau
ny khi cn gii phng trnh bc nht.
Cch 2: Vit mt hm nhim v gii phng
trnh bc 1, hm c s dng li trong
chng trnh chnh.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 41


, hm 1 ,
Khai bo hm:
int SolveEq1(float a, float b, float &x);
Lu : s nghim nSol khng thy trong
khai bo hm s c tnh ton v ghi vo
bin tm ri tr v bi lnh return.
nh ngha cc hng s c bit:
#define VODINH -1

10/7/2013 Khoa CNTT - H Khoa hc t nhin 42


int SolveEq1(float a, float b, float &x) {
int nSol = 0;
if (a != 0) {
x = -b/a;
nSol = 1;
}
else
if (b == 0)
nSol = VODINH;
return nSol;
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 43
void main() {
float a, b, x;

// inputs a, b here

int nSol = SolveEq1(a, b, x);


switch (nSol) {
// checks nSol here
}
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 44


Vit hm gii phng trnh bc 2:
2 + + = 0
, , hm 2 1 , 2 ,
Khai bo hm:
int SolveEq2(float a, float b, float c, float &x1, float &x2);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 45


int SolveEq2(float a, float b, float c, float &x1, float &x2) {
int nSol = 0;
float delta;

if (a == 0)
return SolveEq1(a, b, x1); // reuses SolveEq1()

delta = b*b 4*a*c;


if (delta < 0)
return 0;

10/7/2013 Khoa CNTT - H Khoa hc t nhin 46


if (delta == 0) {
x1 = x2 = -b/(2*a);
nSol = 1;
}
else { // delta > 0
x1 = (-b sqrt(delta))/(2*a);
x2 = (-b + sqrt(delta))/(2*a);
nSol = 2;
}
return nSol;
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 47
void main() {
float a, b, c, x1, x2;

// inputs a, b, c here

int nSol = SolveEq2(a, b, c, x1, x2);


switch (nSol) {
// checks nSol here
}
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 48


Gii phng trnh:
4 + 3 + 2 + + = 0
, , hm 4 1, 2, 3, 4,
Khai bo hm:
int SolveEq4Sym(float a, float b, float c,
float &x1, float &x2, float &x3, float &x4);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 49


Nu = 0 th phng trnh thnh:
( 2 + + ) = 0
Do :
=0
2 + + = 0
Dng li hm SolveEq2() vit gii
phng trnh bc 2: 2 + + = 0

10/7/2013 Khoa CNTT - H Khoa hc t nhin 50


Nu 0 th do = 0 khng phi l
nghim nn ta c bin i tng ng:
1 1
2 + 2 + + + =0

1 1
t = +
2 = 2 +
2
+2
Phng trnh tr thnh:
2 2 + + = 0
2 + + 2 = 0

10/7/2013 Khoa CNTT - H Khoa hc t nhin 51


Dng hm gii phng trnh
SolveEq2()
2 + + 2 = 0 tm nghim .
tm , s dng hm SolveEq2()
TH1. V nghim Phng trnh ban u v
nghim.
TH2. C 1 nghim 1 : gi SolveEq2() gii:
2 1 + 1 = 0
TH3. C 2 nghim 1 , 2 : tng t TH2.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 52


int SolveEq4Sym(float a, float b, float c,
float &x1, float &x2, float &x3, float &x4)
{
int nSol;
if (a == 0) {
x1 = 0;
nSol = SolveEq2(b, c, b, x2, x3);
if (nSol != VODINH)
nSol++;
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 53


else {
float Y1, Y2;
int nSol1 = SolveEq2(a, b, c-2*a, Y1, Y2);
switch (nSol1) {
case 0:
nSol = 0;
break;
case 1:
nSol = SolveEq2(1, -Y1, 1, x1, x2);
break;

10/7/2013 Khoa CNTT - H Khoa hc t nhin 54


case 2:
int nSol2 = SolveEq2(1, -Y1, 1, x1, x2);
switch (nSol2) {
case 0:
nSol = SolveEq2(1, -Y2, 1,
x1, x2);
break;
case 1:
nSol = SolveEq2(1, -Y2, 1,
x2, x3);
break;
10/7/2013 Khoa CNTT - H Khoa hc t nhin 55
case 2:
nSol = SolveEq2(1, -Y2, 1,
x3, x4);
break;
}
break;
}
}
return nSol;
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 56


Chng trnh vi mt tp tin m ngun ch
ph hp vi cc chng trnh nh.
Khi t mt tp cc hm c mc ch tng
qut vo mt tp tin ring, ta c th s dng
li cc hm ny cc chng trnh khc.
Khi vit chng trnh gm nhiu tp tin m
ngun, mi tp tin m ngun c gi l mt
n th (module). Cch lp trnh nh vy gi
l lp trnh n th (modular programming),
c lin quan rt gn vi lp trnh cu trc.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 58
Mi chng trnh C ch c duy nht mt
hm main().
n th cha hm main() c gi l n
th chnh, cc n th khc c gi l
n th ph.
Mt tp tin tiu ring r thng c
i km vi mi n th ph.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 59


/* mymath.h: header file for mymath.c */
double sqrt3(double x);
double sqrtN(double x);
/* end of mymath.h */

/* mymath.c: module containing math functions */


#include mymath.h
double sqrt3(double x) { /* statements */ }
double sqrtN(double x) { /* statements */ }
/* end of mymath.c */
10/7/2013 Khoa CNTT - H Khoa hc t nhin 60
#include <stdio.h>
#include mymath.h
void main() {
int x;
printf(Enter an integer value: );
scanf(%d, &x);
printf(The 3rd root of %d is %.lf\n,
x, sqrt3((double)x);
/* other statements here */
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 61


Hm v bin ton cc (hay bin ngoi)
khng t ng c thy trong cc n
th khc.
Khai bo cc n th khc c th thy
c hm hay bin ton cc trong cc
n th khc:
Hm: s dng ch th #include (v d trc)
Bin ton cc: s dng t kha extern

10/7/2013 Khoa CNTT - H Khoa hc t nhin 62


/* main module: sample.c */
int x = 99, y; /* the compiler automatically initializes y to 0 */
void main() {/* statements */ }

/* secondary module: mod1.c */


extern int x, y;
void func1() { /* statements */ }

/* secondary module: mod2.c */


extern int x;
void func2() { /* statements */ }
10/7/2013 Khoa CNTT - H Khoa hc t nhin 63
Nhu cu
Thc hin mt cng vic vi nhiu cch khc
nhau. Nu cc hm khc tn s kh nh.
V d:
Cc hm tnh tr tuyt i trong C (math.h)
int abs(int n);
long labs(long n);
double fabs(double n);
Cc hm tnh cn bc 2: sqrt(), sqrtf()
10/7/2013 Khoa CNTT - H Khoa hc t nhin 65
Khi nim
L cc hm cng tn nhng c tham s u
vo hoc kiu tr v khc nhau nhm cho
php ngi dng chn cch thun li nht
thc hin cng vic.
Nguyn mu hm khi b tn tham s phi
khc nhau.
Vic s dng cc hm trng tn c gi l
np chng hay qu ti (overload) hm.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 66


// prints integers from 1 to n
void PrintIntegers(int n);

// prints integers from x to y


void PrintIntegers(int x, int y);

// prints integers from x to y


// with an arithmetic progression a
void PrintIntegers(int x, int y, int a);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 67


Cc hm sau y l nh nhau do cng
nguyn mu hm: int Sum(int, int);
// calculates a + b
int Sum(int a, int b);

// calculates b + a
int Sum(int b, int a);

// calculates x + y
int Sum(int x, int y);
10/7/2013 Khoa CNTT - H Khoa hc t nhin 68
float f(float x) { return x/2; }
double f(double x) { return x/2; }

void main() {
float x = 29.12;
double y = 17.06;
printf(%.2f\n, f(x)); // float
printf(%.2lf\n, f(y)); // double
printf(%.2f\n, f(10)); // ???
printf(%.2f\n, f((float)10)); // float
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 69
void f(unsigned char c) { printf(%d, c); }
void f(char c) { printf(%c, c); }

void main()
{
f(A); // char
f(65); // ???
f((char)65); // char
f((unsigned char)65); // unsigned char
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 70


int f(int a, int b) { return a + b; }
int f(int a, int &b) { return a + b; }

void main()
{
int x = 1, y = 2;
printf(%d, f(x, 2)); // b = 2
printf(%d, f(x, y)); // ???
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 71


int f(int a) { return a*a; }
int f(int a, int b = 1) { return a*b; }

void main()
{
printf(%d\n, f(2912, 1706));
printf(%d\n, f(2912)); // ???
}

10/7/2013 Khoa CNTT - H Khoa hc t nhin 72


Khi nim
L hm c mt hay nhiu tham s hnh thc
c gn sn gi tr mc nh. Cc tham s
ny nhn gi tr mc nh nu khng c
i s tng ng c truyn vo.
Cc tham s mc nh phi c dn v tn
cng bn phi.
V d
void PrintFraction(int num, int denom = 1);

10/7/2013 Khoa CNTT - H Khoa hc t nhin 73


Lu :
Mun truyn i s khc thay cho i s mc
nh, phi truyn i s thay cho cc i s
mc nh trc n.
V d:
void SolveEq2(int a, int b = 0, int c = 0);
Gii phng trnh: 2 2 + 0 + 3 = 0
Sai: SolveEq2(2, 3); // a=2, b=3, c=0
ng: SolveEq2(2, 0, 3); // a=2, b=0, c=3
10/7/2013 Khoa CNTT - H Khoa hc t nhin 74
Lu :
Nu = thng xuyn xy ra th nn chuyn
thnh tham s c i s mc nh l .
V d, = 0 (Nam), = 18.
Nu = v = thng xuyn xy ra
nhng = thng xuyn hn th nn t
tham s mc nh sau .
V d, trong cng lp hc = 18 xy ra
nhiu hn = 0 do nn t sau
.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 75
Khi nim
Hm c th truyn vo hm khc di dng
i s u vo.
Vic khai bo tham s l hm tng t nh
khai bo nguyn mu hm (khng cn tn
cc tham s hnh thc)
Ch c php truyn cc hm c nguyn
mu hm (sau khi b i tn cc tham s hnh
thc) ging vi nguyn mu hm ca tham s
hnh thc hm c khai bo.
10/7/2013 Khoa CNTT - H Khoa hc t nhin 76
int FindBestNumber(int a, int b, int Better(int, int)) {
int numBest = a;
if (Better(b, a)) {
numBest = b;
}
return numBest;
}
int MaxNumber(int x, int y) { return x > y; }
int MinNumber(int x, int y) { return x < y; }

10/7/2013 Khoa CNTT - H Khoa hc t nhin 77


int FindBestNumber(int a[], int n, int Better(int, int)) {
int i, idBest = 0;
for (i = 1; i < n; i++) {
if (Better(a[i], a[idBest]))
idBest = id;
}
return a[idBest];
}
int MaxNumber(int x, int y) { return x > y; }
int MinNumber(int x, int y) { return x < y; }

10/7/2013 Khoa CNTT - H Khoa hc t nhin 78


Khi nim
qui ch mt tnh hung m trong hm
gi chnh n theo cch trc tip hay gin tip.
V d
Tnh giai tha: ! = ( 1) 2 1
Do ( 1) 2 1 = ( 1)! ! = ( 1)
Tng t ( 1)! = ()! ( 1)
Tip tc cho n khi tnh 1! ta c ngay kt
qu l 1, th ngc li tnh c !
10/7/2013 Khoa CNTT - H Khoa hc t nhin 79
Khai bo hm:
unsigned int factorial(unsigned int n);
nh ngha hm:
unsigned int factorial(unsigned int n)
{
if (n == 1)
return 1;
else
return n * factorial(n 1);
}
10/7/2013 Khoa CNTT - H Khoa hc t nhin 80
Tiu ch so snh/Ngn ng C C++ C# Java
Khai bo hm c lp vi

cc thnh phn khc
Khai bo hm (phng thc)

trong lp i tng (class)
Truyn bng gi tr

(tham tr) (kiu c s)
Truyn bng a ch

Truyn bng bin
(s dng t (i tng
(tham bin/tham chiu) (s dng &)
kha ref, out) v mng)
Tham s c gi tr mc nh
Hm trng tn

(np chng hm)

10/7/2013 Khoa CNTT - H Khoa hc t nhin 81


function: hm (chng trnh con)
structured programming: lp trnh cu trc
modular programming: lp trnh n th
parameter: tham s
argument : i s
formal parameter: tham s hnh thc, tng ng vi
parameter
actual parameter: tham s thc, tng ng vi argument
function prototype: nguyn mu hm
function header: tiu hm
function declaration: khai bo hm
function definition: nh ngha hm

10/7/2013 Khoa CNTT - H Khoa hc t nhin 83


local variable: bin cc b
extern varialbe: bin ngoi
global variable: bin ton cc, tng t extern variable
call by value: truyn i s bng gi tr (tham tr)
call by reference: truyn i s bng tham bin
(tham chiu)
scope: tm vc, phm vi hiu qu
recursion: s qui
overload: np chng, qu ti
ambiguity: nhp nhng, m h

10/7/2013 Khoa CNTT - H Khoa hc t nhin 84


Bradley L. Jones and Peter Aitken, Teach
Yourself C in 21 days, 6th Edition, SAMS, 2003.
Day 5. Packaging Code in Functions, pp. 97-122.
Day 12. Understanding Variable Scope, pp. 285-303.
Day 21. Advanced Compiler Use Programming with
Multiple Source-Code Files, pp. 593-600.
Bjarne Stroustrup, The C++ Programming
Language, 3rd Edition, AT&T, 1997.
Chapter 7. Functions, pp. 143-164.
Chapter 9. Source Files and Programs, pp. 197-220.

10/7/2013 Khoa CNTT - H Khoa hc t nhin 85

Вам также может понравиться