You are on page 1of 117

CHNG 1

M u
I. Chng trnh (program)
Chng trnh (CHTR) l dy lin tip cc lnh (instructions, commands), hay cc cu lnh (statements). Chy chng trnh (run hay execute) l cho my tnh thc hin ln lt cc lnh ca CHTR. Mt CHTR ang chy to ra mt tin trnh (process). Cc tin trnh thng c cc tnh cht sau : 1. Cc lnh ca CHTR c thc hin mt cch tun t (sequantial), ht mt lnh li thc hin lnh k tip. 2. Mt tin trnh lun lun c kt qu (result). Kt qu c a ra trong khi thc hin CHTR hoc sau khi thc hin xong. Kt qu c th ng hoc sai. Thng thng kt qu c in (print) ra trn giy hoc hin th (display) ln mn hnh. 3. CHTR thng i hi d liu (data). Cc d liu c th c a vo trc tip trong khi chy CHTR, hoc t cc thit b ngoi nh bn phm (keyboard), a t (disk), bng t (tape)..., nhng cng c th t sn u trong CHTR. 4. Mt s lnh dng m t (declare) d liu ca CHTR. Trong mt s ngn ng, ngi lp trnh (NLT) phi t cc lnh ny phn u ca CHTR my s dng phn sau. 5. Mt s lnh dn n s quyt nh (decision) s thc hin nhm lnh no tip theo. V d, khi gii mt phng trnh bc 2, nu bit s m s tr li phng trnh khng c nghim thc, ngc li, thc hin cc lnh tnh nghim thc. Thc t, NLT khng bit lc chy CHTR, bit s l m, dng hay trit tiu ? 6. Mt s lnh c thc hin lp i lp li nhiu ln. NLT c th bit trc hoc khng bit trc s ln lp. NLT cng c th n nh vic lp c bt u nh th no.

II. Ngn ng lp trnh (programming language)


II.1. Khi nim v ngn ng lp trnh
Ngn ng lp trnh (NNLT) l cng c con ngi giao tip vi my tnh. Trong Tin hc, lnh vc xy dng v pht trin cc ngn NNLT lun lun t ra nhng vn mi. Ngi ta thng chia ra hai loi NNLT : ngn ng bc thp (low-level programming language) v ngn ng bc cao (high-level programming language). Ngn ng bc thp gm ngn ng my (machine language) v hp ng (assembly language). Trong mt CHTR vit bng ngn ng bc thp, mi cu lnh ch tng ng vi mt thao tc s cp ca b x l. V vy, lp trnh trn cc ngn ng bc thp rt phin phc v d nhm ln.

PGS.TS. PHAN HUY KHNH bin son

K thut lp trnh Pascal

Ngn ng bc cao phng theo ngn ng Ton hc v gn gi vi ngn ng t nhin. Lp trnh trn cc ngn ng bc cao thoi mi hn v t nhm ln hn do s dng nhng cu lnh gn gi vi li gii bi ton, d kim tra, d sa, v.v... Hin nay c rt nhiu ngn ng bc cao c pht trin, mi ngn ng c trng cho mt phong cch, mt trng phi lp trnh. Vic chn mt NNLT no ph thuc vo tnh cht ca bi ton ang gii v nhiu khi, ph thuc vo thi quen ca NLT. Khi thc thi mt CHTR vit trn mt ngn ng cp cao, b x l phi chuyn i CHTR ny sang dng mt CHTR bng ngn ng my tng ng. Mt CHTR thc hin chc nng ny gi l chng trnh dch (compiler). CHTR vit trn mt ngn ng cp cao c gi l chng trnh ngun (source program). CHTR c dch sang dng ngn ng my tng ng c gi l chng trnh ch (object program). My thc hin chng trnh ch cng vi cc d liu nhp (input data) cho ra kt qu. Khi chy CHTR c th gy ra li (error). Li sinh ra khi dch c gi l li thi gian dch (compile-time error). Li sinh ra khi chy CHTR c gi l li thi gian thc hin (run-time error). Ngoi ra c th c cc li do sai st v thut gii hoc do sai st v d liu nhp. D liu nhp CHTR ngun CHTR dch My tnh CHTR ch My tnh

D liu kt qu

Li thi gian thc hin

Li thi gian dch

II.2. Cc yu t ca ngn ng lp trnh


Cc NNLT bc cao c to thnh t ba yu t : b k t, b t vng v c php.

II.2.1. B k t (Character Set)


Gm cc k t c php dng trong ngn ng. Cc my vi tnh IBM v tng thch thng s dng cc k t ASCII. C th hiu b k t c vai tr nh bng ch ci (alphabet) ca mt ngn ng t nhin.

M u

II.2.2. B t vng (Vocabulary)


Gm cc t (word) hay n v t vng (token) dng to thnh cu lnh v c phn loi tu theo vai tr ca chng trong ngn ng. Mi loi li c chia ra thnh cc nhm nh hn tu theo chc nng. V d : Chng trnh Pascal : Cc n v t vng :
Program P; var , y : integer; begin Read(x); y:=x+2; write(y) end.

Tn (Identifier) Read, Write, P, x, y Hng (Constant) 2 Ton t (Operator) +, := Du phn cch Program var : ( ) begin end. (Delimiter)

II.2.3. C php (Syntax)


C php ca mt NNLT quy nh cch thc kt hp cc k t thnh t, kt hp cc t thnh cu lnh ng, kt hp cc cu lnh ng thnh mt chng trnh hon chnh v mt vn phm (grammaire). C th hnh dung cch kt hp ny ging cch t cu trong mt ngn ng t nhin. Thng ngi ta dng s c php (syntax diagram) hoc dng chun Backus-Naur (Backus-Naur Form) biu din c php.

II.3. S c php
II.3.1. Khi nim
S c php dng m t mt ngn ng lp trnh. S c php gip ngi s dng (NSD) hiu c cc dng thc ca cc yu t cu to nn mt CHTR. S c php c cu to t cc phn t sau : Khung trn, hoc val : cha cc k hiu kt thc (termiral symbol) l nhng k hiu c th, c ngha v c mt chnh xc trong CHTR. V d : program, begin, end... Khung ch nht : cha cc k hiu khng kt thc (non-terminal symbol) l nhng khi nim c nh ngha qua nhng k hiu kt thc v/hoc khng kt thc khc. V d : identifier (tn), program (chng_trnh), file_name (tn tp)... ng ni : l cc ng c mi tn ch th t xut hin ca cc phn t khung trn, hay ch nht. V d : Tn trong cc NNLT thng c s c php nh sau : s tn ch ch T c th xy dng cc tn ng nh : Delta, x1, x2, Sqrt, bnknh v.v... Tri li, cc chui k t sau y u khng phi l tn : ch A ... Z a ... z s 0 ... 9

K thut lp trnh Pascal

1A bt u bng s, , khng thuc b k t, bn knh c du cch gia, v.v.... Ch cc du ting vit c thm vo cho d hiu m khng a vo CHTR khi thao tc trn my.

II.3.2. Cch c s c php


c theo ng ni c mi tn. Nu gp k hiu khng kt thc (khung vung) th tip tc c s c php ca n. V d : c s c php ca tn : bt u bng mt ch ci, sau c th l cc ch ci, cc ch s (ng ni mi tn c th to thnh vng lp).

II.3.3. nh gi v s c php
S c php tuy l phng tin tt l quen vi ngn ng lp trnh nhng s c php khng m t c y ng php ca mt ngn ng lp trnh. V d : khng th hin c s kin cc bin, cc hng s cng cp khng c trng tn. khng m t c cc nhn (label) l s c th t 0 n 9999, tuy c th m t c nhng rt rc ri.

II.4. Dng BNF


Dng BNF m t mt vn phm di dng cc nh ngha. Mi nh ngha gm hai v t cch nhau mt k hiu c bit, v tri l mt k hiu khng kt thc, cn v phi l mt dy k hiu c th va c k hiu khng kt thc, va c k hiu kt thc. Dng BNF thng dng cc k t quy c nh sau : K hiu ngha c nh ngha l (t gia hai v tri phi) ::= hoc hoc = chui ca 0 hay nhiu mc lit k {} hoc 0 hoc 1 mc lit k [] mc lit k c thay th <> hoc (theo nga loi tr) | V d : Tn c m t di dng BNF nh sau : <tn> = <ch> { <ch> | <s> } <ch> = A | ... | Z | a | ... | z <s> = 0 | ... | 9

M u

III. Lp trnh (programming)


Ngn ng lp trnh mi ch l cng c NSD iu khin my theo mun, cn vic s dng cng c ny nh th no cho c hiu qu th li tu thuc vo k thut lp trnh ca mi ngi. Lp trnh l vic vit chng trnh trn mt ngn ng lp trnh c th no gii quyt mt vn no . lp trnh, phi tri qua 4 bc : 1. Phn tch vn cn gii quyt : Ni dung vn l g ? Phi lm g ? 2. Xy dng thut gii v cu trc d liu gii quyt vn (lm nh th no ?). Cng thc ca Niclaus Wirth : Algorithms + Data Structures = Programs Ngha l : Thut gii + Cu trc d liu = Chng trnh. 3. Vit chng trnh trn mt ngn ng la chn, v d Turbo Pascal. 4. Chy th chng trnh, sa sai, hon thin, ci t v em vo ng dng.

III.1. Phn tch vn


C nhiu phng php phn tch vn . Thng s dng phng php phn tch t trn xung (Top-Down Analysis). Ni dung phng php l chia vn cn gii quyt thnh cc vn nh hn, mi vn li c tip tc chia thnh cc vn nh hn na, v.v... cho n khi l nhng cng vic n gin v d gii quyt. vn vic 1 vic 1.1 vic 1.2.1 vic 1.2 vic 1.2.2 vic 2 ... vic 1.2.3 vic 3

V d : Phn tch bi ton cng hai phn s a v bi ton tm c s chung ln nht ca hai s nguyn. cng hai phn s, trc tin cn c lc chng (LPS), sau quy ng mu s (QMS). Cng hai t s ca hai phn s quy ng c t s. Ly mu s chung.

K thut lp trnh Pascal

a + c b d LPS(a b) LPS(c d) SCLN(a/b) SCLN(c/d) QMS(a b, cd) a M + b M

BSCNN(b, d)

SCLN(b, d) Vic c lc phn s c a v tm c s chung ln nht ca t s v mu s. quy ng mu s, cn tm bi s chung nh nht (BSCNN). Vic tm bi s chung nh nht ca hai s li c a v tm c s chung ln nht ca chng : BSCNN(b, d) = b * d / SCLN(b,d). tm c s chung ln nht, s dng thut gii Euclide.

III.2. Thut gii (Algorithm)


III.2.1. Khi nim v thut gii
Thut gii, hay cn gi l thut gii (gii thut), l tp hp c trng cc trnh t logic v ton hc n gin, c xc nh r rng, theo gii quyt mt vn vi mt s bc nht nh. Cng c th nh ngha thut gii l cch gii quyt bi ton bng cc bc c th theo trnh t nht nh v phi kt thc sau hu hn bc. V d : Sau y l thut gii tm s ln nht Max trong 3 s a, b, c. Bc 1 : c vo 3 s a, b, c. Bc 2 : Cho a l s ln nht : Max = a. Bc 3 : So snh Max vi b, nu Max nh thua b th Max ly gi tr b : Max = b. Bc 4 : So snh Max vi c, nu Max nh thua c th Max ly gi tr c : Max = c. Bc 5 : In kt qu l Max. C th hnh dung vic tm Max qua cc biu thc dng hm nh sau : Max (a, b, c) = Max(Max (a, b), c), trong : Max ( a, b) = if a>b then a else b C th hiu thut gii l phng php gii mt bi ton bng cch chia nh bi ton thnh nhng thao tc n gin, d thc hin v c trnh t hp l. Cc bc lm mt mn n, sp xp vt theo th t, gii mt phng trnh ton hc, v.v... u c th coi l nhng thut gii. Khng th c trnh t thc hin ging nhau cho mi thut gii. Mt thut gii phi tho mn ba iu kin sau y :

M u

1. Cc thao tc c tnh kh thi (thc hin c trn my) v c trnh t xc nh. 2. Mi thao tc phi c th, r rng v ch c hiu theo mt ngha duy nht. 3. Thut gii phi kt thc sau mt s hu hn bc. Vic gii quyt mt bi ton c th c nhiu thut gii khc nhau. Mi thut gii li c th c hiu qu nh nhau cho mt lp cc bi ton. V d, c nhiu thut gii sp xp mt da s theo th t tng dn. Tuy nhin, vi mi thut gii sp xp, c th p dng cho mt dy s bt k ( ln bt k ca mi s v s lng bt k cc s phi sp xp). Cn phn bit thut gii vi mt s thut ng gn gi vi thut gii nh kch bn vn ngh, cch s dng mt vt, chng trnh hnh ng, v.v...

III.2.2. Cc cng c trnh by thut gii


C hai cng c ph bin : lu v ngn ng gi. a. Lu (Flowchart) Lu hay s khi l s cha cc hnh k hiu i din cho cc thao tc cn phi lm. Trong s , cc hnh c ni vi nhau bi cc mi tn ch trnh t thc hin cc thao tc. Lu gm cc hnh c bn sau : nh du bt u v kt thc thut gii Nhp / xut d liu X l (tnh ton) d liu Quyt nh r nhnh hoc Cc hng r nhnh

K thut lp trnh Pascal

V d 1 : S khi thut gii tm s ln nht trong 3 s a, b, c : Bt u c a, b, c Max = a Max < b ng Max = b Sai Max < c ng Max = c In Max Kt thc V d 2 : Gii phng trnh bc hai : Bt u c a, b, c = b*b - 4*a*c Sai Sai x1.2 = -b/2/a In x1.2 D<0 D=0 ng Sai

ng

x1 = (-b - SQRT())/2/a x1 = (-b - SQRT())/2/a In x1, x2 Kt thc Phng trnh v nghim

M u

b. Ngn ng gi (Pseudo-Language) Ngn ng gi (gi nh) l s kt hp gia ngn ng t nhin vi mt ngn ng lp trnh no s c chn vit chng trnh. Ngn ng gi s dng cc cu trc iu khin ca ngn ng lp trnh nhng khng g b v mt c php nh ngn ng lp trnh. Sau y l mt s quy nh ca ngn ng gi : B k t l tp k t ASCII v cc ch ci c du ting Vit tin theo di. B t vng c xy dng bng cch ghp cc k t thuc tp hp k t v bt u phi bng ch. C hai loi t : T kho (Keyword) l t dnh ring ch mt lnh (mt thao tc). Trong phn u gio trnh, cc t kho c in ch m d phn bit. V d : Program, begin, end... Tn l t do NSD t t. Tn xc nh a ch ca mt vng nh cha d liu trong b nh trong. Kiu d liu (Data Type) ch nh mt lp cc gi tr d liu m my c th x l. Gm cc kiu c s thng gp : Kiu nguyn (Integer) l cc s nguyn thng thng. Kiu thc (Real) l cc s thc thng thng. Kiu chui hay xu (String) l dy t 0 n n k t bt k c t gia hai du nhy n. V d : This is a string, i hc nng, 17A L Dun, (chui rng). Kiu logic, hay lun l, ch gm hai gi tr True (1) v False (0). Hng, bin v hm c trng bi tn gi, kiu d liu v gi tr. Hng (Constant) l i lng khng i trong qu trnh thc hin CHTR. Bin (Variable) l i lng thay i trong qu trnh thc hin CHTR. Hm (Function) l mt CHTR con c lp sn v c t tn, khi cn ch vic gi tn, cung cp tham i tr v mt gi tr. Trong ngn ng gi c s dng cc dng ch thch (Comment) t gia hai du {} hoc cp du (* *) nhm mc ch d theo di, khng c tc dng g i vi cc lnh ca thut gii.

10

K thut lp trnh Pascal

V d : S dng ngn ng gi, c th vit li cc thut gii trn nh sau : Program TmMaxCa3S begin c (a, b, c) Max = a if Max < b then Max = b if Max < c then Max = c In (Max, l s ln nht) end { TmMaxCa3S } Program GiiPhngTrnhBc2 begin c (a, b, c) Delta = b*b - 4*a*c if Delta < 0 then In (Phng trnh v nghim.) else if Delta = 0 then x1_2 = -b/2/a In (Phng trnh c nghim kp x = , x1_2) else begin x1 = (-b + SQRT(Delta))/2/a x2 = (-b - SQRT(Delta))/2/a In (Phng trnh c hai nghim :) In (x1 = , x1) ; In (x2 = , x2) end end { GiiPhngTrnhBc2 }

M u

11

III.2.3. Cc lnh dng trong thut gii


Cc lnh trong thut gii c hai loi : cc lnh khng mang tnh iu khin, v d lnh gn v cc lnh vo - ra d liu. cc lnh iu khin s thi hnh chng trnh, gi l cc cu trc iu khin (Control Structure). Cc cu trc iu khin m t trt t cc thao tc hay cc lnh mc thp hn cn phi thc hin.

a. Lnh gn
Lnh gn (Assignement) c dng : <Bin> := <Biu thc> Du := l du gn bng ca Pascal, tuy nhin c th vit =, hoc . Bn tri du gn ch c th l mt tn bin <Bin>. Bn phi du gn l mt biu thc <Biu thc>. My tnh gi tr ca biu thc v gn cho bin, gi tr c ca ca bin b xo. Nu trong biu thc c cc tn bin khc xut hin th cc bin ny phi c gi tr trc khi thc hin php gn. V d : n := 0 Delta := b*b - 4*a*c HTn := Nguyn Vn Quang iuKin := (Tngim >= 15) And (MNgnh = 401) hon i ni dung hai bin a v b cho nhau (a cha ni dung ca b, b cha ni dung ca a), dng mt bin trung gian t theo mt trong hai cch nh sau : t := a ; a := b ; b := t hoc t := b ; b := a ; a := t (Nu c a v b u l d liu s th c th khng cn dng bin trung gian !).

b. Cc cu trc iu khin c bn
Cu trc iu khin 1 Tun t (Sequential) begin S1 ... Sn end Lu tng ng S1
...

M t L lnh ghp, thc hin tun t cc lnh S1, S2, ... , Sn

Sn

12

K thut lp trnh Pascal

Cu trc iu khin 2 R nhnh (Branching) - R nhnh if K then S1 else S2

Lu tng ng ng S1 Sai S2

M t Nu iu kin K tho mn (ng) th thc hin lnh S1. Nu K khng tho mn (sai) th thc hin S2.

K ?

3 - R nhnh thiu if K then S

K ? ng
S

Sai

Nu K ng th thc hin S. Nu K sai th khng lm g c.

4 La chn (Selection) case K1 : S1 K2 : S2 ... Kn : Sn endcase 5 Cu trc lp (Iteration) Kim tra iu kin trc khi thc hin vng lp : while K do S

Sai

K1 ? K2 ?
...

ng ng

S1 S2
...

Nu K1 ng th thc hin S1. Nu khng, nu K2 ng th thc hin S2. v.v... Cui cng, nu Kn ng th thc hin Sn. Nu khng th thi. Khi K cn ng th cn thc hin S. Khi K sai th dng.

ng Sn Sai

Sai

Kn ?

K ? ng S

6 Lp vi kim tra iu kin sau khi thc hin xong thn vng lp : do S until K

S Sai K ? ng

Cn thc hin S khi K cn cha tho mn (sai). t nht lp c mt ln. Dng khi K ng.

M u

13

III.3. Cu trc d liu


Nh thy, thut gii ch phn nh cc thao tc cn x l, cn i tng x l trn my li l d liu (Data). D liu biu din cc thng tin cn thit cho bi ton, gm cc d liu a vo, cc d liu a ra v cc d liu tnh ton trung gian. D liu v thut gii c mi quan h vi nhau : ni n thut gii l ni n thut gii tc ng ln d liu no. Cn ni n d liu l ni n d liu y cn c tc ng bi thut gii no a n kt qu mong mun. Bn thn cc d liu thng c mi quan h vi nhau. Cch t chc d liu sao cho ph hp vi bi ton cn gii quyt chnh l vai tr ca lnh vc cu trc d liu (Data Structure). Cu trc d liu lin quan n ba vn : kiu d liu, cc php tan tc ng ln d liu v cch biu din d liu trong b nh ca my tnh.

III.3.1. Kiu d liu


Mi NNLT thng c hai kiu d liu : kiu d liu c s v kiu d liu c cu trc. Kiu d liu c s c th l kiu s, kiu k t v kiu logic. Tu theo bi ton m kiu d liu no th c s dng. T kiu d liu c s, ngi ta xy dng cc kiu d liu phc tp hn bng cch lin kt chng li vi nhau theo mt cu trc no . V d, trong hu ht cc NNLT u c cu trc mng (Array) l mt dy cc phn t d liu c cng kiu v c s lng n nh. Mi phn t ca mng c th l kiu c s nhng cng c th l kiu c cu trc. Cu trc kiu bn ghi (Record) l s m rng ca khi nim mng. Mi bn ghi gm nhiu thnh phn, mi thnh phn cn gi l mt trng (Field) c kiu d liu xc nh khc nhau. V d, trong qun l cn b, c th hnh dung mi bn ghi m t mt cn b gm cc trng H_tn, Ngy_sinh, Lng_c_bn, v.v... Trng H_tn c kiu k t ; trng Ngy_sinh li l mt kiu bn ghi c nh ngha gm 3 trng Ngy, Thng v Nm cng kiu s nguyn ; trng Lng_c_bn c kiu s thc. Chnh v s phong ph ca cc bi ton thc tin m my tnh phi gii quyt trn nhng d liu phi s (Non-numerical) c cu trc a dng.

III.3.2. Cc php tan trn d liu


Vi mi cu trc, cn phi xy dng cc php ton trn : php to lp hay hu b mt cu trc, php truy cp vo tng phn t ca cu trc xem hay sa i, php b sung hay loi b mt phn t ca cu trc, v.v... Cu trc d liu khc nhau th php ton tng ng cng khc nhau. C th mt php ton no c tc dng i vi cu trc ny nhng li khng c tc dng i vi cu trc khc. V d, php truy cp vo mt phn t ca cu trc d liu kiu mng khc vi php truy cp vo mt phn t ca cu trc d liu kiu bn ghi, c th cng dn cc phn t ca mt mng d liu kiu s nhng khng th cng dn cc phn t ca mt mng d liu kiu bn ghi, v.v... Nh vy, mi khi xy dng mt cu trc d liu th ng thi phi xy dng cc php ton km theo. y l hai mt ca mt vn .

14

K thut lp trnh Pascal

III.3.3. Biu din d liu


Mi cu trc u c cch biu din trong my khc nhau gi l cu trc lu tr (Storage Structure). C s khc nhau gia cu trc d liu v cu trc lu tr tng ng. Cng mt cu trc d liu c th c nhiu cu trc lu tr v cng mt cu trc lu tr c th c nhiu cu trc d liu. V d, cng cu trc ma trn - bng d liu gm nhiu hng nhiu ct - c th c hai cu trc lu tr khc nhau : hoc lu tr theo hng (ht hng n n hng kia), hoc lu tr theo ct (ht ct n n ct kia). Ngc li, mt dy d liu lu tr lin tip trong b nh c th tng ng vi cu trc mng, hoc cu trc ma trn, v.v... Cu trc lu tr c hai dng : dng lu tr ngoi cho cc thit b nh ph (b nh ngoi) v dng lu tr trong i vi b nh trong.

M u

15

CHNG 2

