Chú ý Cũng có thể khai báo chuỗi thông qua việc định nghĩa một kiểu dữ liệu mới bằng từ khóa Type. Nếu phát hiện ra một cặp ký tự khác nhau thì chuỗi nào chứa ký tự nhỏ hơn sẽ nhỏ hơn[r]
(1)PHÒNG GD & ĐT VĨNH TƯỜNG TRƯỜNG THCS VĨNH TƯỜNG
Chuyên đ :ề
HƯỚNG D N Ẫ
D Y B I DẠ Ồ ƯỠNG H C SINH GI I MÔN TINỌ Ỏ
H CỌ
(2)Trước vào n i dung c a chun đ , xin nói ng n g n v ngơn ng l p trình ộ ủ ề ắ ọ ề ữ ậ Pascal:
Pascal ngơn ngữ lập trình bậc cao Niklaus Wirth, giáo sư điện toán trường Đại học kỹ thuật Zurich (Thụy Sĩ) đề xuất năm 1970 Ơng lấy tên Pascal để kỷ niệm nhà tốn học nhà triết học người Pháp tiếng Blaise Pascal
Pascal ngôn ngữ lập trình bậc cao có từ khóa tiếng Anh, tính logic Tốn học chặt chẽ, đặc trưng thuật tốn khả trừu tượng hóa cao Điều lí giải học sinh học Tốn tốt, thông minh lại dễ dàng tiếp thu dạng kiến thức
Do tính ch t n i dung c a môn h c mà chuyên đ t p trung ch y u vào ấ ộ ủ ọ ề ậ ủ ế thu t toánậ ch t toánấ d y h c l p trình cho h c sinh gi i.ạ ọ ậ ọ ỏ
Phần A Hướng dẫn dạy bồi dưỡng học sinh giỏi (HSG) mơn Tin học lớp 8. A.1 Lí thuy t c n n m v ng:ế ầ ắ ữ
Câu l nh gán:ệ Cú pháp: a:= b; (Gán giá tr c a b cho a)ị ủ Câu l nh u ki nệ ề ệ
Cú pháp:
Câu l nh u ki n d ng thi uệ ề ệ ạ ế Câu l nh u ki n d ng đệ ề ệ ạ ủ If <đi u ki n> ề ệ then <câu l nh>;ệ If <đi u ki n> ề ệ then <câu l nh 1>ệ
Else <câu l nh 2>; ệ Hoặc: Lệnh CASE Cú pháp:
D ng 1ạ D ng 2ạ
CASE B OF
Const 1: S1; Const 2: S2;
Const n: Sn; END;
CASE B OF
Const 1: S1; Const 2: S2;
Const n: Sn; ELSE Sn+1;
END; Câu l nh l p ệ ặ
3.1 L p v i s l n bi t trặ ớ ố ầ ế ước : Cú pháp:
For <bi n đ mế ế >:= <giá tr đ uị ầ > to <giá tr cu iị ố> <câu l nhệ >; (d ng ti n – t t nh đ nạ ế ệ ỏ ế
l n)ớ
For <bi n đ mế ế >:= <giá tr đ uị ầ > downto <giá tr cu iị ố> <câu l nhệ >; (d ng lùi – t t l n đ nạ ệ ế
nh )ỏ
3.1 L p v i s l n ch a bi t trặ ớ ố ầ ư ế ước :
Cú pháp: While <đi u ki nề ệ > <câu l nhệ >; Ho c: ặ
Repeat
<câu l nh 1ệ >; <câu l nh 2>;ệ
(3)Until <đi u ki nề ệ >; Các phép toán hàm s h c ố ọ
* Các phép toán ki u s nguyên:ể ố + Phép chia l y ph n nguyên : ấ ầ Div + Phép chia l y ph n d : ấ ầ Mod
+ Các hàm s h c s d ng cho ki u s nguyên s th c:ố ọ ụ ể ố ố ự Abs(n): Giá tr t đ i c a s n ị ệ ố ủ ố
Sqr(x): bình phương c a s x.ủ ố
Sqrt(x): cho k t qu b c hai c a x.ế ả ậ ủ
Odd(x): cho k t qu true n u x s l , ngế ả ế ố ẻ ượ ạc l i false Round(n): Làm tròn s th c n t i s nguyên g n n nh t.ố ự ố ầ ấ
Trunc(n): Làm tròn s th c n t i s nguyên có giá tr t đ i bé h n n.ố ự ố ị ệ ố Inc(n): Tăng n thêm đ n v (n:=n+1).ơ ị
Dec(n): Gi m n đ n v (n:=n-1).ả ị
Các phép toán logic
Gi s A B hai giá tr ki u Boolean K t qu c a phép toán đả ị ể ế ả ủ ược th hi n quaể ệ b ng dả ưới đây:
A B A AND B A OR B A XOR B NOT A
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE TRUE FALSE
FALSE TRUE FALSE TRUE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE TRUE
A.2 Yêu c u v ki n th c phầ ề ế ứ ương pháp gi ng d yả ạ
Mu n d y b t c n i dung nào, trố ấ ứ ộ ước h t b n ph i n m v ng hi u sâu s c lí thuy tế ả ắ ữ ể ắ ế c a v n đ Tin h c l p trình khơng ph i mơn h c có tính ch t h c thu c nh mônủ ấ ề ọ ậ ả ọ ấ ọ ộ khoa h c xã h i (Văn, S , Đ a); khơng có s n đ nh lí, tính ch t nh mơn khoa h c tọ ộ ị ẵ ị ấ ọ ự nhiên (Tốn, Lí, Hóa) đ c th áp d ng H c l p trình h c cách s d ng m t ngôn ng để ứ ế ụ ọ ậ ọ ụ ộ ữ ể di n đ t giao ti p v i máy tính đ c bi t gi i quy t đễ ế ặ ệ ả ế ược toán đ t nh s cặ ứ m nh tính tốn, tính logic, cơng c h tr mà ngơn ng l p trình cung c p.ạ ụ ỗ ợ ữ ậ ấ
Khi h c lí thuy t v ngơn ng l p trình, có th hi u ta đọ ế ề ữ ậ ể ể ược cung c p công c đ làmấ ụ ể vi c v i môi trệ ường giao ti p ngế ười – máy tính; ph i hi u n u không n m ch c cơng ể ế ắ ắ ụ không th giao ti p thành công t c ta không chuy n t i thành công đ máy tínhể ế ứ ể ả ể hi u.ể
B n không th d y h c sinh tr nên l p trình gi i mà khơng truy n đ t rõ ràng, d hi uạ ể ọ ậ ỏ ề ễ ể nh ng n i dung lí thuy t c a ngơn ng l p trình - u khơng d ngôn ng l pữ ộ ế ủ ữ ậ ề ễ ữ ậ trình s d ng b kí t riêng, tuân theo m t cú pháp, quy t c dùng nh t đ nh đ c bi t đòiử ụ ộ ự ộ ắ ấ ị ặ ệ h i nhi u ch t Tốn, s thơng minh, t linh ho t, kh sáng t o.ỏ ề ấ ự ả
Khi truy n đ t rõ ràng, d hi u lí thuy t l p trình, th y có th kh i g i s h ng thú, ề ễ ể ế ậ ầ ể ợ ự ứ tìm tịi, mu n khám phá c s sáng t o ban đ u ngố ả ự ầ ườ ọi h c
D y lí thuy t có nhi u m tạ ế ề ể ương đ ng gi a th y (vì lí thuy t chung, có s n ữ ầ ế ẵ sách ph n l n th y cô không gia công thêm trình t SGK hầ ầ ự ướng d n) nh ng d y thu t ẫ ậ tốn ph i th c t (và th c t t t) L u ý r ng đ c tr ng c a thu t toán tính ả ự ế ự ế ố ằ ặ ủ ậ tu n t logic đ m b o th c hi n th t bầ ự ả ả ự ệ ứ ự ước ta có k t qu ế ả
Th y, có th l y ví d v d y m t thu t toán chầ ể ấ ụ ề ộ ậ ương trình Tin h c l p không ?ọ (1) Hi u sâu s c lí thuy tể ắ ế
(2) Truy n đ t rõ ràng, d hi uề ễ ể
(3) D y thu t toán nh th nào?ạ ậ ế
(4)Trong trình h c l p trình, h c sinh c n có kh đ c hi u code c a ngọ ậ ọ ầ ả ọ ể ủ ười khác (l iờ gi i c a b n khác, c a sách, s chia s code m ng) ch đ c hi u đả ủ ủ ự ẻ ỉ ọ ể ược code m i t b sung cho cách gi i tham kh o:ự ổ ả ả
Ví d v i đo n code sau, th y cô minh h a nh th ?ụ ầ ọ ế
-uses crt;
var N,n1,n2,S,i,j:Longint; dem:integer;
begin clrscr;
writeln('******BA NGUOI CAU CA******'); for i:=2 to 1000 do
begin n:=i;
if (n mod 3=1) then //neu so ca ban dau chia du 1
begin
n1:=((n-1) div 3)*2; //so ca lai sau nguoi thu lay
if (n1 mod 3=1) then begin
n2:=((n1-1) div 3)*2; //so ca lai sau nguoi thu lay
if (n2 mod 3=1) then begin
write(i:5); inc(dem);
if (dem mod 10=0) then writeln; end;
end; end; end; readln; end.
K t qu ch y chế ả ương trình:
Đây đ c a code gi i trên:ề ủ ả
Ba người câu m t s lộ ố ượng không l n h n N cá M t m i tr i t i, m iớ ệ ỏ ố ỗ người tìm m t n i đ ng Khi tr i g n sáng, ngộ ể ủ ầ ười th nh t th c d y, đ m s cá th y n uứ ấ ứ ậ ế ố ấ ế chia d m t v t m t cá xu ng sông đem v m t ph n ba s cá Ngư ộ ứ ộ ố ề ộ ầ ố ười th hai th c d y tứ ứ ậ ưởng hai người ng , đ m s cá th y chia ba d m t nên v t xu ngủ ế ố ấ ộ ứ ố sông m t r i đem v m t ph n ba s cá Ngộ ề ộ ầ ố ười th ba th c d y tứ ứ ậ ưởng d y s mậ h n c đ m cá th y chia ba d m t nên v t m t xu ng sông đem v m tơ ả ế ấ ộ ứ ộ ố ề ộ ph n ba s cá.ầ ố
V i m t s N nh p t bàn phím ( N<1000 ), thơng báo hìnhớ ộ ố ậ nh ng ữ
(5)Khi th y cô làm t t yêu c u v ki n th c phầ ố ầ ề ế ứ ương pháp gi ng d y m t h th ngả ạ ộ ệ ố bài t p nâng cao tr ng tâm, t ng h p kỹ năng, có yêu c u sáng t o tích h p nhi u ch t Tốnậ ọ ổ ợ ầ ạ ợ ề ấ là ph n quan tr ng nh t vi c b i dầ ọ ấ ệ ồ ưỡng h c sinh gi i Tin h cọ ỏ ọ
A.3Bài t p ch n l c:ậ ọ ọ L u ý: ư
+ Ph n l i gi i, thu t toán, ch t toán, d n d t cho m i đầ ờ ả ậ ấ ẫ ắ ỗ ược trình bày bu i chuyên đở ổ ề
ph n báo cáo, th c hành, th o lu n.ầ ự ả ậ
+ Đ có k t qu t t nh t ti p thu chuyên đ này, th y cô c n gi i quy t để ế ả ố ấ ế ề ầ ầ ả ế ược bài t p đ a nh t theo cách riêng c a b n thân ho c c g ng làm đậ ư ấ ủ ả ặ ố ắ ược nhi u t tề ố
các yêu c u kèm theo m i bài.ầ ỗ
+ N u đ ch a xác ho c thi u trế ề ư ặ ế ường h p, ho c có th có thu t tốn t t h n đ gi iợ ặ ể ậ ố ơ ể ả
thì th y có th trao đ i tham gia chuyên đ ầ ể ổ ề
Bài (cách s d ng bi n, l nh gánử ụ ế ệ )
Nh p vào hai s nguyên a b, hoán đ i giá tr c a chúng cho : a nh n giá tr b; b ậ ố ổ ị ủ ậ ị nh n giá tr a b ng cách:ậ ị ằ
Cách 1: dùng thêm bi n cế Cách 2: không dùng thêm bi n.ế
Bài (cách s d ng bi n, hàm div, modử ụ ế )
Nh p vào m t s nguyên dậ ộ ố ương n có ch s Hãy in t ng ch s c a mà khơng ữ ố ổ ữ ố ủ dùng thêm bi n khác.ế
Ví d :ụ
Nh pậ In
N = 2019 12
Bài (cách s d ng bi n, hàm div, modử ụ ế )
Vi t chế ương trình đ i s ti n a (đ n v trăm đ ng) t ti n 500 đ, 200 đ 100 đ ổ ố ề ị ề cho s t ti n nh t.ố ề ấ
Yêu c u: ch dùng câu l nh gán không dùng thêm bi n, không dùng câu l nh if then, for, whileầ ỉ ệ ế ệ do,
Ví d :ụ
Nh pậ In
2300
Bài (l nh ifệ )
Nh p vào m t s nguyên dậ ộ ố ương ch năm dỉ ương l ch ị
a) Hãy ki m tra xem có ph i năm nhu n hay khơng ? n u có ghi ‘la nam nhuan’, ngể ả ậ ế ược l i ghi ‘khong la nam nhuan’ạ
b) n u không năm nhu n c n thêm nh t m y năm n a đ tr thành năm nhu n ?ế ậ ầ ấ ấ ữ ể ậ Ví d :ụ
Nh pậ In
2020 la nam nhuan
2019 khong la nam nhuan
+1 Bài (ch dùng l nh if, không dùng div, mod, while … doỉ ệ ) Nh p vào m t s nguyên dậ ộ ố ương nh h n 100000 ỏ In s lố ượng ch s c a nó.ữ ố ủ
Ví d :ụ
Nh pậ In
100
(6)a) dùng l nh ifệ
b) không dùng l nh if (ghi th ng k t qu )ệ ẳ ế ả Bài (l nh for, l nh if)ệ ệ
a In s t nhiên t 1đ n 100, m i hàng k s cách đ u (k nguyên dố ự ế ỗ ố ề ương nh h nỏ 20)
Ví d :ụ
Nh pậ In
K=13
b In s t nhiên t m đ n n , m i hàng k s cách đ u (n > m+ 100; k nguyênố ự ế ỗ ố ề dương nh h n 20)ỏ
Bài (l nh for, ch t Tốn)ệ ấ
Cho hình ch nh t có s đo c nh s nguyên ậ ố ố ương chu vi b ng P ằ Hãy in di n tích l n nh t có th c a hình ch nh tệ ấ ể ủ ữ ậ
Ví d :ụ
Nh pậ In
V = 20 25
Bài (ch t Toánấ )
Nh p vào tu i cha, tu i hi n t i.ậ ổ ổ ệ
In s năm ch a t i ho c s năm qua mà tu i cha g p đôi tu i (phân bi t + ho c -)ố ặ ố ổ ấ ổ ệ ặ
Nhập In
24 + 20
Bài 10 (l nh While … doệ )
Vi t chế ương trình nh p vào m t s nguyên dậ ộ ố ương N t bàn phím (ừ N 109 ).
Hãy in s nh nh t l n h n N th a mãn chia d 8, chia d 7, chia d 6, chia d 5,ố ỏ ấ ỏ ư ư chia d 4, chia d 3, chia d chia d 1.ư ư
Ví dụ :
Nh pậ In
N = 100 2519
Bài 11 T Ong ổ (ch t Toán)ấ
T ong bao g m nhi u gi ng hình l c bát Các ô đ , ch a m t, sáp, ongổ ề ố ụ ể ứ ậ non, Ban đ u ong xây m t ô Sau xây ti p k c nh v i ô ban đ u, làm thành l pầ ộ ế ề ầ th hai, sau xây ti p k c nh v i ô l p th hai, làm thành l p th 3, ứ ế ề ứ ứ
(7)Hãy xác đ nh s c a t ong tìm th y (1 ≤ ị ố ủ ổ ấ n ≤ 109).
Ví dụ :
Nh pậ In
N =
Bài 12 (Thu t toán Đ m, ch t Toán)ậ ế ấ Nh p vào m t s nguyên n ki u longint.ậ ộ ố ể
Hãy ki m tra xem n có s ngun t hay khơng ? n u có ghi ‘yes’, ngể ố ố ế ượ ạc l i ghi ‘no’ Ví dụ :
Nh pậ In
N = 41 yes
Bài 13 (Thu t toán Đ m)ậ ế
Nh p vào s nguyên dậ ố ương N in N s nguyên t đ u tiên (N < 1000).ố ố ầ Ví dụ :
Nh pậ In
N = 5 11
Bài 14 (Thu t toán Euclid, ch t Toánậ ấ )
Nh p vào hai s nguyên dậ ố ương a b (a , b nh h n 10ỏ 9).
a) in UCLN(a,b) b ng cách khác nhau.ằ b) in BCNN(a,b)
Ví dụ :
Nh pậ In
A= B =
UCLN(4,6) = BCNN(4,6) = 12 Bài 15 (ch t Tốnấ )
Cho hình ch nh t v i hai kích thữ ậ ước a b (a, b s nguyên dố ương nh h n 10ỏ 9) H iỏ
c n nh t nhát c t (m i nhát c t song song v i m t hai c nh c a hình chầ ấ ắ ỗ ắ ộ ủ ữ nh t) đ chia hình ch nh t thành hình vng có c nh b ng nhau.ậ ể ữ ậ ằ
Nh p vào hai s nguyên dậ ố ương a, b hai kích thướ ủc c a hình ch nh t.ữ ậ In s nguyên dố ương K s nhát c t nh t c n dùng.ố ắ ấ ầ
Ví dụ :
Nh pậ In
A = B =
Bài 16 (ch t Toán, dùng hàm có s nấ ẵ )
Nh p vào m t dãy s nguyên g m N s Aậ ộ ố ố i n100, 1000 Ai 1000
Hãy in s phố ương có dãy s Có t t c s phố ấ ả ố ương ? Ví dụ :
Nh pậ In
N = 10
-8 49 -25
0 49 Bài 17 (thu t Toán s p x p, thu t toán đánh d u, t o m ng ph )ậ ắ ế ậ ấ ạ ả ụ
Nh p vào m t dãy s nguyên g m N s Aậ ộ ố ố i n100, 1000 Ai 1000 khác đôi m t.ộ
H i sau s p x p dãy s tăng d n, s v trí th k c a dãy ban đ u dãy ỏ ắ ế ố ầ ố ị ứ ủ ầ s p x p v trí ?ắ ế ị
Ví dụ :
(8)N = K =
-8 2019 49 -25
Bài 18 (t ngồi)ừ
Vi t chế ương trình nh p vào t bàn phím m t s nguyên dậ ộ ố ương n (n<= 1000) Sau tính in hình giá tr c a c a bi u th c T (l y ch s th p phân sau d u ph y)ị ủ ủ ể ứ ấ ữ ố ậ ấ ả
1
T n (có n d u b c hai)ấ ậ
Phần B Hướng dẫn dạy bồi dưỡng học sinh giỏi (HSG) mơn Tin học lớp 9.
PHẦN LÍ THUYẾT BÁO CÁO
Hướng dẫn dạy bồi dưỡng học sinh giỏi (HSG) môn Tin học lớp 9.
1 KIỂU KÝ TỰ (CHAR)
1.1 Ký t bi n ki u ký t :ự ế ể ự
Ký tự
Mã ASCII
Ký tự
Mã ASCII
Ký tự
Mã ASCII
32 A 65 a 97
0 48 B 66 b 98
1 49 C 67 c 99
2 50 D 68 d 100
3 51 E 69 f 101
4 52 F 70 e 102
5 53 G 71 g 103
6 54 H 72 h 104
7 55 I 73 i 105
8 56 J 74 j 106
9 57 K 75 k 107
L 76 l 108
M 77 m 109
N 78 n 110
O 79 o 111
(9)Q 81 q 113
R 82 r 114
S 83 s 115
T 84 t 116
U 85 u 117
V 86 v upload.1
23doc.n et
W 87 w 119
X 88 x 120
Y 89 y 121
Z 90 z 122
Các ký tự dùng máy tính điện tử liệt kê đầy đủ bảng mã ASCII gồm 256 ký tự khác đánh số thứ tự từ đến 255 Số thứ tự ký tự gọi mã ASCII ký tự Biểu 6.5 liệt kê phần bảng mã ASCII gồm chữ số chữ kèm theo mã chúng
Trong bảng, ký tự có mã 32 ký tự trắng (space)
Tuy có 256 ký tự khác song có 128 ký tự hay dùng, lại ký tự mở rộng Các ký tự có mã từ đến 31 gọi ký tự điều khiển, không in được, dùng để điều khiển thiết bị ngoại vi, chẳng hạn ký tự có mã dùng để tạo tiếng kêu bip, ký tự có mã 13 dùng để chuyển trỏ hình xuống đầu dịng Mỗi ký tự bảng mã ASCII gọi ký tự, chiếm độ dài byte, viết Pascal phải đặt cặp nháy đơn: ‘0’, ‘1’, ‘A’, ‘B’, ‘$’,
Giữa ký tự, có thứ tự theo nguyên tắc : ký tự có mã nhỏ nhỏ Tức là:
Ký tự trắng < ‘0’< ‘1’< < ‘9’< ‘A’< ‘B’< ’Z’< ‘a’< ‘b’< < ‘z’
Biến nhận gía trị ký tự gọi biến kiểu ký tự, chúng khai báo nhờ từ khóa CHAR, chẳng hạn khai báo hai biến ch ch1 đây:
Var
ch, ch1: Char ; Khi gán: ch:=‘A’;
ch1:=‘$’;
Ký tự ‘A’ gọi gía trị biến ch, cịn ‘$’ gía trị biến ch1
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A25_files/Bai06_4_files/bullet2.gif" \* MERGEFORMAT Nhận xét: Từ bảng mã chữ ta suy ra:
Mã chữ thường = Mã chữ hoa tương ứng + 32 (1)
1.2 Các hàm liên quan đến ký tự :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
(10)INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_blue.gif" \* MERGEFORMAT Hàm SUCC(ch): cho ký tự đứng sau ký tự ch bảng mã Ví dụ: Succ(‘A’)=‘B’
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_blue.gif" \* MERGEFORMAT Hàm
UpCase(ch): đổi ký tự ch thành chữ hoa Ví dụ:
Upcase( ‘a’ ) = ‘A’, Upcase( ‘b’ ) = ‘B’, Upcase( ‘A’ ) = ‘A’
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_blue.gif" \* MERGEFORMAT Hàm ORD(ch) : cho mã ký tự ch Ví dụ: Ord (‘A’) = 65, Ord (‘a’) = 97
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_blue.gif" \* MERGEFORMAT Hàm CHR(k) : đối số k nguyên, 0< k < 256, cho ký tự có mã k Ví dụ:
Chr (65)= ‘A’ , Chr (97)= ‘a’,
Chr(32) ký tự trắng
Có số ký tự khơng có bàn phím, để viết chúng lên hình ta phải dùng lệnh Write hàm CHR Ví dụ:
Lệnh Writeln(Chr(201)) ; in ký tự : + Lệnh Writeln(Chr(187)) ; in ký tự : +
Ký tự có mã gọi ký tự BEL (chuông), lệnh: Write( Chr(7) ) ; hay Write(#7) ;
có tác dụng phát tiếng kêu bip
Chú ý:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_green.gif" \* MERGEFORMAT Turbo Pascal ( TP ) cho phép viết gọn Chr(k) thành #k k số Ví dụ, hai lệnh sau in lên hình chữ A :
Write(#65); Write(Chr(65));
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet_dia_green.gif" \* MERGEFORMAT Trong TP khơng có hàm đổi chữ hoa chữ thường, làm việc nhờ công thức (1) hai hàm Ord Chr :
Chữ thường := Chr ( Ord(chữ hoa) + 32 )
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo %20pascal%207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet2.gif" \* MERGEFORMAT Ví dụ 1: Nhập vào số nguyên k, 0< k < 256, in ký tự có mã k Chương trình kết thúc nhập vào số :
PROGRAM VIDU1 ; Uses CRT;
Var k : Byte; Begin CLRSCR;
(11)Repeat
Write(‘ Nhập mã ký tự : ‘); Readln(k); Writeln(‘ Ký tự có mã ‘, k, ‘ ‘ , Chr(k) ); Until k=0;
End.
Chạy<VD1.EXE>
Chép tập tin nguồn <VD1.PAS>
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A25_files/Bai06_4_files/bullet2.gif" \* MERGEFORMAT Ví dụ 2: Nhập ký tự, chữ hoa đổi chữ thường, chữ thường đổi chữ hoa
PROGRAM VIDU2;
{ Ðổi chữ hoa thường ngược lại} Var
ch, ch1 : Char; Begin
Write(‘ Nhập ký tự :’); Readln(ch);
If (ch>=‘A’) and ( ch<=‘Z’) then ch1:=Chr( Ord (ch)+32) else
ch1:= Upcase(ch);
Writeln(ch, ‘ đổi ra: ‘ , ch1); Readln;
End.
Chạy<VD2.EXE>
Chép tập tin nguồn <VD2.PAS>
2 MẢNG MỘT CHIỀU 2.1 Mảng cách khai báo mảng :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Khái niệm :
Mảng tập gồm nhiều phần tử có chung kiểu liệu Mỗi phần tử mảng có đại lượng xác định vị trí tương đối phần tử so với phần tử khác mảng, gọi chỉ số Các yếu tố để xác định mảng gồm có:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Tên mảng INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Kiểu liệu chung phần tử mảng
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Kiểu liệu số phạm vi số
Kiểu liệu phần tử mảng kiểu liệu mà biến có Tuy nhiên, kiểu liệu chỉ số khơng được kiểu thực hay kiểu chuỗi, kiểu đếm : nguyên, ký tự, lôgic, liệt kê hay đoạn
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
(12)Mảng chiều, gọi dãy, hay đơn giản mảng, khai báo theo hai cách :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet5.gif" \* MERGEFORMAT Cách 1: Khai báo trực cách sau :
VAR
Tênmảng : Array[m1 m2] of Tênkiểudữliệu ;
Ở m1, m2 hai xác định phạm vi số, chúng có chung kiểu liệu,và m1 < m2
Ví dụ: Cho khai báo đây: Var
A : Array[0 10] of Real;
Hten: Array[1 5] of String[18]; B: Array[‘a’ ’d’] of Integer; Theo khai báo trên, ta có ba mảng:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Mảng thứ tên A, gồm 11 phần tử kiểu Real, ứng với số 0, 1, 2, , 10, là:
A[0], A[1], A[2], , A[10]
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Mảng thứ hai tên HTen gồm phần tử kiểu liệu String[18] ứng với số từ đến 5:
Hten[1], Hten[2], Hten[3], Hten[4], Hten[5]
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMAT Mảng thứ ba tên B, gồm phần tử kiểu Integer ứng với số ‘a’, ‘b’, ‘c’, ‘d’:
B[‘a’], B[‘b’], B[‘c’], B[‘d’]
Ð có m t hình nh v m ng, đ i v i m ng A, ta hình dung có m t dãy nhà m t t ng, tên ể ộ ả ề ả ố ả ộ ộ ầ g i dãy A, g m 11 phòng liên ti p gi ng h t đọ ế ố ệ ược đánh s th t t 0,1, 2, , đ n ố ứ ự ế 10 :
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10
Tương t , m ng B gi ng nh dãy nhà B m t t ng có phịng đự ả ố ộ ầ ược đánh s th t ố ứ ự ch ữ a, b, c, d :
Ba Bb Bc Bd
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet5.gif" \* MERGEFORMAT Cách : Khai báo qua kiểu liệu mới, gồm hai bước: Bước 1: Ðịnh nghĩa kiểu liệu mảng :
TYPE
Tênkiểumảng = Array[m1 m2] of Tênkiểudữliệu; Bước 2: Khai báo biến có kiểu liệu kiểu mảng:
VAR
Tênmảng : Tênkiểumảng ;
Ví dụ, mảng A, B Hten ta khai báo theo cách 2, sau: Type
(13)Var
A : Mang1; Hten: Mang2; B: Mang3;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo %20pascal%207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Khai báo mảng có gán trị ban đầu:
Pascal cho phép vừa khai báo mảng vừa gán gía trị ban đầu cho phần tử mảng, chẳng hạn đây:
Const
X : array[1 5] of Integer = (12, 14, 16, 18, 20) ;
Khi X mảng gồm phần tử kiểu nguyên có giá trị X[1]=12, X[2]=14, X[3]=16, X?4]=18, X[5]=20
Mặc dù từ khóa Const song X lại dùng biến mảng, tức phần tử X thay đổi gía trị Ví dụ, chương trình ta gán:
X[1]:= 2; X[2]:=5+20;
2.2 Truy xuất phần tử mảng:
Các xử lý mảng quy xử lý phần tử mảng Ðể xác định phần tử mảng, ta dùng cách viết :
Tênmảng[ số phầ? tử ]
Ví du : gán : A[0]:= 15.8; A[1]:= 2*A[0];
Hten[3]:= ‘Nguyen Thi Loan’; B[‘a’]:=100;
Chỉ số phần tử biến, hằng, hay biểu thức Ví dụ, cho i biến kiểu nguyên, ta dùng lệnh:
i:=6;
A[i]:=100.25;
Hai lệnh tương đương với lệnh: A[6]:=100.25;
Nếu biến i có giá trị lệnh :
A[ i div +1] := 4.5; tương đương với lệnh: A[4]:=4.5; biểu thức i div +1 có gía trị
Khi nhập liệu cho phần tử mảng , ta dùng câu lệnh For, While hay Repeat
Ví dụ, nhập liệu cho phần tử mảng A: For i:=0 to 10
begin
Write(‘Nhập phần tử thứ ‘ , i , ‘: ‘); Readln(A[i]);
end;
(dùng While) : i:=0;
While i<= 10 begin
Write(‘Nhap phần tử thứ ‘, i, ‘: ‘); Readln(A[i]);
(14)end;
Tương tự để nhập liệu cho phần tử mảng B, ta viết: For ch:=‘a’ to ‘d’
begin
Write(‘Nhap phần tử thứ ‘, ch, ‘: ‘); Readln(B[ch]);
end;
Ðể in gía trị mảng A lên hình, ta viết :
For i:=0 to 10 do Write(A[i]:6:2);
Các gía trị mảng A in liên tiếp dòng Còn muốn in phần tử dòng, ta thay lệnh Write bằ?g Writeln
Tương tự, mảng B in lên hình lệnh : For ch:=‘a’ to ‘d’ do Write(B[ch]);
Chú ý : Turbo Pascal cho phép gán mảng cho mảng khác Nếu X, Y hai biến mảng kiểu mảng lệnh:
X := Y;
có nghĩa lấy gía trị phần tử mảng Y gán cho phần tử tương ứng mảng X Ví dụ, cho khai báo:
Var
X, Y : Array[1 10] of Real; Khi đó, lệnh: X := Y; tương đương với lệnh :
For i:=1 to 10 X[i] :=Y[i];
2.3 Các toán mảng :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ 1: Ðếm số lần xuất gía trị x dãy A1, A2, , An
Ví dụ gía trị x=6 xuất lần dãy 6
Ta dùng biến Dem kiểu nguyên để đếm số lần xuất x Ðầu tiên ta gán Dem:=0, sau duyệt phần tử A1, A2, , An, có phần tử x tăng biến Dem
lên đơn vị Kết qủa biến Dem có gía trị số phần tử x Hai lệnh thuật tốn là:
Dem:=0;
For i:=1 to N If A[i]=x then Dem:=Dem+1; Ví dụ, đếm dãy số A có số 0, ta viết: Dem:=0;
For i:=1 to N if A[i]=0 then Dem:=Dem+1; Writeln(‘ Có ‘, Dem , ‘ số không ‘);
Nhận xét: Ðẳng thức A[i]=x ( hay A[i]=0 ) điều kiện để biến Dem tăng thêm 1, tốn mở rộng là: đếm số phần tử mảng A thỏa mãn điều kiện cho trước Trong lệnh For trên, thay đẳng thức A[i]=x A[i] thỏa điều kiện , ta thuật toán tổng quát :
Dem:=0;
For i:=1 to N If A[i] thỏa điều kiện then Dem:=Dem+1;
Chương trình sau nhập mảng A có N phần tử, in mảng A lên hình, đếm xem mảng A có số dương :
PROGRAM VIDU3;
{ Ðếm số dương mảng}
Type
(15)A: Kmang;
i, N, Dem : Integer; Begin
Repeat
Write(‘ Nhập số phần tử N : ‘); Readln(N);
Until (N>0) and ( N<21);
{ nhập mảng }
For i:=1 to N begin
Write(‘Nhập A[‘ , i , ‘ ]: ‘); Readln( A[i] );
end;
{ In mảng A}
Writeln(‘ Mảng A : ’);
For i:=1 to N Write(A[i]:3:0); Writeln;
{ đếm số dương }
Dem:=0;
For i:=1 to N If A[i]>0 then Dem:=Dem+1; Writeln(‘ Số số dương = ‘ , Dem );
Readln; End.
Chạy<VD3.EXE>
Chép tập tin nguồn <VD3.PAS>
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ 4: Tìm số lớn dãy A1, A2, , An.
Gọi Max biến chứa số lớn phải tìm, : Bước 1: Gán Max:=A[1];
Bước 2: Nếu Max<A[2] gán Max:=A[2];
Bước 3: Nếu Max<A[3] gán Max:=A[3];
Bước n: Nếu Max<A[n] gán Max:=A[n];
Khởi đầu, Max gán giá trị A[1] Sang bước 2, Max so sánh với A[2] để chọn số lớn A[1], A[2] lưu vào biến Max Sang bước 3, Max tiếp tục so sánh với A[3] để tìm số lớn A[1], A[2], A[3], v.v Kết qủa, sau bước n, biến Max chứa số lớn dãy A[1], A[2], , A[n]
Q trình mơ tả hai lệnh: Max:=A[1];
For i:=2 to n if Max<A[i] then Max:=A[i];
Nhận xét:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet_dia_green.gif" \* MERGEFORMAT Trong lệnh For trên, biến i chạy 2, kết qủa cho i chạy
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
(16)INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ 5: Bài tốn xếp mảng tăng dần (hay giảm dần)
Cho dãy A[1], A[2], , A[n], nói A dãy tăng A[1] < A[2]< < A[n], tương tự, A dãy giảm A[1] > A[2] > >A[n] Dãy đồng A[1]=A[2]= =A[n] trường hợp đặc biệt, vừa dãy tăng, vừa dãy giảm
Ví dụ:
Dãy 3 5 6 dãy tăng Dãy 9 5 0 dãy giảm
Dãy 3 6 dãy không tăng không giảm
Bài toán đặt là: cho dãy A[1], A[2], , A[n] bất kỳ, thực hốn đổi gía trị phần tử mảng A để A lập thành dãy tăng
Ví dụ, cho dãy A có phần tử A[1]=9, A[2]=7, A[3]=5, A[4]=8, A[5]= 2, cần thực hốn đổi để có A[1]=2, A[2]=5, A[3]=7, A[4]=8 A[5]=9
Có phương pháp xếp mảng khác nhau, xin giới thiệu phương pháp, chưa phải hay đơn giản dễ hiểu cho người lập trình, phương pháp lựa chọn trực tiếp (Straight selection sort)
Ý tưởng phương pháp sau:
Bước 1: Tìm số nhỏ phần tử A[1], A[2], , A[n] để vào vị trí A[1]
Bước 2: Tìm số nhỏ phần tử A[2], A[3], , A[n] để vào vị trí thứ hai A[2]
.v.v
Bước n-1: Tìm số nhỏ hai phần tử A[n-1], A[n] để vào vị trí n-1 Sau bước A[n] gía trị lớn
Chẳng hạn, xét dãy A có phần tử: {5,3,4,1}:
Bước 1: Nếu A[1]>A[2] đổi A[1] với A[2], được: {3,5,4,1} Nếu A[1]>A[3] đổi A[1] với A[3]: khơng đổi Nếu A[1]>A[4] đổi A[1] với A[4], được: {1,5,4,3}
Bước 2: Nếu A[2]>A[3] đổi A[2] với A[3], được: {1,4,5,3} Nếu A[2]>A[4] đổi A[2] với A[4], được: {1,3,5,4}
Bước 3: Nếu A[3]>A[4] đổi A[3] với A[4], được: {1,3,4,5} Sau ba bước, dãy A xếp xong
Tại bước thứ i (i chạy từ đến ), ta phải so sánh A[i] với A[j] (j chạy từ i+1 đến 4), A[i]>A[j] hốn đổi gía trị A[i] A[j], nói cho gọn đổi chỗ A[i] với A[j] Qúa trình thể hai vòng lặp For :
For i:=1 to For j:=i+1 to
if A[i]>A[j] then Ðổi chỗ A[i] A[j] ;
Mảng A có phần tử, trường hợp tổng qt mảng A có N phần tử lệnh For thứ có biến i chạy từ đến N-1, lệnh For thứ hai có biến j chạy từ i+1 đến N, tức :
For i:=1 to N-1 For j:=i+1 to N
if A[i]>A[j] then Ðổi chỗ A[i] A[j] ;
Việc đổi chỗ gía trị A[i] A[j] tiến hành cách dùng biến Z trung gian kiểu liệu với A[i] A[j] Ðầu tiên gởi tạm gía trị A[i] vào biến Z, sau đưa gía trị A[j] vào A[i], cuối đưa gía trị Z vào A[j], tức phải làm ba lệnh :
(17)Tóm lại, thuật toán xếp dãy A tăng viết sau:
For i:=1 to N-1 do For j:=i+1 to N if A[i]>A[j] then
begin { Ðổi chỗ A[i] A[j] }
Z:=A[i]; A[i]:=A[j]; A[j]:=Z; end;
Trong N số phần tử dãy A Z biến trung gian có kiểu liệu với phần tử mảng A
Chương trình tìm số lớn mảng A dãy A tăng dần:
PROGRAM VIDU6;
{ Tìm Max dãy A tăng dần }
Uses CRT; Type
Kmang = array[1 20] of Real; Var
i, j, N : Integer; A: Kmang; z, Max : Real; Begin
Clrscr; Repeat
Write(‘ Nhập số phần tử N : ‘); Readln(N);
Until (N>0) and ( N<21);
For i:=1 to N { nhập mảng }
begin
Write(‘Nhập A[‘, i, ‘]: ‘); Readln(A[i]);
end;
{ Tìm số lớn }
Max :=A[1];
For i :=1 to N if Max< A[i] then Max:=A[i]; Writeln(‘ Số lớn là: ’ , Max : 4:1);
{ xếp dãy tăng }
For i:=1 to N-1 For j:=i+1 to N
If A[i]>A[j] then {23}
begin { đổi chỗ A[i] A[j] }
z:=A[i]; A[i]:=A[j]; A[j]:=z; end;
Writeln(‘ Dãy xep tăng : ‘); For i:=1 to N Write(A[i]:3:0); Readln;
End.
Chạy<VD6.EXE>
(18)Chú ý 1:Muốn dãy A giảm dần chương trình cần thay dòng {23}:
If A[i] > A[j] then dòng :
If A[i] < A[j] then
Tức thay dấu lớn > dấu nhỏ <
Chú ý : Sắp xếp phận dãy
Gọi m h hai số nguyên cho 1<= m< h<= N, A[m], A[m+1], , A[h] dãy dãy A Muốn dãy A[m], A[m+1], , A[h] tăng (hay giảm) mà không làm ảnh hưởng đến phần lại dãy A, ta dùng lệnh sau:
For i:= m to h-1 do For j:=i+1 to h if A[i]>A[j] then
begin { Ðổi chỗ A[i] A[j] } Z:=A[i];
A[i]:=A[j]; A[j]:=Z; end;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ 7: Kiểm tra mảng có thỏa tính chất khơng
Ta thường gặp toán kiểm tra xem phần tử mảng A có thỏa mãn điều kiện khơng, ví dụ mảng A có phải dãy tăng khơng, có phải dãy đối xứng khơng, có phải cấp số cộng không,
Mảng A thỏa mãn tính chất xét phần tử thỏa điều kiện xác định đó, ngược lại, mảng A khơng thỏa mãn tính chất xét có phần tử khơng thỏa điều kiện
Hai trạng thái thỏa mãn hay khơng thỏa mãn thể hai gía trị TRUE hay FALSE biến Kiemtra kiểu lôgic Ðầu tiên ta gán giả định Kiemtra:= TRUE, sau ta xét phần tử A, cần có phần tử khơng thỏa điều kiện gán
Kiemtra:=FALSE Vậy hai lệnh cần dùng là: Kiemtra:=TRUE;
For i:=1 to N
if A[i] không thỏa mãn điều kiện then Kiemtra:= FALSE; Việc xác định điều kiện tùy tốn cụ thể
Ví dụ: Kiểm tra xem A có phải dãy đối xứng không ? Dãy 5 đối xứng
Dãy khơng đối xứng A[3] khác A[5]
Như vậy, dãy N phần tử A1, A2, , An đối xứng A1=An, A2=An-1, , An=A1, tức Ai = An-i+1 với i=1, 2, , n Ðẳng thức : Ai = An-i+1 điều kiện mà phần tử dãy A phải thỏa để A dãy đối xứng
Giả thiết biến Kiemtra khai báo kiểu Boolean Trong chương trình ta dùng lệnh sau:
Kiemtra:=TRUE; For i:=1 to N
if A[i]<>A[N-i+1] then Kiemtra:=FALSE;
If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) else
Writeln( ‘Dãy A không đối xứng ‘);
(19)Kiemtra:=TRUE; i:=1;
While ( i <=N ) and ( Kiemtra=TRUE) if A[i]<>A[N-i+1] then Kiemtra:=FALSE else i:=i+1;
If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘);
Bạn đọc viết chương trình cho ví dụ
Chú ý Câu lệnh :
If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A khơng đối xứng ‘);
hồn tồn tương đương với lệnh :
If Kiemtra then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘);
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ 8: Tính gía trị đa thức :
P = ao + a1x + a2x2 + + anxn
trong số nguyên n, số thực x hệ số a0, a1, , an nhập từ bàn phím Ta viết :
P= aoU0 + a1U1 + a2U2 + + anUn , : U0=1;
Ui = xi = xi-1 *x = Ui-1*x với i=1,2, , N
Như vậy, tính gía trị U bước i-1 tính gía trị U bước i lệnh U:= U*x, sau ta việc cộng dồn biểu thức ai*U vào P lệnh P:= P+ ai*U
Chương trình viết sau :
PROGRAM VIDU8;
{ Tính gía trị đa thức bậc N }
Var
i, N : Integer;
A: Array[0 20] of Real; x, P, U : Real;
Begin Repeat
Write(‘ Nhập N x : ‘); Readln(N, x);
Until (N>0) and ( N<21);
For i:=0 to N { nhập mảng hệ số}
begin
Write(‘Nhập hệ số A[‘, i, ‘]: ‘); Readln(A[i]);
end; U:=1; P:=A[0];
For i:=1 to N begin
(20)Writeln(‘ P=‘, P:6:2); Readln;
End.
Chạy<VD8.EXE>
Chép tập tin nguồn <VD8.PAS>
3 KIỂU CHUỖI KÝ TỰ
3.1 Chuỗi khai báo biến chuỗi :
Một dãy ký tự đặt cặp nháy đơn gọi chuỗi, hay đơn giản chuỗi Dưới ba chuỗi :
‘Ngon ngu Pascal’ ‘Tin hoc 1998’ ‘12345678’
Chuỗi ký tự ‘‘ (chỉ gồm hai dấu nháy đơn liên tiếp) gọi chuỗi rỗng Số ký tự có chuỗi gọi độ dài chuỗi Chuỗi ‘ABCD’ có độ dài 4, chuỗi ‘Pascal’ có độ dài Chuỗi rỗng có độ dài khơng
Biến nhận gía trị chuỗi gọi biến kiểu chuỗi Cách khai báo sau:
Var
Tênbiếnchuỗi : String[N] ; hoặc:
Tênbiếnchuỗi : String ;
trong N nguyên (0 < N < 255) ấn định số ký tự tối đa mà biến nhận gọi độ dài tối đa biến chuỗi Nếu khơng có thị [N] chuỗi có độ dài tối đa 255 ký tự
Ví dụ, cho khai báo : Var
St : String[17]; Diachi : String;
Khi St biến chuỗi có độ dài tối đa 17 ký tự, cịn biến Diachi có độ dài tối đa 255 ký tự
Cần phân biệt độ dài với độ dài tối đa biến chuỗi: độ dài tối đa xác định khai báo khả chứa biến chuỗi, cịn độ dài của chuỗi số ký tự thực có chuỗi
Nếu gán:
St := ‘Nguyen Thi Mai’;
Diachi := ‘Quan 1, Thanh Ho Chi Minh’;
thì biến St có độ dài 14 ký tự, khả chứa tới 17 ký tự Tương tự, biến Diachi có độ dài 29 ký tự cịn độ dài tối đa cho phép 255
Khi gán cho biến chuỗi chuỗi dài độ dài tối đa ký tự thừa bị bỏ qua
Ví du, gán:
St := ‘Quan 1, Thanh Ho Chi Minh’; gía trị biến St St=‘Quan 1, Thanh pho’
Trong b nh c a máy, m t bi n chu i chi m m t s byte b ng đ dài t i đa c a ộ ủ ộ ế ỗ ế ộ ố ằ ộ ố ủ c ng thêm Byte đ u tiên, g i byte 0, ch a m t ký t có mã b ng đ dài th c c a chu i, ộ ầ ọ ứ ộ ự ằ ộ ự ủ ỗ m i byte l i ch a m t ký t C u trúc c a bi n St nói có d ng:ỗ ứ ộ ự ấ ủ ế
N g u y e n T h i M a i
Ðộ dài N (=14) biến St ký tự byte (ký hiệu St[0]) liên quan với sau:
N = Ord ( St[0] ) St[0]= Chr( N )
(21)Length(St)=14
Chú ý Cũng khai báo chuỗi thông qua việc định nghĩa kiểu liệu từ khóa Type Chẳng hạn khai báo chuỗi St nói theo cách sau:
Type
KStr17 = String[17]; Var
St : KStr17 ;
Khi biến chuỗi dùng làm đối số hàm hay thủ tục cần phải khai báo theo cách ( trừ biến chuỗi có kiểu String )
3.2 Truy nhập vào phần tử chuỗi :
Giống mảng, phần tử chuỗi truy nhập thông qua tên chuỗi số phần tử
Gọi N =Length(St), ký tự thứ i (i=1, 2, , N) St ký hiệu St[i] Ví dụ, cho :
St :=‘ABC’;
thì N=3 St[1]=‘A’, St[2]=‘B’, St[3]=‘C’ Lệnh St[1]:=‘a’; biến đổi St thành St=‘aBC’
Như ký tự St[i] dùng biến kiểu ký tự, chuỗi xem mảng ký tự Chẳng hạn để in chuỗi ta in ký tự sau:
For i:=1 to Length(St) write(St[i]);
Ðiều cho thấy chuỗi kiểu liệu có tính cấu trúc
Nhưng mặt khác, chuỗi lại xem gía trị nhất, nhập in chuỗi trực tiếp lệnh:
Readln(St); Write(St);
Ðặc điểm cho thấy chuỗi kiểu liệu có tính đơn giản
3.3 Các thao tác chuỗi :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Phép cộng (nối) chuỗi:
Khi cộng hai chuỗi, ta chuỗi gồm ký tự hai chuỗi ban đầu ghép lại.Ví dụ :
‘tin’ + ‘hoc’ =‘tinhoc’
‘1234’+ ‘5678’ = ‘12345678’
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Phép so sánh chuỗi:
Khi so sánh hai chuỗi, ta so sánh cặp ký tự hai chuỗi từ trái qua phải Nếu phát cặp ký tự khác chuỗi chứa ký tự nhỏ nhỏ Ví dụ: ‘Hong’ > ‘Han’ ‘o’ > ‘a’
‘thanh’ > ‘thao’ ‘n’ > ‘o’
Nếu so sánh hết chiều dài chuỗi ngắn mà cặp khác chuỗi ngắn nhỏ hơn, ví dụ:
‘an’ < ‘anh’ ‘chu’ < ‘chung’
Hai chuỗi chúng độ dài ký tự vị trí tương ứng
3.4 Các hàm liên quan đến chuỗi :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Hàm Length(St) : cho độ dài chuỗi St
(22)Chuỗi rỗng có độ dài
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Hàm Pos(S, St):
Cho vị trí tìm thấy chuỗi S chuỗi St, khơng tìm thấy hàm cho kết qủa
Ví dụ:
Pos(‘Ab’, ‘cdAb3Abm’) = 3, Pos(‘Ab’, ‘1bA3b’) =
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Hàm Copy(St, k, m) : cho m ký tự St tính từ vị trí k
Ví dụ: Copy (‘ABCDEF’, 4, 2) =‘DE’
Nếu k> Length(St) kết qủa chuỗi rỗng
Nếu m> số ký tự đứng sau kể từ vị trí k hàm Copy lấy ký tự từ vị trí k đến hết chiều dài St, ví dụ :
Copy (‘ABCD’, 3, 10) = ‘CD’
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Hàm Concat( St1, St2, , Stn) :
Ghép nối chuỗi St1, St2, , Stn theo thứ tự thành chuỗi Vậy : Concat( St1, St2, , Stn) = St1+St2+ +Stn
3.5 Các thủ tục liên quan đến chuỗi :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Thủ tục Delete(St, k, m) :
Xóa m ký tự biến chuỗi St vị trí thứ k Ví dụ, sau thực lệnh: St:=‘ TurboPascal’;
Delete(St, 1, 5);
thì gía trị St=‘Pascal’ ký tự đầu bị xóa Nếu k > Length(St) khơng xóa
Nếu m > số ký tự đứng sau kể từ vị trí k xóa hết từ vị trí k đến cuối chuỗi Ví dụ, sau thực ba lệnh :
St:=‘Turbo Pascal’; Delete(St, 10, 20); Write(St);
thì in chữ Turbo Pas St bị xóa ký tự cuối nên St=‘Turbo Pas’ INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Thủ tục Insert(S, St, k) :
Chèn chuỗi S vào biến chuỗi St vị trí k Ví dụ, cho : St:=‘ABCD’;
Sau thực lệnh: Insert(‘**’, St, 3);
thì St bị biến đổi thành St=‘AB**CD’
Nếu k> Length(St) S nối vào cuối St Ví dụ, sau thực hai lệnh : St:=‘XYZ’;
Insert(‘ABC’, St, 6); St=‘XYZABC’
(23)Biến đổi số nguyên hay thực x thành kiểu chuỗi gán cho biến chuỗi St Ví dụ, sau thực lệnh :
Str(4752, St); kết qủa St= ‘4752’
Số x định dạng in hình Lệnh Str(4752 : 6, St);
cho kết qủa St=‘ 4752’ (trước số 4752 có ký tự trắng) Nếu x biến thực gía trị x=34.95 lệnh : Str(x :7:3, St);
cho kết qủa St=‘ 34.950’ (trước số 34.950 có ký tự trắng)
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet2.gif" \* MERGEFORMAT Thủ tục Val(St, x, k ):
Biến đổi chuỗi số St thành số nguyên hay thực gán cho biến nguyên hay thực x Số nguyên k dùng để phát lỗi: đổi k=0, ngược lại, gía trị k vị trí có lỗi chuỗi St
Ví dụ, cho ba biến n, k, j kiểu nguyên biến x kiểu thực, sau thực lệnh : St:=‘385’;
Val(St, n, j); Val(‘12.59’, x, k); n=385, j=0, x=12.59 k=0
Nếu gán St := ‘3a7’; thực lệnh: Val(St, n, k);
thì gía trị n khơng xác định cịn k=2 vị trí chữ a chuỗi St, khơng đổi số
3.6 Các ví dụ chuỗi:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 9: Ðổi chuỗi chữ hoa hay chữ thường.
Ðể đổi chuỗi St thành chữ hoa, ta đổi ký tự chuỗi chữ hoa, tức : For i:=1 to Length(St) St[i]:=Upcase(St[i]);
Tương tự, để đổi chuỗi St thành chữ thường, ta đổi ký tự chuỗi St chữ thường:
For i:=1 to Length(St)
if ( St[i]>=‘A’) and (St[i]<=‘Z’) then St[i]:=Chr( Ord(St[i]) + 32) ;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 10: Chuẩn hóa chuỗi ký tự
Cho chuỗi St có nhiều ký tự trắng thừa đầu, cuối từ, St=‘ nguyen van tuan ‘ Chuẩn hóa chuỗi St xóa hết ký tự trắng thừa đầu cuối, hai từ giữ lại ký tự trắng, St =‘nguyen van tuan’
a) Xóa ký tự trắng đầu chuỗi :
Ðể xóa ký tự trắng đầu chuỗi St, ta dùng lệnh: If St[1]=#32 then Delete(St,1,1);
Muốn xóa hết ký tự trắng đầu chuỗi ta dùng lệnh: While St[1]=#32 Delete(St,1,1);
Diễn giải: chừng ký tự St ký tự trắng xóa ký tự khác trắng
Sở dĩ phải dùng vịng lặp While số ký tự trắng đầu chuỗi trước b) Xóa ký tự trắng cuối chuỗi :
(24)Diễn giải: chừng ký tự cuối St cịn khoảng trắng xóa ký tự cuối khác trắng
c) Xóa ký tự trắng thừa hai từ chuỗi :
Muốn xóa ký tự trắng thừa để hai từ ký tự trắng ta làm sau: tìm St chỗ có hai ký tự trắng xóa một, lặp lại thao tác St khơng cịn chỗ có hai ký tự trắng liên tiếp Tức :
k:=Pos(‘ ‘, St); { ‘ ‘ là ký tự trắng } While k >
begin
Delete(St, k, 1); k:=Pos(‘ ‘, St); end;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 11 : đếm chuỗi St có chữ pascal.
Vì chữ pascal có ký tự, nên ta so sánh cụm ký tự St với chuỗi pascal, vị trí 1:
Dem:=0;
For i:=1 to Length(St)
if Copy (St, i, 6) =‘pascal’ then Inc(Dem); Writeln(‘ Số chữ pascal ‘ , Dem);
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 12: Tìm kiếm thay thế
Tìm chuỗi St xem có chứa chữ ‘basic’ khơng, có thay chữ ‘pascal’, khơng có in câu ‘khơng có’ Ví dụ St=‘ngon ngu basic duoc dung bien’, sau thay ta St = ‘ngon ngu pascal duoc dung bien’
Ta dùng hàm Pos để tìm xem St có chứa chữ ‘basic’ khơng Thủ tục Delete xóa chuỗi ‘basic’ khỏi St, thủ tục Insert chèn chuỗi ‘pascal’ vào St vị trí xét:
PROGRAM VIDU12 ;
{ Tìm chữ basic thay chữ pascal } Var
St: String; k: Integer; Begin
Write(‘ Nhập chuỗi St :’); Readln(St); k:= Pos(‘basic’ , St);
If k> then begin
Delete(St, k, 5); { xóa chữ basic }
Insert(‘pascal’ , St, k); { chèn chữ pascal } Writeln(‘ St = ‘, St);
end else
Writeln( St, ‘ khơng có chữ basic ‘) ; Readln;
End.
Chạy <VD12.EXE>
Chép tập tin nguồn <VD12.PAS>
(25)MERGEFORMAT Ví dụ 13: Tính tổng bình phương chữ số số tự nhiên N
Ví dụ N= 325 T=32+22+52 = 38.
PROGRAM VIDU13 ;
{ Tính tổng bình phương chữ số số N} Var
N, T : Longint; i, j , k : Integer; St : String[40]; Begin
Write(‘Nhập số N : ‘); Readln(N);
Str( N, St ); { Ðổi số N chuỗi gởi vào St } T:=0;
For i:=1 to Length(St) do begin
Val ( St[i], j, k ); {Ðổi St[i] số gởi vào j} T:=T+ j*j;
end;
Writeln(‘ Tổng= ‘, T); Readln;
End.
Chạy <VD13.EXE>
Chép tập tin nguồn <VD13.PAS>
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 14: Tách từ chuỗi in riêng dòng:
Cho St=‘ ngon ngu pascal ‘, cần in : ngon
ngu pascal Phương pháp:
Bước 1: -Chuẩn hóa chuỗi St thành St=‘ngon ngu pascal’
-Thêm ký tự trắng vào cuối để St=‘ngon ngu pascal ‘
Bước 2: -Tìm k vị trí ký tự trắng đầu tiên, in k-1 ký tự đầu tiên, từ thứ nhất, xóa k ký tự đầu tiên, kết qủa St=‘ngu pascal ‘
Lặp lại qúa trình St khơng cịn ký tự trắng Chương trình cụ thể sau:
PROGRAM VIDU14 ;
{ Tách từ in riêng dòng } Uses Crt;
Var
St: String; Tu : String[10]; k: Integer; Begin
Clrscr;
Write( ‘Nhập chuỗi St :’); Readln(St);
{ Chuẩn hóa chuỗi St }
While St[1]=#32 Delete(St,1,1);
(26)While k > do begin
Delete(St, k, 1); k:=Pos(‘ ‘, St); end;
Writeln(‘ Chuỗi chuẩn hóa : ’ , St);
Writeln( ‘ Tách in từ dòng: ‘); St:=St + #32; { thêm ký tự trắng vào cuối St} k:=Pos(#32, St);
While k>0 do begin
Tu:=Copy(St, 1, k-1); Writeln(Tu);
Delete(St, 1, k); k:=Pos(#32, St); end;
Readln; End.
Chạy <VD14.EXE>
Chép tập tin nguồn <VD14.PAS>
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A73_files/Bai11_3_files/bullet4.gif" \* MERGEFORMAT Ví dụ 15 :
Ðể kết thúc phần xin giới thiệu chương trình tạo dòng chữ ‘DAI HOC QUOC GIA TP.HCM’ chạy ngang hình từ phải qua trái Chương trình kết thúc ta nhấn phím
Tại vị trí dịng 10, cột 10, ta in chuỗi St ngừng giây lát nhờ thủ tục Delay Sau ta xóa ký tự St lại in St vị trí dịng 10, cột 10 Kết qủa ta có cảm giác chuỗi St dịch sang phải cột Lặp lại thao tác ta thấy chuỗi St chạy sang phải Ðể St không bị ngắn dần tạo cảm giác chuỗi St chạy nối nhau, trước xóa St[1] ta nối St[1] vào cuối St Dưới chương trình cụ thể:
Chú ý hàm Keypressed trả gía tri logic TRUE có phím bàn phím bấm Thủ tục Delay(k) ngừng chương trình thời gian k/1000 giây Hai hàm thủ tục thuộc thư viện CRT
PROGRAM VIDU15 ;
{ Tạo chữ chạy ngang hình} Uses Crt;
Var
St: String[80]; Begin
St:=‘DAI HOC QUOC GIA TP.HCM ‘ ; TextMode(C40);
TextBackground(green); TextColor(yellow); Clrscr;
Repeat
Gotoxy(10,10); Write(St); Delay(500);
St:=St+ St[1]; { nối ký tự đầu vào cuối chuỗi} Delete(St, 1, 1); { Xóa ký tự đầu}
(27)TextMode(C80); End.
Chạy <VD15.EXE>
Chép tập tin nguồn <VD15.PAS>
4 MẢNG HAI CHIỀU (MA TRẬN) 4.1 Khai báo mảng hai chiều:
Mảng hai chiều, gọi ma trận, mở rộng trực tiếp mảng chiều Ta có hai cách khai báo
INCLUDEPICTURE " /AppData/pc/Desktop/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc %20Dai%20Cuong%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Cách 1: Khai báo trực tiếp :
VAR
Tênmảng : Array[n1 n2 , m1 m2] of Tênkiểudữliệu;
trong n1, n2 có kiểu liệu n1< n2, chúng xác định phạm vi số thứ nhất, gọi số dòng Tương tự m1, m2 có kiểu liệu m1< m2, chúng xác định phạm vi số thứ hai, gọi số cột Giống mảng chiều, kiểu liệu số kiểu đếm được: ngun, ký tự, lơ gic, liệt kê
hay đoạn con, không kiểu thực hay chuỗi
Ví dụ, cho khai báo : Var
X : array[1 2, 3] of Real;
Y : array[‘a’ ’c’ , 3] of String[15]; Kết ta nhận hai mảng hai chiều:
Mảng X gồm phần tử kiểu liệu thực: X[1,1], X[1,2], X[1,3]
X[2,1], X[2,2], X[2,3]
Mảng Y gồm phần tử kiểu chuỗi String[15] : Y[‘a’,1], Y[‘a’,2], Y[‘a’, 3]
Y[‘b’,1], Y[‘b’,2], Y[‘b’, 3] Y[‘c’,1], Y[‘c’,2], Y[‘c’, 3]
Có thể ví X nhà hai tầng, tầng có ba phịng giống Các tầng đánh số từ đến 2, tầng, phòng đánh số từ đến Tương tự, Y nhà ba tầng, tầng đánh số ‘a’, ‘b’, ‘c’, tầng có ba phịng đánh số 1, 2,
INCLUDEPICTURE " /AppData/pc/Desktop/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc %20Dai%20Cuong%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Cách 2: Biến mảng khai báo thông qua kiểu mảng định nghĩa trước bằ?g từ khóa TYPE, tức là:
TYPE
Tênkiểumảng= Array[n1 n2 , m1 m2] of Tênkiểudliệu; VAR
Tênmảng : Tênkiểumảng ;
Ví dụ: Hai mảng X Y nói khai báo theo hai bước sau: Type
(28)Kmang2 = array[‘a’ ’c’ , 3] of String[15]; Var
X : Kmang1; Y : Kmang2;
Chú ý: - Có thể xem mảng hai chiều mảng chiều mà phần tử lại mảng chiều
Hai mảng X, Y nói khai báo sau: Type
Kmang1 = array[1 2] of array[1 3] of Real;
Kmang2 = array[‘a’ ’c’] of array[1 3] of String[15]; Var
X : Kmang1; Y : Kmang2;
Hiểu theo cách X mảng gồm hai phần tử X[1] X[2] mà phần tử lại mảng gồm phần tử :
X[1] mảng có phần tử kiểu thực X[1][1], X[1][2], X[1][3] X[2] mảng có phần tử kiểu thực X[2][1], X[2][2], X[2][3] Ðiều tương tự áp dụng cho biến mảng Y
Hai cách viết X[i][j] X[i,j] phần tử
INCLUDEPICTURE " /AppData/pc/Desktop/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bullet2.gif" \* MERGEFORMAT INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo %20pascal%207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet2.gif" \* MERGEFORMAT Khai báo gán giá trị ban
đầu:
Có thể khai báo gán giá trị cho mảng hai chiều, chẳng hạn: Type
Kmang1 = array[1 2, 3] of Real; Const
X : Kmang1 = ( (1.5, 2.5, 3.5), (5.0, 6.5, 7.0) );
Khi X mảng hai chiều có phần tử kiểu thực có giá trị là: X[1,1]=1.5, X[1,2]=2.5, X[1,3]=3.5
X[2,1]=5.0, X[2,2]=6.5, X[2,3]=7.0
Cần nhấn mạnh từ khóa Const song X phần tử X dùng biến, tức phần tử X thay đổi giá trị
4.2 Các thao tác ma trận :
Ðể xác định phần tử mảng hai chiề?, ta viết: Tênbiếnmảng[chỉ số 1, số 2]
Ví dụ:
X[1,1]:=12.5; X[2,1]:=X[1,1]+15; Y[‘a’,1]:=‘Tran Thi Mai’;
Ðể nhập liệu cho mảng hai chiều, ta phải dùng hai vòng lặp duyệt theo hai số, chẳng hạn muốn nhập liệu cho mảng X, ta viết:
For i:=1 to do For j:=1 to do begin
Write(‘nhập phần tử hàng ‘, i, ‘ cột ‘, j , ‘: ‘); Readln(X[i, j]);
end;
(29)For j:=1 to do begin
Write(‘nhập phần tử hàng ‘, ch , ‘ cột ‘, j , ‘: ‘); Readln(X[ch, j]);
end;
trong ch biến kiểu ký tự, i j biến nguyên
Ðể in mảng X lên hình, trình bày giống cách viết ma trận, hàng in dòng, ta dùng lệnh :
For i:=1 to do begin
For j:=1 to write(X[i, j]:3:1); { in hàng thứ i} Writeln; { xuống dòng, chuẩn bị in hàng tiếp theo } end;
4.3 Các ví dụ ma trận :
Vì ma trận mảng chiều mảng chiều nên nhiều toán mảng mở rộng tự nhiên cho ma trận
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo %20pascal%207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Ví dụ 16: Tính tổng của hai ma trận
Nhập vào hai ma trận A, B cấp NxM Tính ma trận C tổng hai ma trận A B, in ma trận C lên hình
Cơng thức tính phần tử ma trận C= A+B : C[i,j ] = A[i, j] + B[i, j] với i=1, , N, j=1, , M Chương trình sau:
PROGRAM VIDU16; { Tính tổng hai ma trận } Uses CRT;
Var
A, B, C : Array[1 10, 10] of Real; i, j , N, M : Integer;
Begin Clrscr; Repeat
Write(‘Nhập số hàng N, số cột M : ‘); Readln(N, M);
Until ( N>0) and ( N<11) and ( M>0) and (M<11); For i:=1 to N do
For j:=1 to M do begin
Write(‘Nhập A[‘ , i, ‘,’ , j , ‘]: ‘); Readln(A[i,j]);
end;
{ nhập B tính C ln} For i:=1 to N do
For j:=1 to M do begin
Write(‘Nhập B[‘ , i, ‘,’ , j , ‘]: ‘); Readln(B[i,j]);
C[i, j]:=A[i, j] + B[i, j]; end;
(30)Writeln(‘ Ma tran A la :’); For i:=1 to N do
begin
For j:=1 to M write(A[i, j]:3:0); Writeln;
end;
{ In ma trân B lên hình } Writeln(‘ Ma tran B la :’); For i:=1 to N do
begin
For j:=1 to M write(B[i, j]:3:0); Writeln;
end;
{ In ma trân C lên hình } Writeln(‘ Ma tran C la :’); For i:=1 to N do
begin
For j:=1 to M write(C[i, j]:3:0); Writeln;
end; Readln; End.
Chạy chương trình <VD16.EXE> Chép tập tin nguồn <VD16.PAS>
INCLUDEPICTURE " /AppData/pc/Desktop/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc %20Dai%20Cuong%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Ví dụ 17: Tìm số lớn (số nhỏ nhất) ma trận A:
Giả sử A ma trận N hàng, M cột, Max biến chứa số lớn phải tìm Khởi đầu ta gán A[1,1] cho Max, sau duyệt tất phần tử ma trận, phần tử lớn Max lưu vào Max, tức là:
Max:=A[1,1]; For i:=1 to N For j:=1 to M do
if Max< A[i, j] then Max:=A[i, j]; Writeln(‘ Số lớn ’, Max);
INCLUDEPICTURE " /AppData/pc/Desktop/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc %20Dai%20Cuong%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Ví dụ 18 : Tìm số lớn (hay số nhỏ nhất) hàng (hay cột) ma trận A:
Hàng i ma trận A có dạng : A[i,1], A[i,2], , A[i,M]
Nếu xem i cố định mảng chiều có M phần tử, nên số lớn hàng i tìm lệnh:
Max:=A[i, 1]; For j:=1 to M
(31)Vì có thảy N hàng nên cơng việc phải làm N lần ứng với i=1, 2, , N, tức là: For i:=1 to N do
begin { tìm số lớn hàng i } Max:=A[i, 1];
For j:=1 to M
if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln hàng ‘, i, ‘ là: ‘, Max) ; end;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/bullet4.gif" \* MERGEFORMAT Ví dụ 19: Kiểm tra ma
trận vng A có đối xứng khơng ?
Ma trận vng A gọi đối xứng không thay đổi ta đổi cột thành hàng đổi hàng thành cột Nói cách khác, ma trận A đối xứng A[i,j] =A[j,i] với i=1, , N với j=1, , N Ví dụ, cho hai ma trận đâỵ:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/img_u102_1.gif" \* MERGEFORMAT
thì A đối xứng, cịn B khơng đối xứng B[1,2] < B[2,1]
Chỉ cần có cặp i, j cho A[i,j]<>A[j,i] A ma trận khơng đối xứng Vậy lệnh kiểm tra tính đối xứng ma trận A là:
Kiemtra := TRUE; For i:=1 to N do For j:=1 to N do
if A[i, j]<>A[j, i] then Kiemtra:=FALSE ; If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘) else
writeln(‘ Không đối xứng ‘);
Trong Kiemtra biến kiểu lôgic
Nhận xét hai lệnh For quét qua tất phần tử ma trận nên có nửa số lần lặp thừa Thật vậy, đường chéo chia ma trận làm hai phần: nửa trái nửa phải Các phần tử đường chéo đối xứng với nên khơng cần phải kiểm tra Nếu phần tử nửa bên trái phần tử đối xứng với nửa bên phải ma trận rõ ràng đối xứng Vì cần duyệt kiểm tra phần tử nửa bên trái đường chéo đủ (vùng tam giác)
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A62_files/Bai10_2_files/img_u102_2.gif" \* MERGEFORMAT Thuật toán tốt đề nghị :
Kiemtra := TRUE; For i:=2 to N do For j:=1 to i-1 do
(32)writeln(‘ Không đối xứng ‘);
Hai câu lệnh For nhược điểm là: xảy A[i,j]<>A[j, i] rồi, lẽ dừng lại kết luận khơng đối xứng vịng For tiếp tục, i chạy đến N j đến i-1
Sử dụng câu lệnh While khắc phục nhược điểm Chỉ cần xảy
A[i,j]<>A[j,i] lần biến Kiemtra gán gía trị FALSE, điều kiện Kiemtra=TRUE bị sai hai vòng lặp kết thúc
Kiemtra:=TRUE; i:=2;
While (Kiemtra=TRUE) and (i<= N) do begin
j:=1;
While ( Kiemtra=TRUE) and ( j<=i-1) do if A[i, j] <> A[j, i] then Kiemtra:=FALSE else
j:=j+1; i:=i+1; end;
If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘) else
writeln(‘ Không đối xứng ‘);
Chương trình thực công việc sau:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bulletcross.gif" \* MERGEFORMAT Nhập vào ma trận vuông A cấp N in ma trận A lên hình
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bulletcross.gif" \* MERGEFORMAT Ðếm ma trận A có số
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bulletcross.gif" \* MERGEFORMAT Tìm số lớn A
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bulletcross.gif" \* MERGEFORMAT Tìm số nhỏ hàng A
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong%20A62_files/Bai10_2_files/bulletcross.gif" \* MERGEFORMAT Kiểm tra xem A có phải ma trận đối xứng không
PROGRAM VIDU19; Uses CRT;
Type
Matran = Array[1 10, 10] of Real; Var
A : Matran;
i, j , N, Dem : Integer; Max, Min : Real; Kiemtra: Boolean; Begin
Clrscr; Repeat
Write(‘Nhập cấp N : ‘); Readln(N);
(33)For i:=1 to N do For j:=1 to N do begin
Write(‘Nhập A[‘, i, ‘,’ , j , ‘]: ‘); Readln(A[i,j]);
end;
{ In ma trân A lên hình } Writeln(‘ Ma tran A la : ’); For i:=1 to N do
begin
For j:=1 to N write(A[i, j]: :0); Writeln;
end;
{ Ðếm số số } Dem:=0;
For i:=1 to N do
For j:=1 to N if A[i, j]=0 then Inc(Dem); Writeln(‘ Có ‘, Dem, ‘ số khơng’);
{ Tìm số lớn ma trận } Max:=A[1,1];
For i:=1 to N do For j:=1 to N do
if Max < A[i,j] then Max:=A[i,j];
Writeln(‘ Số lớn ma trận= ‘, Max : 4:1); { Tìm số nhỏ hàng ma trận } For i:=1 to N do
begin
Min:=A[i,1];
For j:=1 to N if Min > A[i,j] then Min:=A[i,j]; Writeln(‘ Số nhỏ hàng ‘, i , ‘ là: ‘, Min : 4:1); end;
{ Kiểm tra ma trận có đối xứng không} Kiemtra:=True;
For i:=1 to N For j:=1 to i-1 do
if A[i ,j]<>A[j ,i] then Kiemtra:=False; If Kiemtra=True then Writeln(‘ Ðối xứng’) else
Writeln(‘ Không đối xứng’) ; Readln;
End.
Chạy<VD19.EXE>
Chép tập tin nguồn <VD19.PAS>
5 DỮ LIỆU KIỂU TẬP TIN
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bluearrow.gif" \* MERGEFORMAT 5.1 Khái niệm :
(34)Tập tin (file) Pascal kiểu liệu có cấu trúc Mỗi tập tin tập hợp phần tử có chung kiểu liệu nhóm lại thành dãy ghi đĩa tên chung Khái niệm tập tin mảng có điểm gần Song tập tin khác mảng điểm sau đây:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bulletcross.gif" \* MERGEFORMAT Mảng tổ chức nhớ tập tin chủ yếu tổ chức đĩa
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bulletcross.gif" \* MERGEFORMAT Số phần tử mảng xác định khai báo, số phần tử tập tin khơng Các tập tin kết thúc dấu hiệu đặc biệt gọi EOF ( End Of File)
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bulletcross.gif" \* MERGEFORMAT Các phần tử mảng truy xuất thông qua số Các phần tử tập tin truy xuất nhờ biến trung gian điểm vào vị trí chúng đĩa, gọi trỏ tệp Tại thời điểm, trỏ vào vị trí tập tin, gọi vị trí thời
Dưới trình bày hai loại tập tin thường gặp tập tin có định kiểu tập tin văn
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bluearrow.gif" \* MERGEFORMAT 5.2 Tập tin có định kiểu:
Tập tin mà phần tử có kiểu liệu gọi tập tin có định kiểu Kiểu liệu phần tử tập tin kiểu đơn giản ( nguyên, thực, ký tự , lô gic, chuỗi ký tự ) kiểu có cấu trúc ( mảng, ghi)
Cách khai báo kiểu tập tin sau:
Type
TênkiểuTtin = File of Kiểuphầntử ;
Ví dụ: Type
Ksvien = Record
Ten: String[20]; Namsinh : Integer; DTB : Real;
end;
KieuT1 = File of Integer; KieuT2 = File of String[20]; KieuT3 = File of Ksvien ;
Theo khai báo KieuT1 tập tin có phần tử kiểu nguyên ( Integer ), KieuT2 tập tin có phần tử chuỗi ký tự ( String[20] ), KieuT3 tập tin có phần tử ghi kiểu Ksvien
Khi có kiểu tập tin, ta khai báo biến tập tin : Var
F1 : KieuT1; F2 : KieuT2; F3 : KieuT3;
(35)các biến ta thực thao tác tập tin : tạo tập tin, mở, đóng, xóa tập tin, ghi liệu vào tập tin đọc liệu từ tập tin,
Ngoài cách khai báo biến F1, F2, F3 thông qua việc địng nghĩa kiểu liệu trên, Pascal cho phép khai báo trực tiếp biến tập tin sau:
Var
TênbiếnTtin : File of Kiểuphầntử ;
Ví dụ: khai báo ba biến F1, F2, F3 nói theo cách sau : Type
Ksvien = Record
Ten: String[20]; Namsinh : Integer; DTB : Real; end;
Var
F1 : File of Integer; F2 : File of String[20]; F3 : File of Ksvien ;
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bluesq.gif" \* MERGEFORMAT 5.2.1 Các thủ tục chuẩn:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 1) Thủ tục
ASSIGN( biếntậptin, têntậptin) :
Gán tên tập tin cho biến tập tin Ở tên tập tin biểu thức kiểu chuỗi tên thực tập tin Ví dụ :
Assign(F1, ‘DLIEU.DAT’); Assign(F3, ‘QLSV.DAT’);
Sau hai lệnh này, biến F1 đồng với tập tin DLIEU.DAT, thao tác biến F1 thao tác tập tin DLIEU.DAT Tương tự, biến F3 đồng với tập tin QLSV.DAT
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 2) Thủ tục
REWRITE( biếntậptin) :
Khởi tạo tập tin mới, tập tin có đĩa xóa tạo Ví dụ : Rewrite(F1) ; khởi tạo tập tin DLIEU.DAT
Rewrite(F3) ; khởi tạo tập tin QLSV.DAT
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 3) Thủ tục
RESET(biếntậptin):
Mở tập tin có để sử dụng Con trỏ tập tin trỏ vào phần tử (có số thứ tự 0) tập tin
Ví dụ : Reset ( F3); mở tập tin QLSV.DAT
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 4) Thủ tục
WRITE( biếntậptin, b1, b2, , bN):
(36)Ví dụ:
- Cho i, j, k biến kiểu Integer i=10, j=20, k=100, lệnh : Write(F1, i, j, k ) ;
sẽ ghi gía trị 10, 20, 100 vào tập tin DLIEU.DAT -Cho khai báo:
Var
X : Ksvien;
Các lệnh sau gán gía trị cho X ghi X vào tập tin QLSV.DAT: X.Ten:=’Ng Van An’;
X.Namsinh :=1980 ; X.DTB :=6.5;
Write(F3, X);
Sau ghi X vào tập tin QLSV.DAT, trỏ tập tin tự động dời đến vị trí phần tử
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 5) Thủ tục
READ( biếntậptin, b1, b2, , bN) :
Ðọc phần tử tập tin từ vị trí thời trỏ tập tin gán cho biến b1, b2, , bN Kiểu liệu biến b1, b2, , bN phải kiểu với phần tử tập tin Mỗi đọc xong phần tử, trỏ tập tin tự động dời đến phần tử Ví dụ:
Lệnh Read(F1, i, j); đọc hai số nguyên tập tin DLIEU.DAT ( kể từ vị trí thời) gán cho biến nguyên i, j
Lệnh Read(F3, X); đọc ghi thời tập tin QLSV.DAT gán cho biến ghi X INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal
%207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 6) Thủ tục
CLOSE( biếntậptin) : Ðóng tập tin
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 7) Thủ tục
SEEK( biếntậptin, k ) :
Ðặt trỏ tập tin vào phần tử thứ k tập tin Thủ tục cho phép truy xuất trực tiếp phần tử tập tin mà thực từ đầu tập tin
Ví dụ: đọc phần tử thứ 10 tập tin DLIEU.DAT gán cho biến nguyên i in gía trị i :
Seek(F1, 10); Read(F1, i); Write(i);
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 8) Thủ tục
ERASE( biếntậptin) : Xóa tập tin đĩa
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 9) Thủ tục
RENAME( biếntậptin, tênmới ) : Ðổi tên tập tin
Yêu cầu tập tin phải đóng xóa hay đổi tên được
(37)%20A112_files/Bai15_2_files/bluesq.gif" \* MERGEFORMAT 5.2.2 Các hàm chuẩn:
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 1) Hàm
EOF(biếntậptin):
Cho kết qủa True trỏ tập tin cuối tệp, trường hợp khác hàm cho gía trị False
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 2) Hàm
FILESIZE(biếntậptin) :
Cho số phần tử tập tin Nếu tập tin rỗng số phần tử
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT 3) Hàm
FILEPOS(biếntậptin) :
Cho vị trí thời trỏ tập tin Phần tử có số thứ tự Phần tử cuối có số thứ tự FileSize -1
Ví dụ : Ghi số 100 vào cuối tập tin DLIEU.DAT, dùng lệnh: i:=100;
Seek( F1, FileSize(F1) ) ; {Ðặt trỏ vào cuối tập tin} Write(F1, i); { Ghi gía trị i vào cuối tệp}
Ví dụ 20:
Nhập danh sách sinh viên gồm Họ tên, điểm Tốn, Lý, tính điểm trung bình lưu vào tập tin HOSO.DAT Sau đọc liệu tập tin in hình Trong chương trình , chỗ có dấu ~ thay ký tự trắng
PROGRAM VIDU20; Uses CRT;
Const Tenttin = ‘HOSO.DAT’; Type
Ksvien= Record Hoten: String[20]; Toan, Ly, Dtb : Real; end;
KieuTtin = File of Ksvien ; Var
F : KieuTtin ; X : Ksvien ; i: Integer;
Procedure Hienthi ( Var F : KieuTtin); begin
Clrscr;
Writeln(#32 :5, ‘HỌ VÀ TÊN’, #32:6 , ‘ÐTOÁN~~~ÐLÝ~~~~DTB’);
Reset(F);
While Not Eof(F) begin
Read(F, X);
(38)end; {Hết hiển thị} BEGIN
Clrscr;
Assign(F, TenTtin); Rewrite(F);
i:=0; Repeat Clrscr;
Gotoxy(10,4);
Write( ‘NHẬP SINH VIÊN THỨ?‘, i , ‘: ( Enter để kết thúc) ‘ ); With X do
begin
Gotoxy(10,6); Write(‘Ho va ten:’); Gotoxy(10,8); Write(‘Ðiem Toan:’); Gotoxy(10,10); Write(‘Ðiem Ly :’); Gotoxy(20,6); Readln(Hoten); If Hoten<>’’ then
begin
Gotoxy(20,8); Readln(Toan); Gotoxy(20,10); Readln(Ly); DTB:=(Toan+Ly)/2;
end; end;
If X.Hoten<>’’ then Write(F,X); i:=i+1;
Until X.Hoten=’’; Close(F);
Hienthi(F); Close(F); Readln; END.
Chú ý : Nếu tham số chương trình tập tin phải tham số biến, không thể tham số trị.
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bluearrow.gif" \* MERGEFORMAT 5.3 Tập tin văn bản:
Trong Pascal có kiểu tập tin định nghĩa sẵn, kiểu TEXT hay tập tin văn
Ðể khai báo F biến tập tin văn ta viết : Var
F: Text;
Các phần tử tập tin văn ký tự ghi thành dịng có độ dài khác Các dòng phân cách nhờ dấu kết thúc dịng ( End of line) Ðó hai ký tự điều khiển CR ( Carriage return : nhảy đầu dòng) LF ( Line feed: xuống dòng dưới) Ví dụ , đoạn văn sau :
Tap tin van ban Text 12345
Het
được ch a t p tin văn b n thành m t dãy :ứ ậ ả ộ
(39)LF
Các thủ tục Assign, Rewrite, Reset, Write, Read, Close, Erase, Rename dùng cho tập tin văn Ngoài cịn có thêm thủ tục Append(biếntậptin) dùng để mở tập tin văn cho phép ghi thêm liệu vào cuối tập tin
Ðối với tập tin văn bản, đồng thời vừa ghi vừa đọc liệu tập tin có định kiểu
Ðể ghi liệu, trước tiên phải khởi tạo tập tin lệnh Rewrite hay mở tập tin đưa trỏ cuối tệp lệnh Append Sau ghi liệu vào tập tin thủ tục Write hay Writeln
Ðể đọc liệu tập tin có, trước tiên ta phải mở tập tin lệnh Reset Sau đọc liệu thủ tục Read hay Readln
Nếu mở tập tin Rewrite Append khơng thể đọc Read Readln Nếu mở tập tin Reset khơng thể ghi Write hay Writeln INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A112_files/Bai15_2_files/bullet1.gif" \* MERGEFORMAT Ghi liệu vào tập tin văn :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT Thủ tục
WRITE( biếntậptin, bt1, bt2, , btN) : cho phép ghi gía trị biểu thức bt1, bt2, btN vào tập tin văn Các biểu thức bt1, bt2, btN phải thuộc kiểu đơn giản chuẩn ( nguyên, thực, ký tự, lôgic) hay kiểu chuỗi, chúng khơng cần phải có kiểu giống Ví dụ :
Write(F, 3, 10:4, ‘a’:2, ‘Text’, 4.5:6:2);
sẽ ghi vào tập tin thành dãy sau ( Dấu ~ hiểu ký tự trắng): 3~~10~aText~~4.50
Chương trình tạo tập tin văn T1.TXT :
Program VIDU21; Var
F: Text; A : Integer; B : Real; Begin
A:=100; B:=1234.5;
Assign(F, ’T1.TXT’); Rewrite(F);
Write(F, ‘Ket qua=’ :10, A:5, B:7:2); Close(F);
End
Nội dung tập tin T1.TXT : ~~Ket qua=~~100~123.45
Như vậy, cách ghi liệu vào tập tin văn hoàn toàn giống in liệu lên hình
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT Thủ tục
(40)Nội dung tập tin văn tạo Pascal hồn tồn xem lệnh Type MSDOS, Norton hay Turbo Pascal,
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A112_files/Bai15_2_files/bullet1.gif" \* MERGEFORMAT Ðọc liệu tập tin văn :
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT Thủ tục
READ( biếntậptin, biến1, biến2, , biếnN) đọc gía trị từ tập tin gán cho biến Các biến1, biến2, , biếnN phải có kiểu liệu phù hợp vơí liệu cần đọc vị trí tương ứng tập tin
Ví dụ: Nếu tập tin T1.TXT có nội dung sau: ~~Ket qua=~~100~123.45
thì để đọc lại liệu này, ta phải khai báo:
Var
St :String[10]; i: Integer ; Z : Real;
Và dùng lệnh:
Reset(F);
Read(F, St, i, Z);
Gía trị St, i, Z là: St=’~~Ket qua=’, i=100, Z=123.45
Nếu khai báo St có kiểu String[9] bị lỗi sau đọc xong ký tự đầu, máy đọc tiếp gía trị =~~100 cho biến ngun i, gía trị bắt đầu dấu = nên không đổi số nguyên
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bullet_dia_blue.gif" \* MERGEFORMAT Thủ tục
READLN(biếntậptin, biến1, biến2, , biếnN ) đọc liệu cho biế? xong đưa trỏ tập tin xuống đầu dòng
Ðặc biệt, lệnh READLN( biếntậptin); khơng đọc cả, đưa trỏ tập tin xuống dòng
Chú ý
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bulletcross.gif" \* MERGEFORMAT Hàm Eof(F) dùng cho tập tin văn bản, ngồi cịn có hàm EOLN(F) cho kết qủa True False tùy theo trỏ tập tin có cuối dịng hay khơng Khi Eof(F)=True Eoln(F) có gía trị True
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong
%20A112_files/Bai15_2_files/bulletcross.gif" \* MERGEFORMAT Thủ tục Seek và hàm FileSize, FilePos không dùng cho tập tin văn
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A112_files/Bai15_2_files/bullet1.gif" \* MERGEFORMAT Các tập tin văn ngầm định:
Trong Pascal có hai biến tập tin văn khai báo sẵn Input Output , tức máy ngầm khai báo :
Var
Input , Output : Text ;
(41)Máy in tập tin văn bản, ngầm khai báo với tên LST Ðể in biểu thức bt1, bt2, , btN máy in, ta phải khai báo sử dụng thư viện chuẩn PRINTER, dùng lệnh :
Write(LST, bt1, bt2, , btN);
INCLUDEPICTURE " /AppData/Local/Temp/Giao%20tinh%20Turbo%20pascal %207.0html/Tin%20Hoc%20Dai%20Cuong%20A112_files/Bai15_2_files/bullet1.gif" \* MERGEFORMAT So sánh tập tin văn với tập tin định kiểu:
Các tập tin có định kiểu cho phép vừa đọc vừa ghi truy nhập trực tiếp vào phần tử gần giống thao tác với mảng
Các tập tin văn không cho phép đồng thời đọc, ghi đọc ghi tuần tự, cho phép ta xem, sửa trực tiếp cách dễ dàng hệ soạn thảo văn đơn giản, NC hay Turbo Pascal
Ví dụ 22:
Cho tập tin văn tên T2.TXT có nội dung là: dong=6
cot =7
8 -2 11 11 12 -2 11 -7 12 -7 11 9 6
Hãy đọc tập tin đưa vào ma trận A in ma trận A lên hình Số dịng số cột ma trận A ghi hai dòng tập tin T2.TXT
Program VIDU22; { vi du ve File Van ban } uses crt;
Type
MANG = array[1 20,1 20] of integer ; Var
A : MANG; N, M : integer; F : Text;
Procedure Nhap; Var
i,j : Byte; st: string[5]; Begin
Assign(F, 'T2.TXT'); Reset(F);
Readln(F, St, N); Readln(F, St, M); For i:=1 to N do begin
For j:=1 to M Read(F, A[i,j]); Readln(F);
end; Close(F); End;
Procedure InMatran; Var
(42)Begin
For i:=1 to N do begin
for j:=1 to M write( A[i,j]:4); writeln;
end; End; BEGIN Clrscr; Nhap; InMatran; Readln; END.
PHẦN BÀI TẬP BÁO CÁO
Hướng dẫn dạy bồi dưỡng học sinh giỏi (HSG) môn Tin học lớp 9.
1. Các thao tác xâu ký tự
1. Cho xâu kí tự gồm n phần tử Hãy xác định số lần có mặt dãy các
nhóm chữ sau: abc
aba abcd
2. Dùng hàm copy tách từ khỏi xâu kí tự cho trước.
3. Hãy nhập xâu kí tụ bỏ tất khoảng trống bên trái nó.
4. Hãy nhập xâu kí tự bỏ tất khoảng trống
bên phải nó.
5. Hãy viết lại đoạn chương trình thực cơng việc hàm COPY.
6 Cho xâu gồm n kí tự Hãy biến đổi xâu cho cách thay đó
a. Dấu phẩy hai dấu chấm than kề nhau.
b Nhóm ba dấu * liền dấu *.
7. Cho xâu gồm n kí tự Hãy biến đổi xâu cho cách:
a Loại khỏi xâu nhóm chữ abc đầu tiên.
b Thay xâu nhóm chữ "house" "houses".
8. Cho trước xâu kí tự gồm n kí tự Hãy biến đổi dãy cách loại khỏi
dãy tất nhóm chữ dạng "abc".
9. Cho trước xâu kí tự gồm n phần tử Hãy thay xâu cụm chữ "child"
thành "childhood".
10. Hãy nhập vào xâu ký tự, sau in từ dịng.
11 Hãy nhập vào string, sau thay tất kí tự khác với kí tự trống
thành chữ "a".
12. Cho trước xâu kí tự Hãy loại khỏi dãy nhóm kí tự nằm dấu
ngoặc ( ), dấu ngoặc phải bỏ Giả sử bên cặp dấu ngoặc khơng có dấu ngoặc khác.
13. Cho trước xâu kí tự Hãy biến đổi xâu xâu khơng có dấu * thì
(43)14. Cho trước xâu kí tự Biết xâu có dấu chấm Hãy biến đổi dãy cách loại bỏ tất dấu trước dấu chấm thay tất cả các chữ số sau dấu chấm cách dấu +.
15. Cho trước xâu gồm n kí tự (n>1) Hãy biến đổi xâu cách thay tất cả
các dấu hai chấm nằm S1, S2, , Sn/2 dấu phẩy thay tất dấu
chấm than nằm Sn/2 + 1, Sn dấu chấm.
16. Cho trước xâu ký tự Trong xâu có xen kẽ ký tự số ký tự
khơng số Ví dụ:
dgghhg456cghh086chgh1fdfgdfg76cgf
Viết chương trình tách phần "số" xâu đưa mảng số nguyên. Trong ví dụ mảng số có phần tử bao gồm 456, 86, 76.
2 Các thao tác mảng chiều
1 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000).
a/ In t ng c a t t c ph n t s dổ ủ ấ ả ầ ử ố ương dãy.
b/ In tích c a t t c ch s cu i c a s Aủ ấ ả ữ ố ố ủ ố i
2 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000) s p x p s ắ ế ố
nguyên x.
Hãy chèn x vào v trí thích h p cho th t c a dãy không thay đ i.ị ợ ứ ự ủ ổ
3 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000) Hãy s p x p dãy ắ ế
s theo chi u tăng d n t ng ch s c a m i ph n t ố ề ầ ổ ữ ố ủ ỗ ầ ử
4 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000).
a/ In đo n g m s dạ ồ ố ương liên ti p nhau, m i đo n m t dòngế ỗ ạ ộ
và cho bi t có đo n.ế ạ
b/ In đo n dạ ương có t ng l n nh t, n u có nhi u đo n th a mãn, in ổ ớ ấ ế ề ạ ỏ
đo n có t ng ch s ph n t nh nh t.ạ ổ ỉ ố ầ ử ỏ ấ
5 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000).
a/ In ph n t đầ ượ ặ ạc l p l i m ng.ả
b/ In s nguyên dố ương nh nh t không xu t hi n m ng.ỏ ấ ấ ệ ả
6 Nh p vào N s nguyên Aậ ố i ( N < 100, -32000 <=Ai <= 32000).
Hãy xóa b t m t vài ph n t c a dãy đ ph n t l i (v n gi nguyên v ớ ộ ầ ủ ể ầ ử ạ ẫ ữ ị
trí) t o thành m t dãy gi m d n.ạ ộ ả ẩ
3 Các thao tác mảng chiều
1. Viết chương trình nhập vào mảng hai chiều a[i,j] dòng cột In mảng
vừa nhập.
2. Viết chương trình nhập vào mảng hai chiều a[i,j] dòng cột In :
a. Mảng vừa nhập
b. Các phần tử hàng lẻ.
c. Các phần tử cột chẵn.
d. Các phần tử giao hàng lẻ cột chẵn hàng chẵn cột lẻ.
(44)3. Viết chương trình nhập vào mảng hai chiều a[i,j] dòng cột ( ma trận vuông) In :
a. Các phần tử đường chéo chính.
b. Các phần tử đường chéo phụ.
c. Các cặp phần tử đối xứng với qua đường chéo chính.
4. Viết chương trình nhập vào mảng hai chiều a[i,j] dòng cột In :
a. Các phần tử số chẵn hàng lẻ phần tử số lẻ hàng
chẵn.
b. Vị trí phần tử số dương mảng, đếm số phần tử này, cho biết
chúng có tổng bao nhiêu.
5. Viết chương trình nhập vào mảng hai chiều m dòng n cột In :
a. Các số nguyên tố mảng, cho biết vị trí số.
b. Các số phương mảng, cho biết vị trí số.
c. Các số lập phương mảng, cho biết vị trí số.
d. Các số Palinrome mảng, cho biết vị trí số.
6. Viết chương trình nhập vào mảng hai chiều a[i,j] m dòng n cột In :
a. Giá trị nhỏ mảng vị trí mảng.
b. Giá trị lớn mảng vị trí mảng.
c. Giá trị dương nhỏ mảng vị trí mảng.
d. Giá trị dương lớn mảng vị trí mảng.
e. Giá trị âm lớn mảng.
f. Phần tử có giá trị tuyệt đối lớn mảng.
g. Hàng có tổng phần tử lớn nhất
h. Cột có tổng phần tử nhỏ nhất.
i. Hàng cột có chung phần tử lớn nhất.
7. Viết chương trình nhập vào mảng hai chiều m dịng n cột
a. Sắp xếp hàng chẵn tăng, hàng lẻ giảm In mảng kết quả.
b. Sắp xếp cột chẵn giảm, cột lẻ tăng In mảng kết quả.
c. Lưu tất phần tử mảng vào mảng chiều theo hình thức đi
theo hàng từ xuống theo cột từ trái qua phải.
8. Nhập vào mảng chiều có 20 phần tử Chia phần tử mảng vào một
(45)4 Các thao tác tệp
1 Một file văn đĩa có tên SON.INF chứa dòng bao gồm hai số tự nhiên n, m viết cách dấu cách Sau ví dụ file này: 4 5
Em viết đoạn chương trình nhập hai số từ file in kết hình. 2 Một file văn đĩa có tên SOD.INF chứa hai dòng, dòng bao gồm số tự nhiên n, m Sau ví dụ file này:
4 5
Em viết đoạn chương trình nhập hai số từ file in kết hình. 3 Một file văn có tên DATA.TXT lưu trữ số liệu mảng n số có dạng sau:
- Dòng DATA ghi số n.
- n dòng file ghi n số, số dòng.
Viết chương trình nhập số liệu dãy vào mảng in liệu mảng trên sau lại theo thứ tự tăng dần.
4 Một file văn có tên DATA.TXT lưu trữ số liệu mảng n số có dạng sau:
- Dòng DATA ghi số n.
- Dòng file ghi n số, số cách tối thiểu dấu cách.
Viết chương trình nhập số liệu dãy vào mảng in liệu mảng trên.
5 Cho file văn ghi số liệu bảng số N x M có dạng sau: - Dòng ghi hai số N, M cách dấu cách.
- N dòng ghi số liệu N hàng, dòng bao gồm M số cách dấu cách.
Sau ví dụ file vậy: 4 5
3 -1 12 10 -1 1 1 10 -11 2 -1 7
Viết chương trình nhập liệu từ file vào mảng số N x M.
Chuyên đ đề ược vi t t kinh nghi m gi ng d y môn Tin h c l p khóa, qua qế ệ ả ọ trình d y b i ưỡng đ i n tin t năm h c 2011 – 2012, qua nhi u tình hu ng th c tộ ể ọ ề ố ự ế gi ng d y, t ng khóa h c sinh yêu c u đ thi c p t nh, c p huy n mà đ a ý ki n chả ọ ầ ề ấ ỉ ấ ệ ế ủ quan có tính chia s v v n đ d y b i dẻ ề ấ ề ưỡng h c sinh gi i môn Tin h c.ọ ỏ ọ
Mong th y thơng c m cho thi u sót c a chuyên đ r t vui đầ ả ế ủ ề ấ ược nghe, trao đ i,ổ th o lu n th y cô v v n đ quan tâm.ả ậ ầ ề ấ ề
Xin chân thành c m n.ả
// Các th y có th trao đ i v n i dung chuyên đ qua s liên h :ầ ể ổ ề ộ ề ố ệ 09652 444 81 ( Đinh Văn Thông – ph n l p 8)ầ
038648 1278 (Lê Duy Bình – ph n l p 9)ầ
(46)Người vi t chuyên đế ề
y<VD1.EXE> nguồn <VD1.PAS> y<VD2.EXE> nguồn <VD2.PAS> Chạy<VD3.EXE> nguồn <VD3.PAS> Chạy<VD6.EXE> nguồn <VD6.PAS> Chạy<VD8.EXE> nguồn <VD8.PAS> <VD12.EXE> nguồn <VD12.PAS> <VD13.EXE> nguồn <VD13.PAS> <VD14.EXE> nguồn <VD14.PAS> <VD15.EXE> nguồn <VD15.PAS> Chạy chương trình <VD16.EXE> Chép tập tin nguồn <VD16.PAS> Chạy<VD19.EXE> nguồn <VD19.PAS>