Khâi ni mv dêy (sequence)

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

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

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

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

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

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.

} var (adsbygoogle = window.adsbygoogle || []).push({});

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

- 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

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