1. Trang chủ
  2. » Giáo án - Bài giảng

HƯỚNG DẪN DẠY BỒI DƯỠNG HỌC SINH GIỎI MÔN TIN HỌC

72 180 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 72
Dung lượng 657,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Muốn dạy bất cứ nội dung nào, trước hết bạn phải nắm vững và hiểu sâu sắc lí thuyết của vấn đề đó. Tin học lập trình không phải là môn học có tính chất học thuộc như các môn khoa học xã hội (Văn, Sử, Địa); cũng không có sẵn định lí, tính chất như các môn khoa học tự nhiên (Toán, Lí, Hóa) để cứ thế áp dụng. Học lập trình là học cách sử dụng một ngôn ngữ để diễn đạt giao tiếp với máy tính và đặc biệt là giải quyết được các bài toán đặt ra nhờ sức mạnh tính toá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 là ta đang đượ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ác công cụ này thì không thể giao tiếp thành công tức là ta không chuyển tải thành công để máy tính hiểu.

Trang 2

Trước khi đi vào n i dung chính c a chuyên đ , xin nói ng n g n v ngôn ng l p trình ộ ủ ề ắ ọ ề ữ ậPascal:

Pascal là một ngôn ngữ lập trình bậc cao

do 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à toán học và nhà triết học

người Pháp nổi tiếng Blaise Pascal

Pascal là một ngôn ngữ lập trình bậc cao có các từ khóa bằng tiếng Anh, tính logic Toán học chặtchẽ, đặc trưng bởi thuật toán và khả năng trừu tượng hóa cao Điều này lí giải vì sao những học sinhhọc Toán tốt, thông minh lại dễ dàng tiếp thu dạng kiến thức này

Do tính ch t và n i dung c a môn h c mà chuyên đ t p trung ch y u vào ấ ộ ủ ọ ề ậ ủ ế thu t toánậ và

ch t toánấ khi 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 đi u ki n ệ ề ệ

Cú pháp:

Câu l nh đi u ki n d ng thi u ệ ề ệ ạ ế Câu l nh đi 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>

Trang 3

<câu l nh n>; ệ

Until <đi u ki n ề ệ >;

Các phép toán và hàm s h c ố ọ

* Các phép toán trê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 và s th c:ố ọ ử ụ ể ố ố ự

Abs(n): Giá tr tuy t đ i c a s n ị ệ ố ủ ố

Sqr(x): bình phương c a s x.ủ ố

Sqrt(x): cho k t qu là căn b c hai c a x.ế ả ậ ủ

Odd(x): cho k t qu là true n u x s l , ngế ả ế ố ẻ ượ ạc l i là 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 tuy t đ i bé h n n.ố ự ớ ố ị ệ ố ơ

Inc(n): Tăng n thêm 1 đ n v (n:=n+1).ơ ị

Dec(n): Gi m n đi 1 đ n v (n:=n-1).ả ơ ị

Các phép toán logic

Gi s A và B là hai giá tr ki u Boolean K t qu c a các phép toán đả ử ị ể ế ả ủ ược th hi n quaể ệ

b ng dả ưới đây:

A.2 Yêu c u v ki n th c và 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 và hi u sâu s c lí thuy tế ạ ả ắ ữ ể ắ ế

c a v n đ đó Tin h c l p trình không ph i là môn h c có tính ch t h c thu c nh các mônủ ấ ề ọ ậ ả ọ ấ ọ ộ ưkhoa h c xã h i (Văn, S , Đ a); cũng không có s n đ nh lí, tính ch t nh các môn khoa h c tọ ộ ử ị ẵ ị ấ ư ọ ự

(1) Hi u sâu s c lí thuy tể ắ ế

Trang 4

di n đ t giao ti p v i máy tính và đ c bi t là gi i quy t đễ ạ ế ớ ặ ệ ả ế ược các bài toán đ t ra nh s cặ ờ ứ

m nh tính toá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 là ta đang đọ ế ề ữ ậ ể ể ượ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ác công cả ể ế ắ ắ ụnày thì không th giao ti p thành công t c là 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 đó - đi u này không d vì 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 và đ c bi t là đòiử ụ ộ ự ộ ắ ấ ị ặ ệ

h i nhi u ch t Toán, s thông minh, t duy linh ho t, kh năng sáng t o.ỏ ề ấ ự ư ạ ả ạ

Khi truy n đ t rõ ràng, d hi u lí thuy t l p trình, các th y cô có th kh i g i s h ng thú, ề ạ ễ ể ế ậ ầ ể ơ ợ ự ứtìm tòi, mu n khám phá và c s sáng t o ban đ u ngố ả ự ạ ầ ở ườ ọi h c