Cc kiu d liu c s ca Turbo Pascal


Kiu d liu trong Pascal cho php xc nh tp hp cc gi tr m cc hng, bin v hm c th c hoc do kt qu ca cc php tnh hoc hm. Khai bo kiu : type T = AnyType; ... T = AnyType; Trong T l tn kiu (identifier), AnyType l kiu bt k c nh ngha t mt trong 9 lp kiu sau y : ordinal, real, string, array, set, record, file, object, pointer. C 7 kiu th t tin nh ngha (ordinal predefined) l : Shortint, Integer, Longint, Byte, Word (5 kiu s nguyn), Boolean v Char. Hai kiu do NSD t nh ngha l kiu lit k (enumerated) v kiu min con (subrange). S cc gi tr khc nhau ca kiu T l bn s (cardinality) ca T, ngi ta thng k hiu Card (T). Khai bo mt bin x c kiu d liu l T c vit : x : T . V d : Var x : Real;
type Simple ordinal real pointer record structured array file set

enumerated char integer boolean subrange

string

I. Cc kiu Ordinal
I.1. Kiu s nguyn
(maxint + 1) n maxint Cc s nguyn c th m hoc dng, ln ph thuc my. Nu n l mt s nguyn, th n phi tho mn bt ng thc :

16

K thut lp trnh Pascal

Trong , maxint l tr nguyn ln nht my c th biu din c. Trong Turbo Pascal, c hai hng chun l MaxInt = 32 767 v MaxLongint = 2 147 483 647. Cc kiu ordinal nguyn nh sau : Type Range Size Shortint -128..127 8-bit Integer -32768..32767 16-bit Longint -2147483648..2147483647 32-bit Byte 0..255 8-bit Word 0..65535 16-bit Cc php ton : + - * div nhn kt qu nguyn. Nu m, n l cc s nguyn : m - n < (m div n) * n m v (m div n) * n + (m mod n) = m

I.2.

Kiu logic Boolean

Kiu Boolean ch c hai gi tr l false, true, c nh ngha nh sau : type Boolean = (False, True); Trong mt biu thc, cc php quan h := <> > < >= <= IN tr v gi tr Boolean. V d : Gi s x = 5, y = 7, z = 10 l cc s nguyn v : Var p, q : boolean; ta c cc php gn : p := (x = y) ; { p = false } q := (x < y) and (y < z) { q = true }

I.3.

Kiu k t Char

Kiu Char gm cc k t ASCII. Hai hm chun kiu Char l Ord v Chr : Ord(x): Longint; Chr(x: Byte): Char; c tnh cht sau : Ord (Char(i)) = i nu Char(i) xc nh, i nguyn Char(Ord(c)) = C V d : Uses Printer; begin { Send form feed to printer } WriteLn(Lst, Chr(12)); end. Hai biu thc c bit : f(c) = Ord(c) Ord('0') g(i) = Char(i + Ord('0')) V d : v tr ca C trong cc ch s ch s th i

f ('4') = Ord(4) Ord(0) = 52 48 = 4, g (7) = Char(7 + Ord(0)) = Char(55) = '7' f v g l hai hm ngc ca nhau : f(g(i)) = i i = 0..9 g(f(c)) = c c = '0'..'9'

Cc kiu d liu c s ca Turbo Pascal

17

I.4.

Bng cc hm chun
gtr Integer i Integer pred succ abs sqr sin cos arctan ln exp sqrt odd chr Real trunc round sin cos arctan ln exp sqrt sqr abs pred succ pred succ eof eoln Boolean ord Char ord File

Real

Boolean Char

II. Kiu s thc Real


Trong mt CHTR Pascal, bin thc (real variable) c dng lu tr cc gi tr thc. Tu theo my m min gi tr (range) b hn ch nh tp cc s nguyn. Khi gii quyt cc bi ton khoa hc, c th tn ti nhng s rt b hoc rt ln, v d, trng lng ca mt electron l : 0.000 000 000 000 000 000 000 000 000 091 095 600 gram Dng khoa hc (dng m) ca s ny l 9.10956 1028 gram. Trong ngn ng Pascal, s ny c dng 9.10956E28. Turbo Pascal c 5 kiu s thc nh sau : Type Range Digits Bytes real 2.9e-39..1.7e38 11-12 6 single 1.5e-45..3.4e38 7-8 4 double 5.0e-324..1.7e308 15-16 8 extended 3.4e-4932..1.1e4932 19-20 10 comp -9.2e18..9.2e18 19-20 8 Mi bin thc c xc nh bi hai yu t : min gi tr v chnh xc (precision). Min gi tr cho bit ln ca s c lu tr. chnh xc cho bit s s l c ngha sau du chm thp phn.

18

K thut lp trnh Pascal

III. Cc php ton (Operators)


Cc php ton ca Turbo Pascal nh sau : Op. + * / DIV MOD NOT AND OR XOR SHL SHR Integer Addition Subtraction Multiplication Division Modulo Integer Bitwise negation Bitwise AND Bitwise inclusive OR Bitwise exclusive OR Bitwise shift-left Bitwise shift-right Real Addition Subtraction Multiplication Division String Concatenation Set Union Difference Intersection

Boolean Logical negation Logical AND Logical inclusive OR Logical exclusive OR

Cc php quan h sau y tr v gi tr Boolean : Op. = <> < > <= >= IN Tn gi Equal Not equal Less than Greater than Less than or equal Greater than or equal Member of Kiu d liu so snh Ordinal, real, string, set, pointer Ordinal, real, string, set, pointer Ordinal, real, string Ordinal, real, string Ordinal, real, string, set Ordinal, real, string, set Gi tr tr v ca php IN True nu ton hng bn tri (kiu ordinal) l mt phn t ca ton hng bn phi (kiu tp hp) False nu khng

Tnh cn bc hai ca mt s dng (s = n) theo phng php Newton khng s dng hm sqrt(). Ni dung phng php : Nu gi s l gi tr gn ng ca cn bc hai ca n th : V d : (n s + s) 2 l gi tr gn ng hn ca n. Qu trnh tnh ton dng li khi t ti chnh xc cn thit. Gi s chn = 10 6, khi :
n s2 1 <

Cc kiu d liu c s ca Turbo Pascal

19

