Professional Documents
Culture Documents
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.
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
M u
Tn (Identifier) Read, Write, P, x, y Hng (Constant) 2 Ton t (Operator) +, := Du phn cch Program var : ( ) begin end. (Delimiter)
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
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.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.
M u
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.
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.
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...
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
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
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
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
...
Sn
12
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 ?
K ? ng
S
Sai
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
14
M u
15
CHNG 2
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
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 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'
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
18
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 <
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 }
20
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;
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
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 ;
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
CHNG 3
I.1.
Mng mt chiu
Type T = array [I ] of T0 ;
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
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
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.
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 ;
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.
28
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.
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;
30
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);
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
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.
33
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
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.
35
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
{ 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
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 ;
37
var
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.
38
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
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
...
40
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;
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.
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
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.
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 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.
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).
45
46
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.
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
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;
48
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);
50
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}
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 :
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
C var x: integer; P3(x: integer): ... x:=1; ... ... x:=0; P3(x); writeln(x); {x=0} ...
52
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.
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
b1
t t + mt false
t t + lm
t t + nm
Ra
54
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
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
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
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.
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;
57
58
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.
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.3.
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
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.
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
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
64
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
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
67
68
Khi Ptr khng tr ti i tng no, ta vit : Ptr := nil; nil l t dnh ring ca Pascal. Ptr : ^T Ptr^ : T
Ptr
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
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.
70
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).
71
Pni
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
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.
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
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.
76
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
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
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
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
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
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 = 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
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.
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
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
0! = 1 1! = 1 0! = 1 2! = 2 1! = 2 3! = 3 2! = 6 4! = 4 3! = 24 5! = 5 4! = 120 Stack
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
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.
90
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
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
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 :
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
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
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
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 (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.
102
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...
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
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.
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...
(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.
106
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.
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.
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
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
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.
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).
PH LC
iii
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
iv
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
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
[2] [3]
[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
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