D y lí thuy t sẽ có nhi u đi m tạ ế ề ể ương đ ng gi a các th y cô (vì lí thuy t chung, có s n trong ồ ữ ầ ế ẵsách và ph n l n th y cô sẽ không gia công thêm trình t SGK hầ ớ ầ ự ướng d n) nh ng d y thu t ẫ ư ạ ậtoán thì ph i th c t (và càng th c t càng t t) L u ý r ng đ c tr ng c a thu t toán là tính ả ự ế ự ế ố ư ằ ặ ư ủ ậ

tu n t logic đ m b o khi th c hi n đúng th t các bầ ự ả ả ự ệ ứ ự ước đó thì ta có được k t qu ế ả

Th y, cô có th l y ví d v d y m t thu t toán trong chầ ể ấ ụ ề ạ ộ ậ ương trình Tin h c l p 8 không ?ọ ớ

Trong quá trình h c l p trình, h c sinh c n có kh năng đ c và 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 trên m ng) và ch khi đ c và hi u đả ủ ạ ủ ự ẻ ạ ỉ ọ ể ược code m i ớ

t b sung cho mình cách gi i tham kh o:ự ổ ả ả

Ví d v i đo n code sau, th y cô sẽ minh h a nh th nào ?ụ ớ ạ ầ ọ ư ế

(3) D y thu t toán nh th nào?ạ ậ ư ế

(4) Minh h a c th các đo n code m uọ ụ ể ạ ẫ

Trang 5

n2:=((n1-1) div 3)*2; //so ca con lai sau khi nguoi thu 2 lay

Đây là đ bài c a code gi i trên:ề ủ ả

Ba người đi câu được m t s lộ ố ượng không l n h n N con cá M t m i và 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 3 thì d m t con bèn v t m t con cá xu ng sông và đem v m t ph n ba s cá Ngư ộ ứ ộ ố ề ộ ầ ố ười

th hai th c d y tứ ứ ậ ưởng hai người kia còn ng , đ m s cá th y chia ba d m t nên v t xu ngủ ế ố ấ ư ộ ứ ốsông m t con r i đem v m t ph n ba s cá Ngộ ồ ề ộ ầ ố ười th ba th c d y tứ ứ ậ ưởng mình d y s mậ ớ

h n c anh ta đ m cá th y chia ba d m t nên cũng v t m t con xu ng sông và đem v m tơ ả ế ấ ư ộ ứ ộ ố ề ộ

A.3 Bà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 bài sẽ đ ầ ờ ả ậ ấ ẫ ắ ỗ ượ 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 khi ti p thu chuyên đ này, các th y cô c n gi i quy t đ ể ế ả ố ấ ế ề ầ ầ ả ế ượ c các bài

t p đ a ra ít nh t theo cách riêng c a b n thân ho c c g ng làm đ ậ ư ấ ủ ả ặ ố ắ ượ c càng nhi u càng t t ề ố các yêu c u kèm theo m i bài ầ ỗ

+ N u đ bài ch a chính xác ho c thi u tr ế ề ư ặ ế ườ ng h p, ho c có th có thu t toán t t h n đ gi i ợ ặ ể ậ ố ơ ể ả thì các th y cô có th trao đ i khi tham gia chuyên đ ầ ể ổ ề

Trang 6

Bài 2 (cách s d ng bi n, hàm div, mod ử ụ ế )

Nh p vào m t s nguyên dậ ộ ố ương n có 4 ch s Hãy in ra t ng các ch s c a nó mà không ữ ố ổ ữ ố ủdùng thêm bi n nào khác.ế

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ầ ỉ ệ ế ệ

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 là 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 là năm nhu n thì c n thêm ít nh t m y năm n a đ tr thành năm nhu n ?ế ậ ầ ấ ấ ữ ể ở ậ

Bài 5 (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 ra s lố ượng các ch s c a nó.ữ ố ủ

Ví d :ụ

Trang 7

Bài 7 (l nh for, l nh if) ệ ệ

a In ra các s t nhiên t 1đ n 100, m i hàng k s cách đ u nhau (k nguyên dố ự ừ ế ỗ ố ề ương nh h nỏ ơ20)

Bài 8 (l nh for, ch t Toán) ệ ấ

Cho các hình ch nh t có s đo các c nh là các s nguyên dữ ậ ố ạ ố ương và chu vi b ng P ằ

Nh p vào tu i cha, tu i con hi n t i.ậ ổ ổ ệ ạ

In ra s năm ch a t i ho c s năm đã qua mà tu i cha g p đôi tu i con (phân bi t + ho c -)ố ư ớ ặ ố ổ ấ ổ ệ ặ

Trang 8

N = 100 2519

Bài 11 T Ong ổ (ch t Toán) ấ

T ong bao g m nhi u ô gi ng nhau hình l c bát Các ô này đ , ch a m t, sáp, ongổ ồ ề ố ụ ể ở ứ ậnon, Ban đ u ong xây m t ô Sau đó xây ti p các ô k c nh v i ô ban đ u, làm thành l pầ ộ ế ề ạ ớ ầ ớ

th hai, sau đó xây ti p các ô k c nh v i ô l p th hai, làm thành l p th 3, ứ ế ề ạ ớ ở ớ ứ ớ ứ

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ó là s nguyên t hay không ? n u có ghi ‘yes’, ngể ố ố ế ượ ạc l i ghi ‘no’

Ví dụ :

Bài 13 (Thu t toán Đ m) ậ ế

Nh p vào s nguyên dậ ố ương N in ra N s nguyên t đ u tiên (N < 1000).ố ố ầ

Ví dụ :

Bài 14 (Thu t toán Euclid, ch t Toán ậ ấ )

Nh p vào hai s nguyên dậ ố ương a và b (a , b nh h n 10ỏ ơ 9)

a) hãy in ra UCLN(a,b) b ng 2 cách khác nhau.ằ

