You are on page 1of 26

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 1)

1
&
VC
BB
Ni dung

1 Cc tham s ca hm main

2 Hm c i s mc nh

3 Hm tr v tham chiu

4 Hm ni tuyn (inline)

Hm nng cao (phn 1)


2
&
VC
BB
Cc i s ca chng trnh

Cc i s ca chng trnh
Hm main l hm nn cng c tham s.
Chng trnh t ng thc hin hm main m
khng cn li gi hm.
Lm sao truyn i s?
Khi thc thi tp tin chng trnh (.exe), ta
truyn km i s. Tt nhin, hm main cng
phi nh ngha cc tham s c th nhn
cc i s ny.

Hm nng cao (phn 1)


3
&
VC
BB
Cc tham s ca hm main

Cc tham s ca hm main

void main(int argc, char *argv[])


{

}

Trong
argc l s lng i s (tnh lun tn tp tin
chng trnh)
argv l mng cha cc i s (dng chui)

Hm nng cao (phn 1)


4
&
VC
BB
Cc tham s ca hm main

V d
Vit chng trnh c tn Cong, nhn 2 i s
x v y v xut ra gi tr x + y.

argv = {Cong.EXE,
Cong.EXE 2912,
2912 1706};
1706

argc = 3

Hm nng cao (phn 1)


5
&
VC
BB
Cc tham s ca hm main

V d
Vit chng trnh c tn Cong, nhn 2 i s
x v y v xut ra gi tr x + y.
#include <stdio.h>
#include <stdlib.h> // atoi
void main(int argc, char *argv[]) {
if (argc == 3) {
int x = atoi(argv[1]);
int y = atoi(argv[2]);
printf(%d + %d = %d, x, y, x+y);
}
else
printf(Sai! VD: Cong 2912 1706);
}
Hm nng cao (phn 1)
6
&
VC
BB
Cc tham s ca hm main

V d
Vit chng trnh c tn test nhn d liu t
tp tin input.txt, x l v xut kt qu ra tp
tin output.txt.

argv = {test,
test input.txt,
input.txt output.txt};
output.txt

argc = 3

Hm nng cao (phn 1)


7
&
VC
BB
Cc tham s ca hm main

V d
Vit chng trnh c tn test nhn d liu t
tp tin input.txt, x l v xut kt qu ra tp
tin output.txt.
#include <stdio.h>
void main(int argc, char *argv[]) {
if (argc == 3) {
// Nhp d liu t tp tin argv[1]
// X l
// Xut kt qu ra tp tin argv[2]
}
else
printf(Sai! VD: test in.txt out.txt);
}
Hm nng cao (phn 1)
8
&
VC
BB
Hm c i s mc nh

V d
Vit hm Tong tnh tng 4 s x, y, z, t
int Tong(int x, int y, int z, int t)
{
return x + y + z + t;
}

Tnh tng 4 s 2912, 1706, 1506, 1904


Tong(2912, 1706, 1506, 1904);
Nu ch mun tnh tng 2 s 2912, 1706
Tong(2912, 1706, 0, 0); // z = 0, t = 0

Hm nng cao (phn 1)


9
&
VC
BB
Hm c i s mc nh

Khi nim
Hm c i s mc nh l hm c mt hay
nhiu tham s hnh thc c gn gi tr.
Tham s ny nhn gi tr mc nh nu
khng c i s truyn vo cho tham s .
Phi c dn v tn cng bn phi.
V d
int Tong(int x, int y, int z = 0, int t = 0)
{
return x + y + z + t;
}
Hm nng cao (phn 1)
10
&
VC
BB
Hm c i s mc nh

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.

int Tong(int x, int y = 0, int z = 0);

int Tong(1, 5);

int Tong(1, 0, 5);

Hm nng cao (phn 1)


11
&
VC
BB
Hm c i s mc nh

V d
In thng tin SV trong lp gm: h tn, phi,
lp, nm sinh
void XuatThongTin(char *hoten, char phai = 0,
char *lop = TH07, int namsinh = 1989)
{
puts(hoten);
printf(phai == 0? Nam\n : Nu\n);
puts(lop);
printf(%d, namsinh);
}

Hm nng cao (phn 1)


12
&
VC
BB
Hm c i s mc nh

V d
In thng tin SV trong lp gm: h tn, phi,
lp, nm sinh
void main()
{
XuatThongTin(Nguyen Van A);
XuatThongTin(Tran Thi B, 1);
XuatThongTin(Hoang Van C, 0, TH00);
XuatThongTin(Le D, 1, TH07, 1988);
}

Hm nng cao (phn 1)


13
&
VC
BB
Hm c i s mc nh

Nhn xt
x = a thng xuyn xy ra th nn chuyn x
thnh tham s c i s mc nh l a.
V d, hu ht phai = 0 (nam), lop = TH07
v namsinh = 1989.
x = a v y = b thng xuyn xy ra nhng
y = b thng xuyn hn th nn t tham s
mc nh x trc y.
V d, lop = TH07 xy ra nhiu hn
phai = 0 nn t lop sau phai.
Hm nng cao (phn 1)
14
&
VC
BB
Ch th tin x l #define