{ Chng trnh c vo mt s v in ra gi tr cn bc hai gn ng tng ng cho n khi c vo s 0 } Program Tnh_cn_bc_2; Uses Crt; Const epsilon = 10E-6; Var n, s : real; begin repeat write(Dc vo mt s n = );readln(n); if n<0 then writeln(#7Vo sai d liu !) else begin s:=1; repeat s:=(n/s+s)/2 until abs(n/sqr(s)-1)< epsilon; writeln(Cn bc hai = , s:14:6) end until n = 0; readln end. {Tnh_cn_bc_2 }

IV. Kiu v hng lit k v kiu min con


IV.1. Kiu v hng lit k (Enumerated Scalar Type)
Kiu v hng lit k c nh ngha l tp hp cc hng c th gn cho cc bin thuc loi v hng lit k : Type T = (C1, C2, ..., Cn) ; Cc Ci, vi i = 1..n c sp xp theo th t t nhin. T khng l kiu s v khng c cu trc. Card(T) = n, Ci Cj nu i j. V d : Type Mu = (, dacam, vng, lc, lam, chm, tm); Sex = (male, female); Boolean = (false, true); Var m1, m2 : Mu; s : Sex; Nu khng cn tn kiu T, c th khai bo trc tip : Var x1, ..., xm : (C1, C2, ..., Cn) ; V d : Var m1, m2 : (, dacam, vng, lc, lam, chm, tm); T v d trn c th xy dng php gn : m1 := tm; m2 := ; s := female; Kiu lit k l m c. Ta cng c hai hm pred (x), succ (x) xc nh bi : (Ci < Cj) (i<j) Succ(Ci) = Ci+1 Pred(Cj) = Ci1

20

K thut lp trnh Pascal

Hm Ord (x) cho v tr ca x trong T. V tr u tin ca kiu lit k c gi tr 0. Ta c : Ord () = 0, Ord(false)=0 Ord(male) = 0. Ord (vng) = 2, Ord(true)=1 Ord(female) = 1. Cc bin kiu lit k c dng trong cc vng lp c tham bin. V d : { x_l l mt on chng trnh x l no } for m1= to tm do x_l; Ch rng lnh trn khng th thay th bi vng lp kim tra iu kin trc while..do nh sau : m1 := ; while m1 <= tm do begin x_l; m1 := Succ(m1); { lnh ny gy ra li khi chy } end;

IV.2. Kiu min con (Sub-range type)


Kiu min con c nh ngha bi hai hng l cn trn (upper bound) v cn di (lower bound)ca cc gi tr thuc kiu ny. Type T = min .. max ; min v max l cn di v cn trn tng ng (hay l hai gii hn) ca kiu min con T, tho mn bt ng thc min max. Nu khng cn tn kiu T, c th khai bo trc tip : Var x1, ..., xm : min .. max ; V d : Type year = 1990..1999; letter = 'A' .. 'Z'; tui = 1..200; Nu c : Var y : year ; l : letter ; t : tui; th y:=1995; l:= 'Q' ; t:= 5; l hp l. Cn y:= 2001; l:= a ; t:= 205; l khng hp l. Tt c cc hm dng cho cc kiu ordinal u c th s dng cho kiu min con tng ng. Gi tr tr v ca hm khng nht thit phi nm trong cc cn ca kiu tham i. V d gi tr ca sqr(t) c th vt qu cn trn 200. Cc th tc Read v Write c th c tham i kiu min con kiu nguyn hay kiu k t. Kiu min con thng c dng kim tra t ng cc cn gi tr cho php, trnh gy ra sai st khi lp trnh. Vi d 1 : tnh s ngy ca thng bt k trong nm.

Cc kiu d liu c s ca Turbo Pascal

21

Type ds_thng = (ging, hai, ba, t, nm, su, ... , mi_hai); ds_nm = 1990..2000; s_ngy_ca_thng = 28..30; Var nm : ds_nm; thng : ds_thng; s_ngy : s_ngy_ca_thng; begin case thng of ging,ba,nm,by,tm,mi,mi_hai: s_ngy:= 31; t, su, chn, mi_mt: s ngy := 30; hai: if (nm mod 4 = 0) and (nm mod 100 <> 0) then s ngy := 29 else s ngy := 28 end {case } end. V d 2 : loi b cc cu ch thch (comment). Trong mt CHTR Pascal thng c cc cu ch thch c t gia cp k t { v }. Xy dng hai trng thi : chp_li v ch_thch : chp_li Chp mi k t t tp ngun sang tp ch. Nu gp k t {, chuyn t chp_li qua ch_thch. ch_thch B qua mi k t. Gp '}' chuyn qua li trng thi chp_li. Tuy nhin, do cc k t { v } c th khng c trn mt s bn phm, nn Pascal cng s dng hai cp k t '(*' v '*)' phn cch cc cu ch thch. Do phi thm vo 2 trng thi mi l : bt_u_ch_thch c qua cp k t '(*'. kt_thc_ch_thch c qua cp k t '*)'. Bc 1 : Ta phc tho li gii nh sau : Chun_b while not eof do if eoln then X_l_ht_dng else X_l _ch_thch Bc 2 : Lm mn cc th tc. 1. Chun_b Ta m t cc trng thi nh sau : var c : char ; (* k t c ra v c chp li *); t: (chp_li, bt_u_ch_thch, ch_thch,kt_thc_ch_thch);

22

K thut lp trnh Pascal

u tin, trng thi l chp_li : t := chp_li ; 2. X_l_ht_dng begin readln ; writeln end 3. X_l_ch_thch begin c_k_t case t of chp_li : X_l_chp_li bt_u_ch_thch: X_l_bt_u_ch_thch ch_thch : X_l_ch_thch kt_thc_ch_thch: X_l_kt thc_ch_thch end (*case*) end Bc 3 : Tip tc lm mn th tc X_l_ch_thch. c_k_t : read (c) ; X_l_chp_li if c = '(' then t := bt_u_ch_thch else write (c) X_l_bt_u_ch_thch if c = '*' then t := ch_thch else if c <> '(' then begin write ('(') ; (*chp li '(' va c *) write (c) ; t := chp_li end else write ('(') ; (* khng i trng thi *) X_l_ch_thch if c = '*' then t := kt_thc_ch_thch; X_l_kt_thc_ch_thch if c = ')' then t := chp_li else if c < > '*' then t := ch_thch ;

Cc kiu d liu c s ca Turbo Pascal

23

Chng trnh y nh sau : Program Loi_b_ch_thch; var c : char ; (* k t c ra v c chp li *); t: (chp_li, bt_u_ch_thch, ch_thch,kt_thc_ch_thch); begin t := chp_li ; while not eof do if eoln then (*x_l_ht_dng*) begin readln ; writeln end else begin(*x_l_ch_thch*) read (c) ; (*c_k_t*) case t of chp_li : (*X_l_chp_li*) if c = '(' then t := bt_u_ch_thch else write (c); bt_u_ch_thch: (*X_l_bt_u_ch_thch*) if c = '*' then t := ch_thch else if c <> '(' then begin write ('(') ; (*chp li '(' va c *) write (c) ; t := chp_li end else write ('(') ; (* khng i trng thi *) ch_thch : (*X_l_ch_thch*) if c = '*' then t := kt_thc_ch_thch; kt_thc_ch_thch: (*X_l_kt thc_ch_thch*) if c = ')' then t := chp_li else if c < > '*' then t := ch_thch end (*case*) end. (*Loi_b_ch_thch*)

24

K thut lp trnh Pascal

CHNG 3

Cc kiu d liu c cu trc


I. Kiu mng (array)
Kiu mng (hay kiu bn dy) l kiu c cu trc, gm mt dy hu hn hay l mt tp hp cc phn t cng kiu. Kiu mng c nh ngha bi kiu ch s (index type) v kiu phn t (component type) ca mng. Kiu phn t c th l kiu c s (real, integer, char, hoc boolean) hoc cng c th l kiu cu trc. Kiu ch s c th l kiu char, kiu boolean, kiu lit k hoc kiu min con. Php ton c bn trn mng l truy cp trc tip, hay truy cp ngu nhin (random access) n tng v tr ca mng c th tm ra phn t v tr , hay c th lu tr d liu ti v tr . Mi mng c k hiu bi mt bin m gi tr ca n l tp hp cc phn t to nn mng. truy cp n mng, ngi ta thm vo tn mng mt hay nhiu ch s c t v tr ca phn t trong mng. Nu ch c mt ch s ng sau tn mng, mng c gi l mng mt chiu (onedimensional), nhng mng cn nhiu ch s c gi l mng nhiu chiu (multidimensional). V d, mt dng vn bn gm cc k t, mt vect l dy cc s thc hoc nguyn c coi l nhng mng mt chiu, mt ma trn gm dy cc hng m mi hng l mt vect c coi l mng hai chiu.

I.1.

Mng mt chiu
Type T = array [I ] of T0 ;

Mng mt chiu c khai bo nh sau :

trong I c kiu ch s, cc phn t c kiu c s T0. khai bo bin x c kiu T :


Var x : T ;

Nu khng cn tn kiu T, c th khai bo trc tip : Var x : array [I ] of T0; truy cp n mt phn t th i (vi m t var i:I;)ca mng x, ta vit tn mng ri ch s t gia cp du mc : x[i]. V d 1 : Type

Cc kiu d liu c cu trc

25

dy_s_thc = array [1..5] of real; Day = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); Work = (Mat, Comput, Lang, Progr) ; Plan = array [Day] of Work ; Var x, y, z : dy s thc ; w1, w2 : Plan ; k : array [char] of Integer ; b : array [boolean] of Byte ; C th thc hin cc php gn : x[1] := 1.5 ; y[1] := 0.3; x[2] := sqr(x[1] + y[1]); Writeln (x[1], x[2]) ; Readln (z[1]) ; W1 [Mon]:= Mat ; W2 [Sat]:= Lang ; k[a]:= 125; b[false]:= 10; V d 2 : Nhp gi tr mt mng : Const Max = 100; Type Mng = aray [1..Max] of real; var a, b : Mng ; N : integer ; i : 0..Max; begin ... Reapeat write('S phn t ca mng (<= ', Max') : '); readln(N) Until (0 <= N) and (N <= Max) ; For i := 1 to N do begin write ('a [', i, ']= ') ; readln (a [i]) ; write ('b [', i, ']= ') ; readln (b [i]) ; end ; ... end. C th thc hin php gn gia cc bin mng c cng kiu. Nu x, y l hai bin mng c cng kiu th php gn x := y s ln lt gn gi tr tng phn t ca y cho tng phn t ng ca x. V d, php gn W1:= W2 ; tng ng vi cc php gn : W1[sun]:= W2[sun]; W1[mon]:= W2[mon]; W1[sat]:= W2[sat]; V d 3 : c vo t bn phm cc k t bt k cho n khi g vo du (.) Chng hn c vo dy : a10bq012034C. th in ra : S ch s 0 l 3 S ch s 1 l 1 S ch s 2 l 1 v.v... Phc ho li gii nh sau : cn 10 bin nguyn count0, count1, ..., count9 m s cc ch s 0..9 tng ng. Tuy nhin, tt nht nn dng mt mng s gm 10 phn t. Ta dng ch s kiu char m t 0 tr i. Mng s c m t nh sau :

26

K thut lp trnh Pascal

Type sequency10 = array['0'..'9'] of integer ; Var s : sequency10; Li gii theo phng php tinh ch tng bc : Bc 1 : c chui k t, va c va m. Kt thc nu c vo du chm. In kt qu. Bc 2 : c chui k t, va c va m. Kt thc nu c vo du chm Repeat c mt k t; Nu k t l ch s, m Until kt = chm; Chng trnh chi tit nh sau : Program m_ch_s ; Const dot = '.' ; Type sequency10 = array['0'..'9'] of byte ; Var s : sequency10; c : char ; begin for c:= '0' to '9' do s [c] := 0 ; writeln ('G vo chui k t (kt thc bi du chm) : '); repeat read (c); if (0' <= c) and (C <= '9') then s[c] := s[c] + 1 ; Until c = dot; for c := '0' to '9' do writeln('S ch s ', C, l : ', s[c]:2) end.

I.2.

Mng nhiu chiu


Type T = array [I1 ] of array [I2 ] of T0 ;

Khi kiu phn t ca mng li l kiu mng, ta c mng nhiu chiu.

T:

trong I1 v I2 c kiu ch s, cc phn t c kiu c s T0. khai bo bin x c kiu Var x : T ; Nu khng cn tn kiu T, c th khai bo trc tip : Var x : array [I1 ] of array [I2 ] of T0 ;

V d : Type Ma_trn = aray [1..10] of array [1..15] of real ; Var a : Ma_trn ;

Cc kiu d liu c cu trc

27

Trong v d trn, ma trn a c 10 phn t [1], a[2], ..., a[10] m mi phn t a[i], i=1..10, li l mt mng ca 15 phn t s thc Real : a[1] l mng ca cc phn t s thc a[1][1] ... a[1][15], ... a[10] l mng ca cc phn t s thc a[10][1] ... a[10][15]. Nh vy a l mt mng ca mt mng cc s thc, ta c mng hai chiu. C th vit mng nhiu chiu di dng : Type T = array [ I1, I2 ] of T0 ; Var x : array [ I1, I2 ] of T0 ; Trong v d trn, ma trn a c vit li nh sau : Type Ma_trn = aray [1..10,1..15] of real ; Var a : Ma_trn ; Mi phn t a[i][j] ca ma trn c vit gn hn l a[i, j] , i=1..10, j=1..15. Tng t, ta c th xy dng mng 3 chiu. Type A3D = array [1..10, 1..10, 1..5] of real ; var X : A3D ; X l mng 3 chiu, l mng ca cc mng X[i]. Mi X[i] l mng 2 chiu, l mng ca cc mng X[i, j]. Mi X[i, j] l mng 1 chiu, l mng ca cc phn t X[i, j, k]. Mi X[i, j, k] l mt phn t ca X, l mt s thc real.

I.3.

Biu din mng trong b nh

I.3.1. Biu din mng mt chiu


Trong b nh, tu theo kiu d liu ca mng m mi phn t c th c biu din trn mt t nh (word) gm mt hoc nhiu byte. Gi s mi phn t ca mng A cn w byte lu tr. Gi base(A) l a ch ca byte u tin (base address). Khi , phn t th i ca mng A c lu tr trong w byte bt u t a ch : base(A) + (i 1)w V d 1 : Nu ch s ca A l nhng s nguyn thuc mt min con min .. max, th a ch ca phn t A[i] c xc nh theo cng thc : base(A) + (i min)w v A[i] v tr th (i min + 1) ca mng. V d 2 : Nu ch s ca A thuc kiu bt k, ta cng c th p dng d dng quy tc tnh a ch. Gi s mng Count cha cc s nguyn 2 byte c khai bo nh sau : Type Frequency = array [A..Z] of integer; Var Count : Frequency; ch : char; khi Count[ch] v tr th i = (ord(ch) ord(A) + 1) ca mng v c lu tr bt u t byte c a ch l : base(Count) + i -1 = base(Count) + (ord(ch) ord(A)) * 2

28

K thut lp trnh Pascal

I.3.2. Biu din mng nhiu chiu


Gi s cho mng hai chiu M c khai bo nh sau : Type Matrix = array [1..3,1..4] of integer; Var M : Matrix; i : 1..3; j : 1..4; Mng M c th lu tr theo th t hng (ht hng n n hng kia), hoc theo th t ct (ht ct n n ct kia), bt u t byte c a ch base(M) ( y, w = 2) : a ch
base(M)+0*2 ... base(M)+3*2 base(M)+4*2 ... base(M)+7*2 base(M)+8*2 ... base(M)+11*2

Mng lu tr theo hng


M[1, 1] ... M[1, 4] M[2, 1] ... M[2, 4] M[3, 1] ... M[3, 4]

Mng lu tr theo ct
M[1, 1] M[2, 1] M[3, 1] ... ... ... M[1, 4] M[2, 4] M[3, 4]

Nu lu tr theo hng, phn t M[i, j] s c lu tr ti byte c a ch : base(M) + (4 * (i 1) + (j 1)) * 2 Nu lu tr theo ct, phn t M[i, j] s c lu tr ti byte c a ch: base(M) + (3 * (j 1) + (i 1)) * 2 Mt cch tng qut, nu mng hai chiu M gm m hng, n ct, c cc ch s thuc cc min con kiu nguyn c khai bo nh sau : array [min1..max1, min2..max2] of component; trong : component l kiu phn t ca M s dng w byte nh biu din, m = max1 min1 + 1, n = max2 min2 + 1 Gi s M c lu tr theo hng, a ch bt u ca phn t M[i, j] l : base(M) + ( (i min1) * n + (j min2)) * w Tng t, ta c th lp cng thc dch a ch cho mng 3 chiu. V d xt mng ba chiu B c khai bo tng qut nh sau : Type ThreeDim= array[min1..max1, min2..max2, min3..max3] of component; Var M: ThreeDim; i: min1..max1; j: min2..max2; k: min3..max3; trong : component l kiu phn t ca M s dng w byte nh biu din, m = max1 min1 + 1, n = max2 min2 + 1, p = max3 min3 + 1 a ch bt u ca phn t M[i, j] l : base(M) + ( (i min1) * n * p + (j min2) * p + (k min3)) * w Cc cng thc tnh a ch cho cc mng trn 3 chiu cng c tnh tng t, nhng phc tp s tng ln theo s chiu.

Cc kiu d liu c cu trc

29

II. Xu k t (String)
II.1. Khi nim
Kiu xu k t thng c s dng trong cc ng dng son tho vn bn hay x l t. Mt xu (hay chui) l dy k t bt k ly t mt tp hp cc k t cho trc. Trong Turbo Pascal, xu c xy dng t cc k t ASCII. Mt xu hng c t gia hai du nhy n (quotes). V d : 'Turbo' 'It' 's all right!' (hai du nhy n lin tip biu din mt du) khai bo mt xu : Type T = String[LengthMax]; hoc : Type T = String ; Trong , LengthMax c th ly cc gi tr 0..255. V d : Const MaxTen = 25; MaxQue = 40; Type HoTen = string[MaxTen]; QueQuan = string[MaxQue]; Line = string; Var ht: HoTen; q: QueQuan; l: Line;

II.2. Cc php ton trn xu


II.2.1. Php gn mt xu
ht := inh Vn V; q:= Gia khnh, Gia vin, Ninh bnh di ca xu l s k t c mt trong . Nu di ca xu bng 0, ta c xu rng, l xu khng c k t no. V d di ca xu ht bng 11, mc d di ti a ca xu kiu HoTen l 20. Cc php ton trn xu : + = <> < <= > >= (xem mc III).

30

K thut lp trnh Pascal

II.2.2. Cc th tc v hm trn xu
1. di xu, hm Length : Length(s: string): Integer; Tr v di ng (dynamic length) ca xu. V d : var f: text; s: string; begin Assign(f, 'gary.pas'); Reset(f); ReadLn(f, s); WriteLn('"', s, '"'); WriteLn('length = ', Length(s)); end. 2. Trch chp mt xu, hm Copy : Copy(s: string; index: Integer; count: Integer): string; Tr v xu con ca s c di count t v tr index. V d : var s: string; begin s:= 'ABCDEF'; WriteLn(Copy(s, 2, 3)) {tr v 'BCD' } end. 3. Ghp mt xu, hm Concat : Concat(s1 [, s2,..., sn]: string): string; Tr v xu l xu ghp ca dy cc xu (concatenates a sequence of strings). V d : begin { tr v 'ABCDEF' } WriteLn(Concat('ABC','DEF')); end. 4. Xo b mt phn ca xu, th tcDelete : Delete(var s: string; index: Integer; count: Integer); Xo b khi s xu con c di count t v tr index. V d : var s: string; begin s := 'Honest Abe Lincoln'; Delete(s,8,4); WriteLn(s); { 'Honest Lincoln' } end. 5. Chn vo mt xu, th tc Insert : Insert(source: string; var s: string; index: Integer); Chn xu con source vo xu s bt u t v tr index. V d : var s: string; begin s := 'Honest Lincoln'; Insert('Abe ', s, 8);

Cc kiu d liu c cu trc

31

WriteLn(s); { 'Honest Abe Lincoln' } end. 6. Tm xu con, th tc Pos : Pos(substr: string; s: string): Byte; Tm v tr ca xu con substr t xu s. V d : var s: string; begin s := ' 123.5'; { Convert spaces to zeroes } while Pos(' ', s) > 0 do s[Pos(' ', s)]:= '0'; end. 7. Chuyn xu thnh s, th tc Val : Val(s: string; var v; var code: Integer); Chuyn i gi tr bin kiu xu s (s cha mt dy ch s) thnh bin v c kiu Integer hoc kiu real (gi tr ca v l biu din s tng ng ca s). Bin code c kiu Integer cho bit kt qu chuyn i : c gi tr 0 nu chuyn i thnh cng, c gi tr l v tr ca k t sai trong xu s nu chuyn sai. V d : var i, code: Integer; begin { Get text from command line } Val(ParamStr(1), i, code); { Error during conversion to Integer? } if code <> 0 then WriteLn('Error at position: ', code) else WriteLn('Value = ', i); end. 8. Chuyn s thnh xu, th tc Str : Str(x [: width [: decimals ]]; var s: string); Chuyn i gi tr s x thnh mt xu s. Xu s c th xut ra bi Write.

32

K thut lp trnh Pascal

V d : function IntToStr(i: Longint): string; { Convert any Integer type to a string } var s: string[11]; begin Str(i, s); IntToStr := s; end; begin WriteLn(IntToStr(-5322)); end.

II.3. V d
c cc k t vo bin xu str cho n khi gp du ht dng hoc t ti di cc i MaxStringLength ca str. Ti cc v tr khng c k t no c c c thay bng du trng. Program ReadString; const MaxStringLength=255; var i: integer; str:string; begin for i:=1 to MaxStringLength do if not eoln then read(str[i]) else str[i]:=' '; readln end.

Cc kiu d liu c cu trc

33

III. Kiu tp hp (set type)


III.1. Khi nim
Tp hp l mt nhm cc i tng c cng mt kiu gi l cc phn t ca tp hp. Trong Ton hc, cc tp hp thng c k t bi danh sch cc phn t t trong cp du ngoc {}. V d cc tp hp {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {, , , }, v.v... Tp hp khng cha phn t no gi l tp hp rng (empty set), k hiu hay {}. Do cc phn t ca tp hp khng c sp xp th t nn ngi ta khng ni n phn t th nht, phn t th hai, v.v... Nh vy, khng th truy cp cc phn t ca tp hp mt cch trc tip nh trong mng. Trong mt bi ton i hi n tp hp, cc phn t c chn t mt tp hp cho trc c gi l tp hp v tr (universal set). V d nu xt tp hp cc ch ci hoa th tp hp v tr c th l tp hp tt c cc k t. Cc php ton c bn trn tp hp l thuc (nm trong), giao, hp v hiu nh c ch ra trong gin Venn di y. Tp hp v tr Tp hp v tr Tp hp v tr S ST T S ST T S ST T

III.2. Khai bo tp hp
C php : Type T = set of T0 ; T0 c gi l kiu c s ca tp hp. T0 phi l kiu th t, khng c kiu real hoc kiu array. V d : Type CapLetter = set of A..Z ; Digit = set of 0..9 ; Day = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ; Days = set of Day ; Cc khai bo trn to thnh ba tp hp ph dng l : {A, B, ..., Z}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} v {Sun, Mon, Tue, Wed, Thu, Fri, Sat}. s dng tp hp trong chng trnh, cc bin c khai bo nh sau : Var Vowels, Consonants : CapLetter; Numbers, Evens, Odds : Digit; WorkDays : Days; Mt hng s tp hp c dng : [<ds phn t>]

34

K thut lp trnh Pascal

trong <ds phn t> l danh sch (c th rng) cc hng, bin hay biu thc t cch nhau du phy v chng c t trong cp du ngoc [ v ]. Cc gi tr hng lin tip c th dng cch biu din kiu min con. V d : Bin Odds c th nhn gi tr [1, 3, 5, 7, 9] (hoc [5, 9, 1, 7, 3] do tp hp khng c sp xp th t). Nu bin d c gi tr 3 th c th biu din tp hp trn nh sau : [1, d, d+2, 2*d+1, d*d] Bin Consonants c th nhn gi tr [B .. D, F .. H, K .. N]. Tp hp rng c k hiu []. Mi bin kiu tp hp u c th nhn gi tr ny.

III.3. Cc php ton trn tp hp


III.3.1. Php gn
Php gn c thc hin cho cc bin kiu tp hp. V d : Odds := [1, 3, 5, 7, 9]; Consonants := [B..D, F..H, K..N]; WorkDays := [];

III.3.2. Php quan h tp hp


Php thuc v c k hiu bi t kho in c dng : element in set trong , set l hng, hoc bin, hoc biu thc kiu tp hp, element c kiu gi tr l kiu c s ca set. Kt qu ca biu thc l true (nu thuc) hoc false (nu khng thuc).

Cc kiu d liu c cu trc

35

V d : 3 in Odds A in Consonants c kt qu true c kt qu false

Cho set1, set2 l cc hng, hoc bin, hoc biu thc kiu tp hp. Ta c cc php quan h nh sau : Php quan h set1 <= set2 hay set2 >= set1 set1 = set2 set1 <> set2 V d : [3, 5, 7] <= Odds [A]<>Consonants ngha Kim tra nu set1 set2 Kim tra nu s1 v s2 c cng cc phn t ging nhau Tng ng vi not (set1 = set2) c kt qu true c kt qu true

III.3.3. Cc php ton trn tp hp


Cho set1, set2 l cc hng, hoc bin, hoc biu thc kiu tp hp. Ta c cc php ton c bn nh sau : Php quan h ngha set1 + set2 Php hp set1 set2 set1 * set2 Php giao set1 set2 set1 set2 Php hiu set1 set2 theo th t u tin c gii thch nh sau : r * s + t = (r * s) + t r - s * t = r - (s * t) r - s + t = (r - s) + t x in s + t = x in (s + t) V d : Biu thc [3,4,7]+ [1,2,5]*[2..6,8] c tnh nh sau : Thc hin php giao : [1,2,5]*[2..6,8]= [2,5] Thc hin php hp : [3,4,7]+ [2,5]= [[2,3,4,5,7]

III.3.4. Cc thut gii vo ra trn tp hp


Thut gii to mi mt tp hp

{ to mt tp hp S, c lin tip cc phn t ca S ri thm vo S } 1. S := []; { Khi ng S } 2. while ( cn d liu ) do c x l bin c kiu c s ca S S :=S + [x];
Thut gii hin th cc phn t ca mt tp hp

{ Tm lin tip mt phn t x thuc S, hin th x, ri loi b x khi S. Tp hp S gim dn n tp hp rng } 1. Cho x l mt bin c kiu l kiu c s ca S. x:= gi tr u tin ca kiu c s ny. 2. while S <> [] do begin while x not in S do x:=succ(x) { thay x bi phn t tip theo } Hin th x. S:= S [x] { loi b x khi S }

36

K thut lp trnh Pascal

end; Nu tp hp S cn c gi li, trc khi hin th cc phn t ca S, hy lu S vo mt tp hp tm thi : TempSet:= S;

III.3.5. Mt s v d
V d 1 : Tm cc s nguyn t trong khong 2..N. Thut gii Eratosthnes : 1. Khi ng tp hp PrimeSet cha cc s nguyn t. 2. Xy dng sng Sieve [2..N]. 3. Repeat Tm s nguyn t Prime. Thm Prime vo tp hp kt qu. Loi tr khi sng cc bi s ca Prime l 2* Prime, 3* Prime... until sng = rng Chng trnh nh sau : Program TimSoNguyenTo; Const N=100; Var Sieve, PrimeSet : set of 2..N; Prime, i : integer; Begin PrimeSet:=[]; { Khi ng tp hp PrimeSet } Sieve:=[2..N]; { Xy dng sng Sieve } Prime:=2; Repeat { Tm s nguyn t Prime } while not (Prime in Sieve) do Prime:= Prime + 1; { Thm Prime vo tp hp kt qu v in ra } PrimeSet:= PrimeSet + [Prime]; Write(Perime:4,,); { Loi tr khi Sieve cc bi s ca Prime } i:= Prime; while i<= N do begin Sieve:= Sieve - [i]; i:= i + Prime end until Sieve=[]; writeln; Readln End. {TimSoNguyenTo } V d 2 : Tm s cc cp k t i lin nhau trong mt vn bn. Chng hn t lc lc gm cc cp k t i lin nhau lu, c, la, ac. Program TimCapKyTu; Const letter_a = 'a' ; letter_z = 'z' ; Type letter = letter_a .. letter_z ;

Cc kiu d liu c cu trc

37

var

Count : array [letter, letter] of Word ; d, c : letter ; C1, C2 : char ;

begin for c:= letter_a to letter_Z do for d:= letter_a to letter_Z do Count[c,d]:= 0 { Khi ng } while not eof do { c vn bn, va c va m } read(C1); begin read(C2); if [C1, C2] <= [letter_a .. letter_z] then Count[C1, C2]:= Count[C1, C2] + 1 ; C1:= C2 end { In kt qu } Readln end.

III.4. Biu din cu trc tp hp trong my


Cho S l mt tp hp cc phn t c chn t mt tp hp v tr hu hn. Trong my tnh, tp hp S cng c biu din bi mt dy bit tng t cc kiu d liu tin nh khc (Integer, Real, Char v Boolean). Cch biu din S c cho bi hm c trng C(S) l mt mng logic c kch thc bng s phn t ca tp hp v tr. Mi thnh phn C(Si) l mt bit tng ng vi mt phn t ca tp hp v tr. Gi tr C(Si) xc nh c mt hay khng ca gi tr th i trong tp hp : C (Si) (i in S) V d : Cho cc bin S, T c khai bo nh sau : Var S, T : set of 0..9 ; Vi php gn : S:= [1,5,8] th C(S) c gi tr [0 1 0 0 0 1 0 0 1 0] Vi php gn : T:= [2,3,4] th C(S) c gi tr [0 0 1 1 1 0 0 0 0 0] Cc php ton trn tp hp c xc nh nh sau : i in (S + T) (i in S) (i in T) i in (S * T) (i in S) (i in T) i in (S T) (i in S) not (i in T) trong , php ton in thc hin trn cc bit : x in [C1, C2, ..., Cn] (x = C1) (x = C2) (x = Cn)

38

K thut lp trnh Pascal

IV. Cu trc kiu bn ghi (record)


IV.1. c t kiu bn ghi
Bn ghi (hay mu tin, mc) l mt dy hu hn cc thnh phn c kiu bt k. Cc thnh phn c gi l cc trng (field) ca bn ghi. Tng t cu trc mng, php ton c bn trn bn ghi l truy cp n tng thnh phn ca n. Khai bo kiu bn ghi l vic c t tn ca bn ghi v kiu ca cc trng : Type T = Record s1 : T1; s2 : T2; ... sn : Tn end;

trong si l cc tn trng c kiu Ti Ta c : card (T) = card (T1) *card (T1) * ... * Card (Tn). T l kiu kp, gi l tch cac (Cartesian) ca cc kiu thnh phn, gi l b-n, v tp cc gi tr ca kiu kp gm mi t hp c th ca cc gi tr thnh phn. V d 1 : Type Complex= Record re: real; { real part } im: real; { imaginary part } end; Date= Record month: string[9]; day: 1..31; year: 1900..2000 end; Person= Record name, firstname: string; birthday: Date; sex: (male, female); marstatus:(single,maried,widowed,divorced) end; Cc bin c khai bo nh sau : Var z: complex; d: date; p: person; Mt gi tr kiu T s c gn gi tr nh sau : x:= T(x1, x2, ..., xn); vi xi c gi tr kiu Ti tng ng. T c th gn cc gi tr c th nh sau : z := Complex(3.5, -1.7) ; d := Date(September, 19, 1957) ; p := Person('SMITH','Jhon',Date(Mars,26,1975),male,single); Complex z 3.5 Date d September Person p SMITH

Cc kiu d liu c cu trc

39 'Jhon' Mars 26 1975 male single

1.7

19 1957

Nu x, y l hai bin bn ghi c cng kiu vi m t : Var x, y: T; c th thc hin php gn : x:= y; chp cc trng ca bn ghi y vo bn ghi x. Gi si, i = 1..n l tn ca cc trng trong bn ghi, vi m t : Var x: T; thnh phn th i ca bin kiu bn ghi x s c xc nh bi x.si, v c php gn : x.si:= xi; {xi c gi tr kiu Ti } T v d 1 trn, ta c : z.in:= 3.5; d.month:= 10; p.birthday:= Date(Mars, 26, 1975) hoc : p.birthday.month:= Mars; p.birthday.day:= 26; p.birthday.year:= 1975; V d 2 : m s ngi c thn ca phi n : Const N=100; Var a: array [1..N] of person; i, count: integer ; begin count:= 0; for i:= 1 to N do if (a[i].sex = female) and (a[i].marstatus = single) then count:= count + 1 ; end. Ta c cu lnh : with r do <lnh> vi r l bin bn ghi trnh lp li vic nh a ch ca cc thnh phn c chn trong bn ghi r. C th vit li on lnh m s ngi c thn ca phi n nh sau : for i := 1 to N do with a [i] do if (sex = female) and (marstatus = single) then count:= count + 1 ; Lnh with cng cho php lit k nhiu tn bn ghi : with r1, r2, ..., rm do <lnh> Lnh trn tng ng vi : with r1 do with r2 do
...

with rm do <lnh> V d 3 : Lnh : with p do begin writeln(Name: ,name, ,firstname);

40

K thut lp trnh Pascal

writeln(Birthday: ,birthday.month, birthday.day:3,,, birthday.year:5); write (Sex: ); if sex=male then write (male) else write (female); write (Marstatus: ); case marstatus of single : write(single); maried : write(maried); widowed : write(widowed); divorced: write(divorced); end; writeln end; c th vit li nh sau : with p, birthday do begin writeln(Name: ,name, ,firstname); writeln(Birthday: ,month,day:3, ,,year:5); write (Sex: ); if sex=male then write (male) else write (female); write (. Marstatus: ); case marstatus of single : write (single); maried : write (maried); widowed : write (widowed); divorced: write (divorced); end; writeln end;

IV.2. Bn ghi thay i


V d : M t cc khi nim hnh hc to v im nh sau : Type To=Record im = C B y 0 x Ax + By + C = 0 (x - p)2 + (y - q)2 = r2 C A 0 p Honh : real; Tung : real end; Record Vtr : To end; q

ng thng c xc nh nh cc h s ca phng trnh : Ax + By + C = 0. ng trn c xc nh bi phng trnh : (x - p)2 + (y - q)2 = r2, trong , (p, q) to tm, r bn knh.

Cc kiu d liu c cu trc

41

Type record Hsx,Hsy,Dchchuyn : real end; ngtrn = record Tm : To ; Bnknh : real end ; m t mt khi nim hnh hc bt k, s dng kiu bn ghi c th biu din c c cc khi nim im, ng thng v ng trn. l kiu bn ghi gm hai phn : phn c nh (fixed part) v phn thay i (variant part) bt u bi case. Type To= record Honh, Tung: real end; Dng= (im, ngthng, ngtrn); Hnhdng= record loi : Dng ; case Dng of im: (Vtr: To) ; ngthng: (Hsx,Hsy,Dchchuyn: real); ngtrn:(tm: To; Bnknh : real) end; C th vit gn hn : Type Hnhdng= record case loi: Dng of im: (Vtr: To) ; ngthng: (Hsx,Hsy,Dchchuyn: real); ngtrn:(tm: To; Bnknh : real) end; Hoc cng c th vit : record case loi: (im, ngthng, ngtrn) of im: (Vtr: To) ; ngthng: (Hsx,Hsy,Dchchuyn: real); ngtrn:(tm: To; Bnknh : real) end; Ngi ta dng lnh case x l phn bin dng. V d : procedure Inhnh (Hnh: Hnhdng) ; begin with Hnh do case Loi of im: with Vtr do write('im : (,Honh:5:2, ',',Tung:5:2, ')'); ngthng: write(ng thng: ',Hsx:5:2,'*x +', Hsy:5:2,'*y +' Dchchuyn:5:2, ' = 0') ; Type Hnhdng= ngThng =

42

K thut lp trnh Pascal

ngtrn: with Tm do write('ng trn tm,(',Honh:5:2,', ',Tung:5:2, ), bn knh " ',Bnknh:5:2); end; {case } writln end; Trong kiu Person, gi s cn ghi thm cho phi nam (male) cc thng tin trng lng v c ru, cn phi n (female) th ghi thm 3 s o, ta c : Type Person= record Name, Firstname: string; Brithday: Date; Marstatus: (single,married,widowed,divorced); case sex: (male, female) of male: (Weight: real; Bearded: boolean); female: (Size: array[1..3] of integer) end; V d 3 : m s nam gii nng di 50 kg ru, v s n t tiu chun v n vi t s trong khong [0.65, 0.75] (V d 85 : 63 : 90) ? Const min = 0.65; max = 0.75; Var count1, count2: integer; e1, e2: real; count1:=0; count2:=0; for i := 1 to N do with a[i] do case sex of male: if (Weight<50) and Bearded then count1:= count1+1; female: begin e1:= Size[2]/Size[1]; e1:= Size[2]/Size[3]; if (e1>min) and (e1<max) and (e2>min) and (e2<max) then count2:= count2+1 end end; Dng tng qut ca bn ghi bin dng : Type T = record S1 : T1 ; ... ; Sn-1 : Tn-1 ; case Sn : Tn of C1 : (S1,1 : T1,1 ; ... ; S1,n1 : T1, n1); ... Cm : (Sm,1 : Tm,1 ; ... ; Sm, nm : Tm, nm); end; Cc thnh phn Si c kiu Ti, i=1..n-1. Cc Si, j c kiu T i, j. Ring Sn c kiu Tn phn bit (type discriminator, hay tag field). Cc hng C1, C2, ..., Cm ch cc gi tr kiu Tn, cc cp du ngoc () thay cho cu trc record.. end.

Cc kiu d liu c cu trc

43

Mt bin x kiu bn ghi bin i gm cc thnh phn : x.s1, x.s2, ..., x.sn1, x.sk, 1, ..., x.sk, nk
Chung cho mi bin dng Nu v ch nu gi tr hin ti ca x.sk l Ck

Ch : Khng th ly x.sk, h, vi h=1..nk m x.sk Ck (hi mt b c ru khng ?). Khi dng lnh case x l phn bin dng ca cc bn ghi bin dng, lnh k c thc hin nu v ch nu x.sk c gi tr Ck. V d : Type Coordinate = record case kind : (cartesian, polar) of Cartesian: (x, y : real); Polar : (r: real ; O: real) end;
a.x a.r A a.y b.x a.O b.r b.O d B b.y

Cc thnh phn x v y l hai cnh ca to cc. Cc thnh phn r v O tng ng l khong cch v gc ca to cc (cu). Cho : var d : real ; a, b: cordinate ; tnh khong cch d gia 2 im a v b, ta c 4 trng hp phn bit. Case a kind of Cartesian : case b.kind of Cartesian: d:= sqrt(sqr(a.x - b.x)+ sqr(a.y - b.y)); Polar: d:= sqrt(sqr(a.x - b.r * cos (b.O) + sqr(a.y - b.r * sin (b.O)) end ; Polar: case b.kind of Cartesian: d:= sqrt(sqr(a.r*cos(a.O)- b.x) + sqr(a.r*sin(a.O)- b.y)); Polar: d:= sqrt(sqr(a.r)+ sqr(b.r) + sqr(b.r*cos(b.O)- a.r*cos(a.O)) - sqr(a.r*sin(a.O)- b.r*sin(b.0)) - 2 *a.r *b.r + cos(a.O - b.O)) end end ;

CHNG 4

Chng trnh con (Subprogram)


I. Khi nim
I.1. Th no l chng trnh con ?
Chng trnh con (CTC) l mt on CHTR c tn v c gi thc hin nhiu ln trong mt chng trnh gi (Call program). CHTR gi cung cp tham i (Parameter) cho CTC. CTC tnh ton - x l cc i s cho ra kt qu. Chng trnh gi

Chng trnh con


Chng trnh chnh (main program) gii quyt bi ton ban u by gi tr thnh chng trnh gi gi n cc chng trnh con. Mi chng trnh con li c th gi n nhiu chng trnh con khc.

I.2.

Dng CTC khi no ?

Cn thc hin mt cng vic no nhiu ln, nhiu ni khc nhau. C th mi lc cn i s a vo v cho kt qu khc nhau nhng bn cht cng vic khng thay i. Mt bi ton c th chia ra thnh nhiu bi ton nh hn nhm n gin ho vn (lm CHTR tr nn trong sng, d hiu). Compiler s dch CTC thnh mt on m my. Khi gi CTC, my s nhy n a ch u ca on m CTC thc hin. Pascal c hai loi CTC l th tc (procedure) v hm (function). S khc nhau gia hai loi CTC cch tr v kt qu v cch gi : Hm lun tr v qua tn ca hm mt gi tr kt qu c kiu l kiu v hng, cn th tc c th khng tr v gi tr hoc tr v nhiu gi tr kt qu. Gi th tc l vit tn th tc nh mt lnh, cn gi hm l nu tn hm trong mt biu thc. Pascal c sn mt s hm chun (xem chng 2, mc I.4).

TS. PHAN HUY KHNH bin soan

45

46

K thut lp trnh Pascal

Turbo Pascal c b sung thm nhiu th tc v hm, chng c t trong cc Unit l cc n th chng trnh, nh Crt, Printer, Dos, Graphic...

I.3.

Khai bo chng trnh con

NSD c th t xy dng cc CTC bng cc khai bo nh sau :

I.3.1. Khai bo th tc
Procedure <proc_name> [(<param_list>)]; { Cc khai bo trong th tc nu c } begin { Thn th tc } end; u th tc gm tn th tc (<proc_name>) v danh sch cc tham i t trong cp du ngoc cch nhau du phy (<param_list>) i sau t kho Procedure. Thn th tc nm gia begin v end. Kt thc th tc l du chm phy. V d : Th tc tnh n! program Tnh_giai_tha; var n : integer; G1 : real; procedure giaitha (m : intger; var gt: real); var i : integer; begin gt:= 1; for i := 1 to m do gt:= gt*i end; begin {program} write ('n = '); readln (n); while n>0 do begin giaitha (n, G1); { lnh gi th tc } writeln (n:2, '! =', G1:10); write ('n ='); readln (n) end end. Trong v d trn, khai bo th tc c t sau cc phn khai bo (Label, Const, Type v Var) ca chng trnh chnh. Tuy nhin, Turbo Pascal cho php thay i trt t trn, chng hn khai bo th tc c th t trc khai bo bin. Li gi th tc : giaitha(n, G1); t gi tr kt qu tnh n! vo bin G1. Vng lp trong chng trnh chnh kt thc khi s n g vo c gi tr 0.

I.3.2. Khai bo hm
Function <func_name> [(<param_list>)]: <type_name>; { Cc khai bo trong hm nu c } begin

Chng trnh con (Subprogram)

47

{ Thn hm } end; u khai bo hm gm tn hm (<func_name>), danh sch cc tham i t trong cp du ngoc cch nhau du phy v kiu gi tr tr v ca hm i sau t kho Function. Thn hm nm gia begin v end. Kt thc hm l du chm phy. V d : Hm tnh giai tha n! program Tnh_giai_tha; var n : integer; function giaitha (m: integer): real; var i: integer; g: real; begin g:=1; for i:= 1 to m do g:= g*i; giaitha:= g {gn tr kt qu cho hm } end; begin {program} write ('n ='); readln (n); while n > 0 do begin writeln (n:2, '! =', giaitha(n):10); write ('n ='); readln (n) end end. Trong v d trn, li gi hm giaitha(n)c vai tr l mt biu thc trong th tc writeln m khng phi l mt lnh. Trc khi kt thc hm, tn hm phi c gi tr bi lnh gn giaitha:= g;

I.3.3. Tham i hnh thc v tham i thc s


Trong khai bo CTC, cc tham i lit k sau tn th tc hoc sau tn hm c th vng mt, chng c gi l cc tham i hnh thc (formal parameter). Cc tham i trong li gi th tc c gi l cc tham i thc s (actual parameter), ph hp tng ng theo th t xut hin ca chng trong danh sch tham i hnh thc (THT). Ch : Do cc THT ch c gi tr bn trong CTC nn tn ca chng c th trng vi tn bin ca CHTR chnh (ngoi CTC). V d : Trong chng trnh tnh giai tha trn c th dng li tn bin n : program Tnh_giai_tha; var n : integer; function giaitha(n: integer): real; {Dng li tn bin n } ... Cc bin khai bo bi var trong CTC c gi l cc bin cc b (local variable) ca CTC . V d trong khai bo : procedure giaitha (m : intger; var gt: real); var i : integer;

48

K thut lp trnh Pascal

th i l bin cc b ca CTC giaitha.

I.3.4. THT tr v THT bin


i vi th tc, nhng THT khng ng sau t kho var c gi l THT tr (value parmeter). Nhng THT ng sau var c gi l THT bin (variable parmeter). V d trong khai bo : procedure giaitha (m : intger; var gt: real); th m l THT tr, cn gt l THT bin. Trong li gi th tc, danh sch tham i thc s (TTS) c t tng ng vi danh sch THT nh di y : giaitha(n, G1); giaitha(m: intger; var gt: real); Phn bit THT tr v THT bin a) THT tr Khng t sau t kho var trong danh sch THT u th tc. c cp vng nh ring khi CTC c gi v b loi b sau khi ra khi CTC. TTS tng ng l mt biu thc. THT thc cht l bin cc b ca CTC nhn gi tr ban u l tr ca TTS tng ng. Nhng thay i ca THT tr khng nh hng g i vi chng trnh gi. b) THT bin t sau ch var trong danh sch THT u th tc. TTS tng ng l mt bin. Mi thay i trn THT bin cng l thay i trn TTS tng ng. Thc cht ca truyn tham i i vi THT bin l truyn a ch.

II. Cch dng th tc v hm


Khi cn tnh mt gi tr, ch nn dng hm, khng nn dng th tc. Thng thng CTC nhm gii quyt mt cng vic trn vn no theo nhng gi tr vo no v cho ra cc gi tr kt qu no . V vy trong CTC : Khng dng cc th tc c read/readln m nhn d liu t danh sch TTS. Khng dng cc th tc a ra write/writeln m a ra di dng gi tr hm hay gi tr THT bin. Vi nhng CTC phc v gii quyt mt giai on trn vn th c th c cc lnh read v/hoc write. Ch : Trong Turbo Pascal, kiu kt qu tr v ca hm c th l : kiu c s, kiu String, kiu Poiter v phi l dng tn kiu, khng c dng Array, Record, Set, File. V d : Khng c khai bo : function f(x: real): 0..50; function g(x: real): string [50];

Chng trnh con (Subprogram)

49

m phi khai bo : type V1 = 0..50; str = string [50]; ... function f(x: real): V1; functiom g(x: real): str; Mt khc, trong danh sch THT, cc khai bo kiu cng phi dng tn kiu. V d : SAI : procedure ABC(a : array[1..10] of real); procedure X(var s : string[20]); NG : type arr = aray[1..10] of real; str = string[20]; ... procedure ABC(a: arr); procedure X(var s: str);

II.1. Khi nim v khi v phm vi


II.1.1. Khi nim v khi
Mt CHTR Pascal c th gm nhiu khi (block). Cc khi c th lng nhau. Khi nim v khi cng c hiu nh l mt CTC hay mt CHTR. Trong mi khi, cc i tng (nhn, kiu, hng, bin, CTC) phi c khai bo trc khi s dng. Khai bo c ngha xc nhn s tn ti v nh ngha i tng . Vn t ra l i tng c Pascal nhn bit nhng ni no ? V d : A A cha B, A cha bin x, cn B cha bin y var x; B var y; A c quyn i vi x B c quyn i vi y

nh ngha : Phm vi (scope) ca mt i tng l vng i tng c nhn bit s dng.

50

K thut lp trnh Pascal

Quy tc : Phm vi ca mt i tng c tnh t v tr c khai bo cho n ht khi cha khai bo , tr hai trng hp sau : A C khai bo li trong mt khi con. Nu A cha B, var x; c A v B u khai bo bin x th khi B ch c B quyn i vi x trong B (hnh 1). var x; Ch c th goto vo cc nhn trong ni b khi thi (hnh 2). a. Phm vi ca CTC : Mt CTC Pascal c th c nhiu CTC. Mi CTC li c th gi nhiu CTC khc... Hnh 1 Nhn-1 ... goto Nhn-1 ... Hnh 2 Quy tc : Phm vi ca mt CTC l ton b cha (trc tip) ca n. V d : A B B1 B2 C

Program A; Var ... Procedure B; Var x, y: real; Procedure B1; Var x: char; Begin ... End; Procedure B2; ............. Begin {B} ... End; {B} Procedure C; ............ Begin {A} ... End. {A}

B1, B2 B nn B1 v/hoc B2 ch c gi trong thn ca B, k c trong B1 ( quy) C khng gi c B1 v/hoc B2 nhng gi c B

A c th gi c B v/hoc C Ngoi ra, C c th c gi t A, C ( quy), B, B1 v B2. b. Phm v ca bin :

Trong v d trn, cc bin trong B c gi l cc bin cc b (local variables). B1 v B2 c th s dng cc bin ny, v do , chng khng l cc b i vi B1 v B2. - A v C khng nhn bit cc bin cc b ca B. - Cc bin nm trong phn khai bo ca A c gi l ton cc (global variables). Khi nim :

Chng trnh con (Subprogram)

51

Phm vi ca mt bin l phm vi ca CTC (hay khi) khai bo n. Vi d : A var x: integer; P1 var x: integer; ... x:=1; ... ... x:=0; P1; writeln(x); ... x cc b i vi P1 P2 ... x:=1; ... ... x:=0; P2; writeln(x); ... x ton cc B var x: integer; x ton cc i vi B, P2

Kt qu l 0

Kt qu l 1 do P2. Xy ra hiu ng phu (side effect)

C var x: integer; P3(x: integer): ... x:=1; ... ... x:=0; P3(x); writeln(x); {x=0} ...

D var x: integer; P2(var x: integer):


... x:=1;

... ... x:=0; P4(x); writeln(x); {x=1}


...

52

K thut lp trnh Pascal

II.2. V d
V d vit chng trnh con i mt s tin (ti a 3 ch s) thnh ch (s khi cui chng trnh) : Program DoiSoTienThanhChu; type str60 = string[60]; var n: integer; function DoiTien(n: integer): str60; var s,t: str60; a, b, c: integer; begin {Chng trnh con i tin } s:='mot hai ba bon nam sau bay tam chin muoi'; t:=''; c:=n mod 10; b:=(n div 10) mod 10; a:=(n div 100) mod 10; if a>0 then t:=copy(s,(a-1)*5,5) +' tram'; case b of 0 : if a*c>0 then t:=t+' le'; 1 : t:=t+' muoi'; else t:=t+ copy(s,(b-1)*5,5) +' muoi'; end ; if c>0 then case c of 1: if b<=1 then t:=t+' mot' else t:=t+' moot' ; 5: if b=0 then t:=t+' nam' else t:=t+' lam'; else t:=t + copy(s,(c-1)*5,5); end ; DoiTien:=t end;{DoiTien} begin {Chng trnh chnh} repeat write('n = '); readln(n); writeln(DoiTien(n)); until (n=0); readln end.

Chng trnh con (Subprogram)

53

S khi cho thut gii i mt s tin (ti a 3 ch s) thnh ch : Vo n abc ; t { hng trm } a>0 true t Ch(a) + trm { hng chc } b=0 b>1 b=1 a>0 v c>0 true t t + l t Ch(b) + mi t t + mi false

false

{ tip hng n v } c=0 false t t + mt c=1 true c c=5 c > 1 v c5

b1

t t + mt false

t t + Ch(c) b=0 true

t t + lm

t t + nm

Ra

54

K thut lp trnh Pascal

III. Kiu th tc (procedural type)


III.1. Khi nim
Trong ngn ng Pascal chun, cc th tc v hm ng vai tr nh mt phn ca chng trnh v c x l thng qua cc li gi th tc hay li gi hm. Trong Borland Pascal, cc th tc v hm c m rng thm kh nng x l thng qua cc kiu th tc : chng c x l nh mt i tng gn cho bin v c th truyn tham i. Mt khai bo kiu th tc ch nh cc tham i v vi mt hm, ch nh kiu kt qu. C php ca mt khai bo kiu th tc tng t c php khai bo u ca th tc hoc hm (header), nhng khng c phn tn th tc hay tn hm trong khai bo. V d : type Proc = procedure; SwapProc = procedure(var X, Y: Integer); StrProc = procedure(S: string); MathFunc = function(X: Real): Real; DeviceFunc = function(var F: text): Integer; MaxFunc = function(A, B: Real; F: MathFunc): Real; Cc tn tham i trong mt khai bo kiu th tc khng nh hng n ngha ca khai bo. Borland Pascal khng cho php khai bo cc hm tr v gi tr kiu th tc. Mt hm phi tr v gi tr kt qu c kiu String, Real, Integer, Char, Boolean, Pointer, hoc kiu lit k do NSD nh ngha.

III.2. V d
Cch tnh tch phn xc nh theo mt phng php gn ng no (cng thc hnh
thang, cng thc Simpson...) ging nhau cho mi hm f(x) :
b

S= trong

y + yn f ( x) dx h 0 2

+ y1 + y2 + . . . + y n 1

yi = f(xi) ti cc mc xi = x0 + ih, i = 0, 1, 2, . . ., n, h = (b - a) / n, n l s bc chia on [a, b].

V vy hm tch phn f(x) c th c khai bo nh sau : Function TichPhan(F: MathFunc; a, b: real): real; trong a, b l cc cn ly tch phn. tnh tch phn : S = (sin 2 x + cosx) dx
0

vi p = 3.141592, ta c th gi hm tch phn nh sau : writeln(tichphan(S1,0,Pi));

Chng trnh con (Subprogram)

55

Vi S1 l hm c nh ngha nh sau : function S1(x: real): real; begin S1:= sqr(sin(x)) + cos(x) end; Sau y l chng trnh y tnh tch phn cho hai hm : S1(x) = sin2 x + cos x S2(x) = e-x Ch rng chng trnh cn c bin dch vi nh hng {$F+}: {$F+} Program HinhThang; const SoBuocN = 1000; type MathFunc = function(x: Real): Real; var a,b:real; g: MathFunc; chon: char; Function tichphan(F:MathFunc;a,b:real):real; var N,i:integer; S,h:real; begin {Phng php hnh thang } h:= (b-a)/SoBuocN; S:= 0; for i:= 1 to SoBuocN do S:= S+h*F((i-1)*h+h/2); tichphan:= S end; Function S1(x: real): real; begin S1:= sqr(sin(x))+cos(x) end; function S2(x: real): real; begin S2:=exp(-sqr(x)) end; begin { Chng trnh chnh } repeat writeln('Chn hm ly tch phn :'); writeln('========================'); writeln('1. S1(x) = sqr(sin(x))+cos(x)'); writeln('2. S2(x) = exp(-sqr(x)); writeln('3. Ket thuc.'); write('Chn 1 phm 1, 2 hay 3 : '); readln(chon); if chon in ['1','2'] then begin repeat writeln('Ly tch phn t a n b hm S', chn); write('Cn di a = '); Readln(a); write('Cn trn b = '); Readln(b) until a <= b;
2

56

K thut lp trnh Pascal

case chon of '1': g:= S1; '2': g:= S2 end; writeln('Kt qu S = ', tichphan(g,a,b):12:5); readln end until chon = '3' end. Chy chng trnh trn, ta c kt qu nh sau : Chn hm ly tch phn : ======================== 1. S1(x) = sqr(sin(x))+cos(x) 2. S2(x) = exp(-sqr(x)) 3. Ket thuc. Chn 1 phm 1, 2 hay 3 : 1 Ly tch phn t a n b hm S1 Cn di a = 0 Cn trn b = 3.141592 Kt qu S = 1.57080 Chn hm ly tch phn : ======================== 1. S1(x) = sqr(sin(x))+cos(x) 2. S2(x) = exp(-sqr(x)) 3. Ket thuc. Chn 1 phm 1, 2 hay 3 : 1 Ly tch phn t a n b hm S1 Cn di a = 0 Cn trn b = 1 Kt qu S = 0.74682 Chn hm ly tch phn : ======================== 1. S1(x) = sqr(sin(x))+cos(x) 2. S2(x) = exp(-sqr(x)) 3. Ket thuc. Chn 1 phm 1, 2 hay 3 : 3

CHNG 5

Cu trc tp (File)
I. Cu trc tp tun t
Cu trc d liu mng, tp hp v bn ghi u c bn s hu hn v u c biu din trong b nh trong. Vn t ra l : Lm sao c cu trc d liu vi bn s v hn ? Khi tt my, hoc b mt in, lm sao c th phc hi li d liu ? Vng nh biu din d liu c th thay i ng (c th ln ln, hoc co li) ? gii quyt 2 vn u, Pascal s dng cu trc tp. Vi vn 3, Pascal s dng cu trc d liu ng : cu trc kiu con tr (pointer).

I.1.

Khi nim v dy (sequence)

Dy l cu trc d liu c bn c nh ngha nh sau : 1. <> l dy rng (trng). 2. <x0> l dy ch gm mt phn t x0, gi l dy n. 3. Nu x = <x1, ..., xn> v y = <y1, ..., yn> l hai dy th dy ghp x & y c nh ngha : x & y = <x1, ..., xn> <y1, ..., yn> 4. Nu x = <x1, ..., xn> khc rng th : first (x) = x1 ch phn t u tin ca dy x rest (x) = <x2, ..., xn> l dy x khng k phn t u tin x1 Ta c : first (x) & rest (x) = x. Php ton c bn trn dy l truy cp (acces), hay c/ghi (read/write) cc phn t mt cch tun t. T , nh ngha kiu tp (file) nh sau : type T = file of T0 T c t 0 n nhiu phn t kiu T0. V d : Type Int File = file of Integer; Real File = file of Real; Text = file of char; nhm = array [1..10] of real; tp_ra = file of nhm;

TS. PHAN HUY KHNH bin soan

57

58

K thut lp trnh Pascal

Truy cp tun t : ti mi thi im, ch mt phn t ca tp c c/ghi nh mt bin m (buffer variable). ... u c/ghi Vng m Gi tp l x, ngi ta nh ngha bin m l x^. Nu x c kiu T th x^ c kiu T0 Nu xem x c phn bn tri l xL v phn bn phi l xR th c th vit : x = xL & x R Eof(x) x

I.2.

Cc thao tc c bn trn tp

I.2.1. To tp rng
Pascal chun : rewrite(x); Turbo Pascal : assign(x, filename); rewrite(x); Vic to tp rng tng ng vi php gn : x := <>; Nu bin x tn ti trc , x b xo b to tp mi.

I.2.2. Thm mt phn t vo cui tp


put(x) Thm mt phn t vo cui tp tng ng vi php gn : x := x & <x> Phn t x^ c thm vo cui tp x.

I.2.3. Duyt (xem) mt tp


Pascal chun : reset(x); Turbo Pascal : asign(x, filename); reset(x); Duyt mt tp bao gm cc php gn : xL := <>; xR := x; x^ = first (x);

I.2.4. c phn t tip theo


get(x) c phn t tip theo vo bin x^ bao gm cc php gn : xL := xL & <first (xR)> xR := rest (xR) x^ := first (rest (xR)) y, first (x) ch xc nh nu x <>. Ch rng c hai th tc rewrite v reset u bt u t v tr ca phn t th nht ca tp.

Cu trc tp (File)

59

Khi ht tp, php gn x := first (xR) khng xc nh v xR rng, do ngi ta a vo hm eof (x). Eof (end of file) l hm logic c nh ngha nh sau : eof (x) =

true false

nu xR = <> nu x R <>

Tn tp (file name) l tn ca tp vt l lu tr trn mt thit b nh ngoi (a t, bng t, trng t) do h iu hnh qun l. V d trn cc my IBM-PC v tng thch, cc tp CHTR v d liu ca Turbo Pascal chy trn MS-DOS c tn l dy ti a 8 k t vi ti a 3 k t cho phn m rng ca tn ( phn loi tp) cch nhau du chm (.). V d : GIAIPTB2.PAS, GIAIPTB2.EXE, DULIEU1.DAT

I.2.5. Cc lnh Read v Write


Trong thc t, n gin php ton c/ghi trn tp, thay v s dng get v put, ngi ta s dng cc lnh read v write. Gi s v l l bin v e l biu thc c kiu T0 : read (x, v) v := x^; get(x); write (x, c) x^:= e; put(x); Trong Turbo Pascal, c d liu t tp 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 tp } Vic ng tp l cn thit ghi ht ni dung tp ln thit b nh ngoi v gii phng vng m. Mt s h iu hnh thng hn ch s lng cc tp c php m ng thi trong mt CHTR. Vic ng tp cho php m cc tp mi khc. ghi ln mt tp : assign(x, filename); rewrite(x); while p do begin {p l iu kin } R(v); {Th tc R x l v trc khi ghi } write(x, v) end; close(x); {ng tp } vi iu kin not eof(x) vi iu kin eof(x)

I.3.

Truy cp trc tip

Khi x l tp, cc lnh truy cp tun t thng chim nhiu thi gian nn ngi ta a vo phng php truy cp trc tip (direct acces), hay truy cp ngu nhin (random acces). di chuyn u c/ghi n u bn ghi trc khi truy cp, Pascal c lnh : seek (x, recno);

60

K thut lp trnh Pascal

Vi recno l s th t, hay v tr ca bn ghi cn truy xut trong tp. Recno c gi tr t 0 tr i. Cn phn bit cu trc logic ca tp vi cu trc vt l ca thit b lu tr.

I.3.1. Mt s hm x l tp trong Turbo Pascal


Filesiz(x) cho v tr phn t ca tp x, = 0 khi x = < > Filepos(x) v tr ca con tr tp (k t 0) Erase(x) xo tp. V d : assign(f, toto.exe); erase (f); Rename(x, str) thay i tn tp bi tn mi str. Ch : Khi s dng mt trong hai lnh erase(x) hoc rename(x, str), tp x phi ng v phi c t sau lnh gn assign(). V d 1 : Qun l im thi ca th sinh. qun l vic vo im thi, mi th sinh c m t nh sau : Type Thsinh = record MTS : string[10]; TnTS : string[6]; HltTS : string [20]; Ton,L,Ho : Real; end; Bin kiu tp TpTS l tp cc bn ghi c kiu c s Thsinh : TpTS = file of Thsinh; nhp im, ta cn cc bin nh sau : var ts : Thsinh; f1 : TpTS; q : boolean; {q l bin iu khin nhp } CHTR n gin nh sau : Program NhpimThi; begin {to tp f1 } q := true; {to vng lp v tn } while ts do begin {c 1 th sinh, nu m th sinh rng th kt thc } if MTS = then q := false else begin {nhp dim thi Ton, L, Ho } Write (f1, ts) end end; close(f1) end. to tp f1, ta c : assign(f1, DSTHI.DAT); rewrite(f1); c mt bn ghi th sinh :

Cu trc tp (File)

61

write ('M th sinh :'); Readln (MTS); c vo im thi Ton, L, Ho : write write write write ('H v tn ('im ton ('im l ('im ho th sinh :'); Readln (h v tn); :); Readln (Ton); :); Readln (L); :); Readln (Ho);

Sau y l mt chng trnh qun l im thi y cc x l to tp, x l sai v in ra. d hiu, cu trc d liu c n gin 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); if s=t.mats then with t do begin

62

K thut lp trnh Pascal

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. Bi tp : In ra danh sch cc th sinh trng tuyn c im trung bnh > 15 v tm th sinh c tng im cao nht.

Cu trc tp (File)

63

II. Cc tp vn bn (text files)


II.1. Khi nim
Cc tp c cc phn t kiu k t char ng vai tr quan trng trong vic giao tip ngimy (Human-Computer communication). Thc cht ca s giao tip ny l qu trnh vo/ra : nhp vo (t bn phm) cc k t v xut ra (mn hnh, my in) cng l cc k t. Tp vn bn c nh ngha : type text = file of char; Mc du tp vn bn gm cc k t nhng ngi ta thng t chc tp thnh cc dng (lines) vi di mi dng khc nhau. K t kt thc dng eoln (end of line) gm mt cp k t iu khin : CR (Carriage Return) nhy v u dng. LF (Line Feed) nhy xung dng tip theo. M s ASCII ca CR l 13 v LF l 10. vo/ra d liu, Pascal s dng hai tp chun input v output. Tp input cho php a vo t bn phm, cn tp output cho php a ra trn mn hnh. Hai tp ny c khai bo nh sau : Var input, output : text; Ch rng vi cc tp chun input v output, khng cn vit cc th tc rewrite, reset v close nh trnh by.

II.2. Vo-ra trn cc tp vn bn chun


nhp vn bn vo, ngi ta s dng cc lnh read v readln. Thay v gi tp input : read(input, danh-sch-bin); hoc readln(input, danh-sch-bin); ngi ta vit : read(danh-sch-bin); readln(danh-sch-bin) ; Trong danh-sch-bin lit k cc bin cch nhau du phy v cc bin phi c kiu c s char, integer, real hoc string. Lnh readln khc read l sau khi c xong, con tr tp chuyn n u dng tip theo trn tp. c vn bn tp bt k vi khai bo Var f : text; : read(f, x1, x2, ..., xn) readln(f, x1, x2, ..., xn) xut ra tp vn bn, dng lnh write hoc writeln : write([f], ds-biu-thc) writeln([f], ds-biu-thc) Nu vng tn bin f, my xut ra output. ds-biu-thc gm cc phn t cch nhau du phy, mi phn t l mt trong cc dng :

64

K thut lp trnh Pascal

biu-thc biu-thc : chiu-di biu-thc : chiu-di : phn-l Trong : biu thc c kiu real hoc integer, c gi tr cn in ra, chiu-di l biu thc nguyn ch ra s v tr ti thiu s s dng xut ra, phn-l cng l biu thc nguyn ch s l xut ra sau du chm thp phn, nu biu thc c kiu real. Th tc writeln khc write ch sau khi xut ds-biu-thc, cp k t xung dng CR v LF cng c xut ra.

II.3. Mt s v d
V d 1 : In ra ni dung mt tp vn bn, gch chn di cc nhm k t nm gia hai k t Ctrl-U. Ta c th in ra mi dng vn bn ca tp thnh hai dng, dng trn l bn thn dng vn bn , cn dng di gm cc du gch di dng (-) tng ng vi cc nhm nm gia hai k t Ctrl-U (^U). Bc 1, CHTR c trnh by nh sau : Chun-b while not eof(f) do begin c-mt-dng X-l-in end {white} Qua bc 2, cc th tc Chun-b v c-mt-dng d dng vit thng ra Pascal. Ring th tc X-l-in c lm mn hn nh sau : Gi line1 l dng c c, line2 l dng s in ra bi khai bo : Var line1, line2 : String; Lc u, dng line2 l rng : line2 := ; Dng line1 ln lt c x l tng k t, dng line2 ln lt c thm vo du - nu ang trng thi gch di dng, du trng nu khng phi : for i := 1 to length (line1) do begin if line1 [i] <> ^U then begin write (line1 [i]); if Gch-di-dng then line2 := line2 + '-' else line2 := line2 +' ' end else i- trng-thi end; {for} Ta s dng mt bin logic chuyn i trng thi, lc u, trng thi l khng phi gch di dng : underline:= false; Sau , vic chuyn i trng thi l lnh :

Cu trc tp (File)

65

underline:= not underline; CHTR y nh sau : Program InCGchDi; Var f : text; line1, line2 : String; i : Integer; underline : Boolean; fname : String [15]; begin Write ('Cho bit tn tp vn bn cn in :'); Readln (fname); Assign (f, fname); Reset (f) underline:= false; while not eof (f) do begin Readln (f, line1) line2 := {dng rng } 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 cc th tc 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);

66

K thut lp trnh Pascal

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.

CHNG 6

Cu trc d liu ng (Dynamic data structure)


I. Khi nim
Cc cu trc d liu xt (set, array, record) c gi l tnh (static data) v chng c xc nh trc v c kch thc chim ch trong b nh khng thay i khi chy CHTR. V d khi c m t : Var ds: array [1..N] of char; th ds c dnh trc N ch v c mt thng trc trong b nh. Thng thng, trc khi khai bo Var (hoc Type), N c xc nh qua khai bo hng : Const N = 100; u im ca cu trc d liu tnh l thao tc d dng, d hiu, nhng li c cc nhc im : - Phi xc nh kch thc b nh khi m t. - Khng th thm, hoc bt cc phn t sau khi s dng. - Chim ch v ch mt khi khng cn dng n. khc phc, Pascal c cc cu trc d liu ng, gi l kiu con tr (pointer), c m t nh sau : type Tp = ^T; var Ptr : Tp; - Tp c gi l kiu con tr, vi du ^ ng trc tn kiu T. - Ptr l mt bin con tr, kiu Tp. Khai bo Tp c ngha nhng gi tr kiu Tp l nhng con tr tr ti d liu kiu T. Thc cht, Tp ch cha a ch. Nh vy "con tr ti" c ngha. truy cp vo bin c i ch nm trong Ptr, ta dng k hiu Ptr^.

TS. PHAN HUY KHNH bin soan

67

68

K thut lp trnh Pascal

Khi Ptr khng tr ti i tng no, ta vit : Ptr := nil; nil l t dnh ring ca Pascal. Ptr : ^T Ptr^ : T

Ptr

Cn phn bit gia cc con tr v cc cu trc d liu m con tr n. P p

(a) p v q tr ti hai i tng khc nhau

(b) p v q cng tr ti mt i tng

cp pht (to) mt bin con tr, dng th tc new : new(p); p l bin con tr, p^ l bin ng do p tr ti. V d : Type intptr = ^integer; phone = record name: string [20]; num : integer end; pp = ^phone; Var q : intptr; {hoc c th m t trc tip q : ^integer } p : pp; {hoc c th m t trc tip q : ^phone } Trong th d trn, q l bin con tr cha a ch (hay tr ti) bin ng kiu integer. Ta cng gi q l con tr kiu integer, q^ c kiu integer. Tng t, ta cng c p l con tr kiu phone, p^ c kiu phone. q p 125 Phan Huy Khnh name to ra bin ng, ta vit : new (q); q^ := 125; new(p); p^.name:= 'Phan Huy Khnh p^.num := 892992; 892992 num

Cu trc d liu ng (Dynamic data structure)

69

end; Hoc c th dng lnh with : new(p); with p^ do begin name:= 'Phan Huy Khnh num := 892992; end; Sau mi ln dng new (p) ta li c mt bin ng mi do p tr ti. Nu thc hin n ln new (p) th p tr ti bin ng c to ra ln cui cng (ln th n). Nh vy, ta khng th truy cp c vo d liu ca bin to ra trc y, m phi c cch lu tr a ch ca chng li khi x l vi cc bin con tr.

II. Thao tc i vi con tr


II.1. Php gn gia cc con tr cng kiu
Gia cc con tr cng kiu, c th thc hin cc php gn. V d : Var p, q : intptr; r, s : pp; { con tr intptr v pp khai bo trn } ta c cc lnh gn : p := q; p := nil; v.v... nhng khng th c cc lnh gn cho con tr khc kiu : p := r; q := s; v.v...

II.2. Gii phng vng nh


gii phng vng nh cp pht cho p, Pascal c th tc : Dispose(p) Sau khi gii phng vng nh bi th tc Dispose, bin con tr p v ni dung p^ khng xc nh. V d : new(p); . . . { x l i vi p } Dispose(p) { p c gii phng }

II.3. Php ton ly a ch @


Pascal c php ton ly a ch @ nh sau : @x cho a ch ca bin x c kiu bt k. V d : Type a = array [1..4] of integer; Var c : char; p : ^a;

70

K thut lp trnh Pascal

Nu thc hin php gn : p := @c; th p^ s l dy 4 s nguyn, phn t u tin c a ch l a ch ca bin c p c a ng dng ca cc cu trc d liu ng s c xt k hn trong mn hc Cu trc d liu. Tuy nhin sau y, ta cng s xt mt cu trc d liu ng l danh sch lin kt (linked list).

III. ng dng ca con tr. Danh sch lin kt


Danh sch lin kt l mt dng n gin ca cc cu trc d liu ng. Mi danh sch lin kt gm mt bin con tr tr n phn t u tin ca danh sch, gi l pu. Mi phn t c kiu l bn ghi gm c hai thnh phn : ni dung ca phn t (v d c kiu xu) v con tr tr n phn t tip theo. Pu E3 u tin, danh sch lin kt Pu:= Nil; Mi bn ghi phn t c khai bo nh sau : Const DiXu = 20; Type Ni = ^PhnT PhnT = record NiDung: string [DiXu]; KTip : Ni end; cp pht vng nh cho mi phn t ca danh sch, ta s dng thm bin con tr Pni bi lnh New(Pni). Nh vy, Pni^ s tham chiu n ni dung ca mt phn t. gn d liu cho mt phn t c tr bi Pni, ta c : Pni^.NiDung:= E1; Tip theo, cn a phn t ny vo danh sch : Pni^.KTip:= Pu; { Pu c gi tr nil } Pu := Pni; E2 E1

Cu trc d liu ng (Dynamic data structure)

71

Qu trnh trn c minh ho nh sau : Pu

Pni

a) Pu := Nil Pni E1 c) Pni^.NiDung:=E1;