b) hãy in ra BCNN(a,b)

Ví dụ :

Trang 9

Nh pậ In raA= 4

B = 6

UCLN(4,6) = 2BCNN(4,6) = 12

Bài 15 (ch t Toán )

Cho hình ch nh t v i hai kích thữ ậ ớ ước a và b (a, b là các s nguyên dố ương nh h n 10ỏ ơ 9) H iỏ

c n ít nh t bao nhiêu nhát c t (m i nhát c t song song v i m t trong hai c nh c a hình chầ ấ ắ ỗ ắ ớ ộ ạ ủ ữ

nh t) đ chia hình ch nh t thành các hình vuông có c nh b ng nhau.ậ ể ữ ậ ạ ằ

Nh p vào hai s nguyên dậ ố ương a, b là hai kích thướ ủc c a hình ch nh t.ữ ậ

Nh p vào m t dãy s nguyên g m N s Aậ ộ ố ồ ố i(n< 100, 1000 − ≤ A i ≤ 1000)

Hãy in ra các s chính phố ương có trong dãy s trên Có t t c bao nhiêu s chính phố ấ ả ố ương ?

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 − ≤ A i ≤ 1000) khác nhau đôi m t.ộ

H i sau khi s p x p dãy s trên tăng d n, thì s v trí th k c a dãy ban đ u trong dãy đã ỏ ắ ế ố ầ ố ở ị ứ ủ ầ

