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 new (p) thì p tr t i bi n đ ng đ c t o ra l n cu i cùng (l n th n).
Nh v y, ta không th truy c p đ c văo d li u c a bi n đê t o ra tr c đ y, mă ph i có câch l u tr đa ch c a chúng l i khi x lý v i câc bi n con tr .
II. Thao tâc đ i v i con tr
II.1. Phĩp gân gi a câc con tr cùng ki u
Gi a câc con tr cùng ki u, có th th c hi n câc phĩp gân. Ví d : Var
p, q : intptr;
r, s : pp; { con tr intptr vă pp đê khai bâo trín } ta có câc l nh gân :
p := q; p := nil; v.v...
nh ng không th có câc l nh gân cho con tr khâc ki u : p := r; q := s; v.v...
II.2. Gi i phóng vùng nh
gi i phóng vùng nh đê c p phât cho p, Pascal có th t c : Dispose(p)
Sau khi gi i phóng vùng nh b i th t c Dispose, bi n con tr p vă n i dung p^ không xâc đnh. Ví d : new(p); . . . { x lý đ i v i p } Dispose(p) { p đ c gi i phóng } II.3. Phĩp toân l y đa ch @
Pascal có phĩp toân l y đa ch @ nh sau : @x cho đa ch c a bi n x có ki u b t k . Ví d : Type a = array [1..4] of integer; Var c : char; p : ^a;
N u th c hi n phĩp gân : p := @c;
thì p^ s lă dêy 4 s nguyín, ph n t đ u tiín có đa ch lă đa ch c a bi n c
ng d ng c a câc c u trúc d li u đ ng s đ c xĩt k h n trong môn h c C u trúc d li u. Tuy nhiín sau đđy, ta c ng s xĩt m t c u trúc d li u đ ng lă danh sâch liín k t (linked list).
III. ng d ng c a con tr . Danh sâch liín k t
Danh sâch liín k t lă m t d ng đ n gi n c a câc c u trúc d li u đ ng.
M i danh sâch liín k t g m m t bi n con tr tr đ n ph n t đ u tiín c a danh sâch, g i lă pđ u. M i ph n t có ki u lă b n ghi g m có hai thănh ph n : n i dung c a ph n t (ví d có ki u xđu) vă con tr tr đ n ph n t ti p theo.
u tiín, danh sâch liín k t Pđ u:= Nil;
M i b n ghi ph n t đ c khai bâo nh sau : Const DăiXđu = 20;
Type
N i = ^Ph nT Ph nT = record
N iDung: string [ DăiXđu]; K Ti p : N i
end;
c p phât vùng nh cho m i ph n t c a danh sâch, ta s d ng thím bi n con tr Pn i b i l nh New(Pn i). Nh v y, Pn i^ s tham chi u đ n n i dung c a m t ph n t . gân d li u cho m t ph n t đ c tr b i Pn i, ta có :
Pn i^.N iDung:= ‘E1’;
Ti p theo, c n đ a ph n t năy văo danh sâch : Pn i^.K Ti p:= Pđ u; { Pđ u có giâ tr nil } Pđ u := Pn i;
p c a
Pđ u
Quâ trình trín đ c minh ho nh sau :
a) Pđ u := Nil b) New(Pn i)
c) Pn i^.N iDung:=‘E1’; d) Pn i^.K Ti p:= Pđ u Chú ý r ng Pđ u bđy gi tr đ n ph n t do Pn i tr đ n :
e) Pđ u := Pn i
T lúc năy, Pđ u tr đ n ph n t đ u khâc nil, ngh a lă danh sâch liín k t khâc r ng. M t ph n t m i đ c thím văo nh sau :
f) Pn i^.K Ti p:= Pđ u g) Pđ u := Pn i
Sau khi đê t o xong danh sâch liín k t, v n đ đ t ra lă c n xem n i dung câc ph n t , hay đ c g i lă duy t danh sâch (scan). Theo câch xđy d ng danh sâch, ph n t đ u tiín đ c tr b i con tr Pđ u. ví d trín, n i dung c a ph n t đ u tiín năy lă Pđ u^.N iDung, t c lă b ng ‘E3’.
Câc ph n t ti p theo đ c xâc đnh b i k ph n t ti p, ch ng h n, Pđ u^.
k ti p^.N iDung có giâ tr lă ‘E2’. duy t ph n t k ti p, ta s d ng bi n con tr Pn i b ng câch dùng phĩp gân : Pn i:= Pn i^.K Ti p;
Ta có thu t gi i duy t danh sâch nh sau : Pn i:= Pđ u; repeat Pn i:= Pn i^.K Ti p; until Pn i=Nil; Pđ u Pn i E1 Pn i Pn i E1 Pđ u Pn i E1 Pđ u Pn i E1 E2 Pđ u Pn i E1 E2
i v i danh sâch r ng (Null List), vòng l p repeat..until s gđy ra l i, vì v y ta nín dùng vòng l p while..do :
Pn i:= Pđ u;
while Pn i <> Nil do Pn i:= Pn i^.K Ti p;
Sau đđy lă ch ng trình đ y đ v ví d duy t danh sâch liín k t. Chú ý r ng n i dung danh sâch in ra lă theo th t ng c l i.
Program Duy tDanhSâch; Const
DăiXđu = 20; Type
N i = ^Ph nT ; Ph nT = record
N iDung: string [ DăiXđu]; K Ti p : N i end; Var Pđ u, Pn i: N i; Begin Pđ u:= Nil; repeat New(Pn i);
readln(Pn i^.N iDung); Pn i^.K Ti p:= Pđ u; Pđ u:= Pn i
until eoln; { repeat } Pn i:= Pđ u;
while Pn i <> Nil do begin writeln(Pn i^.N iDung); Pn i:= Pn i^.K Ti p; end { while }
TS. PHAN HUY KHÂNH biín soan 73
CH NG 7
K thu t l p trình
I. Phât tri n ch ng trình b ng tinh ch t ng b c I.1. N i dung ph ng phâp
Nguyín lý phât tri n CHTR b ng tinh ch t ng b c (hay thi t k t trín xu ng) do Niclaus Wirth (tâc gi c a ngôn ng l p trình Pascal) đ xu t văo n m 1971, trong băi bâo c a mình "Program Development by Stepwise Refinement".
Ban đ u, CHTR lă nh ng cđu đ c vi t b ng ngôn ng t nhiín (ch ng h n ti ng Vi t) th hi n s phđn tích t ng th c a ng i l p trình.
Sau đó, t i m i b c, m i cđu đ c phđn tích chi ti t h n thănh nh ng cđu khâc. Có ngh a đê phđn tích m t công vi c thănh nh ng công vi c bĩ h n.
- M i cđu đ c g i lă m t đ c t (Specification).
- M i b c phđn tích đ c g i lă đê tinh ch (refine) cđu (công vi c) đó.
S tinh ch đ c h ng v phía ngôn ng l p trình s dùng. Ngh a lă căng b c sau, nh ng cđu ch trín ngôn ng t nhiín căng đ n gi n d hi u h n vă đ c thay th b ng câc cđu l nh c a ngôn ng l p trình. N u cđu còn t ra ph c t p, có th coi đó lă m t CHTR con vă ti p t c tinh ch nó.
Trong quâ trình tinh ch , c n đ a ra câc c u trúc d li u t ng ng v i t ng b c. Nh v y s tinh ch câc đ c t CHTR vă d li u lă song song.
Ph ng phâp tinh ch t ng b c th hi n t duy gi i quy t v n đ t trín xu ng, trong đó s phât tri n c a câc b c lă h ng v ngôn ng l p trình s s d ng. ây c a s đi xu ng trong ho t đ ng phđn tích lă câc cđu l nh vă câc mô t d li u vi t b ng ngôn ng l p trình.
Ý ngh a : Vi c l p trình có s đnh h ng vă có s ng n n p trín gi y nhâp, trânh mò m m th nghi m mang tính tr c giâc.
I.2. Ví d minh ho
I.2.1.Ví d 1
Nh p văo dêy câc ký hi u liín ti p t băn phím cho đ n khi kí t d u ch m (.) đ c gõ. In ra s l ng t ng ch s t 0..9 đê đ c.
Ch ng h n, n u nh p văo dêy : Kiki1t2047655kp412. thì in ra : s ch s 0 đê đ c = 1,