1. Trang chủ
  2. » Trung học cơ sở - phổ thông

giao trinh pascal cuc hay

284 9 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

Biến là đại lượng có gía trị thay đổi được, còn Hằng là đại lượng có gía trị không đổi, chúng được dùng trong chương trình để lưu trữ các dữ liệu, tham gia vào các biểu thức tính toán và[r]

(1)

MỤC LỤC 1 THUẬT TOÁN

2 CÁC PHƯỢNG PHÁP BIỂU DIỄN THUẬT TOÁN 3 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN

4.PHÂN LOẠI VẤN ĐỀ - BÀI TOÁN 5 THUẬT TOÁN ĐỆ QUY

6.THUẬT GIẢI

5.1.GIỚI THIỆU NGÔN NGỮ PASCAL

5.2 CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ PASCAL 5.3 CẤU TRÚC CHUNG CỦA CHƯƠNG TRÌNH PASCAL 5.4 SỬ DỤNG PHẦN MỀM TURBO PASCAL

5.5 CÂU HỎI TRẮC NGHIỆM 5.6 BÀI TẬP

6.1 KHÁI NIỆM VỀ KIỂU DỮ LIỆU 6.2 KIỂU SỐ NGUYÊN

6.3 KIỂU SỐ THỰC 6.4 KIỂU KÝ TỰ (CHAR) 6.5 KIỂU LÔGIC (BOOLEAN) 6.6 CHUỖI KÝ TỰ (STRING) 6.7 CÂU HỎI TRẮC NGHIỆM 7.1 HẰNG, BIẾN BIỂU THỨC 7.2 CÂU LỆNH LỜI CHÚ GIẢI

7.3.1 NHẬP DỮ LIỆU, THỦ TỤC “READLN”

7.3.2 XUẤT DỮ LIỆU, THỦ TỤC “WRITE” “WRITELN” 7.4 KIỂU LIỆT KÊ KIỂU ÐOẠN CON

(2)

8.1 CÂU LỆNH IF 8.2 CÂU LỆNH CASE

8.3 CÂU HỎI TRẮC NGHIỆM 8.4 BÀI TẬP

9.1 CÂU LỆNH LẶP FOR 9.2 CÂU LỆNH LẶP WHILE 9.3 CÂU LỆNH LẶP REPEAT 9.4 CÂU HỎI TRẮC NGHIỆM 9.5 BÀI TẬP

10.1 MẢNG MỘT CHIỀU

10.2 MẢNG HAI CHIỀU (MA TRẬN) 10.3 CÂU HỎI TRẮC NGHIỆM 10.4 BÀI TẬP

11.1 CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP 11.2 CÁC VÍ DỤ NÂNG CAO VỀ MẢNG

11.3 KIỂU CHUỖI KÝ TỰ 11.4 CÂU HỎI TRẮC NGHIỆM 11.5 BÀI TẬP

12.1 KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON 12.2 HÀM (FUNCTION)

12.3 THỦ TỤC (PROCED URE ) 12.4 CÂU HỎI TRẮC NGHIỆM 12.5 BÀI TẬP

13.1 THAM SỐ TRỊ VÀ THAM SỐ BIẾN

(3)

14.1 KIỂU BẢN GHI

14.2 CÁC VÍ DỤ VỀ BẢN GHI 14.3 CÂU HỎI TRẮC NGHIỆM 14.4 BÀI TẬP

15.1 KIỂU TẬP HỢP

15.2 DỮ LIỆU KIỂU TẬP TIN 15.3 CÂU HỎI TRẮC NGHIỆM 15.4 BÀI TẬP

1 THUẬT TOÁN

Thuật toán khái niệm sở Toán học Tin học Hiểu cách đơn giản, thuật toán tập hướng dẫn nhằm thực cơng việc Ðối với việc giải vấn đề - tốn thuật tốn hiểu tập hữu hạn hướng dẫn rõ ràng để người giải tốn theo mà giải vấn đề Như vậy, thuật toán phương pháp thể lời giải vấn đề - toán

Tại lại "Thuật toán" ?

Từ thuật toán (Algorithm) xuất phát từ tên nhà toán học người Trung Á Abu Abd - Allah ibn Musa al’Khwarizmi, thường gọi al’Khwarizmi Ông tác giả sách số học, ơng dùng phương pháp mơ tả rõ ràng, mạch lạc cách giải toán Sau này, phương pháp mơ tả cách giải tốn ông xem chuẩn mực nhiều nhà toán học khác tuân theo Từ algorithm đời dựa theo cách phiên âm tên ông

Việc nghiên cứu thuật tốn có vai trị quan trọng khoa học máy tính máy tính giải vấn đề có hướng dẫn giải rõ ràng Nếu hướng dẫn giải sai khơng rõ ràng máy tính khơng thể giải toán Trong khoa học máy tính, thuật tốn định nghĩa dãy hữu hạn bước khơng mập mờ thực thi được, trình hành động theo bước phải dừng cho kết mong muốn Số bước hữu hạn thuật toán tính chất dừng gọi chung tính hữu hạn Số bước hữu hạn thuật tốn tính chất hiển nhiên Ta tìm đâu lời giải vấn đề - tốn có vơ số bước giải ? Tính "khơng mập mờ" "có thể thực thi được" gọi chung tính xác định

Giả sử nhận lớp học mới, Ban Giám hiệu yêu cầu giáo viên chủ nhiệm chọn lớp trưởng theo bước sau :

Lập danh sách tất học sinh lớp Sắp thứ tự danh sách học sinh

Chọn học sinh đứng đầu danh sách để làm lớp trưởng

(4)

tăng dần giảm dần ? Sắp theo tiêu ? Theo tên, theo ngày tháng năm sinh hay theo điểm trung bình chung, Giả sử theo điểm trung bình có hai học sinh điểm trung bình học sinh trước, học sinh sau ?

Hướng dẫn vi phạm tính chất "khơng mập mờ" thuật tốn Nghĩa là, có q nhiều thơng tin thiếu để làm cho bước 1,2 hiểu hiểu theo nghĩa Nếu sửa lại chút hướng dẫn trở nên rõ ràng nhiều gọi thuật toán chọn lớp trưởng !

Lập danh sách tất học sinh lớp theo hai thông tin: Họ Tên; Ðiểm trung bình cuối năm Sắp hạng học sinh theo điểm trung bình theo thứ tự giảm dần (từ điểm cao đến điểm thấp) Hai học sinh có điểm trung bình có hạng

Nếu có học sinh có hạng chọn học sinh làm lớp trưởng Trường hợp có nhiều học sinh đồng hạng chọn học sinh có điểm mơn Tốn cao làm lớp trưởng

Nếu nhiều học sinh đồng hạng có điểm mơn Tốn cao tiến hành bốc thăm

Ở cần phân biệt mập mờ chọn lựa có định Mập mờ thiếu thơng tin có nhiều chọn lựa khơng đủ điều kiện để định Cịn chọn lựa có định hồn toàn xác định điều kiện cụ thể vấn đề Chẳng hạn vấn đề chọn lớp trưởng trên, bước thể lựa chọn có định Tất nhiên, chưa lập danh sách, chưa xếp hạng theo điểm trung bình giáo viên biết chọn lớp trưởng theo cách Nhưng xong danh sách có phương án chọn Tính "thực thi được" tính chất hiển nhiên Rõ ràng "thuật toán" tồn bước khơng thể thực thi ta có kết ý muốn? Tuy nhiên, cần phải hiểu "thực thi được" xét điều kiện tốn Chẳng hạn, nói "lấy bậc hai số âm" thực thi miền xác định toán số thực, miền số phức thao tác "lấy bậc hai số âm" hoàn toàn thực thi Tương tự, ta đường cho người xe máy đến bưu điện đường ta đường cụt, đường cấm đường ngược chiều người khơng thể đến bưu điện

Tính "dừng" tính chất dễ bị vi phạm nhất, thường sai sót trình bày thuật tốn Dĩ nhiên, thuật tốn nhằm thực cơng việc nên sau thời gian thi hành hữu hạn thuật toán phải cho kết mong muốn Khi khơng thỏa tính chất này, ta nói "thuật tốn" bị lặp vơ tận bị quẩn Ðể tính tổng số nguyên dương lẻ khoảng từ đến n ta có thuật tốn sau :

B1 Hỏi giá trị n B2 S =

B3 i =

B4 Nếu i = n+1 sang bước B8, ngược lại sang bước B5 B5 Cộng thêm i vào S

B6 Cộng thêm vào i B7 Quay lại bước B4

(5)

Ta ý đến bước B4 Ở ta muốn kết thúc thuật toán giá trị i vượt n Thay viết "nếu i lớn n" ta thay điều kiện "nếu i n+1" theo tốn học "i = n+1" suy "i lớn n" Nhưng điều kiện "i=n+1" khơng phải lúc đạt Vì ban đầu i = số lẻ, sau bước, i tăng thêm nên i số lẻ Nếu n số chẵn n+1 số lẻ nên sau số bước định, i n+1 Tuy nhiên, n số lẻ n+1 số chẵn, i số lẻ nên dù có qua bước nữa, i khác n+1 Trong trường hợp đó, thuật tốn bị quẩn

Tính "đúng" tính chất hiển nhiên tính chất khó đạt tới Thực vậy, giải vấn đề-bài tốn, ta ln ln mong muốn lời giải cho kết khơng phải lúc đạt Mọi học sinh làm kiểm tra muốn làm có đáp số thực tế, lớp học có số học sinh định có khả đưa lời giải đúng!

Thuật tốn cứng nhắc !

Các tính chất thuật tốn chặt chẽ cứng nhắc Nhưng điều có nghĩa khả giải vấn đề theo kiểu thuật toán bị giới hạn Sau này, người ta "làm mềm" hai tính chất quan trọng thuật tốn tính xác định tính để giải vấn đề phức tạp mà với tính chất chặt chẽ thuật tốn khơng thể giải Ðó thuật tốn đệ quy thuật giải Ta tìm hiểu điều mục chương

Các đặc trưng khác thuật toán

Bên cạnh đặc trưng xác định, hữu hạn đúng, thuật tốn cịn có thêm đặc trưng phụ khác Ðầu vào đầu (input/output) : thuật tốn, dù có đơn giản đến phải nhận liệu đầu vào, xử lý cho kết cuối

Tính hiệu (effectiveness) : tính hiệu thuật toán đánh giá dựa số tiêu chuẩn khối lượng tính tốn, khơng gian thời gian thuật tốn thi hành Tính hiệu thuật tốn yếu tố định để đánh giá, chọn lựa cách giải vấn đề-bài tốn thực tế Có nhiều phương pháp để đánh giá tính hiệu thuật tốn Trong mục chương , ta tìm hiểu tiêu chuẩn dùng rộng rãi độ phức tạp thuật tốn Tính tổng qt (generalliness) : thuật tốn có tính tổng qt thuật toán phải áp dụng cho trường hợp tốn khơng phải áp dụng cho số trường hợp riêng lẻ Chẳng hạn giải phương trình bậc hai sau Delta đảm bảo tính chất ln giải với giá trị số thực a,b,c Tuy nhiên, khơng phải thuật tốn đảm bảo tính tổng qt Trong thực tế, có lúc người ta xây dựng thuật toán cho dạng đặc trưng tốn mà thơi

Thuật tốn giải phương trình bậc hai ax2+bx+c=0 (a?0) 1 Yêu cầu cho biết giá trị hệ số a, b, c

2 Nếu a=0

2.1 Yêu cầu đầu vào khơng đảm bảo 2.2 Kết thúc thuật tốn

(6)

3.2 Nếu D >

3.2.1 Phương trình có hai nghiệm phân biệt x1 x2 3.2.2 Giá trị hai nghiệm tính theo công thức sau

3.2.3 Kết thúc thuật tốn 3.3 Nếu D =

3.3.1 Phương trình có nghiệm kép x0 3.3.2 Giá trị nghiệm kép

3.3.3 Kết thúc thuật tốn 3.4 Nếu D <

3.4.1 Phương trình vơ nghiệm 3.4.2 Kết thúc thuật tốn

Thuật tốn tìm hộp có trọng lượng nặng

Vấn đề : Có n hộp có khối lượng khác cân dĩa Hãy cách cân để tìm hộp có trọng lượng nặng Vấn đề thể toán tổng quát : Cho tập hợp A hữu hạn một thứ tự toàn phần A Hãy xây dựng thuật tốn tìm phần tử lớn A Bài tốn tốn học có vẻ phức tạp thể thực tế lại dễ hiểu, cách giải đơn giản Từ ta dễ dàng suy cách giải toán tổng quát

1 Nếu có hộp (n=1) thì 1.1 Hộp hộp nặng 1.2 Kết thúc thuật tốn

2 Ngược lại có từ hai hộp trở lên (n>1) 2.1 Chọn hai hộp đặt lên bàn cân

2.2 Giữ lại hộp nặng hơn, cất hộp nhẹ sang chỗ khác

3 Nếu hộp chưa cân thực bước sau, khơng cịn hộp nữa, sang bước 3.1 Chọn hộp để lên dĩa cân trống

(7)

4 Trở lại bước

5 Hộp lại cân hộp nặng Kết thúc

Thuật tốn Euclid tìm ước số chung lớn nhất

Bài toán : Cho hai số nguyên dương a b Tìm ước số chung lớn a b 1 Yêu cầu cho biết giá trị a, b.

2 a0 = a 3 b0 = b 4 i =

5 Nếu ai khác bi thực thao tác sau, ngược lại qua bước 5.1 Tăng i lên

5.2 Nếu ai-1 > bi-1 ai = ai-1 - bi-1

bi = bi-1

5.3 Ngược lại bi = bi-1 - ai-1 ai = ai-1

6 Trở lại bước 5.

7 Ước số chung lớn a, b

2 CÁC PHƯỢNG PHÁP BIỂU DIỄN THUẬT TOÁN

Khi chứng minh giải toán toán học, ta thường dùng ngơn từ tốn học : "ta có", "điều phải chứng minh", "giả thuyết", sử dụng phép suy luận toán học phép suy ra, tương đương, Thuật toán phương pháp thể lời giải toán nên phải tuân theo số quy tắc định Ðể truyền đạt thuật toán cho người khác hay chuyển thuật tốn thành chương trình máy tính, ta phải có phương pháp biểu diễn thuật tốn Có phương pháp biểu diễn thuật tốn :

1 Dùng ngơn ngữ tự nhiên

2 Dùng lưu đồ-sơ đồ khối (flowchart)

3 Dùng mã giả (pseudocode)

(8)

Trong cách biểu diễn thuật tốn theo ngơn ngữ tự nhiên, người ta sử dụng ngôn ngữ thường ngày để liệt kê bước thuật tốn (Các ví dụ thuật toán mục chương sử dụng ngôn ngữ tự nhiên)

Phương pháp biểu diễn khơng u cầu người viết thuật tốn người đọc thuật toán phải nắm quy tắc Tuy vậy, cách biểu diễn thường dài dịng, khơng thể rõ cấu trúc thuật tốn, đơi lúc gây hiểu lầm khó hiểu cho người đọc Gần khơng có quy tắc cố định việc thể thuật tốn ngơn ngữ tự nhiên Tuy vậy, để dễ đọc, ta nên viết bước lùi vào bên phải đánh số bước theo quy tắc phân cấp 1, 1.1, 1.1.1, Bạn tham khảo lại ba ví dụ mục chương để hiểu cách biểu diễn thuật toán theo ngôn ngữ tự nhiên

2.2 Lưu đồ - sơ đồ khối

Lưu đồ hay sơ đồ khối công cụ trực quan để diễn đạt thuật toán Biểu diễn thuật toán lưu đồ giúp người đọc theo dõi phân cấp trường hợp q trình xử lý thuật tốn Phương pháp lưu đồ thường dùng thuật toán có tính rắc rối, khó theo dõi q trình xử lý

Ðể biểu diễn thuật toán theo sơ đồ khối, ta phải phân biệt hai loại thao tác Một thao tác thao tác chọn lựa dựa theo điều kiện Chẳng hạn : thao tác "nếu a = b thực thao tác B2, ngược lại thực B4" thao tác chọn lựa Các thao tác cịn lại khơng thuộc loại chọn lựa xếp vào loại hành động Chẳng hạn, "Chọn hộp để lên dĩa cân trống." thao tác thuộc loại hành động

2.2.1 Thao tác chọn lựa (decision)

Thao tác chọn lựa biểu diễn hình thoi, bên chứa biểu thức điều kiện

2.2.2 Thao tác xử lý (process)

Thao tác xử lý biểu diễn hình chữ nhật, bên chứa nội dung xử lý

2.2.3.Ðường (route)

Khi dùng ngôn ngữ tự nhiên, ta mặc định hiểu trình thực từ bước trước đến bước sau (trừ có yêu cầu nhảy sang bước khác) Trong ngôn ngữ lưu đồ, thể bước hình vẽ đặt hình vẽ vị trí nên ta phải có phương pháp để thể trình tự thực thao tác

Hai bước nối cung, cung có mũi tên để hướng thực Chẳng hạn hình dưới, trình tự thực B1, B2, B3

(9)

2.2.4 Ðiểm cuối (terminator)

Ðiểm cuối điểm khởi đầu kết thúc thuật toán, biểu diễn hình ovan, bên có ghi chữ bắt đầu/start/begin kết thúc/end Ðiểm cuối có cung (điểm khởi đầu) cung vào (điểm kết thúc) Xem lưu đồ thuật toán giải phương trình bậc hai để thấy cách sử dụng điểm cuối

2.2.5 Ðiểm nối (connector)

(10)

2.2.6 Ðiểm nối sang trang (off-page connector)

Tương tự điểm nối, điểm nối sang trang dùng lưu đồ lớn, phải vẽ nhiều trang Bên điểm nối sang trang ta đặt ký hiệu để biết liên hệ điểm nối trang

Ở ký hiệu thường dùng Trong thực tế, lưu đồ cịn có nhiều ký hiệu khác thường dùng lưu đồ lớn phức tạp Ðối với thuật toán sách này, ta cần sử dụng ký hiệu đủ

2.3 Mã giả

Tuy sơ đồ khối thể rõ trình xử lý phân cấp trường hợp thuật toán lại cồng kềnh Ðể mơ tả thuật tốn nhỏ ta phải dùng không gian lớn Hơn nữa, lưu đồ phân biệt hai thao tác rẽ nhánh (chọn lựa có điều kiện) xử lý mà thực tế, thuật tốn cịn có thêm thao tác lặp (Chúng ta tìm hiểu thao tác lặp sau)

Khi thể thuật toán mã giả, ta vay mượn cú pháp ngơn ngữ lập trình để thể thuật tốn Tất nhiên, ngơn ngữ lập trình có thao tác xử lý, rẽ nhánh lặp Dùng mã giả vừa tận dụng khái niệm ngơn ngữ lập trình, vừa giúp người cài đặt dễ dàng nắm bắt nội dung thuật toán Tất nhiên mã giả ta dùng phần ngôn ngữ tự nhiên Một vay mượn cú pháp khái niệm ngơn ngữ lập trình chắn mã giả bị phụ thuộc vào ngơn ngữ lập trình Chính lý này, chưa vội tìm hiểu mã giả (vì chưa biết ngơn ngữ lập trình!) Sau tìm hiểu xong thủ tục - hàm bạn hiểu mã giả !

Một đoạn mã giả thuật tốn giải phương trình bậc hai

(11)

x1=(-b-sqrt(delta))/(2*a) x2=(-b+sqrt(delta))/(2*a)

xuất kết : phương trình có hai nghiệm x1 x2 end

else

if delta = then

xuất kết : phương trình có nghiệm kép -b/(2*a) else {trường hợp delta < }

xuất kết : phương trình vơ nghiệm

* Các từ in đậm từ khóa ngơn ngữ Pascal

ĐỘ PHỨC TẠP CỦA THUẬT TOÁN

Một chương trình máy tính thường cài đặt dựa thuật toán để giải toán hay vấn đề Tuy nhiên, thuật toán đúng, chương trình khơng sử dụng liệu đầu vào thời gian kết lâu sử dụng nhiều nhớ (vượt khả đáp ứng máy tính)

Khi tiến hành phân tích thuật tốn nghĩa tìm đánh giá thời gian "không gian" cần thiết để thực thuật tốn Khơng gian hiểu yêu cầu nhớ, thiết bị lưu trữ, máy tính để thuật tốn làm việc Việc xem xét khơng gian thuật toán phụ thuộc phần lớn vào cách tổ chức liệu thuật toán Trong phần này, nói đến độ phức tạp thuật tốn, đề cập đến đánh giá mặt thời gian mà thơi

Phân tích thuật tốn cơng việc khó khăn, địi hỏi phải có hiểu biết sâu sắc thuật toán nhiều kiến thức tốn học khác Ðây cơng việc mà người làm Rất may mắn nhà tốn học phân tích cho độ phức tạp hầu hết thuật tốn sở (sắp xếp, tìm kiếm, thuật tốn số học, ) Chính vậy, nhiệm vụ cịn lại hiểu khái niệm liên quan đến độ phức tạp thuật toán

Ðánh giá thời gian thuật tốn khơng phải xác định thời gian tuyệt đối (chạy thuật toán giây, phút, ) để thực thuật toán mà xác định mối liên quan liệu đầu vào (input) thuật toán chi phí (số thao tác, số phép tính cộng,trừ, nhân, chia, rút căn, ) để thực thuật toán Sở dĩ người ta không quan tâm đến thời gian tuyệt đối thuật tốn yếu tố phụ thuộc vào tốc độ máy tính, mà máy tính khác có tốc độ khác Một cách tổng qt, chi phí thực thuật tốn hàm số phụ thuộc vào liệu đầu vào :T = f(input)

(12)

Việc xây dựng hàm T tổng quát trường hợp thuật toán việc khó khăn, nhiều lúc khơng thể thực Chính mà người ta xây dựng hàm T cho số trường hợp đáng ý thuật toán, thường trường hợp tốt xấu

Chúng ta trở lại ví dụ thuật tốn tìm hộp nặng n hộp cho trước, lần ta làm việc thể khác vấn đề Ðây thuật toán tương đối đơn giản nên tiến hành phân tích độ phức tạp Trước phân tích độ phức tạp, ta nhắc lại đơi điều thuật tốn

Tìm số lớn dãy số

Bài toán : Cho dãy số a có n phần tử a1, a2, an Hãy xây dựng thuật tốn để tìm số lớn dãy a

Nhận xét

1 Nếu dãy có phần tử phần tử số lớn

2 Giả sử dãy có n phần tử ta xác định phần tử lớn amax Nếu bổ sung thêm phần tử thứ an+1 vào dãy mà an+1 > amax an+1 phần tử lớn dãy có n+1 phần tử Trường hợp ngược lại, nghĩa an+1 £ amax amax phần tử lớn dãy có n+1 phần tử

Thuật toán 1 Ghi nhớ amax = a1 2 i = 2.

3 Nếu (i £ n) thực bước sau, ngược lại sang bước 5. 3.1 Nếu (ai > amax )

3.1.1 Ghi nhớ amax = 3.2 Tăng i lên

4 Trở lại bước

5 Phần tử lớn dãy a amax Kết thúc

(13)

Dựa theo sơ đồ khối thuật toán, ta nhận thấy rằng, trường hợp toán, phép "ghi nhớ" bước 3.1 thực số lần thực n-1 (ứng với việc xét từ phần tử a2 đến an) Ta gọi chi phí cố định bất biến thuật toán

Trường hợp tốt : amax = a1 suy ra, với i ³ 2, ai< amax Do đó, điều kiện ai>amax bước 3.1 ln khơng thỏa nên bước 3.1.1 không thực Như vậy, chi phí chung cho trường hợp chi phí cố định tốn T = f(n) = n-1

Trường hợp xấu :

Ta có : với i>1, ai-1< ai (do định nghĩa dãy xếp tăng dần) nên điều kiện ai>amax bước 3.1 thỏa, bước 3.1.1 ln thực Như vậy, ngồi chi phí chung n-1 phép so sánh, ta cần phải dùng thêm n-1 phép "ghi nhớ" bước 3.1.1 Như vậy, tổng chi phí trường hợp

T = f(n) = 2(n-1)=2n-2 Ðịnh nghĩa

Cho hai hàm f g có miền xác định tập số tự nhiên Ta viết f(n) = O(g(n))

và nói f(n) có cấp cao g(n) tồn số C k cho | f(n) | £ C.g(n) với n > k

(14)

về độ phức tạp thuật toán Ðể hình dung xác độ phức tạp thuật toán, ta xét đến yếu tố khác độ tăng chi phí độ lớn n liệu đầu vào tăng

Theo định nghĩa trên, ta nhận thấy chi phí thấp lớn thuật tốn tìm số lớn bị chặn O(n) (tồn số C=10, k=1 để 2n-2 < 10n với n>1)

Một cách tổng quát, hàm chi phí thuật tốn (xét trường hợp đó) bị chặn O(f(n)) ta nói thuật tốn có độ phức tạp O(f(n)) trường hợp

Như vậy, thuật tốn tìm số lớn có độ phức tạp trường hợp tốt xấu O(n) Người ta gọi thuật toán có độ phức tạp O(n) thuật tốn có độ phức tạp tuyến tính

Sau số "thước đo" độ phức tạp thuật toán sử dụng rộng rãi Các độ phức tạp xếp theo thứ tự tăng dần Nghĩa tốn có độ phức tạp O(nk) phức tạp tốn có độ phức tạp O(n) O(logan)

4 PHÂN LOẠI VẤN ĐỀ - BÀI TOÁN

Ðộ phức tạp thuật tốn yếu tố sở để phân loại vấn đề-bài toán Một cách tổng qt, tốn chia làm lớp lớn : giải không giải Lớp giải chia làm lớp Lớp tốn có độ phức tạp đa thức : nghĩa toán giải thuật tốn có độ phức tạp đa thức (hay nói ngắn gọn : lớp đa thức) xem có lời giải thực tế Lớp thứ hai tốn có độ phức tạp đa thức mà lời giải xem thực tế cho số liệu đầu vào có chọn lựa cẩn thận tương đối nhỏ Cuối toán thuộc loại NP chưa thể phân loại cách xác thuộc lớp tốn có độ phức tạp đa thức hay có độ phức tạp khơng đa thức

4.1 Lớp tốn có độ phức tạp đa thức

Các toán thuộc lớp có độ phức tạp O(nk) nhỏ O(nk) Chẳng hạn tốn có độ phức tạp O(nlog2n) xem toán thuộc lớp đa thức nlog2n bị chặn n2 ( nlog2n £ n2 với n>0) Như toán có độ phức tạp O(1), phức tạp tuyến tính O(n) logarith O(nlogan) toán thuộc lớp đa thức Cịn tốn có độ phức tạp lũy thừa O(an) giai thừa O(n!) không thuộc lớp đa thức

Tuy độ phức tạp số đo độ tăng chi phí ứng với độ tăng liệu đầu vào cho có đánh giá tương đối thời gian thi hành thuật toán Các thuật toán thuộc lớp đa thức xem toán có lời giải thực tế Lời giải thực tế hiểu chi phí mặt thời gian khơng gian cho việc giải tốn chấp nhận điều kiện Bất kỳ tốn khơng thuộc lớp có chi phí lớn

(15)

Người ta ước tính thời gian cần thiết để giải mật mã mã hóa khóa 128-bit triệu năm với điều kiện làm việc siêu máy tính mạnh nay!

Chính lý này, tốn xem giải thực tế hay không phụ thuộc vào độ phức tạp tốn có phải đa thức hay khơng

4.2 Lớp tốn có độ phức tạp không đa thức

Thật khơng may mắn, nhiều tốn thực có lời giải lại khơng thuộc lớp tốn đa thức Ví dụ : cho tập hợp có n phần tử, liệt kê tất tập khác trống tập hợp Bằng toán học, người ta chứng minh số tập tập hợp có n phần tử 2n-1 Lời giải có thể lời giải thuật tốn phải tốn 2n-1 bước Dễ thấy độ phức tạp toán cỡ O(2n) Như tốn khơng thuộc lớp tốn đa thức Với n vào khoảng 16, số bước cần thiết khoảng vài chục ngàn hoàn toàn giải máy tính Nhưng số phần tử lên đến 32 ta tốn số bước lên đến tỷ, thêm phần tử thôi, tốn tỷ bước! Với số lượng bước vậy, dù chạy siêu máy tính phải tốn thời gian đáng kể! Các tốn khơng thuộc lớp đa thức giải với độ lớn liệu đầu vào định

4.3 Lớp toán NP Chúng ta biết tính xác định ba đặc tính quan trọng thuật tốn Nghĩa bước thuật toán phải xác định thực thi Nếu có phân chia trường hợp bước thơng tin bước phải đầy đủ để thuật tốn tự định chọn lựa trường hợp Trong mục 4.3 này, ta tạm gọi thuật toán thỏa mãn tính xác định thuật tốn tự

Vậy điều xảy ta đưa "thuật tốn" có tính khơng tự quyết? Nghĩa bước "thuật toán", ta đưa số trường hợp chọn lựa không cung cấp đầy đủ thơng tin để "thuật tốn" tự định? Thật ra, sống, "thuật toán" thuộc loại hay áp dụng Chẳng hạn ta có lời dẫn du lịch : "Khi hết khu vườn này, bạn chọn đường mà bạn cảm thấy thích Tất dẫn đến bảo tàng lịch sử." Nếu khách du lịch, bạn cảm thấy bình thường Nhưng máy tính khơng! Nó khơng thể thực thi hướng dẫn không rõ ràng vậy! Ðến đây, có câu hỏi "Tại lại đề cập đến thuật tốn có tính khơng tự dù máy tính khơng thể thực thuật tốn vậy?" Câu trả lời là, nghiên cứu thuật tốn khơng tự quyết, dù khơng dùng để giải tốn nữa, có hiểu biết hạn chế thuật toán tự thông thường Ðến đây, ta xem khác biệt độ phức tạp thuật toán tự không tự để giải cho vấn đề

