Download as pdf or txt
Download as pdf or txt
You are on page 1of 30

B mn Cng ngh phn mm

Khoa Cng ngh thng tin


Trng i hc Khoa hc T nhin

K THUT LP TRNH
ThS. ng Bnh Phng
dbphuong@fit.hcmus.edu.vn

HM NNG CAO
(PHN 2)

1
&
VC
BB
Ni dung

1 Tham s

2 Khun mu hm

3 Np chng hm

4 Np chng ton t

Hm nng cao (phn 2)


2
&
VC
BB
Tham s

Khai bo
<kiu tr v> <tn hm>(<dsts bit trc>, )
{

}

ngha
Hm c s lng tham s khng bit trc v
thng cng kiu (khng c l char,
unsigned char, float).
Phi c t nht 1 tham s bit trc.
Tham s t cui cng.
Hm nng cao (phn 2)
3
&
VC
BB
Tham s

V d
void XuatTong1(char *msg, int n, )
{
// Cc lnh y
}

void XuatTong2(char *msg, )


{
// Cc lnh y
}

int Tong(int a, )
{
// Cc lnh y
}
Hm nng cao (phn 2)
4
&
VC
BB
Truy xut danh sch tham s

S dng kiu v cc macro sau (stdarg.h)


va_list : kiu d liu cha cc tham s c
trong
va_start(va_list ap, lastfix) : macro thit lp
ap ch n tham s u tin trong vi
lastfix l tn tham s c nh cui cng.
type va_arg(va_list ap, type) : macro tr v
tham s c kiu type tip theo.
va_end(va_list ap) : macro gip cho hm tr
v gi tr mt cch bnh thng.
Hm nng cao (phn 2)
5
&
VC
BB
Tham s

V d
#include <stdarg.h>
void XuatTong1(char *msg, int n, )
{
va_list ap;
va_start(ap, n); // ts c nh cui cng
int value, s = 0;
for (int i=0; i<n; i++)
{
value = va_arg(ap, int);
s = s + value;
}
va_end(ap);
printf(%s %d, msg, s);
}
Hm nng cao (phn 2)
6
&
VC
BB
Tham s

V d
#include <stdarg.h>
void XuatTong2(char *msg, )
{
va_list ap;
va_start(ap, msg); // ts c nh cui
int value, s = 0;
while ((value = va_arg(ap, int)) != 0)
{
s = s + value;
}
va_end(ap);
printf(%s %d, msg, s);
}

Hm nng cao (phn 2)


7
&
VC
BB
Tham s

V d
#include <stdarg.h>
int Tong(int a, )
{
va_list ap;
va_start(ap, n); // ts c nh cui cng
int value, s = a;
while ((value = va_arg(ap, int)) != 0)
{
s = s + value;
}
va_end(ap);
return s;
}

Hm nng cao (phn 2)


8
&
VC
BB
Khun mu hm

Vit hm tm s nh nht trong 2 s


Vit cc hm khc nhau tm min 2 s int, 2
s long, 2 s float, 2 s double, 2 phn s
Nhc im
Hm bn cht ging nhau nhng khc kiu
d liu nn phi vit nhiu hm ging nhau.
Sa 1 hm phi sa nhng hm cn li.
Khng th vit cc hm cho mi trng
hp do cn nhiu kiu d liu khc.

Hm nng cao (phn 2)


9
&
VC
BB
Khun mu hm

Khi nim
Vit mt hm duy nht nhng c th s dng
cho nhiu kiu d liu khc nhau.
C php
tempate <ds mu tham s> <khai bo hm>
V d
template <class T> <khai bo hm>

hoc

template <class T1, class T2> <khai bo hm>

Hm nng cao (phn 2)


10
&
VC
BB
Khun mu hm

V d
template <class T>
T min(T a, T b)
{
if (a < b)
return a;
return b;
}

void main()
{
int a = 2912, b = 1706;
int m = min<int>(a, b);
printf(So nho nhat la %d, m);
}
Hm nng cao (phn 2)
11
&
VC
BB
Khun mu hm

Li ch ca vic s dng khun mu hm


