III. KI U THT C( PROCEDURAL TYPE)
I.1. Khâi ni mv dêy (sequence)
Dêy lă c u trúc d li u c b n đ c đnh ngh a nh sau : 1. <> lă dêy r ng (tr ng).
2. <x0> lă dêy ch g m m t ph n t x0, g i lă dêy đ n.
3. N u x = <x1, ..., xn> vă y = <y1, ..., yn> lă hai dêy thì dêy ghĩp x & y đ c đnh ngh a : x & y = <x1, ..., xn> <y1, ..., yn>
4. N u x = <x1, ..., xn> khâc r ng thì :
first (x) = x1 đ ch ph n t đ u tiín c a dêy x
rest (x) = <x2, ..., xn> lă dêy x không k ph n t đ u tiín x1 Ta có : first (x) & rest (x) = x.
Phĩp toân c b n trín dêy lă truy c p (acces), hay đ c/ghi (read/write) câc ph n t m t câch tu n t .
T đó, đnh ngh a ki u t p (file) nh sau :
type T = file of T0 T có t 0 đ n nhi u ph n t ki u T0.
Ví d : Type
Int File = file of Integer; Real File = file of Real; Text = file of char;
nhóm = array [1..10] of real; t p_ra = file of nhóm;
Truy c p tu n t : t i m i th i đi m, ch m t ph n t c a t p đ c đ c/ghi nh m t bi n đ m (buffer variable).
G i t p lă x, ng i ta đnh ngh a bi n đ m lă x^. N u x có ki u T thì x^ có ki u T0 N u xem x có ph n bín trâi lă xL vă ph n bín ph i lă xR thì có th vi t :
x = xL & xR
I.2. Câc thao tâc c b n trín t p
I.2.1.T o t p r ng
Pascal chu n : rewrite(x);
Turbo Pascal : assign(x, filename); rewrite(x); Vi c t o t p r ng t ng ng v i phĩp gân : x := <>; N u bi n x t n t i tr c đó, x b xoâ b đ t o t p m i. I.2.2.Thím m t ph n t văo cu i t p put(x) Thím m t ph n t văo cu i t p t ng ng v i phĩp gân : x := x & <x> Ph n t x^ đ c thím văo cu i t p x.
I.2.3.Duy t (xem) m t t p
Pascal chu n : reset(x);
Turbo Pascal : asign(x, filename); reset(x);
Duy t m t t p bao g m câc phĩp gân : xL := <>; xR := x; x^ = first (x);
I.2.4. c ph n t ti p theo
get(x)
c ph n t ti p theo văo bi n x^ bao g m câc phĩp gân : xL := xL & <first (xR)>
xR := rest (xR) x^ := first (rest (xR))
đđy, first (x) ch xâc đnh n u x ≠ <>.
Chú ý r ng c hai th t c rewrite vă reset đ u b t đ u t v trí c a ph n t th nh t c a t p. Vùng đ m
u đ c/ghi
x
Khi h t t p, phĩp gân x := first (xR) không xâc đnh vì xR r ng, do đó ng i ta đ a văo hăm eof (x). Eof (end of file) lă hăm logic đ c đnh ngh a nh sau :
eof (x) = { true n u xR = <> false n u x R ≠ <>
Tín t p (file name) lă tín c a t p v t lý l u tr trín m t thi t b nh ngoăi (đa t , b ng t , tr ng t ) do h đi u hănh qu n lý.
Ví d trín câc mây IBM-PC vă t ng thích, câc t p CHTR vă d li u c a Turbo Pascal ch y trín MS-DOS có tín lă dêy t i đa 8 kí t v i t i đa 3 kí t cho ph n m r ng c a tín (đ phđn lo i t p) câch nhau d u ch m (.).
Ví d : GIAIPTB2.PAS, GIAIPTB2.EXE, DULIEU1.DAT
I.2.5.Câc l nh Read vă Write
Trong th c t , đ đ n gi n phĩp toân đ c/ghi trín t p, thay vì s d ng get vă put, ng i ta s d ng câc l nh read vă write.
Gi s v lă lă bi n vă e lă bi u th c có ki u T0 :
read (x, v) ⇔ v := x^; get(x); v i đi u ki n not eof(x) write (x, c) ⇔ x^:= e; put(x); v i đi u ki n eof(x) Trong Turbo Pascal, đ đ c d li u t t p đê có :
assign(x, filename); reset(x);
while not eof(x) do begin
read(x, v);
s(v) { s đ x lý v sau khi đ c } end;
close(x); { đóng t p }
Vi c đóng t p lă c n thi t đ ghi h t n i dung t p lín thi t b nh ngoăi vă gi i phóng vùng đ m.
M t s h đi u hănh th ng h n ch s l ng câc t p đ c phĩp m đ ng th i trong m t CHTR. Vi c đóng t p cho phĩp m câc t p m i khâc.
ghi lín m t t p :
assign(x, filename); rewrite(x);
while p do begin {p lă đi u ki n }
R(v); {Th t c R x lý v tr c khi ghi } write(x, v)
end;
close(x); {đóng t p } I.3. Truy c p tr c ti p
Khi x lý t p, câc l nh truy c p tu n t th ng chi m nhi u th i gian nín ng i ta đ a văo ph ng phâp truy c p tr c ti p (direct acces), hay truy c p ng u nhiín (random acces).
di chuy n đ u đ c/ghi đ n đ u b n ghi tr c khi truy c p, Pascal có l nh : seek (x, recno);
V i recno lă s th t , hay v trí c a b n ghi c n truy xu t trong t p. Recno có giâ tr t 0 tr đi.
C n phđn bi t c u trúc logic c a t p v i c u trúc v t lý c a thi t b l u tr .
I.3.1.M t s hăm x lý t p trong Turbo Pascal
Filesiz(x) cho v trí ph n t c a t p x, = 0 khi x = < > Filepos(x) v trí c a con tr t p (k t 0)
Erase(x) xoâ t p.
Ví d : assign(f, ’toto.exe’); erase (f);
Rename(x, str) thay đ i tín t p b i tín m i str.
Chú ý : Khi s d ng m t trong hai l nh erase(x) ho c rename(x, str), t p x ph i đóng vă ph i đ c đ t sau l nh gân assign().
Ví d 1 : Qu n lý đi m thi c a thí sinh.
qu n lý vi c văo đi m thi, m i thí sinh đ c mô t nh sau : Type Thísinh = record MêTS : string[10]; TínTS : string[6]; H lótTS : string [20]; Toân,Lý,Hoâ : Real; end;
Bi n ki u t p T pTS lă t p câc b n ghi có ki u c s Thísinh : T pTS = file of Thísinh;
nh p đi m, ta c n câc bi n nh sau : var ts : Thísinh;
f1 : T pTS;
q : boolean; {q lă bi n đi u khi n nh p } CHTR đ n gi n nh sau : Program Nh p i mThi; begin {t o t p f1 } q := true; {t o vùng l p vô t n } while ts do begin
{đ c 1 thí sinh, n u mê thí sinh r ng thì k t thúc } if MêTS = ’’ then q := false
else begin
{nh p di m thi Toân, Lý, Hoâ } Write (f1, ts) end end; close(f1) end. t o t p f1, ta có :
assign(f1, ’DSTHI.DAT’); rewrite(f1); c m t b n ghi thí sinh :
write ('Mê thí sinh :'); Readln (MêTS); c văo đi m thi Toân, Lý, Hoâ :
write ('H vă tín thí sinh :'); Readln (h vă tín); write (' i m toân :’); Readln (Toân);
write (' i m lý :’); Readln (Lý); write (' i m hoâ :’); Readln (Hoâ);
Sau đđy lă m t ch ng trình qu n lý đi m thi đ y đ câc x lý t o t p, x lý sai vă in ra. d hi u, c u trúc d li u đ c đ n gi n hoâ : Program QuanLyThi; type thisinh=record mats:string[5]; diem:real end; tepts=file of thisinh; var ts:thisinh; f: tepts; q:boolean; chon:byte; procedure taotep; begin q:=true; rewrite(f);
while q do with ts do begin write('Ma ts='); readln(mats); if mats='' then q:=false else begin write('Diem='); readln(diem); write(f,ts) end end; close(f) end; procedure suasai; var t:thisinh; s:string[5]; p:boolean; begin reset(f); q:=true; while q do begin
write('Ma ts can sua ='); readln(s); if s='' then q:=false
else begin p:=true;
while not eof(f) and p do begin read(f,t);
write('Ma ',mats, ' sua lai Diem ='); readln(diem); write(f,t); p:=false end end end end; close(f) end; procedure xemtep; var i: byte; begin reset(f); i:=0;
while not eof(f) do begin read(f,ts);
with ts do begin i:=i+1;
writeln(i:3,') Ma ts=', mats,' Diem =', diem:5:1) end
end; close(f) end;
begin { Main program } assign(f,'c:\dsts.dat'); writeln('Menu:'); writeln('1. Tao tep'); writeln('2. Sua sai'); writeln('3. Xem tep'); writeln('4. Ket thuc'); writeln; write('Chon = '); readln(chon); case chon of 1: taotep; 2: suasai; 3: xemtep; end; readln end.
Băi t p : In ra danh sâch câc thí sinh trúng tuy n có đi m trung bình > 15 vă tìm thí sinh có t ng đi m cao nh t.
II. Câc t p v n b n (text files) II.1. Khâi ni m II.1. Khâi ni m
Câc t p có câc ph n t ki u kí t char đóng vai trò quan tr ng trong vi c giao ti p ng i- mây (Human-Computer communication). Th c ch t c a s giao ti p năy lă quâ trình văo/ra : nh p văo (t băn phím) câc kí t vă xu t ra (măn hình, mây in) c ng lă câc kí t .
T p v n b n đ c đnh ngh a :
type text = file of char;
M c d u t p v n b n g m câc kí t nh ng ng i ta th ng t ch c t p thănh câc dòng (lines) v i đ dăi m i dòng khâc nhau.
Kí t k t thúc dòng eoln (end of line) g m m t c p kí t đi u khi n : CR (Carriage Return) nh y v đ u dòng.
LF (Line Feed) nh y xu ng dòng ti p theo. Mê s ASCII c a CR lă 13 vă LF lă 10.
văo/ra d li u, Pascal s d ng hai t p chu n input vă output. T p input cho phĩp đ a văo t băn phím, còn t p output cho phĩp đ a ra trín măn hình. Hai t p năy đ c khai bâo nh sau :
Var input, output : text;
Chú ý r ng v i câc t p chu n input vă output, không c n vi t câc th t c rewrite, reset vă close nh đê trình băy.
II.2. Văo-ra trín câc t p v n b n chu n
nh p v n b n văo, ng i ta s d ng câc l nh read vă readln. Thay vì g i t p input : read(input, danh-sâch-bi n); ho c
readln(input, danh-sâch-bi n); ng i ta vi t :
read(danh-sâch-bi n); readln(danh-sâch-bi n) ;
Trong đó danh-sâch-bi n li t kí câc bi n câch nhau d u ph y vă câc bi n ph i có ki u c s char, integer, real ho c string.
L nh readln khâc read lă sau khi đ c xong, con tr t p chuy n đ n đ u dòng ti p theo trín t p.
đ c v n b n t p b t k v i khai bâo Var f : text; : read(f, x1, x2, ..., xn)
readln(f, x1, x2, ..., xn)
xu t ra t p v n b n, dùng l nh write ho c writeln : write([f], ds-bi u-th c)
writeln([f], ds-bi u-th c)
N u v ng tín bi n f, mây xu t ra output.
bi u-th c
bi u-th c : chi u-dăi
bi u-th c : chi u-dăi : ph n-l
Trong đó :
bi u th c có ki u real ho c integer, có giâ tr c n in ra,
chi u-dăi lă bi u th c nguyín ch ra s v trí t i thi u s s d ng đ xu t ra,
ph n-l c ng lă bi u th c nguyín ch s l xu t ra sau d u ch m th p phđn, n u bi u th c có ki u real.
Th t c writeln khâc write ch sau khi xu t ds-bi u-th c, c p kí t xu ng dòng CR vă LF c ng đ c xu t ra.
II.3. M t s ví d
Ví d 1 : In ra n i dung m t t p v n b n, g ch chđn d i câc nhóm kí t n m gi a hai kí t Ctrl-U.
Ta có th in ra m i dòng v n b n c a t p thănh hai dòng, dòng trín lă b n thđn dòng v n b n đó, còn dòng d i g m câc d u g ch d i dòng (-) t ng ng v i câc nhóm n m gi a hai kí t Ctrl-U (^U).
B c 1, CHTR đ c trình băy nh sau :
Chu n-b
while not eof(f) do begin
c-m t-dòng X -lý-in
end {white}
Qua b c 2, câc th t c Chu n-b vă c-m t-dòng d dăng vi t th ng ra Pascal. Riíng th t c X -lý-inđ c lăm m n h n nh sau :
G i line1 lă dòng đ c đ c, line2 lă dòng s in ra b i khai bâo : Var line1, line2 : String;
Lúc đ u, dòng line2 lă r ng : line2 := ’’;
Dòng line1 l n l t đ c x lý t ng kí t , dòng line2 l n l t đ c thím văo d u ’-’ n u đang tr ng thâi g ch d i dòng, d u tr ng n u không ph i :
for i := 1 to length (line1) do begin if line1 [i] <> ^U then begin
write (line1 [i]);
if G ch-d i-dòng then line2 := line2 + '-' else line2 := line2 +' '
end
else i- tr ng-thâi end; {for}
Ta s dùng m t bi n logic đ chuy n đ i tr ng thâi, lúc đ u, tr ng thâi lă không ph i g ch d i dòng :
underline:= false;
underline:= not underline; CHTR đ y đ nh sau : Program InCóG chD i; Var
f : text;
line1, line2 : String; i : Integer; underline : Boolean; fname : String [15]; begin Write ('Cho bi t tín t p v n b n c n in :'); Readln (fname);
Assign (f, fname); Reset (f) underline:= false;
while not eof (f) do begin Readln (f, line1)
line2 := ’’ {dòng r ng }
for i := 1 to length (line1) do begin if line1 [i] <> ^U then begin
write (line1 [i]);
if underline then line2 := line2 + '-' else line2 := line2 +' ' { space } end
else underline := not underline end; {for}
writeln; writeln (line2) end {white} end.
Ví d 2 : Sau đđy lă câc th t c Seek vă Truncate : procedure Seek(var F; N: Longint);
{ F is any file variable type except text, and N is an expression of type Longint. The current file position of F is moved to component number N.
The number of the first component of a file is 0. To expand a file, you can seek one component beyond the last component; that is, the statement Seek(F, FileSize(F)) moves the current file position to the end of the file.
} var
f: file of Byte; size : Longint; begin
{ Get file name from command line } Assign(f, ParamStr(1));
Reset(f);
size := FileSize(f);
Writeln('File size in bytes: ',size); Writeln('Seeking halfway into file...'); Seek(f,size div 2);
Writeln('Position is now ',FilePos(f)); Close(f);
end.
procedure Truncate(var F);
{ F is a file variable of any type. All records past F are deleted, and the current file position also becomes end-of-file (Eof(F) is True).
F must be open. Truncate does not work on text files. } var f: file of Integer; i,j: Integer; begin Assign(f,'TEST.INT'); Rewrite(f); for i := 1 to 6 do Write(f,i); Writeln('File before truncation:'); Reset(f);
while not Eof(f) do begin Read(f,i); Writeln(i); end;
Reset(f);
for i := 1 to 3 do
Read(f,j); { Read ahead 3 records } Truncate(f); { Cut file off here } Writeln;
Writeln('File after truncation:'); Reset(f);
while not Eof(f) do begin Read(f,i); Writeln(i) end; Close(f); Erase(f); end.
TS. PHAN HUY KHÂNH biín soan 67
CH NG 6
C u trúc d li u đ ng (Dynamic data structure)
I. Khâi ni m
Câc c u trúc d li u đê xĩt (set, array, record) đ c g i lă t nh (static data) vì chúng đ c xâc đnh tr c vă có kích th c chi m ch trong b nh không thay đ i khi ch y CHTR.
Ví d khi có mô t :
Var ds: array [1..N] of char;
thì ds đ c dănh tr c N ch vă có m t th ng tr c trong b nh . Thông th ng, tr c khi khai bâo Var (ho c Type), N đ c xâc đnh qua khai bâo h ng :
Const N = 100;
u đi m c a c u trúc d li u t nh lă thao tâc d dăng, d hi u, nh ng l i có câc nh c đi m :
- Ph i xâc đnh kích th c b nh khi mô t .
- Không th thím, ho c b t câc ph n t sau khi đê s d ng. - Chi m ch vô ích m t khi không còn dùng đ n.
kh c ph c, Pascal có câc c u trúc d li u đ ng, g i lă ki u con tr (pointer), đ c mô t nh sau :
type Tp = ^T; var Ptr : Tp;
- Tp đ c g i lă ki u con tr , v i d u ^ đ ng tr c tín ki u T. - Ptr lă m t bi n con tr , ki u Tp.
Khai bâo Tp có ngh a nh ng giâ tr ki u Tp lă nh ng con tr tr t i d li u ki u T. Th c ch t, Tp ch ch a đa ch . Nh v y "con tr t i" có ngh a.
Khi Ptr không tr t i đ i t ng năo, ta vi t : Ptr := nil;
nil lă t dănh riíng c a Pascal.
C n phđn bi t gi a câc con tr vă câc c u trúc d li u mă con tr đ n.
(a) p vă q tr t i hai đ i t ng khâc nhau (b) p vă q cùng tr t i m t đ i t ng c p phât (t o) m t bi n con tr , dùng th t c new :
new(p);
p lă bi n con tr , p^ lă bi n đ ng do p tr t i. Ví d : Type intptr = ^integer; phone = record name: string [20]; num : integer end; pp = ^phone; Var
q : intptr; {ho c có th mô t tr c tiĩp q : ^integer } p : pp; {ho c có th mô t tr c tiĩp q : ^phone }
Trong thí d trín, q lă bi n con tr ch a đa ch (hay tr t i) bi n đ ng ki u integer. Ta c ng g i q lă con tr ki u integer, q^ có ki u integer.
T ng t , ta c ng có p lă con tr ki u phone, p^ có ki u phone.
name num t o ra bi n đ ng, ta vi t :
new (q); q^ := 125; new(p);
p^.name:= 'Phan Huy Khânh’ p^.num := 892992;
Ptr : ^T Ptr^ : T Ptr
q p
Phan Huy Khânh 892992 125 q q P p < Ž O
end;
Ho c có th dùng l nh with : new(p);
with p^ do begin
name:= 'Phan Huy Khânh num := 892992;
end;
Sau m i l n dùng new (p) ta l i có m t bi n đ ng m i do p tr t i. N u th c hi n n l n