Bài toán người bán hàng

Một nhân viên phân phối hàng cho công ty giao nhiệm vụ phải giao hàng cho đại lý cơng ty, sau trở cơng ty Vấn đề người nhân viên giao hàng cho tất đại lý mà không tiêu số tiền đổ xăng mà công ty cấp cho ngày Nói cách khác, đừng số lượng số

Một lời giải cổ điển cho toán liệt kê cách có hệ thống đường đi, so sánh chiều dài đường tìm với chiều dài giới hạn lúc tìm đường phù hợp xét hết tất đường Tuy nhiên, cách giải có độ phức tạp khơng phải đa thức Bằng toán học, người ta chứng minh độ phức tạp thuật toán O(n!) Như vậy, với số đại lý lớn thuật tốn xem khơng thực tế Bây giờ, xem qua thuật tốn khơng tự 1 Chọn đường tính chiều dài

(16)

Quan điểm ta cách giải chọn sai lỗi người chọn khơng phải lỗi thuật tốn !

Theo thuật tốn chi phí để tính chiều dài đường chọn tỷ lệ với số đại lý; chi phí để so sánh chiều dài quãng đường với giới hạn cho phép khơng liên quan đến số thành phố Như vậy, chi phí thuật tốn hàm có dạng T = an+b với n số đại lý a,b số Ta kết luận rằng, độ phức tạp thuật toán O(n) hay độ phức tạp thuộc lớp đa thức

Như vậy, dùng thuật toán tự tốn người bán hàng có độ phức tạp khơng thuộc lớp đa thức, cịn dùng thuật tốn khơng tự tốn có độ phức tạp đa thức

Ðịnh nghĩa

Một tốn giải thuật tốn khơng tự mà có độ phức tạp thuộc lớp đa thức gọi tốn đa thức khơng tự hay viết tắt tốn NP

Theo định nghĩa tốn người bán hàng toán thuộc lớp NP

Cho đến người ta chưa chứng minh tồn hay khơng thuật tốn tự có độ phức tạp đa thức cho toán người bán hàng rong Vì vậy, tốn (là tốn NP) chưa thể xếp vào lớp đa thức hay không đa thức Do đó, lớp tốn NP chưa thể phân loại thuộc lớp đa thức hay không Dĩ nhiên, lớp toán NP chứa toán thuộc lớp đa thức thực sự, tốn giải thuật tốn tự có độ phức tạp đa thức chắn dùng thuật tốn khơng tự có độ phức tạp đa thức

5 THUẬT TOÁN ĐỆ QUY

Thuật toán đệ quy mở rộng khái niệm thuật toán Như biết, thuật toán cần phải thỏa mãn tính chất :

– Tính hữu hạn – Tính xác định – Tính đắn

(17)

Tư tưởng giải toán thuật toán đệ quy đưa toán tốn loại, tính chất (hay nói cách nôm na đồng dạng) cấp độ thấp (chẳng hạn : độ lớn liệu nhập nhỏ hơn, giá trị cần tính tốn nhỏ hơn, ), trình tiếp tục lúc toán đưa cấp độ mà giải Từ kết cấp độ này, ta lần ngược để giải toán cấp độ cao lúc giải toán cấp độ ban đầu

Trong toán học ta thường gặp định nghĩa đối tượng, khái niệm dựa đối tượng, khái niệm

Ðịnh nghĩa giai thừa

Giai thừa số tự nhiên n, ký hiệu n! định nghĩa : 0! =

n! = (n-1)!n với n>0

Ðịnh nghĩa dãy số Fibonacci f0 =

f1 =

fn = fn-1 + fn-2 với n>1

Theo toán học, khái niệm định nghĩa gọi định nghĩa theo kiểu quy nạp Chính vậy, đệ quy có liên hệ chặt chẽ với quy nạp toán học

(18)

Ưu thuật toán đệ quy ta cần giải toán số trường hợp đặc biệt đó, cịn gọi trường hợp dừng Sau đó, trường hợp khác tốn xác định thơng qua trường hợp đặc biệt Ðối với việc tính dãy Fibonacci, trường hợp dừng giá trị f0 f1

Nói cách xác, thuật toán đệ quy gồm hai phần:

Phần sở Là trường hợp không cần thực lại thuật tốn (hay khơng có u cầu gọi đệ quy) Nếu thuật tốn đệ quy khơng có phần dẫn đến bị lặp vơ hạn sinh lỗi thi hành Vì lý mà người ta đơi lúc cịn gọi phần sở trường hợp dừng

Phần đệ quy

Là phần thuật tốn có u cầu gọi đệ quy, tức yêu cầu thực lại thuật toán với cấp độ liệu thấp

(19)

6.1 Mở rộng khái niệm thuật toán : thuật giải

Trong trình nghiên cứu giải vấn đề - toán, người ta đưa nhận xét sau : Có nhiều tốn chưa tìm cách giải theo kiểu thuật tốn khơng biết có tồn thuật tốn hay khơng

Có nhiều tốn có thuật tốn để giải khơng chấp nhận thời gian giải theo thuật tốn q lớn điều kiện cho thuật tốn khó đáp ứng

Có tốn giải theo cách giải vi phạm thuật toán chấp nhận

Từ nhận định trên, người ta thấy cần phải có đổi cho khái niệm thuật toán Người ta mở rộng hai tiêu chuẩn thuật tốn : tính xác định tính đắn Việc mở rộng tính xác định thuật toán thể qua giải thuật đệ quy ngẫu nhiên Tính thuật tốn khơng cịn bắt buộc số cách giải toán, cách giải gần Trong thực tiễn, có nhiều trường hợp người ta chấp nhận cách giải thường cho kết tốt (nhưng khơng phải lúc tốt) nhưng phức tạp hiệu Chẳng hạn giải tốn thuật tốn tối ưu địi hỏi máy tính thực nhiều năm sẵn lòng chấp nhận giải pháp gần tối ưu mà cần máy tính chạy vài ngày vài

Các cách giải chấp nhận khơng hồn tồn đáp ứng đầy đủ tiêu chuẩn thuật toán thường được gọi thuật giải Khái niệm mở rộng thuật toán mở rộng cửa cho việc tìm kiếm phương pháp để giải toán đặt

Một thuật giải thường đề cập đến sử dụng khoa học trí tuệ nhân tạo cách giải theo kiểu Heuristic

6.2 Thuật giải Heuristic

Thuật giải Heuristic mở rộng khái niệm thuật tốn Nó thể cách giải tốn với đặc tính sau :

Thường tìm lời giải tốt (nhưng không lời giải tốt nhất)

Giải toán theo thuật giải Heuristic thường dễ dàng nhanh chóng đưa kết so với giải thuật tối ưu, chi phí thấp

Thuật giải Heuristic thường thể tự nhiên, gần gũi với cách suy nghĩ hành động người Có nhiều phương pháp để xây dựng thuật giải Heuristic, người ta thường dựa vào số nguyên lý sở sau:

Nguyên lý vét cạn thông minh :

Trong tốn tìm kiếm đó, khơng gian tìm kiếm lớn, ta thường tìm cách giới hạn lại khơng gian tìm kiếm thực kiểu dị tìm đặc biệt dựa vào đặc thù tốn để nhanh chóng tìm mục tiêu

Nguyên lý tham lam (Greedy):

(20)

Nguyên lý thứ tự :

Thực hành động dựa cấu trúc thứ tự hợp lý không gian khảo sát nhằm nhanh chóng đạt lời giải tốt

Hàm Heuristic:

Trong việc xây dựng thuật giải Heuristic, người ta thường dùng hàm Heuristic Ðó hàm đánh giá thơ, giá trị hàm phụ thuộc vào trạng thái toán bước giải Nhờ giá trị này, ta chọn cách hành động tương đối hợp lý bước thuật giải

Bài tốn hành trình ngắn - ứng dụng ngun lý Greedy

Bài toán : Chúng ta trở lại với toán người bán hàng Nhưng đây, yêu cầu tốn khác tìm hành trình ngắn

Tất nhiên ta giải tốn cách liệt kê tất đường đi, tính chiều dài đường tìm đường có chiều dài ngắn Tuy nhiên, cách giải lại có độ phức tạp O(n!) (tổng số hành trình có n!) Do đó, số đại lý tăng số đường phải xét tăng lên nhanh Một cách giải đơn giản nhiều thường cho kết tương đối tốt dùng thuật giải Heuristic ứng dụng nguyên lý Greedy Tư tưởng thuật giải sau :

1 Từ điểm khởi đầu, ta liệt kê tất quãng đường từ điểm xuất phát n đại lý chọn theo đường ngắn

2 Khi đến đại lý, chọn đến đại lý theo nguyên tắc Nghĩa liệt kê tất đường từ đại lý ta đứng đến đại lý chưa đến Chọn đường ngắn Lặp lại trình lúc khơng cịn đại lý để

Bạn quan sát hình 2.14 để thấy trình chọn lựa

(21)

Bài toán phân việc – ứng dụng nguyên lý thứ tự

Một công ty nhận hợp đồng gia công m chi tiết máy J1, J2, ,Jm Công ty có n máy gia cơng P1, P2, Pn Mọi chi tiết gia công máy Một gia công chi tiết máy, công việc tiếp tục lúc hồn thành, khơng thể bị ngắt ngang Ðể gia công công việc Ji máy ta cần dùng thời gian tương ứng ti Nhiệm vụ công ty phải gia cơng xong tồn n chi tiết thời gian sớm

Chúng ta xét tốn trường hợp có máy P1, P2, P3 công việc với thời gian t1=2, t2=5, t3=8, t4=1, t5=5, t6=1 Ta có phương án phân cơng (L) hình sau :

(22)

GANTT Theo lược đồ này, ta thấy thời gian để hồn thành tồn cơng việc 12 Nhận xét cách cảm tính ta thấy phương án (L) vừa thực phương án khơng tốt Các máy P1 P2 có q nhiều thời gian rảnh

Xây dựng thuật toán để tìm phương án tối ưu L0 cho tốn tốn khó, địi hỏi kỹ thuật phức tạp mà không đề cập Bây ta xét đến thuật giải Heuristic đơn giản để giải toán

1 Sắp xếp công việc theo thứ tự giảm dần thời gian gia công

2 Lần lượt xếp việc theo thứ tự vào máy dư nhiều thời gian Với tư tưởng vậy, ta có phương án L* sau :

Rõ ràng phương án L* vừa thực phương án tối ưu trường hợp thời gian hồn thành 8, thời gian công việc J3 Ta hy vọng thuật giải Heuristic đơn giản thuật giải tối ưu Nhưng tiếc thay, ta dễ dàng đưa trường hợp mà thuật giải Heuristic không đưa kết tối ưu

Nếu gọi T* thời gian để gia công xong n chi tiết máy thuật giải Heuristic đưa To thời gian tối ưu người ta chứng minh

(23)

, sai số cực đại mà trường hợp gánh chịu Theo công thức này, số máy lớn sai số lớn

Trong trường hợp n lớn 1/(3n) xem Như vậy, sai số tối đa mà ta phải chịu T* ? 4/3To, nghĩa sai số tối đa 33% Tuy nhiên, khó tìm trường hợp mà sai số giá trị cực đại, dù trường hợp xấu Thuật giải Heuristic trường hợp rõ ràng cho lời giải tương đối tốt

Bài toán Ta-canh - ứng dụng hàm Heuristic

Bài tốn Ta-canh trị chơi phổ biến, đơi lúc người ta cịn gọi tốn 9-puzzle Trị chơi bao gồm hình vng kích thước 3x3 Có có số, có số từ đến Một cịn trống Mỗi lần di chuyển di chuyển ô nằm cạnh ô trống phía ô trống Vấn đề từ trạng thái ban đầu bất kỳ, đưa trạng thái cuối trạng thái mà ô từ đến theo thứ tự từ trái sang phải, từ xuống dưới, ô cuối dùng ô trống

Cho đến nay, người ta chưa tìm thuật tốn xác, tối ưu để giải tốn Tuy nhiên, cách giải theo kiểu Heuristic lại đơn giản Nhận xét : thời điểm ta có tối đa di chuyển Vấn đề thời điểm đó, ta chọn lựa di chuyển nào? Chẳng hạn hình trên, ta nên di chuyển (1), (2), (6) hay (7)?

Gọi T0 trạng thái đích tốn TK trạng thái Ta gọi V(i,j) số nằm ô (i,j), với ô trống V(i,j)=0

Ta đặt d(i,j) số ô cần di chuyển để đưa số (i,j) vị trí trạng thái TO Hàm FK trạng thái TK tổng d(i,j) cho vị trí (i,j) khơng phải ô trống Như trạng thái hình ban đầu, hàm FK có giá trị

(24)

Một cách tổng quát, giá trị hàm FK trạng thái TK

Từ trạng thái TK , ta có tối đa cách di chuyển.Ta ký hiệu trạng thái TKT ,TKD , TKTr ,TKP ứng với số trên, dưới, trái, phải ô trống bị di chuyển Chẳng hạn, ứng với hình ban đầu, ta có trạng thái hình bên

Ứng với trạng thái mới, ta có hàm FK tương ứng FKT ,FKD ,FKTr ,FKP

Dựa vào số này, ta chọn hướng có hàm FK tương ứng nhỏ nhất, trường hợp ta chọn ngẫu nhiên số đường Với ví dụ, ta chọn di chuyển ô mang số (2) FKD nhỏ Sau di chuyển ơ, tốn chuyển trạng thái TK Ta lại thực trình lúc đạt trạng thái đích

Hàm FK ví dụ dạng hàm Heuristic Tất nhiên, để giải toán tình khó, hàm FK cần có nhiều sửa đổi

I.GIỚI THIỆU NGÔN NGỮ PASCAL

PASCAL ngơn ngữ lập trình cấp cao giáo sư Niklaus Wirth trường đại học Kỹ thuật Zurich (Thụy sĩ) thiết kế công bố vào năm 1971 Ơng đặt tên cho ngơn ngữ Pascal để tưởng nhớ nhà toán học tiếng người Pháp kỷ 17: Blaise Pascal, người sáng chế máy tính khí nhân loại Qua thời gian sử dụng, Pascal ngày đơng đảo người dùng đánh gía cao, trở thành ngôn ngữ thảo chương phổ biến

Thành công ngơn ngữ Pascal chỗ: ngơn ngữ đưa thể khái niệm lập trình có cấu trúc Ý tưởng chương trình có cấu trúc xuất phát từ suy nghĩ cho chia tốn lớn, phức tạp thành nhiều toán nhỏ, đơn giản Nếu toán nhỏ giải chương trình con, liên kết chương trình lại tạo nên chương trình lớn giải toán ban đầu?

Bằng cách chia chương trình thành chương trình vậy, người thảo chương lập trình để giải riêng lẻ phần một, khối một, tổ chức để nhiều người tham gia, người phụ trách vài khối Ðặc biệt phải thay đổi hay sửa chữa khối điều ảnh hưởng đến khối khác

(25)

thành câu lệnh phức tạp gọi câu lệnh ghép Ðến lượt mình, hai hay nhiều lệnh ghép lại nhóm lại để tạo thành câu lệnh ghép phức tạp nữa,.v.v Tương tự thế, ngôn ngữ Pascal cho phép xây dựng kiểu liệu phức tạp từ kiểu liệu có

Pascal ngôn ngữ không chặt chẽ mặt cú pháp mà chặt chẽ mặt liệu Mỗi biến, tham gia chương trình ln có kiểu liệu xác định nhận gía trị có kiểu liệu với Ðiều buộc người lập trình phải nắm cú pháp ln ý đến tính tương thích biểu thức mặt kiểu liệu Chính thế, thảo chương ngơn ngữ Pascal hội tốt không rèn luyện tư mà cịn rèn luyện tính cẩn thận xác

Ngày nay, Ngôn ngữ Pascal dùng để viết chương trình ứng dụng nhiều lĩnh vực Với văn phạm sáng sủa, dễ hiểu, với khả đủ mạnh, Pascal xem ngôn ngữ thích hợp để giảng dạy trường phổ thông đại học

II.CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ PASCAL 1.Tập ký tự bản

Mỗi ngôn ngữ xây dựng từ tập ký tự Nhiều ký tự nhóm lại với tạo nên từ Nhiều từ liên kết với theo qui tắc ngữ pháp định (gọi văn phạm) tạo nên mệnh đề Trong ngơn ngữ thảo chương, mệnh đề?cịn gọi câu lệnh Một tập hợp câu lệnh xếp theo trật tự định nhằm thị cho máy thao tác phải thực tạo thành chương trình Các chương trình soạn thảo người thảo chương lưu trữ đĩa dạng tập tin

Ngôn ngữ Pascal xây dựng ký tự bản, gồm: chữ la tinh: A, B, C, ,Z, a, b, c, , z

các chữ số :0, 1, 2, 3, 4, 5, 6, 7, 8,

các ký hiệu đặc biệt: +, -, *, /, =, <, {, }, [, ], %, $, &, #, ký tự gạch nối ‘_’ ký tự trắng ‘ ‘ ( space)

Các chữ Ả rập:  ,  ,  , không thuộc ký tự Pascal. 2 Từ khóa ( key word ):

Có số từ Pascal dành riêng cho việc xây dựng câu lệnh, khai báo, phép tính, gọi từ khóa Việc sử dụng từ khóa đòi hỏi phải tuân thủ quy tắc đề ra, đặc biệt người lập trình khơng đặt tên (tên biến, tên hằng, tên hàm, tên thủ tục, ) trùng với từ khóa Dưới danh sách từ khóa Pascal :

absolute, and, array, begin, case, const, div, do, downto, else, end, file, for, forward, function, goto, if, implementation, in, inline, interface, interrupt, label, mod, nil, not, of, or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor

Các từ khóa viết dạng chữ hoa hay chữ thường hay xen kẽ chữ hoa với chữ thường được Ví dụ viết begin hay Begin hay BEGIN nhau.

(26)

Các biến, hằng, hàm, thủ tục, sử dụng chương trình cần phải đặt tên, cịn gọi định danh hay danh hiệu Các tên người thảo chương tự đặt phải đảm bảo quy tắc: tên phải bắt đầu chữ cái, kế chữ cái, chữ số, hay dấu gạch nối ‘_’ Tên khơng đặt trùng với từ khóa Chiều dài tên tối đa 127 ký tự Thơng thường tên nên đặt ngắn gọn có tính gợi nhớ

Dưới ví dụ tên đặt đúng:

Delta, X1, X2, i, j , Chuc_vu, Luong, So_luong, Don_gia Còn tên: 3ABC, In, Chu vi, Ma-so sai :

3ABC: bắt đầu số Chu vi: có chứa ký tự trắng

Ma-so : ký tự ‘-’ dấu trừ gạch nối In : trùng với từ khóa In

Cũng giống từ khóa, Tên khơng phân biệt viết hoa hay viết thường Ví dụ viết X1 hay x1 tên thơi

Trong Pascal có số tên đặt sẵn rồi, gọi tên chuẩn, chẳng hạn :

Abs, Arctan, Boolean, Byte, Char, Cos, Copy, Delete, Eof, False, Longint, Ord, Integer, Real, Readln, Writeln, True, Text,

Mặc dù người thảo chương đặt tên trùng với tên chuẩn, song, để đỡ nhầm lẫn, nên tránh điều này.

III CẤU TRÚC CHUNG CỦA CHƯƠNG TRÌNH PASCAL 1 Ví dụ mở đầu :

Để có nhìn tổng quan trước vào vấn đề chi tiết ngơn ngữ Pascal, xin xem chương trình sau:

1.1 Bài tốn chương trình :

Viết chương trình để nhập vào độ dài hai cạnh hình chữ nhật, tính in lên hình diện tích chu vi hình chữ nhật

Nếu gọi hai cạnh hình chữ nhật a b, gọi diện tích chu vi S P cơng thức tính S P là:

S = a.b P = 2(a+b)

Chương trình cụ thể sau :OGRAM VIDU51; { Tinh dien tich va chu vi hinh chu nhat }

(27)

Var

a, b, S, P : Real ; Begin

Clrscr;

Write( ‘Nhap chieu dai : ‘); Readln(a);

Write( ‘Nhap chieu rong : ‘); Readln(b);

S:=a*b; P:=2* (a+b);

Writeln (‘ Dien tich = ‘, S:8:2); Writeln (‘ Chu vi = ‘, P:8:2); Readln;

End.

Chay <VD51.EXE>

Chép chương trình nguồn VD52.PAS

1.2 Giải thích dịng chương trình : { Tinh dien tich va chu vi hinh chu nhat }

Đây lời giải, nêu lên mục đích chương trình Uses CRT ;

Khai báo sử dụng thư viện CRT Turbo Pascal Var

a, b, S, P : Real ;

Khai báo biến a, b, S, P có kiểu liệu số thực (Real) Begin

(28)

Lệnh xóa hình

Write( ‘Nhap chieu dai: ‘);

Lệnh in lên hình câu ‘ Nhap chieu dai: ‘ nhằm nhắc người dùng nhập vào số đo chiều dài Readln(a) ;

Lệnh nhập liệu cho biến a Write( ‘Nhap chieu rong : ‘);

Lệnh in lên hình câu ‘Nhap chieu rong :’ nhằm nhắc người dùng nhập vào số đo chiều rộng Readln(b);

Lệnh nhập liệu cho biến b S := a* b;

Lệnh tính diện tích S hình chữ nhật P := 2*(a+b);

Tương tự, lệnh tính chu vi P hình chữ nhật Writeln(‘Dien tich = ‘, S:8:2);

Lệnh in lên hình câu ‘ Dien tich= ‘ , kế in gía trị biến S Chỉ thị S:8:2 ấn định dành cột hình để in gía trị S, có cột để in phần thập phân

Writeln(‘ Chu vi = ‘, P:8:2);

Lệnh in lên hình câu ‘Chu vi = ‘, kế in gía trị chu vi P có thảy chữ số, có số phần lẻ

Readln;

Lệnh dừng hình để xem kết qủa chạy chương trình End.

Dấu hiệu kết thúc chương trình

1.3 Chạy minh họa chương trình :

Để chạy chương trình mẫu nói trên, nhắp vào mục Chay<VD51.EXE> cuối chương trình Nhưng trước hết xin xem phần hướng dẫn sau đây:

Khi chương trình bắt đầu chạy, hình lên lời nhắc : Nhap chieu dai :

(29)

Nhap chieu dai : 

Màn hình tiếp lời nhắc : Nhap chieu rong :

Bạn nhập số đo chiều rộng, chẳng hạn gõ số Enter : Nhap chieu rong : 

Chương trình tính tốn in kết qủa lên sau : Dien tich = 48.00

Chu vi = 28.00

Để kết thúc, gõ phím Enter

2 Cấu trúc chung chương trình Pascal :

Chương trình dãy câu lệnh thị cho máy công việc phải thực Một chương trình Pasccal đầy đủ gồm ba phần :

Phần tiêu đề Phần khai báo

Phần thân chương chình { Phần tiêu đề}

{ Phần khai báo  }

Uses {khai báo sử dụng thư viện chuẩn} Label {khai báo nhãn}

Const {khai báo hằng} Type {khai báo kiểu liệu} Var { khai báo biến}

Function { khai báo chương trình con} Procedure {hàm thủ tục }

{ Phần thân chương trình  }

Begin { Các lệnh }

(30)

Hình 5.1: Cấu trúc chương trình Pascal 2.1 Phần tiêu đề chương trình :

Phần khóa Program, sau khoảng trắng tên người dùng tự đặt, cuối kết thúc dấu chấm phẩy ‘;’

Ví dụ : Program Btap1;

hoặc : Program Giai_pt_bac2;

Phần tiêu đề chiếm dòng, gọi phần đầu chương trình, khơng có 2.2 Phần khai báo :

Phần khai báo có nhiệm vụ giới thiệu mơ tả đối tượng, đại lượng tham gia chương trình, giống ta giới thiệu thành viên họp Nó gồm khai báo sử dụng thư viện chuẩn, khai báo nhãn, khai báo hằng, khai báo kiểu liệu mới, khai báo biến, khai báo chương trình Tùy theo yêu cầu cụ thể mà khai báo có không

Khai báo nhãn (Label) dùng chương trình có sử dụng lệnh nhảy vơ điều kiện GOTO Nhược điểm lệnh GOTO làm tính cấu trúc chương trình, thay câu lệnh có cấu trúc Pascal Vì thế, để rèn luyện kỹ lập trình có cấu trúc, khơng dùng lệnh GOTO giáo trình

Các thủ tục hàm dùng có nhu cầu thiết kế chương trình lớn, phức tạp Đối với tốn nhỏ, đơn giản, việc sử dụng chương trình chưa cần thiết Chi tiết phần trình bày kỹ 12

Sau ta điểm qua vài nét khai báo thông dụng a) Khai báo khai báo biến :

Biến đại lượng có gía trị thay đổi được, cịn Hằng đại lượng có gía trị khơng đổi, chúng dùng trong chương trình để lưu trữ liệu, tham gia vào biểu thức tính tốn trình xử lý máy Việc khai báo có tác dụng xác định tên kiểu liệu biến hay Biến Hằng thành phần khó thiếu chương trình Để khai báo biến ta dùng từ khóa Var, để khai báo ta dùng từ khóa Const, ví dụ:

Const N=10 ; Var

x, y : Real ; i, k : Integer ;

b) Khai báo (định nghĩa) kiểu liệu mới:

(31)

phải mơ tả sau từ khóa TYPE Khi định nghĩa kiểu liệu mới, ta khai báo biến thuộc kiểu liệu Ví dụ, ta định nghĩa kiểu liệu có tên Mang :

Type

Mang = Array[1 10] of Real;

Bây khai báo hai biến A B có kiểu liệu kiểu Mang : Var

A, B : Mang ;

c) Khai báo sử dụng thư viện chuẩn:

Turbo Pascal có sẵn số hàm thủ tục chuẩn, chúng phân thành nhóm theo chức mang tên đặc trưng, gọi thư viện hay đơn vị chương trình ( Unit ), : Crt, Graph, Dos, Printer, v.v Muốn sử dụng hàm hay thủ tục thư viện nào, ta phải khai báo có sử dụng thư viện đó, lời khai báo phải để sau phần tiêu đề chương trình theo cú pháp :

Uses danhsáchthư viện ;

Ví dụ: thủ tục Clrscr nằm thư viện CRT, nên chương trình mà có dùng lệnh Clrscr, phải khai báo :

Uses CRT ;

Muốn sử dụng hai thư viện CRT GRAPH, ta khai báo : Uses CRT, GRAPH ;

2.3 Phần thân chương trình :

Đây phần chủ yếu chương trình, bắt buộc phải có

Thân chương trình khóa BEGIN kết thúc END (có dấu chấm cuối) Giữa khối BEGIN END lệnh Mỗi lệnh phải kết thúc dấu chấm phẩy ‘;’ Một lệnh, dài, viết hai hay nhiều dịng, ví dụ :

Writeln(‘ Phuong trinh co hai nghiem la X1= ‘, X1:8:2,‘ va X2= ‘, X2:8:2) ;

Ngược lại, dòng viết nhiều lệnh miễn có dấu ‘;’ để phân cách lệnh đó, chẳng hạn : Write(‘ Nhap A, B, C: ‘ ) ; Readln(A,B,C) ;

Thơng thường dịng nên viết lệnh để dễ đọc, dễ kiểm tra lỗi. Ví dụ :

(32)

rồi in Họ tên, mã số, điểm Toán, Lý điểm trung bình sinh viên lên hình PROGRAM VIDU52;

Uses CRT; Var

Ho_ten, Maso : String[20]; Toan, Ly, Dtb : Real; Begin

Write(‘ Nhap Ho va ten : ‘); Readln(Ho_ten); Write(‘ Nhap ma so : ‘); Readln(Maso); Write(‘ Nhap diem Toan : ‘); Readln(Toan); Write(‘ Nhap diem Ly : ‘); Readln(Ly); Dtb:= (Toan+Ly) / 2;

{ In lên hình liệu sinh viên } TextMode(C40); { đặt mode C40 cho hình } TextBackGround(Green); { đặt màu Green } TextColor(Red); { đặt màu chữ Red}

Clrscr ;

Writeln(‘ KET QUA THI CUA SINH VIEN:’); Writeln(‘Ho va ten : ‘, Ho_ten);

Writeln(‘Ma so : ‘, Maso);

Writeln(‘Diem Toan : ‘, Toan:3:1); Writeln(‘Diem Ly : ‘, Ly:3:1); Writeln(‘Diem Tbinh : ‘, Dtb:3:1); Readln;

TextMode(C80); { đặt trả lại mode C80 cho hình} END

(33)

Chép chương trình nguồn VD52.PAS

Trong chương trình có sử dụng bốn thủ tục thuộc thư viện CRT, : Clrscr : xóa hình

TextMode(C40) TextMode(C80) : chuyển hình sang chế độ bề ngang 40 cột (chữ to) 80 cột (chữ bình thường)

TextBackGround(tênmàu) : đặt lại màu hình. TextColor(tênmàu) : đặt lại màu chữ hình.

Tên màu số từ đến 15 viết trực tiếp tiếng Anh : White, Black, Green, Red, Blue,

Bạn chạy minh họa chương trình cách nhắp chọn vào mục Chay<VD52.EXE> cuối chương trình