Bài 18 (t trong ra ngoà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 và

in ra màn hình giá tr c a c a bi u th c T (l y 8 ch s th p phân sau d u ph y)ị ủ ủ ể ứ ấ ữ ố ậ ấ ả

1 2 3

T = + + + + n (có n d u căn b c hai)ấ ậ

Trang 10

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ự và biến kiểu ký tự:

Trang 11

Các ký tự dùng trong máy tính điện tử được liệt kê đầy đủ trong bảng mã ASCII gồm

256 ký tự khác nhau và được đánh số thứ tự từ 0 đến 255 Số thứ tự của mỗi ký tự còn gọi là

mã ASCII của ký tự đó Biểu 6.5 liệt kê một phần của bảng mã ASCII gồm các chữ số và chữ cái kèm theo mã của chúng

Trong bảng, ký tự có mã bằng 32 là ký tự trắng (space)

Tuy có 256 ký tự khác nhau song chỉ có 128 ký tự đầu tiên là hay dùng, còn lại là các

ký tự mở rộng Các ký tự có mã từ 0 đến 31 gọi là các ký tự điều khiển, không in ra được, được dùng để điều khiển các thiết bị ngoại vi, chẳng hạn ký tự có mã là 7 dùng để tạo một tiếng kêu bip, ký tự có mã là 13 dùng để chuyển con trỏ màn hình xuống đầu dòng dưới Mỗi ký tự trong bảng mã ASCII gọi là một hằng ký tự, chiếm độ dài 1 byte, và khi viết trong Pascal phải được đặt trong cặp nháy đơn: ‘0’, ‘1’, ‘A’, ‘B’, ‘$’,

Giữa các ký tự, có một thứ tự mặc nhiên theo nguyên tắc : ký tự có mã nhỏ hơn thì nhỏhơn Tức là:

Trang 12

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc%20Dai

bảng mã của các chữ cái ta suy ra:

Mã chữ thường = Mã chữ hoa tương ứng + 32 (1)

UpCase(ch): đổi ký tự ch thành chữ hoa Ví dụ:

Upcase( ‘a’ ) = ‘A’, Upcase( ‘b’ ) = ‘B’, Upcase( ‘A’ ) = ‘A’

Ký tự có mã là 7 gọi là ký tự BEL (chuông), và lệnh:

Write( Chr(7) ) ; hay Write(#7) ;

có tác dụng phát ra một tiếng kêu bip

Chú ý:

Trang 13

%20Cuong%20A25_files/Bai06_4_files/bullet_dia_green.gif" \* MERGEFORMAT Trong

TP không có hàm đổi chữ hoa ra chữ thường, nhưng có thể làm việc này nhờ công thức (1)

và hai hàm Ord và Chr :

Chữ thường := Chr ( Ord(chữ hoa) + 32 )

INCLUDEPICTURE "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 một số nguyên k, 0< k < 256, in ra ký tự có mã là

k Chương trình kết thúc khi nhập vào số 0 :

Trang 14

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin

%20Hoc%20Dai%20Cuong%20A25_files/Bai06_4_files/bullet2.gif" \*

MERGEFORMAT Ví dụ 2: Nhập một ký tự, nếu là chữ hoa thì đổi ra chữ thường, nếu

là chữ thường thì đổi ra chữ hoa

Trang 15

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMATKiểu dữ liệu chung của các phần tử trong mảng

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMATKiểu dữ liệu của chỉ số và phạm vi của chỉ số

Kiểu dữ liệu của các phần tử mảng là mọi kiểu dữ liệu mà một biến có thể có Tuy nhiên,

kiểu dữ liệu của chỉ số thì không được là kiểu thực hay kiểu chuỗi, nó chỉ có thể là kiểu đếm

được : nguyên, ký tự, lôgic, liệt kê hay đoạn con

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin

%20Hoc%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \*

MERGEFORMAT Khai báo mảng một chiều :

Mảng một chiều, còn gọi là dãy, hay đơn giản là mảng, có thể khai báo theo một trong hai

cách :

INCLUDEPICTURE "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 tiếp theo cách sau :

VAR

Tênmảng : Array[m1 m2] of Tênkiểudữliệu ;

Ở đây m1, m2 là hai hằng xác định phạm vi của chỉ số, chúng có chung một kiểu dữ liệu,và m1 < m2

Ví dụ: Cho khai báo dưới đây:

đó là:

A[0], A[1], A[2], , A[10]

Trang 16

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMATMảng thứ hai tên là HTen gồm 5 phần tử cùng kiểu dữ liệu là String[18] ứng với các chỉ số

từ 1 đến 5:

Hten[1], Hten[2], Hten[3], Hten[4], Hten[5]

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet_dia_blue.gif" \* MERGEFORMATMảng thứ ba tên là B, gồm 4 phần tử cùng kiểu Integer ứng với các chỉ 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 là dãy A, gồm 11 phòng liên tiếp giống hệt nhau được đánh số thứ tự từ 0,1, 2, , đến 10:

%20Cuong%20A61_files/Bai10_1_files/bullet5.gif" \* MERGEFORMAT Cách 2 : Khai

báo qua một kiểu dữ liệu mới, gồm hai bước:

Bước 1: Ðịnh nghĩa kiểu dữ 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 dữ liệu là kiểu mảng:

VAR

Tênmảng : Tênkiểumảng ;

Ví dụ, đối với các mảng A, B và Hten ở trên ta có thể khai báo theo cách 2, như sau:

Type

Mang1 = array[0 10] of Real;

Mang2 = array[1 5] of String[18];

Trang 17

Mang3 = array[‘a’ ’d’] of Integer;

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 các phần tử mảng, chẳng hạn như dưới đây:

Trang 18

Chỉ số của một phần tử có thể là một biến, một hằng, hay một biểu thức Ví dụ, cho i là biến kiểu nguyên, khi đó ta có thể dùng các lệnh:

i:=6;

A[i]:=100.25;

Hai lệnh trên tương đương với một lệnh:

A[6]:=100.25;

Nếu biến i có giá trị là 6 thì lệnh :

A[ i div 2 +1] := 4.5; tương đương với lệnh:

A[4]:=4.5; vì biểu thức i div 2 +1 có gía trị là 4

Khi nhập dữ liệu cho các phần tử của một mảng , ta có thể dùng câu lệnh For, While hay Repeat

Ví dụ, nhập dữ liệu cho các phần tử của mảng A:

Trang 19

begin

Write(‘Nhap phần tử thứ ‘, ch, ‘: ‘);

Readln(B[ch]);

end;

Ðể in các gía trị của mảng A lên màn hình, ta viết :

For i:=0 to 10 do Write(A[i]:6:2);

Các gía trị của mảng A sẽ được in liên tiếp nhau trên cùng một dòng Còn nếu muốn in mỗi phần tử trên một dòng, ta thay lệnh Write bằ?g Writeln

Tương tự, mảng B được in lên màn hình bằng lệnh :

For ch:=‘a’ to ‘d’ do Write(B[ch]);

Chú ý : Turbo Pascal cho phép gán một mảng này cho một mảng khác.

Nếu X, Y là hai biến mảng cùng một kiểu mảng thì lệnh:

X := Y;

có nghĩa là lấy gía trị của từng phần tử của mảng Y gán cho phần tử tương ứng trong 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 do X[i] :=Y[i];

2.3 Các bài toán cơ bản về mảng :

INCLUDEPICTURE "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 hiện của gía trị x trong dãy A1, A2, , An

Ví dụ gía trị x=6 xuất hiện 3 lần trong dãy 6 7 1 2 6 0 6 1

Ta dùng biến Dem kiểu nguyên để đếm số lần xuất hiện của x Ðầu tiên ta gán Dem:=0, sau đó duyệt từng phần tử A1, A2, , An, mỗi khi có một phần tử bằng x thì tăng biến Dem lên một đơn vị Kết qủa là biến Dem có gía trị đúng bằng số phần tử bằng x Hai lệnh chính

của thuật toán là:

Trang 20

Dem:=0;

For i:=1 to N do If A[i]=x then Dem:=Dem+1;

Ví dụ, đếm trong dãy số A có bao nhiêu số 0, ta viết:

Dem:=0;

For i:=1 to N do 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 ) là điều kiện để biến Dem được tăng thêm 1,

vậy bài toán trên có thể mở rộng là: hãy đếm số phần tử của mảng A thỏa mãn một điều kiện

cho trước Trong lệnh For ở trên, khi thay đẳng thức A[i]=x bằng A[i] thỏa điều kiện , ta

được thuật toán tổng quát hơn :

Dem:=0;

For i:=1 to N do If A[i] thỏa điều kiện then Dem:=Dem+1;

Chương trình sau nhập một mảng A có N phần tử, in mảng A lên màn hình, và đếm xem mảng A có bao nhiêu số dương :

Trang 21

For i:=1 to N do If A[i]>0 then Dem:=Dem+1;

Writeln(‘ Số số dương = ‘ , Dem );

4: Tìm số lớn nhất của dãy A1, A2, , An

Gọi Max là biến chứa số lớn nhất phải tìm, thế thì :

Bước 1: Gán Max:=A[1];

Bước 2: Nếu Max<A[2] thì gán Max:=A[2];

Bước 3: Nếu Max<A[3] thì gán Max:=A[3];

Bước n: Nếu Max<A[n] thì gán Max:=A[n];

Khởi đầu, Max được gán giá trị A[1] Sang bước 2, Max được so sánh với A[2] để chọn

ra số lớn nhất giữa A[1], A[2] và lưu vào biến Max Sang bước 3, Max được tiếp tục so sánh

Trang 22

với A[3] để tìm ra số lớn nhất giữa A[1], A[2], A[3], v.v Kết qủa, sau bước n, biến Max sẽ chứa số lớn nhất của dãy A[1], A[2], , A[n].

Quá trình trên được mô tả bằng hai lệnh:

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet_dia_green.gif" \* MERGEFORMATKhông nhất thiết phải gán giá trị ban đầu cho Max là A[1], mà có thể gán cho Max một phần tử tùy ý trong mảng, ví dụ phần tử A[n] chẳng hạn, nhưng khi đó biến i trong lệnh For phải chạy bắt đầu từ 1

INCLUDEPICTURE "Giao%20tinh%20Turbo%20pascal%207.0html/Tin%20Hoc

%20Dai%20Cuong%20A61_files/Bai10_1_files/bullet4.gif" \* MERGEFORMAT Ví dụ

5: Bài toán sắp xếp mảng tăng dần (hay giảm dần)

Cho dãy A[1], A[2], , A[n], nói rằng A là một dãy tăng nếu A[1] < A[2]< < A[n], tương

tự, A là dãy giảm nếu A[1] > A[2] > >A[n] Dãy đồng nhất A[1]=A[2]= =A[n] là trường hợp đặc biệt, vừa là dãy tăng, vừa là dãy giảm

Ví dụ:

Dãy 1 3 3 5 5 6 6 6 là dãy tăng

Dãy 9 9 8 5 5 4 0 0 là dãy giảm

Dãy 1 3 3 2 5 4 6 6 là dãy không tăng không giảm

Bài toán đặt ra là: cho một dãy A[1], A[2], , A[n] bất kỳ, hãy thực hiện các hoán đổi cácgía trị của các phần tử trong mảng A để A lập thành một dãy tăng

Ví dụ, cho dãy A có 5 phần tử A[1]=9, A[2]=7, A[3]=5, A[4]=8, và A[5]= 2, cần thực hiệncác hoán đổi như thế nào để có A[1]=2, A[2]=5, A[3]=7, A[4]=8 và A[5]=9

Có những phương pháp sắp xếp mảng khác nhau, ở đây chỉ xin giới thiệu một phương pháp, tuy chưa phải là hay nhưng đơn giản và dễ hiểu cho những người mới lập trình, đó là phương pháp lựa chọn trực tiếp (Straight selection sort)

Ý tưởng của phương pháp là như sau:

Trang 23

Bước 1: Tìm số nhỏ nhất trong các phần tử A[1], A[2], , A[n] và để vào vị trí đầu tiên

A[1]

Bước 2: Tìm số nhỏ nhất trong các phần tử A[2], A[3], , A[n] và để vào vị trí thứ hai

A[2]

.v.v

Bước n-1: Tìm số nhỏ nhất trong hai phần tử A[n-1], A[n] và để vào vị trí n-1 Sau bước

này thì A[n] sẽ là gía trị lớn nhất

Chẳng hạn, xét dãy A có 4 phần tử: {5,3,4,1}:

Bước 1: Nếu A[1]>A[2] thì đổi A[1] với A[2], được: {3,5,4,1}

Nếu A[1]>A[3] thì đổi A[1] với A[3]: không đổi

Nếu A[1]>A[4] thì đổi A[1] với A[4], được: {1,5,4,3}

Bước 2: Nếu A[2]>A[3] thì đổi A[2] với A[3], được: {1,4,5,3}

Nếu A[2]>A[4] thì đổi A[2] với A[4], được: {1,3,5,4}

Bước 3: Nếu A[3]>A[4] thì đổi A[3] với A[4], được: {1,3,4,5}

Sau ba bước, dãy A đã được sắp xếp xong

Tại bước thứ i (i chạy từ 1 đến 3 ), ta phải so sánh A[i] lần lượt với A[j] (j chạy từ i+1 đến4), nếu A[i]>A[j] thì hoán đổi các gía trị của A[i] và A[j], nói cho gọn là đổi chỗ A[i] với A[j] Qúa trình trên được thể hiện bằng hai vòng lặp For :

For i:=1 to 3 do

For j:=i+1 to 4 do

if A[i]>A[j] then Ðổi chỗ A[i] và A[j] ;

Mảng A ở trên chỉ có 4 phần tử, trong trường hợp tổng quát khi mảng A có N phần tử thì lệnh For thứ nhất sẽ có biến i chạy từ 1 đến N-1, và lệnh For thứ hai sẽ có biến j chạy từ i+1 đến N, tức là :

For i:=1 to N-1 do

For j:=i+1 to N do

if A[i]>A[j] then Ðổi chỗ A[i] và A[j] ;

Việc đổi chỗ các gía trị trong A[i] và A[j] được tiến hành bằng cách dùng một biến Z trung gian cùng kiểu dữ liệu với A[i] và A[j] Ðầu tiên gởi tạm gía trị của A[i] vào biến Z,

Trang 24

sau đó đưa gía trị của A[j] vào A[i], và cuối cùng đưa gía trị trong Z vào A[j], tức là phải làm ba lệnh :

Trang 25

Writeln(‘ Dãy đã sắp xep tăng là : ‘);

For i:=1 to N do Write(A[i]:3:0);

Trang 26

End.

Chép tập tin nguồn <VD6.PAS>

Chú ý 1: Muốn sắp dãy A giảm dần thì trong chương trình trên chỉ cần thay dòng

{23}:

If A[i] > A[j] then

bằng dòng :

If A[i] < A[j] then

Tức là thay dấu lớn hơn > bằng dấu nhỏ hơn <

Chú ý 2 : Sắp xếp một bộ phận của dãy

Gọi m và h là hai số nguyên sao cho 1<= m< h<= N, khi đó A[m], A[m+1], , A[h] là một dãy con của dãy A Muốn sắp dãy con A[m], A[m+1], , A[h] tăng (hay giảm) mà không làm ảnh hưởng đến các phần còn lại của dãy A, ta dùng lệnh sau:

7: Kiểm tra mảng có thỏa một tính chất không

Ta thường gặp bài toán kiểm tra xem mọi phần tử của mảng A có thỏa mãn một điều kiện không, ví dụ mảng A có phải là dãy tăng không, có phải là dãy đối xứng không, có phải là một cấp số cộng không,

Mảng A thỏa mãn tính chất đang xét nếu mọi phần tử của nó thỏa một điều kiện xác định nào đó, ngược lại, mảng A không thỏa mãn tính chất đang xét nếu có một phần tử của nó

không thỏa điều kiện này

Trang 27

Hai trạng thái thỏa mãn hay không thỏa mãn được thể hiện bằng hai gía trị TRUE hay

FALSE của một biến Kiemtra kiểu lôgic Ðầu tiên ta gán giả định Kiemtra:= TRUE, sau đó

ta xét từng phần tử của A, chỉ cần có một phần tử không thỏa điều kiện thì gán ngay

Kiemtra:=FALSE Vậy hai lệnh cần dùng là:

Kiemtra:=TRUE;

For i:=1 to N do

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 là tùy từng bài toán cụ thể

Ví dụ: Kiểm tra xem A có phải là một dãy đối xứng không ?

Dãy 1 3 5 4 5 3 1 là đối xứng

Dãy 1 3 5 4 2 3 1 là không đối xứng vì A[3] khác A[5]

Như vậy, dãy N phần tử A1, A2, , An là đối xứng nếu A1=An, A2=An-1, , An=A1, tức Ai =

A phải thỏa để A là một dãy đối xứng

Giả thiết biến Kiemtra đã được khai báo kiểu Boolean Trong chương trình ta dùng các lệnh sau:

Kiemtra:=TRUE;

For i:=1 to N do

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 ‘);

