B ng các hàm chu n gtr đ i Integer Real Boolean Char File succ abs sqr trunc round cos arctan ln exp sqrt sin cos arctan ln exp sqrt sqr abs succ eof eoln succ II... Xâu kí t String II.1
Trang 1PGS.TS PHAN HUY KHÁNH biên so n 1
M đ u
Ch ng trình (CHTR) là dãy liên ti p các l nh (instructions, commands), hay các câu
l nh (statements) Ch y ch ng trình (run hay execute) là cho máy tính th c hi n l n l t
các l nh c a CHTR M t CHTR đang ch y t o ra m t ti n trình (process)
Các ti n trình th ng có các tính ch t sau :
1 Các l nh c a CHTR đ c th c hi n m t cách tu n t (sequantial), h t m t l nh l i
th c hi n l nh k ti p
2 M t ti n trình luôn luôn có k t qu (result) K t qu đ c đ a ra trong khi th c hi n
CHTR ho c sau khi đã th c hi n xong K t qu có th đúng ho c sai Thông th ng
k t qu đ c in (print) ra trên gi y ho c hi n th (display) lên màn hình
3 CHTR th ng đòi h i d li u (data) Các d li u có th đ c đ a vào tr c ti p trong
khi ch y CHTR, ho c t các thi t b ngoài nh bàn phím (keyboard), đ a t (disk),
b ng t (tape) , nh ng c ng có th đã đ t s n đâu đó trong CHTR
4 M t s l nh dùng đ mô t (declare) d li u c a CHTR Trong m t s ngôn ng ,
ng i l p trình (NLT) ph i đ t các l nh này ph n đ u c a CHTR đ máy s d ng
ph n sau
5 M t s l nh d n đ n s quy t đ nh (decision) s th c hi n nhóm l nh nào ti p theo
Ví d , khi gi i m t ph ng trình b c 2, n u bi t s Δ âm s tr l i ph ng trình
không có nghi m th c, ng c l i, th c hi n các l nh tính nghi m th c Th c t , NLT
không bi t lúc ch y CHTR, bi t s Δ là âm, d ng hay tri t tiêu ?
6 M t s l nh đ c th c hi n l p đi l p l i nhi u l n NLT có th bi t tr c ho c không
bi t tr c s l n l p NLT c ng có th n đ nh vi c l p đ c b t đ u nh th nào
II Ngôn ng l p trình (programming language)
II.1 Khái ni m v ngôn ng l p trình
Ngôn ng l p trình (NNLT) là công c đ con ng i giao ti p v i máy tính Trong Tin
h c, l nh v c xây d ng và phát tri n các ngôn NNLT luôn luôn đ t ra nh ng v n đ m i
Ng i ta th ng chia ra hai lo i NNLT : ngôn ng b c th p (low-level programming
language) và ngôn ng b c cao (high-level programming language)
Ngôn ng b c th p g m ngôn ng máy (machine language) và h p ng (assembly
language) Trong m t CHTR vi t b ng ngôn ng b c th p, m i câu l nh ch t ng ng v i
m t thao tác s c p c a b x lý Vì v y, l p trình trên các ngôn ng b c th p r t phi n ph c
và d nh m l n
Trang 2Ngôn ng b c cao ph ng theo ngôn ng Toán h c và g n g i v i ngôn ng t nhiên L p trình trên các ngôn ng b c cao tho i mái h n và ít nh m l n h n do s d ng nh ng câu l nh
g n g i v i l i gi i bài toán, d ki m tra, d s a, v.v
Hi n nay có r t nhi u ngôn ng b c cao đã đ c phát tri n, m i ngôn ng đ c tr ng cho
m t phong cách, m t tr ng phái l p trình Vi c ch n m t NNLT nào đó ph thu c vào tính
ch t c a bài toán đang gi i và nhi u khi, ph thu c vào thói quen c a NLT
Khi th c thi m t CHTR vi t trên m t ngôn ng c p cao, b x lý ph i chuy n đ i CHTR này sang d ng m t CHTR b ng ngôn ng máy t ng đ ng M t CHTR th c hi n ch c
n ng này g i là ch ng trình d ch (compiler)
CHTR vi t trên m t ngôn ng c p cao đ c g i là ch ng trình ngu n (source program)
CHTR đã đ c d ch sang d ng ngôn ng máy t ng đ ng đ c g i là ch ng trình đích
(object program)
Máy th c hi n ch ng trình đích cùng v i các d li u nh p (input data) đ cho ra k t
qu
Khi ch y CHTR có th gây ra l i (error) L i sinh ra khi d ch đ c g i là l i th i gian
d ch (compile-time error) L i sinh ra khi ch y CHTR đ c g i là l i th i gian th c hi n
(run-time error)
Ngoài ra có th có các l i do sai sót v thu t gi i ho c do sai sót v d li u nh p
II.2 Các y u t c a ngôn ng l p trình
Các NNLT b c cao đ c t o thành t ba y u t : b kí t , b t v ng và cú pháp
II.2.1 B kí t (Character Set)
G m các kí t đ c phép dùng trong ngôn ng Các máy vi tính IBM và t ng thích
th ng s d ng các kí t ASCII Có th hi u b kí t có vai trò nh b ng ch cái (alphabet)
c a m t ngôn ng t nhiên
CHTR d ch CHTR ngu n
Trang 3II.2.2 B t v ng (Vocabulary)
G m các t (word) hay đ n v t v ng (token) dùng đ t o thành câu l nh và đ c phân
lo i tu theo vai trò c a chúng trong ngôn ng M i lo i l i đ c chia ra thành các nhóm nh
D u phân cách Program var : ( ) begin end
(Delimiter)
II.2.3 Cú pháp (Syntax)
Cú pháp c a m t NNLT quy đ nh cách th c k t h p các kí t thành t , k t h p các t thành câu l nh đúng, k t h p các câu l nh đúng thành m t ch ng trình hoàn ch nh v m t
v n ph m (grammaire) Có th hình dung cách k t h p này gi ng cách đ t câu trong m t ngôn ng t nhiên
Th ng ng i ta dùng s đ cú pháp (syntax diagram) ho c d ng chu n Backus-Naur
Ví d : program, begin, end
Khung ch nh t : ch a các ký hi u không k t thúc (non-terminal symbol) là nh ng khái
ni m đ c đ nh ngh a qua nh ng ký hi u k t thúc và/ho c không k t thúc khác
Ví d : identifier (tên), program (ch ng_trình), file_name (tên t p)
ng n i : là các đ ng có m i tên đ ch th t xu t hi n c a các ph n t khung tròn, hay ch nh t
Ví d : Tên trong các NNLT th ng có s đ cú pháp nh sau :
T đó có th xây d ng các tên đúng nh : Delta, x1, x2, Sqrt, bánkính v.v Trái l i,
các chu i kí t sau đây đ u không ph i là tên :
Trang 5III L p trình (programming)
Ngôn ng l p trình m i ch là công c đ NSD đi u khi n máy theo ý mu n, còn vi c s
d ng công c này nh th nào cho có hi u qu thì l i tu thu c vào k thu t l p trình c a
m i ng i
L p trình là vi c vi t ch ng trình trên m t ngôn ng l p trình c th nào đ gi i quy t
m t v n đ nào đó l p trình, ph i trãi qua 4 b c :
1 Phân tích v n đ c n gi i quy t : N i dung v n đ là gì ? Ph i làm gì ?
2 Xây d ng thu t gi i và c u trúc d li u đ gi i quy t v n đ
(làm nh th nào ?) Công th c c a Niclaus Wirth :
Algorithms + Data Structures = Programs
Ngh a là : Thu t gi i + C u trúc d li u = Ch ng trình
3 Vi t ch ng trình trên m t ngôn ng đã l a ch n, ví d Turbo Pascal
4 Ch y th ch ng trình, s a sai, hoàn thi n, cài đ t và đem vào ng d ng
III.1 Phân tích v n đ
Có nhi u ph ng pháp phân tích v n đ Th ng s d ng ph ng pháp phân tích t trên
xu ng (Top-Down Analysis) N i dung ph ng pháp là chia v n đ c n gi i quy t thành các
v n đ nh h n, m i v n đ đó l i đ c ti p t c chia thành các v n đ nh h n n a, v.v cho đ n khi đó là nh ng công vi c đ n gi n và d gi i quy t
Ví d : Phân tích bài toán c ng hai phân s đ đ a v bài toán tìm c s chung l n nh t c a hai s nguyên
c ng hai phân s , tr c tiên c n c l c chúng ( LPS), sau đó quy đ ng m u s (Q MS) C ng hai t s c a hai phân s đã quy đ ng đ đ c t s L y m u s chung
Trang 6Vi c c l c phân s đ c đ a v tìm c s chung l n nh t c a t s và m u s quy đ ng m u s , c n tìm b i s chung nh nh t (BSCNN) Vi c tìm b i s chung nh nh t
c a hai s l i đ c đ a v tìm c s chung l n nh t c a chúng :
BSCNN(b’, d’) = b’ * d’ / SCLN(b’,d’)
tìm c s chung l n nh t, s d ng thu t gi i Euclide
III.2 Thu t gi i (Algorithm)
III.2.1 Khái ni m v thu t gi i
Thu t gi i, hay còn g i là thu t gi i (gi i thu t), là t p h p đ c tr ng các trình t logic và toán h c đ n gi n, đ c xác đ nh rõ ràng, đ theo đó gi i quy t m t v n đ v i m t s b c
B c 3 : So sánh Max v i b, n u Max nh thua b thì Max l y giá tr b : Max = b
B c 4 : So sánh Max v i c, n u Max nh thua c thì Max l y giá tr c :
Max = c
B c 5 : In k t qu là Max
Có th hình dung vi c tìm Max qua các bi u th c d ng hàm nh sau :
Max (a, b, c) = Max(Max (a, b), c), trong đó :
Max ( a, b) = if a>b then a else b
Có th hi u thu t gi i là ph ng pháp gi i m t bài toán b ng cách chia nh bài toán đó thành nh ng thao tác đ n gi n, d th c hi n và có trình t h p lý
Các b c đ làm m t món n, đ s p x p đ v t theo th t , đ gi i m t ph ng trình toán h c, v.v đ u có th coi là nh ng thu t gi i
Không th có trình t th c hi n gi ng nhau cho m i thu t gi i M t thu t gi i ph i tho mãn ba đi u ki n sau đây :
a⎯
b + c⎯d
a” ⁄ M + b” ⁄ M
SCLN(b’, d’)BSCNN(b’, d’)
Q MS(a’ ⁄ b’, c’⁄d’)
SCLN(a/b) SCLN(c/d)LPS(a ⁄ b) LPS(c ⁄ d)
Trang 71 Các thao tác có tính kh thi (th c hi n đ c trên máy) và có trình t
xác đ nh
2 M i thao tác ph i c th , rõ ràng và ch đ c hi u theo m t ngh a
duy nh t
3 Thu t gi i ph i k t thúc sau m t s h u h n b c
Vi c gi i quy t m t bài toán có th có nhi u thu t gi i khác nhau M i thu t gi i l i có
th có hi u qu nh nhau cho m t l p các bài toán Ví d , có nhi u thu t gi i đ s p x p m t
III.2.2 Các công c đ trình bày thu t gi i
Có hai công c ph bi n : l u đ và ngôn ng gi
a L u đ (Flowchart)
L u đ hay s đ kh i là s đ ch a các hình ký hi u đ i di n cho các thao tác c n ph i làm Trong s đ , các hình đ c n i v i nhau b i các m i tên ch trình t th c hi n các thao tác
L u đ g m các hình c b n sau :
ánh d u b t đ u và k t thúc thu t gi i
Nh p / xu t d li u
X lý (tính toán) d li u Quy t đ nh r nhánh Các h ng r nhánh
ho c
Trang 8úng
K t thúc
In Max Max < c
x1 = (-b - SQRT(Δ))/2/a x1 = (-b - SQRT(Δ))/2/a
úng Sai
K t thúc
D = 0
Trang 9Sau đây là m t s quy đ nh c a ngôn ng gi :
B kí t là t p kí t ASCII và các ch cái có d u ti ng Vi t đ ti n theo dõi
B t v ng đ c xây d ng b ng cách ghép các kí t thu c t p h p kí t và b t đ u
ph i b ng ch
Có hai lo i t :
− T khoá (Keyword) là t dành riêng đ ch m t l nh (m t thao tác)
Trong ph n đ u giáo trình, các t khoá đ c in ch đ m đ d phân bi t
Ví d : Program, begin, end
− Tên là t do NSD t đ t
Tên xác đ nh đ a ch c a m t vùng nh ch a d li u trong b nh trong
Ki u d li u (Data Type) ch đ nh m t l p các giá tr d li u mà máy có th x lý
Ví d : ‘This is a string’, ‘ i h c à n ng, 17A Lê Du n’, ‘ ‘ (chu i r ng)
− Ki u logic, hay lu n lý, ch g m hai giá tr True (1) và False (0)
H ng, bi n và hàm đ c tr ng b i tên g i, ki u d li u và giá tr
− H ng (Constant) là đ i l ng không đ i trong quá trình th c hi n CHTR
− Bi n (Variable) là đ i l ng thay đ i trong quá trình th c hi n CHTR
− Hàm (Function) là m t CHTR con đã đ c l p s n và c đ t tên, khi c n ch vi c
g i tên, cung c p tham đ i đ tr v m t giá tr
Trong ngôn ng gi có s d ng các dòng chú thích (Comment) đ t gi a hai d u {} ho c
c p d u (* *) nh m m c đích d theo dõi, không có tác d ng gì đ i v i các l nh c a thu t
gi i
Trang 10Ví d :
S d ng ngôn ng gi , có th vi t l i các thu t gi i trên nh sau :
Program TìmMaxC a3S
begin
c (a, b, c) Max = a
if Delta < 0
then In (‘Ph ng trình vô nghi m.’)
else if Delta = 0 then x1_2 = -b/2/a
In (‘Ph ng trình có nghi m kép x = ’, x1_2)
else begin
x1 = (-b + SQRT(Delta))/2/a x2 = (-b - SQRT(Delta))/2/a
In (‘Ph ng trình có hai nghi m :’)
In (‘x1 = ‘, x1) ; In (‘x2 = ‘, x2)
end end { Gi iPh ngTrìnhB c2 }
Trang 11III.2.3 Các l nh dùng trong thu t gi i
Các l nh trong thu t gi i có hai lo i :
các l nh không mang tính đi u khi n, ví d l nh gán và các l nh vào - ra
D u := là d u gán b ng c a Pascal, tuy nhiên có th vi t =, ho c ←
Bên trái d u gán ch có th là m t tên bi n <Bi n> Bên ph i d u gán là m t bi u th c
<Bi u th c> Máy tính giá tr c a bi u th c và gán cho bi n, giá tr c c a c a bi n b xoá
N u trong bi u th c có các tên bi n khác xu t hi n thì các bi n này ph i có giá tr tr c khi
c a a), dùng m t bi n trung gian t theo m t trong hai cách nh sau :
S1
.
Sn
Trang 12C u trúc đi u khi n L u đ t ng đ ng Mô t
N u K không tho mãn (sai) thì th c hi n S2
4 L a ch n (Selection)
case
K1 : S1 K2 : S2
Kn : Sn endcase
N u K1 đúng thì th c hi n S1
N u không, n u K2 đúng thì th c hi n S2 v.v
S2 S1
K ? úng
Sai
S
K ? úng Sai
S
K ? úng
úng
úngSai
K2 ?
Kn ?
Trang 13III.3 C u trúc d li u
Nh đã th y, thu t gi i ch ph n ánh các thao tác c n x lý, còn đ i t ng đ x lý trên
máy l i là d li u (Data) D li u bi u di n các thông tin c n thi t cho bài toán, g m các d
li u đ a vào, các d li u đ a ra và các d li u tính toán trung gian
D li u và thu t gi i có m i quan h v i nhau : nói đ n thu t gi i là nói đ n thu t gi i đó tác đ ng lên d li u nào Còn nói đ n d li u là nói đ n d li u y c n đ c tác đ ng b i thu t gi i nào đ đ a đ n k t qu mong mu n
B n thân các d li u th ng có m i quan h v i nhau Cách t ch c d li u sao cho phù
h p v i bài toán c n gi i quy t chính là vai trò c a l nh v c c u trúc d li u (Data
Structure) C u trúc d li u liên quan đ n ba v n đ : ki u d li u, các phép tóan tác đ ng lên d li u và cách bi u di n d li u trong b nh c a máy tính
III.3.1 Ki u d li u
M i NNLT th ng có hai ki u d li u : ki u d li u c s và ki u d li u có c u trúc
Ki u d li u c s có th là ki u s , ki u kí t và ki u logic Tu theo bài toán mà ki u d
li u nào thì đ c s d ng T ki u d li u c s , ng i ta xây d ng các ki u d li u ph c
t p h n b ng cách liên k t chúng l i v i nhau theo m t c u trúc nào đó
Ví d , trong h u h t các NNLT đ u có c u trúc m ng (Array) là m t dãy các ph n t d
li u có cùng ki u và có s l ng n đ nh M i ph n t c a m ng có th là ki u c s nh ng
c ng có th là ki u có c u trúc
C u trúc ki u b n ghi (Record) là s m r ng c a khái ni m m ng M i b n ghi g m nhi u thành ph n, m i thành ph n còn g i là m t tr ng (Field) có ki u d li u xác đ nh khác nhau
Ví d , trong qu n lý cán b , có th hình dung m i b n ghi mô t m t cán b g m các
tr ng H _tên, Ngày_sinh, L ng_c _b n, v.v Tr ng H _tên có ki u kí t ; tr ng Ngày_sinh l i là m t ki u b n ghi đ c đ nh ngh a g m 3 tr ng Ngày, Tháng và N m cùng
ki u s nguyên ; tr ng L ng_c _b n có ki u s th c
Chính vì s phong phú c a các bài toán th c ti n mà máy tính ph i gi i quy t trên nh ng
d li u phi s (Non-numerical) có c u trúc đa d ng
III.3.2 Các phép tóan trên d li u
V i m i c u trúc, c n ph i xây d ng các phép toán trên đó : phép t o l p hay hu b m t
c u trúc, phép truy c p vào t ng ph n t c a c u trúc đ xem hay s a đ i, phép b sung hay
Nh v y, m i khi xây d ng m t c u trúc d li u thì đ ng th i ph i xây d ng các phép toán kèm theo ây là hai m t c a m t v n đ
Trang 15Trong đó T là tên ki u (identifier), AnyType là ki u b t k đ c đ nh ngh a t m t trong
9 l p ki u sau đây : ordinal, real, string, array, set, record, file, object, pointer
Có 7 ki u th t ti n đ nh ngh a (ordinal predefined) là : Shortint, Integer, Longint, Byte, Word (5 ki u s nguyên), Boolean và Char Hai ki u do NSD t đ nh ngh a là ki u li t kê (enumerated) và ki u mi n con (subrange)
S các giá tr khác nhau c a ki u T là b n s (cardinality) c a T, ng i ta th ng ký hi u Card (T)
Trang 16Trong đó, maxint là tr nguyên l n nh t máy có th bi u di n đ c Trong Turbo Pascal,
có hai h ng chu n là MaxInt = 32 767 và MaxLongint = 2 147 483 647
Các ki u ordinal nguyên nh sau :
Ki u Boolean ch có hai giá tr là false, true, đ c đ nh ngh a nh sau :
type Boolean = (False, True);
Ki u Char g m các kí t ASCII Hai hàm chu n ki u Char là Ord và Chr :
Trang 17I.4 B ng các hàm chu n
gtr đ i Integer Real Boolean Char File
succ abs sqr
trunc round
cos arctan
ln exp sqrt
sin cos arctan
ln exp sqrt sqr abs
succ
eof eoln
succ
II Ki u s th c Real
Trong m t CHTR Pascal, bi n th c (real variable) đ c dùng đ l u tr các giá tr th c
Tu theo máy mà mi n giá tr (range) b h n ch nh t p các s nguyên
Khi gi i quy t các bài toán khoa h c, có th t n t i nh ng s r t bé ho c r t l n, ví d ,
tr ng l ng c a m t electron là :
0.000 000 000 000 000 000 000 000 000 091 095 600 gram
D ng khoa h c (d ng m ) c a s này là 9.10956 × 10−28 gram Trong ngôn ng Pascal,
s này có d ng 9.10956E−28
Turbo Pascal có 5 ki u s th c nh sau :
M i bi n th c đ c xác đ nh b i hai y u t : mi n giá tr và đ chính xác (precision)
Mi n giá tr cho bi t đ l n c a s đ c l u tr chính xác cho bi t s s l có ý ngh a sau d u ch m th p phân
Trang 18III Các phép toán (Operators)
Các phép toán c a Turbo Pascal nh sau :
DIV Division
MOD Modulo
SHL Bitwise shift-left
SHR Bitwise shift-right
Các phép quan h sau đây tr v giá tr Boolean :
= Equal Ordinal, real, string, set, pointer
>= Greater than or equal Ordinal, real, string, set
Giá tr tr v c a phép IN
IN Member of True n u toán h ng bên trái (ki u ordinal) là m t ph n
t c a toán h ng bên ph i (ki u t p h p) False n u không
Ví d : Tính c n b c hai c a m t s d ng (s = √⎯n ) theo ph ng pháp Newton không s
s2 − 1 ε
Trang 19{ Ch ng trình đ c vào m t s và in ra giá tr c n b c hai g n đúng t ng ng cho đ n khi đ c vào s 0 }
write(’D c vào m t s n = ’);readln(n);
if n<0 then writeln(’#7Vào sai d li u !’)
else begin
s:=1;
repeat s:=(n/s+s)/2 until abs(n/sqr(s)-1)< epsilon;
writeln(’C n b c hai = ’, s:14:6) end
until n = 0;
readln
end {Tính_c n_b c_2 }
IV Ki u vô h ng li t kê và ki u mi n con
IV.1 Ki u vô h ng li t kê (Enumerated Scalar Type)
Ki u vô h ng li t kê đ c đ nh ngh a là t p h p các h ng có th gán cho các bi n thu c
lo i vô h ng li t kê :
Type T = (C1, C2, , Cn) ; Các Ci, v i i = 1 n đ c s p x p theo th t t nhiên T không là ki u s và không có
c u trúc Card(T) = n, Ci ≠ Cj n u i ≠ j
Ví d :
Type
Màu = (đ , dacam, vàng, l c, lam, chàm, tím);
Sex = (male, female);
Boolean = (false, true);
Ki u li t kê là đ m đ c Ta c ng có hai hàm pred (x), succ (x) xác đ nh b i :
(Ci < Cj) ≡ (i<j) Succ(Ci) = Ci+1 Pred(Cj) = Ci−1
Trang 20Hàm Ord (x) cho v trí c a x trong T V trí đ u tiên c a ki u li t kê có giá tr 0
Ta có :
Ord (đ ) = 0, Ord(false)=0 Ord(male) = 0
Ord (vàng) = 2, Ord(true)=1 Ord(female) = 1
Các bi n ki u li t kê đ c dùng trong các vòng l p có tham bi n Ví d :
IV.2 Ki u mi n con (Sub-range type)
Ki u mi n con đ c đ nh ngh a b i hai h ng là c n trên (upper bound) và c n d i (lower bound)c a các giá tr thu c ki u này
Type T = min max ; min và max là c n d i và c n trên t ng ng (hay là hai gi i h n) c a ki u mi n con T, tho mãn b t đ ng th c min ≤ max
N u không c n tên ki u T, có th khai báo tr c ti p :
Var x1, , xm : min max ;
Còn y:= 2001; l:= “a” ; t:= 205; là không h p l
T t c các hàm dùng cho các ki u ordinal đ u có th s d ng cho ki u mi n con t ng
ng Giá tr tr v c a hàm không nh t thi t ph i n m trong các c n c a ki u tham đ i Ví d giá tr c a sqr(t) có th v t quá c n trên 200
Các th t c Read và Write có th có tham đ i ki u mi n con ki u nguyên hay ki u kí t
Ki u mi n con th ng đ c dùng đ ki m tra t đ ng các c n giá tr cho phép, tránh gây ra sai sót khi l p trình
Vi d 1 : tính s ngày c a tháng b t k trong n m
Trang 21Type ds_tháng = (giêng, hai, ba, t , n m, sáu, , m i_hai);
giêng,ba,n m,b y,tám,m i,m i_hai: s _ngày:= 31;
t , sáu, chín, m i_m t: s ngày := 30;
hai: if (n m mod 4 = 0) and (n m mod 100 <> 0)
then s ngày := 29 else s ngày := 28 end {case }
chú_thích B qua m i kí t G p '}' chuy n qua l i tr ng thái chép_l i
Tuy nhiên, do các kí t ‘{‘ và ‘}’ có th không có trên m t s bàn phím, nên Pascal c ng
s d ng hai c p kí t '(*' và '*)' đ phân cách các câu chú thích Do đó ph i thêm vào 2 tr ng thái m i là :
Trang 22b t_đ u_chú_thích: X _lý_b t_đ u_chú_thích chú_thích : X _lý_chú_thích
k t_thúc_chú_thích: X _lý_k t thúc_chú_thích end (*case*)
t := chép_l i end else write ('(') ; (* không đ i tr ng thái *)
Trang 23chép_l i : (*X _lý_chép_l i*)
if c = '(' then t := b t_đ u_chú_thích else write (c);
b t_đ u_chú_thích: (*X _lý_b t_đ u_chú_thích*)
if c = '*' then t := chú_thích else if c <> '(' then begin write ('(') ; (*chép l i '(' v a đ c *) write (c) ;
t := chép_l i end
else write ('(') ; (* không đ i tr ng thái *) chú_thích : (*X _lý_chú_thích*)
if c = '*' then t := k t_thúc_chú_thích;
k t_thúc_chú_thích: (*X _lý_k t thúc_chú_thích*)
if c = ')' then t := chép_l i else if c < > '*' then t := chú_thích end (*case*)
end (*Lo i_b _chú_thích*)
Trang 24Ki u ch s có th là ki u char, ki u boolean, ki u li t kê ho c ki u mi n con
Phép toán c b n trên m ng là truy c p tr c ti p, hay truy c p ng u nhiên (random access) đ n t ng v trí c a m ng đ có th tìm ra ph n t v trí đó, hay đ có th l u tr d
li u t i v trí đó
M i m ng đ c ký hi u b i m t bi n mà giá tr c a nó là t p h p các ph n t t o nên
m ng truy c p đ n m ng, ng i ta thêm vào tên m ng m t hay nhi u ch s đ đ c t v trí c a ph n t đó trong m ng
N u ch có m t ch s đ ng sau tên m ng, m ng đ c g i là m ng m t chi u
(one-dimensional), nh ng m ng c n nhi u ch s đ c g i là m ng nhi u chi u
khai báo bi n x có ki u T :
Var x : T ;
N u không c n tên ki u T, có th khai báo tr c ti p :
Var x : array [I ] of T0; truy c p đ n m t ph n t th i (v i mô t var i:I;)c a m ng x, ta vi t tên m ng r i ch
s đ t gi a c p d u móc : x[i]
Ví d 1 :
Type
Trang 25dãy_s _th c = 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 : d y s th c ; w1, w2 : Plan ;
k : array [char] of Integer ;
b : array [boolean] of Byte ;
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 ;
Ví d 3 : c vào t bàn phím các kí t b t k cho đ n khi gõ vào d u (.)
Ch ng h n đ c vào dãy : a10bq012034C
thì in ra : S ch s 0 là 3
S ch s 1 là 1
S ch s 2 là 1
v.v
Phác ho l i gi i nh sau : c n 10 bi n nguyên count0, count1, , count9 đ đ m s các
ch s 0 9 t ng ng Tuy nhiên, t t nh t nên dùng m t m ng s g m 10 ph n t Ta dùng
ch s ki u char đ đ m t 0 tr đi M ng s đ c mô t nh sau :
Trang 26Type sequency10 = array['0' '9'] of integer ;
for c := '0' to '9' do
writeln('S ch s ', C,‘ là : ', s[c]:2)
end
I.2 M ng nhi u chi u
Khi ki u ph n t c a m ng l i là ki u m ng, ta đ c m ng nhi u chi u
Type T = array [I1 ] of array [I2 ] of T0 ;
trong đó I1 và I2 có ki u ch s , các ph n t có ki u c s T0 khai báo bi n x có ki u
T :
Var x : T ;
N u không c n tên ki u T, có th khai báo tr c ti p :
Var x : array [I1] of array [I2 ] of T0;
Ví d : Type
Ma_tr n = aray [1 10] of array [1 15] of real ;
Var a : Ma_tr n ;
Trang 27Trong ví d trên, ma tr n a có 10 ph n t [1], a[2], , a[10] mà m i ph n t a[i], i=1 10,
I.3 Bi u di n m ng trong b nh
I.3.1 Bi u di n m ng m t chi u
Trong b nh , tu theo ki u d li u c a m ng mà m i ph n t có th đ c bi u di n trên
m t t nh (word) g m m t ho c nhi u byte Gi s m i ph n t c a m ng A c n w byte đ
l u tr G i base(A) là đ a ch c a byte đ u tiên (base address) Khi đó, ph n t th i c a
m ng A đ c l u tr trong w byte b t đ u t đ a ch :
base(A) + (i − 1)w
Ví d 1 : N u ch s c a A là nh ng s nguyên thu c m t mi n con min max, thì đ a ch
c a ph n t A[i] đ c xác đ nh theo công th c :
base(A) + (i − min)w
vì A[i] v trí th (i − min + 1) c a m ng
Ví d 2 : N u ch s c a A thu c ki u b t k , ta c ng có th áp d ng d dàng quy t c tính đ a
ch Gi s m ng Count ch a các s nguyên 2 byte đ c khai báo nh sau :
Type Frequency = array [‘A’ ‘Z’] of integer;
Var Count : Frequency; ch : char;
khi đó Count[ch] v trí th i = (ord(ch) − ord(‘A’) + 1) c a m ng và đ c l u tr b t đ u t byte có đ a ch là :
base(Count) + i -1 = base(Count) + (ord(ch) − ord(‘A’)) * 2
Trang 28I.3.2 Bi u di n m ng nhi u chi u
Gi s cho m ng hai chi u M đ c khai báo nh sau :
Type Matrix = array [1 3,1 4] of integer;
Var M : Matrix; i : 1 3; j : 1 4;
M ng M có th l u tr theo th t hàng (h t hàng n đ n hàng kia), ho c theo th t c t
(h t c t n đ n c t kia), b t đ u t byte có đ a ch base(M) ( đây, w = 2) :
M t cách t ng quát, n u m ng hai chi u M g m m hàng, n c t, có các ch s thu c các
mi n con ki u nguyên đ c khai báo nh sau :
array [min1 max1, min2 max2] of component;
trong đó : component là ki u ph n t c a M s d ng w byte nh đ bi u di n,
m = max1 − min1 + 1, n = max2 − min2 + 1
Gi s M đ c l u tr theo hàng, đ a ch b t đ u c a ph n t M[i, j] là :
base(M) + ( (i − min1) * n + (j − min2)) * w
T ng t , ta có th l p công th c d ch đ a ch cho m ng 3 chi u Ví d xét m ng ba chi u B đ c khai báo t ng quát 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à ki u ph n t c a M s d ng w byte nh đ bi u di n,
m = max1 − min1 + 1,
n = max2 − min2 + 1,
p = max3 − min3 + 1
a ch b t đ u c a ph n t M[i, j] là :
base(M) + ( (i − min1) * n * p + (j − min2) * p + (k − min3)) * w
Các công th c tính đ a ch cho các m ng trên 3 chi u c ng đ c tính t ng t , nh ng đ
ph c t p s t ng lên theo s chi u
Trang 29II Xâu kí t (String)
II.1 Khái ni m
Ki u xâu kí t th ng đ c s d ng trong các ng d ng so n th o v n b n hay x lý t
M t xâu (hay chu i) là dãy kí t b t k l y t m t t p h p các kí t cho tr c
Trong Turbo Pascal, xâu đ c xây d ng t các kí t ASCII M t xâu h ng đ c đ t gi a hai d u nháy đ n (quotes)
q:= ‘Gia khánh, Gia vi n, Ninh bình’
dài c a xâu là s kí t có m t trong đó N u đ dài c a xâu b ng 0, ta đ c xâu r ng,
là xâu không có kí t nào Ví d đ dài c a xâu ht b ng 11, m c dù đ dài t i đa c a xâu
ki u HoTenlà 20
Các phép toán trên xâu : + = <> < <= > >=(xem m c III)
Trang 30II.2.2 Các th t c và hàm trên xâu
1 dài xâu, hàm Length :
Length(s: string): Integer;
Tr v đ dài đ ng (dynamic length) c a xâu
Copy(s: string; index: Integer; count: Integer): string;
Tr v xâu con c a s có đ dài count t v trí index
3 Ghép m t xâu, hàm Concat :
Concat(s1 [, s2, , sn]: string): string;
Tr v xâu là xâu ghép c a dãy các xâu (concatenates a sequence of strings)
Ví d :
begin { tr v 'ABCDEF' }
WriteLn(Concat('ABC','DEF'));
end
4 Xoá b m t ph n c a xâu, th t cDelete :
Delete(var s: string; index: Integer; count: Integer);
Xoá b kh i s xâu con có đ dài count t v trí index
5 Chèn vào m t xâu, th t c Insert :
Insert(source: string; var s: string; index: Integer);
Chèn xâu con source vào xâu s b t đ u t v trí index
Trang 31WriteLn(s); { 'Honest Abe Lincoln' } end
6 Tìm xâu con, th t c Pos :
Pos(substr: string; s: string): Byte;
Tìm v trí c a xâu con substr t xâu s
end
7 Chuy n xâu thành s , th t c Val :
Val(s: string; var v; var code: Integer);
Chuy n đ i giá tr bi n ki u xâu s (s ch a m t dãy ch s ) thành bi n v có ki u Integer
Str(x [: width [: decimals ]]; var s: string);
Chuy n đ i giá tr s x thành m t xâu s Xâu s có th xu t ra b i Write
Trang 32Ví d :
function IntToStr(i: Longint): string;
{ Convert any Integer type to a string }
for i:=1 to MaxStringLength do
if not eoln then read(str[i]) else str[i]:=' ';
readln end
Trang 33III Ki u t p h p (set type)
III.1 Khái ni m
T p h p là m t nhóm các đ i t ng có cùng m t ki u g i là các ph n t c a t p h p
Trong Toán h c, các t p h p th ng đ c kí t b i danh sách các ph n t đ t trong c p d u ngo c {} Ví d các t p h p {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {♣, ♦, ♥, ♠}, v.v T p h p không
ch a ph n t nào g i là t p h p r ng (empty set), ký hi u ∅ hay {}
Do các ph n t c a t p h p không đ c s p x p th t nên ng i ta không nói đ n ph n
t th nh t, ph n t th hai, v.v Nh v y, không th truy c p các ph n t c a t p h p m t cách tr c ti p nh trong m ng
Trong m t bài toán đòi h i đ n t p h p, các ph n t đ c ch n t m t t p h p cho tr c
đ c g i là t p h p v tr (universal set) Ví d n u xét t p h p các ch cái hoa thì t p h p
v tr có th là t p h p t t c các kí t
Các phép toán c b n trên t p h p là thu c (n m trong), giao, h p và hi u nh đ c ch
ra trong gi n đ Venn d i đây
III.2 Khai báo t p h p
Day = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
Days = set of Day ;
Các khai báo trên t o thành ba t p h p ph d ng là :
{‘A’, ‘B’, , ’Z’}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} và
{Sun, Mon, Tue, Wed, Thu, Fri, Sat}
s d ng t p h p trong ch ng trình, các bi n đ c khai báo nh sau :
Var Vowels, Consonants : CapLetter;
Numbers, Evens, Odds : Digit;
Trang 34trong đó <ds ph n t > là danh sách (có th r ng) các h ng, bi n hay bi u th c đ t cách nhau
d u ph y và chúng đ c đ t trong c p d u ngo c [ và ] Các giá tr h ng liên ti p có th dùng cách bi u di n ki u mi n con
c s c a set
K t qu c a bi u th c là true (n u thu c) ho c false (n u không thu c)
Trang 35Ví d :
‘A’ in Consonants có k t qu false
Cho set1, set2 là các h ng, ho c bi n, ho c bi u th c ki u t p h p Ta có các phép quan
h nh sau :
set1 <= set2 hay set2 >= set1 Ki m tra n u set1 ⊆ set2
gi ng nhau set1 <> set2 T ng đ ng v i not (set1 = set2)
Ví d :
[3, 5, 7] <= Odds có k t qu true
[‘A’]<>Consonants có k t qu true
III.3.3 Các phép toán trên t p h p
Cho set1, set2 là các h ng, ho c bi n, ho c bi u th c ki u t p h p Ta có các phép toán
c b n nh sau :
theo th t u tiên đ c gi i thích nh sau :
Trang 36Thêm Prime vào t p h p k t qu
Lo i tr kh i sàng các b i s c a Prime là 2* Prime, 3* Prime
{ Thêm Prime vào t p h p k t qu và in ra }
PrimeSet:= PrimeSet + [Prime];
Write(Perime:4,’,’);
{ Lo i tr kh i Sieve các b i s c a Prime }
i:= Prime;
while i<= N do begin
Sieve:= Sieve - [i];
i:= i + Prime end
until Sieve=[];
writeln;
Readln
End {TimSoNguyenTo }
Ví d 2 : Tìm s các c p kí t đi li n nhau trong m t v n b n Ch ng h n t lúc l c g m
các c p kí t đi li n nhau lu, úc, la, ac
Trang 37var Count : array [letter, letter] of Word ;
d, c : letter ;
C1, C2 : char ;
begin
for c:= letter_a to letter_Z do
for d:= letter_a to letter_Z do
Count[c,d]:= 0 { Kh i đ ng } while not eof do { c v n b n, v a đ c v a đ m }
III.4 Bi u di n c u trúc t p h p trong máy
Cho S là m t t p h p các ph n t đ c ch n t m t t p h p v tr h u h n Trong máy tính, t p h p S c ng đ c bi u di n b i m t dãy bit t ng t các ki u d li u ti n đ nh khác (Integer, Real, Char và Boolean)
x in [C1, C2, , Cn] ≡ (x = C1) ∨ (x = C2) ∨ (x = Cn)
Trang 38IV C u trúc ki u b n ghi (record)
IV.1 c t ki u b n ghi
B n ghi (hay m u tin, m c) là m t dãy h u h n các thành ph n có ki u b t k Các thành
ph n đ c g i là các tr ng (field) c a b n ghi T ng t c u trúc m ng, phép toán c b n
trên b n ghi là truy c p đ n t ng thành ph n c a nó
Khai báo ki u b n ghi là vi c đ c t tên c a b n ghi và ki u c a các tr ng :
Type T = Record s1 : T1;
s2 : T2;
Ví d 1 :
Type Complex= Record re: real; { real part }
im: real; { imaginary part } end;
Date= Record month: string[9];
Các bi n đ c khai báo nh sau :
Trang 39−1.7 19 'Jhon'
male single
N u x, y là hai bi n b n ghi có cùng ki u v i mô t : Var x, y: T;
có th th c hi n phép gán : x:= y; đ chép các tr ng c a b n ghi y vào b n ghi x
G i si, i = 1 n là tên c a các tr ng trong b n ghi, v i mô t : Var x: T;
if (a[i].sex = female) and (a[i].marstatus = single)
then count:= count + 1 ;
Có th vi t l i đo n l nh đ m s ng i đ c thân c a phái n nh sau :
for i := 1 to N do with a [i] do
if (sex = female) and (marstatus = single)
then count:= count + 1 ;
L nh with c ng cho phép li t kê nhi u tên b n ghi :
Trang 40writeln(‘Birthday: ‘,birthday.month,
birthday.day:3,’,’, birthday.year:5);
write (‘Sex: ‘);
if sex=male then write (‘male’)
else write (‘female’);
with p, birthday do begin
writeln(‘Name: ‘,name,’ ‘,firstname);
writeln(‘Birthday: ‘,month,day:3, ’,’,year:5);
write (‘Sex: ‘);
if sex=male then write (‘male’)
else write (‘female’);
write (‘ Marstatus: ‘);
case marstatus of
single : write (‘single’);
maried : write (‘maried’);
widowed : write (‘widowed’);
divorced: write (‘divorced’);
end;
writeln
end;
IV.2 B n ghi thay đ i
Ví d : Mô t các khái ni m hình h c to đ và đi m nh sau :
Type To đ =Record Hoànhđô : real;