Cách nhập liệu tương tự ví dụ trước Chẳng hạn ta nhập họ tên Nguyen Van An, mã số 1990064, điểm toán 6, điểm lý :

Nhap Ho va ten : Nguyen Van An  Nhap ma so : 1990064 

Nhap diem Toan :  Nhap diem Ly : 

Chương trình tính điểm trung bình in kết qủa sau: KET QUA THI CUA SINH VIEN:

Ho va ten : Nguyen Van An Ma so : 1990064

Diem Toan : 6.0 Diem Ly : 7.0 Diem Tbinh : 6.5

Hãy Enter để kết thúc trở lại hình ban đầu.

Để soạn chạy chương trình cần phải biết sử dụng phần mềm Turbo Pascal ( viết tắt TP )

(34)

Turbo Pascal phần mềm có nhiệm vụ giúp người thảo chương soạn thảo thực chương trình viết ngơn ngữ Pascal Các chức Turbo Pascal :

Cung cấp hệ soạn thảo văn cho phép người thảo chương soạn sửa chương trình dễ dàng, tiện lợi Giúp người thảo chương tìm lỗi văn phạm chương trình

Dịch (compiler) chương trình viết bằøng ngơn ngữ Pascal thành chương trình viết dạng mã máy Thực hay chạy ( Run ) chương trình viết ngơn ngữ Pascal

Cung cấp thư viện có sẵn nhiều hàm (function) thủ tục (procedure) chuẩn mang lại cho người thảo chương nhiều cơng cụ hữu ích, làm giảm bớt khối lượng phải lập trình

Là sản phẩm hãng Borland tiếng, Turbo Pascal (viết tắt TP) không ngừng cải tiến, đến đời version 7.0 Tuy nhiên, mức độ thảo chương bản, người ta thích dùng phiên 5.5 6.0 đơn giản mà đủ dùng, tốc độ nhanh hơn, thích hợp với máy có cấu hình chưa mạnh

2 Khởi động Turbo Pascal:

Trong phần trình bày cách sử dụng Turbo Pascal 6.0 Người đọc tự suy cách sử dụng Turbo Pascal 5.5 hay 7.0, vềø chúng giống với phiên 6.0

2.1 Các tập tin Turbo Pascal:

Để chạy Turbo Pascal 6.0, cần hai tập tin sau đủ : TURBO.EXE : tập tin TP

TURBO.TPL : tập tin chứa thư viện TP Nếu muốn vẽ đồ họa phải có thêm tập tin:

GRAPH.TPU, tập tin chứa thư viện đồ họa *.BGI : tập tin hình đồ họa

*.CHR : tập tin tạo kiểu chữ

Trong tập tin hình đồ họa thơng thường cần tập tin EGAVGA.BGI đủ, ngày phần lớn hình có kiểu EGA hay VGA

Nếu muốn xem hướng dẫn sử dụng Turbo Pascal cần có thêm tập tin TURBO.HLP

Thơng thường tập tin để thư mục riêng có tên TP, hay TP6 Dưới ta giả thiết thư mục chứa Turbo Pascal TP nằm gốc đĩa cứng C hay đĩa mềm A

2.2 Khởi động Turbo Pascal:

a) Nếu bạn làm việc máy cá nhân mạng có hệ điều hành MSDOS sau khởi động máy xong:

(35)

TURBO 

Trên hình cửa sổ soạn thảo hình 5.2

Nếu gõ lệnh mà cửa sổ Turbo Pascal không ra, máy bạn chưa thiết lập đường dẫn đến thư mục TP, trường hợp bạn phải di chuyển vào thư mục TP lệnh :

CD \TP

rồi sau gõ tiếp : TURBO 

b) Nếu bạn làm việc máy cá nhân mạng có hệ điều hành WINDOWS 95 hơn, sau khởi động WINDOWS 95 :

Trường hợp có sẵn Shortcut chứa Turbo Pascal Desktop : nhắp left mouse hai lần liên tiếp vào biểu tượng Shortcut Turbo Pascal

Trường hợp khơng có sẵn Shortcut chứa Turbo Pascal: chọn lệnh Start, chọn tiếp lệnh Run, gõ vào đường dẫn đầy đủ tập tin TURBO.EXE, chẳng hạn:

C:\TP\TURBO.EXE  , khởi động TP từ đĩa C A:\TP\TURBO.EXE  , khởi động TP từ đĩa A

2.3 Cửa sổ Turbo Pascal cách chọn lệnh :

Trong cửa sổ này, dòng thực đơn ngang, liệt kê chín nhóm lệnh TP Muốn chọn lệnh thực đơn này, tiến hành theo hai cách:

Cách một:

(36)

Để chọn lệnh thực đơn dọc, gõ phím mũi tên ,  dời khung sáng đến lệnh Enter Khi khơng muốn chọn lệnh gõ phím ESC để trở vùng soạn thảo

Ngồi cách dùng phím F10 nói trên, chọn lệnh thực đơn ngang cách gõ đồng thời phím Alt với phím chữ tên lệnh muốn chọn Ví dụ, muốn chọn lệnh File gõ đồng thời hai phím Alt F (viết tắt Alt-F), tương tự, muốn chọn lệnh Compile gõ Alt-C

Cách hai: dùng phím "nóng":

Có số lệnh gán cho phím đặc biệt gọi phím "nóng", ví dụ lệnh Open: F3, lệnh Save : F2, lệnh Exit : Alt-X Để thực lệnh này, thay phải chọn từ thực đơn, ta cần gõ phím nóng tương ứng với Ví dụ, thay chọn lệnh Open gõ phím F3, thay chọn lệnh Save gõ phím F2,

Dưới thực đơn ngang vùng soạn thảo dùng để gõ chương trình vào Đầøu vùng tên tập tin soạn, người thảo chương chưa đặt tên TP đặt giùm tên

NONAME00.PAS

Dịng cuối tóm tắt số phím " nóng" hay dùng, phím F1 để xem hướng dẫn, phím F2 để lưu tập tin lên đĩa, phím F3 dùng để mở xem tập tin, phím F10 để khởi động thực đơn,.v.v

2.4 Thoát khỏi Turbo Pascal:

Chọn lệnh File thực đơn ngang, chọn tiếp lệnh Exit thực đơn dọc (viết gọn chọn lệnh File/ Exit) Nếu làm việc TP 5.5 chọn lệnh File/ Quit

Hoặc gõ cặp phím nóng Alt-X

3 Các bước thực chương trình Pascal:

Để soạn chạy chương trình Pascal Turbo Pascal, nên tiến hành bước sau: Bước 1: Khởi động Turbo Pascal

(37)

Chọn lệnh File/ Open (nếu làm việc TP 5.5 chọn lệnh File/ Load) gõ phím F3, sau gõ tên tập tin (khơng cầøn gõ phần đi) vào khung vừa ra, ví dụ :

Khi tên BTAP1.PAS đầu vùng soạn thảo Đuôi PAS TP tự động gắn thêm vào

Tập tin BTAP1.PAS lưu thư mục thời Nếu muốn tập tin BTAP1.PAS lưu lên đĩa A nhập tên tập tin ta nên gõ thêm tên ổ đĩa đằng trước, ví dụ :

Bước 3: Soạn thảo ( gõ ) chương trình

(38)

Bước 4: Dịch sửa lỗi:

Chọn lệnh Compile/ Compile (hoặc gõ cặp phím Alt-F9, hay đơn giản gõ phím F9 được) Máy dịch chương trình sang mã máy, gặp lỗi dừng thơng báo lỗi màu đỏ đầu hình, đồøng thời trỏ đặt vị trí có lỗi Người thảo chương phải tự sửa lỗi, gõ Alt-F9 để dịch sửa lỗi tiếp hết lỗi Dấu hiệu cho biết việc dịch xong hình xuất cửa sổ thơng báo có dịng chữ đặc trưng là:

Bước 5: Lưu trữ chương trình lên đĩa: chọn lệnh File/ Save gõ phím F2. Bước 6: Chạy thử chương trình:

Chọn lệnh Run/ Run gõ phím nóng Ctrl-F9 (viết tắt ^F9) Mỗi lần chạy thử, ta cần nhập liệu cụ thể kiểm tra xem kết qủa in lên hình có khơng Cần phải chạy thử số lần ứng với liệu khác Nếu kết qủa lần chạy thử chương trình hồn thành Ngược lại, có lần chạy thử cho kết qủa sai chương trình chưa ổn, cần phải sửa lại thuật tốn chương trình Ví dụ : Để chạy thử chương trình mẫu trên, gõ ^F9 nhập vào chiều dài 10, chiều rộng 7, sau : Nhap chieu dai : 10 

Nhap chieu rong : 

Chương trình in kết qủa lên hình : Dien tich = 70.00

(39)

Hãy Enter để trở lại hình soạn thảo.

Việc chạy thử với liệu khác, xin dành cho độc giả Bước 7:

Nếu chương trình chạy gõ phím F2 để lưu lên đĩa lần cuối Bây lặp lại từ bước để soạn chương trình

4 Mở xem chương trình cũ :

Muốn xem lại chương trình có đĩa, chọn lệnh File/ Open gõ phím F3, khung có tiêu Name, gõ vào *.PAS  (hoặc A:*.PAS  tập tin nằm đĩa A), danh sách tập tin có PAS khung phía cho ta chọn ( hình 5.4) :

Dùng phím mũi tên  , , , để di chuyển đặt sáng vào tên muốn chọn Enter Nội dung tập tin đưa lên hình cho xem, sửa, chạy thử, v.v

Chú ý TP từ 6.0 trở lên, để đưa trỏ từ hộp Name xuống hộp Files dưới, dùng phím Tab, từ hộp File lại hộp Name : gõ Shift_Tab

5 Lưu tập tin sang đĩa khác :

Khi cần ghi tập tin soạn từ đĩa cứng sang đĩa A, làm sau:

Chọn lệnh File/ Save as (nếu làm việc TP 5.5 chọn lệnh File/ Write to ) Trong khung , gõ tên tập tin vào, nhớ gõ thêm tên đĩa A: đằng trước: Name:

A:\BTAP.PAS

Từ nay, gõ phím F2 chọn lệnh File/ Save, tập tin BTAP1.PAS ghi lên đĩa A 6 Một vài kỹ thuật soạn thảo :

6.1 Thao tác khối:

(40)

Write(‘ Nhap chieu dai va chieu rong hinh chu nhat: ‘);

Readln(a,b); a) Đánh dấu khối:

Đưa trỏ đầu khối

Một tay đè phím Shift, tay gõ phím mũi tên  , , , kéo vùng sáng phủ đến cuối khối Nếu làm việc TP 5.5 đánh dấu khối cách: đưa trỏ vềø đầu khối, gõ ^K_B, sau đưa trỏ cuối khối, gõ ^K_K (Cách gõ ^K_B: tay đè phím Ctrl tay gõ liên tiếp hai phím K B)

b) Sao chép khối:

Đánh dấu khối cần chép Đưa trỏ đến nơi cần chép tới Gõ lệnh ^K_C

c) Di chuyển khối:

Đánh dấu khối cần di chuyển

Đưa trỏ đến nơi cần chuyển khối tới Gõ lệnh ^K_V

d) Xóa khối:

Đánh dấu khối cần xóa Gõ lệnh ^K_Y

e) Che lại khối đánh dấu : lệnh ^K_H 6.2 Các phím lệnh soạn thảo thơng dụng:

Phím Home : đưa trỏ đầu dịng thời Phím End : đưa trỏ cuối dịng thời

Phím Delete : xóa ký tự vị trí trỏ Nếu trỏ đứng cuối dịng mà gõ phím Delete nối dịng vào cuối dịng trên.

(41)

Cặp phím Ctrl_Y : xóa tồn dịng thời đơn dịng lên Nhóm phím Ctrl_Q_Y : xóa từ vị trí trỏ đến cuối dịng

Các phím  , , , : dời trỏ theo hướng mũi tên

Phím Insert : mở tắt chế độ viết chèn Ở chế độ viết chèn, trỏ hình có dạng bình thường, tắt chế độ viết chèn, trỏ có kích thước lớn gấp lần bình thường (Trong TP 5.5, chế độ viết chèn hay tắt viết chèn nhận biết việc chữ Insert có hay không đầu cửa sổ soạn thảo)

Phím Enter :

Trong chế độ viết chèn: gõ Enter có tác dụng đưa trỏ xuống đầu dịng dưới, tồn chữ đứng sau trỏ (nếu có) bị cắt xuống dòng Khi trỏ đứng đầøu dịng mà Enter tạo dịng trống vị trí

Nếu chế độ viết chèn tắt gõ phím Enter, trỏ đầu dòng thời (dòng chứa trỏ), khơng xuống dịng

Chú ý: Trong Turbo Pascal khơng dùng chữ có dấu tiếng Việt Tuy nhiên chương trình mẫu giáo trình viết chữ có dấu để dễ đọc, dễ hiểu Khi soạn Turbo Pascal xin bỏ dấu đi.

V CÂU HỎI TRẮC NGHIỆM Trong câu hỏi đây, chọn câu trả lời thích hợp nhất:

Câu 1: Tính cấu trúc ngơn ngữ Pascal thể : a) việc tổ chức dtệu;

b) việc tổ chức câu lệnh; c) việc tổ chức chương trình; d)ở ba mục a), b), c) ;

Câu 2: Ðiều làm cho Pacal đánh gía cao trở thành ngôn ngữ thảo chương phổ biến ?

a) Nó ngơn ngữ đưa thể khái niệm lập trình có cấu trúc.; b) Nó ngôn ngữ chặt chẽ mặt cú pháp mặt liệu;

c) Nó ngơn ngữ có văn phạm sáng sủa, dễ hiểu, có khả đủ mạnh; d)Cả ba điều nêu mục a), b), c) ;

Câu 3: Khẳng định đúng:

a) VAR , BEGIN, end từ khóa Pascal khái niệm lập trình có cấu trúc.; b) Các ký hiệu a , b , g , d thuộc ký tự Pascal;

(42)

Câu 4: Tên đặt Sai quy định Pascal: a) Giai_Ptrinh_Bac_2;

b) Ngaysinh; c) Noi sinh; d)Sv2000 ;

Câu 5: Mục có Tên đặt quy định Pascal: a) x1 , X-2 ;

b) Xx1 , X2;

c) CONST , X_234; d)X[1], x2 ;

Câu 6: Chọn câu Sai : chương trình Pascal, khơng có : a) phần thân chương trình ;

b) phần khai báo biến; c) phần đầu chương trình; d)phần khai báo ;

Câu 7: Dấu hiệu kết thúc chương trình Pascal : a) End;

b) END; c) end d) End ! ;

Câu 8: Trong Pascal, lệnh có tác dụng xóa hình : a) CLRSSR ;

b) CLRSR; c) Clrscl; d) Clrscr ;

Câu 9: Trong Pascal, muốn dùng lệnh xóa hình Clrscr phải khai báo sau phần tiêu đề chương trình :

a) Uses CRT ; b) USES Graph; c) use CRT ;

d) khơng khai báo ca ;

(43)

a) để lưu chương trình lên đĩa, gõ phím F2 chọn lệnh File / Save ; b) để mở tập tin cũ, gõ phím F1;

c) để tìm lỗi cú pháp chương trình, gõ phím Alt_F9, hay F9 ; d) để chạy chương trình, gõ phím ^F9 chọn lệnh Run / Run ;

VI BÀI TẬP

Câu Soạn chạy thử chương trình ví dụ mở đầu mục 5.3.1 Câu Soạn chạy thử chương trình ví dụ mục 5.3.3

Câu Viết chương trình nhập vào số đo cạnh diện tích hình chữ nhật, tính cạnh chu vi hình chữ nhật

Câu Viết chương trình in lên hình hai câu sau : " Chao cac ban ! "

" Rat vui đuoc lam quen voi cac ban ! "

Câu Viết chương trình nhập hai số x y, tính in lên hình tổng x+y, hiệu x-y tích x*y hai số

6.1 KHÁI NIỆM VỀ KIỂU DỮ LIỆU 6.1.1 Khái niệm :

Chức máy điện toán xử lý thông tin Các thông tin nhập lưu trữ nhớ máy dạng khác nhau: số, chữ, hình ảnh, âm thanh,.v.v mà thuật ngữ tin học gọi chung liệu Tính đa dạng liệu đòi hỏi phải tổ chức phân phối nhớ thích hợp để lưu trữ xử lý tốt liệu Ngôn ngữ thảo chương chia liệu thành nhóm riêng xây dựng số phép toán tạo nên kiểu liệu khác nhau, kiểu liệu tập hợp gía trị mà biến thuộc kiểu nhận Khi biến khai báo thuộc kiểu liệu máy dành cho biến dung lượng thích hợp nhớ để lưu trữ gía trị thuộc kiểu liệu

6.1.2 Phân loại kiểu liệu :

Các kiểu liệu ngôn ngữ Pascal chia thành hai loại chính: loại đơn giản loại có cấu trúc

Mỗi kiểu liệu đơn giản tập giá trị sở có thứ tự Ví dụ kiểu Integer gồm số nguyên nằm phạm vi từ -32768 đến 32767 có thứ tự tự nhiên : -32768< < -1 < < < < 32767 , kiểu lơ gic có hai gía trị False, True với quy ước False < True

Các kiểu liệu có cấu trúc xây dựng từ kiểu liệu đơn giản Mỗi kiểu liệu có cấu trúc tập phần tử thuộc kiểu liệu đơn giản tổ chức lại theo quy tắc định

(44)

Các kiểu liệu có cấu trúc gồm có :kiểu mảng, kiểu ghi, kiểu tập hợp kiểu tập tin

Riêng chuỗi ký tự (STRING) kiểu liệu đặc biệt, vừa có tính đơn giản lại vừa có tính cấu trúc Mỗi chuỗi xem gía trị, xem mảng gía trị kiểu ký tự Vì vậy, việc sử dụng chuỗi có hai mức khác nhau: mức đơn giản mức có cấu trúc

Các kiểu liệu đơn giản phân thành hai loại: đếm (Ordinal type) không đếm Kiểu thực thuộc loại khơng đếm được, gía trị dày đặc Tất kiểu liệu đơn giản cịn lại : ngun, ký tự, lơ gic, liệt kê đoạn thuộc loại đếm (còn gọi rời rạc)

Dưới trình bày kỹ kiểu liệu đơn giản chuẩn thông dụng: kiểu nguyên, kiểu thực, kiểu logic, kiểu ký tự Kiểu chuỗi giới thiệu để sử dụng mức đơn giản

6.2 KIỂU SỐ NGUYÊN 6.2.1 Các kiểu số nguyên :

Tên kiểu Phạm vi gía trị Số byte

ShortInt -128 127

Byte 255

Integer -32768 32767

Word 65535

LongInt -2147483648 2147483647

Bảng 6.1

Ngồi kiểu Integer thơng dụng nhất, số nguyên chia thành kiểu là: Byte, Word, ShortInt LongInt Bảng 6.1 liệt kê chi tiết tên gọi, phạm vi gía trị độ dài tính theo đơn vị byte kiểu nguyên

Các biến nguyên nhận gía trị số ngun nằm phạm vi gía trị biến Khi gán cho biến số nguyên nằm phạm vi biến máy báo lỗi: "Const out of range" Ví dụ, cho khai báo :

Var i : Byte; N : Integer;

thì lệnh đưới đúng: i:= 200;

N:= -1500;

(45)

i:= -5; N:= 50000;

Ðặc biệt gán số thực cho biến nguyên Câu lệnh sau sai : N:= 12.5 ;

Khi gặp tình này, máy báo lỗi "Type mismatch" Chú ý:

Các số nguyên hệ thập lục phân (hệ 16) biểu diễn cách viết thêm dấu $ trước số, ví dụ ba số :

$A , $FF $10

là số nguyên viết hệ 16 Chúng có gía trị tương ứng hệ 10 là: 10 , 255 16

6.2.2 Các phép toán số học số nguyên: Phép cộng trừ : ký hiệu + - thường lệ

Phép nhân : ký hiệu dấu *, ví dụ 4*2 cho kết qủa Phép chia : ký hiệu dấu / , ví dụ 6/4 cho kết qủa 1.5 Phép chia lấy phần nguyên : ký hiệu từ khóa DIV

Phép lấy phần dư nguyên phép chia: ký hiệu từ khóa MOD Ví dụ: 15 DIV cho kết qủa

15 MOD cho kết qủa

Các phép toán cho kết qủa số nguyên, trừ phép chia ( / ) cho kết qủa số thực Vì N biến nguyên, mà gán :

N:= 20/5;

thì máy báo lỗi, vế phải có gía trị kiểu thực (=4.0) phần lẻ không Nhận xét : số nguyên N chẵn N mod = (tức N chia hết cho 2),

ngược lại, lẻ N mod <> (dấu <> Pascal có nghĩa khác )

(46)

Kế đến *, /, div, mod Sau +,

Ðối với phép toán thứ tự mà đứng liền phép tốn đứng trước làm trước Ví dụ: tính biểu thức sau :

15 mod (2 +4) * 20 div (10 div 4) + 40 mod ( 5* 3) =15 mod * 20 div + 40 mod 15

= * 20 div + 10 = 60 div + 10 = 30 + 10 = 40

Ví dụ sau ứng dụng phép toán div, mod :

Ví dụ 6.1: Nhập số tiền N đồng, đổi xem tờ đồng, tờ đồng, bao nhiêu tờ đồng cho tổng số tờ Ví dụ N=43 đ = tờ đ + tờ đ + tờ đ Cách tính sau :

Số tờ đ = 43 div = Số tiền dư = 43 mod =

Số tờ đ = Số tiền dư div = div =1 Số tờ đ = Số tiền dư mod = mod = Dưới chương trình cụ thể :

PROGRAM VIDU61; { Ðổi tiền }

Var

N, st5, st2, st1, sodu : LongInt; Begin

Write(‘ Nhap so tien : ’); Readln(N); st5 := N div 5;

(47)

st1 := Sodu mod 2;

Writeln(‘ KET QUA DOI TIEN LA: ’ ) ; Writeln(‘ So to 5đ= ‘, st5);

Writeln(‘ So to 2đ= ‘, st2); Writeln(‘ So to 1đ=‘, st1); Readln;

End.

Chạy<VD61.EXE>

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

6.2.3 Các phép tốn so sánh :

Ngơn ngữ Pascal có sáu phép tốn so sánh liệt kê bảng 6.2

Ký hiệu Ý nghĩa Ví dụ

= x=y

<> khác x<>y

< nhỏ x<y

<= nhỏ x<=y

> lớn x>y

>= lớn x>=y

Bảng 6.2

Kết qủa biểu thức so sánh gía trị lơgic Ðúng (TRUE) Sai (FALSE) Ví dụ: Biểu thức 5*2=10 cho kết qủa TRUE

Biểu thức 5+2 <> cho kết qủa FALSE

Biểu thức div > 10 div cho kết qủa FALSE 6.2.4 Các phép tốn lơgic số ngun :

(48)

NOT = 1 AND 0=0 OR 0=1 XOR 0=1 AND 1=0 OR 1=1 XOR 1=1 AND 0=0 OR 0=0 XOR 0=0

Bảng 6.3

Mỗi số nguyên biểu diễn máy dạng dãy bít nhị phân Số kiểu Integer biểu diễn 16 bit Ví dụ, số số có biểu diễn máy :

0000 0000 0000 0001 0000 0000 0000 0011

Phép lấy NOT số nguyên đảo tất bít biểu diễn số ngun đó, tức thành 1, cịn thành Ví dụ:

NOT = 1111 1111 1111 1110 NOT = 1111 1111 1111 1100

Phép lấy AND, OR, XOR hai số nguyên tiến hành cách AND, OR, XOR cặp bít tương ứng hai số đó, ví dụ:

OR = 0000 0000 0000 0011= AND = 0000 0000 0000 0001=

6.2.5 Các phép dịch chuyển số học SHR SHL :

N SHR k : dịch bít số nguyên N sang phải k bít N SHL k : dịch bít số nguyên N sang trái k bít Có thể chứng minh :

N SHR k = N div 2k N SHL k = N * 2k Ví dụ:

120 shr = 7, :

120 shr = 120 div 24 = 120 div 16 = 7. 120 shl = 960, :

120 shl = 120 * 23 = 120 * = 960.

(49)

6.2.6 Các hàm có đối số nguyên :

Hàm PRED(k) : đối số k nguyên, trả số nguyên đứng trước k, tức k-1 Ví dụ: Pred (5) = 4, Pred (-6) = -7

Hàm SUCC(k) : đối số k nguyên, trả số nguyên đứng sau k, tức k+1 Ví dụ: Succ (5) = 6, Succ (-6) = -5

Nhận xét :

Lệnh k:=k+1; tương đương với lệnh k:=Succ(k); Lệnh k:=k-1; tương đương với lệnh k:=Pred(k);

Hàm ODD(k) : đối số k nguyên, trả gía trị logic TRUE k lẻ, FALSE k chẵn Ví dụ:

Odd(15) = True Odd(4) = False

Ví dụ 6.2 : Nhập số nguyên N, N chẵn in chữ chẵn, N lẻ in chữ le? Chương trình sau :

PROGRAM VIDU62; Var

N : Integer; Begin

Write(‘Nhap so N :’); Readln(N);

If Odd(N) = TRUE then write(N, ‘ La so le’) else

write(N, ‘ La so chan’); Readln;

End.

Chạy<VD62.EXE>

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

(50)

Có hai thủ tục thơng dụng là:

Thủ tục INC(k) : tăng k lên đơn vị Ví dụ, sau thực lệnh : k:=5;

Inc(k);

gía trị sau k

Vậy, lệnh Inc(k); tương đương với lệnh k:=k+1; hay k:=Succ(k);

Thủ tục DEC(k) : giảm k đơn vị Ví dụ, sau thực lệnh : k:=5;

Dec(k);

thì gía trị k

Vậy, lệnh Dec(k) ; tương đương với lệnh k:=k-1; hay k:=Pred(k); 6.3 KIỂU SỐ THỰC 6.3.1 Kiểu Real kiểu mở rộng :

Kiểu Real kiểu số thực thông dụng dùng để biểu diễn số thực x có trị tuyệt đối  x nằm khoảng từ 2.9*10-39 đến 1.7*10+38 Nếu  x > 1.7*10+38 thì khơng biểu diễn x máy được, cịn x < 2.9*10-39 thì x coi

Có hai cách biểu diễn số thực:

Cách 1: Viết bình thường, dấu phẩy thập phân thay dấu chấm thập phân. Ví dụ: 45.0 -256.45 +122.08

Cách 2: Viết số dạng khoa học :

1.257E+01 (có gía trị = 1.257*101 = 12.57 ) 1257.0E-02 (có gía trị = 1257*10-2 = 12.57 )

Trong dạng số gồm có hai phần, phần đứng trước E gọi phần định trị, viết theo cách 1, phần đứng sau E gọi phần bậc, gồm dấu cộng trừ, tiếp đến số nguyên

Số viết theo cách gọi số có dấu chấm thập phân cố định, số viết theo cách cịn gọi số có dấu chấm thập phân di động hay số dạng khoa học (Scientific)

Ví dụ: Muốn khai báo hai biến x, y kiểu real, ta viết: Var

(51)

Ngoài kiểu Real ra, số thực cịn có kiểu mở rộng Single, Double, Extended va?Comp Bảng 6.4 nêu chi tiết phạm vi gía trị số byte dùng để lưu trữ nhớ kiểu số thực

Tên kiểu Phạm vi gía trị Số byte

Real 2.9*10-39 1.7*1038 6

Single 1.5*10-45 3.4*1038 4 Double 5.0*10-324 1.7*10308 8 Extended 3.4*10-4932 1.1*104932 10

Comp -9.2*1018 9.2*1018 8

Bảng 6.4

Chú y? : Turbo Pascal thường làm việc với kiểu Real Muốn dùng kiểu thực lại, phải chuyển sang mode 8087 bằ?g cách viết thị {$N+} đầu chương trình

6.3.2 Các phép toán số thực :

Có phép tốn số học nhân (*), chia (/), cộng (+) trừ (-) Khi số hạng tham gia tính tốn kiểu thực kết qủa phép tốn số thực

Phép toán DIV, MOD không dùng cho số thực

Ví dụ: với hai biến x, y kiểu thực lệnh sau bị lỗi biểu thức vế phải không hợp lệ: y:= x mod 10 ;

Các phép toán so sánh (= , <> , < , <= , > , >= ) dùng cho số hạng thực hay nguyên

6.3.3 Các hàm có đối số nguyên thực :

Hàm ABS(x): tính trị tuyệt đối x : x Kiểu liệu kết qủa kiểu với đối số Nếu x nguyên ABS(x) nguyên, x số thực ABS(x) số thực

Ví dụ: Abs(5 - 8) =

Hàm SQR(x): tính bình phương x: x2 Kiểu liệu kết qủa kiểu với đối số Ví dụ: Sqr(4.0) = 16.0

Sqr(7 div 3) =

(52)

Hàm EXP(x) : tính ex

Hàm LN(x): tính lnx, (x > 0)

Các hàm SIN(x), COS(x), ARCTAN(x): tính sinx, cosx arctgx Hàm INT(x) : cho số thực phần nguyên x Ví dụ :

Int(12.55) = 12.0 Int(1+10/3)=4.0

Hàm FRAC(x) : cho số thực phần lẻ x Ví dụ : Frac(12.55) = 0.55

Hai hàm đặc biệt cho kết qủa số nguyên:

Hàm TRUNC(x): cho số nguyên phần nguyên x Ví dụ : Trunc(12.55) = 12

Trunc(-2.98) = -2

Hàm ROUND(x): cho số ngun cách làm trịn x Ví dụ : Round(12.45) = 12