D vit, do ch cn vit hm tng qu nht.
D hiu, do ch quan tm n kiu tng qut
nht.
C kiu an ton do trnh bin dch kim tra
kiu lc bin dch chng trnh.
Khi phi hp vi s qu ti hm, qu ti ton
t hoc con tr hm ta c th vit c cc
chng trnh rt hay, ngn gn, linh ng v
c tnh tin ha cao.
Hm nng cao (phn 2)
12
&
VC
BB
Np chng hm

Nhu cu
Thc hin mt cng vic vi nhiu cch khc
nhau. Nu cc hm khc tn s kh qun l.
Khi nim np chng/qu ti (overload) hm
Hm cng tn nhng c tham s u vo
hoc u ra khc nhau.
Nguyn mu hm (prototype) khi b tn tham
s phi khc nhau.
Cho php ngi dng chn phng php
thun li nht thc hin cng vic.
Hm nng cao (phn 2)
13
&
VC
BB
Np chng hm

V d
Nhp mng theo nhiu cch
void Nhap(int a[], int &n)
{
// Nhp n ri nhp mng a
}
void Nhap(int a[], int n)
{
// Nhp mng a theo n truyn vo
}
int Nhap(int a[])
{
// Nhp n, nhp mng a ri tr n v
}
Hm nng cao (phn 2)
14
&
VC
BB
Np chng hm

V d
Gn gi tr cho PHANSO
void Gan(PHANSO &ps, int tu, int mau)
{
ps.tu = tu;
ps.mau = mau;
}

void Gan(PHANSO &ps, int tu)


{
ps.tu = tu;
ps.mau = 1;
}

Hm nng cao (phn 2)


15
&
VC
BB
Np chng hm

Ch
Cc hm sau y l nh nhau
int Tong(int a, int b) // int Tong(int, int)
{
return a + b;
}
int Tong(int b, int a) // int Tong(int, int)
{
return a + b;
}
int Tong(int x, int y) // int Tong(int, int)
{
return x + y;
}
Hm nng cao (phn 2)
16
&
VC
BB
Np chng hm

S nhp nhng, m h (ambiguity)


Do s t chuyn i kiu
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, f(10)); // ???
}

Hm nng cao (phn 2)


17
&
VC
BB
Np chng hm

S nhp nhng, m h (ambiguity)


Do s t chuyn i kiu
void f(unsigned char c)
{
printf(%d, c);
}
void f(char c)
{
printf(%c, c);
}
void main()
{
f(A); // char
f(65); // ???
} 18
Hm nng cao (phn 2)
&
VC
BB
Np chng hm

S nhp nhng, m h (ambiguity)


Do vic s dng tham chiu
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, y)); // ???
} 19
Hm nng cao (phn 2)
&
VC
BB
Np chng hm

S nhp nhng, m h (ambiguity)


Do vic s dng tham s mc nh
int f(int a)
{
return a*a;
}
int f(int a, int b = 0)
{
return a*b;
}
void main()
{
printf(%d\n, f(2912, 1706));
printf(%d\n, f(2912)); //???
} 20
Hm nng cao (phn 2)
&
VC
BB
Np chng ton t

Khi nim
Ging nh qu ti hm.
C mt s quy nh khc v tham s.
To thm hm ton t (operator function)
np chng ton t.
<kiu tr v> operator#(<ds tham s>)
{
// Cc thao tc cn thc hin
}

# l ton t (tr . :: .* ?), <ds tham s> ph


thuc vo ton t c np chng.
Hm nng cao (phn 2)
21
&
VC
BB
Np chng ton t

Ton t hai ngi


Ton t gn (=), s hc (+, , *, /, %), quan
h (<, <=, >, >=, !=, ==), lun l (&&, ||, !)
Gm c hai ton hng
C th thay i ton hng v tri
C th tr kt qu v cho php ton tip theo
Ton t mt ngi
Ton t tng gim (++, ), ton t o du
()
Ch c mt ton hng
Hm nng cao (phn 2)
22
&
VC
BB
Np chng ton t

Ton t hai ngi