b) New(Pni) Pni E1 d) Pni^.KTip:= Pu

Ch rng Pu by gi tr n phn t do Pni tr n : Pu

Pni

E1

e) Pu := Pni T lc ny, Pu tr n phn t u khc nil, ngha l danh sch lin kt khc rng. Mt phn t mi c thm vo nh sau : Pu E1 Pni E2 Pu E1 Pni

E2

f) Pni^.KTip:= Pu g) Pu := Pni Sau khi to xong danh sch lin kt, vn t ra l cn xem ni dung cc phn t, hay c gi l duyt danh sch (scan). Theo cch xy dng danh sch, phn t u tin c tr bi con tr Pu. v d trn, ni dung ca phn t u tin ny l Pu^.NiDung, tc l bng E3. Cc phn t tip theo c xc nh bi k phn t tip, chng hn, Pu^. ktip^.NiDung c gi tr l E2. duyt phn t k tip, ta s dng bin con tr Pni bng cch dng php gn : Pni:= Pni^.KTip; Ta c thut gii duyt danh sch nh sau : Pni:= Pu; repeat Pni:= Pni^.KTip; until Pni=Nil;

72

K thut lp trnh Pascal

i vi danh sch rng (Null List), vng lp repeat..until s gy ra li, v vy ta nn dng vng lp while..do : Pni:= Pu; while Pni <> Nil do Pni:= Pni^.KTip; Sau y l chng trnh y v v d duyt danh sch lin kt. Ch rng ni dung danh sch in ra l theo th t ngc li. Program DuytDanhSch; Const DiXu = 20; Type Ni = ^PhnT; PhnT = record NiDung: string [DiXu]; KTip : Ni end; Var Pu, Pni: Ni; Begin Pu:= Nil; repeat New(Pni); readln(Pni^.NiDung); Pni^.KTip:= Pu; Pu:= Pni until eoln; { repeat } Pni:= Pu; while Pni <> Nil do begin writeln(Pni^.NiDung); Pni:= Pni^.KTip; end { while } End.

