CÂC TP VN BN (TEXT FILES)

Một phần của tài liệu Kỹ thuật lập trình turbo pascal (Trang 63)

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). (adsbygoogle = window.adsbygoogle || []).push({});

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-bc-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. (adsbygoogle = window.adsbygoogle || []).push({});

} 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 : (adsbygoogle = window.adsbygoogle || []).push({});

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 : (adsbygoogle = window.adsbygoogle || []).push({});

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’. (adsbygoogle = window.adsbygoogle || []).push({});

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. (adsbygoogle = window.adsbygoogle || []).push({});

Ch ng h n, n u nh p văo dêy : Kiki1t2047655kp412. thì in ra : s ch s 0 đê đ c = 1,

Một phần của tài liệu Kỹ thuật lập trình turbo pascal (Trang 63)