You are on page 1of 26

Trng i hc Khoa hc T nhin

Khoa Cng ngh thng tin


B mn Cng ngh phn mm

NHP MN LP TRNH
ThS. ng Bnh Phng
dbphuong@fit.hcmus.edu.vn

HM NNG CAO
(PHN 1)

VC

&
BB

Ni dung

Cc tham s ca hm main

Hm c i s mc nh

Hm tr v tham chiu

Hm ni tuyn (inline)

Hm nng cao (phn 1)

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)

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)

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)

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 nX = atoi(argv[1]);
int nY = atoi(argv[2]);
printf(%d + %d = %d, nX, nY, nX+nY);
}
else
printf(Sai! VD: Cong 2912 1706);
}
Hm nng cao (phn 1)

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)

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\n);
}
Hm nng cao (phn 1)

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)

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 *szHoTen, char cPhai = 0,
char *szLop = TH07, int nNamSinh = 1989)
{
puts(szHoTen);
printf(cPhai == 0? Nam\n : Nu\n);
puts(szLop);
printf(%d\n, nNamSinh);
}

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

&

Hm tr v tham chiu

BB

d
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
V

<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;
return x;
}

// SAI! x l bin cc b

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