CHNG 7

K thut lp trnh
I.1.

I. Pht trin chng trnh bng tinh ch tng bc


Ni dung phng php

Nguyn l pht trin CHTR bng tinh ch tng bc (hay thit k t trn xung) do Niclaus Wirth (tc gi ca ngn ng lp trnh Pascal) xut vo nm 1971, trong bi bo ca mnh "Program Development by Stepwise Refinement". Ban u, CHTR l nhng cu c vit bng ngn ng t nhin (chng hn ting Vit) th hin s phn tch tng th ca ngi lp trnh. Sau , ti mi bc, mi cu c phn tch chi tit hn thnh nhng cu khc. C ngha phn tch mt cng vic thnh nhng cng vic b hn. - Mi cu c gi l mt c t (Specification). - Mi bc phn tch c gi l tinh ch (refine) cu (cng vic) . S tinh ch c hng v pha ngn ng lp trnh s dng. Ngha l cng bc sau, nhng cu ch trn ngn ng t nhin cng n gin d hiu hn v c thay th bng cc cu lnh ca ngn ng lp trnh. Nu cu cn t ra phc tp, c th coi l mt CHTR con v tip tc tinh ch n. Trong qu trnh tinh ch, cn a ra cc cu trc d liu tng ng vi tng bc. Nh vy s tinh ch cc c t CHTR v d liu l song song. Phng php tinh ch tng bc th hin t duy gii quyt vn t trn xung, trong s pht trin ca cc bc l hng v ngn ng lp trnh s s dng. y ca s i xung trong hot ng phn tch l cc cu lnh v cc m t d liu vit bng ngn ng lp trnh. ngha : Vic lp trnh c s nh hng v c s ngn np trn giy nhp, trnh m mm th nghim mang tnh trc gic.

I.2.

V d minh ho

I.2.1. V d 1
Nhp vo dy cc k hiu lin tip t bn phm cho n khi k t du chm (.) c g. In ra s lng tng ch s t 0..9 c. Chng hn, nu nhp vo dy : Kiki1t2047655kp412. th in ra : s ch s 0 c = 1, s ch s 1 c = 2, s ch s 2 c = 2... Gii : 1. Phc tho li gii Cn in ra 10 gi tr ng vi cc ch s t 0..9. C th dng 10 bin n ZERO, MOT, HAI, BA... nhng tt nht nn dng mt mng c 10 phn t : S ['0'] cha k t '0' c; TS. PHAN HUY KHNH bin soan 73

74

K thut lp trnh Pascal

S ['1'] cha k t '1' c; ... Ta m t nh sau : Type dy = array ['0'..'9'] of integer; var s = dy; Li gii c th phc tho nh sau : 1. c dy cc k t. Va c va m. Nu gp du chm th ngng c. 2. In ra s lng tng ch s t 0..9 c. 2. Tinh ch ln 1 : - Bc 1 : Tinh ch nh sau : Repeat c mt k t; Nu k t l ch s th m ch s ; {v d, nu c '2' th tng s ['2'] ln 1} Until k t = du chm; Bc 2 c thr vit ngay : for ch s := '0' to '9' do writeln('s cc ch s',ch s,' c =',s [ch s]:2); 3. Tinh ch ln 2 cho bc 1 : - Chuyn cu "Nu k t l ch s" ra dng Pascal bng cch so snh : ('0' < k t) and (k t < = '9') - Bc 1 vit li nh sau : Repeat Read (k t); if ('0' < = k t) and (k t < = '9') then s [ k t] := s [k tt] + 1; Until k t = du chm; - Nh vy ta dng k t v ch s u c kiu char var k t, ch s : char; - Du chm c th dng hng : Const du chm '='; - Ta thy trc lc m, cc phn t ca mng s phi bng 0. Ta c : for ch s := '0' to '9' do s [ch s] := 0; 4. CHTR hon chnh Program m ch s; Const du chm = '.'; Type dy = array ['0'..'9'] of integer; Vars: dy; k t, ch s : char; begin for ch s := '0' to '9' do s [ch s] := 0; writeln ('hy g vo cc k t'); writeln ('v kt thc bng du chm (.)']; Repeat

BI TP

75

Read (k t); if ('0' < = k t) and (k t < = '9') then s [k t] := s [k t] + 1; Until k t = du chm; for ch s := '0' to '9' do writeln ('s cc ch s', ch s, ' c =', s [ch s] : 2) Readln end.

I.2.2. V d 2 : Bi ton 8 con hu


Bi ton : Hy t 8 qun hu ln bn c vua (c 8 x 8 ) sao cho khng c qun no n c qun no ? Mt qun hu c th n c bt c qun no nm trn cng ct, cng hng hay cng ng cho thun nghch vi n. Bi ton ny do Call Friedrich Gauss a ra vo nm 1850 nhng khng c li gii hon ton theo phng php gii tch. L do l loi bi ton ny khng ph hp vi cc phng php gii tch m phi tm cch khc gii trn MTT, c th th i th li nhiu ln. Niclaus Wirth trnh by phng php th-sai (trial-and-error) nh sau : t mt qun hu vo ct 1 (trn mt hng tu ); t tip mt qun hu th hai sao cho 2 qun khng n nhau; Tip tc t qun th 3, v.v... Li gii c dng mt vng lp nh sau : Xt-ct-u; Repeat Th_ct; if an_ton then begin t_qun_hu_vo; Xt_ct_k_tip; end else Quay_li; until _xong_vi_ct_cui or _quay_li_qu_ct_u; Cc cng vic c tinh ch dn dn bng cch chn cc vic n gin, c cch gii ngay tin hnh trc nh sau : Gi bn c vua 8 8 gm cc (i, j) ct j, hng i vi j=1..8 v i=1..8, ta c : Xt_ct_u : Bt u vi ct j=1. Xt_ct_k_tip : Tc l chuyn qua xt ct k tip v chun b xt hng u tin : j:= j+1; i:= 0; _xong_vi_ct_cui : Lc ny xong c 8 ct, qun hu cui cng c t vo bn c : thnh cng, ta c biu thc : j>8 _quay_li_qu_ct_u: Tc l li qu ct u tin : tnh trng b tc xy ra : khng tm ra li gii ! j<1 Th_ct : Tm xem c th t qun hu ti hng no ct ang xt. Bc Th_ct s c dng : repeat

76

K thut lp trnh Pascal

Xt_mt_hng ; {l hng th i } Kim_tra_an_ton ; {khi t qun hu vo hng ny } Until An_ton or _xt_n_hng_cui; Lc u I=0, vic Xt_mt_hng tc : i:= i+1 T ta c ngay _xt_n_hng_cui tc l : i = 8 Lc ny ngi ta tm cch biu din d liu tng ng v cc cng vic c v mn ri. Theo li khuyn ca Niclaus Wirth, s biu din d liu cng tr hon lu cng tt (n khi khng th tr hon c na) ! V bn c c 8 x 8 nn c th ngh ngay n vic s dng mt ma trn Boolean hai chiu biu din : Var B : array [1..8, 1..8] of Boolean; B [i, j] c gi tr true nu c qun hu hng i, ct j. Tuy nhin, cch biu din ny gy kh khn cho vic kim tra hai ng cho c 2 qun hu no n nhau khng theo lut c vua ? By gi ta dng 3 dy Boolean a, b, c vi : a [i] = true nu khng tn ti qun hu no nm trn hng i. b [k] = true nu khng tn ti qun hu no nm trn ng cho thun th k. c [l] = true nu khng tn ti qun hu no nm trn ng cho nghch th l. Vi mi (i, j) hng i ct j, ta c quan h nh sau : ng cho thun th k tho mn i + j = k; ng cho nghch th l tho mn i - j = l; th : 2 k 16 v : -7 l 7. V vy, nu : 1 i, j 8 Ta c cc mng a , b , c nh sau : var a : array [1..8] of boolean; b : array [2..16] of boolean; c : array [-7..7] of boolean; biu din s kin t qun hu ti ct j vo hng i, ta dng dy nguyn x sao cho x [j] = i nu nh c mt qun hu (i, j) : var x : array [1..8] of integer; Vic t qun hu vo (i, j) s lm cho : a [i] = b [i+j] = c [i-j] = false Kim_tra_an_ton : Cho n lc ny, cha c hai qun hu no trong s nhng qun t ln bn c c th n ln nhau. iu kin An_ton t qun hu vo (i, j) l : a [i] = b [i+j] = c [i-j] = true; Bng cch s dng mt bin logic : Var Antoan: Boolean; Vic Kim_tra_an_ton c dch ra Pascal nh sau :

BI TP

77

An ton := a [i] and b [i + j] and c [i - j]; b[2] = b[i+j] c[-6] = c[i-j] 1 ... 8

a[i], i = 1 2 ...

8 t qun hu vo (i, j) t_qun_hu_vo s l : x[j]:= i; a [i]:= false; b [i+j]:= false; c [i-j]:= false; Tip tc tinh ch bc phc tp nht l Quay_li : Quay_li : l quay li mt ct trc ct ang xt t li qun hu cho ct khi tnh th hin trng l b tc. Bc Quay_li c dng : Xt_li_ct_trc; if not _quay_li_qu_ct_u then begin B_qun_hu__ct_; {tc ct trc ct ang xt, (i, j) } if ang__hng_cui_cng then begin Xt_li_ct_trc ; if not _quay_li_qu_ct_u then B_qun_hu__ct_ end end; D dng ta thy Xt_li_ct_trc tc l : j = j - 1; Cn _quay_li_qu_ct_u th xt trc y, tc l : j < 1; Thao tc B_qun_hu__ct_ s c dng: i:= x [j]; a [i]:= true; b[i+j]:= true; c[i-j]:= true; Chng trnh hon chnh nh sau : Program TamQunHau; Uses Crt; Const Hau='Q ';ov='#'; Var x: array[1..8] of Integer; a: array[1..8] of Boolean; b: array[2..16] of Boolean; c: array[-7..7] of Boolean; i,j: Integer; antoan: Boolean;

78

K thut lp trnh Pascal

Begin for i:=1 to 8 do a[i]:=true; for i:=2 to 16 do b[i]:=true; for i:=-7 to 7 do c[i]:=true; j:=1; i:=0; repeat repeat i:=i+1; antoan:=a[i] and b[i+j] and c[i-j]; until antoan or (i=8); if antoan then begin x[j]:=i; a[i]:=false; b[i+j]:=false; c[i-j]:=false; j:= j+1; i:= 0 end else begin j:=j-1; if j>=1 then begin i:=x[j]; a[i]:=true; b[i+j]:=true; c[i-j]:=true; if i=8 then begin j:=j-1; if j>=1 then begin i:=x[j]; a[i]:=true; b[i+j]:=true; c[i-j]:=true end end end end until (j>8) or (j<1); if j<1 then writeln('Khong co loi giai!') else for i:=1 to 8 do begin for j:=1 to 8 do if x[j]=i then write(Hau) else write(ov); writeln end; readln end. Kt qu chy chng trnh nh sau :
Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International

Q####### ######Q# ####Q### #######Q #Q###### ###Q#### #####Q## ##Q#####

BI TP

79

I.2.3.

V d 3 : Bi ton m i tun