Trong thuật toán trên, lệnh For có thể thay bằng lệnh While, tốc độ sẽ nhanh hơn song cũng khó hiểu hơn:

Kiemtra:=TRUE;

i:=1;

While ( i <=N ) and ( Kiemtra=TRUE) do

if A[i]<>A[N-i+1] then Kiemtra:=FALSE

else i:=i+1;

Trang 28

If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’)

else Writeln( ‘Dãy A không đối xứng ‘);

Bạn đọc hãy viết chương trình cho ví dụ này

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 ‘);

hoàn toà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 ‘);

Ui = xi = xi-1 *x = Ui-1*x với i=1,2, , N

Như vậy, nếu tính được gía trị U ở bước i-1 thì sẽ tính được gía trị U ở bước i bằng lệnh U:= U*x, sau đó ta chỉ việc cộng dồn biểu thức ai*U vào P bằng lệnh P:= P+ ai*U

Chương trình được viết như sau :

Trang 30

Một dãy các ký tự đặt trong cặp nháy đơn gọi là một hằng chuỗi, hay đơn giản là một chuỗi Dưới đây là ba chuỗi :

‘Ngon ngu Pascal’

‘Tin hoc 1998’

‘12345678’

Chuỗi không có ký tự nào ‘‘ (chỉ gồm hai dấu nháy đơn liên tiếp) gọi là chuỗi rỗng