Round(-2.98) = -3

Chú ý hàm Int(x) hàm Trunc(x) cho phần nguyên x, chúng khác kiểu liệu gía trị trả Int(4.5)= 4.0 cịn Trunc(4.5) = (viết hiểu số ngun, cịn viết 4.0 hiểu số thực)

Ví dụ 6.3: Viết chương trình nhập số thực x bất kỳ, tính in gía trị y z lên hình theo cơng thức:

Trong Pascal khơng có hàm tính trực tiếp 2x Log

4(x), nên ta phải chuyển qua hàm ex Ln(x) sau:

(53)

Var

x, y, z : Real; Begin

Write(‘Nhap x: ‘); Readln(x);

y:= ( sqrt (x*x+1) + sin(x)*sin(x) ) / ( 3*exp(2*x) + ); z:= exp( x*Ln(2) ) + Ln(abs(x)+1) / Ln(4);

Writeln(‘y= ‘, y:10:3 ); Writeln(‘z= ‘, z:10:3 ); Readln;

End

Chạy<VD63.EXE>

Chép tập tin nguồn <VD63.pas>

Khi chạy chương trình, nhập x =0 kết qủa y=0.250 z=1.000 6.4 KIỂU KÝ TỰ (CHAR) 6.4.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

(54)

9 57 K 75 k 107

L 76 l 108

M 77 m 109

N 78 n 110

O 79 o 111

P 80 p 112

Q 81 q 113

R 82 r 114

S 83 s 115

T 84 t 116

U 85 u 117

V 86 v upload

123doc net

W 87 w 119

X 88 x 120

Y 89 y 121

Z 90 z 122

Bảng 6.5

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 6.5, 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’, ‘$’,

(55)

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 Nhận xét : Từ bảng mã chữ ta suy ra:

Mã chữ thường = Mã chữ hoa tương ứng + 32 (1) 6.4.2 Các hàm liên quan đến ký tự :

Hàm PRED(ch): cho ký tự đứng trước ký tự ch bảng mã Ví dụ: Pred(‘B’)=‘A’ Hàm SUCC(ch): cho ký tự đứng sau ký tự ch bảng mã Ví dụ: Succ(‘A’)=‘B’ Hàm UpCase(ch): đổi ký tự ch thành chữ hoa Ví dụ:

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

Hàm ORD(ch) : cho mã ký tự ch Ví dụ: Ord (‘A’) = 65, Ord (‘a’) = 97 Hàm CHR(k) : đối số k nguyên, 0 k  255, cho ký tự có mã bằ?g 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) ;

(56)

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

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 )

Ví dụ 6.4: Nhập vào số nguyên k, 0 k  255, in ký tự có mã k Chương trình kết thúc nhập vào số :

PROGRAM VIDU64 ; Uses CRT;

Var k : Byte; Begin CLRSCR;

Writeln(‘ Nhập số để kết thúc :’); Repeat

Write(‘ Nhập mã ký tự : ‘); Readln(k); Writeln(‘ Ký tự có mã ‘, k, ‘ ‘ , Chr(k) ); Until k=0;

End.

Chạy<VD64.EXE>

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

Ví dụ 6.5: Nhập ký tự, chữ hoa đổi chữ thường, chữ thường đổi chữ hoa PROGRAM VIDU65;

{ Ðổi chữ hoa thường ngược lại} Var

(57)

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<VD65.EXE>

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

6.5 KIỂU LÔGIC (BOOLEAN)

Kiểu boolean có hai gía trị TRUE (đúng) FALSE (sai), không phân biệt chữ hoa hay chữ thường Về quan hệ thứ tự FALSE< TRUE Mỗi gía trị boolean chiếm byte nhớ

Các phép tốn lơgic gồm có: NOT, AND, OR XOR Nếu A B hai đại lượng lôgic NOT A, A and B, A or B A xor B đại lượng lơgic có kết qủa cho bảng 6.6

A not A

True False

False True

A B A and B A or B A xor B

True True True True False

True False False True True

False True False True True

False False False False False

Bảng 6.6 Cũng từ bảng ta rút nhận xét :

(58)

A or B sai A B đồng thời sai (Do cần hai biến A B A or B đúng)

A xor B A khác B.

Thứ tự thực phép tốn lơgic sau: NOT tính trước, AND, sau OR, XOR Ví dụ, sau thực lệnh:

A:=Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1); gía trị A= FALSE, :

Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1) = TRUE or TRUE and FALSE xor TRUE

= TRUE or FALSE xor TRUE = TRUE xor TRUE

= FALSE

Biến nhận gía trị TRUE FALSE gọi biến kiểu lôgic Khi khai báo biến kiểu lơgic ta dùng từ khóa Boolean, ví dụ :

Var

A, B : Boolean;

Trong chương trình ta gán : A:= true;

B:=2*2 < 3;

Gía trị biến B False biểu thức 2*2< sai

Về thứ tự tính tốn, phép so sánh ngang cấp tính sau tất phép tốn khác Ví dụ tính biểu thức :

5+7 div < -7 mod + 5*2 = = + < -1 + 10

= 8< = TRUE

Do đó, biểu thức mà có phép tốn lơgic xen kẽ với biểu thức so sánh biểu thức so sánh phải để ngoặc đơn

(59)

N > and N<10

Cần sửa thành : (N > 0) and (N<10) Ví dụ 6.6:

Nhập vào độ dài ba cạnh a,b,c tam giác, a, b, c ba cạnh tam giác in lên hình câu " khơng phải ba cạnh tam gíac", ngược lại, ba cạnh tam giác tính chu vi diện tích tam giác theo cơng thức Hêrơng:

, với p nửa chu vi:

Ta biết, điều kiện để a,b,c ba cạnh tam giác cạnh phải dương tổng hai cạnh lớn cạnh cịn lại

Dưới chương trình cụ thể : PROGRAM VIDU66;

{Tính diện tích chu vi tam giác theo cạnh} Var

a, b, c, P, S : Real; Tgiac: Boolean; Begin

Write(‘ Nhap canh cua tam giac : ‘); Readln(a, b, c);

Tgiac:= (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a); If Tgiac= FALSE then

Writeln(‘ Khong phai ba canh cua tam giac !’) else

begin

P:=(a+b+c)/2;

(60)

Writeln(‘ chu vi = ‘ , 2*P:10:2); Writeln(‘ dien tich S= ‘ , S:10:2); end;

Readln; End.

Chạy<VD66.EXE>

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

Khi chạy chương trình này, để nhập ba cạnh tam giác, bạn gõ ba số cách khoảng trắng enter, chẳng hạn :

Nhap canh cua tam giac :

Kết qủa chu vi= 12.00, dien tich= 6.00 Nếu nhập ba cạnh : máy câu: "Không phải ba cạnh tam giác ! " (vì 2+3 < 6)

6.6 CHUỖI KÝ TỰ (STRING)

Một dãy ký tự đặt cặp nháy đơn gọi chuỗi Dưới ba chuỗi : ‘NGON NGU PASCAL’

‘Tin hoc nam 2000’ ‘123456’

Các chuỗi ghép nối với nhờ phép cộng chuỗi Khi cộng (+) hai chuỗi ta chuỗi cách ghép chuỗi sau vào cuối chuỗi đầu Ví dụ phép cộng :

‘Ngon ngu’ + ‘ Pascal’ cho kết qủa ‘Ngon ngu Pascal’

Các chuỗi so sánh với Việc so sánh hai chuỗi thực cách so sánh cặp ký tự tương ứng từ trái qua phải Khi phát có cặp ký tự khác chuỗi chứa ký tự nhỏ nhỏ hơn, ví dụ:

Biểu thức ‘Anh’ < ‘an’ ‘A’ < ‘a’ Biểu thức ‘Thong’ > ‘Tha’ ‘o’ > ‘a’

Nếu nội dung?của hai chuỗi giống từ đầu đến hết chiều dài chuỗi ngắn chuỗi ngắn nhỏ hơn, ví dụ:

Biểu thức ‘Tha’ < ‘Thang’ ‘Tha’ ngắn ‘Thang’

Hai chuỗi chúng dài cặp ký tự vị trí tương ứng giống Ví dụ:

(61)

Biểu thức ‘Pascal’ = ‘PAscal’ cho kết qủa sai

Biến nhận giá trị chuỗi gọi biến kiểu chuỗi Có thể khai báo hai biến chuỗi sau: Var

Ho_ten : String[20]; St : String;

khi Ho_ten biến chuỗi chứa tối đa 20 ký tự, cịn biến chuỗi St chứa tối đa 255 ký tự, ta gán :

Ho_ten := ‘Nguyen Van An’;

St :=‘Thao chuong bang ngon ngu Pascal’;

Chuỗi ‘Nguyen Van An’ gọi gía trị biến Ho_ten Tương tự, chuỗi ‘Thao chuong bang ngon ngu Pascal’ gia trị biến St

6.7 CÂU HỎI TRẮC NGHIỆM Câu 1: Cho khai báo biến :

Var m, n : integer; x, y : Real; Lệnh sai : a) m := -4; b) n := 3.5; c) x := 6; d) y := +10.5;

Câu 2: Ðể tính gía trị , chọn cách viết : a) x := -b/2a;

b) x := -b/2*a; c) ; d) x := -b/2/a;

Câu 3: Biểu thức : 25 div + 5/2*3 có giá trị : a) 8.0;

(62)

d) 15.0;

Câu 4: Cho phương trình : ax2 + bx + c =

Giả sử a? Delta:= b*b- 4*a*c > Một nghiệm phương trình :

a) X:= -b + SQRT(Delta) / (2*a); b) X:= (-b + SQRT(Delta) ) /2*a; c) X:= (-b + SQRT(Delta) ) / (2*a); d) X:= (-b -SQR(Delta) ) /2/a;

Câu 5: Cho ch biến có kiểu Char Lệnh : a) ch:="a"

b) ch:=65; c) ch:=chr(65); d) ch:='abcd';

Câu 6:Biến X khai báo kiểu integer Lệnh sai : a) X:= round(275/3);

b) X:= 210 div 4; c) X:= SQRT(49); d) X:= ABS(-453);

Câu 7: Biểu thức sau có giá trị TRUE : a) (100 > 76) and ('B' < 'A');

b) not (49.5 + < 5) or (2 > div 2); c) (49.5 + < 5) and (2 < div 2); d) 2*(3+5) < 18 div 4*4;

Câu 8: Khi chạy chương trình : Var St, St1 : String;

Begin St := '123'; St1 := '456'; Write(St + St1); End;

(63)

a) '123456'; b) 123456; c) 579;

d) Câu a), b), c) sai;

Câu 9: Sau phép gán : Ch := CHR( ORD('a')- 32 ); giá trị Ch : a) 65;

b) A; c) 'A'; d) 'a';

Câu 10: Khi chạy chương trình : Var

a, b, c, N : integer; Begin

N:=546; a:=N div 100;

b:=(N Mod 100) div 10; c:=(N Mod 100) Mod 10; Write(a+b+c);

End

Kết in : a) 546; b) 5; c) 15; d) 6;

7.1 HẰNG, BIẾN BIỂU THỨC 7.1.1 Khái niệm biến :

Trong phần trước ta biết kiểu liệu có tập giá trị tương ứng Các giá trị kiểu nguyên hay kiểu thực số, 40 hay 5.72, gía trị kiểu ký tự ký tự ‘A’ hay ‘a’, cịn kiểu lơgic có hai gía trị True False,

(64)

được thực gián tiếp thông qua tên nhớ chứa giá trị Ví dụ, số 5.72 lưu nhớ có tên x, biểu thức 5.72*2 viết x*2 Việc dùng tên x dễ nhớ tiện nhiều so với việc dùng nhớ số 5.72

Như vậy, ô nhớ đặt tên tên đồng với giá trị Trong chương trình, nhớ có tên giá trị thay đổi khơng Nếu gía trị nhớ thay đổi nhớ biến, tên ô nhớ tên biến, ngược lại, gía trị nhớ khơng thể thay đổi, nhớ hằng, tên ô nhớ tên

Các biến tham gia chương trình phải khai báo Việc khai báo có tác dụng báo trước cho máy dành sẵn nhớ thích hợp nhớ để sẵn sàng chứa liệu

7.1.2 Khai báo biến khai báo :

Biến đại lượng có gía trị thay đổi chương trình Cách khai báo biến sau : Var

Danhsáchtênbiến : TênKiểuDữliệu ;

Tên biến tự đặt, theo quy tắc tên Ví dụ : Var

i, j : Integer; x, y : Real;

Theo khai báo trên, ta có hai biến i j kiểu số nguyên (Integer), hai biến x, y kiểu số thực (Real)

Hằng đại lượng có gía trị khơng đổi chương trình Cách khai báo : Const

Tên_hằng = gíatrị ;

Tên tự đặt, theo quy tắc tên Ví dụ : Const

N = 10;

SoPi = 3.1416; SoE = 2.718;

Turbo Pascal có sẵn số hằ?g chuẩn cho phép sử dụng mà khai báo, : Pi, MaxInt Hằng Pi có gía trị số  , cịn MaxInt = 32767, số Integer lớn Chẳng hạn, dùng lệnh sau:

(65)

7.1.3 Biểu thức :

Biểu thức công thức gồm có hay nhiều thành phần kết nối với phép toán Mỗi thành phầ? (hay tốn hạng) hằng, biến hàm Khi phép toán biểu thức thực ta nhận gía trị gọi kết qủa biểu thức Kiểu liệu kết qủa gọi kiểu liệu của biểu thức Ví dụ:

3* div + mod biểu thức nguyên, có kết qủa 10 + sin(pi/2) biểu thức thực, có kết qủa 3.0

Chr( ord(‘a’) - 32 ) biểu thức ký tự, có kết qủa ‘A’ (4+2=6) and (‘B’<>‘b’) biểu thức lơgic, có kết qủa True ‘AB’+’CD’ biểu thức chuỗi, có kết qủa ‘ABCD’

Các thành phần biểu thức cầ? phải có kiểu liệu phù hợp phép toán thực được, khơng máy báo lỗi Ví dụ, biểu thức sau :

+ ‘A’

là sai ta khơng thể cộng số nguyên với ký tự

Một biểu thức chứa nhiều phép toán Thứ tự thực phép toán cho bảng 7.1

Cấp ưu tiên Phép toán

1 biểu thức ngoặc đơn ( )

2 Các hàm

3 NOT, - (phép lấy dấu âm) * , /, DIV, MOD, AND

5 Shl, Shr

6 +, - (trư?, OR, XOR =, <>, <, <=, >, >=, IN

Bảng 7.1 Việc tính tốn biểu thức dựa theo hai quy tắc :

Quy tắc 1: Phép tốn có cấp ưu tiên nhỏ tính trước, phép tốn có cấp ưu tiên lớn tính sau. Quy tắc 2: Ðối với phép tốn đứng liền có cấp ưu tiên, đứng trước tính trước

(66)

= * div + 0.5 = 18 div + 0.5 = + 0.5

= 2.5

Ví dụ : tính biểu thức lơgic :

( > div 2) or Not ( 49.25 + < 50) = (2 > 2) or Not ( 51.25 < 50) = FALSE or Not FALSE = FALSE or TRUE = TRUE

7.2 CÂU LỆNH VÀ LỜI CHÚ GIẢI 7.2.1 Phân loại câu lệnh :

Câu lệnh dãy ký tự xây dựng theo quy tắc định (gọi cú pháp) nhằm thị cho máy thực công việc xác định Các câu lệnh chia hai loại: câu lệnh đơn giản câu lệnh có cấu trúc

Lệnh gán lời gọi thủ tục xếp vào loại đơn giản Ví dụ: k := 20;

Clrscr ; Writeln(k) ;

Các lệnh rẽ nhánh lệnh lặp xếp vào loại có cấu trúc, chúng xây dựng từ lệnh đơn giản, ví dụ:

If k>=0 then Writeln(k) else

Writeln( -k) ;

Hai hay nhiều lệnh đơn giản gom lại đặt hai từ khóa BEGIN END tạo thành câu lệnh ghép, câu lệnh ghép lệnh có cấu trúc, ví dụ:

Begin

(67)

End;

Từ lệnh đơn giản lệnh có cấu trúc có lại xây dựng lệnh có cấu trúc phức tạp hơn, ví dụ:

If k>= then Writeln(k) else

Begin

Writeln(‘ k âm, xin nhập lại : ‘); Readln(k);

End;

Sau trình bày kỹ lệnh đơn giản vàthông dụng : lệnh gán 7.2.2 Lệnh gán :

Lệnh gán có cú pháp sau : TênBiến := Biểuthức ;

Ý nghĩa : tính tốn biểu thức bên phải, lưu kết qủa tính vào tên biến vế trái Ví dụ, cho khai báo :

Var

A, B : Real; K : Integer; Khi dùng lệnh lệnh: K := 10 ;

B := K* 3+5.5;

biến K có gía trị 10, biến B có gía trị 35.5 Nếu thực tiếp lệnh gán :

B:= 17/2;

gía trị B 8.5

Như biến gán nhiề? lần lấy gía trị lần gán sau cùng, tính đến thời điểm xét

Ðặc biệt, lệnh:

B:=B +1;

(68)

Cách thực lệnh B:=B+1 sau: lấy gía trị thời biến B (là 8.5) cộng thêm (được 9.5), đem kết qủa gán cho biến B

Tương tự, lệnh B:=B-1; có tác dụng giảm B đơn vị

Yêu cầu lệnh gán thực kiểu liệu biểu thức vế phải phải phù hợp với kiểu liệu biến vế trái, không phù hợp dịch (Compile) chương trình, Turbo Pascal thông báo lỗi : "Error 26 : Type mismatch" Ví dụ, lệnh gán sai vế trái kiểu thực vế phải kiểu chuỗi : A:=‘Pascal’;

Chú ý số nguyên gán cho biến thực, (chẳng hạn lệnh A:=10; ), số thực khơng thể gán cho biến ngun Ví dụ lệnh K:=10/4; sai biến K có kiểu ngun, vế phải cho kết qủa số thực (=2.5)

Xét thêm ví dụ kiểu liệu khác : Cho khai báo :

Var

Ch : Char ; St: String[20]; Khi đó:

Lệnh St:=‘A’; Lệnh St:=‘1234’;

Lệnh Ch:=‘ABCD’; sai vế phải chuỗi Lệnh St:= 100; sai vế phải số

Lệnh Ch:=‘1’ ;

Lệnh Ch:=St ; sai vế phải chuỗi 7.2.3 Lời giải :

Lời giải đặt chỗ chương trình viết theo hai cách : { lời giải thích }

(* lời giải thích *)

Lời giải thích chuỗi ký tự giải thích mục đích chương trình hay câu lệnh Nó có tác dụng cho người dùng tham khảo nhằm hiểu nhanh mục đích chương trình hay câu lệnh mà không cần phải đọc hết chương trình hay câu lệnh

(69)

Nhập xuất liệu hai khâu quan trọng qúa trình xử lý thơng tin Hầu chương trình phải giải vấn đề nhập, xuất liệu Có nhập liệu có liệu để tính tốn hay xử lý Có liệu xuất biết kết qủa qúa trình xử lý máy

7.3.1.1 Nhập liệu kiểu số :

Ðể nhập liệu cho biến nguyên hay thực, ta dùng lệnh: Readln(biến1, biến2, , biếnk);

trong biến1, biến2, , biếnk khai báo có kiểu liệu nguyên hay thực

Khi gặp lệnh này, chương trình tạm dừng, chờ ta gõ đủ k số từ bàn phím kết thúc Enter, gán k số cho biến1, biến2, , biếnk

Ví dụ, để nhập liệu cho hai biến thực x, y biến nguyên j, ta dùng lệnh: Readln(x, y, j);

Cách nhập sau:

gõ 10 6.5  (có khoảng trắng hai số ), gõ số Enter :

10 6.5 4

Trong hai trường hợp ta được: x=10, y=6.5, j=4

Ngoài cách dùng lệnh Readln(x, y, j) ; ta nhập riêng cho biến ba lệnh sau : Readln(x);

Readln(y); Readln(j);

7.3.1.2 Nhập liệu kiểu ký tự hay kiểu chuỗi: Ta dùng lệnh :

Readln( biến ); Ví dụ, cho khai báo : Var

(70)

Khoi_thi : Char;

Muốn nhập liệu cho ba biến Ho_ten, Phai, Khoi_thi ta phải dùng ba lệnh : Readln(Ho_ten);

Readln(Phai); Readln(Khoi_thi); Khi nhập, ta gõ:

Tran Van Thanh  nam

A

Kết qủa, ba biến có giá trị là: Ho_ten = ‘Tran Van Thanh’, Phai= ‘nam’ Khoi_thi=‘A’

Khác với liệu số, ta không nên dùng lệnh Readln để nhập liệu cho hai hay nhiều biến kiểu ký tự hay kiểu chuỗi, có nhầm lẫn khơng kiểm sốt Ví dụ, khơng dùng lệnh sau:

Readln( Ho_ten, Phai, Khoi_thi);

mà phải dùng ba lệnh Readln, lệnh nhập cho biến nêu

7.3.1.3 Các ý :

a) Dữ liệu nhập phải phù hợp với kiểu biến Nếu khơng phù hợp chương trình dừng thơng báo lỗi.Ví dụ gặp lệnh Readln(j) ; mà ta gõ 4.5 bị lỗi j biến nguyên, 4.5 số thực

b) Lệnh: Readln ;

là dạng nhập liệu đặc biệt khơng có biến để nhận liệu nhập vào Người ta dùng lệnh muốn tạm dừng chương trình để xem kết qủa hình, xem xong, gõ phím Enter chương trình chạy tiếp

c) Biến kiểu lơgic khơng nhập từ bàn phím

d) Pascal cịn có lệnh nhập liệu Read, có cơng dụng lệnh Readln, dùng Sự khác Read Readln chỗ: sau nhận đủ gía trị cho biến cần nhập, lệnh Readln xóa gía trị nhập thừa, cịn lệnh Read khơng Các gía trị nhập thừa lệnh Read tự động gán cho biến lệnh nhập

(71)

Nếu nhập, ta gõ : 12.5 20.6 10 

thì x=12.5, y=20.6, cịn số 10 thừa bị xóa ln Biến j lệnh Readln(j) không bị ảnh hưởng Muốn nhập số cho j, ta gõ 9

Với đoạn chương trình : Read(x, y);

Readln(j);

Nếu nhập, ta gõ : 12.5 20.6 10 

thì x=12.5, y=20.6, cịn số 10 thừa khơng bị xóa mà tự động gán cho biến j lệnh Readln(j) tiếp theo, kết qủa j=10 cho dù ta chưa muốn nhập cho j

Vậy, lệnh Read làm sai ý đồ nhập lệnh nhập Lời khuyên không nên dùng lệnh Read, dùng Readln

7.3.2 Xuất liệu, thủ tục Write Writeln Các liệu in lên hình nhờ lệnh sau:

Writeln( bt1, bt2 , , btk ); Write( bt1, bt2 , , btk );

ở đây, bt1, bt2, , btk biểu thức cầ? phải in gía trị lên hình Trong trường hợp đơn giản, biểu thức biến, hằng, hay hàm

Việc in thực sau: vị trí thời trỏ hình, in gía trị biểu thức bt1, in tiếp gía trị biểu thức bt2, , in tiếp gía trị biểu thức btk Các gía trị in dòng, dài qúa khổ hình in tiếp dịng

Ví dụ, lệnh Writeln(3*2+9); in lên hình số 15 Nếu i, j biến nguyên thực lệnh sau: i :=10 ;

j:=15*2 ;

Writeln(i, j+1, 678);

trên hình hiện: 1031678

Sự khác lệnh Writeln Write chỗ: sau in xong giá trị biểu thức, lệnh Writeln đưa trỏ xuống đầu dòng dưới, lệnh Write khơng Ðiều ảnh hưởng đến lệnh in mà

(72)

Writeln(‘ngon ngu pascal’); kết qủa hình hai dòng : Thao chuong bang

ngon ngu pascal

Nếu thay lệnh đầu Write đây: Write(‘Thao chuong bang ‘);

Writeln(‘ngon ngu pascal’);

thì kết qủa hình dòng: Thao chuong bang ngon ngu pascal 7.3.2.1 In không định dạng:

Ðối với biểu thức kiểu nguyên, kiểu ký tự, kiểu lơ gíc hay kiểu chuỗi, lệnh : Writeln( biểuthức ) ;

sẽ in nguyên văn gía trị biểu thức Ví dụ :

Lệnh Writen(‘ket qủa x=‘ , 4+15); in ra: ket qua x=19

Lệnh Writeln(‘A’ , ‘=‘ , 2*3<5); in ra: A=FALSE biểu thức 2*3< có kết qủa FALSE Nếu gán: Ho_ten:=‘ Tran Van Thanh’; lệnh

Writeln(‘Ho va ten: ‘, Ho_ten); in lên hình dịng chữ :

Ho va ten: Tran Van Thanh

Cần phân biệt hai đại lượng ‘Ho va ten: ‘ Ho_ten Chúng khác hồn tồn: ‘Ho va ten: ‘ gía trị chuỗi, tức chuỗi nên in ngun văn lên hình, cịn Ho_ten biến kiểu chuỗi nên in gía trị mà biến chứa

Ðối với biểu thức kiểu số thực lệnh: Writeln( biểuthức );

(73)

Ở ta dùng ký hiệu để ký tự trắng, X đại diện ký số Ví dụ, cho x, y hai biến thực gán x:=100/4; y:=-9/300; hai lệnh sau : Writeln(‘ x= ‘, x);

Writeln(‘ y= ‘, y); in lên hình :

x = 2.5000000000E+01 y = -3.0000000000E-02 7.3.2.2 In có định dạng: a) In số thực có định dạng:

In số thực theo cách khó đọc Vì số thực thường in có định dạng, giống cách viết số thông thường, lệnh:

Writeln( biểuthức : n : k );

Ở n k số tự nhiên, ấn định dùng n cột để in gía trị biểu thức, có k cột dành cho phần thập phân Nếu số cần in có n chữ số in dồn bên phải thêm ký tự trắng bên trái cho đủ n cột

Ví dụ, cho x, y biến kiểu thực và: x:=100/4; y:=-123.4824; Hai lệnh sau :

Writeln(‘ x=‘, x:6:2); Writeln(‘ y=‘, y:10:3); in lên hình:

x= 25.00 ( trước số có ký tự trắng) y= -123.482 (trước dấu - có ký tự trắng)

Nếu n nhỏ chiều dài số cần in số in với đầy đủ chữ số phần nguyên Ví dụ, thực lệnh sau :

(74)

Writeln(‘x= ‘, x:0:2); hình :

x=12345.68

Ở máy làm tròn số bỏ số lẻ cuối

b) In kiểu nguyên, ký tự, chuỗi lôgic có định dạng : Dùng lệnh :

Writeln(biểuthức : n);

trong n số nguyên ấn định số cột dùng để in gía trị biểu thức Nếu n lớn độ dài gía trị cần in gía trị in dồn bên phải, thêm khoảng trắng bên trái cho đủ n cột Nếu n nhỏ độ dài gía trị cần in gía trị in nguyên văn Ví dụ:

Lệnh Write(5+40:4); in ra: 45 (có ký tự trắng trước số 45) Lệnh Write(5+40:1); in ra:45 (in nguyên văn gía trị 45)

Lệnh Write(‘Pascal’ :9); in ra: Pascal (có ký tự trắng trước chữ Pascal) Lệnh Write(‘Pascal’ :2); in ra:Pascal (in nguyên văn)

Lệnh Write(‘*’:3); in ra: * (có ký tự trắng trước dấu *) Các ý:

Nhóm ba lệnh: Write(x); Write(y); Write(j); có tác dụng lệnh: Write(x, y, j); Nhóm ba lệnh: Write(x); Write(y); Writeln(j); có tác dụng lệnh: Writeln(x, y, j); Lệnh: Writeln; khơng in cả, đơn giản đưa trỏ xuống dịng

Ví dụ 7.1:

Dưới chương trình cho phép nhập họ tên, mã số sinh viên, in họ tên, mã số sinh viên khung vẽ dấu *, hình chẳng hạn :

********************** * Nguyen Van Tuan *

* Ma so: 1972508 * ********************** Chương trình cụ thể sau:

(75)

Uses CRT; Var

Ten : String[18]; Maso : String[11]; Begin

CLRSCR;

Write(‘ Nhap ho va ten: ‘); Readln(Ten); Write(‘ Nhap ma so sv : ‘); Readln(Maso); Writeln;

Writeln(‘ ********************** ’); { in 22 dấu * } Writeln(‘*’, Ten:19, ‘*’:2); { in dấu *, in Ten chiếm 19 cột, in tiếp dấu * chiếm cột }

Writeln(‘* Ma so:’ , Maso:12, ‘*’:2); { in * Ma so, in Maso chiếm 12 cột, in tiếp dấu * chiếm cột }

Writeln(‘**********************’); { in 22 dấu * } Readln;

End.

Chạy<VD71.EXE>

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

7.4 KIỂU LIỆT KÊ KIỂU ÐOẠN CON 7.4.1 Kiểu liệt kê (enumerated type) :

7.4.1.1 Cách khai báo :

Ngồi kiểu liệu có sẵn kiểu nguyên, thực, ký tư, lôgic kiểu chuỗi, Turbo Pascal cịn cho phép người thảo chương tự xây dựng kiểu liệu

Kiểu liệt kê định nghĩa cách sử dụng từ khóa TYPE liệt kê tất gía trị kiểu, theo mẫu sau:

(76)

Tênkiểu = (tên1, tên2, , tênN) ;