Ton t + (cho hai PHANSO)
typedef struct {int tu, mau;} PHANSO;

PHANSO operator+(PHANSO ps1, PHANSO ps2)


{
PHANSO ps;
ps.tu = ps1.tu*ps2.mau + ps2.tu*ps1.mau;
ps.mau = ps1.mau*ps2.mau;
return ps;
}

PHANSO a = {1, 2}, b = {3, 4}, c = {5, 6};
PHANSO d = a + b + c; // d = a + (b + c)
Hm nng cao (phn 2)
23
&
VC
BB
Np chng ton t

Ton t hai ngi


Ton t + (cho hai PHANSO)
typedef struct {int tu, mau;} PHANSO;

void operator+(PHANSO &ps1, PHANSO ps2)


{
PHANSO ps;
ps.tu = ps1.tu*ps2.mau + ps2.tu*ps1.mau;
ps.mau = ps1.mau*ps2.mau;
ps1 = ps;
}

PHANSO a = {1, 2}, b = {3, 4}, c = {5, 6};
PHANSO d = a + b + c; // Li
Hm nng cao (phn 2)
24
&
VC
BB
Np chng ton t

Ton t hai ngi


Ton t + (cho hai PHANSO)
typedef struct {int tu, mau;} PHANSO;

PHANSO operator+(PHANSO ps1, int n)


{
PHANSO ps;
ps.tu = ps1.tu + ps1.mau*n;
ps.mau = ps1.mau;
return ps;
}

PHANSO a = {1, 2};
PHANSO b = a + 2; // OK
PHANSO c = 2 + a; // Li sai th t ton hng 25
Hm nng cao (phn 2)
&
VC
BB
Np chng ton t

Ton t hai ngi


Ton t == (cho hai PHANSO)
typedef struct {int tu, mau;} PHANSO;

int operator==(PHANSO ps1, PHANSO ps2)


{
if (ps1.tu*ps2.mau == ps2.tu*ps1.mau)
return 1;
return 0;
}

PHANSO a = {1, 2}, b = {2, 4};
if (a == b)
printf(a bng b);
Hm nng cao (phn 2)
26
&
VC
BB
Np chng ton t

Ton t mt ngi
Ton t tng ++ (trc)
typedef struct {int tu, mau;} PHANSO;

PHANSO operator++(PHANSO &ps)


{
ps.tu = ps.tu + ps.mau;
return ps;
}

PHANSO a1 = {1, 2}, a2 = {1, 2};
PHANSO c1 = ++a1;
PHANSO c2 = a2++; // OK nhng warning ++ sau

Hm nng cao (phn 2)


27
&
VC
BB
Np chng ton t

Ton t mt ngi
Ton t tng ++ (sau)
typedef struct {int tu, mau;} PHANSO;

PHANSO operator++(PHANSO &ps, int notused)


{
ps.tu = ps.tu + ps.mau;
return ps;
}

PHANSO a = {1, 2}, b = {3, 4};
PHANSO c1 = ++a; // operator++(ps)
PHANSO c2 = a++; // operator++(ps, 0)

Hm nng cao (phn 2)


28
&
VC
BB
Np chng ton t

Ton t mt ngi
Ton t o du
typedef struct {int tu, mau;} PHANSO;

PHANSO operator(PHANSO ps)


{
ps.tu = ps.tu;
return ps;
}

PHANSO a = {1, 2};
PHANSO b = a;

Hm nng cao (phn 2)


29
&
VC
BB
Bi tp

Bi 1: Vit chng trnh tnh tng cc s nguyn


truyn vo hm (c truyn thm s lng).
Bi 2: Sa li bi 1 cho php ngi dng tnh
tng cc s c kiu bt k c truyn vo hm
(c truyn thm s lng)
Bi 3: Vit chng trnh sp xp mng tng dn.
Cc phn t ca mng c kiu bt k (char, int,
long, float, double, phn s, sinh vin )
Bi 4: Sa li bi 3 cho php ngi dng
thay i quy lut sp xp (tng, gim, m tng
dng gim, ) 30
Hm nng cao (phn 2)

You might also like