Số ký tự có trong chuỗi gọi là độ dài của chuỗi Chuỗi ‘ABCD’ có độ dài 4, chuỗi

‘Pascal’ có độ dài là 6 Chuỗi rỗng có độ dài bằng không

Biến nhận gía trị là các hằng chuỗi gọi là biến kiểu chuỗi Cách khai báo như sau:

St := ‘Nguyen Thi Mai’;

Diachi := ‘Quan 1, Thanh pho Ho Chi Minh’;

thì biến St có độ dài là 14 ký tự, mặc dù khả năng nó có thể chứa tới 17 ký tự Tương tự, biến Diachi có độ dài là 29 ký tự còn độ dài tối đa cho phép là 255

Trang 31

Khi gán cho biến chuỗi một hằng chuỗi dài hơn độ dài tối đa của nó thì các ký tự thừa sẽ

bị bỏ qua

Ví du, nếu gán:

St := ‘Quan 1, Thanh pho Ho Chi Minh’;

thì gía trị của biến St sẽ là St=‘Quan 1, Thanh pho’

Trong bộ nhớ của máy, một biến chuỗi sẽ chiếm một số byte bằng độ dài tối đa của nó cộng thêm 1 Byte đầu tiên, gọi là byte 0, chứa một ký tự có mã bằng độ dài thực của chuỗi, mỗi byte còn lại chứa một ký tự Cấu trúc của biến St nói trên có dạng:

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 Chẳng hạn có thể khai báo chuỗi St nói trên theo cách sau:

3.2 Truy nhập vào từng phần tử của chuỗi :

Giống như mảng, mỗi phần tử của chuỗi được truy nhập thông qua tên chuỗi và chỉ số của phần tử

Gọi N =Length(St), khi đó ký tự thứ i (i=1, 2, , N) của St được ký hiệu là St[i]

Ví dụ, cho :

Trang 32

St :=‘ABC’;

thì N=3 và St[1]=‘A’, St[2]=‘B’, St[3]=‘C’

Lệnh St[1]:=‘a’; sẽ biến đổi St thành St=‘aBC’

Như vậy mỗi ký tự St[i] được dùng như một biến kiểu ký tự, và chuỗi có thể xem là một mảng các ký tự Chẳng hạn để in chuỗi ta có thể in từng ký tự như sau:

For i:=1 to Length(St) do write(St[i]);

Ðiều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc

Nhưng mặt khác, mỗi chuỗi lại có thể xem là một gía trị duy nhất, vì có thể nhập và in chuỗi trực tiếp bằng các lệnh:

Readln(St);

Write(St);

Ðặc điểm này cho thấy chuỗi còn là một kiểu dữ liệu có tính đơn giản

3.3 Các thao tác trên chuỗi :

INCLUDEPICTURE "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 được một chuỗi mới gồm các ký tự của hai chuỗi ban đầu ghép lại.Ví