trong tên1, tên2, , tênN tên tự đặt theo quy ước đặt tên Ví dụ : Type

Phai=(nam, nu) ;

Ten_mau = (den, trang, xanh, vang, tim, nau);

Theo khai báo Phai kiểu liệu liệt kê có hai giá trị nam nu, Ten_mau kiểu liệu liệt kê có sáu giá trị : den, trang, xanh, vang, tim, nau

Khi kiểu liệt kê định nghĩa khai báo biến thuộc kiểu liệt kê từ khóa Var Ví dụ :

Var

Ph1, Ph2 : Phai; M1, M2 : Ten_mau ;

Trong chương trình, ta gán : Ph1:=nam;

Ph2:=nu; M1:=den; M2:=trang;

Pascal cho phép khai báo trực tiếp biến kiểu liệt kê không cần qua giai đoạn định nghĩa Type cách liệt kê gía trị mà biến nhận

Ví dụ : biến Ph1, Ph2, M1, M2 nói khai báo trực tiếp sau: Var

Ph1, Ph2 : (nam, nu) ;

M1, M2 : ( den, trang, xanh, vang, tim, nau);

7.4.1.2 Các hàm liên quan đến kiểu liệt kê:

Hàm ORD(tên) : Trả số thứ tự tên kiểu liệt kê Các gía trị liệt kê đánh số thứ tự Ví dụ:

(77)

Thơng qua hàm Ord, gía trị liệt kê so sánh với theo quy tắc: gía trị có số thứ tự nhỏ nhỏ hơn:

den < trang < xanh< vang< tim< nau

Hàm PRED(tên) hàm SUCC(tên) : trả gía trị đứng trước sau tên kiểu liệt kê tương ứng Ví dụ:

Pred(nu)=nam Pred(nau)=tim Succ(den)=trang

Hàm Tênkiểu(k) : trả giá trị liệt kê có số thứ tự k Tênkiểu, ví dụ: Phai(0)=nam

Ten_mau(2)= xanh

Hàm hàm ngược hàm Ord

7.4.1.3 Nhập , xuất kiểu liệt kê:

Các gía trị liệt kê khơng thể nhập, xuất trực tiếp lệnh Readln Write đượ? Ðây hạn chế kiểu liệt kê, khiến không thông dụng

Khi muốn nhập hay xuất kiểu liệt kê, ta dùng biến trung gian St kiểu chuỗi Chẳng hạn, muốn nhập màu xanh cho biến M1, ta dùng hai lệnh:

Readln(St);

If St=‘xanh’ then M1:=xanh;

Tương tự, Muốn in màu xanh lên hình , ta dùng lệnh : If M1=xanh then Writeln(‘xanh’);

7.4.2 Kiểu đoạn (Subrange type):

Kiểu đoạn mô tả cách phạm vi gía trị mà biến thuộc kiểu nhận : TYPE

Tênkiểu = hằng1 hằng2; VAR

(78)

VAR

Tênbiến : hằng1 hằng2;

trong đó, hằng1< hằng2 hai thuộc kiểu liệu Kiểu liệu hằng1 hằng2 kiểu nguyên, ký tự, lôgic, hay liệt kê

Ví dụ: Type

Chu_Hoa =‘A’ ’Z’; Tuoi= 200;

Var

Ch : Chu_hoa; T: Tuoi;

Theo khai báo ch biến kiểu đoạn con, nhận gía trị ký tự từ ‘A’ đến ‘Z’, tương tự, biến T nhận gía trị số nguyên từ đến 200

Cũng khai báo hai biến Ch T trực cách sau: Var

Ch : ‘A’ ’Z’; T : 200;

Trong nhiều trường hợp, việc khai báo đoạn có tác dụng tiết kiệm nhớ Tùy theo phạm vi

hằng1 hằng2mà Turbo Pascal cấp phát cho biến số byte tối thiểu Trong ví dụ trên, biến Ch hay T chứa byte

Kiểu đoạn cho phép kiểm sốt gía trị biến có vượt ngồi phạm vi hay khơng Ví dụ, biến T mà gán: T:=201; máy báo lỗi "const out of range" Ngoài chạy chương trình mode {$R+}, chương trình dừng biến nhận gía trị vượt khỏi phạm vi

Kiểu liệt kê kiểu đoạn thuộc loại đơn giản đếm 7.5 CÂU HỎI TRẮC NGHIỆM Câu 1:Cho x, y, z biến kiểu thực, lệnh sai:

a) x:=y+z;

b) Readln(x, y, z);

c) x+y:=z;

d) Writeln(x+y, z:0:2);

(79)

a) Readln(x,5);

b) Readln(‘x= ‘, x);

c) Readln(x:5:2);

d)Readln(x, y);

Câu 3: Cho x biến kiểu thực, sau thực hai lệnh : x:=10 ;

Writeln(x);

Kết qủa in lên hình : a) 10;

b) 10.00;

c) 1.0000000000E+01; d)+1.0000000000E+01;

Câu 4: Cho biến X kiểu thực gán X:= 12.41 ; Ðể in lên sau:

X= 12.41 chọn lệnh :

a)Writeln(X); b) writeln(X:5);

c) writeln('X= ', X:5:2); d) writeln(' X=, X:5:2 ' );

Câu 5: Kiểu liệu biểu thức div + / + Ord(‘A’) : a) nguyên;

b) lô gic; c) ký tư ; d) thực;

Câu 6: Khai báo kiểu liệt kê sau sai : Type

Mau = (XANH, do, tim, Vang) ; :

(80)

b) Tên XANH viết chữ hoa; c)Tên Vang có chữ V hoa ; d)Tên tim viết chữ thường;

Câu 7: Khai báo : a) Var x, y = Integer; b) Var x, y of Integer; c) Var x, y := Integer ; d)Var x, y : Integer ;

Câu 8: Cho khai báo : Var Ho, ten : String[15]; Lệnh sai :

a) Write(' Ho ten la : ' ; Ho ; Ten); b) Write(' Ho ten la : ' + Ho + Ten); c) Write(' Ho ten la : ', Ho , Ten) ; d) Write(' Ho ten la : ', Ho + Ten) ;

Câu 9: Cho i, j, k ba biến nguyên, để nhập liệu cho lệnh: Readln( i, j, k) ;

cách nhập sai : a) 5?; b) 3,4,5?; c) 3? 4? 5? ;

d)Câu a), b), c) ;

Câu 10: Cho i, j, k ba biến nguyên, để nhập liệu cho lệnh: Readln( i, j, k) ;

cách nhập : a) 5?; b) 3,4,5?; c) 3? 4? 4+1? ; d)3? 4? E? ;

(81)

Câu Cho S biến kiểu Boolean Lệnh sai, lệnh đúng, cho biết gía trị S : a) S:= 3*2; b) S:= 3< 2;

c) S:= 3< and - =1; d) S:= (3< 2) and (6 - =1); Câu Cho biết gía trị biến lô gic A :

A := ( x2 + y2  25 ) and ( x2 + y2  16 );

với {x = 3, y = }, {x = 3, y = }, {x = 3.1 , y = }, Câu Viết chương trình in lên sau :

* * * * * * * * * * * * * * * * * THAO CHUONG BANG * * NGON NGU PASCAL * * * * * * * * * * * * * * * * *

Câu 4* Nhập vào số xe (có bốn chữ số) biển số xe máy bạn Cho biết số xe bạn nút Bạn người may mắn số nút=9 Bạn có may mắn khơng ?

Ví du: số xe 4546, tổng chữ số 4+ + + = 19 19 mod 10 =9 Số nút 9, may mắn

Câu Nhập họ tên (HT), mức lương tháng (ML), tạm ứng (TU) phụ cấp (PC) người, tính phần cịn lãnh (CL) người đó: CL = ML -TU + PC In HT CL lên hình

Câu Nhập họ tên, năm sinh, nơi sinh, phái (nam hay nữ) người In lên hình họ tên, năm sinh, nơi sinh, phái tuổi người

Câu Nhập họ tên (HT), mức lương tháng (ML) phụ cấp (PC) người, tính tổng thu nhập (TTN) người đó:

TTN = ML + PC

Tính qũy bảo hiểm (QBH) : QBH=15%* TTN Tính tiền lãnh (TIEN): TIEN=TTN - QBH

In họ tên, tổng thu nhập , qũy bảo hiểm tiền lãnh lên hình Câu Nhập tên vật tư, số lượng, đơn gía Tính tiền thuế gía trị gia tăng : Tien =số lượng * đơn gía

Thuế = 10% Tiền

(82)

Câu 9* Viết chương trình in lên hình thẻ sinh viên có dạng sau:

(Hd: Cho mã ký tự :?/font> :201; Í :205; ? :187;? :186;?/font> : 200 ; ? :188 Hiện ký tự cách gõ phím Alt với mã ký tự đó, nhớ dùng phím số bên phải bàn phím Nên khai báo a=‘?/font> ‘; b= ‘Í ‘; , sau in a, b, c, để tạo khung)

Câu 10 Nhập tên ba môn học, số tín mơn học Tính số tiền phải nộp cho tài vụ biết đơn gía tín 25000đ, lệ phí đăng ký 2000đ

Chi : Câu có đánh dấu * câu tương đối khó.

8.1 CÂU LỆNH IF 8.1.1 Câu lệnh IF dạng 1:

8.1.1.1 Cú pháp, lưu đồ ý nghĩa: Cú pháp :

IF Ðiềukiện THEN LệnhP ;

(83)

Ý nghĩa: Tùy theo Ðiềukiện hay sai mà định có làm LệnhP hay khơng Nếu Ðiềukiện làm LệnhP chuyển sang lệnh phía Nếu Ðiềukiện sai khơng làm LệnhP mà chuyển sang lệnh Sơ đồ?cú pháp lệnh IF vẽ hình 8.1

8.1.1.2 Các ví dụ :

Ví dụ 8.1: Nhập vào hai số a b, tìm in lên hình số lớn hai số đó.

Ta dùng biến phụ đặt tên Max để chứa gía trị lớn phải tìm Thuật tốn gồm hai bước: Bước 1: Gán số thứ vào Max, tức là:

Max:=a;

Bước 2: Kiểm tra Max nhỏ số thứ hai gán số thứ hai vào Max: If Max < b then Max:=b;

Bước 3: In gía trị Max lên hình.

Giải thích: Sau bước 1, biến Max có gía trị a Sang bước 2, xảy hai tình : * Hoặc Max < b , tức b số lớn nhất, gía trị lớn b gởi vào biến Max * Hoặc Max >= b, tức gía trị Max lớn nên khơng phải làm Chương trình cụ thể sau:

PROGRAM VIDU81; { Tim Max hai so } Var

a, b, max : Real; Begin

(84)

Readln(a,b); Max :=a ;

If Max < b then Max:=b ;

Writeln(‘ So lon nhat la: ‘ , Max:6:2); Readln;

End

Chạy<VD81.EXE>

Chép file nguồn <VD81.PAS>

Nhận xét:

Việc tìm số nhỏ hai số a, b tương tự, ta dùng biến phụ Min chứa gía trị nhỏ nhất, thực lệnh sau:

Min:=a;

If Min > b then Min:=b;

Có thể mở rộng thuật tốn để tìm số lớn ba số nhiều Ðầu tiên ta tìm số lớn hai số a b, ký hiệu Max, sau tìm số lớn hai số Max c, ký hiệu Max Dưới lệnh để tìm số lớn ba số a, b, c :

Max:=a;

If Max < b then Max:=b; { Max số lớn a b } If Max < c then Max:=c; { Max số lớn a, b c }

Ví dụ 8.2: Nhập vào họ tên điểm trung bình (DTB) sinh viên Hãy phân loại sinh viên theo DTB sau:

Loại Kém DTB<5, Tbình  DTB<7, Khá  DTB<9, Giỏi DTB 

In họ tên, điểm trung bình phân loại sinh viên

Trong chương trình, ta dùng biến phụ đặt tên Loai để lưu trữ phân loại sinh viên Vì có năm loại cầ? lưu trữ chuỗi ‘Kem’, ‘Tbinh’, ‘Kha’, ‘Gioi’, nên biến Loai phải có kiểu liệu kiểu chuỗi PROGRAM VIDU82;

(85)

Var

Ho_ten: String[18]; DTB: Real;

Loai: String[6]; Begin

Write(‘ Nhap ho va ten :’); Readln(Ho_ten);

Write(‘ Nhap điem trung binh :’); Readln(DTB);

{ phân loại theo DTB }

If DTB< then Loai:=‘Kem’;

If (DTB>= 5) and (DTB<7) then Loai:=‘Tbinh’; If (DTB >= 7) and (DTB< 9) then Loai:=‘Kha’; If DTB >= then Loai:=‘Gioi’;

Writeln(Ho_ten, #32 , DTB:4:1 , #32 , Loai); { #32 ký tự trắng } Readln;

End

Chạy<VD82.EXE>

Chép file nguồn <VD82.PAS>

Ví dụ 8.3: Nhập vào ba hệ số A, B, C, (A  0) giải biện luận phương trình bậc hai: Ax2 + Bx + C = 0

Việc phải tính Delta : Delta = B2 - 4AC

Sau biện luận theo Delta:

(86)

Nếu Delta > 0: phương trình có hai nghiệm :

Chương trình cụ thể sau: PROGRAM VIDU83; { Giải phương trình bậc } Var

A, B, C, Delta, X1, X2 : Real; Begin

Repeat

Write( ‘ Nhap he so A khac khong :’); Readln(A);

Until A<>0;

Write( ‘ Nhap cac he so B, C: ‘); Readln(B, C);

Delta:=B*B - 4*A* C;

If Delta < then Writeln( ‘ Ptrinh vô nghiệm! ‘); If Delta = then

begin

X1:=-B/(2*A);

Writeln(‘ Có ng kép X1=X2= ‘ , X1:8:2); end;

If Delta > then begin

(87)

Writeln(‘ Có hai nghiệm : ’); Writeln(‘X1= ‘ , X1:8:2); Writeln(‘X2= ‘ , X2:8:2); end;

Readln; End.

Chạy<VD83.EXE>

Chép file nguồn <VD83.PAS>

Trong chương trình có ba lệnh IF xét riêng trường hợp Delta âm, không dương Chú ý Delta=0 phải làm hai lệnh:

X1:=-B/(2*A);

Writeln(‘ Có ng kép X1=X2= ‘ , X1:8:2);

nên hai lệnh phải đặt hai từ khóa begin end để tạo thành câu lệnh ghép

Tương tự, Delta>0 phải làm năm lệnh, năm lệnh phải để khối begin end Chương trình có sử dụng lệnh Repeat Until (sẽ trình bày phần sau) để buộc người dùng phải nhập hệ số A 0, nhập A=0 phải nhập lại A cho làm tiếp lệnh phía

8.1.2 Câu lệnh IF dạng 2: Cú pháp :

IF Ðiềukiện THEN LệnhP ELSE

LệnhQ ; Chú ý :

Trước từ khóa ELSE khơng có dấu chấm phẩy

LệnhP LệnhQ lệnh ghép, tức gồm nhiều lệnh đặt khối begin end. Ý nghĩa lệnh:

Tùy theo Ðiềukiện hay sai mà định làm hai lệnh: LệnhP LệnhQ

(88)

Ngược lại, Ðiềukiện sai không làm LệnhP mà làm LệnhQ chuyển sang lệnh sau LệnhQ

Ví dụ 8.4: Ðể tìm số lớn hai số a b, dùng lệnh: If a<b then Max:=b else Max:=a;

Chương trình nhập vào hai số a b, tìm in số nhỏ số lớn chúng: PROGRAM VIDU84;

{ Tim so lon nhat va so nho nhat hai so } Var

a, b, Max, Min : Real; Begin

Write(‘ Nhap a va b :’); Readln(a,b);

If a < b then begin Max:= b; Min:= a; end

else { trước else khơng có dấu ; } begin

(89)

end;

Writeln(‘ So lon nhat la: ‘ , Max:6:2); Writeln(‘ So nho nhat la: ‘ , Min:6:2); Readln;

End

Chạy<VD84.EXE>

Chép file nguồn <VD83.PAS>

8.1.3 Câu lệnh IF lồng :

Trong câu lệnh IF, LệnhP LệnhQ, hai, lại câu lệnh IF ta có cấu trúc IF lồng Chẳng hạn hai câu lệnh IF ELSE lồng :

IF Ðiềukiện1 THEN

If Ðiềukiện2 then LệnhP else

LệnhQ ELSE LệnhR ;

Ví dụ 8.5: Nhập vào họ tên chủ hộ, số điện kế tháng trước (chiso1) số điện kế tháng (chiso2), tính tiền điện tháng cho hộ, biết :

Mỗi kw 60 kw có đơn gía 5đ, Từ kw thứ 61 đến kw thứ 160 có đơn giá 8đ, Từ kw thứ 161 trở lên có đơn gía 10đ.

Ví dụ, ơng A có số điện tháng trước chiso1=1020 số điện tháng chiso2=1070, lượng điện tiêu thụ tính Ldtt= 1070-1020=50, lượng điện tiêu thụ < 60 nên số tiền là:

Tien = 50*5= 250đ.

Nếu chiso2=1150 Ldtt = 1150-1020=130, lượng điện tiêu thụ vượt qúa 60 kw chưa vượt qúa 160 kw nên tiền điện tính là:

Tien=60*5 + (130-60) *8 = 860 đ.

(90)

Chương trình viết sau: PROGRAM VIDU85;

{ Tính tiền điện } Var

Ho_ten: String[18];

chiso1, chiso2, Ldtt, Tien : Real; Begin

Write(‘ Nhap ho va ten :’); Readln(Ho_ten);

Write(‘ Nhap số tháng trước, số tháng này: ‘); Readln( chiso1, chiso2);

Ldtt:=chiso2- chiso1;

If Ldtt<= 60 then Tien:=Ldtt*5 else

if Ldtt <=160 then Tien:=60*5+(Ldtt - 60)*8 else

Tien:=60*5 + 100*8 + (Ldtt - 160) * 10; Writeln(‘ Họ tên ‘, Ho_ten);

Writeln(‘ Tiền phải trả ‘ , Tien:10:2); Readln;

End

Chạy<VD85.EXE>

Chép file nguồn <VD85.PAS>

Ví dụ 8.6: Nhập số thực x bất kỳ, tính :

Trong Turbo Pascal khơng có hàm tính bậc ba x Ðể tính ta phải dùng hai hàm Exp(x) Ln(x).

(91)

Vậy :

Chương trình sau: PROGRAM VIDU86; { Tinh can bac ba cua x } Var

x, y : Real; Begin

Write(‘ Nhap x :’); Readln(x);

{ tinh y }

If x= then y:=0 else

If x> then y:=Exp( 1/3*ln(x) ) else

y:= - Exp( 1/3*ln(-x) ); Writeln(‘ gia tri y= ‘ , y:8:4); Readln;

End

Chạy<VD86.EXE>

Chép file nguồn <VD86.PAS>

(92)

PROGRAM VIDU87; { Sắp xếp ba tên} Var

T1, T2, T3 : String[8]; Begin

Write( ‘Nhập tên thứ nhất: ‘); Readln(T1);

Write( ‘Nhập tên thứ hai: ‘); Readln(T2);

Write( ‘Nhập tên thứ ba: ‘); Readln(T3);

Writeln(‘ Các tên thứ tự là:’); IF T1<T2 THEN

If T2<T3 then writeln(T1, #32 , T2, #32 , T3) Else { tức T3 <= T2 }

if T1<T3 then writeln(T1, #32 , T3, #32, T2) else { tức T3 <= T1 }

writeln(T3, #32, T1, #32, T2) ELSE { tức T2<= T1}

If T1<T3 then writeln(T2, #32, T1, #32, T3) Else { tức T3<= T1}

if T2<T3 then writeln(T2, #32, T3, #32, T1) else { tức T3<= T2 }

writeln(T3, #32, T2, #32, T1); Readln;

End

(93)

Chép file nguồn <VD87.PAS>

Lệnh IF chương trình lồng nhiều cấp nên phức tạp Khi học cấu trúc mảng ta giải bài toán gọn hơn.

Chú y?/strong>: Trong câu lệnh IF lồng nhau, cách xác định từ khóa ELSE với từ khóa IF nào sau: xét ngược từ lên, ELSE với IF gần phía mà chưa có ELSE để bắt cặp

8.2 CÂU LỆNH CASE 8.2.1 Cú pháp, lưu đồ ý nghĩa :

Trong số trường hợp, phải lựa chọn việc nhiều việc cấu trúc IF lồng tỏ rắc rối, khó viết, khó kiểm tra tính đắn Việc dùng cấu trúc CASE khắc phục nhược điểm

Lệnh CASE có hai dạng, chúng khác điểm dạng có ELSE LệnhQ, cịn dạng khơng ( hình 8.3)

CASE biểuthức OF hằng1 : LệnhP1; hằng2 : LệnhP2;

hằngk : LệnhPk; END;

Dạng 1

CASE biểuthức OF hằng1 : LệnhP1; hằng2 : LệnhP2;

hằngk : LệnhPk; ELSE LệnhQ; END;

Dạng 2 Hình 8.3 : Cú pháp lệnh Case

Chú ý lệnh CASE phải kết thúc END; Các yêu cầu:

Kiểu liệu biểuthức nguyên, ký tự, Lôgic, kiểu liệt kê hay kiểu đoạn Xin nhấn mạnh rằng: biểuthức không kiểu thực hay kiểu chuỗi, hạn chế lệnh CASE so với lệnh IF

Các hằng1, hằng2, , hằngk phải có kiểu liệu phù hợp với kiểu liệu biểuthức

Ý nghĩa: Tùy theo gía trị biểuthức hằng1, hằng2, , hằngk mà định thực lệnh lệnhP1, lệnhP2, , LệnhPk

(94)

Bước 1: Tính tốn gía trị biểuthức Bước 2: So sánh lựa chọn:

Nếu gía trị biểuthức = hằng1 thực LệnhP1, chuyển sang lệnh sau End, ngược lại: Nếu gía trị biểuthức = hằng2 thực LệnhP2, chuyển sang lệnh sau End, ngược lại: v.v

Nếu gía trị biểuthức = hằngk thực LệnhPk, chuyển sang lệnh sau End, ngược lại : a) chuyển sang lệnh sau End ( dạng 1)

b) thực LệnhQ, chuyển sang lệnh sau End (nếu dạng 2) Hình 8.4 hình 8.5 sơ đồ lệnh CASE vẽ cho trường hợp k=3 Trong hình vẽ , ta ký hiệu:

G gía trị biểuthức

H1, H2, H3 hằng1, hằng2, hằng3

P1, P2, P3, Q LệnhP1, LệnhP2 , LệnhP3 va?LệnhQ.

(95)

8.2.2 Các ví dụ :

Ví dụ 8.8: Nhập vào họ tên năm sinh người, cho biết người thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, niên, trung niên hay người lớn tuổi, biết rằng:

Sơ sinh có tuổi từ đến Nhi đồng : có tuổi từ đến Thiếu niên có tuổi từ 10 đến 15 Thanh niên có tuổi từ 16 đến 32 Trung niên có tuổi từ 33 đến 50 Người lớn tuổi có tuổi 50 Chương trình viết sau: PROGRAM VIDU88;

Var

Ho_ten: String[20];

Namsinh, Namnay, Tuoi : Integer ; Phanloai : String[14];

Begin

Write(‘ Nhập họ tên: ‘); Readln(Ho_ten);

(96)

Tuoi:=Namnay - Namsinh;

If Tuoi< then writeln( ‘Nhập sai ‘) else

begin

Case Tuoi OF

,1 : Phanloai:= ‘sơ sinh’; : Phanloai:= ‘nhi đong’; 10 15 : Phanloai:= ‘thieu niên’; 16 32 : Phanloai:= ‘thanh nien’; 33 50 : Phanloai:= ‘trung nien’; else Phanloai:= ‘nguoi lon tuoi’; End; { hết Case }

Writeln(Ho_ten, #32 , Tuoi, #32 , Phanloai); end;

Readln; End.

Chạy<VD88.EXE>

Chép file nguồn <VD88.PAS>

Trong ví dụ này, lệnh CASE dựa vào Tuổi để xác định lứa tuổi, kết qủa lưu vào biến Phanloai Ðóng vai trị hằng1 hai số viết cách dấu phẩy, dòng :

0,1: Phanloai:=‘So sinh’ ;

có nghĩa Tuổi thực lệnh gán: Phanloai:=‘So sinh’ ;

Ðóng vai trị hằng2 tất số nguyên phạm vi từ đến 9, dòng : : Phanloai:= ‘nhi đong’;

(97)

Xây dựng thực đơn cho phép lựa chọn bốn việc : tính tổng , tính hiệu, tính tích tính thương hai số x, y nhập từ bàn phím

Màn hình cần bốn mục sau cho người lựa chọn : A TÍNH TỔNG HAI SỐ

B TÍNH HIỆU HAI SỐ C TÍNH TÍCH HAI SỐ D TÍNH THƯƠNG HAI SỐ

Muốn chọn mục ta gõ chữ đầu mục Ví dụ gõ A hình kết qủa x+y, gõ B kết qủa x-y, Ðối với mục D, y khác khơng in kết qủa x/y, cịn y=0 in câu " Khơng xác định"

Nếu người dùng nhập ký tự khác A, B, C, D, a, b, c, d máy lời nhắc : " Khơng có mục " Biến Ch kiểu ký tự dùng để lưu chữ (mục) mà người dùng chọn Tùy theo giá trị Ch mà lệnh CASE định phải làm

Chương trình viết sau : PROGRAM VIDU89;

{ Thực đơn } Uses Crt; Var

x, y : Real; Ch : Char; Begin

Clrscr;

Write('Nhap x va y:'); Readln(x, y);

(98)

Readln(Ch); CASE Ch of

'A', 'a': Writeln('Tong =', x+y :6:2); 'B', 'b': Writeln(' Hieu =', x-y :6:2); 'C', 'c': Writeln(' Tich =', x*y :6:2);

'D', 'd': If y<>0 then Writeln(' Thuong =', x/y:6:2 ) else Writeln(' Khong xac dinh !');

ELSE

Writeln(' Khong co muc ', Ch); END;

Readln; End.

Chạy<VD89.EXE>

Chép file nguồn <VD89.PAS>

Trong chương trình có sử dụng thủ tục : GOTOXY ( m, n) thuộc thư viện CRT, có chức đặt trỏ hình vào tọa độ cột thứ m, dịng thứ n hình Ví dụ lệnh Gotoxy (10, 3); đặt trỏ hình vào tọa độ cột 10, dịng

Ví dụ 8.10:

Nhập vào tháng năm, cho biết tháng năm có ngày Theo dương lịch :

Các tháng 4, 6, 9, 11: có 30 ngày,

Các tháng 1, 3, 5, 7, 8, 10 12: có 31 ngày,

Riêng tháng bình thường có 28 ngày, năm nhuận có 29 ngày Cách xác định năm nhuận sau:

* năm chia hết cho 400 (ví dụ năm 1600, năm 2000)

* năm không chia hết cho 100 chia hết cho ( ví dụ năm 1988, 1992, 1996 năm nhuận)

(99)

{ Xác định số ngày tháng } Var

Thang, Nam, Songay : Integer ; Nhuan : Boolean;

Begin

Write(‘Nhập Thang, Nam : ‘); Readln(Thang, Nam);

If (Thang<1) or ( Thang>12) then writeln(‘ Nhập sai ’) else

begin

Case Thang OF

4, 6, 9, 11 : Songay:=30;

1, 3, 5, 7, 8, 10, 12 : Songay:=31; : begin

Nhuan:= (Nam mod 400=0) or

( (Nam mod 100<>0) and (Nam mod 4=0) ); If Nhuan= TRUE then Songay:=29 else Songay:=28; end;

End; { Hết Case }

Writeln(‘ Số ngày : ‘ , Songay); end;

Readln; End.

Chạy<VD810.EXE>

Chép file nguồn <VD810.PAS>

Trong ví dụ này, Tháng=2 phải làm hai lệnh đặt khối begin end, lệnh ghép:

(100)

Nhuan:= (Nam mod 400=0) or ( (Nam mod 100<>0) and (Nam mod 4=0) ); If Nhuan= TRUE then Songay:=29 else Songay:=28;

end;

8.2.3 Câu lệnh CASE lồng :

Trong cấu trúc CASE, LệnhP1, LệnhP2, , LệnhPk hay LệnhQ lại lệnh CASE ta có cấu trúc CASE lồng

Ví dụ 8.11: Một xí nghiệp tính tiền thưởng hàng tháng cho công nhân theo công thức : Tiền thưởng= Hệ số * 200

Trong Hệ số tính dựa vào kết qủa bình chọn phân loại lao động (loại A, B hay C) nơi làm việc (cơ sở hay sở 2) người tháng, cụ thể sau :

Loại Cơ sở Cơ sở

A 2.0 2.5

B 1.5 1.8

C 1.0 1.0

Ví dụ ơng X xếp loại A làm việc sở có hệ số thưởng 2.0, nên tiền thưởng =2.0*200=400

Viết chương trình nhập họ tên, phân loại lao động nơi làm việc cơng nhân, tính tiền thưởng cho người

PROGRAM VIDU811;

{ Tính tiền thưởng cho cơng nhân } Var

Ho_ten: String[20]; Loai : Char;

Coso : Byte;

Heso, Thuong : Real; Begin

Write(‘ Nhập họ tên: ‘); Readln(Ho_ten);

(101)

Readln(Coso);

Write(‘ Nhập phân loại lao động (A,B,C) : ‘); Readln(Loai);

CASE Loai OF ‘A’, ‘a’: Case Coso of 1: Heso:=2.0; 2: Heso:=2.5; end;

‘B’, ‘b’: Case Coso of 1: Heso:=1.5; 2: Heso:=1.8; end;

‘C’, ‘c’: Heso:=1.0; END; { Hết CASE } Thuong:=Heso*200;

Writeln(‘Họ tên Tiền thưởng ‘); Writeln(Ho_ten , Thuong:8:2 ); Readln;

End.

Chạy<VD811.EXE>

Chép file nguồn <VD811.PAS>

8.2.4 So sánh lệnh Case với lệnh If :

Lệnh If lệnh Case câu lệnh rẽ nhánh, cho phép lựa chọn công việc nhiều công việc lựa chọn Nhưng cấu trúc If tổng quát mạnh cấu trúc Case lệnh If khơng hạn chế cả, cịn lệnh Case u cầu biểu thức phải thuộc kiểu liệu đếm được: nguyên, ký tự, lô gic, liệt kê hay đoạn con, không kiểu thực hay chuỗi

Lệnh Case thay tương đương lệnh IF Ví dụ lệnh Case chương trình nói ( Ví dụ 8.11 ) thay ba lệnh If sau:

(102)

if Coso=1 then Heso:=2.0 else Heso:=2.5; If (Loai=‘B’) or (Loai=‘b’) then

if Coso=1 then Heso:=1.5 else Heso:=1.8; If (Loai=‘C’) or (Loai=‘c’) then Heso:=1.0;

Tuy nhiên lệnh If thay lệnh Case

Việc sử dụng lệnh Case nhiều trường hợp có tác dụng làm rõ ràng bật bố cục đoạn chương trình, từ dễ đọc, dễ hiểu

Thông thường, người ta dùng lệnh Case để thay cấu trúc If lồng có nhiều ( ba, bốn, ) tình rẽ nhánh điều kiện cho phép

Các bạn viết lại chương trình ví dụ 8.8, 8.9, 8.10, 8.11 thay lệnh Case lệnh IF

8.3 CÂU HỎI TRẮC NGHIỆM Câu 1: Lệnh sau in hình số lớn A B :

a) If A > B then write(B) else write(A); b) If A > B then write(A) else write(B); c) If A > B then Readln(A) else Readln(B); d) If A < B then writeln(A) else writeln(B); Câu 2: Cho N biến kiểu nguyên, chọn câu cú pháp :

a) If N < 10 then write (' Nho hon 10 ') ; else write (' Lon hon 10 '); b) If N < 10 Write (' Nho hon 10 ') else then write (' Lon hon 10 '); c) If N < 10 then write (' Nho hon 10 ') else write (' Lon hon 10 '); d) If N < 10 then N := 10 else N > 20 then write (' N > 20 ');