Bi ton : Cho bn c n n v mt qun m ang to x0, y0. Hy tm cch cho qun m i theo lut c vua qua ht tt c cc ca bn c, mi i qua ng mt ln ? Cch gii quyt qun m i qua ht n2 - 1 ca bn c l ti mi m qun m ang ng, hy xc nh xem c th thc hin mt nc i k tip na hay khng ? Nh vy thut ton tm nc i k tip c th vit thnh th tc quy dng phc tho nh sau : Procedure Th_nc_i_ k; Begin Khi ng_ nc_ i_ c_ th Repeat Chn_mt_nc_i if OK then begin Thc_hin_nc_i if Cha_ht_nc then begin Th_nc_i_k; if NotOK then Xo_nc_trc end else Thnh_cng end Until i_c or (Ht_nc_i); Kt_thc End; By gi ta cn tm cu trc d liu biu din bn c n n , mi c to (i, j), vi 1 i,j n. D dng ta tm c m t nh sau : Type Idx = 1..n; Var H: Array[Idx, Idx] of Integer; Trong m t trn, thay v s dng gi tr kiu Bollean nh du c i qua cha, ta a vo gi tr kiu Integer d theo qu trnh di chuyn ca qun m theo quy c nh sau : H[x, y] = 0 <x, y> cha c qun m i qua H[x, y] = i <x, y> c qun m i qua nc th i, 1 i n2 ch nc i c thnh cng khng, s dng bin Bollean q vi quy c : q = true nc i thnh cng q = false khng c nc i Ta thy iu kin Cha_ht_nc c biu din bi biu thc : i n2 Gi s gi u, v l to nc i k tip ca qun m theo lut c vua th iu kin OK phi tho mn :

mi <u, v> phi thuc vo bn c, ngha l 1 u n v 1 v n. Qun m cha i qua <u, v>, ngha l H[u, v] = 0. Bng cch xy dng tp hp : Var s: set of Idx; biu thc iu kin OK by gi c th vit : (u in s) and (v in s) and H[u, v]=0 ghi nhn nc i hp l Thc_hin_nc_i, ta s dng php gn :

80

K thut lp trnh Pascal

H[u, v] := i; T , vic Xo_nc_trc c th s dng php gn : H[u, v] := 0 ghi nhn kt qu li gi quy, ta s dng bin Bollean q1 cho biu thc iu kin i_c. Nh vy, Thnh_cng s l : q1 := true v Kt_thc s l : q := q1 By gi ta c li gii mn hn nh sau : Procedure Try(i:Integer; x, y : Idx; Var q: Boolean); Var u, v:Integer; q1: Boolean; Begin Khi ng_nc_i_c_th Repeat Chn mt_nc_i if (u in s) and (v in s) and H[u, v]=0 then begin H[u, v] := i; if n < sqr(n) then begin Try(i+1, u, v, q1); if not q1 then H[u, v] := 0 end else q1:= true end Until q1 or (Ht_nc_i); q := q1 End; Cho n lc ny, ta cha xt n lut i ca qun m, ngha l chng trnh xy dng trn c lp vi lut c vua vi ch gim nh nhng chi tit cha cn thit khi pht trin chng trnh. Nh vy ta vn cn hai vic cha gii quyt l : Khi ng_nc_i_c_th v Chn mt_nc_i. Cho trc mt to bt k <x, y> ca qun m trn bn c, ta c th c tm <u, v> c nh s t 1..8 (theo chiu ngc kim ng h) m qun m c th nhy n nh hnh di y. c c <u, v>, t <x, y>, ta cn xc nh gi tr chnh lch theo to . Ta s dng hai mng mt chiu a v b, mi mng s c kch thc 8 phn t, lu gi 8 gi tr chnh lch theo to <x, y>, vi quy c chiu i v mang du +, chiu i v mang du -. Ta c khai bo nh sau :

BI TP

81

Var a, b: Array[1..8] of integer;

x
Chng hn nu cho <x, y> = <x0, y0> vi iu kin n-2 x0, y0 3 th ta c th c 8 cp gi tr nh sau : a[1]:= 2; b[1]:= 1; a[2]:= 1; b[2]:= 2; a[3]:= -1; b[3]:= 2; a[4]:= -2; b[4]:= 1; a[5]:= -2; b[5]:= -1; a[6]:= -1; b[6]:= -2; a[7]:= 1; b[7]:= -2; a[8]:= 2; b[8]:= -1; By gi, nh s cc nc i c th, ta s dng mt bin k nguyn, k s nhn gi tr trong phm vi 1..8. Nh vy, u th tc, vic Khi ng_nc_i_c_th tng ng vi lnh gn : k:= 0; Vic Chn mt_nc_i tng ng vi cc lnh gn : k:= k + 1; q1:= false; u:= x + a[k]; v:= y + b[k]; Cn biu thc iu kin Ht_nc_i s tng ng vi : k = 8 Th tc quy c bt u bi to <x0, y0> = <1,1>, k t nc i k=2, cc ca bn c u c th l ch ca qun m vi khi ng : for i:=1 to n do for j:=1 to n do H[i, j]:= 0; Li gi th tc nh sau : H[1, 1]:= 1; Try(2, 1, 1, q); Cui cng l mt thay i nh bng cch thm bin nguyn nsq tnh sqr(n) ngoi th tc. Ch rng n 5. Sau y l chng trnh hon chnh : Chng trnh m i tun : PROGRAM KnightsTour; Uses CRT, Dos; Const NMax=50; Type Idx = 1..Nmax;

82

K thut lp trnh Pascal

Var

i, j: Idx; N, Nsq: integer; q: Boolean; s: set of Idx; H: Array[Idx, Idx] of Integer; a, b: Array[1..8] of integer; gio, phut, giay, hund : Word; { tnh thi gian } Procedure Try(i:Integer; x, y : Idx; Var q: Boolean); Var k, u, v:Integer; q1: Boolean; Begin k:= 0; Repeat k:= k + 1; q1:= false; u:= x + a[k]; v:= y + b[k]; if (u in s) and (v in s) and (H[u, v]=0) then begin H[u, v] := i; if i < Nsq then begin Try(i+1, u, v, q1); if not q1 then H[u, v] := 0 end else q1:= true end Until q1 or (k=8); q := q1 End { Try }; Begin { KnightsTour main } ClrScr; a[1]:= 2; b[1]:= 1; a[2]:= 1; b[2]:= 2; a[3]:= -1; b[3]:= 2; a[4]:= -2; b[4]:= 1; a[5]:= -2; b[5]:= -1; a[6]:= -1; b[6]:= -2; a[7]:= 1; b[7]:= -2; a[8]:= 2; b[8]:= -1; Write('Cho N = '); Readln(N); While (N>1) and (N<Nmax) do begin { Gi bt u tnh } GetTime(gio, phut, giay, hund); Writeln(Bt u =, gio:2,':', phut:2,':', giay:2,':', hund); nsq:= sqr(N); s:=[1..n]; for i:=1 to n do for j:=1 to n do H[i, j]:= 0; H[1, 1]:= 1; Try(2, 1, 1, q); if q then for i:=1 to N do begin for j:=1 to N do write(h[i, j]:5); Writeln end else Writeln('Khng c li gii !');

BI TP

83

{ Gi bt u tnh } GetTime(gio, phut, giay, hund); Writeln(Kt thc=, gio:2,':', phut:2,':', giay:2,':', hund); Write('Cho N = '); Readln(N); End {While} End. Sau y l kt qu vi N = 5 : Cho N = 5 Bt u = 5:59:57:30 1 14 19 8 25 6 9 2 13 18 15 20 7 24 3 10 5 22 17 12 21 16 11 4 23

Kt thc = 5:59:57:36 Kt qu vi N = 6 : Cho N = 6 Bt u = 6: 0:40:80 1 34 17 32 23 36 16 25 2 35 18 31 7 12 33 24 3 22 26 15 8 21 30 19 11 6 13 28 9 4 14 27 10 5 20 29

Kt thc = 6: 0:41:79

I.3.

Sa i chng trnh

CHTR vit xong chy tt cha c ngha qu trnh lp trnh xong. Do nhu cu, c th cn sa i li theo mt cch no cho ph hp. Nh phng php tinh ch tng bc m ngi lp trnh c th d dng nhn thy nhng ch cn chnh sa trong CHTR. y l kh nng duy tr (Maintainability) ca phng php. Mt c tnh khc ca phng php tinh ch tng bc l : tnh mang c (Portability)) ca CHTR : ta d dng chuyn i sang mt mi trng (Environ-ment) khc, tc l chuyn sang mt ngn ng lp trnh khc, hoc mt h thng my tnh khc. minh ho, ta xt tr li bi ton 8 con hu tng qut nh sau : Bi ton : Tm tt c cc phng n c th t 8 qun hu ln bn c sao cho khng c hai qun no n ln nhau. T tinh ch ln 1 trong mc trc, ta cn c hai sa i nh sau : Khi n ct cui cng v t qun hu cui cng vo bn c, ta in li gii ra nhng cha kt thc CHTR ngay m tip tc quay tr li tm li gii khc. CHTR ngng khi s quay li qu ct u.

84

K thut lp trnh Pascal

Li gii c dng phc tho nh sau : Xt_ct_u ; repeat Th_ct ; if An_ton then begin t_qun_hu_vo ; Xt_ct_k ; if Ct_k_vt_qu_ct_cui_cng then begin In_ra_li_gii; Quay_li end end else Quay_li Until _quay_li_qu_ct_u; T y, vi cc bc lm mn gii quyt mc trc, ta c th vit li thnh chng trnh hon chnh. Bi tp : T vit CHTR hon hnh cho trng hp tng qut.

II. Cc thut gii qui


II.1. Khi nim v quy
qui (recursivity) khng nhng c gp trong Ton hc m cn c gp trong i sng hng ngy. Hnh bn y l mt hnh nh c tnh quy. Mt i tng c gi l qui (recursive object) nu i tng bao gm mt phn ca chnh n hay c nh ngha bi chnh n Trong Ton hc, mt s nh ngha s dng qui tr nn d hiu v d p dng. Sau y l mt s v d : nh ngha cc s t nhin : 0 l s t nhin. Nu i l mt s t nhin th i + 1 cng l mt s t nhin. nh ngha cu trc cy : l mt cy, gi l cy rng.

Nu t1 v t2 l hai cy th : trn xung).