‘Hong’ > ‘Han’ vì ‘o’ > ‘a’

‘thanh’ > ‘thao’ vì ‘n’ > ‘o’

Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khác nhau thì chuỗi ngắn hơn sẽ nhỏ hơn, ví dụ:

‘an’ < ‘anh’

Trang 33

Length(St) : cho độ dài của chuỗi St.

Ví dụ: Length(‘ABCD’)=4 vì chuỗi ‘ABCD’ có 4 ký tự

Copy(St, k, m) : cho m ký tự của St tính từ vị trí k.

Ví dụ: Copy (‘ABCDEF’, 4, 2) =‘DE’

Nếu k> Length(St) thì kết qủa sẽ là một chuỗi rỗng

Nếu m> số ký tự đứng sau kể từ vị trí k thì hàm Copy chỉ lấy các ký tự từ vị trí k đến hết chiều dài của St, ví dụ :

Trang 34

thì gía trị của St=‘Pascal’ vì 5 ký tự đầu đã bị xóa.

Nếu k > Length(St) thì không xóa gì cả

Nếu m > số ký tự đứng sau kể từ vị trí k thì xóa hết từ vị trí k đến cuối chuỗi

Ví dụ, sau khi thực hiện ba lệnh :

thì St bị biến đổi thành St=‘AB**CD’

Nếu k> Length(St) thì S được nối vào cuối của St Ví dụ, sau khi thực hiện hai lệnh :

Trang 35

Ví dụ, sau khi thực hiện lệnh :

Str(4752, St);

thì kết qủa là St= ‘4752’

Số x có thể được định dạng như khi in ra màn hình

Lệnh Str(4752 : 6, St);

cho kết qủa St=‘ 4752’ (trước số 4752 có 2 ký tự trắng)

Nếu x là biến thực và gía trị của x=34.95 thì lệnh :

Ví dụ, cho ba biến n, k, j kiểu nguyên và biến x kiểu thực, sau khi thực hiện các lệnh :

9: Ðổi một chuỗi ra chữ hoa hay chữ thường.

Ðể đổi cả chuỗi St thành chữ hoa, ta đổi từng ký tự của chuỗi đó ra chữ hoa, tức là :

Trang 36

Tương tự, để đổi cả chuỗi St thành chữ thường, ta cũng đổi từng ký tự của chuỗi St ra chữ thường:

For i:=1 to Length(St) do

if ( St[i]>=‘A’) and (St[i]<=‘Z’) then St[i]:=Chr( Ord(St[i]) + 32) ;

INCLUDEPICTURE "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 một chuỗi ký tự

Cho chuỗi St có nhiều ký tự trắng thừa ở đầu, ở cuối và giữa các từ, như St=‘ nguyen van tuan ‘ Chuẩn hóa chuỗi St là xóa hết các ký tự trắng thừa ở đầu và ở cuối, và giữa hai từ chỉgiữ lại đúng một ký tự trắng, như St =‘nguyen van tuan’

a) Xóa các ký tự trắng ở đầu chuỗi :

Ðể xóa một ký tự trắng ở đầu của chuỗi St, ta dùng lệnh:

If St[1]=#32 then Delete(St,1,1);

Muốn xóa hết các ký tự trắng ở đầu chuỗi ta dùng lệnh:

While St[1]=#32 do Delete(St,1,1);

Diễn giải: chừng nào ký tự đầu tiên của St vẫn còn là ký tự trắng thì cứ xóa nó đi cho đến

khi ký tự đầu tiên là khác trắng

Sở dĩ phải dùng vòng lặp While là vì số ký tự trắng ở đầu chuỗi là không biết trước

b) Xóa các ký tự trắng ở cuối chuỗi :

Tương tự, muốn xóa tất cả các ký tự trắng ở cuối của chuỗi St, ta dùng lệnh:

While St[ length(St) ]= #32 do Delete(St, length(St), 1);

Diễn giải: chừng nào ký tự cuối cùng của St còn là khoảng trắng thì cứ xóa nó đi cho đến

khi ký tự cuối cùng là khác trắng

c) Xóa các ký tự trắng thừa ở giữa hai từ trong chuỗi :

Muốn xóa các ký tự trắng thừa để giữa hai từ chỉ còn đúng một ký tự trắng ta làm như sau: tìm trong St chỗ nào có hai ký tự trắng thì xóa đi một, và lặp lại thao tác trên cho đến khi trong St không còn chỗ nào có hai ký tự trắng liên tiếp Tức là :

k:=Pos(‘ ‘, St); { ‘ ‘ là 2 ký tự trắng }

While k > 0 do

begin

Ngày đăng: 18/02/2019, 15:52

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w