Câu 3: Kiểm tra ba số a, b, c lớn in số 1, chọn lệnh : a) if (a > 1) and ( b > 1) and ( c > 1) then write(1);

(103)

d) if a, b , c > then write(1);

Câu 4: Cho i biến nguyên Sau thực lệnh : i:=2;

Case i of 1: i:=i+1; 2: i:=i+2; 3: i:=i+3; end;

Gía trị sau i : a)

b) c) d)

Câu 5: Cho N biến nguyên, sau thực lệnh: N:= 9;

If N< then writeln(‘ So am‘) else

Case N mod of 0: Writeln(‘ Chan’); 1: Writeln(‘ Le ‘); end;

Kết qủa in lên hình là: a) Chan

(104)

d) khơng in Câu 6: Cho hàm số:

2x-1 , x<= -1 y = sinx , -1<x<= x , x>0 Nhóm lệnh tính y :

a) if x > then y:=x ; if x > -1 then y:=Sin(x) else

y:= 2*x+1;

b) if x <= -1 then y:=2*x +1 else

if x <=0 then y:=Sin(x) else y:=x;

Câu 7: Giả sử i biến nguyên, sau thực lệnh : i:=5;

Case i of 1: i:=i+1; 2: i:=i+2; 3: i:=i+3; else i:=2*i; End;

thì gía trị sau i : a) 10

b) c) d)

Câu 8: Cho ch biến ký tự, i biến nguyên, sau thực lệnh: i:= -15;

(105)

Case i of

14 : ch:='D'; 15 20: ch:='C'; 21 24: ch:='B'; else ch:='A'; End;

thì gía trị sau ch : a) 'A'

b) 'B' c) 'C' d) 'E'

Câu 9: Cho ch biến ký tự, i biến nguyên Ðể gán trị cho biến ch, lệnh : Case i of

0,1,2 : ch:='A'; : ch:='B'; else ch:='C'; end;

tương đương với nhóm lệnh : a) If i<0 then ch:=’C’ else

if i<=2 then ch:=’A’ else

if i<=8 then ch:=’B’ else ch:=’C’ ;

b) if (i >= 0) and (i<= 2) then ch:='A';

if (i>=3) and (i<=8) then ch:='B' else

ch:='C';

(106)

Begin

i := 3; S:= 4;

if ( i > ) then S:= /2 + ( - i ) * else

if ( i > ) then S:= * i else S:= 0;

End

Giá trị sau S : a)

b) c) 20 d) 40

8.4 BÀI TẬP

Câu 1) Nhập bốn số x1, x2, x3, x4 , tìm số lớn số nhỏ bốn số

Câu 2) Nhập chữ cái, chữ thường đổi thành chữ hoa, ngược lại, chữ hoa đổi thành chữ thường Ví dụ : nhập A in a, nhập b in B

Câu 3) Nhập hệ số, giải biện luận hệ phương trình sau theo quy tắc Cramer :

Câu 4) Nhập số thực x tính :

(Hd: dùng hàm ex Lnx, xét ba trường hợp x=0, x>0, x<0). Câu 5) Nhập số thực x tính:

y =

(107)

Câu 7) Nhập họ tên chủ hộ, định mức điện hàng tháng hộ, số điện kế tháng trước tháng Hãy tính tiền điện cho hộ, biết rằng:

Mỗi kw định mức có đơn gía 5đ, 100 kw định mức có đơn giá 8đ,

Từ kw thứ 101 định mức trở lên có đơn gía 10đ

Câu 8) Nhập Họ tên, Chức vụ (giám đốc, trưởng phịng, phó phịng hay nhân viên - nhập gõ tắt là: GD, TP, PP, NV ) Mức lương tháng người.Tính:

Phụ cấp lương cho ngưới sau : PC = 50% Mức lương tháng GD = 40% " " " TP

= 30% " " " PP = 20% " " " NV

Tính Tổng thu nhập tháng theo công thức : TONGTN = Mức lương + PC

In Họ tên,Chức vụ, Mức lương , Phụ cấp Tổng thu nhập lên hình Câu 9) Tính tiền thuê máy cho lớp học sau :

Nhập GBD ( bắt đầu làm) :  GBD  20 GKT ( kết thúc làm) : GBD < GKT  21 SLM ( số lượng máy )

Cho biết đơn gía :

2.5 ngàn đồng/ giờ/ máy, áp dụng trước 16 ngàn đồng/ giờ/ máy, áp dụng sau 16 Giải toán hai trường hợp : a) GBD, GKT nguyên ?

b) GBD, GKT không nguyên ?

Câu 10) Nhập Họ tên, điểm Tốn, Lý, Hóa ( kiểu ngun ) cho người Tính Tổng điểm ba mơn : TONG = TOAN + LY + HOA phân loại sau :

(108)

Trung bình : TONG= 15, 16, , 20 Khá : TONG= 21, 22, , 26

Giỏi : TONG  27

In lên hình Họ tên, điểm TOAN, LY, HOA, TONG Phân loại Câu *11) Cũng hỏi 10 phân loại sau :

TONG <15 :-Loại Kém

15 TONG<21 :-Nếu có mơn bị điểm < : loại Kém, khơng có mơn bị điểm<5 : loại Trung bình 21 TONG<27 :-Nếu có mơn bị điểm < : loại Trung bình, khơng có mơn bị điểm < : loại Khá

TONG  27 :-Nếu có mơn bị điểm < : loại Khá, khơng có mơn bị điểm < : loại Giỏi

Câu 12) Nhập tháng, cho biết tháng thuộc mùa (Xuân, Hạ, Thu, Ðông), biết tháng 2, 3, 4 mùa Xuân, tháng 5, 6, 7: mùa Hè, tháng 8, 9, 10: mùa Thu, tháng 11, 12, 1: mùa Ðông

Câu 13) Nhập ký tự bất kỳ, cho biết ký tự thuộc loại nào: chữ hoa, chữ thường, chữ số hay ký tự khác

Câu 14) Nhập ba số bất kỳ, in chúng theo thứ tự tăng dần

Câu *15) Năm âm lịch tính theo Can Chi Có 10 Can là: Giáp, Ất, Bính, Ðinh, Mậu, Kỷ, Canh, Tân, Nhâm, Qúy, có 12 Chi là: Tý, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ, Mùi, Thân, Dậu, Tuất , Hợi Hãy nhập vào năm dương lịch cho biết năm âm lịch tương ứng, biết năm 1999 năm Kỷ Mão

Câu *16) Nhập độ dài ba cạnh a, b, c Cho biết a, b, c có phải ba cạnh tam giác không ; ba cạnh tam gíac cho biết làm tam giác gì: đều, cân, vng cân, vng hay tam giác thường ?

9.1 CÂU LỆNH LẶP FOR 9.1.1 Câu lệnh FOR dạng 1:

9.1.1.1 Cú pháp , lưu đồ, cách thức hoạt động : Cú pháp:

FOR biến := m1 TO m2 DO LệnhP; Yêu cầu:

biến phải thuộc kiểu liệu đơn giản đếm được, thường kiểu nguyên, ký tự hay lô gic, kiểu thực hay chuỗi

(109)

LệnhP lệnh đơn giản, lệnh có cấu trúc, lệnh ghép gồm nhiều lệnh đặt khối begin end

Hình 9.1 sơ đồ khối lệnh For với b viết tắt biến Cách thức hoạt động FOR:

Bước 1: Gán giá trị biến := m1;

Bước 2: Nếu biến  m2 làm LệnhP, sang bước 3;

Nếu biến >m2 khơng làm LệnhP mà chuyển sang lệnh phía Bước : Tăng gía trị biến : biến:=Succ(biến);

Quay lại bước

Tóm lại, LệnhP làm làm lại, bắt đầu biến=m1, kết thúc biến =m2+1, thảy m2-m1+1 lần Vì thế, người ta gọi FOR vịng lặp có số lần lặp biết trước

9.1.1.2 Các ví dụ : Ví dụ 9.1: Bài tốn tính tổng : Hãy tính tổng : S= 12 + 22+ 32+ + 102 Thuật toán:

Bước 0: gán S:=0; { gán gía trị ban đầ? cho S} Bước 1: gán S:=S+1*1; { S=12 }

(110)

.v.v

Bước 10: gán S:=S+10*10; { S=12+22+32+ +102}

Qúa trình từ bước đến bước 10 gọi phép cộng dồn vào biến S Tại bước thứ i, lấy gía trị biến S cộng với i2, kết qủa lại gán cho biến S, gía trị biến S tăng thêm lượng bằ?g i2 Khi i thay đổi từ đến 10 số 12, 22, 32, , 102 cộng vào S, kết qủa sau bước thứ 10 gía trị S tổng 12 + 22 + 32 + + 102.

Tóm lại, lệnh: S:=S + i*i; làm thảy 10 lầ?, ứng với i=1, 2, , 10 Qúa trình diễn đạt bằ?g lệ?h FOR, sau:

For i:=1 To 10 DO S:=S+ i*i ;

Một cách tổng quát, để tính tổng :S= 12 + 22+ 32+ + N2 , N số nguyên dương bất kỳ, ta dùng hai lệnh:

S:=0;

For i:=1 To N DO S:=S+ i*i ; Dưới chương trình cụ thể : PROGRAM VIDU91;

{ Tính tổng bình phương số tự nhiên <=N} Var

N, i : Integer; S : LongInt; Begin

Write(‘ Nhập N :’); Readln(N); S:=0;

For i:=1 to N S:=S+i*i ; Writeln(‘S= ‘, S);

Readln; End.

Chạy<VD91.EXE>

Chép file nguồn <VD91.PAS>

(111)

Ta viết:

S = 12 + (- 22 ) + 32 + (- 42 ) + +(-1)N-1 N2

Nhận thấy, số hạng thứ i vế phải có gía trị tuyệt đối i2 , mang dấu cộng i lẻ, mang dấu trừ i chẵn Nói cách khác, ta cộng dồn i2 vào S i lẻ, cộng dồn (- i2 ) vào S i chẵn Việc xác định i lẻ hay chẵn dựa vào hàm Odd(i) hay kết qủa phép toán i Mod Vậy, lệnh dùng :

S:=0;

For i:=1 To N DO

if i mod <> then S:=S+ i*i else S:= S- i*i ;

Các bạn viết chương trình để tính tổng đan dấu Ví dụ 9.2: Bài tốn tính tích:

Tính S= 10!

Ta viết S=1*2*3* *10 Thuật toán:

Bước 0: gán S:=1; { gán gía trị ban đầ? cho S} Bước 1: gán S:=S*1; { S=1 }

Bước 2: gán S:=S*2; { S=1*2} Bước 3: gán S:=S*3; { S=1*2*3} v.v

Bước 10: gán S:=S*10; { S=1*2*3* *10 =10!}

Nếu ví dụ 1, ta phải cộng dồn vào biến S ví dụ ta phải nhân dồn vào biến S Tại bước thứ i, lấy gía trị biến S nhân với i, lại gán kết qủa cho biến S Khi i thay đổi từ đến 10 S tích lũy đủ thừa số 1, 2, 3, ,10, gía trị S sau bước thứ 10 1*2*3* *10 =10!

Qúa trình thực từ bước đến bước thứ 10 mô tả câu lệnh For : For i:=1 to 10 DO S:=S * i ;

Một cách tổng quát, để tính tích: S= 1*2* *N , N số nguyên dương bất kỳ, ta dùng hai lệnh:

S:=1;

(112)

{ Tính S=N! } Var

N, i : Integer; S : LongInt; Begin

Write(‘Nhập số dương N : ‘); Readln(N); S:=1;

For i:=1 to N S:=S * i ; Writeln(‘Giai thua = ‘, S); Readln;

End.

Chạy<VD92.EXE>

Chép file nguồn <VD92.PAS>

Ví dụ 9.3: Bài tốn tính lũy thừa:

Nhập số tự nhiên N số thực x bất kỳ, tính S= xN

Tương tự tính N!: ta gán S:=1, sau bước lặp, ta nhân dồn x vào S lệnh S:=S*x Sau N bước vậy, S nhân với x N lần Vậy hai lệnh cần dùng là:

S:=1;

For i:=1 TO N DO S:=S*x; Dưới chương trình cụ thể : PROGRAM VIDU93;

{ Tính S=lũy thừa N x } Var

(113)

Write(‘Nhập hai số x N : ‘); Readln( x, N);

S:=1;

For i:= to N S := S * x ; Writeln(‘Luy thua= ‘, S : 6:2); Readln;

End.

Chạy <VD93.EXE>

Chép file nguồn <VD93.PAS>

Ví dụ 9.4: In bảng chữ từ A đến Z thành bốn cột sau: KÝ TỰ MÃ KÝ TỰ MÃ

A 65 a 97 B 66 b 98

Yêu cầu in thành trang hình, trang 15 dịng

Trong chương trình ta dùng biến Dem để đếm số dòng in, in xong dịng biến Dem cộng thêm Khi Dem = 15, 30, 45, (tức Dem mod 15=0) phải làm lệnh Readln; lệnh dừng hình ta gõ Enter in tiếp

PROGRAM VIDU94; { In bảng chữ cái} Uses Crt;

Var

ch, ch1 : Char; Dem: Integer; Begin

CLRSCR;

Writeln(‘ KY TU MA KY TU MA’); Dem:=0;

(114)

begin

ch1:=Upcase(ch);

Writeln( ch1 :3 , Ord(ch1) :6 , ch :6 , Ord(ch) :6 ); Inc(Dem);

If Dem mod 15 = then begin

Write(‘ Enter để xem tiếp ‘); Readln;

end; end;

Writeln(‘ HET ‘); Readln;

End.

Chạy<VD94.EXE>

Chép file nguồn <VD94.PAS>

Chương trình ví dụ cách dùng biến chạy kiểu ký tự (ch) lệnh FOR, ngồi ra, đóng vai trò LệnhP lệnh ghép, gồm nhiều lệnh đặt khối begin end

9.1.2 Câu lệnh FOR dạng 2: Cú pháp:

FOR biến := m2 DOWNTO m1 DO LệnhP; Cách thức hoạt động FOR dạng 2: Bước 1: gán gía trị biến := m2;

Bước 2: Nếu biến  m1 làm LệnhP, sang bước 3.

Nếu biến<m1 khơng làm LệnhP mà chuyển sang lệnh phía Bước : Giảm gía trị biến : biến:=Pred(biến);

(115)

Tóm lại, LệnhP làm làm lại, bắt đầu biến=m2, kết thúc biến = m1-1, thảy m2-m1+1 lần

Ví dụ 9.5: Ðể tính S= N!, ta viết : S=N*(N-1)*(N-2)* *2*1

Cách viết cho thấy cách tính: gán S:=1, sau thực việc nhân dồn S:=S* i với i= N, N-1, , 2, Tức là:

S:=1;

For i:=N downto S:=S* i;

Tương tự , để tính S=xN , ta dùng FOR dạng : S:=1;

For i:=N downto S:=S* x;

Như vậy, lệnh FOR dạng chất cách viết khác dạng Thông thường người ta hay dùng lệnh FOR dạng 1, nhiên có nhiều tình mà việc dùng lệnh FOR dạng tỏ hiệu qủa, ví dụ sau đây:

Ví dụ 9.6 : In chữ theo thứ tự ngược từ Z đến A thành hai dòng : Z, Y, X, , C, B, A

z, y, x, , c, b, a

Chương trình viết sau: PROGRAM VIDU96;

(116)

Var

Ch: Char; Begin

For ch:=‘Z’ downto ‘A’ write(ch:3 ); Writeln;

For ch:=‘z’ downto ‘a’ write(ch :3 ); Writeln;

Readln; End.

Chạy<VD96.EXE>

Chép file nguồn <VD96.PAS>

9.1.3 Câu lệnh FOR lồng :

Trong cấu trúc FOR, LệnhP lệnh FOR ta có cấu trúc FOR lồng nhau: FOR biến1:= m1 TO m2 DO {1}

FOR biến2:=n1 TO n2 DO LệnhP; {2} Cách thức hoạt động lệnh sau:

Ðầu tiên cho biến1:=m1 làm lệnh dòng {2} Vì dịng {2} lệnh FOR nên với gía trị biến2=n1, , n2, phải làm LệnhP, kết qủa LệnhP làm n2-n1+1 lần

Bây tăng: biến1:=Succ(biến1), lại làm lệnh FOR dòng {2}, kết qủa lệnhP làm thêm n2-n1+1 lần

.v.v

Qúa trình tiếp tục biến1=m2+1 dừng

Lệnh FOR {1} làm m2-m1+1 lần lệnh FOR {2}, cịn lệnh FOR {2} lại làm n2-n1+1 lần LệnhP Vì lệnhP làm thảy (m2-m1+1)*(n2-n1+1) lần

(117)

Ta thấy dòng gồm m chữ A, tức chữ A in liên tiếp thảy m lần, việc làm lệnh :

For j:=1 to m write(‘A’);

Lệnh Write in m chữ A dòng In xong, trỏ nằm cuối dịng đó, trước in dòng tiếp theo, cần phải đưa trỏ xuống dòng lệnh:

Writeln;

Tóm lại, muốn in dịng thứ i, cần phải làm hai lệnh: For j:=1 to m write(‘A’);

Writeln;

Cả thảy ta phải in n dòng thế, tức là: For i:=1 to n In dòng i ;

Thay In dịng i hai lệnh nói (đặt khối begin end) , ta có thuật tốn để in hình chữ nhật đặc là:

For i:=1 to n do begin

for j:=1 to m write(‘A’); Writeln;

end;

Các bạn viết chương trình cụ thể cho ví dụ này, m n hai số nguyên dương nhập từ bàn phím

9.1.4 Các ứng dụng khác lệnh FOR :

Lệnh For thông dụng, dễ dùng giải nhiều toán khoa học kỹ thuật thực tiễn Dưới xin nêu hai ứng dụng

Ví dụ 9.8: Tìm số Fibonaci

(118)

U0=1, U1=1 , Uk=Uk-1 + Uk-2 với k= 2, 3, 4,

Gọi U số hạng thứ k, Uo U1 hai số hạng đứng trước U Ðầu tiên ta gán: Uo:=1;

U1:=1;

Bước 1: tính U:=Uo+U1 in U Lúc U=2 U2

Ðể chuẩn bị tính U3, ta cho Uo đóng vai trị U1 U1 đóng vai trị U, tức gán: Uo:=U1;

U1:=U;

Kết qủa Uo=1 U1=2

Bước 2: tính U:=Uo+U1 in U Lúc U=3 U3

Ðể chuẩn bị tính U4, ta lại cho Uo đóng vai trị U1 U1 đóng vai trị U, tức gán: Uo:=U1;

U1:=U;

Kết qủa Uo=2 U1=3 v.v

Tóm lại lệnh phải lặp lặp lại là: U:=Uo+U1;

Uo:=U1; U1:=U;

Vì sang bước sau gía trị U bị thay đổi nên bước ta phải in U chương trình viết sau:

PROGRAM VIDU98;

{ In N+1 số Fibonaci } Var

N, i, U, Uo, U1 : Integer; Begin

(119)

Uo:=1; U1:=1;

Writeln( N+1 , ‘ số Fibonaci :’ ); Write(Uo:3 , U1:3);

For i :=2 to N do begin

U:=Uo+U1; Write(U:3); Uo:=U1; U1:=U; end; Readln; End.

Chạy<VD98.EXE>

Chép file nguồn <VD98.PAS>

Ví dụ 9.9: Bài tốn tính tiền lãi gửi ngân hàng:

Nhập tiền vốn ban đầu, số tháng gửi N lãi suất hàng tháng Tính số tiền nhận sau tháng gửi biết tiền lãi hàng tháng gộp vào tiền vốn

Ví dụ, tiền vốn là100, lãi suất tháng 2% Sau tháng gửi có số tiền là: Số tiền=100 + 100*0.02 = 102

Sau tháng gửi có số tiền là: Số tiền=102 + 102*0.02 = 104.04

Cơng thức tính tiền thu sau tháng gửi là: Số tiền := Tiền vốn + Tiền vốn * Lãi suất

Số tiền lại trở thành tiền vốn tháng sau, tức là: Tiền vốn := Số tiền;

(120)

PROGRAM VIDU99;

{ Tính tiền gửi ngân hàng sau N tháng} Var

Tienvon, Laisuat, Sotien : Real; N, i : Byte;

Begin

Write(‘ Nhập tiền vốn, lãi suất số tháng gửi : ‘); Readln(Tienvon, Laisuat, N);

For i:=1 to N do begin

Sotien:= Tienvon + Tienvon*Laisuat;

Writeln(‘Số tiền sau ‘, i , ‘ tháng =‘ , Sotien:8:2); Tienvon:=Sotien;

end; Readln; End.

Chạy<VD99.EXE>

Chép file nguồn <VD99.PAS>

9.2 CÂU LỆNH WHILE 9.2.1 Cú pháp, lưu đồ, cách thức hoạt động :

Cú pháp:

WHILE Ðiềukiện DO LệnhP ;

Ý nghĩa : Chừng Ðiềukiện cịn làm LệnhP , Ðiềukiện sai khơng làm LệnhP mà chuyển sang lệnh phía

Cách thức hoạt động WHILE:

(121)

Lệnh P gọi thân vòng lặp WHILE

Nếu Ðiềukiện khơng sai LệnhP phải làm hồi, lúc ta có vịng lặp vơ hạn Trong trường hợp này, để dừng chương trình, gõ đồng thời hai phím Ctrl Pause ( viết tắt ^Pause)

Ðể tránh vòng lặp vơ hạn, thân vịng WHILE cần có lệnh có tác dụng làm biến đổi đại lượng tham gia Ðiềukiện để đến lúc Ðiềukiện sai vịng lặp kết thúc

9.2.2 Các ví dụ lệnh While :

Ví dụ 9.10 : Nhập số tự nhiên N, dùng lệnh WHILE tính S=N!: PROGRAM VIDU910;

{ Tinh S=N! lệnh WHILE } Var

N, i : Integer; S : LongInt; Begin

Write(‘ Nhập N > : ‘ ); Readln(N);

S:=1;

i :=1; {9} While i<= N do begin

(122)

i:=i+1; {13} end;

Writeln(‘ Giai thua = ‘, S); Readln;

End.

Chạy<VD910.EXE>

Chép file nguồn <VD910.PAS>

Khởi đầu biến i gán gía trị (dòng {9}) Trong vòng lặp WHILE, sau lệnh S:=S*i; biến i tăng lên đơn vị lệnh i:=i+1; (dịng {13}) Khi i=N+1 điều kiện i<=N bị sai lúc vịng lặp kết thúc, kết qủa lệnh S:=S*i; thực N lầ? ứng với i=1, 2, 3, , N

Trong chương trình trên, khơng có dịng lệnh {13}: i:=i+1;

thì i ln ln nên điều kiện i<=N ln ln (vì N  1), vịng lặp vơ hạn

Sự khác lệnh WHILE so với FOR chỗ: lệnh FOR, biến i tự động gán gía trị ban đầu sau bước lặp tự động tăng lên, cịn WHILE khơng, ta phải viết lệnh

Tất toán giải lệnh FOR giải lệnh WHILE Ðặc điểm chung toán dạng số lần lặp vòng lặp biết trước

Lệnh WHILE đặc biệt thích hợp với vịng lặp có số lần lặp chưa biết trước, lệnh FOR khơng giải Ðây điểm mạnh lệnh WHILE Hãy xem ví dụ sau

Ví dụ 9.11: Trở lại tốn tính tiền gửi ngân hàng có tiền lãi hàng tháng gộp vào vốn (ví dụ 9.9) Câu hỏi là: cần gửi tối thiểu tháng để có số tiền  S cho trước

Giả sử tiền vốn 100, lãi suất hàng tháng 2%, số tiền cần có S=108 Ta tính số tiền có sau tháng gửi:

Sau tháng gửi: Số tiền=100 + 100*0.02 = 102 Sau tháng gửi: Số tiền=102 + 102*0.02 = 104.04

Sau tháng gửi: Số tiền=104.04 + 104.04*0.02 = 106.1208 Sau tháng gửi: Số tiền=106.1208 + 106.1208*0.02 = 108.2432 Vậy cần gửi N=4 tháng, số tiền có 108.2431

Qúa trình lặp kết thúc tới tháng có Số tiền  S Chương trình sau:

(123)

{ Tính số tháng gửi ngân hàng để có số tiền S } Var

Tienvon, Laisuat, Sotien, S : Real; N : Byte;

Begin

Write(‘ Nhập tiền vốn, lãi suất số tiền S cần có: ‘); Readln(Tienvon, Laisuat, S);

Sotien:=Tienvon;

N:=0; { N số tháng gửi } While Sotien< S do

begin N:=N+1;

Sotien:= Tienvon + Tienvon*Laisuat ; Tienvon:=Sotien;

end;

Writeln(‘ Cần gửi ‘, N , ‘ tháng ‘); Writeln(‘ Số tiền có = ‘ , Sotien:6:2); Readln;

End.

Chạy<VD911.EXE>

Chép file nguồn <VD911.PAS>

Số lần lặp lệnh: While Sotien < S ta ấn định từ trước mà tùy thuộc vào biểu thức Sotien < S mau bị sai hay chậm bị sai Số lần lặp hay nhiều phụ thuộc vào gía trị S nhỏ hay lớn vào tốc độ tăng nhanh hay chậm số tiền

9.3 CÂU LỆNH REPEAT 9.3.1 Cú pháp, lưu đồ, cách thức hoạt động :

(124)

REPEAT LệnhP;

UNTIL Ðiềukiện ;

Ý nghĩa: Chừng Ðiềukiện cịn sai làm LệnhP, Ðiềukiện khơng làm LệnhP mà chuyển sang lệnh phía

Cách thức hoạt động REPEAT:

Bước 1: Làm LệnhP, kiểm tra Ðiềukiện, Ðiềukiện chuyển sang lệnh phía dưới, ngược lại, Ðiềukiện sai quay lại bước

LệnhP gọi thân vòng lặp REPEAT, gồm nhiều lệnh lệnh khơng cần phải đặt khối begin va?end.

Nếu Ðiềukiện khơng LệnhP phải làm hồi, lúc ta có vịng lặp vơ hạn Trong trường hợp này, muốn dừng chương trình, gõ đồng thời hai phím Ctrl Pause (^Pause)

Ðể tránh vịng lặp vơ hạn, thân lệnh REPEAT cần có lệnh có tác dụng làm biến đổi đại lượng tham gia Ðiềukiện để đến lúc Ðiềukiện vịng lặp kết thúc

Các vịng lặp có số lần lặp biết trước giải lệnh REPEAT Ðặc biệt, lệnh WHILE, lệnh REPEAT thích hợp với vịng lặp có số lần lặp khơng biết trước

9.3.2 Các ví dụ lệnh Repeat :

Ví dụ 9.12: Ðảm bảo tính hợp lý liệu nhập từ bàn phím.

Khi giải phương trình bậc hai Ax2+Bx+C=0, ta thường giả thiết A 0, tính S=N!, ta thường yêu cầu N Sự hạn chế phạm vi liệu nhập đảm bảo tính hợp lý chúng làm giảm bớt phức tạp biện luận