cng l mt cy (c v ngc t t1 t2

Hm tnh giai tha n! (n 0) : 0! = 1 Nu n > 0, th n! = n* (n - 1)! S dng tnh cht qui cho php nh ngha mt tp v hn cc i tng ch bi mt s hu hn cc mnh . Trong lp trnh, nh tnh cht quy m c th thay th mt s v hn cc php tnh lp bi mt dng lnh qui. Tuy nhin s dng tnh cht qui ch thch

BI TP

85

hp khi cc bi ton, cc hm, hay cc cu trc d liu cng c nh ngha theo kiu qui. V d 1 : Cu trc d liu kiu mng ca Pascal c nh ngha quy : Const N = 100; Type Matrix = Array [1..N] of Array [1..N] of Integer; Mt biu thc ca Pascal cng c nh ngha quy nh sau : biu thc gm mt hoc nhiu ton hng c ni vi nhau bi cc ton t. Mi ton hng c th l mt bin, mt hm (th hin bi tn bin, tn hm), hoc mt biu thc khc t trong cc cp du ngoc. Mt cch tng qut, c th hnh dung mt chng trnh qui c biu din bi mt b P gm cc cu lnh Si (khng cha P) v bn thn P. P P [Si, P] V d 2 : tnh tng mt dy s c th vit : P readln(a); s:= s + a; P y, cc cu lnh Si l readln(a) v s:= s + a; Trong lp trnh, cc chng trnh qui thng c th hin bi cc th tc (hay cc chng trnh con) quy. C hai cch s dng k thut quy l qui trc tip v qui gin tip. Gi P l mt th tc no , th P l : - qui trc tip, nu trong P c li gi n chnh n. qui gin tip, nu trong P c gi n th tc Q khc, nhng trong Q li c gi P. Ta c nhn xt qui gin tip c th khng thy r rng trong chng trnh. Trong mt th tc, thng c cc i tng cc b, c th l cc bin, cc hng, cc kiu v c th c cc th tc con li c nh ngha ngay trong th tc ny. Cc i tng cc b s khng cn tn ti (hay khng cn c ngha) khi ra khi th tc. Mi khi th tc ni trn c gi (mt cch qui) th mt tp hp cc i tng cc b mi s c to ra. Mc d cc i tng trong ln gi qui ny cng tn vi cc i tng trong ln gi qui trc , nhng gi tr ca chng khc i, tu theo tm vc hot ng ca cc i tng . Mt khc, cc th tc qui c th thc hin cc tnh ton khng kt thc ging nh cc lnh lp. V vy chng ta cn tm iu kin mt th tc quy l kt thc. Gi s xt mt iu kin B no c th tho mn hoc khng tho mn. iu kin mt th tc P no c gi quy s c biu din bi m hnh sau y : P if B then P [Si, P ] hoc : P P [ Si, if B then P ] (2) (2) (1)

Trong k thut lp trnh, mt qu trnh lp (cc vng lp While hay Repeat) dng li, ngi ta nh ngha mt hm f (x), trong x l tp hp cc bin s dng trong chng trnh, sao cho khi f (x) 0 th dn ti iu kin dng, v chng minh c rng f (x) gim mi ln lp. Tng t nh vy, c th chng minh mt chng trnh qui l dng bng cch chng minh rng mi ln thc hin s lm gim f (x) .

86

K thut lp trnh Pascal

Thng thng, ngi ta kt hp mt gi tr n (n l mt s t nhin) vi P v gi P mt cch qui vi gi tr tham s l n - 1. iu kin B by gi l n > 0. Lc ny, vic gi quy c bo m kt thc. T ta c m hnh qui mi nh sau : P (n) if (n > 0) then P [ Si, P (n - 1) ] hoc : P (n) P [Si, if (n > 0) then P (n - 1) ] V d 3 : Tnh giai tha ca cc s t nhin n cho trc : i = 0, 1, 2, 3, 4, 5, 6, ..., n fi = 1, 1, 2, 6, 24, 120, 720, ..., n! Theo nh ngha quy th f0 = 0! = 1, cn nhng s tip theo fi+1 c th c tnh t fi nh sau : fi+1 = (i + 1) * fi (3) (3)

i < n.

T y c th s dng mt thut gii qui tnh s giai tha th n. Nu dng hai bin i v f v ch hai gi tr s t nhin th i v giai tha fi ti mc th i ca php qui, th fi+1 c tnh nh sau : i:= i + 1; f:= i * f T ta c c th tc qui P : P if i < n then begin i:= i + 1; f:= i * f; P end; Cho trc n th : i:= 0; f:= 1; P Trong cc ng dng thc t, su ti a ca cc li gi qui cn phi hu hn. Bi v c mi ln th tc P c gi qui th cn n mt s vng nh cho cc bin ca P. Mt khc, trng thi hin ti ca chng trnh cng phi c ghi nh c phc hi li sau khi hot ng mi ca P kt thc. Ngi ta thng dng mt danh sch y xung kiu LIFO (hay stack) lu gi thng tin mi ln th tc P c gi quy. C th hnh dung vic a vo stack qua cc li gi tnh 5! nh sau :

BI TP

87

P : tnh 5! Gi P : tnh 4! Gi P : tnh 3! Gi P : tnh 2! Gi P : tnh 1! Gi P : tnh 0!

P(0!) P(1!) P(2!) P(3!) P(4!) P(5!)

0! = 1 1! = 1 0! = 1 2! = 2 1! = 2 3! = 3 2! = 6 4! = 4 3! = 24 5! = 5 4! = 120 Stack

II.2. iu kin dng th tc qui


Cc thut gii qui thch hp cho nhng bi ton c d liu c nh ngha theo kiu qui. Tuy nhin, khng c ngha s dng qui l cch tt nht gii mt bi ton no . Ngay c mt s ngn ng lp trnh cng khng thch hp vi vic dng k thut quy. V d ngn ng FORTRAN cm dng cc th tc theo kiu qui. Cc chng trnh khng nn dng qui c th c c trng bi m hnh chung nh sau : P if B then begin S ; P end; hoc c vit li tng ng : P begin S ; if B then P end; (4) (4)

L do l thut gii trong cc m hnh trn qu n gin nn khng nht thit phi s dng qui. Ta xt li v d 2 tnh giai tha trn. T th tc qui P : P if i < n then begin i:= i + 1; f:= i * f; P end; ta c th vit on chng trnh Pascal nh sau : Program P; Begin if i<n then begin i:=i+1; f:=i*f; P end End. Tuy nhin c th vit P di dng mt hm. Do hm P tr v mt gi tr nn c th t P trong mt biu thc. Lc ny bin f khng cn n na v bin i ng vai tr tham s ca hm P. cho tin, ta t li tn hm l F : function F(i: integer): integer; begin if i>0 then F:= i*F(i-1) else F:= 1 end; R rng trong trng hp ny, ta c th dng mt vng lp n gin thay cho li gi qui : i:= 0; F:= 1;

88

K thut lp trnh Pascal

while i < n do begin i:= i + 1; F:= i * F end Mt cch tng qut, cc chng trnh c dng nh m hnh (4) v (4) nn c vit di dng vng lp while nh sau : P begin x:=x0; while B do S end; V d 4 : Tm c s chung ln nht (SCLN) ca hai s p, q nguyn. Ta c th vit di dng quy : SCLN (p, q) = x = SCLN (y, phn d ca p chia cho q) T ta c hm tnh SCLN nh sau : Function USCLN_DQ(p, q: Integer): Integer; Begin if q=0 then USCLN_DQ:= p else USCLN_DQ:= USCLN_DQ(q, p mod q) End; (5)

nu y = 0, nu y 0

Chng trnh trn c dng (4) nn ta c th d dng a v chng trnh lp khng quy tuy vit di hn nhng hiu qu hn : Function USCLN (p, q: Integer): Integer; Var r: Integer; Begin While q<>0 do Begin r:= p mod q; p:= q; q:=r End; USCLN:= p End; Trong nhiu trng hp, mt s m hnh tnh ton phc tp hn vn c th chuyn v dng lp. V d 5 : Cc s Fibonacci c nh ngha qui nh sau : fib0 = 0, fib1 = 1, fibn + 1 = fibn + fibn - 1 vi n > 0 T , chng ta d dng c c hm qui tnh fibn nh sau : function Fibonacci(n: integer): integer; begin if n = 0 then Fibonacci:= 0 else if n = 1 then Fibonacci:= 1 else Fib:= Fibonacci(n - 1) + Fibonacci(n - 2) end; rng mi ln gi hm Fibonacci(n) vi n > 1 s dn ti hai ln gi khc, Fibonacci(n-1) v Fibonacci(n-2), ngha l s ln gi s tng theo lu tha 2.

BI TP

89

Vi n ln, chng trnh gi quy nh vy l khng thc t. Sau y l tt c cc li gi quy c th cho trng hp n = 5. 5 4 3 2 1 1 0 1 2 0 2 1 0 3 1

Tuy nhin, chng ta c th tnh cc s Fibonacci bng cch dng cu trc lp v trnh vic tnh li cng mt gi tr bng cch dng hai bin ph x = fibi v y = fibi - 1 : { tnh = fibn vi n > 0 } i:= 1; x:= 1; y:= 0; while i < n do begin z:= x; i:= i + 1; x:= x + y; y:= z; end; Trong on chng trnh trn, ba php gn gi tr cho x, y, z c th thay bi ch hai php gn v khng cn bin ph z : x:= x + y; y:= x - y; Nhn xt : Khng nn dng qui mt khi c li gii bng vng lp gii quyt bi ton. Tuy nhin, khng phi lun lun trnh dng qui. Cc thut gii c bn cht l qui th s dng qui s hiu qu hn.

II.3. Nhng v d v th tc qui


II.3.1. Thp H ni (Tower of Hanoi)
Bi ton Thp H ni c m t nh sau : C 3 ct theo th t gi tn l 1, 2, 3 v 64 ci a c kch thc khc nhau t chng nhau ti ct 1 sao cho a ln hn di, a nh hn trn. Cn chuyn cc a t ct 1 sang ct 3, ly ct 2 lm ct trung gian, sao cho : Mi ln ch c chuyn mt a, ti cc ct, lun lun c a ln hn t di, a nh hn t trn.

90

K thut lp trnh Pascal

Sau y l bi ton Thp H ni vi n = 3 a.

Chng a trc khi chuyn

Chng a sau khi chuyn (7 ln xp) Cch chuyn n a nh sau : chuyn n a t ct 1 sang ct 3, ly ct 2 lm ct trung gian. V a ln nht nm di cng nn phi tm cch chuyn n-1 a trn a ny t ct 1 sang ct 2, sau chuyn a ln nht sang ct 3. By gi li tip tc chuyn n-1 a t ct 2 sang ct 3 ly ct 1 lm ct trung gian. Ta c th vit gn hn thnh 3 thao tc nh sau : 1. Chuyn n-1 a t ct 1 sang ct 2 ly ct 3 lm ct trung gian. 2. Chuyn 1 a t ct 1 sang ct 3. 3. Chuyn n-1 a t ct 2 sang ct 3 ly ct 1 lm ct trung gian. Vi khai bo trong chng trnh chnh : Type TnCt = 1 .. 3; ta d dng vit cc thao tc trn thnh th tc nh sau : Procedure ChuynCt(n, A, B, C: TnCt); Begin if n>0 then begin ChuynCt(n-1, A, C, B); Chuyn_mt_a_t_A_sang_C; ChuynCt(n-1, B, A, C); End End; Thao tc Chuyn_mt_a_t_A_sang_C; c vit thnh lnh : Writeln(Chuyn mt a t , A:1, -> , C:1); Thm mt bin m i tnh s bc chuyn a, ta c chng trnh y nh sau : Program HanoiTower; Type TnCt = 1 .. 3; Var i, N: Integer; Procedure ChuynCt(n, A, B, C: TnCt); Begin if n>0 then begin ChuynCt(n-1, A, C, B);

BI TP

91

i:=i+1; Writeln(i:3,Chuyn mt a t ,A:1, -> ,C:1); ChuynCt(n-1, B, A, C); End End; Begin Write(S a cn chuyn : ); Readln(N); i:=0; ChuynCt; Readln End. Chy chng trnh trn s cho kt qu nh sau : S a cn chuyn : 4 1. Chuyn mt a t 1 -> 2 2. Chuyn mt a t 1 -> 3 3. Chuyn mt a t 2 -> 3 4. Chuyn mt a t 1 -> 2 5. Chuyn mt a t 3 -> 1 6. Chuyn mt a t 3 -> 2 7. Chuyn mt a t 1 -> 2 8. Chuyn mt a t 1 -> 3 9. Chuyn mt a t 2 -> 3 10. Chuyn mt a t 2 -> 1 11. Chuyn mt a t 3 -> 1 12. Chuyn mt a t 2 -> 3 13. Chuyn mt a t 1 -> 2 14. Chuyn mt a t 1 -> 3 15. Chuyn mt a t 2 -> 3 Trong trng hp tng qut n a, s bc chuyn a s l : 20 + 21 + . . . + 2n = 2n - 1 ln. Vi n=64, gi s thi gian chuyn mt a l t giy, th thi gian chuyn ht 64 a ca bi ton Thp H ni s l : (264 - 1) t = 1.8446744074E+19 t giy. Mt nm c 365 24 60 60 = 31 536 000 giy, gi s t = 10-2 giy th s nm cn chuyn 64 a l : (1.8446744074E+19 / 31536000) 10-2 = 5.8494241735E+11 5.8 t nm !

92

K thut lp trnh Pascal

II.3.2. V en abyme
Gi s cn v hnh sau :

Gi s hnh v c v t mt im xc nh bi hai bin ta l x v y. Chng ta s s dng hai th tc ho sau y ca Turbo Pascal (trong Unit Graph) : MoveTo(x, y) Di chuyn con tr mn hnh n im c ta x v y. LineTo(x, y) V ng thng t v tr hin ti ca con tr mn hnh n im c ta x v y. V tr con tr mn hnh by gi ta mi l x v y. Gi s Pn (n > 0) l hnh v c n hnh ( su n), khi hnh v trn s l P4 (gm 4 hnh chng nhau). Vi n > 1, c th phn tch Pn thnh P1 v Pn-1. C hai cch phn tch Pn tu theo P1 c chn l hnh ln nht hay nh nht ca Pn. Ta c th chn trng hp u l v t ngoi vo trong, tuy nhin nu chn trng hp 2 l v t trong ra ngoi th chng trnh cng khng km th v. Nh vy ta n nh s hin hu ca P1 v Pn-1. By gi ta tm cch v Pn. gim ti thiu s di chuyn tu tin ca con tr mn hnh, ta quy c rng con tr mn hnh s di chuyn mt cch lin tc. Nu hnh dung ta ang s dng mt cy bt v th khi v, u ngi bt s khong nhc ra khi mt t giy. T , ta c cc nhn xt sau : Con tr mn hnh s tr v li v tr xut pht sau khi v xong Pn vi n>1, v rng s im dng chn i hng v ca con tr mn hnh (s nh) l chn. V th ta nn chn mt v tr nht qun cho mi hnh v ca Pn trnh lm phc tp thm thut gii. im xut pht v im dng ca Pn-1 s nm trn P1 v P1 l hnh ln nht bao ngoi Pn-1. n gin cch trnh by thut gii, ta s chn im xut pht ca con tr mn hnh l v tr nh trn cng bn phi (nh rng khi chy chng trnh, to ca mn hnh li o chiu ng y).

BI TP

93

Ch rng t nhng nhn xt trn, vic v Pn s bt u t P1 v phi v xong P1 trc khi v Pn-1. Nh th : V cc cnh ca P1 sao cho nh xut pht ca P1 c ni vi nh xut pht ca Pn-1. V Pn-1. Kt thc vic v P1 sao cho nh xut pht ca Pn-1c ni vi nh xut pht ca P1. Nu gi cc cnh theo th t v ca P1 (l trnh ca con tr mn hnh) l 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 v vic v cc cnh l nhng mi tn ch cc hng thch hp, th chng ta c s qui v P1 nh sau :
1 2 10 3 4 9 7 6 8 5

Ch rng 2 ch l mt na l trnh v cnh ca v n chnh l nh xut pht ca Pn-1. Sau c tip tc t 3. Nh vy, th tc v Pn s tm tt nh sau :

P1 P1

P begin 1 ;2 ; P; 3 ; 4 ; 5 ; 6 ; 7 ; 8 ; 9 ; 10 end; Chng trnh di y s dng cc bin x, y l to nh xut pht v l l di ca P1. Bin n cho bit su ca hnh v. Program EnAbymeDraw; Uses Crt, Graph; var x, y, l, n: integer; Gd, Gm: Integer; procedure PDraw(x, y, l, n: integer); begin if n>0 then begin LineTo (x + l div 2, y); LineTo (x + l div 4, y-l div 4); PDraw (x + l div 4, y-l div 4, l div 2, n-1); LineTo (x, y - l div 2); LineTo (x + l div 2, y - l); LineTo (x + l, y - l div 2); LineTo (x + l div 2, y); LineTo (x + l, y); LineTo (x + l, y - l); LineTo (x, y - l); LineTo (x, y); end end; begin { main } write ('So lan N = '); readln(n); write ('Toa do X, Y = '); readln(x, y); write ('Do dai L = '); readln(l);

94

K thut lp trnh Pascal

Gd:= Detect; InitGraph(Gd, Gm, 'C:\PROLANG\TP\BGI'); if GraphResult <> grOk then Halt(1); MoveTo(x, y); dessin(x, y, l, n); readln; CloseGraph; end.{ EnAbymeDraw }

II.3.3. V ng Hilbert
ng Hilbert do David Hilbert, nh Ton hc c (1862-1943), tm ra nm 1891 c dng nh sau :

ng Hilbert trn y do nm ng cong chng ln nhau. Cc ng cong c v theo mt quy tc m c th ly ra ba ng H1, H2 v H3 c mu nh di y :

H1

H2

H3

Ta thy ng Hi+1 c to thnh t bn ng Hi nhng c quay mt gc thch hp v c ni vi nhau bng ba on thng. C th coi rng H1 c to t bn ng rng H0 v cng c ni bng ba on thng chnh l 3 ng ca H1. Mi Hi c gi l ng Hilbert cp i. Tng t chng trnh v ng en abyme mc trc, chng trnh v ng Hilbert gm : hai bin x, y xc nh ta im xut pht, th tc MoveTo (t con tr mn hnh ti ta x, y),

BI TP

95

th tc LineTo (v on thng t v tr hin ti ca con tr mn hnh ti v tr xc nh bi x v y). V mi ng Hi gm bn na ca Hi - 1, nn chng ta s v Hi thnh bn phn, mi phn v Hi - 1 vi kch thc v gc quay thch hp. Nu gi bn phn l A, B, C, D v cc th tc v cc ng ni l nhng mi tn ch hng thch hp, th chng ta c s qui sau y : D A C A B C A B A C C D (6)

A: B: C: D:

B B D D

Ta c th m t cch v A, B, C v D nh sau : A A D B B C B A D B C C C D A D

A B C D Nu gi di ca mt on n v l h, th th tc A c th hin qui v dng n hai th tc B v D. Hai th tc ny cng c xy dng tng t nh th tc A. Ta c th tc A nh sau : procedure A(i: integer); begin if i > 0 then begin D(i - 1); x:= x - h; LineTo(x, y); A(i - 1); y:= y - h; LineTo(x, y); A(i - 1); x:= x + h; LineTo(x, y); B(i - 1) end end Chng trnh chnh s gi n th tc A mt ln cho mi ng Hilbert. Sau cc ng Hilbert c v chng ln nhau. Chng trnh chnh xc nh im bt u ca ng h0 c to l x, y v di ca on ni hai phn vi nhau l h. Gi h0 l rng ca mn hnh, h0 phi tha iu kin h0 = 2k, vi k n. h0

96

K thut lp trnh Pascal

Trong chng trnh v n ng Hilbert H1.. Hn di y, ta s dng khai bo forward (tham kho trc) khai bo cc th tc hoc cc hm mi khi chng c gi trc khi nh ngha. Chng hn th tc A trn gi n hai th tc B v D trc khi hai th tc ny c nh ngha. Ch cn lit k ht cc tham s hnh thc trong khai bo. Program Hilbert; Uses Crt, Graph; const n = 4; h0 = 256; var i, h, x, y, x0, y0 : integer; Gd, Gm: Integer; { Cc tn th tc c khai bo forward } procedure A(i: integer);forward; procedure B(i: integer);forward; procedure C(i: integer);forward; procedure D(i: integer);forward; { Khai bo cc th tc } procedure A(i: integer); begin if i > 0 then begin D(i - 1); x:= x - h; LineTo(x, y); A(i - 1); y:= y - h; LineTo(x, y); A(i - 1); x:= x + h; LineTo(x, y); B(i - 1) end end; procedure B(i : integer); begin if i > 0 then begin C(i - 1); y:= y + h; LineTo(x, y); B(i - 1); x:= x + h; LineTo(x, y); B(i - 1); y:= y - h; LineTo(x, y); A(i - 1) end end;

BI TP

97

procedure C(i : integer); begin if i > 0 then begin B(i - 1); x:= x + h; LineTo(x, y); C(i - 1); y:= y + h; LineTo(x, y); C(i - 1); x:= x - h; LineTo(x, y); D(i - 1) end end; procedure D(i : integer); begin if i > 0 then begin A(i - 1); y:= y - h; LineTo(x, y); D(i - 1); x:= x - h; LineTo(x, y); D(i -1 ); y:= y + h; LineTo(x, y); C(i - 1) end end; begin {Bt u chng trnh chnh } Gd:= Detect; InitGraph(Gd, Gm, 'C:\PROLANG\TP\BGI'); if GraphResult <> grOk then Halt(1); i:= 0; h:= h0; x0:= h div 2; y0:= x0; repeat {v ng Hilbert bc i} i:= i + 1; h:= h div 2; x0:= x0 + (h div 2); y0:= y0 + (h div 2); x:= x0; y:= y0; SetBkColor(15); SetColor(1); MoveTo (x, y); A(i) until (i = n); Readln; CloseGraph end.

98

K thut lp trnh Pascal

II.3.4. V ng Sierpinski
Sau y l mt v d khc v k thut s dng th tc quy v cc ng tru tng nhng phc tp v tinh t hn ng Hilbert. l cc ng Sierpinski do Waclaw Sierpinski, mt nh Ton hc ngi Ba lan (1882 - 1969) tm ra. Hnh v di y l hnh mu ca ng Sierpinski cp 1 v ng Sierpinski cp 2. ng Sierpinski cp 1, cp 2 l do hai ng Sierpinski cp 1v cp 2 chng ln nhau.

Ta gi Si l ng Sierpinski cp i, ng Sierpinski S1 ... Sn l do n ng Sierpinski t cp 1 n cp n chng ln nhau. l nhng ng khp kn m khng phi h nh cc ng Hilbert xt. Nh vy s qui c bn phi bn phn ni vi nhau bi cc ng khng thuc mu qui. l bn on thng bn gc ngoi cng, c in m ng Sierpinski cp 1. xy dng s qui, ta gi bn mu thnh phn l A, B, C, D v cc ng ni l cc mi tn. Ch rng bn mu qui u ging nhau, ch khc nhng gc quay 900. Mu c bn ca ng Sierpinski : S : A B C D v cc mu qui l : A:A B D A B:B C A B (7) C:C D B C D:D A C D (Cc mi tn kp ch cc ng ni c di gp i di n v). A B 2h D A C A B B C B B C D C D D C A

Nu cng dng cc bin v th tc nh v d ng Hilbert, th s qui trn c chuyn thnh th tc qui nh sau : procedure A (i : integer); begin if i > 0 then

BI TP

99

begin A(i - 1); x:= x + h; y:= y - h; LineTo(x, y); B(i - 1); x:= x + 2 * h; LineTo(x, y); D(i - 1); x:= x + h; y:= y + h; LineTo(x, y); A(i - 1) end end; y l th tc tng ng vi mu quy A : A B D A. Cc th tc tng ng cho cc mu B, C, D cng c xy dng tng t. Chng trnh chnh c xy dng theo mu A B C D. Cng vic ca n to cc gi tr u cho cc ta v v xc nh di on n v ty vo ln ca trang (xem chng trnh 3.2). Hnh 3.7 minh ha kt qu ca chng trnh vi n = 4. program Sierpinski ; Uses Crt, Graph; { v cc ng Sierpinski bc 1 .. n } const n = 4; h0 = 256; var i, h, x, y, x0, y0: integer; Gd, Gm: Integer; { Cc tn th tc c khai bo forward } procedure A (i: integer);forward; procedure B (i: integer);forward; procedure C (i: integer);forward; procedure D (i: integer);forward; { Khai bo th tc } procedure A (i : integer); begin if i > 0 then begin A(i - 1); x:= x + h; y:= y - h; Lineto(x, y); B(i - 1); x:= x + 2 * h; Lineto(x, y); D(i - 1); x:= x + h; y:= y + h; Lineto(x, y); A(i - 1) end end; procedure B (i : integer); begin if i > 0 then begin B (i - 1); x:= x - h; y:= y - h; Lineto(x, y); C (i - 1); y:= y - 2 * h; Lineto(x, y); A (i - 1); x:= x + h; y:= y - h; Lineto(x, y); B (i - 1) end end; procedure C (i : integer); begin if i > 0 then begin C (i - 1); x:= x - h; y:= y + h; Lineto(x, y); D (i - 1); x:= x - 2 * h; Lineto(x, y);

100

K thut lp trnh Pascal

B (i - 1); x:= x - h; y:= y - h; Lineto(x, y); C (i - 1) end end; procedure D (i : integer); begin if i > 0 then begin D (i - 1); x:= x + h; y:= y + h; Lineto(x, y); A (i - 1); y := y + 2 * h; Lineto(x, y); C (i - 1); x:= x - h; y:= y + h; Lineto(x, y); D (i - 1) end end; begin i:= 0; h:= h0 div 4; x0:= 2*h; y0:=3*h; Gd := Detect; InitGraph(Gd, Gm, 'C:\PROLANG\TP\BGI'); if GraphResult <> grOk then Halt(1); SetColor(1); SetBkColor(15); repeat i:=i+1; x0:=x0-h; h:=h div 2; y0:=y0+h; x:= x0; y:= y0; MoveTo(x, y); A (i); x:= x + h; y:= y - h; Lineto(x, y); B (i); x:= x - h; y:= y - h; Lineto(x, y); C (i); x:= x - h; y:= y + h; Lineto(x, y); D (i); x:= x + h; y:= y + h; Lineto(x, y); until i=n; readln; CloseGraph; end. Chng trnh trn cho kt qu nh sau :

BI TP

101

III.

n v trong Turbo Pascal

n v (Unit) trong Turbo Pascal th hin tnh cu trc trong lp trnh : cho php chia chng trnh ln thnh mt h thng phn cp gm mt chng trnh chnh v nhiu n v chng trnh con.

III.1. Gii thiu Unit


Unit l tp hp khai bo cc hng, cc kiu d liu, cc bin, cc th tc v hm c quan h vi nhau a vo s dng trong chng trnh chnh. Mi n v, c ct gi trn thit b nh ph (a t) di dng mt tp chng trnh Pascal *.PAS v c dch (compile) ring r. Kt qu dch l mt tp mi c phn m rng l *.TPU. gi cc Unit, trong phn u chng trnh s dng lnh : USES <tn Unit> Th vin cc chng trnh mu Turbo Pascal c 8 Unit chun nh sau : cha cc hm v th tc th vin thng dng mc h thng : x l tp, System x l chui, tnh cc hm ton hc. System c gi mc nhin m khng cn khai bo : USES System cung cp cc chc nng ca h iu hnh MS-DOS Dos iu khin cc thit b vo (bn phm) v ra (mn hnh) : Goto XY, Crt Clrscr... cung cp ccc kh nng ha (graphics) cho cc loi mn hnh khc Graph nhau : Hercule, CGA, EGA, VGA... tng thch vi cc chng trnh vit bng Turbo Pascal V3.0 Turbo3 thc hin cc chng trnh con ho theo kiu con ra (tortoise) ca Graph3 Turbo Pascal V3.0

102

K thut lp trnh Pascal

III.2. Cu trc ca Unit


Mt Unit do NSD to ra, t trong mt tp chng trnh, gm nhng thnh phn nh sau : 1. Phn tn ca Unit (Unit Heading) : Unit <tn Unit> 2. Phn giao tip (Interface Section) Interface { Cc khai bo sau y khng bt buc phi c } Uses <Ds cc Units dng cho Unit ny> Const <Ds cc hng> Type <Ds cc m t kiu> Var <Ds cc khai bo bin> <Ds cc phn u ca cc th tc v hm> Cc khai bo Const, Type v Var sau Interface cho Unit cng dng c ti ni s dng n v ny. Ta ni chng l thy c (Visible). Danh sch cc tn th tc v hm c cc Unit khc dng n s c khai bo y trong phn tip theo : 3. Phn hin thc (Implementation Section) Implementation { Cc khai bo sau y khng bt buc phi c } Uses <Ds cc Uses s dng n> Label <Ds cc nhn> Const <Ds cc hng> Type <Ds cc m t kiu> Var <Ds cc khai bo bin> <Cc m t hm v/hoc th tc> Cc m t hm v/hoc th tc trong phn ny gm c : Cc hm v /hoc th tc m t phn giao tip. Cc hm v/hoc th tc ni b dng ring trong phn hin thc (khng khai bo trong phn giao tip). Cc m t nhn, hng, kiu d liu, bin v cc hm, th tc ni b trong phn hin thc ca mt Unit l khng dng c ti ni s dng Unit ny. Ta gi chng l b du (Hidden). 4. Phn khi ng (Initialization section) Begin <Cc lnh Pascal> end. Phn ny c th vng mt nhng end. phi c mt !

BI TP

103

Khi ni s dng mt Unit c Initialization, phn khi ng ca Unit ny s c gi chy trc khi thn ca ni s dng chy. Nu c mt ni s dng nhiu Unit th phn khi ng ca cc Unit s c chy theo th t xut hin ca tn ca cc Unit trong khai bo Uses ca ni gi. Trong phn khi ng mt n v, ngi ta thng lm cc ng tc chun b nh khi gn cho cc bin, m cc tp, thng bo ch chy chng trnh...

III.3. Cch s dng Unit


1. Mt chng trnh hay mt Unit c th s dng nhiu Unit khc. S dng mt Unit c ngha l c quyn s dng cc hng, kiu d liu, bin, cc hm v/hoc th tc c khai bo trong phn giao tip Interface ca Unit . V d : s dng cc Units c tn ln lt l U1, U2, ..., Un, dng mnh Uses t sau khai bo Program trong chng trnh : Uses U1, U2, . . .,Un ; 2. Khi c mt sa i no trong phn Interface ca mt Unit Khi , cc (tp) chng trnh hay (tp) Unit cn c dch (Compile) li. Khi trong mt Unit ch c s sa i phn Implementation hay phn Initialization th khng cn dch li nhng (tp) chng trnh hay (tp) Unit s dng Unit . V d : Gi s chng trnh P gi U1 v U1 s dng U2 : Program P ; Uses U1 ; Const a = b; Begin writeln (a); end.

Unit U1 ; Interface Uses U2 ; Const b = c; Implementation end.

Unit U2 ; Interface Const c = 10; Implementation end.

P.PAS U1.PAS U2.PAS Nu trong U2, i c=5 chng hn th cn phi dch li U2.PAS v U1.PAS (v U1 s dng U2) v dch li P.PAS. 3. Khi c s trng tn hng, bin, kiu d liu v tn CT con (hm, th tc) phn bit, ngi ta t trc tn trng tn Unit c cha tn ny v cch mt du chm (.). Ring i vi chng trnh chnh (khai bo Program) th khng cn. V d : Gi s chng trnh P s dng cc Unit U1 v U2. Nu trong P, trong Interface ca U1 v U2 u c khai bo bin i th phn bit i no l ca P, i no l ca U1 v U2 ngi ta vit : i {i ca P} U1.i {i ca U1} U2.i {i ca U2}

III.4. V d v Unit
Vit chng trnh tnh nhiu ln din tch hnh trn vi bn knh nhp vo t bn phm, cho n khi bn knh nhp vo l 0 th dng. Gi chng trnh chnh l HINHTRON v Unit s dng tnh din tch hnh trn l DTHTRON, ta c :

104

K thut lp trnh Pascal

Program HINHTRON ; {Tp HINHTRON.PAS} Uses Crt, DTHTRON ; Var bk : Real ; Begin Write (S Pi = , Pi) ; {hng Pi khai bo trong Unit DTHTRON} Repeat Write (bn knh =) ; Readln (bk) ; if bk > 0 then Writeln (Din tch = , Dientich (bk) ) ; Until bk = 0 End. {HINHTRON} Unit DTHTRON ; {Tp DTHTRON.PAS} Interface Const Pi = 3.1415926535 ; {1/ = 0.318309886} Function Dientich (R : Real) : Real; Implementation Function Dientich; Begin Dientich := Pi * Sqr (R) End; Begin {phn khi ng Inilialization} Writeln (trong chng trnh chnh s s dng Unit DTHTRON !) End.

BI TP
Cc bi tp sau y yu cu thc hin cc bc sau : 1. Vit s thut gii bng ngn ng gi nh hoc s khi (b qua bc ny nu thut gii qu n gin). 2. Vit chng trnh y trn Turbo Pascal. 3. Chy my c kt qu (t cho cc d liu vo c th). D liu c c vo t bn phm. Kt qu c a ra trn mn hnh.

1. Cu lnh gn. Cc th tc READ v WRITECu trc r nhnh IF.. THEN v CASE


1. Cho gi tr ca bin x. Tnh gi tr biu thc sau ri a kt qu ra vi 3 ch s l : 5 2 n 0 < x < 2 u x + 1 y = log 2 ( x + 2) n x 2 u x 1 n x 0 u 2 2. Cho a, b, c (a 0). Gii bt phng trnh bc hai ax2 + bx + c > 0. Cc kt qu c vit vi 2 ch s l.

BI TP

105

3. Nhp vo mt k t. Ty k t c g vo m chng trnh thng bo nh sau : - L ch s nu k t l cc ch s 0..9. - L ch ci nu k t l cc ch ci A .. Z hoc a .. z. - L du php ton nu k t l mt trong cc du + - * / = < > th c thng bo. - L du ngoc nu k t l mt trong cc du ( ) [ ] { }. - L du chnh t nu k t l mt trong cc du . , ; :. L k t c bit nu l cc k t khc cc k t trn. 4. on gii c c : chng trnh ch nhn phm Enter, sau a ra s ca gii c c mt cch ngu nhin theo dng sau : CCnnnn trong : CC l 2 ch ci vit hoa bt k (A .. Z) nnnn l 4 ch s bt k (0 .. 9). V d : DQ0405, v.v...

2. Cc cu trc lp : WHILE, REPEAT v FOR


1. Cho x thc v n nguyn dng. Tinh tng : x2 xn S = 1 + x + + ... + + ... 2! n! 2. Cho x thc. Tnh tng : n x2 x3 n x S = 1 - x + + ... + (-1) + ... 2! 3! n! vi chnh xc cho trc. Chng hn = 10-5 3. Bin thc x thay i t 0 n 1 bc tng l 0.01. Hy tnh : f (x) = e-x sin (2px) g (x) = e-2xsin (2px ) + cos (2px) 4. Cho cc gi tr ai v hng nguyn n. Tnh : S= S=
i =1 n

(a
i =1

2 i

+ 2ai + 4)
vi ai > 0

ai

5. Tm tt c cc s c 3 ch s sao cho s bng tng lp phng ca cc ch s ca n. 6. Cho x thc v n nguyn dng. Tnh gi tr n > 1 du cn y = x + x + ... + x 7. Cho trc s nguyn N. Hy in ra cc s nguyn t t 2 n N. 8. Dy Fibonaci c nh ngha nh sau : F0 = F1 = 1 Fn = Fn-1 + Fn-2 vi n 2 Cho trc mt s nguyn n, hy tnh gi tr Fn.

3 Kiu mng (ARRAY)


1. Nhp mt dy s nguyn sau a ra cc ga tr sau : - Gi tr trung bnh ca c dy. - Gi tr nguyn dng nh nht ca dy. 2. Nhp mt dy s thc. o ngc th t ca dy cho bng cch i ch phn t th nht cho phn t cui cng, phn t th hai cho phn t st cui cng..., sau a ra dy o ngc.

106

K thut lp trnh Pascal

3. Nhp mt dy s nguyn, sau sp xp li ri a ra kt qu sau khi sp xp sao cho cc s chn xp ln u dy, cc s l xp xung cui dy bng hai cch sau : - Sp xp qua mt dy khc - Sp xp ngay trn dy cho. 4. Nhp mt ma trn vung A cp nxn gm cc phn t nguyn, ri a ra : - Tng cc phn t trn cng mt ct. - Tng cc phn t trn cng mt dng. - Phn t ln nht cng vi cc ch s ct, dng tng ng. 5. Nhp vo ma trn A cp nxm v ma trn B cp mxp (cc phn t l s thc). Sau a ra ma trn C l tch A*B. 6. C mt tp ho n, mi ho n c ghi s tin tng ng. Hai ho n c coi l cng loi nu chng c cng s tin. Thng k xem c bao nhin loi ho n, mi loi gm c bao nhin t v s tin tng ng ca mi loi. a ra kt qu.

4 Kiu xu k t (STRING)
1. c vo mt xu, sau a ra s t ca xu cho. Quy c cc t cch nhau t nht l mt du trng (Space). 2. c vo mt xu sau a ra tt c cc t khc nhau ca xu cho. V d xu Dung dng dung d gm cc t Dung, dng v d. 3. Nhp vo mt mng h tn ca nhng ngi trong lp, sau tch tn tng ngi ct vo mt mng ring. Quy c tn l t cui cng trong xu h tn. Hy sp xp li mng h tn cho theo tn (th t t in). a ra danh sch lc cha sp xp v danh sch sau khi sp xp. 4. c vo mt xu, sau thay tt c cc xu con thc n (nu c) bng xu con lnh n. a ra xu ban u v xu sau khi thay.

5 Kiu bn ghi (RECORD)


1. Nhp vo mt danh sch N cn b gm h, tn, nm sinh, gii tnh. a ra danh sch gm s th t, h tn, nm sinh ca nhng cn b n nm 1997 tui v hu (gi s tui nam 60, n 55). 2. Mt tam gic c xem nh mt tp hp gm 3 im trn mt phng. Hy t chc d liu kiu bn ghi lu gi cc ta ca tam gic. Sau nhp vo mt tam gic. Kim tra xem tam gi cho c cc tnh cht g trong cc tnh cht di y : - Tam gic u. - Tam gic vung. - Tam gic c mt gc t. 3. Thng tin mt quyn sch gm : tn tc gi, tn sch, tn nh xut bn v nm xut bn. Nhp N quyn sch. a ra mt danh sch gm s th t, tn sch tha mn mt trong cc yu cu tm kim di y : - hoc theo tn tc gi. - hoc theo tn nh xut bn. - hoc theo nm xu bn : sch c nm xut bn gi tr nm (v d 1996) a vo.

6 Kiu tp hp (SET)
1. Gi C l tp hp cc k t ca bng m ASCII (tp hp v tr). Nhp vo hai tp hp cc k t P v Q bt k. Kt thc vic nhp ca mi tp hp l k t ESC (c m 27). a ra s cc phn t ca cc tp BP, BQ, BPQ tng ng ln lt l tp hp b ca P, tp hp b ca Q, tp hp b ca P Q.

BI TP

107

2. Nhp mt xu S v mt tp hp A gm cc ch ci A .. P v a .. p. Du hiu kt thc nhp tp hp A l mt ch s bt k. Hy : - Cho bit c bao nhiu k t ca S thuc A ? - Xy dng tp hp AS gm cc k t thuc S nhng khng thuc A. 3. Cho trc mt gi tr nguyn dng n (n 255), sau xy dng tp hp S gm cc s t 2 n n. Xa khi S nhng s khng phi l nguyn t theo thut gii sng Eratosthne. Sau a ra ni dung ca tp hp S.

7 Chng trnh con (PROCEDURE, FUNCTION)


1. Cho x thc. Xy dng hm log(a, x) tnh logarit c s a ca x. Dng hm ny tnh gi tr ca biu thc sau : log 1 x 2 (1 + x 2 ) khi x < 1 y = 0 khi x = 1 log ( x 2 1) khi x > 1 2 2. Xy dng hm UCLN (a, b) tnh c chng ln nht ca 2 s nguyn a, b. Dng hm ny tnh c chung ln nht ca mt dy cc s nguyn a1, a2... an vi gi tr n v cc a1 cho. 3. Lp th tc nhp mt a thc v th tc a mt a thc ra. Dng cc th tc ny nhp 2 a thc t bn phm, sau a ra a thc tng v a thc tch ca 2 a thc d cho. 4. Lp hm UPPER(S) chuyn ton b cc ch ci thng trong xu S thnh ch ci in tng ng v hm LOWER (S) chuyn ton b cc ch ci in trong xu S thnh ch ci thng tng ng. 5. Cho dy s nguyn a0, a1,..., an,... xc nh bng quy np nh sau : a0 = 1 an = nan-1 nu n chn (n = 2, 4, 6...) an = n + an-1 nu n l (n = 1, 3, 5...) Hy a ra gi tr an mi khi nhp vo mt s n. Chng trinh kt thc khi n 0.

8 Kiu Tp (FILE)
1. Ghi ln a mt tp cc s nguyn c nhp vo t bn phm. Du hiu kt thc l s nguyn 0. Sau khi to xong mt s tp, hy th c cc tp ny bng lnh TYPE ca DOS. 2. c cc tp s nguyn c to trong bi 1 va ri v a ra tt c cc s nguyn c c bng mt trong hai cch : - Dng hm FileSize. - Dng hm Eof. 3. To tp DIEMTHI.DAT trn a cha thng tin im thi hc k ca mi hc sinh. Mi thnh phn ca tp gm trng HoTen cha h tn hc sinh v cc trng DToan, DTin, DNN cha cc im Ton, im Tin v im Ngoi ng tng ng ca hc sinh . Du hiu kt thc nhp l a vo mt h tn rng. 4. c tp DIEMTHI.DAT va c to ra trong bi 3, sau a ra danh sch thi li l nhng hc sinh c im thi mi mn di 5 im . Danh sch bao gm s th t, h tn v tn cc mn phi thi li ca hc sinh tng ng. 5. c mt tp vn bn t a v chuyn ni dung tp ny thnh ton b ch in hay ch thng (tu theo tr li t bn phm) bng cch s dng cc hm UPPER() v LOWER() to ra trong bi 4 v chng trnh con, sau ghi tp kt qu ln a vi mt tn khc.

108

K thut lp trnh Pascal

9 Unit
1. Lp trnh th hin dng ch chy trn mn hinh. Ni dung dng ch v v tr ca dng c nhp t bn phm. Yu cu dng ch chy lin tip trn t phi qua tri theo nguyn tc vng trn. 2. Lp trnh th hin thi gian ca ng h my ln gia. Chng trnh chy lin tc cho n khi g phm ESC. Gi : xem th tc Get-time ca Unit DOS. 3. Lp trnh nhn bit c tc ng ca phm g vo. Yu cu mi khi g mt phm no th xut hin k t v m ca phm tng ng. i vi cc phm chc nng (cc phm F1, F2,... , cc phm di chuyn con tr , cc phm Home, End, PageUp, PageDown, Insert, Del), a ra m ca phm v du * km theo. Gi : lp hm Getkey tr li m ca phm c g. 4. Vit chng trnh x l chui (string) di dng menu. Yu cu s dng Unit cho mi vic. c mt cu ri lm cc vic sau : Thng k s t, s k t trong cu. Tch cu ra thnh cc t. In ra cc t ny. Nn cu (b cc khong trng gia cc t). In kt qu. Thay th nhng xut hin ca cu con S1 thnh cu con S2 v in kt qu. (S1 v S2 l cc cu con nhp vo) 5. Vit chng trnh x l ma trn vung cp n x n di dng menu, gm cc vic sau : c vo ma trn vung cp n x n. Tnh nh thc ca ma trn. Kim tra tnh i xng ca ma trn (qua ng cho chnh). Xc nh xem ma trn c dng tam gic trn khng ? (cc phn t pha di ng cho chnh u = 0) Yu cu : S dng Unit. Ba vic sau c hiu lc khi ma trn c c.

10 Cc bi ton v qun l + x l vn bn
1. 2. 3. 4. 5. 6. In ra cc ngy trong mt tun l In lch th k 1000 3000 Qun l mt tp nhp d liu bng mng, bng con tr. Lm ha n bn hng Qun l danh sch cn b In danh sch cn b

PH LC

Lm vic vi Turbo Pascal 6.0, 7.0


I. Khi ng
T du nhc lnh ca MS-DOS (C:\ > _), tm th mc cha Turbo Pascal, gi s th mc C:\TP, g : CD TP TURBO (hoc ch cn g TURBO nu c ng dn C:\TP trong lnh PATH trong tp .BAT). Turbo Pascal c khi ng sn sng lm vic. Mn hnh lm vic gm cc thnh phn : 1. H thng lnh n (Menu) 2. Ca s son tho l phn chnh ca mn hnh v c tn l tn ca tp chng trnh ang c mt trong . Khi mi khi ng, tm thi c tn NONAME00.PAS. 3. Dng lnh n ph nm di cng hay cn c gi l dng trng thi.

II. Lm vic vi h thng lnh n (Menu)


II.1. Khi ng lnh n
Cc lnh n c khi ng theo kiu y xung (Pop Up Menu) : nhn Alt hoc F10, mt vt sng (Highlight) s xut hin trn Menu. Lc ny c th dng cc phm di chuyn vt sng v tn lnh mun chn, sau nhn lm xut hin danh sch lnh tng ng.

PGS.TS. Phan Huy Khnh bin son

ii Tuy nhin, khi ng nhanh, nhn : Alt (hoc F10) + Phm i din Phm i din thng l ch ci u vit m trong mi tn lnh. V d, nhn Alt+F khi ng lnh File, Alt+E khi ng lnh Edit, v.v... tt ch chn lnh n, nhn phm Esc.

K thut lp trnh Pasca

T trong hp danh sch cc lnh (v d lnh File nh trn), dng cc phm di chuyn vt sng ln xung n tn lnh tip theo cn chn. Sau nhn Enter khi ng lnh . Tuy nhin c th nhn tn phm i din cho lnh tng ng. V d 1 m mi (New) mt tp CHTR Pascal, nhn Alt+F+N khi ng lnh FileNew (hoc Alt+F+Enter v lnh ny nm u danh sch c chn mc nhin). V d 2 xem phin bn ca Turbo Pascal, nhn Alt+H+A chn lnh Help+About. Cc lnh n trong danh sch lnh c phn thnh nhm v c quy c nh sau : - Trong mi tn lnh n c mt ch ci i din c t dm hn, V d New, Open... - Du ba chm (...) sau mt tn lnh no ch rng s c mt hp i thoi xut hin sau . - T hp phm tt (shortcut key) nm cui bn phi tn lnh (nu c). V d : Phm F3 khi ng nhanh lnh Open, F2 khi ng nhanh lnh Save, v.v... - Du nm cui tn lnh ch rng s c mt danh sch lnh cp thp hn khc.Cc tn lnh m nht (Dimmed) c ngha khng cn thc hin c (b lit).

II.2. Hp i thoi (HT)


HT xut hin khi chn mt lnh n c du ba chm (...) pha sau. HT c dng khung hnh ch nht, ni ngi s dng cung cp cc mc thng tin cn thit cho vic thc hin lnh.

Sau y l cch thao tc trn HT bng bn phm :

PH LC

iii

Phm Esc Tab Shift+Tab PageUp PageDown Cc nt lnh c bng en (shadow)

ngha Thot khi hp i thoi. Di chuyn vt sng gia cc mc theo chiu thun Di chuyn vt sng gia cc mc theo chiu nghch a vt sng trong hp danh sch ca HT ln mt dng a vt sng trong hp danh sch ca HT xung mt dng Ln mt hin th ni dung ca mt mc Xung mt hin th ni dung ca mt mc kt thc vic i thoi v thc thi lnh

II.3. Son tho CHTR


Lnh n Window : Phm Size / Move Ctrl F5 Zoom F5 Tile Cascade Next F6 Previons Shift-F6 Close Alt+F List... Alt+0 (s khng) ngha Thay i / di chuyn W Phng to-thu nh v v tr c Xp cc ca s st nhau lin tip Xp lp ca s V ca s sau V ca s trc ng ca s Xem danh sch cc ca s m, c th xo bt (Delete) Trc khi kt thc, nu chng trinh cha c c ghi ln tp : NONAME 00.PAS has been modified Save ? (C lu ct ln a khng ?) Yes (ng lu ct) Khng (khng)

Cancel (tip tc son tho)

II.4. Dch v cho chy CHTR


T chng trnh ang son tho trn ca s hin hnh, - dch : Compile Alt+F9 - chy : Run Ctrl+F9

iv

K thut lp trnh Pasca

III. Cc hm v t kho ca Turbo Pascal


a. Cc hm
Addr ArcTan Concat Cos DiskFree DosExitCode DSeg EnvStr Eoln FExpand FileSize FSearch GetColor GetDriverName GetGraphMode GetMaxMode GetMaxY GetPaletteSize GetX GraphErrorMsg Hi InstallUserDriver Int KeyPressed Ln MaxAvail Odd Ord OvrGetRetry ParamStr Pos Ptr ReadKey RegisterBGIFont SeekEof Seg SizeOf Sqr SSeg Swap TextWidth TypeOf WhereX Chr Copy CSeg DiskSize DosVersion EnvCount Eof Exp FilePos Frac GetBkColor GetDefaultPalette GetEnv GetMaxColor GetMaxX GetModeName GetPixel GetY GraphResult ImageSize InstallUserFont IOResult Length Lo MemAvail Ofs OvrGetBuf ParamCount Pi Pred Random RegisterBGIDriver Round SeekEoln Sin SPtr Sqrt Succ TextHeight Trunc UpCase WhereY

PH LC

b. Cc t kho :
and asm array begin case const constructor destructor div do downto else end exports file for function goto if implementation in inherited inline interface label library mod nil not object of or packed procedure program record repeat set shl shr string then to type unit until uses var while with xor

vi

K thut lp trnh Pasca MT S LNH SON THO THNG DNG TRN BORLAND TURBO PASCAL

1. Cc lnh nh chuyn con tr (du chn) Ctrl - S hoc Ctrl - A hoc Ctrl Ctrl - F hoc Ctrl Ctrl - E hoc Ctrl - R hoc PgUp 2. Cc lnh v khi Ctr-KB / Ctrl-KK Ctrl-KT Ctrl-KC Ctrl-KV Ctrl-KY Ctrl-KR Ctrl-KW Ctrl-KH Ctrl-KP Ctrl-KI Ctrl-KU 3. Cc lnh chn v xa Ctrl-V hoc Ins Ctrl-N Ctrl-Y Ctrl-QY Ctrl-H hoc Backspace () Ctrl-G hoc Del Ctrl-T 4. Cc lnh thng dng khc F10 Ctrl-KS hoc F2 F3 Alt-F3 Ctrl-I hoc Tab Ctrl-OT Ctrl-OI Ctrl-QL Ctrl-Kn (n = 0..9) Ctrl-Qn (n= 0..9) Ctrl-F1 Ctrl-QF Ctrl-QA Ctrl-L Esc Ctrl - D hoc Sang tri mt t Sang phi mt t Ctrl - X hoc Ctrl - C hoc PgDn Sang tri / sang phi mt k t

Cun ln / cun xung Ln trn hoc xung di mt trang mn hnh

t v tr bt u / kt thc khi la La nguyn mt t Sao (copy) khi la vo vng m Di chuyn (Move) khi la v ti v tr du chn Xa b khi la c mt khi t a vo ti du chn Ghi khi la ln a Thi nh du khi la In khi la ra my in Tht khi la vo mt ct Thi tht khi la Bt tt ch chn Chn thm mt dng mi trc dng cha du chn Xa b dng cha du chn Xa b t du chn n ht dng Xa b k t bn tri du chn Xa b k t cha du chn Xa b k t bn phi du chn Khi ng lnh n Lu ct v tip tc son tho M mi mt tp vn bn (chng trnh) ng ca s lm vic hin hnh a vo mt du tab t ch tab Bt / Tt ch tht dng t ng Khi phc dng t v tr nh du (Marker) t 0..9 Tm v tr nh du (Marker) t 0..9 Gi tr gip v ngn ng Tm kim Tm kim v thay th Lp li ln tm kim cui cng Hy b thao tc va tin hnh

PH LC

vii

TI LIU THAM KHO


[1] Jacque Arsac Nhp mn lp trnh. Nguyn bn : Premires lecons de programmation. Trung tm h thng Thng tin ISC, H ni 1991. Doug Cooper Standard Pascal User Reference Manual. W.W.Norton & Company, 1983. Jacque Courtin, Irne Kowaski Initiation lalgorithmique et aux structures de donnes. Volume 1. Dunord, Paris 1994. on Vn Doanh, Trn Khc Tun 101 thut gii v chng trnh. Nh xut bn Khoa hc v K thut, 1993. Christine Froidevaux, Marie-Claude Gaudel, Michle Soria Types de donnes et algorithmes. Ediscience International, Paris 1994 on Nguyn Hi, Nguyn Trung Trc, Nguyn Anh Dng Lp trnh cn bn. Trng i hc K thut Tp. H Ch Minh, 1992. Trn c Huyn Cc vn v lp trnh Pascal. Nh xut bn Tr, 1996. Quch Tun Ngc Ngn ng lp trnh Pascal. Trng i hc Bch khoa H ni, 1993. Walter J. Savich Pascal an Introduction to the Art and Science of Programming. The Banjamin/Cummings Publishing Company, INC., 1991.

[2] [3]

[4] [5] [6] [7] [8] [9]

[10] Scitec - Cng ty lin doanh t vn v dch v k thut. Lp trnh nng cao bng Pascal vi cc cu trc d liu. Tp 1. Ngi dch : L Minh Trung. KB, 1991. [11] Nguyn Tun Tho chng bng ngn ng Pascal. Nh xut bn Tr, 1991. [12] Niclaus Wirth Lp chng trnh h thng. Ngi dch : Phm Ngc Khi. Nh xut bn Khoa hc v K thut, 1986.

[13] Niclaus Wirth. Cu trc d liu + gii thut = chng trnh. Nguyn bn Algorithms + Data Structures = Programs. Prentice Hall, 1976. Ngi dch : Nguyn Quc Cng. Nh xut bn Gio duc, 1991.

viii

K thut lp trnh Pasca

MC LC
CHNG 1 I. II. M U 1 CHNG TRNH (PROGRAM)..................................................................................................... 1 NGN NG LP TRNH (PROGRAMMING LANGUAGE) ................................................................ 1 II.1. Khi nim v ngn ng lp trnh ......................................................................................... 1 II.2. Cc yu t ca ngn ng lp trnh....................................................................................... 2 II.3. S c php....................................................................................................................... 3 II.4. Dng BNF ............................................................................................................................ 4 III. LP TRNH (PROGRAMMING) ..................................................................................................... 5 III.1. Phn tch vn .............................................................................................................. 5 III.2. Thut gii (Algorithm)..................................................................................................... 6 III.3. Cu trc d liu............................................................................................................. 13 CHNG 2 I. CC KIU D LIU C S CA TURBO PASCAL 15 CC KIU ORDINAL ................................................................................................................ 15 I.1. Kiu s nguyn................................................................................................................... 15 I.2. Kiu logic Boolean............................................................................................................. 16 I.3. Kiu k t Char................................................................................................................... 16 I.4. Bng cc hm chun.......................................................................................................... 17 II. KIU S THC REAL ................................................................................................................. 17 III. CC PHP TON (OPERATORS)............................................................................................... 18 IV. KIU V HNG LIT K V KIU MIN CON ............................................................................ 19 IV.1. Kiu v hng lit k (Enumerated Scalar Type).......................................................... 19 IV.2. Kiu min con (Sub-range type) .................................................................................... 20 CHNG 3 I. CC KIU D LIU C CU TRC 24 KIU MNG (ARRAY) ............................................................................................................... 24 I.1. Mng mt chiu ................................................................................................................. 24 I.2. Mng nhiu chiu............................................................................................................... 26 I.3. Biu din mng trong b nh............................................................................................. 27 II. XU K T (STRING)................................................................................................................ 29 II.1. Khi nim........................................................................................................................... 29 II.2. Cc php ton trn xu ...................................................................................................... 29 II.3. V d................................................................................................................................... 32 III. KIU TP HP (SET TYPE) ......................................................................................................... 33 III.1. Khi nim....................................................................................................................... 33 III.2. Khai bo tp hp ........................................................................................................... 33 III.3. Cc php ton trn tp hp ........................................................................................... 34 III.4. Biu din cu trc tp hp trong my ........................................................................... 37 IV. CU TRC KIU BN GHI (RECORD).......................................................................................... 38 IV.1. c t kiu bn ghi........................................................................................................ 38 IV.2. Bn ghi thay i............................................................................................................. 40 CHNG 4 I. CHNG TRNH CON (SUBPROGRAM) 45 KHI NIM .............................................................................................................................. 45 I.1. Th no l chng trnh con ?........................................................................................... 45 I.2. Dng CTC khi no ? .......................................................................................................... 45 I.3. Khai bo chng trnh con ................................................................................................ 46 II. CCH DNG TH TC V HM................................................................................................. 48 II.1. Khi nim v khi v phm vi ............................................................................................ 49 II.2. V d................................................................................................................................... 52

PH LC

ix

III. KIU TH TC (PROCEDURAL TYPE) ........................................................................................ 54 III.1. Khi nim....................................................................................................................... 54 III.2. V d............................................................................................................................... 54 CHNG 5 I. CU TRC TP (FILE) 57 CU TRC TP TUN T ............................................................................................................ 57 I.1. Khi nim v dy (sequence) ............................................................................................. 57 I.2. Cc thao tc c bn trn tp.............................................................................................. 58 I.3. Truy cp trc tip............................................................................................................... 59 II. CC TP VN BN (TEXT FILES) .............................................................................................. 63 II.1. Khi nim........................................................................................................................... 63 II.2. Vora trn cc tp vn bn chun ..................................................................................... 63 II.3. Mt s v d........................................................................................................................ 64 CHNG 6 I. II. CU TRC D LIU NG (DYNAMIC DATA STRUCTURE) 67 KHI NIM .............................................................................................................................. 67 THAO TC I VI CON TR ..................................................................................................... 69 II.1. Php gn gia cc con tr cng kiu................................................................................. 69 II.2. Gii phng vng nh ......................................................................................................... 69 II.3. Php ton ly a ch @..................................................................................................... 69 III. NG DNG CA CON TR. DANH SCH LIN KT ..................................................................... 70 CHNG 7 I. K THUT LP TRNH 73 PHT TRIN CHNG TRNH BNG TINH CH TNG BC ........................................................ 73 I.1. Ni dung phng php ...................................................................................................... 73 I.2. V d minh ho ................................................................................................................... 73 I.3. Sa i chng trnh ......................................................................................................... 83 II. CC THUT GII QUI............................................................................................................ 84 II.1. Khi nim v quy........................................................................................................... 84 II.2. iu kin dng th tc qui ............................................................................................ 87 II.3. Nhng v d v th tc qui ............................................................................................ 89 III. N V TRONG TURBO PASCAL ............................................................................................ 101 III.1. Gii thiu Unit............................................................................................................. 101 III.2. Cu trc ca Unit ........................................................................................................ 102 III.3. Cch s dng Unit....................................................................................................... 103 III.4. V d v Unit................................................................................................................ 103 BI TP LAM VIC VI TURBO PASCAL 6.0, 7.0 I. II. 104 I

KHI DNG ................................................................................................................................. I LAM VIC VI H THNG LNH DN (MENU)............................................................................... I II.1. Khi ng lnh n............................................................................................................... i II.2. Hp i thoi (HT)............................................................................................................ ii II.3. Son tho CHTR ................................................................................................................. iii II.4. Dch v cho chy CHTR ..................................................................................................... iii III. CC HM V T KHO CA TURBO PASCAL ............................................................................ IV TI LIU THAM KHO MC LC VII VIII

You might also like