1. Trang chủ
  2. » Giáo Dục - Đào Tạo

TAI LIEU BDHSG TIN 8 - 9

43 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 43
Dung lượng 322,45 KB

Nội dung

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 n100, 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 n100, 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 :ự ế ể ự

tự

ASCII

tự

ASCII

tự

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>

Ngày đăng: 02/04/2021, 19:44

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w