Ðể buộc người sử dụng phải nhập A 0, nhập A=0 bắt nhập lại nhập A thôi, ta dùng cấu trúc :

Repeat

(125)

Readln(A); Until A<> 0;

Ðể đảm bảo chắn nhập N thỏa điều kiện 0<N<20, ta dùng cấu trúc : Repeat

Write(‘ Nhập N (0<N<20) : ‘); Readln(N);

If (N<=0) or (N>=20) then write(#7); Until (0<N) and (N<20) ;

Lệnh write( chr(7) ) hay write(#7) có cơng dụng phát tiếng kêu bip để cảnh báo người dùng nhập liệu sai u cầu

Ví dụ 9.13: Tìm bội số chung nhỏ hai số nguyên dương M N.

Bài tốn có cách giải khác nhau, cách đơn giản Trước hết, xem cách tìm BSCNN hai số M=5 N=9

Vì N>M nên ta tìm tập bội số N :{ 9, 18, 27, 36, 45, } số nhỏ chia hết cho M, số 45

Một cách tổng quát, gọi Max số lớn M N Ðầu tiên ta gán : BSCNN:=0;

Sau làm lệnh BSCNN:=BSCNN+Max ; hồi BSCNN chia hết cho M N dừng Trong chương trình ta dùng lệnh repeat để nhập hai số M, N đảm bảo dương

PROGRAM VIDU913; { Tìm BSCNN M N } Var

M, N, Max, BSCNN : Integer; Begin

Repeat

Write(‘ Nhập M N dương :’); Readln(M, N);

Until (M>0) and (N>0);

(126)

BSCNN:=0; Repeat

BSCNN:=BSCNN + Max;

Until (BSCNN mod N=0) and (BSCNN mod M=0) ; Writeln(‘ Bội số chung nhỏ nhất= ‘, BSCNN) ; Readln;

End

Chạy <VD913.EXE>

Chép file nguồn <VD913.PAS>

Ví dụ 9.14: Thiết kế để chạy nhiều lần chương trình.

Trong Turbo Pascal, lần muốn chạy chương trình ta phải gõ cặp phím Ctrl F9 (viết tắt ^F9), điều bất tiện cần chạy chương trình nhiều lần ứng với liệu thử khác Cấu trúc sau cho phép ta chạy chương trình số lần theo ý muốn:

REPEAT

{ Các lệnh chương trình}

Write(‘ Tiếp tục không (Y/N) ? :’); Readln(Traloi); {5}

UNTIL (Traloi =‘N’) or ( Traloi=‘n’); Ở đây, Traloi biến kiểu ký tự (Char);

Sau thực xong {các lệnh chương trình }, muốn chạy tiếp ta gõ phím Y  , muốn dừng gõ N

Chú ý : lệnh Readln(Traloi); dòng thứ {5} thay bằng: Traloi:=Readkey;

Hàm Readkey thuộc thư viện CRT cho kết qủa ký tự gõ từ bàn phím, khác lệnh Readln(Traloi) chỗ nhập ký tự ta không cần phải Enter

(127)

PROGRAM VIDU914; { In tam giác cân đặc } Uses CRT;

Const =‘*’; Var

k, j, m: integer; Traloi : Char ; Begin

REPEAT {9} Clrscr;

Repeat {11}

Write(‘ Nhập m (0<m<20) : ‘); Readln(m);

If (m <= 0) or ( m>=20) then write(#7); Until (m>0) and ( m<20) ; {15} Writeln(sao :m); { in đỉnh }

{ In hai cạnh bên tam gíac } For k:=1 to m-2

begin

(128)

end;

For k:=1 to 2*m-1 Write(sao); {in cạnh đáy} Writeln;

Write(‘ Tiếp tục không (Y/N) ?: ‘); Readln( Traloi);

UNTIL (Traloi=‘N’) or ( Traloi=‘n’); {28} End.

Chạy<VD914.EXE>

Chép file nguồn <VD914.PAS>

Chương trình 9.14 ví dụ hai câu lệnh Repeat lồng nhau, điều xảy thân lệnh Repat lại chứa lệnh Repeat khác: lệnh Repeat thứ nhất, từ dòng {9} đến dòng {28}, chứa lệnh Repeat thứ hai từ dòng {11} đến dòng {15}

9.3.3 So sánh lệnh For, While Repeat:

Lệnh For dùng cho vòng lặp có số lần lặp biết trước

Lệnh While hay Repeat tổng quát lệnh For, dùng cho tất loại vòng lặp, thường dùng cho vịng lặp có số lần lặp chưa biết trước

Lệnh While Repeat khác điểm sau: lệnh While kiểm tra điều kiện trước, thực lệnh ghi thân ( lệnhP ), cịn lệnh Repeat thực lệnhP kiểm tra điều kiện Vì thế, lệnh Repeat thực lệnh ghi thân lần

Ngoài ra, lệnh While kết thúc điều kiện sai, lệnh Repeat kết thúc điều kiện 9.4 CÂU HỎI TRẮC NGHIỆM

Câu 1: Cho S i biến nguyên Khi chạy đoạn chương trình : s:=0;

for i:=1 to 10 s := s+i; writeln(s);

Kết in lên hình : a) s = 11

(129)

d) s = 101

Câu 2: Cho S, i N>0 biến nguyên Ðể tính S = N!, chọn câu : a) S := 1; For i := to N S := S * i;

b) S := 0; For i := to N S := S * i; c) S := 1; For i := to N S := S * N; d) S := 1; For i:= to N S := S + i;

Câu 3: Cho S = 12 + 22 + + 1002 Nhóm lệnh tính sai Giá trị S: a) S:=0; FOR i:=1 TO 100 DO S := S + i*i;

b) S:=0; FOR i:=1 TO 100 DO S := S + SQR(i); c) S:=0; FOR i:=100 DOWNTO DO S := S + i*i; d) S:=1; FOR i:=1 TO 100 DO S := S + i*i;

Câu 4-Khi chạy chương trình : Var S, i, j : Integer;

Begin S := 0;

for i:= to

for j:= to S := S + ; End

Giá trị sau S : a)

b) 12 c) d)

(130)

while i<= begin

S:= S + i; i:= i + 2; end;

Giá trị sau S : a)

b) c) 11 d)

Câu 6: Khi chạy chương trình : Var S, i : Integer;

Begin

S:= 0; i:= 1; Repeat

S:= S + i * i; i:= i + 1; Until i > ; End

Giá trị sau S : a)

b) 14 c) 16 d) 30

(131)

Repeat i := i + 1; Until i > ;

Giá trị sau i : a)

b) c) d)

Câu 8: Cho m, n, i biến nguyên Khi chạy đoạn chương trình : m:=4; n:=5; i:=5;

Repeat i:=i+1;

Until (i Mod m = 0) and (i Mod n = 0); Giátrị sau i :

a) 20 b) c) d)

Câu 9: Cho chương trình : Var A : Real;

Begin

While A = begin

(132)

end; End

Ðể lệnh Readln(A) thực lần, phải điền vào chỗ lệnh lệnh ? a) A:=0;

b) A:=1; c) A:=-1; d) A <> 0;

Câu 10: Giảsử khai báo biến hợp lệ Ðể tính S = 10!, chọn câu :

a) S := 1; i := 1;

while i<= 10 S := S * i; i := i + 1;

b) S := 1; i := 1;

while i<= 10 i := i + 1; S := S * i;

c) S := 0; i := 1;

while i<= 10 begin

S := S * i; i := i + 1; end;

d) S := 1; i := 1;

while i<= 10 begin

S := S * i; i := i + 1; end;

9.5 BÀI TẬP

Câu 1) In bảng mã ASCII thành hai cột : Mã Ký tự , yêu cầu hiển thị trang , (mỗi trang 22 dòng) dừng lại chờ ta gõ Enter trang kế tiếp, hết

Câu 2) Nhập số nguyên dương N Tính :

(133)

S1 = 12 + 32 + 52 + 72 + + (2n+1)2

Câu 4) Nhập số nguyên dương n Tính :

S4 = 1.2.3 + 2.3.4 + 3.4.5 + + n(n+1)(n+2) Câu 5) Nhập số nguyên dương n Tính :

Câu *6) Nhập số x thực số n nguyên  1, tính gần ex theo công thức :

Câu 7) Nhập n, k nguyên đảm bảo phải dương k<= n Tính tổ hợp chập k n theo công thức :

Câu 8) Cho dãy Fibonaci xác đinh sau: F0=0, F1=1, Fn = Fn-1 + Fn-2 , với n >=

Hãy nhập số nguyên N>0 tính S= F0 + F1 + F2 + + Fn

Câu 9) Tìm in lên hình tất số nguyên phạm vi từ 10 đến 99 cho tích hai chữ số hai lầ? tổng hai chữ số Ví dụ : số N=36 có hai chữ số 6, 3*6 = 2*(3+6) Tương tự số 44

Câu 10) Nhập N nguyên đảm bảo lớn Tính tổng số lẻ  N Ví dụ : N=5 tổng S=1+3+5 = 9, N=8 S=1+3+5+7=16

Câu 11) Nhập số thực A đảm bảo 0<A< 2, tìm số n nhỏ thỏa mãn :

Câu 12) Nhập vào tuổi cha tuổi đảm bảo cho tuổi cha lớn hai lần tuổi Hỏi sau năm tuổi cha hai lần tuổi Ví dụ tuổi cha 30, tuổi 5, sau 20 năm tuổi cha 50 gấp đôi tuổi 25

(134)

( Hd : BSCNN * USCLN = m* n )

Câu 14) Nhập m, n nguyên ( < m, n < 20 ) In lên hình tam giác cân có chiều cao m, hình chữ nhật có chiều dài n, chiều rộng m :

10.1 MẢNG MỘT CHIỀU 10.1.1 Mảng cách khai báo mảng :

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 so? Các yếu tố để xác định mảng gồm có:

Tên mảng

Kiểu liệu chung phần tử mảng 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 kiểu thực hay kiểu chuỗi, kiểu đếm : nguyên, ký tự, lôgic, liệt kê hay đoạn

Khai báo mảng chiều :

Mảng chiều, gọi dãy, hay đơn giản mảng, khai báo theo hai cách : 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 hằ?g 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;

(135)

B: Array[‘a’ ’d’] of Integer; Theo khai báo trên, ta có ba mảng:

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]

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]

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ó hình ảnh mảng, mảng A, ta hình dung có dãy nhà tầng, tên gọi dãy A, gồm 11 phòng liên tiếp giống hệt đá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 dãy nhà B tầng có phịng đánh số thứ tự chữ a, b, c, d :

Ba Bb Bc Bd

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

(136)

A : Mang1; Hten: Mang2; B: Mang3;

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;

10.1.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;

(137)

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

i:=i+1; 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 Write(A[i]:6:2);

(138)

Tương tự, mảng B in lên hình lệnh : For ch:=‘a’ to ‘d’ 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]; 10.1.3 Các toán mảng :

Ví dụ 10.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 toá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, toá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;

(139)

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 VIDU101; { Ðếm số dương mảng} Type

Kmang = Array[1 20] of Real; Var

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;

(140)

Readln; End.

Chạy<VD101.EXE>

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

Ví dụ 10.2: Tìm số lớn dãy A1, A2, , An

Trong 8, ta cách tìm số lớn hai số, ba số Có thể mở rộng thuật tốn để tìm số lớn n số :

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:

Trong lệnh For trên, biến i chạy 2, kết qủa cho i chạy Không thiết phải gán giá trị ban đầu cho Max A[1], mà gán cho Max phần tử tùy ý mảng, ví dụ phần tử A[n] chẳng hạn, biến i lệnh For phải chạy Ví dụ 10.3: Bài toá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ụ:

(141)

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 hoá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 hoá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í đầ? tiên 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 quát 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 :

(142)

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 :

Z:=A[i]; A[i]:=A[j]; A[j]:=Z;

Tóm lại, thuật tố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 VIDU103;

{ Tìm Max dãy A tăng dần } Uses CRT;

Type

Kmang = array[1 20] of Real; Var

(143)

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;

(144)

End.

Chạy<VD103.EXE>

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

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

bằng 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;

Ví dụ 10.4: 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 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 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 hay khơng thỏa 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à:

(145)

if A[i] không thỏa đ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 ‘);

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

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

(146)

If Kiemtra then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘);

Ví dụ 10.5: 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 VIDU105;

{ 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

(147)

end; U:=1; P:=A[0];

For i:=1 to N begin

U:=U*x; P:=P+A[i]*U; end;

Writeln(‘ P=‘, P:6:2); Readln;

End.

Chạy<VD105.EXE>

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

10.2 MẢNG HAI CHIỀU (MA TRẬN) 10.2.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

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: nguyên, 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;

(148)

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,

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

Kmang1 = array[1 2, 3] of Real;

Kmang2 = array[‘a’ ’c’ , 3] of String[15]; Var

X : Kmang1; Y : Kmang2;

Chú ý: - Có thể xem mảng hai chiề? 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;

(149)

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ử

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ị

10.2.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ụ:

(150)

Ðể 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;

Tương tự, lệnh nhập liệu cho mảng Y viết là: For ch:=‘a’ to ‘c’ do

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ự, cịn 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 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 } end;

10.2.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

(151)

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 VIDU106; { 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

(152)

Readln(B[i,j]);

C[i, j]:=A[i, j] + B[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 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.

(153)

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

Ví dụ 10.7: 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 đầ? 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);

Ví dụ 10.8 : Tìm số lớn (hay số nhỏ nhất) hàng (hay cột) ma trận A: Hàng i ( 1 i N ) 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

if Max< A[i, j] then Max:=A[i, j]; Writeln(‘Sln hàng ‘, i, ‘ là: ‘, Max) ;

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;

(154)

Ma trận vuông 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 đâỵ:

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 rằ?g 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ầ? tử đường chéo đối xứng với nên khơng cần phải kiểm tra Nếu phầ? 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)

Thuật toán tốt đề nghị : Kiemtra := TRUE;

For i:=2 to N do For j:=1 to i-1 do

(155)

else

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:

Nhập vào ma trận vuông A cấp N in ma trận A lên hình Ðếm ma trận A có số

Tìm số lớn A

Tìm số nhỏ hàng A

Kiểm tra xem A có phải ma trận đối xứng không PROGRAM VIDU109;

(156)

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

Until ( N>0) and ( N<11) ; 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;

(157)

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

(158)

End.

Chạy<VD109.EXE>

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

10.3 CÂU HỎI TRẮC NGHIỆM Câu 1: Chọn khai báo :

a) Var A: array[1 10] of integer; b) Var A= array[1 10] of integer; c) Var A:= array[1 10] of integer; d) Var A: array[1,10] of integer; Câu 2: Cho khai báo:

Var

A: Array[1 4] of Real; i : Integer ;

Ðể nhập liệu cho A, chọn câu :

a) For i:=1 to Write(‘ Nhập A[‘, i, ‘]:’); Readln(A[i]); b) For i:=1 to Readln(‘ Nhập A[‘, i, ‘]:’);

c) For i:=1 to Begin Write(‘ Nhập A[‘, i, ‘]:’); Readln(A[i]); End; d) Write(‘ Nhập A:’); Readln(A);

Câu 3: Cho khai báo biến : Var A : array[1 5] of Integer; Chọn lệnh :

(159)

d) A := 10 ;

Câu 4: Trong khai báo sau cịn bỏ trống chỗ, chưa xác định kiểu liệu biến Max : Var

A: Array[‘a’ ’d’] of Real ; Ch : Char ;

Max : ;

Muốn biến Max lưu gía trị lớn mảng A cần khai báo biến Max kiểu vào chỗ : a) Char

b) Integer c) String d) Real

Câu 5: Cho khai báo: Var

A: Array[1 4] of Integer ; i : Integer ;

Sau thực lệnh : For i:=1 to A[i]:= i; For i:=1 to A[i]:= A[i]+1; mảng A có gía trị :

a) A[1]=1, A[2]=2, A[3]=3, A[4]=4 b) A[1]=2, A[2]=3, A[3]=4, A[4]=5 c) A[1]=0, A[2]=1, A[3]=2, A[4]=3

d) A[1]=1, A[2]=1, A[3]=1, A[4]=1 Câu 6: Khai báo :

(160)

b) Const n=2; m=3; Var A: array[1 n,1 m] of integer; c) Var n, m : integer ; A: array[1 n,1 m] of integer;

d) Var A: array[3, 2] of Integer; Câu 7: Cho khai báo :

Var

A : array[1 2,1 3] of Real; i, j : integer;

Ðể nhập liệu cho ma trận A, chọn :

a) Write(‘ Nhập A:’); Readln(A) ; b) For i:=1 to Readln(A[i, j]); c) For i:=1 to

For j:=1 to begin

write(‘Nhập A[‘, i, j, ‘]:’); readln(A[i, j]);

end;

d) For i:=1 to For j:=1 to

write(‘Nhập A[‘, i, j, ‘]:’); readln(A[i, j]);

Câu 8: Cho khai báo : Var

A : array[1 2,1 3] of Real; i, j : integer; Max : Real;

Ðể tìm số lớn ma trận A, chọn câu :

a) Max:=A[1,1];

If Max < A[i,j] then Max:=A[i,j];

b) Max:=A[1,1]; For i:=1 to

if Max < A[i,j] then Max:=A[i,j];

(161)

For i:=1 to For j:=1 to

if Max< A[i,j] then A[i,j]:=Max;

For i:=1 to For j:=1 to

if Max < A[i,j] then Max:=A[i,j];

Câu 9: Khi chạy chương trình : Var

A : array[1 2,1 3] of integer; i, j, S : integer;

Begin

A[1,1]:= ; A[1,2]:= -1 ; A[1,3]:= -4 ; A[2,1]:= -9 ; A[2,2]:= ; A[2,3]:= ; S:=0;

for i:=1 to

for j:=1 to If A[i,j] < then S:=S+1; Write(S);

End

Kết qủa in gía trị S :

a) b) -9 c) d)

Câu 10: Cho X1, X2, Xn mảng số thực Ðể tính :

(162)

For i:=1 to N S := S + X[i];

Hãy điền lệnh thích hợp vào chỗ : a) Write ('S=', S);

b) Readln (S);

c)

d) S := S/N;

10.4 BÀI TẬP Câu 1) Nhập số tự nhiên n dãy số thực x1, x2, , xn

Tìm số lớn số nhỏ dãy

Ðếm dãy có số dương, số âm, số ? Loại nhiều ?

Câu 2) Nhập dãy số nguyên x1, x2, , xn In riêng số chẵn số lẻ, loại dòng Câu 3) Nhập số nguyên dương N, xây dựng dãy số nguyên x0, x1, , xn xi số Fibonaci thứ i: x0=1, x1=1, xi =xi-1 + xi-2 với i  In dãy x lên hình

Câu 4) Nhập dãy số x1, x2, , xn Tính :

Câu 5) Nhập dãy số x1, x2, , xn

In đảo ngược dãy đó, ví dụ cho dãy 8, in ra: Sắp xếp dãy tăng dần, in dãy

Sắp xếp dãy giảm dần, in dãy

Câu 6) Nhập hai dãy số x1, x2, , xn y1, y2, , yn Xây dựng dãy thứ ba z1, z2, , zn tổng hai dãy (zi= xi + yi), in ba dãy lên hình, dãy dòng

Câu 7) Cho hai đa thức :

(163)

Gọi R(x) = Pn(x) + Qm(x)

Nhập số tự nhiên n m, hệ số bj hai đa thức Pn(x) Qm(x), in bậc hệ số đa thức R(x)

Câu 8) Nhập x thực, n nguyên dương mảng hệ số a0, a1, , an , tính gía trị đa thức : P = anxn + an-1 xn-1 + + a1 x + a0 theo sơ đồ Hoocner :

P=( ( (anx + an-1) x+ an-2)x + + a1 )x + a0 Ví dụ :

P = 2x4 + 3x3 - 4x2 +7x + 9 = (((2x + 3)x - )x + 7)x +

Câu 9) Nhập dãy số x1, x2, , xn , cho biết dãy có đối xứng khơng?, dãy có lập thành cấp số cộng khơng? Ví dụ dãy 5 đối xứng, dãy cấp số cộng

Câu 10) Nhập dãy số x1, x2, , xn , cho biết dãy thuộc loại nào: tăng, giảm hay không tăng, không giảm ?

Câu 11) Nhập dãy số nguyên dương x1, x2, , xn

Tách dãy x thành hai dãy: dãy A gồm số chẵn, dãy B gồm số lẻ, xếp dãy A tăng dần, dãy B giảm dần, in hai dãy A B hai dòng khác

Nối hai dãy A B theo thứ tự thành dãy gán trở lại vào dãy x, in dãy x

Ví dụ nhập dãy x={ 5, 7, 0, 2, 1, 6, 4, } dãy A={ 0, 2, 4, 6}, dãy B={ 9, 7, 5, 1}, x={ 0, 2, 4, 6, 9, 7, 5, 1}

Câu 12) Nhập hai số m, n hai ma trận Am,n Bm,n In ma trận A, B, C=A+2B D=A-B lên hình

Câu 13)

Nhập in ma trận Am,n

Tìm số nhỏ số lớn ma trận Tính tổng tất phần tử ma trận

Ðếm ma trận có số dương, số 0, số âm Câu 14)

Nhập in ma trận Am,n

(164)

Tìm in số nhỏ đường chéo ma trận Câu 15) Nhập in ma trận vng An,n

A có phải ma trận đối xứng khơng A có phải ma trận đơn vị không?

(A đối xứng Aij=Aji với i,j =1, , n A ma trận đơn phần tử đường chéo phần tử lại 0)

11.1 CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP

Phần trình bày cách vận dụng câu lệnh lặp để giải số toán tiêu biểu mức khó Thơng qua ví dụ, người học tìm thấy tư liệu có ích để giải tập tương tự, nâng cao thêm bước kỹ lập trình

Ví dụ 11.1: Nhập x n, tính gần Sinx theo cơng thức:

Ta viết :

S= U0 - U1 + U2 - U3 +U4 - +(-1)N UN , : U0 = x

v.v

Như vậy, Uk sai khác Uk-1 thừa số C tính trực x theo k :

Thành ra, lưu số hạng U bước trước tính số hạng U bước sau lệnh : U:=U*C; , sang bước sau gía trị U thay đổi nên bước ta phải cộng trừ U vào tổng S

Việc cộng hay trừ U vào tổng S giải nhờ biến dau gọi biến chứa dấu U, biến nhận gía trị +1 hay -1 ứng với phép cộng hay trừ U vào tổng S

(165)

dau:= -1;

Tại bước lặp ta cộng U nhân với dau vào S, đảo dấu để chuẩn bị cho bước lệnh:

S:= S+ dau * U; dau:= -dau ;

Thành bước trước dau=-1 bước sau dau=+1 ngược lại Kết qủa lệnh S:= S+ dau * U; cộng hay trừ U vào S theo luật đan dấu

Câu lệnh lặp dùng lệnh FOR số lần lặp N nhập từ bàn phím tức biết trước Chương trình cụ thể sau:

PROGRAM VIDU11_1; { Tính gần Sinx } Var

N, k, dau : Integer; x, U, S, C : Real; Begin

Write(‘Nhập số dương N : ‘); Readln(N); Write(‘Nhập số thực x : ‘); Readln(x); U:=x;

S:=x ; { Gán gía trị ban đầu U0 cho S ngay} dau:= -1;

For k:=1 to N do begin

C:= x*x/ ( 2*k*(2*k+1) ); U:= U*C;

S:=S+ dau*U; dau:= - dau; end;

(166)

End.

Chạy <VD11_1.EXE >

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

Khi chạy chương trình, nhập N=6 x=1.5708 (=  /2) cho kết qủa Sinx= 1.0000 ; Nếu nhập N=6 x=3.1416 (=  ) cho kết qủa Sinx = 0.0000

Ví dụ 11.2: Tính gần số e với sai số cho trước. Cho công thức :

( vế phải tổng vơ hạn )

Hãy tính gần e2 cách lấy tổng ( hữu hạn ) số hạng đầu chuỗi gặp số hạng đầu tiên có gía trị tuyệt đối nhỏ số epsilon (EPS) dương bé cho trước, tức :

với n số cho:

Ta viết :

S = Uo +U1 + +Un , : Uo=1

v.v

(167)

PROGRAM VIDU11_2;

{ Tinh e2 theo sai số EPS dương bé cho trước} Var

k : Integer; S, U, EPS : Real; Begin

Repeat

Write(‘Nhap sai so > : ‘); Readln(EPS);

Until EPS >0; k :=0;

S :=0; U :=1;

While ABS(U) >= EPS DO begin

S:=S +U; k:=k+1; U:=U* 2/ k; end;

Writeln(‘ S= ‘ , S:8:4 , ‘ tính đến số hạng k= ‘, k); Readln;

End.

Chạy < VD11_2.EXE>

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

Khi chạy chương trình, nhập EPS=0.001 cho kết qủa S=7.3887 , tính đến số hạng k=10 Ví dụ 11.3:

(168)

Tách in hàng đơn vị N hai lệnh: k:= N mod 10; { k=2 }

Write(k: 3);

Bỏ hàng đơn vị, giữ lại chữ số từ hàng chục trở lên: N:= N div 10; { N=1574 }

Lặp lại qúa trình N=0

Số lần lặp trước mà tùy thuộc vào việc nhập số N có hay có nhiều chữ số, nên ta phải dùng lệnh Repeat hay While

PROGRAM VIDU11_3;

{ In đảo ngược chữ số N } Var

N, k: LongInt ; Begin

Repeat

Write(‘ Nhập N : ‘); Readln(N);

Until (N>0);

Writeln( N, ‘ in đảo ngược thành :’); Repeat

k:= N mod 10; Write(k: 3); N:=N div 10; Until N=0; Readln; End.

Chạy <VD11_3.EXE>

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

(169)

Số N số nguyên tố chia hết cho Ví dụ số 2, 3, 5, 7, 11, 13, 17, 19, 21, 23 số nguyên tố

Xuất phát từ địng nghĩa, ta kiểm tra N không chia hết cho tất số từ 2, 3, 4, , đến N-1 N nguyên tố, ngược lại, cần N chia hết cho số k tập { 2, 3, 4, , N-1} N số nguyên tố

PROGRAM VIDU11_4;

{ Kiểm tra số N có phải số nguyên tố không } Var

N, k: integer; Kiemtra: Boolean ; Begin

Repeat

Write(‘ Nhập N : ‘); Readln(N);

Until (N>0);

If N =1 then Kiemtra:= False else { xét N > 1}

begin

Kiemtra:= True; k:=1;

Repeat k:= k+1;

Until N mod k=0 ;

If k<N then Kiemtra:= False; end;

If Kiemtra=True then Writeln(N, ‘ số nguyên tố ‘) else

(170)

End.

Chạy <VD11_4.EXE>

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

Chương trình có đoạn cần giải thích rõ thêm: Repeat

k:= k+1;

Until N mod k=0 ;

If k<N then Kiemtra:= False;

Vòng lặp kết thúc gặp số k (nhỏ nhất) thỏa điều kiện N mod k=0 Lúc đó, k<N có nghĩa N chia hết cho số k khác N nên N khơng phải số ngun tố Nếu k=N chứng tỏ N chia hết cho N không chia hết cho số 2, 3, , N-1 nên N số nguyên tố

Nhận xét: Vì số chẵn (trừ số 2) số nguyên tố nên chương trình cải tiến kiểm tra số lẻ thơi

11.2 CÁC VÍ DỤ NÂNG CAO VỀ MẢNG Ví dụ 11.5:

Nhập danh sách N (N<50) học sinh gồm họ tên điểm thi mơn tốn Hãy phân loại học sinh sau : loại giỏi điểm toán  9, loại  điểm toán< 9, loại trung bình  điểm tốn< 7, loại điểm toán<

In danh sách lên hình, người dịng, gồm họ tên, điểm toán phân loại Yêu cầu danh sách thứ tự theo trật tự giảm điểm tốn

Ðếm xem có em có điểm tốn 10 ? PROGRAM VIDU11_5;

Uses CRT; Type

Kmang1 = Array[1 50] of String[18]; Kmang2 = Array[1 50] of Real; Var

(171)

St: String[18]; z: Real;

Begin Clrscr; Repeat

Write(‘ Nhập số lượng học sinh : ‘); Readln(N);

Until (N>0) and ( N<51);

For i:=1 to N { nhập danh sách hs } begin

Write(‘Nhập họ tên hs thứ ‘, i , ‘ : ‘); Readln(Hoten[i]);

Write(‘Nhập điểm toán hs thứ ‘, i , ‘ : ‘); Readln(Dtoan[i]);

end;

{ xếp giảm theo điểm toán} For i:=1 to N-1 do

For j:=i+1 to N

If Dtoan[i]<Dtoan[j] then

begin { hoán đổi Dtoan họ tên } z:=Dtoan[i];

Dtoan[i]:=Dtoan[j]; Dtoan[j]:=z;

St:=Hoten[i];

Hoten[i]:=Hoten[j]; Hoten[j]:=St;

(172)

{ Phân loại } For i:=1 to N do

If Dtoan[i] >= then Loai[i]:=‘Gioi’ else

If Dtoan[i] >=7 then Loai[i]:=‘Kha’ else

If Dtoan[i]>=5 then Loai[i]:=‘Trung binh’ else

Loai[i] :=‘Kem’;

Writeln(‘ Danh sách hs giảm theo Ðtoán là: ‘); For i:=1 to N do