nh ngha hng k hiu


Ch th #define <name> <value>
Mi ch xut hin <name> trong chng
trnh ngun c thay th bng <value>
to ra chng trnh tin x l.
V d
#define MAX 1000
#define PI 3.14
#define message Hello World\n

Hm nng cao (phn 1)


15
&
VC
BB
Ch th tin x l #define

nh ngha cc macro (lnh gp - lnh tt)


#define <name>(<param-list>) <expression>
Mi ch xut hin ca <name> vi lng tham
s a vo ph hp s c thay th bi
<expression> (tham s c thay th tng
ng)
V d
#define showmsg(msg) printf(msg)
showmsg(Hello); printf(Hello);

Hm nng cao (phn 1)


16
&
VC
BB
Hm ni tuyn (inline)

V d
Xt 2 cch sau
#define PI 3.14159
float addPi(float s)
{
return s + PI;
}

void main()
{
float s = 0;
for (int i = 1; i<=100000; i++)
s = s + PI; // Cch 1 (0.7s)
s = addPi(s); // Cch 2 (1.4s)
}
Hm nng cao (phn 1)
17
&
VC
BB
Hm ni tuyn (inline)

Nhn xt
S dng hm gip chng trnh d hiu nhng
li tn chi ph cho li gi hm.
Khc phc
S dng hm ni tuyn (inline) bng cch thm
t kha inline trc prototype ca hm.
inline float addPi(float s) {return s + PI;}
Khi nim
Sao chp thn hm n bt c no no hm
c gi kt qu ging ht cch 1.
Hm nng cao (phn 1)
18
&
VC
BB
Hm ni tuyn (inline)

Lu
Gim thi gian thc hin hm (gi v kt thc).
Gim khng gian b nh do cc hm con chim
dng khi hm c gi.
Khng cho php cc hm ni tuyn quy.
Phn ln khng cho php thc hin ni tuyn
cc hm s dng vng lp while.
Ch inline cc hm nh, inline cc hm ln s gy
phn tc dng (b nh cho hm inline chim gi
s lu gii phng hn).
Hm nng cao (phn 1)
19
&
VC
BB
Hm tr v tham chiu

Vd
Hm ch tr v gi tr. V d, x = f();
Vy, g() = x hp l hay khng?
Hp l khi g(x) tr v tham chiu n mt
bin (C++)
C php
<kiu tr v> &<tn hm>([<ds tham s>])
{
return <bin>;
}

Hm nng cao (phn 1)


20
&
VC
BB
Hm tr v tham chiu

V d
#include <stdio.h>

int x;

int &getx()
{
return x;
}

void main()
{
getx() = 5; // x = 5
}

Hm nng cao (phn 1)


21
&
VC
BB
Hm tr v tham chiu

ng dng
Ch s ca mng trong C/C++ bt t 0
Khng quen thuc lm.
Vit hm khi mun truy cp n phn t
th i ca mng a ta s dng V(i) thay v a[i-1]
int a[100];
int &V(int i)
{
return a[i-1];
}

V(1) = 2912; // a[0] = 2912;
Hm nng cao (phn 1)
22
&
VC
BB
Hm tr v tham chiu

Ch
Trong trng hp sau, bin x phi l bin
ton cc khng nn s dng!
int x; // bin ton cc

int &getx()
{
return x;
}

void main()
{
getx() = 2912;
}
Hm nng cao (phn 1)
23
&
VC
BB
Hm tr v tham chiu

Ch
Nu khng mun s dng bin ton cc, phi
truyn x dng tham chiu.
int &getx(int x) { // SAI! x l tham tr bn sao
return x;
}

int &getx() {
int x; // SAI! x l bin cc b
return x;
}

int &getx(int &x) { // NG! x l tham chiu


return x;
} Hm nng cao (phn 1)
24
&
VC
BB
Hm tr v tham chiu

V d
#include <stdio.h>

int &V(int a[], int i)


{
return a[i-1];
}

void main()
{
int a[100];
for (int i = 1; i <= 100; i++)
V(a, i) = 0;
}

Hm nng cao (phn 1)


25
&
VC
BB
Bi tp

Bi 1: Vit chng trnh c tn TinhToan sao


cho khi g: TinhToan 2912 1706 s xut ra
mn hnh 1206 (c th thay bng +, *, /)
Bi 2: Vit chng trnh qun l thng tin sinh
vin (s dng hm c i s mc nh), bao
gm nhp, sp xp tng dn theo tn v xut
danh sch sinh vin.
Bi 3: Chuyn cc hm nh hm ni tuyn.
Bi 4: Nhp mng, sp xp mng tng dn v
xut mng s dng hm tr v tham chiu.
Hm nng cao (phn 1)
26

You might also like