Tậ ti Nhị hâTậ ti Nhị hâ
Tậ
p
ti
n
Nhị
p
hâ
n
Tậ
p
ti
n
Nhị
p
hâ
n
CáCá
hếhế
độđộ
ởở
tậtậ
titi
hịhị
hâhâ
Cá
c
Cá
cc
hế
c
hế
độđộ
m
ở
m
ở
tậ
p
tậ
p
ti
n
ti
nn
hị
n
hị
phâ
n
phâ
n::
“rb”“rb” ::mởmở chỉchỉđọcđọc
“b”“b”
hihi
(hi(hi
đèđè
lêlê
tậtậ
titi
ũũ
h ặh ặ
tt
ớiới
ếế
tậtậ
“
w
b”“
w
b”
::g
hi
g
hi
(
g
hi(
g
hi
đèđè
lê
n
lê
n
tậ
p
tậ
p
ti
n
ti
nc
ũ
c
ũ
h
o
ặ
c
h
o
ặ
c
t
ạo
t
ạom
ới
m
ới
n
ế
un
ế
u
tậ
p
tậ
p
tintin khôngkhông cócó trêntrên đĩa)đĩa)
“
ab
”“
ab
”
::
ghighi
nốinối
vàovào
cuốicuối
tậptập
tintin
abab
::
ghighi
nốinối
vàovào
cuốicuối
tậptập
tintin
“rb+”“rb+” :: đọc/ghiđọc/ghi TậpTập tintin phảiphảicócó trêntrên đĩađĩa
“b+”“b+”
::
tạotạo
mớimới
tậptập
tintin
chocho
phépphép
đọcđọc
ghighi
“
w
b+”“
w
b+”
::
tạotạo
mớimới
tậptập
tintin
chocho
phépphép
đọcđọc
ghighi
“ab+”“ab+” :: đọc,đọc, ghighi vàovào cuốicuốitậptập tintin TạoTạomớimớitậptập tintin nếunếu
tậptập
tintin
chưachưa
cócó
trêntrên
đĩađĩa
tậptập
tintin
chưachưa
cócó
trêntrên
đĩađĩa
Đ hi tậ ti Nhị hâĐ hi tậ ti Nhị hâ
Đ
ọc g
hi
tậ
p
ti
n
Nhị
p
hâ
n
Đ
ọc g
hi
tậ
p
ti
n
Nhị
p
hâ
n
freadfread() : () : đọcđọc
size_tsize_t frea
d
frea
d
( void *( void *PtrPtr, , size_tsize_t ItemSizeItemSize, ,
size_tsize_t NumItemNumItem, FILE * , FILE * fpfp ););
freadfread đọcđọcNumItemNumItem khốikhốidữdữ liệuliệu, , mỗimỗikhốikhốicócó kíchkích thướcthước
ItemSizeItemSize t
ừ
t
ừ
f
p
f
p
vàvà chứachứavàovào vùn
g
vùn
g
nhớnhớ xácxác đ
ị
nhđ
ị
nh bởibởiPtrPtr
pp
gg
ịị
freadfread trảtrả vềvề sốsố khốikhốidữdữ liệuliệu đọcđọc đượcđược
NếuNếucócó lỗilỗihoặchoặcEOF EOF thìthì giágiá trịtrị trảtrả vềvề nhỏnhỏ hơnhơnNumItemNumItem
fwritefwrite() : () : ghighi
itit
fitfit
(tid*(tid*
PtPt
itit
It SiIt Si
s
i
ze_
t
s
i
ze_
t
f
wr
it
e
f
wr
it
e
(
cons
t
vo
id
*(
cons
t
vo
id
*
Pt
r
Pt
r, , s
i
ze_
t
s
i
ze_
t
It
em
Si
ze
It
em
Si
ze,,
size_tsize_t NumItemNumItem, FILE * , FILE * fpfp ););
fwritefwrite ghighi khốikhối((NumItemNumItem x x ItemSizeItemSize) ) xácxác dịnhdịnh bởibởiPtrPtr rara fp.fp.
ChépChép
33
mụcmục
từtừ
tậptập
tintin
filenamefilename
vàovào
vùngvùng
nhớnhớ
trỏtrỏ
bởibởi
ptrptr
ChépChép
33
mụcmục
từtừ
tậptập
tintin
filenamefilename
vàovào
vùngvùng
nhớnhớ
trỏtrỏ
bởibởi
ptrptr
ptrptr
fpfpÆÆfilenamefilename
ptrptr
Ctỏ FILECtỏ FILE
C
on
t
r
ỏ
FILEC
on
t
r
ỏ
FILE
MộtMột
tậtậ
titi
khikhi
ởở
đđ
ảả
lýlý
thôthô
ộtột
t ỏt ỏ
MộtMột
tậ
p
tậ
p
ti
n
ti
nsausau
khikhi
m
ở
m
ở
đ
ược
đ
ượcqu
ả
nqu
ả
n
lýlý
thô
ng
thô
ng quaqua m
ột
m
ột
concon
t
r
ỏt
r
ỏ
FILEFILE
KhiKhi mởmở tậptập tintin (wb,(wb, rb),rb), concon trỏtrỏ FILEFILE chỉchỉđếnđến đầuđầutậptập tintin
KhiKhi mởmở tậptập tintin (ab),(ab), concon trỏtrỏ FILEFILE chỉchỉđếnđếncuốicuốitậptập tintin
ConCon trỏtrỏ FILEFILE chỉchỉđếnđếntừngtừng bytebyte trongtrong tậptập tintin nhịnhị phânphân
SauSau mỗimỗilầnlần đọcđọctậptập tin,tin, concon trỏtrỏ FILEFILE sẽsẽ didi chuyểnchuyển điđimộtmột
sốsố
bytebyte
bằngbằng
kíchkích
thướcthước
(byte)(byte)
củacủa
khốikhối
dữdữ
liệuliệu
đọcđọc
đượcđược
sốsố
bytebyte
bằngbằng
kíchkích
thướcthước
(byte)(byte)
củacủa
khốikhối
dữdữ
liệuliệu
đọcđọc
đượcđược
fseekfseek
(),(),
fseekfseek
(),
(),
CácCác hằnghằng dùngdùng trongtrong didi chuyểnchuyển con con trỏtrỏ FILEFILE
#define#define
SEEK SETSEEK SET
00
#define#define
SEEK
_
SETSEEK
_
SET
00
#define #define SEEK_CURSEEK_CUR 11
#define #define SEEK_ENDSEEK_END 22
intint fseekfseek( FILE *( FILE *fpfp, long , long intint offset, offset, intint whence );whence );
fseekfseek didi chuyểnchuyển con con trỏtrỏ fpfp đếnđếnvịvị trítrí offset offset theotheo mốcmốc whence whence
offset: offset: khoảngkhoảng cáchcách (byte) (byte) cầncầndidi chuyểnchuyển tínhtính từtừ vịvị trítrí hiệnhiệntạitại. .
ềề
ốố
ềề
ầầ
(offset > 0: (offset > 0: điđiv
ề
v
ề
p
hía
p
hía cu
ố
icu
ố
itậptập tin, offset < 0: tin, offset < 0: ngượcngượcv
ề
v
ề
đ
ầ
uđ
ầ
utậptập
tin)tin)
whence:whence:
SEEK SET:SEEK SET:
tínhtính
từtừ
đầuđầu
tậptập
tintin
whence:whence:
SEEK
_
SET:
SEEK
_
SET:
tínhtính
từtừ
đầuđầu
tậptập
tintin
SEEK_CUR: SEEK_CUR: tínhtính từtừ vịvị trítrí hiệnhiệnhànhhành củacủa con con trỏtrỏ
SEEK_END: SEEK_END: tínhtính từtừ cuốicuốitậptập tintin
fseekfseek trảtrả vềvề: 0 : 0 nếunếu thànhthành côngcông, <>0 , <>0 nếunếudidi chuyểnchuyểncócó lỗilỗi
ft llft ll
()()
àà
id()id()
ft
e
llft
e
ll
()
()
v
à
v
à
rew
i
n
d()
rew
i
n
d()
idid
đặtđặt
l il i
ịị
títí
t ỏt ỏ
ềề
đầđầ
tậtậ
titi
rew
i
n
d
rew
i
n
d
đặtđặt
l
ạ
il
ạ
i
v
ị
v
ị
t
r
ít
r
í
con con
t
r
ỏt
r
ỏ
v
ề
v
ề
đầ
u
đầ
u
tậ
p
tậ
p
ti
n.
ti
n.
void rewind ( FILE
*
void rewind ( FILE
*
fpfp
););
void
rewind
(
FILE
void
rewind
(
FILE
fpfp
););
tươngtương đươngđương vớivới fseekfseek ( ( fpfp, 0L, SEEK_SET);, 0L, SEEK_SET);
ftellftell trảtrả vềvề vịvị trítrí offset offset hiệnhiệntạitạicủacủa con con trỏtrỏ
long long intint ftellftell ( FILE * ( FILE * fpfp ););
NếuNếucócó lỗilỗi, , ftellftell trảtrả vềvề 1L1L
Ví dVí d
á đị hkí h h ớ ậ iá đị hkí h h ớ ậ i
Ví
d
ụ:
Ví
d
ụ: x
á
c
đị
n
h
kí
c
h
t
h
ư
ớ
c t
ậ
p t
i
n.x
á
c
đị
n
h
kí
c
h
t
h
ư
ớ
c t
ậ
p t
i
n.
////
kh ikh i
bábá
biếbiế
NN
thậthậ
//
//
kh
a
ikh
a
i
bá
o
bá
o
biế
n
biế
nc
N
nc
N
n
thậ
n
thậ
n
if (if (
ff
ff
((
Fil NFil N
““
bb
”)) N ULL )”)) N ULL )
1.1.
if
(
if
(
f
p
f
p= =
f
open
f
open
(
(
Fil
e
N
ame
Fil
e
N
ame,
“
,
“
r
b
r
b
”
)
)
==
N ULL
)”
)
)
==
N ULL
)
2.2. fprintffprintf( ( stderrstderr, “Cannot open %s, “Cannot open %s\\n”, n”, FileN ameFileN ame ););
ll
3.3. e
l
see
l
se
4.4. {{
fkfk
((
ff
N )N )
5.5.
f
see
kf
see
k
(
(
f
p
f
p, 0, SEEK_E
N
D
)
;, 0, SEEK_E
N
D
)
;
6.6. FileSizeFileSize = = ftellftell( ( fpfp ););
7.7.
p
rintf
p
rintf( “File size : %d bytes( “File size : %d bytes
\\
n “, n “, FileSizeFileSize ););
8.8. fclosefclose( ( fpfp ););
9.9. }}
V
ị
V
ị
tr
í
tr
í
con con trỏtrỏ: : f
g
et
p
osf
g
et
p
os
()
()
vàvà
ịị
gpgp
()()
ffssetposetpos()()
vớivới cáccác tậptập tin tin cócó kíchkích thướcthướccựccựclớnlớn fseekfseek vàvà ftellftell sẽsẽ bịbị
giớigiớihạnhạnbờibờikíchkích thướcthướccủacủa offset.offset.
DùngDùng
intint fgetposfgetpos ( FILE *( FILE *fpfp, , fpos_tfpos_t *position);*position);
intint fsetposfsetpos ( FILE *( FILE *fpfp, const , const fpos_tfpos_t *position);*position);
Xó à đổitê tậ tiXó à đổitê tậ ti
Xó
a v
à
đổi
tê
n
tậ
p
ti
n
Xó
a v
à
đổi
tê
n
tậ
p
ti
n
ThTh
hiệhiệ
áá
Th
ực
Th
ực
hiệ
n
hiệ
nxo
á
xo
á
intint
remove(const char
*
filename);remove(const char
*
filename);
intint
remove(const
char
filename);remove(const
char
filename);
đổiđổi
têntên
tậptập
tintin
đổiđổi
têntên
tậptập
tin
tin
intint rename(const char *rename(const char *oldnameoldname, const char *, const char *newnamenewname););
Chú ý khi là iệ ớitậ tiChú ý khi là iệ ớitậ ti
Chú
ý
khi
là
m v
iệ
c v
ới
tậ
p
ti
n
Chú
ý
khi
là
m v
iệ
c v
ới
tậ
p
ti
n
KhiKhi
ởở
tậtậ
ti filti fil
tậtậ
titi
àà
hảihải
ằằ
ùù
thth
KhiKhi
m
ở
m
ở
tậ
p
tậ
p
ti
n
fil
ename,
ti
n
fil
ename,
tậ
p
tậ
p
ti
n
ti
n n
à
yn
à
y
phảiphải
n
ằ
mn
ằ
mc
ù
ngc
ù
ng
thưthư
mụcmụccủacủachươngchương trìnhtrình hoặchoặc
phảiphải cungcung cấpcấp đầyđầy đủđủ đườngđường dẫndẫn đếnđếntậptập tintin
vdvd: C:: C:\\baitapbaitap\\taptin.dattaptin.dat
viếtviếtnhưnhư thếthế nàonào? ?
fpfp = = fopenfopen( “C:( “C:\\baitapbaitap\\taptin.dat”, “taptin.dat”, “rbrb” );” );
SAI RỒISAI RỒI
ìì
óó
kýký
tt
đặđặ
biệtbiệt
‘‘
\\
’’
êê
iếtiết
đúđú
ẽẽ
làlà
v
ì
v
ì
c
ó
c
ó
kýký
tựtự
đặ
c
đặ
c
biệtbiệt
‘‘
\\
’
’
n
ê
nn
ê
nv
iết
v
iết
đú
ng
đú
ng s
ẽ
s
ẽ
làlà
::
fpfp = = fopenfopen( “C:( “C:\\\\baitapbaitap\\\\taptin.dat”, “taptin.dat”, “rbrb” );” );
ThamTham
sốsố
dòngdòng
lệnhlệnh
chươngchương
trìnhtrình
ThamTham
sốsố
dòngdòng
lệnhlệnh
chươngchương
trìnhtrình
KhiKhi gọigọichạychạymộtmộtchươngchương trìnhtrình, , chúngchúng tata cócó thểthể cungcung cấpcấp cáccác
ốố
thamtham s
ố
s
ố
tạitại dòngdòng lệnhlệnh gọigọichươngchương trìnhtrình
víví dụdụ: dir A:: dir A:\\*.c /w*.c /w
“
copy
”“
A:
“
copy
”“
A:
\\
*c
”
*c
”
vàvà
“
/w
”“
/w
”
làlà
haihai
thamtham
sốsố
điềuđiều
khiểnkhiển
chươngchương
copy
,
A:copy
,
A:
\\
*
.
c
*
.
c
vàvà
/w
/w
làlà
haihai
thamtham
sốsố
điềuđiều
khiểnkhiển
chươngchương
trìnhtrình
commandcommand
line argumentsline arguments
commandcommand
line
arguments
.
line
arguments
.
CácCác thamtham sốsố dòngdòng lệnhlệnh đượcđược thamtham chiếuchiếu qua qua haihai đốiđốisốsố khaikhai
báobáo
trongtrong
hàmhàm
main.main.
báobáo
trongtrong
hàmhàm
main.main.
main
(
main
(
intint ar
g
car
g
c
,
char *
,
char * ar
g
var
g
v
[
]
)[
]
)
((
gg
,,
gg
[])[])
{ }{ }
argcargc: argument coun
t
: argument coun
t
argvargv: argument vector: argument vector
Th ố dò lệ hTh ố dò lệ h
ídíd
Th
am s
ố
dò
ng
lệ
n
h
Th
am s
ố
dò
ng
lệ
n
h
––
v
í
d
ụv
í
d
ụ
// // addint.caddint.c ÆÆ addint.exeaddint.exe
1.1. void main (void main (intint argcargc, char * , char * argvargv [ ])[ ])
2.2.
{{
2.2.
{{
3.3. intint res = 0;res = 0;
44
printfprintf
(
“
Program %s(
“
Program %s
\\
n
“
n
“
argvargv
[0]);[0]);
4
.
4
.
printfprintf
(
Program
%s(
Program
%s
\\
n
,
n
,
argvargv
[0]);[0]);
5.5. for ( for ( intint ii = 1; = 1; ii< < argcargc; ; ii++ )++ )
66
res +
=
res +
=
atoiatoi
((
argcargc
[[
ii
]);]);
6
.
6
.
res
+
res
+
atoiatoi
((
argcargc
[[
ii
]);]);
7.7. printfprintf (“ %d(“ %d\\n”, res );n”, res );
88
}}
8
.
8
.
}}
G:G:
\\
>>
addintaddint
33
21562156
2121
G:G:
\\
>>
addintaddint
3
3
––
2
1
5
6
2
1
5
6
2
12
1
1212
ĐệĐệ
quyquy
RR
ecursionecursion
ĐệĐệ
quyquy
RR
ecursionecursion
Phạm Thế Bảo
Trường Đạihọc Khoa họcTự nhiên Tp HCM
Trường
Đại
học
Khoa
học
Tự
nhiên
Tp
.
HCM
Thu
ậ
t toán đ
ệ
q
u
y
Thu
ậ
t toán đ
ệ
q
u
y
LàLà mởmở rộngrộng cơcơ bảnbảnnhấtnhấtcủacủa kháikhái niệmniệmthuậtthuậttoántoán
TưTư
tưởngtưởng
giảigiải
bàibài
toántoán
bằngbằng
đệđệ
quyquy
làlà
đưađưa
bàibài
toántoán
ậ ệ qyậ ệ qy
TưTư
tưởngtưởng
giảigiải
bàibài
toántoán
bằngbằng
đệđệ
quyquy
làlà
đưađưa
bàibài
toántoán
hiệnhiệntạitạivềvề mộtmộtbàibài toántoán cùngcùng loại,loại, cùngcùng tínhtính chấtchất
(đồng(đồng
dạng)dạng)
nhưngnhưng
ởở
cấpcấp
độđộ
thấpthấp
hơnhơn
quáquá
trìnhtrình
nàynày
(đồng(đồng
dạng)dạng)
nhưngnhưng
ởở
cấpcấp
độđộ
thấpthấp
hơnhơn
,,
quáquá
trìnhtrình
nàynày
tiếptiếptụctụcchocho đếnđếnkhikhi bàibài toántoán đượcđược đưađưavềvề mộtmộtcấpcấp độđộ
màmà
tạitại
đóđó
cócó
thểthể
giảigiải
đượcđược
TừTừ
cấpcấp
độđộ
nàynày
tata
lầnlần
ngượcngược
màmà
tạitại
đóđó
cócó
thểthể
giảigiải
đượcđược
TừTừ
cấpcấp
độđộ
nàynày
tata
lầnlần
ngượcngược
đểđể giảigiải cáccác bàibài toántoán ởở cấpcấp độđộ caocao hơnhơnchocho đếnđếnkhikhi giảigiải
xongxong
bàibài
toántoán
banban
đầuđầu
xongxong
bàibài
toántoán
banban
đầuđầu
VíVí dụdụ::
địnhđịnh nghĩanghĩagiaigiai thừathừa:: n!=n*(nn!=n*(n 11)!)! vớivới00!=!=11
DãyDãy FibonacciFibonacci::ff
00
==11,, ff
11
==11vàvà ff
nn
=f=f
nn 11
+f+f
nn 22
∀∀n>n>11
ếế
DanhDanh sáchsách liênliên k
ế
tk
ế
t
Phạm Thế Bảo
MọiMọithuậtthuật toántoán đệđệ quyquy gồmgồm0202 phầnphần::
Ph
ầ
nPh
ầ
ncơcơ sởsở::
LàLà cáccác trườngtrường hợphợp khôngkhông cầncầnthựcthựchiệnhiệnlạilạithuậtthuậttoántoán (không(không
y
êu
y
êu c
ầ
uc
ầ
u
g
ọi
g
ọi đệđệ
q
u
y)q
u
y)
Nế
u
Nế
uthuậtthuật toántoán đệđệ
q
u
yq
u
y
khôn
g
khôn
g
cócó
p
h
ầ
n
p
h
ầ
n
yy
gg
qy)qy)
qyqy
gg
pp
nàynày thìthì sẽsẽ bịbị lặplặpvôvô hạnhạnvàvà sinhsinh lỗilỗi khikhi thựcthựchiệnhiện ĐôiĐôi lúclúc gọigọi
làlà trườngtrường hợphợpdừngdừng
ầầ
Ph
ầ
nPh
ầ
n đệđệ quyquy::
LàLà phầnphầntrongtrong thuậtthuậttoántoán cócó yêuyêu cầucầugọigọi đệđệ quy,quy, yêuyêu cầucầu
hh
hiệhiệ
h ậh ậ
áá
ởở
ộộ
ấấ
độđộ
hấhấ
hh
t
h
ựct
h
ực
hiệ
n
hiệ
nt
h
u
ậ
tt
h
u
ậ
tto
á
nto
á
n
ởở
m
ộ
tm
ộ
tc
ấ
pc
ấ
p
độđộ
t
hấ
pt
hấ
p
h
ơn
h
ơn
Phạm Thế Bảo
Các lo
ạ
i đ
ệ
q
u
y
Các lo
ạ
i đ
ệ
q
u
y
ạ ệ qyạ ệ qy
CóCó 0303 loạiloại đệđệ quyquy::
đ iđ i
1.1. ĐệĐệ quyquy
đ
uô
iđ
uô
i
::
LàLà loạiloại đệđệ quyquy màmà trongtrong mộtmộtcấpcấp đệđệ quyquy chỉchỉ cócó duyduy nhấtnhất
ộtột
lờilời
ii
đệđệ
ốố
ấấ
thấthấ
m
ột
m
ột
lờilời
gọ
i
gọ
i
đệđệ
quyquy xu
ố
ngxu
ố
ng c
ấ
pc
ấ
p
thấ
p
thấ
p
VíVí dụdụ::
íhíh
iiii
hừhừ
i.i. T
í
n
h
T
í
n
h
g
i
a
i
g
i
a
i
t
hừ
at
hừ
a
giaiThua(intgiaiThua(int n){n){
if(n==if(n==00))
giaiThuagiaiThua ==11;;
elseelse giaiThua=giaiThua= n*giaiThua(nn*giaiThua(n 11));;
}}
Phạm Thế Bảo