Writeln(Hoten[i]: 18, #32, Dtoan[i]:5:1, #32, Loai[i]) ; { Ðếm số em điểm 10}

Dem10 := 0; For i:=1 to N do

if Dtoan[i]=10 then Dem10 :=Dem10 +1; Writeln(‘ Số em điểm 10 :’ , Dem10); Readln;

End.

Chạy <VD11_5.EXE>

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

Trong chương trình, ta sử dụng ba mảng: Hoten, Loai Dtoan với quy ước phần tử thứ i mảng chứa thông tin người: học sinh thứ i danh sách Vì thế, xếp mảng Dtoan giảm dần, có đổi chỗ Dtoan[i] với Dtoan[j] tương ứng phải đổi chỗ Hoten[i] với Hoten]j]

Ví dụ 11.6:

(173)

{ Ðếm ký tự a, b, c, d } Var

Kytu : Array[1 20] of Char ; N, i, Max : Integer;

ch : Char;

Dem : Array[‘a’ ’d’] of Integer; Begin

i:=0; Repeat i:=i+1;

Write(‘Nhập ký tự thứ ‘ , i , ‘: ‘); Readln(ch);

{ đổi chữ thường }

If ch IN [‘A’ ’Z’] then ch:=Chr( Ord(ch) + 32 ); Kytu[i]:= ch;

Until ( ch= #32) or (i=20); N:=i;

{ Ðếm chữ a, b, c, d }

For ch:=‘a’ to ‘d’ Dem[ch]:=0; For i:=1 to N

begin

ch:=Kytu[i];

If ch IN [‘a’ ’d’] then Dem[ch] := Dem[ch]+1; {24} end;

Writeln(‘ Số ký tự nhập :’ , N );

(174)

End

Chạy <VD11_6.EXE>

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

Trong chương trình, câu lệnh dịng {24}: If ch IN [‘a’ ’d’] then Dem[ch] := Dem[ch]+1; tương đương với lệnh ghép sau:

begin

If ch =‘a’ then Dem[‘a’] := Dem[‘a’]+1; If ch =‘b’ then Dem[‘b’] := Dem[‘b’]+1; If ch =‘c’ then Dem[‘c’] := Dem[‘c’]+1; If ch =‘d’ then Dem[‘d’] := Dem[‘d’]+1; end;

Dùng bốn lệnh dễ hiểu song tốn không phát triển ta phải đếm nhiều loại ký tự, chẳng hạn đếm chữ a, đếm chữ b, , đếm chữ z

Ví dụ 11.7:

Nhập ma trận A cấp NxM, đếm xem hàng có số 0, hàng có nhiề? số nhất. Ta khai báo Dem mảng gồm N phầ? tử với quy ước Dem[i] lưu số lượng số hàng i Tìm Max số lớn mảng Dem Những hàng i có Dem[i] =Max hàng có nhiều số khơng

Dưới chương trình cụ thể : PROGRAM VIDU11_7 ;

{ Tìm ma trận hàng có nhiều số } Type

Kmang= Array[1 10, 10] of Real; Var

A : Kmang;

i, j, N, M : Integer;

(175)

Begin 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;

{ In ma trân A }

Writeln(‘ Ma tran A la:’); For i:=1 to N do

begin

For j:=1 to M Write(A[i, j]:4:0); Writeln;

end;

{ Ðếm số hàng} For i:=1 to N do

begin

Dem[i]:=0;

For j:=1 to M if A[i, j]=0 then Inc(Dem[i]); Writeln(‘Số số hàng ‘, i, ‘ là: ‘ , Dem[i]); end;

(176)

For i:=1 to N do

if Max< Dem[i] then Max:=Dem[i]; Writeln(‘ Số 0/hàng nhiều = ‘, Max); { Tìm hàng có nhiều số nhất}

If Max =0 then writeln(‘ Khơng hàng có số ‘) else

For i:=1 to N if Dem[i]=Max then writeln(‘ Hàng nhiều số ‘, i:3 ); Readln;

End.

Chạy <VD11_7.EXE>

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

Ví dụ 11.8: Hốn đổi hai hàng h k ma trận A Hàng h có dạng : A[h,1], A[h,2], , A[h,M]

Hàng k có dạng : A[k,1], A[k,2], , A[k,M]

Việc đổi hàng h hàng k quy việc đổi chỗ cặp phần tử: A[h,1] với A[k,1], A[h,2] với A[k,2], , A[h,M] với A[k,M], tức đổi chỗ A[h,j] A[k,j] với j=1, 2, , M:

For j:=1 to M do

begin { đổi chỗ A[h,j] với A[k,j] } z:=A[h,j];

A[h,j]:=A[k,j]; A[k,j]:=z; end;

Ở z biến trung gian kiểu liệu với phần tử ma trận A

(177)

11.3 KIỂU CHUỖI KÝ TỰ 11.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 khơng có ký tự ‘‘ (chỉ gồ? 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 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ự độ dài tối đa cho phép 255

(178)

St := ‘Quan 1, Thanh Ho Chi Minh’; gía trị biến St St=‘Quan 1, Thanh pho’

Trong nhớ máy, biến chuỗi chiếm số byte bằ?g độ dài tối đa cộng thêm Byte đầu tiên, gọi byte 0, chứa ký tự có mã độ dài thực chuỗi, byte lại chứa ký tự Cấu trúc 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 )

Turbo Pascal có sẵn hàm Length(chuỗi) cho độ dài thực chuỗi mà không cần phải dùng đến byte Ví dụ :

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 này ( trừ biến chuỗi có kiểu String )

11.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:

(179)

Ð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

11.3.3 Các thao tác chuỗi : 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’ 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à khơng có 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 11.3.4 Các hàm liên quan đến chuỗi :

Hàm Length(St) : cho độ dài chuỗi St

Ví dụ: Length(‘ABCD’)=4 chuỗi ‘ABCD’ có ký tự Chuỗi rỗng có độ dài

Hàm Pos(S, St):

(180)

Pos(‘Ab’, ‘cdAb3Abm’) = 3, Pos(‘Ab’, ‘1bA3b’) =

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’ 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

11.3.5 Các thủ tục liên quan đến chuỗi : 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’ 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’;

(181)

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’ Thủ tục Str(x, St):

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

(182)

11.3.6 Các ví dụ chuỗi:

Ví dụ 11.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) ; Ví dụ 11.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ự đầu tiên khác trắng

Sở dĩ phải dùng vịng lặp While số ký tự trắng đầu chuỗi khơng biết trước b) Xóa ký tự trắng cuối chuỗi :

Tương tự, muốn xóa tất ký tự trắng cuối chuỗi St, ta dùng lệnh: While St[ length(St) ]= #32 Delete(St, length(St), 1);

Diễn giải: chừng ký tự cuối St 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 :

(183)

begin

Delete(St, k, 1); k:=Pos(‘ ‘, St); end;

Ví dụ 11.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);

Ví dụ 11.12: Tìm kiếm thay

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 VIDU11_12 ;

{ 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 }

(184)

end else

Writeln( St, ‘ khơng có chữ basic ‘) ; Readln;

End.

Chạy <VD11_12.EXE>

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

Ví dụ 11.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 VIDU11_13 ;

{ 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;

(185)

Chạy <VD11_13.EXE>

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

Ví dụ 11.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 VIDU11_14 ;

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

(186)

k:=Pos(‘ ‘, St); { ‘ ‘ ký tự trắng } 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 <VD11_14.EXE>

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

Ví dụ 11.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

(187)

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 VIDU11_15 ;

{ 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}

Until Keypressed; TextMode(C80); End.

Chạy <VD11_15.EXE>

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

(188)

a) SS := 'a' < 'A'; b) SS := 'A' = 'a'; c) SS := 'an' < 'a';

d) SS := 'PASCAL' < 'pascal'; Câu 2: Cho khai báo :

Var

Ho, ten : String[15]; -Lệnh sai :

a) Write('Ho ten la : ' ; Ho ; Ten); b) Write('Ho ten la : ' + Ho + Ten); c) Write('Ho ten la : ', Ho , Ten); d) Write('Ho ten la : ', Ho + Ten); Câu 3: Cho khai báo :

Var

Chuoi : string[10]; x : real;

-Lệnh :

a) Chuoi := Str(x:5:2) ; b) Str(x:5:2, Chuoi); c) Chuoi := x ;

d) x := Chuoi ;

Câu 4: Cho St biến chuỗi, sau thực hai lệnh : St:= Copy( 'PASCAL VERSION 5.5' , 8, 7) ;

Write(St);

(189)

a) VERSION 5.5 b) VERSION c) PASCAL d) 5.5

Câu 5: Cho St biến chuỗi, sau thực bốn lệnh: St:=’ABCDEF’;

Delete(St, 3, 2); Insert(‘XYZ’, St, 2); Write(St);

-Kết qủa in lên hình là: a) ABXYZEF

b) AXYZBCDEF c) AXYZ

d) AXYZBEF

Câu 6: Cho i x hai biến kiểu nguyên Khi thực lệnh : VAL('1234', x, i);

-Gía trị x i : a) x = , i = 1234

b) x = 1234 , i = c) x = 1234 , i = d) x = , i =

Câu 7: Cho biến St chuỗi k nguyên Sau gán: St:='Sinh vien Tin hoc hoc Tin hoc';

(190)

a) k=13 b) k=11 c) k=26 d) k=23

Câu 8: Khi chạy chương trình : Var

St : string; i, L : integer; Begin

St :='Hom thuc tap'; L:=Length(St); For i := to L

If (St[i] >= 'a') and (St[i] <= 'z') then St[i]:= Upcase (St[i]); Write (St);

End

-Chương trình in :

a) Hom Nay Thuc Tap b) hom thuc tap c) Hom thuc tap d) HOM NAY THUC TAP Câu 9: Khi chạy chương trình : Var

St : String; i,L : integer; Begin

(191)

End

-Chương trình in : a) DCAB

b) ABCD c) 4321 d) DCBA

Câu 10: Cho St biến chuỗi St:=’AAABAAB’; Sau thực hai lệnh :

While St[1]=’A’ Delete(St,1,1); Write(St);

Kết qủa in là: a) AABAAB b) BAAB c) BB d) AAA

11.5 BÀI TẬP I Bài tập nâng cao lệnh lặp :

Câu Nhập x thực, n nguyên  , tính gần cosx :

Câu *2 Nhập số nguyên dương N, cho biết số có chữ số, chữ số lớn Ví dụ: số N = 1275 có bốn chữ số, chữ số lớn

(192)

Câu Tìm in lên hình tất số ngun dương có ba chữ số (trong phạm vi từ 100 đến 999) cho tổng bình phương chữ số 25 Ví dụ :số N=304 có ba chữ số 3, 4, 32+02+42 = 25 Tương tự số 500.

Câu Nhập số N nguyên dương, tính :

Câu *6 Nhập ngày, tháng, năm sinh bạn Từ đầu năm sinh đến ngày tháng năm sinh bạn có bao nhiêu ngày? Ví dụ, sinh ngày 17/2/1977 từ đầu năm 1977 đến ngày có 48 ngày

Câu Nhập số N nguyên dương, tính S tổng N số ngun tố Ví dụ N=3 S=2+3+5=10.

II Bài tập nâng cao mảng:

Câu *8) Tìm số dương nhỏ dãy x1, x2, , xn

Câu *9) Sắp xếp dãy x1, x2, , xn cho số dương đứng trước theo thứ tự giảm dần, đến số lại ( số âm số 0) theo thứ tự tăng dần Ví dụ, nhập dãy 3, 0, 4, -5, 2, -1, 7, 0, -6, thành: 7, 4, 3, 2, -6, -5, -1, 0,

Câu *10) Nhập dãy số nguyên dương x1, x2, , xn Tìm bội số chung nhỏ chúng Ví dụ dãy có bội số chung nhỏ 60

Câu *11) Nhập dãy số nguyên dương x1, x2, , xn Vẽ biểu đồ ngang biểu đồ đứng cho dãy dấu * Ví dụ dãy { 3, 5, 6, 2} có biểu đồ ngang biểu đồ đứng sau:

Câu 12) Nhập in ma trận Am,n Cho biết hàng hàng có giống khơng, khơng hốn đổi hàng hàng Ví dụ: ma trận bên trái có hàng hàng khơng trùng nhau, sau hốn đổi hai hàng ta ma trận bên phải:

(193)

Câu *14) Nhập in ma trận Am,n

Cho biết hàng A lập thành dãy tăng Cho biết hàng A lập thành dãy đối xứng

Câu *15) Nhập in ma trận Am,n Tìm số dương nhỏ ma trận

Câu *16) Nhập in ma trận Am,n số nguyên dương Tìm bội số chung nhỏ tất phần tử ma trận

Câu 17) Nhập vào số nguyên N ( 1< N < 11) ma trậ? vng A cấp N có phần tử số nguyên Tính :

trong Aij phần tử hàng i cột j ma trận A

-Tìm số lớn khu vực tam giác kể từ đường chéo phụ trở ngược lên góc bên trái ma trận A Ví dụ, ma trận bên, khu vực tam giác có số lớn

Dùng cấu trúc mảng, nhập danh sách N (0<N<50) sinh viên gồm Tên, Phái (nam/ nữ), Ðiểm thi, phân loại đậu, rớt sau :

Nếu Ðiểm thi  : Ðậu Nếu Ðiểm thi < 4.5 : Rớt

Nếu 4.5 Ðiểm thi< 5: nam Rớt, nữ Ðậu

In danh sách theo trật tự tăng Tên (sắp xếp theo thứ tự a,b,c, ), gồm thông tin Tên, Phái, Ðiểm thi, phân loại

Câu *19) Dùng cấu trúc mảng, nhập danh sách N (0<N<50) chủ hộ gồm họ tên, số điện kế tháng trước số điện kế tháng Tính tiền điện cho hộ theo đơn gía:

(194)

In danh sách lên hình liệt kê người gồm họ tên, lượng điện tiêu thụ tháng số tiền điện phải trả

In tổng số tiền điện tất hóa đơn III Bài tập chuỗi ký tự :

Câu 20) Nhập chuỗi St, in St theo thứ tự đảo ngược Ví dụ : St = ‘ABCD’, in ‘DCBA’

Câu 21) Nhập chuỗi St, xây dựng chuỗi St1 gồm ký tự St đảo ngược thứ tự Ðổi chuỗi St thành chữ hoa và?đổi chuỗi St1 thành chữ thường Ví dụ cho St=‘AbcD12’, St1=‘21DcbA’, sau đổi ta St= ‘ABCD12’ St1=‘21dcba’

Câu 22) Nhập chuỗi St, kiểm tra chuỗi có đối xứng khơng Ví dụ: chuỗi ‘BCD1DCB’ ‘ABCCBA’ đối xứng, cịn ‘ABCDBA’ khơng đối xứng

Câu 23) Nhập chuỗi St, đếm xem chuỗi có chữ a khơng phân biệt viết hoa hay viết thường, cho biết vị trí chữ a Ví dụ St=‘Anh van la quan trong’ có chữ a vị trí 1, 6, 10, 14

Câu *24) Nhập chuỗi St, cho biết St có ký số ‘0’, ‘1’, ‘2’, , ‘9’ loại Ví dụ St=‘13163’, in ra: có ký số 1, có ký số 3, có ký số 6, loại khác khơng có

Câu 25) Nhập chuỗi St, xóa bỏ ký tự trắng thừa đầu cuối chuỗi, cho hai từ có ký tự trắng, đổi chuỗi thành chữ thường, riêng chữ đầu từ thành chữ hoa

Ví dụ : St =‘ Hom nAy tHUC taP ‘ In ra: ‘Hom Nay Thuc Tap’ Câu *26) Nhập chuỗi St, đếm xem St :

có chữ A,B,C, ,Z có chữ số 0,1, 2, 3, , có ký tự trắng

có ký tự khác

Trong bốn loại loại nhiều ?

Câu 27) Nhập hai chuỗi St St1 Cho biết chuỗi St1 xuất lần St, vị trí nào? Ví dụ St=‘pas12pas34’, chuỗi St1 =‘pas’ xuất lần vị trí 1,

Câu 28) Nhập ba chuỗi St, St1, St2 tìm xem chuỗi St có chứa chuỗi St1 khơng ?, có thay St1 St2

Ví du: cho St=‘ABC1234E’, St1=‘1234’ St2 =‘*’ Sau thay ta St=‘ABC*E’

(195)

Câu *30) Nhập chuỗi St gồm nhiều từ Giả thiết St có khơng qúa 20 từ, từ dài không qúa 10 ký tự Xây dựng mảng A chứa từ St, với A[i] chứa từ thứ i St Sắp xếp in từ mảng A theo trật tự giảm độ?dài từ

Ví dụ cho St=‘ Thanh da Nang’ : A[1]=‘Thanh’, A[2]= ‘pho’, A[3]=‘Da’, A[4]=‘Nang’ In ra: Thanh Nang Da

Câu 31) Nhập số nguyên dương N, đổi số nhị phân (hệ đếm 2) tương ứng Ví dụ : N = 15, đổi 1111

Câu 32) Nhập số nguyên dương N, đổi số thập lục phân (hệ đếm 16) tương ứng : Ví dụ : N = 59, đổi 3B

12.1 KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON

Chương trình (subprogram) đoạn chương trình có chức giải vấn đề chuyên biệt mà chương trình cần phải thực số lần ứng với gía trị khác tham số

Chẳng hạn, phải tính loạt gía trị e1, e2, e3, , e10 ta nên viết chương trình có nhiệm vụ tính ex với x la đối số & đặt tên EXP(x) Mỗi cần tính gía trị e1, e2, , e10 , ta chỉ cần gọi tên chương trình thay x giá trị cụ thể 1, 2, ,10 Tương tự thế, cần nhập liệu cho hai ma trận A B, thay phải viết hai đoạn chương trình nhập riêng cho A cho B ta cần viết chương trình có nhiệm vụ nhập liệu cho ma trận X Sau chương trình chính, để nhập liệu cho A, ta gọi chương trình thay X A, để nhập liệu cho B, ta gọi chương trình thay X B Như chương trình thay cho hay nhiều đoạn chương trình có chất giống

Việc sử dụng chương trình khơng có tác dụng làm cho chương trình bớt rườm rà, bớt dài dòng mà đặc biệt có ý nghĩa việc tổ chức chương trình

Khi phải giải toán lớn, người ta tìm cách chia thành nhiều tốn nhỏ Mỗi toán nhỏ giải riêng rẽ chương trình dễ dàng phải kiểm tra lỗi kiểm tra thuật toán Việc cịn lại ghép chương trình để tạo thành chương trình lớn, chương trình Số lệnh thân chương trình khơng nhiều, chủ yếu lời gọi chương trình con, người thảo chương dễ có nhìn tổng quan tồn chương trình trước xem xét chương trình cách chi tiết Ðiều tương tự dây chuyền sản xuất công nhiệp, người ta lắp ráp sản phẩm ( xe máy, ô tô, ti vi, ) từ phụ tùng bán sản phẩm chế tạo sẵn từ nơi khác chuyển đến mà không cần phải tìm hiểu xem họ chế tạo

Có hai loại chương trình hàm thủ tục Sự khác hàm thủ tục chỗ: hàm luôn trả gía trị thơng qua tên hàm sử dụng hàm sử dụng biểu thức, cịn thủ tục khơng trả giá trị qua tên thủ tục sử dụng lệnh đơn giản

12.2 HÀM (Function) 12.2.1 Các đặc trưng hàm:

(196)

Kiểu liệu tham số Kiểu liệu gía trị hàm Ví dụ :

Hàm Sqrt(x): cho hai x Tên hàm Sqrt, tham số x nguyên hay thực cịn gía trị hàm kiểu thực, ví dụ Sqrt(4)=2.0

Hàm Chr(k): cho ký tự có mã k Tên hàm Chr, tham số k kiểu ngun cịn gía trị hàm kiểu ký tự, ví dụ Chr(65)=‘A’

Hàm Odd(k): cho True hay False tùy theo k lẻ hay chẵn Tên hàm Odd, tham số k kiểu nguyên gía trị hàm kiểu lơgic? ví dụ Odd(4)=False

Hàm Copy( St, k, n): cho chuỗi gồm n ký tự St tính từ vị trí k Tên hàm Copy, có ba tham số St kiểu chuỗi, k n kiểu nguyên, gía trị hàm kiểu chuỗi? ví dụ Copy(‘ABCD’, 2, 3) = ‘BCD’

Hàm Readkey : khơng có tham số, gía trị hàm kiểu ký tự, hàm nhận ký tự gõ từ bàn phím Tóm lại, hàm khơng có tham số có đến nhiều tham số, hàm ln trả gía trị duy nhất.

Các tham số luôn phải để cặp nháy đơn ( ), có nhiều tham số chúng phải phân cách dấu phẩy Mỗi gọi hàm (call) ta phải cho tham số gía trị cụ thể phù hợp với kiểu liệu tham số Ví dụ:

For k:=1 to 10 S := S+ Sqrt(k); y:= 3* Sqr(2) - Sin(pi/4) ;

Write( Chr(65) );

Cần phân biệt hai trạng thái tham số: trạng thái dùng để mô tả hàm trạng thái để gọi hàm Khi khai báo hàm, tham số mang tính tượng trưng, nên gọi tham số hình thức, gọi hàm, tham số phải biến hay gía trị cụ thể nên gọi tham số thực

Ví dụ, viết Sqrt(x) x tham số hình thức, đại diện cho gía trị Cịn gọi hàm y:=Sqrt(4); tham số thực

12.2.2 Khai báo hàm tự viết:

Tất hàm có sẵn Turbo Pascal gọi hàm chuẩn, chúng sử dụng mà không cần phải khai báo Tuy nhiên số lượng hàm chuẩn thường không đáp ứng yêu cầu đa dạng người sử dụng, thảo chương, ta thường phải tự xây dựng thêm hàm

Các hàm tự viết cần phải khai báo, theo cú pháp sau: Function Tênhàm(tênthamsố: kiểuthamsố : kiểugíatrị ; { Các khai báo dùng hàm }

(197)

Type Var Begin

{Các lệnh hàm} End;

Tên hàm tên tham số phải đặt theo quy tắc tên Thông thường tên hàm nên đặt cho gợi nhớ gía trị mà chứa Tên tham số mức khai báo mang tính tượng trưng nên gọi tham số hình thức.

Nếu có nhiều tham số hình thức thuộc kiểu liệu chúng viết phân cách dấu phẩy, ví dụ:

Function F(x, y : Integer) :Real;

ở hai tham số x y kiểu Integer

Nếu tham số có kiểu liệu khác phải khai báo riêng dùng dấu chấm phẩy để phân cách, ví dụ:

Function F( x: Integer ; y: Real): Real;

ở tham số x có kiểu Integer, cịn tham số y có kiểu Real

Như nói, hàm chương trình nên có đầ? đủ thành phần chương trình bình thường, tức có khai báo (Const), khai báo kiểu liệu (Type) khai báo biến (Var) Thân hàm lệnh đặt hai từ khóa Begin End , kết thúc dấu chấm phẩy ";" dấu chấm

Chú ý Trong hàm khơng có khai báo sử dụng thư viện chuẩn (Uses) 12.2.3 Cấu trúc chương trình Pascal có hàm tự viết:

Một chương trình có chứa hàm tự viết gọi chương trình chính, cịn hàm gọi chương trình Khai báo hàm tự viết phải để sau phần khai báo biến VAR trước BEGIN thân chương trình Tóm lại cấu trúc chương trình có chứa hàm tự viết sau:

PROGRAM TênCtchính;

Uses { khai báo dùng thư viện chuẩn} Const { khai báo hằng}

Type { khai báo kiểu liệu mới} Var { khai báo biến ctrình chính}

(198)

{ Các khai báo Const, Type, Var dùng hàm } Begin

{Các lệnh hàm} End;

BEGIN

{ Các lệnh chương trình chính} END.

12.2.4 Kiểu liệu tham số gía trị hàm:

Kiểu liệu kết qủa hàm không the?là mảng (array), ghi (record), tập hợp (set) hay tập tin (file)

Khai báo hàm sai:

Function F( x: Integer) : array[1 10] of Real;

Kiểu liệu kết qủa hàm kiểu đơn giản, chuỗi, hay trỏ Nếu kiểu liệt kê, đoạn hay chuỗi (trừ kiểu String) phải định nghĩa trước thơng qua từ khóa Type

Ví dụ, khai báo sau sai: Function F( x: Real) : String[20]; Function F( x: Real) : 31; Mà phải định nghĩa kiểu trước : Type

Str20= String[20]; Ngay = 31; khai báo:

Function F( x: Real) : Str20; Function F( x: Real) : Ngay;

Tuy nhiên, với kiểu String khai báo sau đúng: Function F( x: Real) : String;

Kiểu liệu tham số hàm thủ tục khơng hạn chế Nhưng kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng phải định nghĩa trước từ khóa Type

(199)

Function F( x : array[1 10] of Real) : Integer ; Function F( St : String[20]) : Char ;

Mà phải định nghĩa kiểu trước : Type

Kmang =Array[1 10] of Real; Kstr20= String[20];

rồi khai báo:

Function F( x : Kmang) : Integer ; Function F( St : Kstr20) : Char ;

Tuy nhiên, với kiểu String khai báo sau đúng: Function F( St : String) : Boolean ;

12.2.5 Các ví dụ :

Ví dụ 12.1: Nhập dãy số thực x1, x2, , xn, tính tổng :

Phân tích: Giả sử có hàm Canba(z) tính bậc ba z, tức :

khi đó, tổng S tính sau: S:=0;

For i:=1 to N S:=S + Canba( x[i] );

Ở hàm Canba tính N lần ứng với tham số thực sư?là gía trị x[i], i=1, , N

Vấn đề cịn lại phải viết hàm tính ba z Hàm có tên Canba, tham số z kiểu thực, gía trị hàm kiểu thực, xây dựng sau:

FUNCTION Canba( z: Real) :Real; { Hàm tính bậc ba z}

(200)

If z=0 then F:= 0;

If z>0 then F:= exp( 1/3*Ln(z) ); If z<0 then F:= - exp( 1/3*Ln(-z) ); Canba:=F ;

End;

Ðặt đoạn khai báo hàm vào trước phần thân chương trình chính, ta chương trình đầy đủ sau đây:

PROGRAM VID12_1; Var

x : Array[1 20] of Real; S : Real;

N, i : integer;

FUNCTION Canba( z: Real) :Real; { Hàm tính bậc ba z}

Var F: Real; Begin

If z=0 then F:= 0;

If z>0 then F:= exp( 1/3*Ln(z) ); If z<0 then F:= - exp( 1/3*Ln(-z) ); Canba:=F ;

End;

BEGIN { vào chương trình chính} Repeat

Write(‘ nhap N: ‘); Readln(N);

Dùng ngôn ngữ tự nhiên. Dùng lưu đồ-sơ đồ khối (flowchart). Dùng mã giả (pseudocode). <VD51.EXE nguồn VD52.PAS y<VD52.EXE nguồn VD52.PAS y<VD61.EXE> nguồn <VD61.PAS> y<VD62.EXE> y<VD63.EXE> nguồn <VD63.pas> y<VD64.EXE> nguồn <VD64.PAS> y<VD65.EXE> nguồn <VD65.PAS> y<VD66.EXE> nguồn <VD66.PAS> y<VD71.EXE> nguồn <VD71.PAS> kiểu nguyên thực ký tư lôgic kiểu chuỗi y<VD81.EXE> nguồn <VD81.PAS> y<VD82.EXE> nguồn <VD82.PAS> y<VD83.EXE> nguồn <VD83.PAS> hạy nguồn hạy nguồn hạy nguồn hạy nguồn y<VD88.EXE> nguồn <VD88.PAS> y<VD89.EXE> nguồn <VD89.PAS> y<VD810.EXE> nguồn <VD810.PAS> y<VD811.EXE> nguồn <VD811.PAS> y<VD91.EXE> nguồn <VD91.PAS> y<VD92.EXE> nguồn <VD92.PAS> y <VD93.EXE> nguồn <VD93.PAS> y<VD94.EXE> nguồn <VD94.PAS> y<VD96.EXE> nguồn <VD96.PAS> y<VD98.EXE> nguồn <VD98.PAS> y<VD99.EXE> nguồn <VD99.PAS> y<VD910.EXE> nguồn <VD910.PAS> y<VD911.EXE> nguồn <VD911.PAS> y <VD913.EXE> nguồn <VD913.PAS> y<VD914.EXE> nguồn <VD914.PAS> Chạy<VD101.EXE> nguồn <VD101.PAS> Chạy<VD103.EXE> nguồn <VD103.PAS> Chạy<VD105.EXE> nguồn <VD105.PAS> Chạy chương trình <VD106.EXE> Chép tập tin nguồn <VD106.PAS> Chạy<VD109.EXE> nguồn <VD109.PAS> y <VD11_1.EXE > nguồn <VD11_1.PAS> VD11_2.EXE nguồn <VD11_2.PAS> <VD11_3.EXE nguồn <VD11_3.PAS> <VD11_4.EXE nguồn <VD11_4.PAS> <VD11_5.EXE> nguồn <VD11_5.PAS> <VD11_6.EXE> nguồn <VD11_6.PAS> <VD11_7.EXE> nguồn <VD11_7.PAS> <VD11_12.EXE> nguồn <VD11_12.PAS> <VD11_13.EXE> nguồn <VD11_13.PAS> <VD11_14.EXE> nguồn <VD11_14.PAS> <VD11_15.EXE> nguồn <VD11_15.PAS>

Ngày đăng: 18/05/2021, 02:38

Xem thêm:

TỪ KHÓA LIÊN QUAN

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

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

TÀI LIỆU LIÊN QUAN

w