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 và BIỂU THỨC 7.2. CÂU LỆNH và 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” và “WRITELN” 7.4. KIỂU LIỆT KÊ và KIỂU ÐOẠN CON 7.5. CÂU HỎI TRẮC NGHIỆM 7.6. BÀI TẬP

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 (PROCEDURE) 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 13.2. PHẠM VI TÁC DỤNG CỦA CÁC KHAI BÁO 13.3. SỰ THAM KHẢO TRƯỚC và SỰ ÐỆ QUI 13.4. CÂU HỎI TRẮC NGHIỆM

13.5. BÀI TẬP 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 là một khái niệm cơ sở của Toán học và Tin học. Hiểu một cách đơn giản, thuật toán là một tập các hướng dẫn nhằm thực hiện một công việc nào đó. Ðối với việc giải quyết một vấn đề - bài toán thì thuật toán có thể hiểu là một tập hữu hạn các hướng dẫn rõ ràng để người giải toán có thể theo đó mà giải quyết được vấn đề. Như vậy, thuật toán là một phương pháp thể hiện lời giải của vấn đề - bài toán. Tại sao lại là "Thuật toán" ? Từ thuật toán (Algorithm) xuất phát từ tên một nhà toán học người Trung Á là Abu Abd - Allah ibn Musa al’Khwarizmi, thường gọi là al’Khwarizmi. Ông là tác giả một cuốn sách về số học, trong đó ông đã dùng phương pháp mô tả rất rõ ràng, mạch lạc cách giải những bài toán. Sau này, phương pháp mô tả cách giải toán của ông đã được xem là một chuẩn mực và được nhiều nhà toán học khác tuân theo. Từ algorithm ra đời dựa theo cách phiên âm tên của ông. Việc nghiên cứu về thuật toán có vai trò rất quan trọng trong khoa học máy tính vì máy tính chỉ giải quyết được vấn đề khi đã có hướng dẫn giải rõ ràng và đúng. Nếu hướng dẫn giải sai hoặc không rõ ràng thì máy tính không thể giải đúng được bài toán. Trong khoa học máy tính, thuật toán được định nghĩa là một dãy hữu hạn các bước không mập mờ và có thể thực thi được, quá trình hành động theo các bước này phải dừng và cho được kết quả như mong muốn. Số bước hữu hạn của thuật toán và tính chất dừng của nó được gọi chung là tính hữu hạn. Số bước hữu hạn của thuật toán là một tính chất khá hiển nhiên. Ta có thể tìm ở đâu một lời giải vấn đề - bài toán có vô số bước giải ? Tính "không mập mờ" và "có thể thực thi được" gọi chung là tính xác định. Giả sử khi nhận một 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 mới theo các bước sau : 1. Lập danh sách tất các học sinh trong lớp. 2. Sắp thứ tự danh sách học sinh.

3. Chọn học sinh đứng đầu danh sách để làm lớp trưởng. Khi nhận được thông báo này, giáo viên chắc chắn sẽ rất bối rối vì không hiểu là trong danh sách học sinh cần có những thông tin gì? Danh sách chỉ cần họ tên, hay cần thêm ngày tháng năm sinh? Có cần thêm điểm trung bình không? Yêu cầu 2 lại càng gây nhiều thắc mắc. Cần phải sắp xếp danh sách theo chiều tăng dần hoặc giảm dần ? Sắp theo chỉ tiêu gì ? Theo tên, theo ngày tháng năm sinh hay theo điểm trung bình chung, ...Giả sử sắp theo điểm trung bình thì nếu có hai học sinh cùng điểm trung bình thì học sinh nào sẽ sắp trước, học sinh nào sẽ sắp sau ? ... Hướng dẫn ở trên vi phạm tính chất "không mập mờ" của thuật toán. Nghĩa là, có quá nhiều thông tin còn thiếu để làm cho các bước 1,2 được hiểu đúng và hiểu theo một nghĩa duy nhất. Nếu sửa lại một chút ít thì hướng dẫn trên sẽ trở nên rõ ràng hơn rất nhiều và có thể gọi là một thuật toán chọn lớp trưởng ! 1. Lập danh sách tất các học sinh trong lớp theo hai thông tin: Họ và Tên; Ðiểm trung bình cuối năm. 2. 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ó cùng điểm trung bình sẽ có cùng hạng. 3. Nếu chỉ có một học sinh có hạng nhất thì chọn học sinh đó làm lớp trưởng. Trường hợp có nhiều học sinh đồng hạng nhất thì chọn học sinh có điểm môn Toán cao nhất làm lớp trưởng. Nếu vẫn còn nhiều hơn một học sinh đồng hạng nhất và có cùng điểm môn Toán cao nhất thì tiến hành bốc thăm. Ở đây chúng ta cần phân biệt mập mờ và sự chọn lựa có quyết định. Mập mờ là thiếu thông tin hoặc có nhiều chọn lựa nhưng không đủ điều kiện để quyết định. Còn chọn lựa có quyết định là hoàn toàn xác định duy nhất trong điều kiện cụ thể của vấn đề. Chẳng hạn trong vấn đề chọn lớp trưởng ở trên, bước 3 thể hiện một sự lựa chọn có quyết định. Tất nhiên, khi chưa lập danh sách, chưa xếp hạng theo điểm trung bình thì giáo viên không thể biết được sẽ chọn lớp trưởng theo cách nào. Nhưng khi đã sắp xong danh sách thì chỉ có một phương án chọn duy nhất. Tính "thực thi được" cũng là một tính chất khá hiển nhiên. Rõ ràng nếu trong "thuật toán" tồn tại một bước không thể thực thi được thì làm sao ta có được kết quả đúng như ý muốn? Tuy nhiên, cần phải hiểu là "thực thi được" xét trong điều kiện hiện tại của bài toán. Chẳng hạn, khi nói "lấy căn bậc hai của một số âm" là không thể thực thi được nếu miền xác định của bài toán là số thực, nhưng trong miền số phức thì thao tác "lấy căn bậc hai của một số âm" là hoàn toàn thực thi được. Tương tự, nếu ta chỉ đường cho một người đi xe máy đến một bưu điện nhưng con đường ta chỉ là đường cụt, đường cấm hoặc đường ngược chiều thì người đi không thể đi đến bưu điện được. Tính "dừng" là tính chất dễ bị vi phạm nhất, thường là do sai sót khi trình bày thuật toán. Dĩ nhiên, mọi thuật toán đều nhằm thực hiện một công việc nào đó nên sau một thời gian thi hành hữu hạn thì thuật toán phải cho chúng ta kết quả mong muốn. Khi không thỏa tính chất này, ta nói rằng "thuật toán" bị lặp vô tận hoặc bị quẩn. Ðể tính tổng các số nguyên dương lẻ trong khoảng từ 1 đến n ta có thuật toán sau : B1. Hỏi giá trị của n. B2. S = 0 B3. i = 1

B4. Nếu i = n+1 thì 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 2 vào i B7. Quay lại bước B4. B8. Tổng cần tìm chính là S. Ta chú ý đến bước B4. Ở đây ta muốn kết thúc thuật toán khi giá trị của i vượt quá n. Thay vì viết là "nếu i lớn hơn n" thì ta thay bằng điều kiện "nếu i bằng n+1" vì theo toán học "i = n+1" thì suy ra "i lớn hơn n". Nhưng điều kiện "i=n+1" không phải lúc nào cũng đạt được. Vì ban đầu i = 1 là số lẻ, sau mỗi bước, i được tăng thêm 2 nên i luôn là số lẻ. Nếu n là số chẵn thì n+1 là một số lẻ nên sau một số bước nhất định, i sẽ bằng n+1. Tuy nhiên, nếu n là một số lẻ thì n+1 là một số chẵn, do i là số lẻ nên dù có qua bao nhiêu bước đi chăng nữa, i vẫn khác n+1. Trong trường hợp đó, thuật toán trên sẽ bị quẩn. Tính "đúng" là một tính chất khá hiển nhiên nhưng là tính chất khó đạt tới nhất. Thực vậy, khi giải quyết một vấn đề-bài toán, ta luôn luôn mong muốn lời giải của mình sẽ cho kết quả đúng nhưng không phải lúc nào cũng đạt được. Mọi học sinh khi làm bài kiểm tra đều muốn bài làm của mình có đáp số đúng nhưng trên thực tế, trong lớp học chỉ có một số học sinh nhất định là có khả năng đưa ra lời giải đúng! Thuật toán thì cứng nhắc ! Các tính chất của thuật toán rất chặt chẽ và cứng nhắc. Nhưng điều đó cũng có nghĩa là khả năng giải quyết vấn đề theo kiểu thuật toán cũng bị giới hạn. Sau này, người ta đã "làm mềm" đi hai tính chất quan trọng của thuật toán là tính xác định và tính đúng để giải quyết những vấn đề phức tạp hơn mà với các tính chất chặt chẽ của thuật toán thì không thể giải quyết được. Ðó là các thuật toán đệ quy và thuật giải. Ta sẽ tìm hiểu về điều này ngay trong các mục 4 và 5 của chương này.

Các đặc trưng khác của thuật toán Bên cạnh 3 đặc trưng chính là xác định, hữu hạn và đúng, thuật toán còn có thêm 3 đặc trưng phụ khác. 1. Ðầu vào và đầu ra (input/output) : mọi thuật toán, dù có đơn giản đến mấy cũng phải nhận dữ liệu đầu vào, xử lý nó và cho ra kết quả cuối cùng. 2. Tính hiệu quả (effectiveness) : tính hiệu quả của thuật toán được đánh giá dựa trên một số tiêu chuẩn như khối lượng tính toán, không gian và thời gian khi thuật toán được thi hành. Tính hiệu quả của thuật toán là một yếu tố quyết định để đánh giá, chọn lựa cách giải quyết vấn đề-bài toán trên thực tế. Có rất nhiều phương pháp để đánh giá tính hiệu quả của thuật toán. Trong mục 3 của chương , ta sẽ tìm hiểu một tiêu chuẩn được dùng rộng rãi là độ phức tạp của thuật toán. 3. Tính tổng quát (generalliness) : thuật toán có tính tổng quát là thuật toán phải áp dụng được cho mọi trường hợp của bài toán chứ không phải chỉ áp dụng được cho một số trường hợp riêng lẻ nào đó. Chẳng hạn giải phương trình bậc hai sau đây bằng Delta đảm bảo được tính chất này vì nó luôn giải được với mọi giá trị số thực a,b,c bất kỳ. Tuy nhiên, không phải thuật toán nào cũng đảm

Tính giá trị D = b2-4ac 3. Trong thực tế.2.2.3.2.2. 2.3.3. Kết thúc thuật toán. 3.4. Yêu cầu đầu vào không đảm bảo. Giá trị của nghiệm kép là 3.4. Bài toán trong toán học có vẻ rất phức tạp nhưng một thể hiện trên thực tế lại rất dễ hiểu. Nếu D = 0 thì 3. 3. Nếu D > 0 thì 3. c 2. . Nếu D < 0 thì 3.bảo được tính tổng quát. Kết thúc thuật toán.3. Giá trị của hai nghiệm được tính theo công thức sau 3.2.2.1.2. Trường hợp a khác 0 thì 3.1. b.4.1.1. Yêu cầu cho biết giá trị của 3 hệ số a. Thuật toán giải phương trình bậc hai ax2+bx+c=0 (a?0) 1. 3. có lúc người ta chỉ xây dựng thuật toán cho một dạng đặc trưng của bài toán mà thôi. Phương trình có nghiệm kép x0 3. Phương trình có hai nghiệm phân biệt x1 và x2 3.2. Thuật toán tìm hộp có trọng lượng nặng nhất Vấn đề : Có n hộp có khối lượng khác nhau và một cái cân dĩa.3. Từ đó ta có thể dễ dàng suy ra cách giải bài toán tổng quát. Hãy chỉ ra cách cân để tìm được hộp có trọng lượng nặng nhất. Hãy xây dựng thuật toán tìm phần tử lớn nhất của A. Nếu a=0 thì 2. Kết thúc thuật toán 3. Vấn đề này là thể hiện của một bài toán tổng quát : Cho một tập hợp A hữu hạn và một thứ tự toàn phần trên A.3.1. Phương trình vô nghiệm. Kết thúc thuật toán. và cách giải quyết cũng đơn giản.

2. Nếu ai khác bi thì thực hiện các thao tác sau. i = 0 5. 3. Ngược lại nếu có từ hai hộp trở lên (n>1) 2. Thuật toán Euclid tìm ước số chung lớn nhất Bài toán : Cho hai số nguyên dương a và b. 5.1. 4.2. sang bước 5. 2. Kết thúc thuật toán. 5. nếu không còn hộp nào nữa. 1. 2. Trở lại bước 5.3. Giữ lại hộp nặng hơn. Tìm ước số chung lớn nhất của a và b. 3.2. Ngược lại bi = bi-1 . 3. Trở lại bước 3.bi-1 bi = bi-1 5.ai-1 ai = ai-1 6. 1. Chọn hai hộp bất kỳ và đặt lên bàn cân. Nếu chỉ có 1 hộp (n=1) thì 1. 5. Kết thúc. Hộp đó chính là hộp nặng nhất.1. cất hộp nhẹ hơn sang chỗ khác.2. Nếu còn hộp chưa được cân thực hiện các bước sau.1.1 Tăng i lên 1.1. Chọn một hộp bất kỳ và để lên dĩa cân còn trống. Yêu cầu cho biết giá trị của a. Nếu ai-1 > bi-1 thì ai = ai-1 . Giữ lại hộp nặng hơn. a0 = a 3. ngược lại qua bước 7. b. b0 = b 4. cất hộp nhẹ hơn sang chỗ khác. 2. Hộp còn lại trên cân chính là hộp nặng nhất. .

Dùng mã giả (pseudocode). Các thao tác còn lại không thuộc loại chọn lựa được xếp vào loại hành động. Lưu đồ . Tuy vậy. Ðể có thể truyền đạt thuật toán cho người khác hay chuyển thuật toán thành chương trình máy tính. Có 3 phương pháp biểu diễn thuật toán : 1. cách biểu diễn này thường dài dòng.1. Chẳng hạn : thao tác "nếu a = b thì thực hiện thao tác B2. . Ngôn ngữ tự nhiên Trong cách biểu diễn thuật toán theo ngôn ngữ tự nhiên. Ước số chung lớn nhất của a.. "Chọn một hộp bất kỳ và để lên dĩa cân còn trống. CÁC PHƯỢNG PHÁP BIỂU DIỄN THUẬT TOÁN Khi chứng minh hoặc giải một bài toán trong toán học.. 2.1. Phương pháp biểu diễn này không yêu cầu người viết thuật toán cũng như người đọc thuật toán phải nắm các quy tắc. 2. người ta sử dụng ngôn ngữ thường ngày để liệt kê các bước của thuật toán (Các ví dụ về thuật toán trong mục 1 của chương sử dụng ngôn ngữ tự nhiên). ta phải có phương pháp biểu diễn thuật toán. 1.2. . tương đương. "điều phải chứng minh"." là một thao tác thuộc loại hành động.sơ đồ khối Lưu đồ hay sơ đồ khối là một công cụ trực quan để diễn đạt các thuật toán. Ðể biểu diễn thuật toán theo sơ đồ khối.... "giả thuyết". ta nên viết các bước con lùi vào bên phải và đánh số bước theo quy tắc phân cấp như 1. Thao tác chọn lựa (decision) Thao tác chọn lựa được biểu diễn bằng một hình thoi. Phương pháp lưu đồ thường được dùng trong những thuật toán có tính rắc rối. không thể hiện rõ cấu trúc của thuật toán. 2.1.2. 2. 1. Gần như không có một quy tắc cố định nào trong việc thể hiện thuật toán bằng ngôn ngữ tự nhiên.1. ta thường dùng những ngôn từ toán học như : "ta có". và sử dụng những phép suy luận toán học như phép suy ra. Dùng ngôn ngữ tự nhiên. bên trong chứa biểu thức điều kiện.Thuật toán là một phương pháp thể hiện lời giải bài toán nên cũng phải tuân theo một số quy tắc nhất định. 2. Biểu diễn thuật toán bằng lưu đồ sẽ giúp người đọc theo dõi được sự phân cấp các trường hợp và quá trình xử lý của thuật toán. ta phải phân biệt hai loại thao tác.7.. khó theo dõi được quá trình xử lý. Dùng lưu đồ-sơ đồ khối (flowchart). đôi lúc gây hiểu lầm hoặc khó hiểu cho người đọc. . ngược lại thực hiện B4" là thao tác chọn lựa. b là ai . Chẳng hạn.1. . Bạn có thể tham khảo lại ba ví dụ trong mục 1 của chương để hiểu cách biểu diễn thuật toán theo ngôn ngữ tự nhiên. Một thao tác là thao tác chọn lựa dựa theo một điều kiện nào đó. 3. Tuy vậy. để dễ đọc.

một hướng ứng với điều kiện thỏa và một hướng ứng với điều kiện không thỏa.3. Trong ngôn ngữ lưu đồ. ta mặc định hiểu rằng quá trình thực hiện sẽ lần lượt đi từ bước trước đến bước sau (trừ khi có yêu cầu nhảy sang bước khác). Chẳng hạn trong hình dưới. trên cung có mũi tên để chỉ hướng thực hiện. Hai bước kế tiếp nhau được nối bằng một cung. ta dùng hai cung xuất phát từ các đỉnh hình thoi.2.Ðường đi (route) Khi dùng ngôn ngữ tự nhiên.2. bên trong chứa nội dung xử lý. 2. Từ thao tác chọn lựa có thể có đến hai hướng đi. Do vậy. do thể hiện các bước bằng hình vẽ và có thể đặt các hình vẽ này ở vị trí bất kỳ nên ta phải có phương pháp để thể hiện trình tự thực hiện các thao tác.2. trên mỗi cung có ký hiệu Ð/Ðúng/Y/Yes để chỉ hướng đi ứng với điều kiện thỏa và ký hiệu S/Sai/N/No để chỉ hướng đi ứng với điều kiện không thỏa. Thao tác xử lý (process) Thao tác xử lý được biểu diễn bằng một hình chữ nhật. B2. trình tự thực hiện sẽ là B1.2. . B3.

Ðiểm nối sang trang (off-page connector) .4. Bên trong điểm nối. Ðiểm cuối (terminator) Ðiểm cuối là điểm khởi đầu và kết thúc của thuật toán. Ðiểm nối (connector) Ðiểm nối được dùng để nối các phần khác nhau của một lưu đồ lại với nhau.2. bên trong có ghi chữ bắt đầu/start/begin hoặc kết thúc/end. Xem lưu đồ thuật toán giải phương trình bậc hai ở trên để thấy cách sử dụng của điểm cuối.2. được biểu diễn bằng hình ovan. ta đặt một ký hiệu để biết sự liên hệ giữa các điểm nối.2.5. 2. 2. Ðiểm cuối chỉ có cung đi ra (điểm khởi đầu) hoặc cung đi vào (điểm kết thúc).6.2.

Trong thực tế.3. Bên trong điểm nối sang trang ta cũng đặt một ký hiệu để biết được sự liên hệ giữa điểm nối của các trang. Chính vì lý do này. vừa giúp người cài đặt dễ dàng nắm bắt nội dung thuật toán. Mã giả Tuy sơ đồ khối thể hiện rõ quá trình xử lý và sự phân cấp các trường hợp của thuật toán nhưng lại cồng kềnh. nhưng điểm nối sang trang được dùng khi lưu đồ quá lớn. Dùng mã giả vừa tận dụng được các khái niệm trong ngôn ngữ lập trình. chúng ta chưa vội tìm hiểu về mã giả trong bài này (vì chúng ta chưa biết gì về ngôn ngữ lập trình!). lưu đồ chỉ phân biệt hai thao tác là rẽ nhánh (chọn lựa có điều kiện) và xử lý mà trong thực tế. Ở trên chỉ là các ký hiệu cơ bản và thường được dùng nhất. các thuật toán còn có thêm các thao tác lặp (Chúng ta sẽ tìm hiểu về thao tác lặp trong các bài sau). Khi thể hiện thuật toán bằng mã giả. rẽ nhánh và lặp. Hơn nữa. ta chỉ cần sử dụng các ký hiệu trên là đủ. mọi ngôn ngữ lập trình đều có những thao tác cơ bản là xử lý. Ðể mô tả một thuật toán nhỏ ta phải dùng một không gian rất lớn. phải vẽ trên nhiều trang. ta sẽ vay mượn các cú pháp của một ngôn ngữ lập trình nào đó để thể hiện thuật toán. Ðối với các thuật toán trong cuốn sách này. Tất nhiên là trong mã giả ta vẫn dùng một phần ngôn ngữ tự nhiên. Một khi đã vay mượn cú pháp và khái niệm của ngôn ngữ lập trình thì chắc chắn mã giả sẽ bị phụ thuộc vào ngôn ngữ lập trình đó. Sau khi tìm hiểu xong bài về thủ tục .Tương tự như điểm nối.hàm bạn sẽ hiểu mã giả là gì ! Một đoạn mã giả của thuật toán giải phương trình bậc hai if Delta > 0 then begin x1=(-b-sqrt(delta))/(2*a) x2=(-b+sqrt(delta))/(2*a) xuất kết quả : phương trình có hai nghiệm là x1 và x2 end else if delta = 0 then xuất kết quả : phương trình có nghiệm kép là -b/(2*a) . Tất nhiên. lưu đồ còn có nhiều ký hiệu khác nhưng thường chỉ dùng trong những lưu đồ lớn và phức tạp. 2.

chúng ta chỉ đề cập đến những đánh giá về mặt thời gian mà thôi. thường là trường hợp tốt nhất và xấu nhất. . nhiệm vụ còn lại của chúng ta là hiểu được các khái niệm liên quan đến độ phức tạp của thuật toán. mà các máy tính khác nhau thì có tốc độ rất khác nhau.. độ lớn của dữ liệu đầu vào thường được thể hiện bằng một con số nguyên n. chương trình vẫn có thể không sử dụng được đối với một dữ liệu đầu vào nào đó vì thời gian để cho ra kết quả là quá lâu hoặc sử dụng quá nhiều bộ nhớ (vượt quá khả năng đáp ứng của máy tính).). rút căn. khi nói đến độ phức tạp của thuật toán. thiết bị lưu trữ.. ta nhắc lại đôi điều về thuật toán này. Phân tích thuật toán là một công việc rất khó khăn. chi phí thực hiện thuật toán là một hàm số phụ thuộc vào dữ liệu đầu vào : T = f(input) Tuy vậy. Chính vì vậy. khi phân tích thuật toán. Trong phần này. . các thuật toán số học. người ta thường chỉ chú ý đến mối liên quan giữa độ lớn của dữ liệu đầu vào và chi phí. Chính vì vậy mà người ta chỉ xây dựng hàm T cho một số trường hợp đáng chú ý nhất của thuật toán. đòi hỏi phải có những hiểu biết sâu sắc về thuật toán và nhiều kiến thức toán học khác. Ðánh giá về thời gian của thuật toán không phải là xác định thời gian tuyệt đối (chạy thuật toán mất bao nhiêu giây.. của máy tính để thuật toán có thể làm việc. nhiều lúc không thể thực hiện được.else {trường hợp delta < 0 } xuất kết quả : phương trình vô nghiệm * Các từ in đậm là các từ khóa của ngôn ngữ Pascal 3.) để thực hiện thuật toán.. ... Việc xem xét về không gian của thuật toán phụ thuộc phần lớn vào cách tổ chức dữ liệu của thuật toán. Trong các thuật toán. Chẳng hạn : sắp xếp n con số nguyên. Ðây là công việc mà không phải bất cứ người nào cũng làm được.. chia. số phép tính cộng. Tuy nhiên. Ðây là một thuật toán tương đối đơn giản nên chúng ta có thể tiến hành phân tích được độ phức tạp.. ngay cả khi thuật toán đúng. Chúng ta trở lại ví dụ về thuật toán tìm hộp nặng nhất trong n hộp cho trước. nhân.. tìm con số lớn nhất trong n số. Trước khi phân tích độ phức tạp. Khi tiến hành phân tích thuật toán nghĩa là chúng ta tìm ra một đánh giá về thời gian và "không gian" cần thiết để thực hiện thuật toán. tìm kiếm. Một cách tổng quát.) để thực hiện thuật toán mà là xác định mối liên quan giữa dữ liệu đầu vào (input) của thuật toán và chi phí (số thao tác. người ta thể hiện chi phí thực hiện thuật toán bằng một hàm số phụ thuộc vào n : T = f(n) Việc xây dựng một hàm T tổng quát như trên trong mọi trường hợp của thuật toán là một việc rất khó khăn.trừ. tính điểm trung bình của n học sinh. bao nhiêu phút. Lúc này. Không gian ở đây được hiểu là các yêu cầu về bộ nhớ... Rất may mắn là các nhà toán học đã phân tích cho chúng ta độ phức tạp của hầu hết các thuật toán cơ sở (sắp xếp. nhưng lần này ta làm việc trên một thể hiện khác của vấn đề. Sở dĩ người ta không quan tâm đến thời gian tuyệt đối của thuật toán vì yếu tố này phụ thuộc vào tốc độ của máy tính. .. ĐỘ PHỨC TẠP CỦA THUẬT TOÁN Một chương trình máy tính thường được cài đặt dựa trên một thuật toán đúng để giải quyết bài toán hay vấn đề.

Giả sử dãy có n phần tử và ta đã xác định được phần tử lớn nhất là amax . nghĩa là an+1 £ amax thì amax vẫn là phần tử lớn nhất của dãy có n+1 phần tử. Trong thuật toán trên. 3.. . Hãy xây dựng thuật toán để tìm con số lớn nhất trong dãy a. Nếu dãy chỉ có 1 phần tử thì phần tử đó là số lớn nhất. 2.1. ngược lại sang bước 5. Nếu (ai > amax ) thì 3. Ghi nhớ amax = a1.1 và số lần "ghi nhớ" trong bước 3. a2. Nhận xét 1. để đơn giản. Ghi nhớ amax = ai .Tìm số lớn nhất trong một dãy số Bài toán : Cho một dãy số a có n phần tử a1. trường hợp xấu nhất xảy ra khi con số lớn nhất nằm ở cuối dãy (amax=an) và dãy được sắp xếp theo thứ tự tăng dần. Trường hợp ngược lại.1. Thuật toán 1. 2.1. Tăng i lên 1. 3.an. Trường hợp tốt nhất của thuật toán này xảy ra khi con số lớn nhất nằm đầu dãy (amax= a1). 4.Kết thúc. Phần tử lớn nhất dãy a chính là amax . .. Nếu bổ sung thêm phần tử thứ an+1 vào dãy mà an+1 > amax thì an+1 chính là phần tử lớn nhất của dãy có n+1 phần tử. Nếu (i £ n) thì thực hiện các bước sau. 3.1. ta chỉ xem chi phí là số lần so sánh ở bước 3.2. 5. i = 2.1. Trở lại bước 3.

Như vậy.Dựa theo sơ đồ khối của thuật toán. ai-1< ai (do định nghĩa dãy được sắp xếp tăng dần) nên điều kiện ai>amax ở bước 3. tổng chi phí của trường hợp này là T = f(n) = 2(n-1)=2n-2 Ðịnh nghĩa Cho hai hàm f và g có miền xác định trong tập số tự nhiên . ta cần phải dùng thêm n-1 phép "ghi nhớ" ở bước 3. Trường hợp tốt nhất : do amax = a1 suy ra.1 luôn thỏa.1 không bao giờ được thực hiện. T = f(n) = n-1 Trường hợp xấu nhất : Ta có : với mọi i>1.1.1 luôn được thực hiện và số lần thực hiện là n-1 (ứng với việc xét từ phần tử a2 đến an). ta nhận thấy rằng. Ta gọi đây là chi phí cố định hoặc bất biến của thuật toán.g(n) với mọi n > k . ai< amax.1.1. chi phí chung cho trường hợp này chính là chi phí cố định của bài toán. bước 3. Ta viết f(n) = O(g(n)) và nói f(n) có cấp cao nhất là g(n) khi tồn tại hằng số C và k sao cho | f(n) | £ C. Như vậy. Như vậy. Do đó. phép "ghi nhớ" ở bước 3. điều kiện ai>amax ở bước 3. với mọi i ³ 2.1. trong mọi trường hợp của bài toán.1 luôn được thực hiện.1 luôn không thỏa nên bước 3. ngoài chi phí chung là n-1 phép so sánh.

4. Một cách tổng quát. Theo định nghĩa ở trên. ta nhận thấy chi phí thấp nhất và lớn nhất của thuật toán tìm số lớn nhất đều bị chặn bởi O(n) (tồn tại hằng số C=10. Lớp giải được chia làm 2 lớp con. Cuối cùng là những bài toán thuộc loại NP chưa thể phân loại một cách chính xác là thuộc lớp bài toán có độ phức tạp đa thức hay có độ phức tạp không đa thức. Các độ phức tạp được sắp xếp theo thứ tự tăng dần. nếu hàm chi phí của thuật toán (xét trong một trường hợp nào đó) bị chặn bởi O(f(n)) thì ta nói rằng thuật toán có độ phức tạp là O(f(n)) trong trường hợp đó. Còn các bài toán có độ phức tạp lũy thừa O(an) hoặc giai thừa O(n!) là không thuộc lớp đa thức. Ðể có thể hình dung chính xác về độ phức tạp của thuật toán. 4. thuật toán tìm số lớn nhất có độ phức tạp trong trường hợp tốt nhất và xấu nhất đều là O(n).1. Các thuật toán thuộc . Tuy độ phức tạp chỉ là số đo về độ tăng của chi phí ứng với độ tăng của dữ liệu đầu vào nhưng nó cũng cho chúng ta có một đánh giá tương đối về thời gian thi hành thuật toán. Như vậy. PHÂN LOẠI VẤN ĐỀ .Tuy chi phí của thuật toán trong trường hợp tốt nhất và xấu nhất có thể nói lên nhiều điều nhưng vẫn chưa đưa ra được một hình dung tốt nhất về độ phức tạp của thuật toán. Chẳng hạn như các bài toán có độ phức tạp là O(nlog2n) được xem là các bài toán thuộc lớp đa thức vì nlog2n bị chặn bởi n2 ( nlog2n £ n2 với mọi n>0). k=1 để 2n-2 < 10n với mọi n>1).BÀI TOÁN Ðộ phức tạp của thuật toán chính là yếu tố cơ sở để phân loại vấn đề-bài toán. Nghĩa là một bài toán có độ phức tạp O(nk) sẽ phức tạp hơn bài toán có độ phức tạp O(n) hoặc O(logan). Người ta gọi các thuật toán có độ phức tạp O(n) là các thuật toán có độ phức tạp tuyến tính. Lớp con đầu tiên là các bài toán có độ phức tạp đa thức : nghĩa là bài toán có thể giải được bằng thuật toán có độ phức tạp đa thức (hay nói ngắn gọn : lớp đa thức) được xem là có lời giải thực tế. Lớp con thứ hai là những bài toán có độ phức tạp không phải là đa thức mà lời giải của nó được xem là thực tế chỉ cho những số liệu đầu vào có chọn lựa cẩn thận và tương đối nhỏ. phức tạp tuyến tính O(n) và logarith O(nlogan) đều là các bài toán thuộc lớp đa thức. Lớp bài toán có độ phức tạp đa thức Các bài toán thuộc lớp này có độ phức tạp là O(nk) hoặc nhỏ hơn O(nk). Một cách tổng quát. ta xét đến một yếu tố khác là độ tăng của chi phí khi độ lớn n của dữ liệu đầu vào tăng. Như vậy các bài toán có độ phức tạp hằng O(1). Sau đây là một số "thước đo" độ phức tạp của thuật toán được sử dụng rộng rãi. mọi bài toán đều có thể chia làm 2 lớp lớn là : giải được và không giải được.

4. Nếu là khách du lịch. người ta đã chứng minh được rằng số tập con của một tập hợp có n phần tử là 2n-1. chúng ta đã tốn 8 tỷ bước! Với số lượng bước như vậy.2. Nhưng máy tính thì không! Nó không thể thực thi những hướng dẫn không rõ ràng như vậy! Ðến đây. Với n vào khoảng 16. Dễ thấy rằng độ phức tạp của bài toán này cũng cỡ O(2n). ta hãy xem sự khác biệt về độ phức tạp của một thuật toán tự quyết và không tự quyết để giải quyết cho cùng một vấn đề.3. Trong mục 4. Lời giải tuy đã có nhưng khi thể hiện lời giải này bằng bất kỳ thuật toán nào thì phải tốn ít nhất 2n-1 bước. Lời giải thực tế được hiểu rằng là chi phí về mặt thời gian và không gian cho việc giải bài toán là chấp nhận được trong điều kiện hiện tại. hãy liệt kê tất cả các tập con khác trống của tập hợp này. Câu trả lời là. Chẳng hạn ta có một lời chỉ dẫn khi đi du lịch : "Khi đi hết khu vườn này. Lớp bài toán có độ phức tạp không đa thức Thật không may mắn. lập tức sẽ có một câu hỏi rằng "Tại sao lại đề cập đến những thuật toán có tính không tự quyết dù máy tính không thể thực hiện một thuật toán như vậy?". Tất cả đều dẫn đến bảo tàng lịch sử. 4. Có thể giải được hay không? Người ta đã ước tính thời gian cần thiết để giải một mật mã được mã hóa bằng khóa 128-bit là trên 1 triệu năm với điều kiện làm việc trên các siêu máy tính mạnh nhất hiện nay! Chính vì lý do này. nhiều bài toán thực sự có lời giải lại không thuộc lớp của bài toán đa thức. chúng ta sẽ có những hiểu biết về hạn chế của những thuật toán tự quyết thông thường. Lớp bài toán NP Chúng ta đều biết rằng tính xác định là một trong ba đặc tính quan trọng của thuật toán. chỉ thêm một phần tử nữa thôi. Bằng toán học. Nghĩa là mỗi bước của thuật toán phải được xác định duy nhất và có thể thực thi được. Như vậy bài toán này không thuộc lớp của bài toán đa thức. những "thuật toán" thuộc loại này rất hay được áp dụng.3 này. ta đưa ra một số trường hợp chọn lựa nhưng không cung cấp đầy đủ thông tin để "thuật toán" tự quyết định? Thật ra. Bất kỳ một bài toán nào không thuộc lớp này thì đều có chi phí rất lớn. bạn sẽ cảm thấy bình thường. số bước cần thiết chỉ khoảng vài chục ngàn là hoàn toàn giải được trên các máy tính hiện nay. Ví dụ : cho một tập hợp có n phần tử.lớp đa thức được xem là các bài toán có lời giải thực tế. ta tạm gọi các thuật toán thỏa mãn tính xác định là các thuật toán tự quyết. dù chạy trên một siêu máy tính cũng phải tốn một thời gian đáng kể! Các bài toán không thuộc lớp đa thức chỉ giải được với một độ lớn dữ liệu đầu vào nhất định. bạn hãy chọn một con đường mà bạn cảm thấy thích.". dù không dùng để giải bài toán nào đi nữa. Ðến đây. khi nghiên cứu về thuật toán không tự quyết. Vậy thì điều gì sẽ xảy ra nếu ta đưa ra một "thuật toán" có tính không tự quyết? Nghĩa là tại một bước của "thuật toán". một bài toán được xem là có thể giải được trên thực tế hay không phụ thuộc vào độ phức tạp của bài toán đó có phải là đa thức hay không. Nếu có sự phân chia trường hợp tại một bước thì thông tin tại bước đó phải đầy đủ để thuật toán có thể tự quyết định chọn lựa trường hợp nào. Bài toán người bán hàng . Nhưng khi số phần tử lên đến 32 thì ta đã tốn một số bước lên đến 4 tỷ. trong cuộc sống.

Một nhân viên phân phối hàng cho một công ty được giao nhiệm vụ phải giao hàng cho các đại lý của công ty, sau đó trở về công ty. Vấn đề của người nhân viên là làm sao đi giao hàng cho tất cả đại lý mà không tiêu quá số tiền đổ xăng mà công ty cấp cho mỗi ngày. Nói một cách khác, làm sao đừng đi quá một số lượng cây số nào đó. Một lời giải cổ điển cho bài toán này là liệt kê một cách có hệ thống từng con đường có thể đi, so sánh chiều dài mỗi con đường tìm được với chiều dài giới hạn cho đến lúc tìm được một con đường phù hợp hoặc đã xét hết tất cả các con đường có thể đi. Tuy nhiên, cách giải quyết này có độ phức tạp không phải đa thức. Bằng toán học, người ta đã chứng minh được rằng độ phức tạp của thuật toán này là O(n!). Như vậy, với số đại lý lớn thì thuật toán trên được xem là không thực tế. Bây giờ, chúng ta xem qua một thuật toán không tự quyết. 1. Chọn một con đường có thể và tính chiều dài của nó. 2. Nếu chiều dài này không lớn hơn giới hạn thì báo là thành công, ngược lại báo chọn lựa sai. Quan điểm của ta trong cách giải quyết này là nếu chọn sai thì là do lỗi của người chọn chứ không phải lỗi của thuật toán !. Theo thuật toán này thì chi phí để tính chiều dài của con đường được chọn sẽ 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 thì không liên quan đến số thành phố. Như vậy, chi phí của thuật toán này là một hàm có dạng T = an+b với n là số đại lý và a,b là các hằng số. Ta kết luận rằng, độ phức tạp của thuật toán này là O(n) hay độ phức tạp thuộc lớp đa thức. Như vậy, nếu dùng thuật toán tự quyết thì bài toán người bán hàng sẽ có độ phức tạp không thuộc lớp đa thức, còn nếu dùng thuật toán không tự quyết thì bài toán sẽ có độ phức tạp đa thức. Ðịnh nghĩa Một bài toán khi được giải bằng một thuật toán không tự quyết mà có độ phức tạp thuộc lớp đa thức thì được gọi là một bài toán đa thức không tự quyết hay viết tắt là bài toán NP. Theo định nghĩa trên thì bài toán người bán hàng là bài toán thuộc lớp NP. Cho đến nay người ta chưa chứng minh được rằng tồn tại hay không một thuật toán tự quyết có độ phức tạp đa thức cho bài toán người bán hàng rong. Vì vậy, bài toán này (là một bài toán NP) chưa thể xếp được vào lớp đa thức hay không đa thức. Do đó, lớp bài toán NP chưa thể phân loại là thuộc lớp đa thức hay không. Dĩ nhiên, lớp bài toán NP cũng chứa những bài toán thuộc lớp đa thức thực sự, bởi vì nếu một bài toán được giải bằng thuật toán tự quyết có độ phức tạp đa thức thì chắc chắn khi dùng thuật toán không tự quyết thì cũng sẽ có độ phức tạp đa thức.

5. THUẬT TOÁN ĐỆ QUY Thuật toán đệ quy là một trong những sự mở rộng cơ bản nhất của khái niệm thuật toán. Như đã biết, một thuật toán cần phải thỏa mãn 3 tính chất : – Tính hữu hạn. – Tính xác định – Tính đúng đắn Tuy nhiên, có những bài toán mà việc xây dựng một thuật toán với đầy đủ ba tính chất trên rất khó khăn. Trong khi đó, nếu ta xây dựng một thuật toán vi phạm một vài tính chất trên thì cách giải lại trở nên đơn giản hơn nhiều và có thể chấp nhận được. Một trong những trường hợp đó là thuật toán đệ quy. Tư tưởng giải bài toán bằng thuật toán đệ quy là đưa bài toán hiện tại về một bài toán cùng loại, cùng tính chất (hay nói một cách nôm na là đồng dạng) nhưng ở cấp độ thấp hơn (chẳng hạn : độ lớn dữ liệu nhập nhỏ hơn, giá trị cần tính toán nhỏ hơn, ....), và quá trình này tiếp tục cho đến lúc bài toán được đưa về một cấp độ mà tại đó có thể giải được. Từ kết quả ở cấp độ này, ta sẽ lần ngược để giải được bài toán ở cấp độ cao hơn cho đến lúc giải được bài toán ở cấp độ ban đầu. Trong toán học ta cũng thường gặp những định nghĩa về những đối tượng, những khái niệm dựa trên chính những đối tượng, khái niệm đó. Ðịnh nghĩa giai thừa Giai thừa của một số tự nhiên n, ký hiệu n! được định nghĩa là : 0! = 1 n! = (n-1)!n với mọi n>0

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

fn = fn-1 + fn-2 với mọi n>1 Theo toán học, những khái niệm được định nghĩa như vậy gọi là định nghĩa theo kiểu quy nạp. Chính vì vậy, đệ quy có sự liên hệ rất chặt chẽ với quy nạp toán học. Ðệ quy mạnh ở điểm nó có thể định nghĩa một tập vô hạn các đối tượng chỉ bằng một số hữu hạn các mệnh đề. Tuy nhiên, đặc tính này của đệ quy lại vi phạm tính xác định của thuật toán. Về nguyên tắc, một bước trong thuật toán phải được xác định ngay tại thời điểm bước đó được thi hành, nhưng với thuật toán đệ quy, bước thứ n không được xác định ngay trong ngữ cảnh của nó mà phải xác định thông qua một bước thấp hơn. Chẳng hạn, để tính được giá trị phần tử thứ 5 của dãy Fibonacci theo định nghĩa ở trên, ta phải tính f3+f4, nhưng ta chưa biết giá trị f3 và f4 tại thời điểm này. Ðến đây, ta phải lùi lại để tính f3 và f4. Ðể tính f3 ta lại phải lùi về để tính f2,...Tất nhiên, là quá trình tính lùi này phải dừng sau một số hữu hạn bước. Trong trường hợp này, điểm dừng chính là giá trị f1 và f0.

Ưu thế của thuật toán đệ quy là ta chỉ cần giải bài toán tại một số trường hợp đặc biệt nào đó, còn gọi là trường hợp dừng. Sau đó, các trường hợp khác của bài toán sẽ được xác định thông qua trường hợp đặc biệt này. Ðối với việc tính dãy Fibonacci, trường hợp dừng chính là giá trị của f0 và f1. Nói một cách chính xác, mọi thuật toán đệ quy đều gồm hai phần: Phần cơ sở Là các trường hợp không cần thực hiện lại thuật toán (hay không có yêu cầu gọi đệ quy). Nếu thuật toán đệ quy không có phần này thì sẽ dẫn đến bị lặp vô hạn và sinh lỗi khi thi hành. Vì lý do này mà người ta đôi lúc còn gọi phần cơ sở là trường hợp dừng. Phần đệ quy Là phần trong thuật toán có yêu cầu gọi đệ quy, tức là yêu cầu thực hiện lại thuật toán nhưng với một cấp độ dữ liệu thấp hơn.

6.THUẬT GIẢI 6.1. Mở rộng khái niệm thuật toán : thuật giải Trong quá trình nghiên cứu giải quyết các vấn đề - bài toán, người ta đã đưa ra những nhận xét như sau : Có nhiều bài toán cho đến nay vẫn chưa tìm ra một cách giải theo kiểu thuật toán và cũng không biết là có tồn tại thuật toán hay không. Có nhiều bài toán đã có thuật toán để giải nhưng không chấp nhận được vì thời gian giải theo thuật toán đó quá lớn hoặc các điều kiện cho thuật toán khó đáp ứng. Có những bài toán được giải theo những cách giải vi phạm thuật toán nhưng vẫn chấp nhận được.

Từ những nhận định trên, người ta thấy rằng cần phải có những đổi mới cho khái niệm thuật toán. Người ta đã mở rộng hai tiêu chuẩn của thuật toán : tính xác định và tính đúng đắn. Việc mở rộng tính xác định đối với thuật toán đã được thể hiện qua các giải thuật đệ quy và ngẫu nhiên. Tính đúng của thuật toán bây giờ không còn bắt buộc đối với một số cách giải bài toán, nhất là các cách giải gần đúng. Trong thực tiễn, có nhiều trường hợp người ta chấp nhận các cách giải thường cho kết quả tốt (nhưng không phải lúc nào cũng tốt) nhưng ít phức tạp và hiệu quả. Chẳng hạn nếu giải một bài toán bằng thuật toán tối ưu đòi hỏi máy tính thực hiện nhiều năm thì chúng ta có thể sẵn lòng chấp nhận một giải pháp gần tối ưu mà chỉ cần máy tính chạy trong vài ngày hoặc vài giờ. Các cách giải chấp nhận được nhưng không hoàn toàn đáp ứng đầy đủ các tiêu chuẩn của thuật toán thường được gọi là các thuật giải. Khái niệm mở rộng này của thuật toán đã mở rộng cửa cho chúng ta trong việc tìm kiếm phương pháp để giải quyết các bài toán được đặt ra. Một trong những thuật giải thường được đề cập đến và sử dụng trong khoa học trí tuệ nhân tạo là các cách giải theo kiểu Heuristic. 6.2. Thuật giải Heuristic Thuật giải Heuristic là một sự mở rộng khái niệm thuật toán. Nó thể hiện cách giải bài toán với các đặc tính sau : Thường tìm được lời giải tốt (nhưng không chắc là lời giải tốt nhất) Giải bài toán theo thuật giải Heuristic thường dễ dàng và nhanh chóng đưa ra kết quả hơn so với giải thuật tối ưu, vì vậy chi phí thấp hơn. Thuật giải Heuristic thường thể hiện khá tự nhiên, gần gũi với cách suy nghĩ và hành động của con người. Có nhiều phương pháp để xây dựng một thuật giải Heuristic, trong đó người ta thường dựa vào một số nguyên lý cơ sở như sau: Nguyên lý vét cạn thông minh : Trong một bài toán tìm kiếm nào đó, khi 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 hoặc thực hiện một kiểu dò tìm đặc biệt dựa vào đặc thù của bài toán để nhanh chóng tìm ra mục tiêu. Nguyên lý tham lam (Greedy): Lấy tiêu chuẩn tối ưu (trên phạm vi toàn cục) của bài toán để làm tiêu chuẩn chọn lựa hành động cho phạm vi cục bộ của từng bước (hay từng giai đoạn) trong quá trình tìm kiếm lời giải. Nguyên lý thứ tự : Thực hiện hành động dựa trên một cấu trúc thứ tự hợp lý của không gian khảo sát nhằm nhanh chóng đạt được một lời giải tốt. Hàm Heuristic: Trong việc xây dựng các thuật giải Heuristic, người ta thường dùng các hàm Heuristic. Ðó là các hàm đánh giá thô, giá trị của hàm phụ thuộc vào trạng thái hiện tại của bài toán tại mỗi bước giải.

yêu cầu bài toán hơi khác là làm sao tìm được hành trình ngắn nhất có thể được. thuật giải theo kiểu Heuristic đôi lúc lại đưa ra kết quả không tốt. khi đi trên n đoạn đường ngắn nhất thì cuối cùng ta sẽ có một hành trình ngắn nhất. Theo nguyên lý Greedy. Tuy nhiên. ta liệt kê tất cả quãng đường từ điểm xuất phát cho đến n đại lý rồi chọn đi theo con đường ngắn nhất.14 để thấy được quá trình chọn lựa. Với điều kiện trong hình 2.ứng dụng nguyên lý Greedy Bài toán : Chúng ta trở lại với bài toán người bán hàng. Bạn có thể quan sát hình 2. Nghĩa là liệt kê tất cả con đường từ đại lý ta đang đứng đến những đại lý chưa đi đến. Trong khi đó. chọn đi đến đại lý kế tiếp cũng theo nguyên tắc trên. Chọn con đường ngắn nhất. tính chiều dài của mỗi con đường đó rồi tìm con đường có chiều dài ngắn nhất. ta lấy tiêu chuẩn hành trình ngắn nhất của bài toán làm tiêu chuẩn chọn lựa cục bộ. Tư tưởng của thuật giải như sau : 1. Nhưng ở đây. Ðiều này không phải lúc nào cũng đúng. Tất nhiên. Từ điểm khởi đầu. cách giải này lại có độ phức tạp O(n!) (tổng số hành trình có thể có là n!). .14 thì thuật giải cho chúng ta một hành trình có chiều dài là 14 trong khi hành trình tối ưu là 13. Lặp lại quá trình này cho đến lúc không còn đại lý nào để đi. 2. ta có thể chọn được cách hành động tương đối hợp lý trong từng bước của thuật giải. Tất nhiên ta có thể giải bài toán này bằng cách liệt kê tất cả con đường có thể đi. Bài toán hành trình ngắn nhất . Do đó. thậm chí rất tệ như trường hợp ở hình 2. khi số đại lý tăng thì số con đường phải xét sẽ tăng lên rất nhanh.Nhờ giá trị này. Khi đã đi đến một đại lý. Kết quả của thuật giải Heuristic trong trường hợp này chỉ lệch 1 đơn vị so với kết quả tối ưu. Một cách giải đơn giản hơn nhiều và thường cho kết quả tương đối tốt là dùng một thuật giải Heuristic ứng dụng nguyên lý Greedy. độ phức tạp của thuật giải Heuristic này chỉ là O(n2).15. Ta hy vọng rằng.

.. P2. t5=5. tại thời điểm t=0. trên máy P3 ta gia công tiếp chi tiết J4. t2=5.. Mọi chi tiết đều có thể được gia công trên bất kỳ máy nào. Trong . Ðể gia công một công việc Ji trên một máy bất kỳ ta cần dùng một thời gian tương ứng là ti. P2. t6=1. Tại thời điểm t=2. P3 và 6 công việc với thời gian là t1=2.Pn. không thể bị ngắt ngang.Bài toán phân việc – ứng dụng của nguyên lý thứ tự Một công ty nhận được hợp đồng gia công m chi tiết máy J1. J5 trên P2 và J1 tại P3. . công việc J1 được hoàn thành.. Nhiệm vụ của công ty là phải làm sao gia công xong toàn bộ n chi tiết trong thời gian sớm nhất... t3=8. Một khi đã gia công một chi tiết trên một máy. Chúng ta xét bài toán trong trường hợp có 3 máy P1. Công ty có n máy gia công lần lượt là P1.Jm. t4=1. công việc sẽ tiếp tục cho đến lúc hoàn thành. Ta có một phương án phân công (L) như hình sau : Theo hình này. J2. ta tiến hành gia công chi tiết J2 trên máy P1.

1. ta sẽ có một phương án L* như sau : Rõ ràng phương án L* vừa thực hiện cũng chính là phương án tối ưu của trường hợp này vì thời gian hoàn thành là 8. Theo lược đồ này. Xây dựng một thuật toán để tìm một phương án tối ưu L0 cho bài toán này là một bài toán khó.. Ta hy vọng rằng một thuật giải Heuristic đơn giản như vậy sẽ là một thuật giải tối ưu.Sơ đồ phân việc theo hình ở trên được gọi là lược đồ GANTT. hai máy P1 và P2 vẫn đang thực hiện công việc đầu tiên mình. Nhưng tiếc thay.lúc đó. Nếu gọi T* là thời gian để gia công xong n chi tiết máy do thuật giải Heuristic đưa ra và To là thời gian tối ưu thì người ta đã chứng minh được rằng . đòi hỏi các kỹ thuật phức tạp mà chúng ta sẽ không đề cập ở đây.. 2. Bây giờ ta xét đến một thuật giải Heuristic rất đơn giản để giải bài toán này. ta thấy thời gian để hoàn thành toàn bộ 6 công việc là 12. đúng bằng thời gian của công việc J3. Các máy P1 và P2 có quá nhiều thời gian rảnh. Sắp xếp các công việc theo thứ tự giảm dần về thời gian gia công. Với tư tưởng như vậy. Lần lượt sắp xếp các việc theo thứ tự đó vào máy còn dư nhiều thời gian nhất. ta dễ dàng đưa ra được một trường hợp mà thuật giải Heuristic không đưa ra được kết quả tối ưu. Nhận xét một cách cảm tính ta thấy rằng phương án (L) vừa thực hiện là một phương án không tốt.

Một ô còn trống.j) là số ô cần di chuyển để đưa con số ở ô (i. Theo công thức này.j) là con số nằm ở ô (i. ta có thể xác lập được sai số mà chúng ta phải gánh chịu nếu dùng Heuristic thay vì tìm một lời giải tối ưu. Nhận xét rằng : tại mỗi thời điểm ta chỉ có tối đa 4 ô có thể di chuyển. đôi lúc người ta còn gọi đây là bài toán 9puzzle. Vấn đề là tại thời điểm đó. ta sẽ chọn lựa di chuyển ô nào? Chẳng hạn ở hình trên. Ta gọi V(i. nghĩa là sai số tối đa là 33%.ứng dụng của hàm Heuristic Bài toán Ta-canh đã từng là một trò chơi khá phổ biến. cách giải theo kiểu Heuristic lại khá đơn giản. Ta đặt d(i.Với kết quả này. dù trong trường hợp xấu nhất. Cho đến nay. mỗi ô có một số từ 1 đến 8. Tuy nhiên. Vấn đề là từ một trạng thái ban đầu bất kỳ.j). từ trên xuống dưới. Tuy nhiên. sai số tối đa mà ta phải chịu là T* ? 4/3To. và đó chính là sai số cực đại mà trường hợp ở trên đã gánh chịu. với ô trống V(i. Như vậy. ta nên di chuyển (1). khó tìm ra được những trường hợp mà sai số đúng bằng giá trị cực đại. Có 8 ô có số. Trò chơi bao gồm một hình vuông kích thước 3x3 ô. số máy càng lớn thì sai số càng lớn. Trong trường hợp n lớn thì 1/(3n) xem như bằng 0. người ta vẫn chưa tìm được một thuật toán chính xác. (2). tối ưu để giải bài toán này.j)=0. (6) hay (7)? Gọi T0 là trạng thái đích của bài toán và TK là trạng thái hiện tại. ô cuối dùng là ô trống. Bài toán Ta-canh . . làm sao đưa được về trạng thái cuối là trạng thái mà các ô được sắp lần lượt từ 1 đến 8 theo thứ tự từ trái sang phải. Thuật giải Heuristic trong trường hợp này rõ ràng đã cho chúng ta những lời giải tương đối tốt. Mỗi lần di chuyển chỉ được di chuyển một ô nằm cạnh ô trống về phía ô trống. Chẳng hạn với số máy = 2 (n=2) ta có .j) về đúng vị trí của nó ở trạng thái TO .

TKP ứng với con số ở trên. thì khi liên kết các chương trình con này lại sẽ tạo nên một chương trình lớn giải quyết được bài toán ban đầu?. hàm FK cần có nhiều sửa đổi. Ý tưởng về một chương trình có cấu trúc xuất phát từ suy nghĩ cho rằng có thể chia một bài toán lớn. Ông đặt tên cho ngôn ngữ của mình là Pascal để tưởng nhớ nhà toán học nổi tiếng người Pháp ở thế kỷ 17: Blaise Pascal. Ta lại thực hiện quá trình trên cho đến lúc đạt được trạng thái đích. giá trị hàm FK tại trạng thái TK sẽ là Từ trạng thái TK . Ứng với các trạng thái mới. ta có thể có 4 trạng thái mới như hình bên. phải ô trống hiện tại bị di chuyển.Hàm FK tại trạng thái TK bằng tổng của các d(i. đơn giản hơn. Tất nhiên. Dựa vào 4 con số này. ta sẽ chọn hướng đi có hàm FK tương ứng là nhỏ nhất.GIỚI THIỆU NGÔN NGỮ PASCAL PASCAL là ngôn ngữ lập trình cấp cao được giáo sư Niklaus Wirth ở trường đại học Kỹ thuật Zurich (Thụy sĩ) thiết kế và công bố vào năm 1971. Nếu mỗi bài toán nhỏ được giải quyết bằng một chương trình con. trái.j) không phải là ô trống. ứng với hình ban đầu. . Như vậy đối với trạng thái ở hình ban đầu. Pascal ngày càng được đông đảo người dùng đánh gía cao. và trở thành một trong các ngôn ngữ thảo chương phổ biến nhất hiện nay. TKTr . hàm FK sẽ có giá trị là FK = 2+1+3+1+0+1+2+2=12. dưới. Hàm FK trong ví dụ của chúng ta là một dạng hàm Heuristic. ta có tối đa 4 cách di chuyển. Thành công của ngôn ngữ Pascal là ở chỗ: nó là ngôn ngữ đầu tiên đưa ra và thể hiện được khái niệm lập trình có cấu trúc.FKP. Qua thời gian sử dụng.TKD . Một cách tổng quát.j) sao cho vị trí (i. phức tạp thành nhiều bài toán nhỏ. Sau khi đã di chuyển một ô. người đã sáng chế ra chiếc máy tính cơ khí đầu tiên của nhân loại. ta sẽ chọn di chuyển ô mang số (2) vì FKD là nhỏ nhất. ta cũng sẽ có các hàm FK tương ứng là FKT . bài toán chuyển về một trạng thái TK mới.Ta ký hiệu các trạng thái mới này lần lượt là TKT . I. để giải được bài toán này trong những tình huống khó. Chẳng hạn.FKD . trong trường hợp bằng nhau ta chọn ngẫu nhiên một trong số các đường đó. Với ví dụ.FKTr .

2. 5. mỗi hằng tham gia trong chương trình luôn có một kiểu dữ liệu xác định và chỉ nhận những gía trị có cùng kiểu dữ liệu với nó. Dưới đây là danh sách các từ khóa của Pascal : . β . <.. 1.CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ PASCAL 1.. γ .. Trong các ngôn ngữ thảo chương. c. Việc sử dụng các từ khóa đòi hỏi phải tuân thủ đúng quy tắc đề ra. từng khối một.. tên hàm. mệnh đề?còn được gọi là câu lệnh. Tính cấu trúc của ngôn ngữ Pascal còn thể hiện trong việc tổ chức các câu lệnh và tổ chức dữ liệu. Với văn phạm sáng sủa. Ngôn ngữ Pascal được xây dựng trên bộ ký tự cơ bản.. ký tự gạch nối ‘_’ và ký tự trắng ‘ ‘ ( space) Các chữ Ả rập: α .. 3. người thảo chương có thể lập trình để giải quyết riêng lẻ từng phần một. Ðến lượt mình. b.Z. II. ngôn ngữ Pascal cũng cho phép xây dựng các kiểu dữ liệu phức tạp hơn từ các kiểu dữ liệu đã có. người thảo chương có thể nhóm chúng lại với nhau và đặt giữa hai từ khóa Begin và End tạo thành một câu lệnh mới phức tạp hơn gọi là câu lệnh ghép... gồm: các chữ cái la tinh: A. Từ khóa ( key word ): Có một số từ được Pascal dành riêng cho việc xây dựng các câu lệnh. Nhiều ký tự nhóm lại với nhau tạo nên các từ. với khả năng đủ mạnh. z các chữ số :0. Các chương trình được soạn thảo bởi người thảo chương và được lưu trữ trên đĩa dưới dạng các tập tin. thảo chương bằng ngôn ngữ Pascal là một cơ hội tốt không chỉ rèn luyện tư duy mà còn rèn luyện tính cẩn thận và chính xác. Pascal được xem là ngôn ngữ thích hợp nhất để giảng dạy ở các trường phổ thông và đại học. hoặc có thể tổ chức để nhiều người cùng tham gia. 9 các ký hiệu đặc biệt: +. hai hay nhiều lệnh ghép lại có thể được nhóm lại để tạo thành một câu lệnh ghép phức tạp hơn nữa. .. 2.v. 4.) trùng với một trong các từ khóa. #. a. $.. -.Bằng cách chia một chương trình thành các chương trình con như vậy. Nhiều từ liên kết với nhau theo một qui tắc ngữ pháp nhất định (gọi là văn phạm) thì tạo nên các mệnh đề. [.... dễ hiểu. . không thuộc bộ ký tự của Pascal. Ngày nay. }. 6. C. tên hằng. Pascal là một ngôn ngữ không chỉ chặt chẽ về mặt cú pháp mà còn chặt chẽ về mặt dữ liệu. gọi là từ khóa. Một tập hợp các câu lệnh được sắp xếp theo một trật tự nhất định nhằm chỉ thị cho máy các thao tác phải thực hiện tạo thành một chương trình. các khai báo... {.. B. 7. Mỗi biến. mỗi người phụ trách một vài khối.. %. &. Từ các lệnh đã có. Ngôn ngữ Pascal được dùng để viết các chương trình ứng dụng trong nhiều lĩnh vực. Ðiều này buộc người lập trình phải nắm chắc cú pháp và luôn chú ý đến tính tương thích của các biểu thức về mặt kiểu dữ liệu. tên thủ tục. các phép tính. 8. Ðặc biệt khi phải thay đổi hay sửa chữa trong một khối thì điều đó sẽ ít ảnh hưởng đến các khối khác. ]. Tương tự như thế.v. =.Tập ký tự cơ bản Mỗi ngôn ngữ đều được xây dựng từ một tập ký tự nào đó.. và đặc biệt là người lập trình không được đặt một tên mới (tên biến. Chính vì thế. *.. /.

tính và in lên màn hình diện tích và chu vi của hình chữ nhật đó. So_luong. Mặc dù người thảo chương có thể đặt một tên mới trùng với một trong các tên chuẩn. 3. Delete. to. begin. const. các hằng. xor Các từ khóa có thể viết dưới dạng chữ hoa hay chữ thường hay xen kẽ chữ hoa với chữ thường đều được. Chiều dài của tên tối đa là 127 ký tự. Trong Pascal có một số tên đã được đặt sẵn rồi. label. Cos. type. downto. Ma-so là sai vì : 3ABC: bắt đầu bằng số Chu vi: có chứa ký tự trắng Ma-so : ký tự ‘-’ là dấu trừ chứ không phải gạch nối. uses. gọi là tên chuẩn. được sử dụng trong chương trình đều cần phải đặt tên. các thủ tục. of. for. inline. with. Byte. interface. nil. interrupt. Real. shl. array. div. Text. and. Eof. else. implementation.. if. i. repeat. Tên không phân biệt viết hoa hay viết thường. CẤU TRÚC CHUNG CỦA CHƯƠNG TRÌNH PASCAL 1. False. Writeln. Tên (identifier): Các biến. in. case. while. để đỡ nhầm lẫn. Char. True. song. Don_gia. end. then. chúng ta nên tránh điều này. var. Copy. or.. In. file. shr. Ví dụ viết begin hay Begin hay BEGIN là như nhau. kế đó có thể là chữ cái. do. còn gọi là định danh hay danh hiệu. record. string.1. Readln. III. packed. Tên không được đặt trùng với từ khóa. Boolean. In : trùng với từ khóa In Cũng giống như từ khóa. Chu vi. goto. các hàm. X1. unit. set. j . Thông thường tên nên đặt ngắn gọn và có tính gợi nhớ. Luong. Chuc_vu. Ví dụ mở đầu : Để có một cái nhìn tổng quan trước khi đi vào các vấn đề chi tiết của ngôn ngữ Pascal. . X2.. Arctan. procedure.absolute. Còn các tên: 3ABC. Bài toán và chương trình : Viết chương trình để nhập vào độ dài hai cạnh của một hình chữ nhật. Ví dụ viết X1 hay x1 cũng chỉ là một tên thôi. Dưới đây là ví dụ về các tên được đặt đúng: Delta. Các tên này do người thảo chương tự đặt và phải đảm bảo đúng quy tắc: tên phải bắt đầu bằng chữ cái. function. Integer. until. . xin hãy cùng xem chương trình sau: 1. not. chẳng hạn : Abs. hay dấu gạch nối ‘_’. forward. chữ số.. program. . Ord. mod. Longint.

Writeln (‘ Dien tich = ‘. End.b P = 2(a+b) Chương trình cụ thể như sau :OGRAM VIDU51. Writeln (‘ Chu vi = ‘. gọi diện tích và chu vi lần lượt là S và P thì công thức tính S và P là: S = a. { Tinh dien tich va chu vi hinh chu nhat } Uses CRT. Begin Clrscr. P:=2* (a+b). Write( ‘Nhap chieu dai : ‘). P : Real .2. Readln. Readln(b).PAS 1. Uses CRT . S. Readln(a). Chay <VD51. Giải thích các dòng trong chương trình : { Tinh dien tich va chu vi hinh chu nhat } Đây là lời chú giải. b. Var a. Write( ‘Nhap chieu rong : ‘). S:8:2). nêu lên mục đích của chương trình.EXE> Chép chương trình nguồn VD52. . S:=a*b. P:8:2).Nếu gọi hai cạnh của hình chữ nhật là a và b.

Khai báo 4 biến a. trong đó có 2 cột để in phần thập phân. Lệnh nhập dữ liệu cho biến b. P:8:2). Writeln(‘Dien tich = ‘. Lệnh tính diện tích S của hình chữ nhật. Lệnh in lên mà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. S:8:2). S. Readln. S := a* b. Chỉ thị S:8:2 ấn định dành 8 cột trên màn hình để in gía trị của S. b. Tương tự. P có kiểu dữ liệu là số thực (Real). P := 2*(a+b). Var a. Readln(a) .Khai báo sử dụng thư viện CRT của Turbo Pascal. Lệnh này in lên màn hình câu ‘Chu vi = ‘. Write( ‘Nhap chieu dai: ‘). Lệnh dừng màn hình để xem kết qủa chạy chương trình. lệnh tính chu vi P của hình chữ nhật. Lệnh này in lên màn hình câu ‘ Dien tich= ‘ . trong đó có 2 số phần lẻ. S. P : Real . kế đó in gía trị của chu vi P có cả thảy 8 chữ số. . Lệnh in lên mà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. b. Lệnh xóa màn hình. Lệnh nhập dữ liệu cho biến a. Readln(b). kế đó in gía trị của biến S. Write( ‘Nhap chieu rong : ‘). Writeln(‘ Chu vi = ‘. Begin Lệnh bắt đầu chương trình Clrscr .

00 Để kết thúc.EXE> ở cuối chương trình đó. Cấu trúc chung của chương trình Pascal : Chương trình là một dãy các câu lệnh chỉ thị cho máy các công việc phải thực hiện.End. hãy gõ phím Enter . {khai báo sử dụng thư viện chuẩn} Label . 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. Chạy minh họa chương trình : Để chạy chương trình mẫu nói trên.. 2. chẳng hạn gõ số 8 và Enter : Nhap chieu dai : 8 ↵ Màn hình hiện tiếp lời nhắc : Nhap chieu rong : Bạn nhập số đo chiều rộng.3. {khai báo nhãn} . Dấu hiệu kết thúc chương trình. Một chương trình Pasccal đầy đủ gồm ba phần chính : 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 .00 Chu vi = 28. trên màn hình hiện lên lời nhắc : Nhap chieu dai : Bạn cần nhập số đo chiều dài từ bàn phím. 1. hãy nhắp vào mục Chay<VD51. chẳng hạn gõ số 6 và Enter : Nhap chieu rong : 6 ↵ Chương trình sẽ tính toán và in kết qủa lên màn hình như sau : Dien tich = 48....

. Phần tiêu đề chiếm một dòng. Hình 5. Phần khai báo : Phần khai báo có nhiệm vụ giới thiệu và mô tả các đối tượng.2. khai báo hằng. khai báo biến.. đơn giản... Nó gồm khai báo sử dụng thư viện chuẩn.. giống như ta giới thiệu các thành viên trong một cuộc họp. a) Khai báo hằng và khai báo biến : . Khai báo nhãn (Label) chỉ dùng khi trong chương trình có sử dụng lệnh nhảy vô điều kiện GOTO. khai báo kiểu dữ liệu mới. Ví dụ : Program Btap1.. hoặc : Program Giai_pt_bac2. để rèn luyện kỹ năng lập trình có cấu trúc. và khai báo các chương trình con. 2. Vì thế. Đối với các bài toán nhỏ. khai báo nhãn. { khai báo biến} Function . chúng ta sẽ không dùng lệnh GOTO trong giáo trình này. {hàm và thủ tục } { Phần thân chương trình ↓ } Begin { Các lệnh } nd. các đại lượng sẽ tham gia trong chương trình.. trong khi có thể thay thế nó bằng các câu lệnh có cấu trúc của Pascal.. nó có thể không có cũng được. {khai báo hằng} Type . phức tạp.1. Các thủ tục và hàm được dùng khi có nhu cầu thiết kế các chương trình lớn. { khai báo các chương trình con} Procedure . việc sử dụng chương trình con là chưa cần thiết. {khai báo kiểu dữ liệu} Var .. còn gọi là phần đầu của chương trình.Const . Phần tiêu đề chương trình : Phần này bắt đầu bằng từ khóa Program. Nhược điểm của lệnh GOTO là làm mất tính cấu trúc của chương trình. cuối cùng kết thúc bằng dấu chấm phẩy ‘.’. Chi tiết về phần này sẽ được trình bày kỹ trong bài 12. Tùy theo yêu cầu cụ thể mà mỗi khai báo này có thể có hoặc không.1: Cấu trúc của chương trình Pascal 2.. Sau đây ta điểm qua vài nét về các khai báo thông dụng nhất. sau đó ít nhất là một khoảng trắng và một tên do người dùng tự đặt.

. ta có thể khai báo các biến thuộc kiểu dữ liệu này. 2. Biến và Hằng là những thành phần khó có thể thiếu được trong một chương trình. ta phải khai báo có sử dụng thư viện đó. Bây giờ có thể khai báo hai biến A và B có kiểu dữ liệu là kiểu Mang : Var A.v. Phần thân chương trình : .v. để khai báo hằng ta dùng từ khóa Const. GRAPH . kiểu lôgic. Muốn sử dụng các hàm hay thủ tục của thư viện nào. Var x.v. ví dụ: Const N=10 . Việc khai báo có tác dụng xác định tên và kiểu dữ liệu của biến hay hằng. b) Khai báo (định nghĩa) một kiểu dữ liệu mới: Ngoài các kiểu dữ liệu mà bản thân ngôn ngữ đã có sẵn như kiểu thực. k : Integer . kiểu ký tự. Khi đã định nghĩa một kiểu dữ liệu mới.. kiểu nguyên. gọi là các thư viện hay đơn vị chương trình ( Unit ). như : Crt. y : Real . Để khai báo biến ta dùng từ khóa Var.v. Ví dụ: do thủ tục Clrscr nằm trong thư viện CRT. chúng được dùng trong chương trình để lưu trữ các dữ liệu. Ví dụ. người dùng có thể tự xây dựng các kiểu dữ liệu mới phục vụ cho chương trình của mình.Biến là đại lượng có gía trị thay đổi được. ta khai báo : Uses CRT. i. Dos. thì phải khai báo : Uses CRT . c) Khai báo sử dụng thư viện chuẩn: Turbo Pascal có sẵn một số hàm và thủ tục chuẩn. nên nếu trong chương trình mà có dùng lệnh Clrscr. . Printer. B : Mang . còn Hằng là đại lượng có gía trị không đổi.10] of Real. ta định nghĩa một kiểu dữ liệu mới có tên là Mang : Type Mang = Array[1. chúng được phân thành từng nhóm theo chức năng mang các tên đặc trưng. Graph. Muốn sử dụng cả hai thư viện CRT và GRAPH. lời khai báo phải để ở ngay sau phần tiêu đề của chương trình theo cú pháp : Uses danhsáchthư viện .3. tham gia vào các biểu thức tính toán và các quá trình xử lý trong máy.. nhưng phải mô tả sau từ khóa TYPE.

Thân chương trình bắt đầu bằng từ khóa BEGIN và kết thúc bằng END. Maso : String[20]. ví dụ : Writeln(‘ Phuong trinh co hai nghiem la X1= ‘. nếu dài. Write(‘ Nhap diem Toan : ‘). PROGRAM VIDU52. Một lệnh. bắt buộc phải có. các điểm Toán.’. Var Ho_ten. Lý và điểm trung bình của sinh viên đó lên màn hình. Write(‘ Nhap diem Ly : ‘). chẳng hạn : Write(‘ Nhap A. Uses CRT.C) . { đặt mode C40 cho màn hình } TextBackGround(Green). (có dấu chấm ở cuối).B. Lý của một sinh viên. Thông thường mỗi dòng chỉ nên viết một lệnh để dễ đọc. Readln(Maso). xin giới thiệu chương trình cho phép nhập vào họ tên. B. Dtb : Real. Dtb:= (Toan+Ly) / 2. 3. Readln(Toan).Đây là phần chủ yếu nhất của một chương trình. thì có thể viết trên hai hay nhiều dòng. một dòng có thể viết nhiều lệnh miễn là có dấu ‘. Readln(Ho_ten). Mỗi lệnh phải kết thúc bằng dấu chấm phẩy ‘. tính điểm trung bình theo công thức : rồi in Họ tên. Ngược lại. X2:8:2) . các điểm Toán. mã số. { In lên màn hình các dữ liệu về sinh viên } TextMode(C40). C: ‘ ) . Write(‘ Nhap ma so : ‘).‘ va X2= ‘. X1:8:2. Toan. { đặt màu nền là Green } . Ly. Readln(Ly). Begin Write(‘ Nhap Ho va ten : ‘). dễ kiểm tra lỗi.’ để phân cách các lệnh đó. Readln(A. mã số. Ví dụ 2 : Để kết thúc phần này. Giữa khối BEGIN và END là các lệnh.

Readln. { đặt trả lại mode C80 cho màn hình} END. Writeln(‘Diem Ly : ‘.PAS Trong chương trình này có sử dụng bốn thủ tục đều thuộc thư viện CRT. Green. Writeln(‘Ma so : ‘. Toan:3:1). Cách nhập dữ liệu tương tự như ví dụ trước.. Writeln(‘ KET QUA THI CUA SINH VIEN:’). đó là : Clrscr : xóa màn hình TextMode(C40) và TextMode(C80) : chuyển màn hình sang chế độ bề ngang 40 cột (chữ to) hoặc 80 cột (chữ bình thường). điểm lý là 7 như dưới đây : Nhap Ho va ten : Nguyen Van An ↵ Nhap ma so : 1990064 ↵ Nhap diem Toan : 6 ↵ . Chẳng hạn ta nhập họ tên là Nguyen Van An. Writeln(‘Diem Toan : ‘. Red. TextBackGround(tênmàu) : đặt lại màu nền của màn hình. điểm toán là 6.EXE> ở cuối chương trình . Dtb:3:1). Tên màu có thể là một số từ 0 đến 15 hoặc có thể viết trực tiếp bằng tiếng Anh như : White.TextColor(Red). Chạy<VD52. Blue. TextMode(C80). Ho_ten). Ly:3:1). . TextColor(tênmàu) : đặt lại màu chữ trên màn hình. Writeln(‘Ho va ten : ‘.. Bạn có thể chạy minh họa chương trình này bằng cách nhắp chọn vào mục Chay<VD52. Maso).EXE> Chép chương trình nguồn VD52. Writeln(‘Diem Tbinh : ‘. mã số là 1990064. Black. { đặt màu chữ là Red} Clrscr .

tốc độ nhanh hơn. IV.0 Diem Tbinh : 6.0 Diem Ly : 7. Là sản phẩm của hãng Borland nổi tiếng. Turbo Pascal (viết tắt là TP) không ngừng được cải tiến. làm giảm bớt khối lượng phải lập trình.5 hay 7. Cung cấp các thư viện có sẵn nhiều hàm (function) và thủ tục (procedure) chuẩn mang lại cho người thảo chương nhiều công cụ hữu ích.1. Tuy nhiên. đến nay đã ra đời version 7. Giúp người thảo chương tìm các lỗi về văn phạm trong chương trình. Thực hiện hay chạy ( Run ) chương trình viết bằng ngôn ngữ Pascal. ở mức độ thảo chương căn bản.0.0. vì vềø cơ bản chúng giống với phiên bản 6. Các tập tin chính của Turbo Pascal: .Nhap diem Ly : 7 ↵ Chương trình sẽ tính điểm trung bình và in kết qủa như sau: KET QUA THI CUA SINH VIEN: Ho va ten : Nguyen Van An Ma so : 1990064 Diem Toan : 6.5 Hãy Enter để kết thúc và trở lại màn hình ban đầu. tiện lợi.5 hoặc 6.0 vì nó đơn giản mà đủ dùng.0. Người đọc có thể tự mình suy ra cách sử dụng Turbo Pascal 5. Để soạn và chạy được một chương trình như trên cần phải biết sử dụng phần mềm Turbo Pascal ( viết tắt là TP ). Khởi động Turbo Pascal: Trong phần này sẽ trình bày cách sử dụng Turbo Pascal 6. SỬ DỤNG PHẦN MỀM TURBO PASCAL 1. Giới thiệu Turbo Pascal: Turbo Pascal là một phần mềm có nhiệm vụ giúp người thảo chương soạn thảo và thực hiện các chương trình viết bằng ngôn ngữ Pascal. 2. 2. Các chức năng chính của Turbo Pascal là : Cung cấp một hệ soạn thảo văn bản cho phép người thảo chương soạn và sửa chương trình dễ dàng.0. Dịch (compiler) chương trình viết bằøng ngôn ngữ Pascal thành một chương trình viết dưới dạng mã máy. người ta vẫn thích dùng phiên bản 5. thích hợp với các máy có cấu hình chưa mạnh.

2. do máy của bạn chưa thiết lập đường dẫn đến thư mục TP.0.CHR : các tập tin tạo kiểu chữ Trong các tập tin màn hình đồ họa thì thông thường chỉ cần tập tin EGAVGA.BGI là đủ. vì ngày nay phần lớn màn hình đều có kiểu EGA hay VGA. tập tin chứa thư viện đồ họa *. 2.TPU.2 . Khởi động Turbo Pascal: a) Nếu bạn làm việc trên máy cá nhân hoặc trong một mạng có hệ điều hành là MSDOS thì sau khi khởi động máy xong: Trường hợp dễ nhất là máy của bạn đã thiết lập sẵn đường dẫn đến thư mục TP chứa Turbo Pascal thì bạn chỉ cần gõ một lệnh : TURBO ↵ Trên màn hình sẽ hiện ra cửa sổ soạn thảo như hình 5.HLP Thông thường các tập tin này được để trong một thư mục riêng có tên là TP. Nếu muốn xem hướng dẫn sử dụng Turbo Pascal thì cần có thêm tập tin TURBO. Nếu gõ lệnh trên mà cửa sổ Turbo Pascal không hiện ra. chỉ cần hai tập tin sau là đủ : TURBO. Dưới đây ta giả thiết thư mục chứa Turbo Pascal là TP nằm ngay tại gốc của đĩa cứng C hay đĩa mềm A.Để chạy được Turbo Pascal 6. hay TP6. trường hợp này bạn phải di chuyển vào thư mục TP bằng lệnh : CD \TP↵ rồi sau đó gõ tiếp : TURBO ↵ .EXE : tập tin chính của TP TURBO.BGI : các tập tin màn hình đồ họa *.TPL : tập tin chứa các thư viện của TP Nếu muốn vẽ đồ họa thì phải có thêm các tập tin: GRAPH.

A:\TP\TURBO. Trường hợp không có sẵn một Shortcut chứa Turbo Pascal: hãy chọn lệnh Start.EXE. khi chọn lệnh File. Cửa sổ Turbo Pascal và cách chọn lệnh : Trong cửa sổ này. Một thực đơn con của lệnh vừa chọn hiện ra.b) Nếu bạn làm việc trên máy cá nhân hoặc trong một mạng có hệ điều hành là WINDOWS 95 hoặc mới hơn. rồi gõ vào đường dẫn đầy đủ của tập tin TURBO. gọi là thực đơn dọc. Lúc này. Muốn chọn lệnh nào thì gõ các phím mũi tên ← . ta được thực đơn con như sau: . chẳng hạn: C:\TP\TURBO. thì sau khi khởi động WINDOWS 95 : Trường hợp có sẵn một Shortcut chứa Turbo Pascal ở trên Desktop : hãy nhắp left mouse hai lần liên tiếp vào biểu tượng Shortcut của Turbo Pascal. có thể tiến hành theo một trong hai cách: Cách một: Gõ phím F10. → dời khung sáng đến lệnh đó rồi Enter. 2. Ví dụ. chọn tiếp lệnh Run.3. liệt kê chín nhóm lệnh chính của TP. nếu khởi động TP từ đĩa A. nếu khởi động TP từ đĩa C.EXE ↵ . dòng trên cùng là một thực đơn ngang. trên thực đơn xuất hiện một khung sáng (thường là màu xanh).EXE ↵ . Muốn chọn một lệnh trong thực đơn này.

Các bước thực hiện một chương trình Pascal: Để soạn và chạy một chương trình Pascal trong Turbo Pascal. Ví dụ.v. ↓ dời khung sáng đến lệnh đó rồi Enter. Đầøu của vùng này hiện tên của tập tin đang soạn. Thoát khỏi Turbo Pascal: Chọn lệnh File trong thực đơn ngang. và nếu người thảo chương chưa đặt tên thì TP sẽ đặt giùm một tên mặc nhiên là NONAME00. 2. phím F10 để khởi động thực đơn. thay vì phải chọn nó từ trong thực đơn. Cách hai: dùng phím "nóng": Có một số lệnh được gán cho những phím đặc biệt gọi là phím "nóng". nên tiến hành các bước như sau: Bước 1: Khởi động Turbo Pascal .v. tương tự. cũng có thể chọn một lệnh trong thực đơn ngang bằng cách gõ đồng thời phím Alt với phím chữ cái đầu tiên của tên lệnh muốn chọn.. lệnh Save : F2. Dưới thực đơn ngang là vùng soạn thảo dùng để gõ chương trình vào.4. thay vì chọn lệnh Open thì gõ phím F3. phím F3 dùng để mở xem một tập tin. như phím F1 để xem hướng dẫn. ví dụ lệnh Open: F3. hãy gõ các phím mũi tên .PAS. phím F2 để lưu tập tin lên đĩa.Để chọn một lệnh trong thực đơn dọc. chọn tiếp lệnh Exit trong thực đơn dọc (viết gọn là chọn lệnh File/ Exit).. Ví dụ.. Khi không muốn chọn lệnh nào thì gõ phím ESC để trở về vùng soạn thảo. Nếu làm việc trong TP 5. Dòng cuối cùng tóm tắt một số phím " nóng" hay dùng. Hoặc gõ cặp phím nóng Alt-X 3. Ngoài cách dùng phím F10 nói trên.. Để thực hiện những lệnh này. muốn chọn lệnh File thì gõ đồng thời hai phím Alt và F (viết tắt là Alt-F). thay vì chọn lệnh Save thì gõ phím F2. ta chỉ cần gõ phím nóng tương ứng với nó.5 thì chọn lệnh File/ Quit. lệnh Exit : Alt-X. muốn chọn lệnh Compile thì gõ AltC.

PAS sẽ được lưu trong thư mục hiện thời. ví dụ : Khi đó tên BTAP1.5 thì chọn lệnh File/ Load) hoặc gõ phím F3.PAS sẽ hiện ra ở đầu vùng soạn thảo. sau đó gõ tên tập tin (không cầøn gõ phần đuôi) vào trong khung vừa hiện ra. Đuôi PAS được TP tự động gắn thêm vào. Bạn hãy gõ chương trình mẫu sau vào vùng soạn thảo của Turbo Pascal : .Bước 2: Đặt tên cho tập tin sẽ soạn : Chọn lệnh File/ Open (nếu làm việc trong TP 5. Tập tin BTAP1. ví dụ : Bước 3: Soạn thảo ( gõ ) chương trình .PAS được lưu lên đĩa A thì khi nhập tên tập tin ta nên gõ thêm tên ổ đĩa ở đằng trước. Nếu muốn tập tin BTAP1.

ta cần nhập một bộ dữ liệu cụ thể và kiểm tra xem kết qủa in lên màn hình có đúng không. Bước 6: Chạy thử chương trình: Chọn lệnh Run/ Run hoặc gõ phím nóng Ctrl-F9 (viết tắt là ^F9). Mỗi lần chạy thử. chiều rộng 7. như sau : Nhap chieu dai : 10 ↵ Nhap chieu rong : 7 ↵ Chương trình sẽ in kết qủa lên màn hình : . đồøng thời con trỏ đặt ở vị trí có lỗi. Cần phải chạy thử một số lần ứng với các bộ dữ liệu khác nhau.Bước 4: Dịch và sửa lỗi: Chọn lệnh Compile/ Compile (hoặc gõ cặp phím Alt-F9. cần phải sửa lại thuật toán của chương trình. nếu có một lần chạy thử cho kết qủa sai thì chương trình chưa ổn. Ví dụ : Để chạy thử chương trình mẫu trên. nếu gặp lỗi thì dừng và hiện thông báo lỗi màu đỏ ở đầu màn hình. rồi gõ AltF9 để dịch và sửa lỗi tiếp cho đến khi hết lỗi. Máy sẽ dịch chương trình sang mã máy. hãy gõ ^F9 và nhập vào chiều dài 10. Dấu hiệu cho biết việc dịch đã xong là màn hình xuất hiện 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 hoặc gõ phím F2. Nếu kết qủa các lần chạy thử đều đúng thì chương trình đã hoàn thành. Người thảo chương phải tự mình sửa lỗi. Ngược lại. hay đơn giản chỉ gõ phím F9 cũng được).

Nội dung tập tin này sẽ được đưa lên màn hình cho chúng ta xem. Trong khung hiện ra .PAS ↵ (hoặc A:*. Mở xem một chương trình cũ : Muốn xem lại một chương trình đã có trên đĩa.. Bước 7: Nếu chương trình chạy đúng thì gõ phím F2 để lưu nó lên đĩa lần cuối. 5. Việc chạy thử với bộ dữ liệu khác.PAS Từ nay. 4. chạy thử.00 Hãy Enter để trở lại màn hình soạn thảo. nhớ gõ thêm tên đĩa A: ở đằng trước: Name: A:\BTAP. gõ vào *. . Bây giờ có thể lặp lại từ bước 2 để soạn một chương trình mới.PAS ↵ nếu tập tin nằm trên đĩa A).PAS sẽ được ghi lên đĩa A. Chú ý rằng trong TP từ 6.). mỗi khi gõ phím F2 hoặc chọn lệnh File/ Save. hãy chọn lệnh File/ Open hoặc gõ phím F3. có thể làm như sau: Chọn lệnh File/ Save as (nếu làm việc trong TP 5. .v.0 trở lên. trong khung có tiêu đều là Name. từ hộp File về lại hộp Name : gõ Shift_Tab .v. xin dành cho độc giả.5 thì chọn lệnh File/ Write to. để đưa con trỏ từ hộp Name ở trên xuống hộp Files ở dưới.4) : Dùng các phím mũi tên ← . tập tin BTAP1. sửa. hãy gõ tên tập tin vào. Lưu tập tin sang đĩa khác : Khi cần ghi tập tin đang soạn từ đĩa cứng sang đĩa A..→ để di chuyển và đặt thanh sáng vào tên muốn chọn rồi Enter.00 Chu vi = 34.Dien tich = 70.↓ . dùng phím Tab. một danh sách các tập tin có đuôi PAS sẽ hiện ra trong khung phía dưới cho ta chọn ( hình 5. .

gõ ^K_K.→ kéo vùng sáng phủ đến cuối khối. a) Đánh dấu khối: Đưa con trỏ về đầu khối Một tay đè phím Shift. Ký tự đầu tiên của khối gọi là đầu khối. Thao tác trên khối: Ta gọi khối là một đoạn văn bản gồm một hay nhiềøu dòng liên tiếp.1. sau đó đưa con trỏ về cuối khối.2. Một vài kỹ thuật trong soạn thảo : 6. Readln(a. b) Sao chép khối: Đánh dấu khối cần sao chép Đưa con 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 con 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 hoặc hiện lại khối đã đánh dấu : lệnh ^K_H 6. trong khi tay kia gõ các phím mũi tên ← . Nếu làm việc trong TP 5.6. ký tự cuối cùng của khối gọi là cuối khối.↓ . gõ ^K_B.5 thì đánh dấu khối bằng cách: đưa con trỏ vềø đầu khối. (Cách gõ ^K_B: một tay đè phím Ctrl trong khi tay kia gõ liên tiếp hai phím K và B). . Dưới đây là một khối gồm hai dòng lệnh: Write(‘ Nhap chieu dai va chieu rong hinh chu nhat: ‘).b). Các phím lệnh soạn thảo thông dụng: Phím Home : đưa con trỏ về đầu dòng hiện thời Phím End : đưa con trỏ về cuối dòng hiện thời .

Nếu con trỏ đang đứng ở đầu của dòng dưới mà gõ phím Back Space thì sẽ nối dòng dưới vào cuối dòng trên. Cặp phím Ctrl_Y : xóa toàn bộ dòng hiện thời và đôn các dòng ở dưới lên. c) trong việc tổ chức chương trình. Khi con trỏ đang đứng ở đầøu một dòng mà Enter thì sẽ tạo ra một dòng trống ngay tại vị trí đó. hãy chọn một câu trả lời thích hợp nhất: Câu 1: Tính cấu trúc của ngôn ngữ Pascal được thể hiện : a) trong việc tổ chức các dữ dtệu. CÂU HỎI TRẮC NGHIỆM Trong các câu hỏi dưới đây. Chú ý: Trong Turbo Pascal không dùng chữ có dấu tiếng Việt. (Trong TP 5. Khi soạn trong Turbo Pascal xin hãy bỏ dấu đi. Câu 2: Ðiều gì làm cho Pacal được đánh gía cao và trở thành một trong những ngôn ngữ thảo chương phổ biến nhất hiện nay ? a) Nó là ngôn ngữ đầu tiên đưa ra và thể hiện được khái niệm lập trình có cấu trúc. Nếu chế độ viết chèn là tắt thì mỗi khi gõ phím Enter. b) trong việc tổ chức các câu lệnh.. chế độ viết chèn hay tắt viết chèn được nhận biết bằng việc chữ Insert có hiện ra hay không hiện ra ở đầu của cửa sổ soạn thảo). b). d)ở cả ba mục a). Các phím ← .↓ .Phím Delete : xóa ký tự ngay tại vị trí con trỏ. do đó toàn bộ các chữ đứng sau con trỏ (nếu có) sẽ bị cắt xuống dòng dưới. con trỏ sẽ về đầu của dòng hiện thời (dòng đang chứa con trỏ). dễ hiểu. b) Nó là một ngôn ngữ chặt chẽ cả về mặt cú pháp và về mặt dữ liệu. Nhóm phím Ctrl_Q_Y : xóa từ vị trí con trỏ đến cuối dòng. Phím Back Space ( là phím mũi tên ← nằm ngay phía trên phím Enter) : xóa ký tự bên trái con trỏ. Phím Enter : Trong chế độ viết chèn: gõ Enter có tác dụng đưa con trỏ xuống đầu dòng dưới. Tuy nhiên trong các chương trình mẫu ở giáo trình này thỉnh thoảng vẫn viết những chữ có dấu là để dễ đọc. c) . . Nếu con trỏ đang đứng ở cuối của dòng trên mà gõ phím Delete thì sẽ nối dòng dưới vào cuối dòng trên. tắt chế độ viết chèn. chứ không xuống dòng dưới nữa. Phím Insert : mở hoặc tắt chế độ viết chèn. . con trỏ màn hình có dạng bình thường.→ : dời con trỏ theo hướng mũi tên.5. con trỏ có kích thước lớn gấp 4 lần bình thường. Ở chế độ viết chèn. V.

d đều thuộc bộ ký tự cơ bản của Pascal. Var. b) CLRSR. b) Ngaysinh. b) END. Câu 6: Chọn câu Sai : trong một chương trình Pascal. có khả năng đủ mạnh. lệnh nào có tác dụng xóa màn hình : a) CLRSSR . c) . begin. c) phần đầu chương trình.. x2 . Câu 7: Dấu hiệu kết thúc chương trình Pascal là : a) End. c) end. b) phần khai báo biến. g . b) Xx1 .c) Nó là ngôn ngữ có văn phạm sáng sủa. d)X[1]. d)phần khai báo hằng . Câu 3: Khẳng định nào đúng: a) VAR . X2. Câu 4: Tên nào đặt Sai quy định của Pascal: a) Giai_Ptrinh_Bac_2. end là các từ khóa của Pascal được khái niệm lập trình có cấu trúc. var là các từ khóa khác nhau của Pascal . b). d)Cả ba điều nêu trong các mục a). có thể không có : a) phần thân chương trình . b . d)VAR. Câu 8: Trong Pascal. dễ hiểu. . X_234. d) End ! . d)Sv2000 . c) CONST . c) Var. b) Các ký hiệu a . X-2 . Integer. Real là các từ khóa của Pascal. BEGIN. Câu 5: Mục nào có các Tên đều đặt đúng quy định của Pascal: a) x1 . c) Noi sinh. vaR.

3.1.v. gõ phím F1. 6. Câu 9: Trong Pascal. BÀI TẬP Câu 1. nếu muốn dùng lệnh xóa màn hình Clrscr thì phải khai báo thế nào ở ngay sau phần tiêu đề chương trình : a) Uses CRT . là chữ. mà thuật ngữ tin học gọi chung là dữ liệu. Soạn và chạy thử chương trình trong ví dụ mở đầu ở mục 5. Câu 10: Khẳng định nào Sai: trong Turbo Pascal. Câu 4. gõ phím ^F9 hoặc chọn lệnh Run / Run . Khi một biến được khai báo .1 Câu 2. mỗi kiểu dữ liệu là một tập hợp các gía trị mà một biến thuộc kiểu đó có thể nhận.1. gõ phím Alt_F9. hiệu x-y và tích x*y của hai số đó. Viết chương trình nhập vào số đo một cạnh và diện tích của hình chữ nhật. d) không khai báo gì ca .3.1 Khái niệm : Chức năng của máy điện toán là xử lý các thông tin.3 Câu 3. d) Clrscr . b) để mở một tập tin cũ. gõ phím F2 hoặc chọn lệnh File / Save . Viết chương trình nhập hai số bất kỳ x và y. hay F9 .v. Tính đa dạng của dữ liệu đòi hỏi phải tổ chức và phân phối bộ nhớ thích hợp để lưu trữ và xử lý tốt các dữ liệu. tính và in lên màn hình tổng x+y. âm thanh. tính cạnh kia và chu vi của hình chữ nhật. Ngôn ngữ thảo chương chia các dữ liệu thành từng nhóm riêng trên đó xây dựng một số phép toán tạo nên các kiểu dữ liệu khác nhau. Soạn và chạy thử chương trình trong ví dụ 2 ở mục 5. c) use CRT . c) để tìm lỗi cú pháp của chương trình.c) Clrscl. VI. a) để lưu chương trình lên đĩa. d) để chạy chương trình. có thể là hình ảnh.. Các thông tin được nhập và lưu trữ trong bộ nhớ của máy dưới các dạng khác nhau: có thể là số. Viết chương trình in lên màn hình hai câu sau : " Chao cac ban ! " " Rat vui đuoc lam quen voi cac ban ! " Câu 5. KHÁI NIỆM VỀ KIỂU DỮ LIỆU 6. b) USES Graph.

kiểu thực. < -1 < 0 < 1 < . 2147483647 Số byte 1 1 2 2 4 . nhưng cũng có thể xem là một mảng các gía trị kiểu ký tự.. kiểu lô gic chỉ có hai gía trị False. kiểu ký tự . Tất cả các kiểu dữ liệu đơn giản còn lại : nguyên.2 Phân loại kiểu dữ liệu : Các kiểu dữ liệu trong ngôn ngữ Pascal được chia ra thành hai loại chính: loại đơn giản và loại có cấu trúc. kiểu logic. kiểu tập hợp và kiểu tập tin . Ví dụ kiểu Integer gồm các số nguyên nằm trong phạm vi từ -32768 đến 32767 và có thứ tự tự nhiên : -32768< . lô gic. Các kiểu dữ liệu có cấu trúc được xây dựng từ các kiểu dữ liệu đơn giản. Kiểu chuỗi được giới thiệu để có thể sử dụng ngay ở mức đơn giản. vừa có tính đơn giản lại vừa có tính cấu trúc. KIỂU SỐ NGUYÊN 6. Dưới đây sẽ lần lượt trình bày kỹ về 4 kiểu dữ liệu đơn giản chuẩn và thông dụng: kiểu nguyên. việc sử dụng chuỗi cũng có hai mức khác nhau: mức đơn giản và mức có cấu trúc.. Các kiểu dữ liệu có cấu trúc gồm có :kiểu mảng.. Kiểu thực thuộc loại không đếm được... các gía trị của nó dày đặc. kiểu ký tự. Mỗi kiểu dữ liệu đơn giản là một tập các giá trị cơ sở có thứ tự.2...thuộc kiểu dữ liệu nào thì máy sẽ dành cho biến đó một dung lượng thích hợp trong bộ nhớ để có thể lưu trữ các gía trị thuộc kiểu dữ liệu đó. 6. ký tự.1. Riêng chuỗi ký tự (STRING) là một kiểu dữ liệu đặc biệt.. liệt kê và đoạn con đều thuộc loại đếm được (còn gọi là rời rạc). Vì vậy.255 -32768 . Các kiểu dữ liệu đơn giản còn được phân thành hai loại: đếm được (Ordinal type) và không đếm được. kiểu bản ghi. 32767 0 .. < 32767 .2.1. Các kiểu dữ liệu đơn giản gồm có: kiểu nguyên. kiểu thực. 127 0. Mỗi kiểu dữ liệu có cấu trúc là một tập các phần tử thuộc kiểu dữ liệu đơn giản được tổ chức lại theo một quy tắc nhất định . Các kiểu số nguyên : Tên kiểu ShortInt Byte Integer Word LongInt Phạm vi gía trị -128 . 6. 65535 -2147483648 . True với quy ước False < True. kiểu liệt kê và kiểu đoạn con. Mỗi chuỗi có thể xem là một gía trị. kiểu lô gic.

còn các lệnh dưới đây là bị lỗi : i:= -5. các số nguyên còn được chia ra thành 4 kiểu nữa đó là: Byte. Câu lệnh sau là sai : N:= 12. thì các lệnh đưới đây là đúng: i:= 200. 255 và 16 6. Chúng có gía trị tương ứng trong hệ 10 là: 10 . Ðặc biệt không thể gán một số thực cho một biến nguyên.5. N : Integer. Phép nhân : ký hiệu bằng dấu *.2. ví dụ 6/4 cho kết qủa là 1. phạm vi gía trị và độ dài tính theo đơn vị byte của từng kiểu nguyên. ví dụ ba số dưới đây : $A . Bảng 6. Chú ý: Các số nguyên hệ thập lục phân (hệ 16) được biểu diễn bằng cách viết thêm dấu $ ở trước số. ví dụ 4*2 cho kết qủa là 8.1 liệt kê chi tiết về tên gọi. Ví dụ. N:= -1500. Các biến nguyên chỉ có thể nhận các gía trị là các số nguyên nằm trong phạm vi gía trị của biến đó. Khi gán cho một biến một số nguyên nằm ngoài phạm vi của biến thì máy sẽ báo lỗi: "Const out of range". Các phép toán số học trên số nguyên: Phép cộng và trừ : ký hiệu + và . Khi gặp tình huống này. máy sẽ báo lỗi "Type mismatch".2. N:= 50000. $FF và $10 là các số nguyên viết trong hệ 16. cho khai báo : Var i : Byte.như thường lệ. ShortInt và LongInt.5 .Bảng 6.1 Ngoài kiểu Integer là thông dụng nhất. . Word. Phép chia : ký hiệu bằng dấu / .

mod Sau cùng là +. Ví dụ: 15 DIV 6 cho kết qủa là 2.) được tính trước tiên Kế đến là *.. mod : Ví dụ 6. Nhận xét : số nguyên N là chẵn nếu N mod 2 = 0 (tức N chia hết cho 2). /. bởi vế phải có gía trị kiểu thực (=4. (dấu <> trong Pascal có nghĩa là khác nhau ). Cách tính như sau : Số tờ 5 đ = 43 div 5 = 8 . ngược lại. 15 MOD 6 cho kết qủa là 3. div.0) mặc dù phần lẻ bằng không.1: Nhập một số tiền N đồng. Phép lấy phần dư nguyên của phép chia: ký hiệu bằng từ khóa MOD. Vì thế nếu N là một biến nguyên. là lẻ nếu N mod 2 <> 0.Phép chia lấy phần nguyên : ký hiệu bằng từ khóa DIV. Ðối với các phép toán cùng thứ tự mà đứng liền nhau thì phép toán nào đứng trước được làm trước. trừ ra phép chia ( / ) luôn cho kết qủa là một số thực. Các phép toán trên đều cho kết qủa là các số nguyên. Thứ tự thực hiện các phép toán cũng giống như thường lệ: Các biểu thức trong (. Ví dụ N=43 đ = 8 tờ 5 đ + 1 tờ 2 đ + 1 tờ 1 đ. thì máy sẽ báo lỗi.. bao nhiêu tờ 1 đồng sao cho tổng số tờ là ít nhất. mà gán : N:= 20/5. đổi ra xem được bao nhiêu tờ 5 đồng. bao nhiêu tờ 2 đồng. Ví dụ: tính biểu thức sau : 15 mod (2 +4) * 20 div (10 div 4) + 40 mod ( 5* 3) =15 mod 6 * 20 div 2 + 40 mod 15 = 3 * 20 div 2 + 10 = 60 div 2 + 10 = 30 + 10 = 40 Ví dụ sau đây là một ứng dụng của các phép toán div.

Readln. st1 := Sodu mod 2. Ký hiệu = Ý nghĩa bằng nhau Ví dụ x=y . Readln(N). sodu : LongInt.2 . Các phép toán so sánh : Ngôn ngữ Pascal có sáu phép toán so sánh được liệt kê trong bảng 6. st1.EXE> Chép tập tin nguồn <VD61. { Ðổi tiền } Var N. Writeln(‘ So to 1đ=‘. Chạy<VD61. { tính phần dư } st2 := Sodu div 2. st5. Writeln(‘ So to 5đ= ‘.2. Writeln(‘ So to 2đ= ‘. End. st1).PAS> 6. st2). Begin Write(‘ Nhap so tien : ’).Số tiền dư = 43 mod 5 = 3 Số tờ 2 đ = Số tiền dư div 2 = 3 div 2 =1 Số tờ 1 đ = Số tiền dư mod 2 = 3 mod 2 = 1 Dưới đây là chương trình cụ thể : PROGRAM VIDU61. st5). st2.3. st5 := N div 5. Sodu := N mod 5. Writeln(‘ KET QUA DOI TIEN LA: ’ ) .

XOR từng cặp bít tương ứng của hai số đó. XOR hai số nguyên được tiến hành bằng cách AND.<> < <= > >= khác nhau nhỏ hơn nhỏ hơn hoặc bằng lớn hơn lớn hơn hoặc bằng Bảng 6. OR. Ví dụ: NOT 1 = 1111 1111 1111 1110 NOT 2 = 1111 1111 1111 1100 Phép lấy AND. Ví dụ. còn 1 thành 0. AND.3 Mỗi số nguyên được biểu diễn trong máy dưới dạng một dãy các bít nhị phân. Số kiểu Integer được biểu diễn bằng 16 bit. Ví dụ: Biểu thức 5*2=10 cho kết qủa là TRUE. OR. XOR xử lý các bít nhị phân được xác định như sau ( bảng 6. 6.4. Biểu thức 6 div 2 > 10 div 3 cho kết qủa là FALSE. tức là 0 thành 1.2 x<>y x<y x<=y x>y x>=y Kết qủa của các biểu thức so sánh là một gía trị lôgic Ðúng (TRUE) hoặc Sai (FALSE). Các phép toán lôgic trên số nguyên : Các phép tính NOT. ví dụ: .3 ): NOT 1 = 0 NOT 0 = 1 1 AND 1=1 1 AND 0=0 0 AND 1=0 0 AND 0=0 1 OR 1=1 1 OR 0=1 0 OR 1=1 0 OR 0=0 1 XOR 1=0 1 XOR 0=1 0 XOR 1=1 0 XOR 0=0 Bảng 6.2. Biểu thức 5+2 <> 7 cho kết qủa là FALSE. OR. số 1 và số 2 có biểu diễn trong máy lần lượt là : 0000 0000 0000 0001 0000 0000 0000 0011 Phép lấy NOT một số nguyên sẽ đảo tất cả các bít biểu diễn số nguyên đó.

tương đương với lệnh k:=Pred(k). trả về gía trị logic là TRUE nếu k lẻ. Hàm ODD(k) : đối số k nguyên. là FALSE nếu k chẵn. Pred (-6) = -7. tức là k+1 . trả về số nguyên đứng ngay sau k.5.1 OR 2 = 0000 0000 0000 0011= 2 1 AND 2 = 0000 0000 0000 0001= 1 6. Lệnh k:=k-1. vì : 120 shl 3 = 120 * 23 = 120 * 8 = 960.6. N SHL k : dịch các bít của số nguyên N sang trái đi k bít. Succ (-6) = -5. Các hàm có đối số nguyên : Hàm PRED(k) : đối số k nguyên. Các phép dịch chuyển số học SHR và SHL : N SHR k : dịch các bít của số nguyên N sang phải đi k bít. 6. . tương đương với lệnh k:=Succ(k).2. Ví dụ: Succ (5) = 6. Ví dụ: Odd(15) = True Odd(4) = False. Có thể chứng minh được : N SHR k = N div 2k N SHL k = N * 2k Ví dụ: 120 shr 4 = 7. Hàm SUCC(k) : đối số k nguyên. 120 shl 3 = 960.2. Ví dụ: Pred (5) = 4. trả về số nguyên đứng ngay trước k. vì : 120 shr 4 = 120 div 24 = 120 div 16 = 7. tức là k-1 . Hai phép toán SHR và SHL được dùng khi muốn tăng tốc độ tính toán trên các số nguyên. Nhận xét : Lệnh k:=k+1.

Ví dụ. Thủ tục DEC(k) : giảm k đi một đơn vị. nếu N lẻ thì in ra chữ le? Chương trình như sau : PROGRAM VIDU62. sau khi thực hiện các lệnh : k:=5. Readln(N). Dec(k). 6. hay k:=Succ(k). nếu N chẵn thì in ra chữ chẵn. Các thủ tục có đối số nguyên: Có hai thủ tục khá thông dụng là: Thủ tục INC(k) : tăng k lên một đơn vị. Inc(k). ‘ La so le’) else write(N.7. thì gía trị của k sẽ là 4. Readln. thì gía trị sau cùng của k là 6.3. lệnh Inc(k). lệnh Dec(k) . If Odd(N) = TRUE then write(N. ‘ La so chan’). End. hay k:=Pred(k).2 : Nhập số nguyên N. KIỂU SỐ THỰC .Ví dụ 6. Ví dụ. Var N : Integer. tương đương với lệnh k:=k+1. tương đương với lệnh k:=k-1.2. Chạy<VD62. Vậy. Begin Write(‘Nhap so N :’). sau khi thực hiện các lệnh : k:=5.EXE> Chép tập tin nguồn <VD62. Vậy.PAS> 6.

4 Chú y? : Turbo Pascal thường chỉ làm việc với một kiểu Real.6.08 Cách 2: Viết số dưới dạng khoa học : 1.0E-02 (có gía trị = 1257*10-2 = 12.4*1038 5.257*101 = 12.57 ) Trong dạng này số gồm có hai phần. Tên kiểu Real Single Double Extended Comp Phạm vi gía trị 2. các số thực còn có 4 kiểu mở rộng nữa là Single.. Nếu ? x? > 1.0 -256. Ngoài kiểu Real ra.. tiếp đến là một số nguyên.2*1018 . 9. 1. 3.0*10-324 .7*10308 3. y kiểu real. Bảng 6.3. Số byte 6 4 8 10 8 . Số viết theo cách 1 còn gọi là số có dấu chấm thập phân cố định.9*10-39 đến 1. Ví dụ: Muốn khai báo hai biến x. phải chuyển sang mode 8087 bằ?g cách viết chỉ thị {$N+} ở ngay đầu chương trình. Extended va? Comp.7*1038 1.1 Kiểu Real và các kiểu mở rộng : Kiểu Real là kiểu số thực thông dụng nhất dùng để biểu diễn các số thực x có trị tuyệt đối ? x? nằm trong khoảng từ 2. 1. Muốn dùng 4 kiểu thực còn lại.9*10-39 thì x được coi là bằng 0.2*1018 Bảng 6.45 +122.4*10-4932 .57 ) 1257. trong đó dấu phẩy thập phân được thay bằng dấu chấm thập phân. số viết theo cách 2 còn gọi là số có dấu chấm thập phân di động hay số dạng khoa học (Scientific). Double. gồm dấu cộng hoặc trừ.5*10-45 .257E+01 (có gía trị = 1.. 1.9*10-39 . Ví dụ: 45.4 nêu chi tiết về phạm vi gía trị và số byte dùng để lưu trữ trong bộ nhớ của từng kiểu số thực. phần đứng trước E gọi là phần định trị. ta viết: Var x. Có hai cách biểu diễn các số thực: Cách 1: Viết bình thường.1*104932 -9. phần đứng sau E gọi là phần bậc. được viết theo cách 1..7*10+38..7*10+38 thì không biểu diễn x trong máy ? được. y : Real. còn nếu x? < 2.

0 Sqr(7 div 3) = 4 Trong các hàm dưới đây. (x ? 0) . Ví dụ : Frac(12.0 Hàm FRAC(x) : cho số thực bằng phần lẻ của x. >= ) cũng dùng được cho các số hạng là thực hay nguyên.8) = 3 Hàm SQR(x): tính bình phương của x: x2 . Các hàm có đối số nguyên hoặc thực : Hàm ABS(x): tính trị tuyệt đối của x :? x? . cộng (+) và trừ (-). Hàm INT(x) : cho số thực bằng phần nguyên của x.2. Ví dụ: Abs(5 . Ví dụ: Sqr(4.0 Int(1+10/3)=4. y kiểu thực thì lệnh sau là bị lỗi vì biểu thức vế phải không hợp lệ: y:= x mod 10 . < . nhưng gía trị trả về?luôn luôn là kiểu thực: Hàm SQRT(x): tính Hàm EXP(x) : tính ex Hàm LN(x): tính lnx. (x > 0) Các hàm SIN(x). <> . Khi một trong các số hạng tham gia tính toán là kiểu thực thì kết qủa của phép toán cũng là một số thực. Kiểu dữ liệu của kết qủa cùng kiểu với đối số.0) = 16. đối số x có thể là nguyên hay thực.3. chia (/). Phép toán DIV. và ARCTAN(x): tính sinx.3. Ví dụ: với hai biến x. cosx và arctgx. Các phép toán trên số thực : Có 4 phép toán số học là nhân (*).55) = 0. 6. <= . Ví dụ : Int(12. MOD không dùng cho các số thực. COS(x). nếu x là số thực thì ABS(x) cũng là số thực.6.55 Hai hàm đặc biệt dưới đây cho kết qủa là số nguyên: .55) = 12. > . Kiểu dữ liệu của kết qủa cùng kiểu với đối số.3. Các phép toán so sánh (= . Nếu x nguyên thì ABS(x) cũng nguyên.

Ví dụ 6. Writeln(‘y= ‘. tính và in các gía trị y và z lên màn hình theo công thức: Trong Pascal không có hàm tính trực tiếp 2x và Log4(x). và Chương trình cụ thể như sau: PROGRAM VIDU63. y:= ( sqrt (x*x+1) + sin(x)*sin(x) ) / ( 3*exp(2*x) + 1 ).0 còn Trunc(4. Ví dụ : Trunc(12.3: Viết chương trình nhập số thực x bất kỳ. Readln(x).5) = 4 (viết 4 thì hiểu đó là số nguyên.45) = 12 Round(-2. y. còn viết 4. z:10:3 ).98) = -2 Hàm ROUND(x): cho số nguyên bằng cách làm tròn x. Readln. chúng chỉ khác nhau về kiểu dữ liệu của gía trị trả về. Begin Write(‘Nhap x: ‘). nên ta phải chuyển qua hàm ex và Ln(x) như sau: . z:= exp( x*Ln(2) ) + Ln(abs(x)+1) / Ln(4).5)= 4. Writeln(‘z= ‘.Hàm TRUNC(x): cho số nguyên là phần nguyên của x. Int(4.55) = 12 Trunc(-2. y:10:3 ). . z : Real. Var x.98) = -3 Chú ý rằng hàm Int(x) và hàm Trunc(x) cùng cho phần nguyên của x. Ví dụ : Round(12.0 thì hiểu đó là số thực).

Chép tập tin nguồn <VD63.4.pas> Khi chạy chương trình. 6. Chạy<VD63.End.250 và z=1.4. Ký tự và biến kiểu ký tự: Ký tự Mã ASCII 32 0 1 2 3 4 5 6 7 8 9 48 49 50 51 52 53 54 55 56 57 Ký tự A B C D E F G H I J K L M N O P Q R S Mã ASCII 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 Ký tự a b c d f e g h i j k l m n o p q r s Mã ASCII 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 . nếu nhập x =0 thì kết qủa y=0.000. KIỂU KÝ TỰ (CHAR) 6.1.EXE>.

.. ‘$’. Giữa các ký tự..< ‘9’< ‘A’< ‘B’< .. ch1:=‘$’. và khi viết trong Pascal phải được đặt trong cặp nháy đơn: ‘0’. Biểu 6.’Z’< ‘a’< ‘b’< . chẳng hạn như khai báo hai biến ch và ch1 dưới đây: Var ch.5 84 85 86 87 88 89 90 t u v w x y z 116 117 118 119 120 121 122 Các ký tự dùng trong máy tính điện tử được liệt kê đầy đủ trong bảng mã ASCII gồm 256 ký tự khác nhau và được đánh số thứ tự từ 0 đến 255.5 liệt kê một phần của bảng mã ASCII gồm các chữ số và chữ cái kèm theo mã của chúng.. Các ký tự có mã từ 0 đến 31 gọi là các ký tự điều khiển. ‘B’. ‘A’.. Tuy có 256 ký tự khác nhau song chỉ có 128 ký tự đầu tiên là hay dùng. Số thứ tự của mỗi ký tự còn gọi là mã ASCII của ký tự đó.. còn ‘$’ là gía trị của biến ch1. ký tự có mã bằng 32 là ký tự trắng (space). chiếm độ dài 1 byte. Mỗi ký tự trong bảng mã ASCII gọi là một hằng ký tự. Tức là: Ký tự trắng < ‘0’< ‘1’< . ký tự có mã là 13 dùng để chuyển con trỏ màn hình xuống đầu dòng dưới. không in ra được. Khi đó có thể gán: ch:=‘A’. được dùng để điều khiển các thiết bị ngoại vi. ‘1’..T U V W X Y Z Bảng 6. chẳng hạn ký tự có mã là 7 dùng để tạo một tiếng kêu bip. còn lại là các ký tự mở rộng. Nhận xét: Từ bảng mã của các chữ cái ta suy ra: ..5. Ký tự ‘A’ gọi là gía trị của biến ch. Trong bảng 6. chúng được khai báo nhờ từ khóa CHAR. ch1: Char .. có một thứ tự mặc nhiên theo nguyên tắc : ký tự có mã nhỏ hơn thì nhỏ hơn..< ‘z’ Biến nhận gía trị là các hằng ký tự gọi là biến kiểu ký tự.

.2. Ví dụ: Ord (‘A’) = 65. Write(Chr(65)). (1) 6. Ví dụ: Chr (65)= ‘A’ . Hàm UpCase(ch): đổi ký tự ch thành chữ hoa. hai lệnh sau cùng in lên màn hình chữ A : Write(#65). Các hàm liên quan đến ký tự : Hàm PRED(ch): cho ký tự đứng ngay trước ký tự ch trong bảng mã. và lệnh: Write( Chr(7) ) . Ví dụ: Upcase( ‘a’ ) = ‘A’. 0? k ? 255.4: Nhập vào một số nguyên k. Chr (97)= ‘a’. Upcase( ‘A’ ) = ‘A’ . Ví dụ: Succ(‘A’)=‘B’.Mã chữ thường = Mã chữ hoa tương ứng + 32. Hàm CHR(k) : đối số k nguyên. Ví dụ: Pred(‘B’)=‘A’ Hàm SUCC(ch): cho ký tự đứng ngay sau ký tự ch trong bảng mã. in ra ký tự : + Lệnh Writeln(Chr(187)) . nhưng có thể làm việc này nhờ công thức (1) và hai hàm Ord và Chr : Chữ thường := Chr ( Ord(chữ hoa) + 32 ) Ví dụ 6. Upcase( ‘b’ ) = ‘B’. cho ký tự có mã bằ?g k.4. có tác dụng phát ra một tiếng kêu bip. Chú ý: Turbo Pascal ( TP ) cho phép viết gọn Chr(k) thành #k nếu k là hằng số. Có một số ký tự không có trên bàn phím. hay Write(#7) . Ví dụ: Lệnh Writeln(Chr(201)) . Chương trình kết thúc khi nhập vào số 0 : PROGRAM VIDU64 . Chr(32) là ký tự trắng. để viết chúng lên màn hình ta phải dùng lệnh Write và hàm CHR. in ra ký tự có mã là k. Ord (‘a’) = 97 . 0? k ? 255. in ra ký tự : + Ký tự có mã là 7 gọi là ký tự BEL (chuông). Trong TP không có hàm đổi chữ hoa ra chữ thường. Ví dụ. Hàm ORD(ch) : cho mã của ký tự ch.

‘ là ‘ . ch1 : Char. Var k : Byte. PROGRAM VIDU65. Readln(ch). If (ch>=‘A’) and ( ch<=‘Z’) then ch1:=Chr( Ord (ch)+32) else ch1:= Upcase(ch). End. k. Until k=0.Uses CRT. ch1). Begin CLRSCR. Readln.5: Nhập một ký tự.PAS> Ví dụ 6. nếu là chữ hoa thì đổi ra chữ thường. Chạy<VD64. nếu là chữ thường thì đổi ra chữ hoa. Chr(k) ). Writeln(ch.EXE> Chép tập tin nguồn <VD64. ‘ đã đổi ra: ‘ . End. Repeat Write(‘ Nhập mã của ký tự : ‘). { Ðổi chữ hoa ra thường và ngược lại} Var ch. Readln(k). Writeln(‘ Nhập số 0 để kết thúc :’). . Writeln(‘ Ký tự có mã ‘. Begin Write(‘ Nhập một ký tự :’).

A True False False True not A A True True False False B True False True False A and B True False False False A or B True True True False A xor B False True True False Bảng 6. Thứ tự thực hiện các phép toán lôgic là như sau: NOT tính trước. A or B là sai khi và chỉ khi A và B đồng thời sai. A or B và A xor B cũng là những đại lượng lôgic có kết qủa được cho ở bảng 6.6 Cũng từ bảng này ta rút ra các nhận xét : A and B là đúng khi và chỉ khi A và B đồng thời đúng. Nếu A và B là hai đại lượng lôgic thì NOT A.EXE> Chép tập tin nguồn <VD65. OR và XOR. Mỗi gía trị boolean chiếm một byte bộ nhớ. sau khi thực hiện lệnh: .5. Ví dụ.Chạy<VD65.PAS> 6. không phân biệt chữ hoa hay chữ thường. (Do đó chỉ cần một trong hai biến A hoặc B đúng thì A or B sẽ đúng). A xor B là đúng khi và chỉ khi A khác B. AND. A and B. KIỂU LÔGIC (BOOLEAN) Kiểu boolean chỉ có hai gía trị là TRUE (đúng) và FALSE (sai). kế đến AND. Về quan hệ thứ tự thì FALSE< TRUE. (Do đó chỉ cần một trong hai biến A hoặc B sai thì A and B sẽ sai). sau cùng là OR.6. Các phép toán lôgic gồm có: NOT. XOR.

Chẳng hạn. thật vậy : 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 chỉ nhận gía trị là TRUE hoặc FALSE gọi là biến kiểu lôgic. Gía trị của biến B sẽ là False vì biểu thức 2*2< 3 là sai. B:=2*2 < 3.A:=Not (2*3=5) or (‘A’<‘B’) and not (4/2=2) xor (Sqrt(2) >1).6: . Về thứ tự tính toán. Khi khai báo biến kiểu lôgic ta dùng từ khóa Boolean. biểu thức sau là sai quy cách: N > 0 and N<10 Cần sửa đúng thành : (N > 0) and (N<10) Ví dụ 6. thì gía trị của A= FALSE. ví dụ : Var A. B : Boolean. các phép so sánh thì ngang cấp nhau và được tính sau tất cả các phép toán khác. khi trong một biểu thức mà có các phép toán lôgic xen kẽ với các biểu thức so sánh thì các biểu thức so sánh phải để trong ngoặc đơn. Trong chương trình ta có thể gán : A:= true. Ví dụ tính biểu thức : 5+7 div 2 < -7 mod 3 + 5*2 = = 5 + 3 < -1 + 10 = 8< 9 = TRUE Do đó.

c là ba cạnh của một tam giác là mỗi cạnh phải dương và tổng hai cạnh thì lớn hơn cạnh còn lại. Begin Write(‘ Nhap 3 canh cua tam giac : ‘). S:10:2). . c). P. If Tgiac= FALSE then Writeln(‘ Khong phai ba canh cua tam giac !’) else begin P:=(a+b+c)/2.Nhập vào độ dài ba cạnh a. Tgiac:= (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a).b.b. Writeln(‘ dien tich S= ‘ . end. Readln(a. b. {Tính diện tích và chu vi tam giác theo 3 cạnh} Var a. nếu đúng là ba cạnh của một tam giác thì tính chu vi và diện tích tam giác đó theo công thức Hêrông: . c không phải là ba cạnh của tam giác thì in lên màn hình câu " không phải ba cạnh của tam gíac". S:= Sqrt( P*(P-a)*(P-b)*(P-c) ). S : Real. Writeln(‘ chu vi = ‘ . điều kiện để a. ngược lại. b. 2*P:10:2). b. Tgiac: Boolean. Dưới đây là chương trình cụ thể : PROGRAM VIDU66. với p là nửa chu vi: Ta biết.c của một tam giác. c. nếu a.

dien tich= 6. Hai chuỗi bằng nhau nếu chúng dài bằng nhau và mọi cặp ký tự ở các vị trí tương ứng đều giống nhau.PAS> Khi chạy chương trình này. Các chuỗi cũng so sánh được với nhau. Nếu nhập ba cạnh là : 2 3 6 thì máy hiện câu: "Không phải ba cạnh của tam giác ! " (vì 2+3 < 6). ví dụ: Biểu thức ‘Anh’ < ‘an’ là đúng vì ‘A’ < ‘a’ Biểu thức ‘Thong’ > ‘Tha’ là đúng vì ‘o’ > ‘a’ Nếu nội dung?của hai chuỗi giống nhau từ đầu đến hết chiều dài của chuỗi ngắn hơn thì chuỗi ngắn hơn là nhỏ hơn. .00.EXE> Chép tập tin nguồn <VD66. End. ví dụ: Biểu thức ‘Tha’ < ‘Thang’ là đúng vì ‘Tha’ ngắn hơn ‘Thang’. bạn gõ ba số cách nhau khoảng trắng rồi enter. Khi phát hiện có một cặp ký tự khác nhau thì chuỗi nào chứa ký tự nhỏ hơn sẽ nhỏ hơn. 6. Chạy<VD66. để nhập ba cạnh của tam giác. Khi cộng (+) hai chuỗi ta được một chuỗi duy nhất bằng cách ghép chuỗi sau vào cuối của chuỗi đầu. Ví dụ: Biểu thức ‘Pascal’ = ‘Pascal’ cho kết qủa là đúng Biểu thức ‘Pascal’ = ‘PAscal’ cho kết qủa là sai.6. CHUỖI KÝ TỰ (STRING) Một dãy ký tự đặt trong cặp nháy đơn gọi là một hằng chuỗi.Readln. Ví dụ phép cộng : ‘Ngon ngu’ + ‘ Pascal’ cho kết qủa là ‘Ngon ngu Pascal’. Dưới đây là ba hằng chuỗi : ‘NGON NGU PASCAL’ ‘Tin hoc nam 2000’ ‘123456’ Các chuỗi có thể được ghép nối với nhau nhờ phép cộng chuỗi. chẳng hạn : Nhap 3 canh cua tam giac : 3 4 5 Kết qủa chu vi= 12.00. Việc so sánh hai chuỗi được thực hiện bằng cách so sánh từng cặp ký tự tương ứng từ trái qua phải.

còn biến chuỗi St có thể chứa tối đa 255 ký tự. Chuỗi ‘Nguyen Van An’ gọi là gía trị của biến Ho_ten. c) 9.5.Biến nhận giá trị là các hằng chuỗi gọi là biến kiểu chuỗi. y : Real.5. chọn cách viết nào : d) x := -b/2/a.7. khi đó Ho_ten là biến chuỗi có thể chứa tối đa 20 ký tự. chuỗi ‘Thao chuong bang ngon ngu Pascal’ là gia trị của biến St. CÂU HỎI TRẮC NGHIỆM Câu 1: Cho khai báo biến : Var m. Có thể khai báo hai biến chuỗi như sau: Var Ho_ten : String[20].5.0. 6. Tương tự. Lệnh nào sai : a) m := -4. và ta có thể gán : Ho_ten := ‘Nguyen Van An’. St : String. x. n : integer. c) x := 6. c) . d) y := +10. . Câu 3: Biểu thức : 25 div 3 + 5/2*3 có giá trị là : a) 8. . b) x := -b/2*a.5. b) 15. Câu 2: Ðể tính gía trị a) x := -b/2a. b) n := 3. St :=‘Thao chuong bang ngon ngu Pascal’.

b) not (49. Lệnh nào đúng : a) ch:="a" b) ch:=65. Giả sử a? 0 và Delta:= b*b.5 + 2 < 5) or (2 > 4 div 2).4*a*c > 0 . b) X:= 210 div 4. Câu 8: Khi chạy chương trình : Var St. . Câu 6:Biến X được khai báo là kiểu integer. Một nghiệm của phương trình là : a) X:= -b + SQRT(Delta) / (2*a). d) X:= ABS(-453). c) X:= SQRT(49).d) 15. Câu 5: Cho ch là biến có kiểu Char. End. Câu 4: Cho phương trình : ax2 + bx + c = 0 . St1 : String. c) (49. d) ch:='abcd'. d) X:= (-b -SQR(Delta) ) /2/a. Begin St := '123'. Write(St + St1). c) ch:=chr(65).0. St1 := '456'. c) X:= (-b + SQRT(Delta) ) / (2*a). Lệnh nào sai : a) X:= round(275/3). Câu 7: Biểu thức nào sau đây có giá trị TRUE : a) (100 > 76) and ('B' < 'A'). d) 2*(3+5) < 18 div 4*4.5 + 2 < 5) and (2 < 4 div 2). b) X:= (-b + SQRT(Delta) ) /2*a.

c:=(N Mod 100) Mod 10. 7. Write(a+b+c). c) đều sai. End.Kết quả in ra là : a) '123456'. b:=(N Mod 100) div 10. c) 579. BIẾN và BIỂU THỨC 7. d) 'a'. c) 'A'. a:=N div 100. b).32 ). c. Begin N:=546. Khái niệm về biến và hằng : .1. b) A. thì giá trị của Ch là : a) 65. Câu 9: Sau phép gán : Ch := CHR( ORD('a'). b) 5. b. Kết quả in ra : a) 546. b) 123456. HẰNG. d) Câu a).1. d) 6. Câu 10: Khi chạy chương trình : Var a. N : integer. c) 15.1.

Cách khai báo biến như sau : Var Danhsáchtênbiến : TênKiểuDữliệu . Qúa trình xử lý trong máy tính đòi hỏi mỗi gía trị phải được lưu trữ ở một ô nhớ nào đó trong bộ nhớ của máy. 7. Theo khai báo trên. thì ô nhớ là một hằng. Các giá trị của kiểu nguyên hay kiểu thực là các số. khi một ô nhớ được đặt tên thì tên này đồng nhất với giá trị của nó. Việc khai báo có tác dụng báo trước cho máy dành sẵn các ô nhớ thích hợp trong bộ nhớ để sẵn sàng chứa dữ liệu. tên của ô nhớ là tên biến. j : Integer. Tên biến là tự đặt. . Khi đó mọi việc tính toán hay xử lý liên quan đến mỗi gía trị được thực hiện gián tiếp thông qua tên của ô nhớ chứa giá trị đó. và hai biến x. Ví dụ : Const N = 10. Hằng là một đại lượng có gía trị không đổi trong chương trình.72. thì biểu thức 5. Trong một chương trình.72..718. Ví dụ : Var i.2. Ví dụ. các gía trị của kiểu ký tự là các ký tự như ‘A’ hay ‘a’. SoE = 2. Các biến và hằng tham gia trong chương trình đều phải được khai báo. ta có hai biến i và j cùng kiểu số nguyên (Integer). theo đúng quy tắc của một tên. như 40 hay 5. y : Real. Cách khai báo : Const Tên_hằng = gíatrị . SoPi = 3. Việc dùng tên x dễ nhớ và tiện hơn nhiều so với việc dùng và nhớ số 5. Khai báo biến và khai báo hằng : Biến là đại lượng có gía trị thay đổi được trong chương trình. Tên hằng là tự đặt. x. Như vậy. ngược lại. theo đúng quy tắc của một tên. và ô nhớ này được đặt một cái tên để gọi.Trong phần trước ta đã biết mỗi kiểu dữ liệu có một tập các giá trị tương ứng.72*2 có thể được viết là x*2. y cùng kiểu số thực (Real). Nếu gía trị của ô nhớ có thể thay đổi được thì ô nhớ này là một biến.. mỗi ô nhớ có một tên duy nhất nhưng giá trị của nó thì có thể thay đổi hoặc không. . tên của ô nhớ là tên hằng. còn kiểu lôgic thì chỉ có hai gía trị là True và False. nếu gía trị của ô nhớ không thể thay đổi.1.72 được lưu trong ô nhớ có tên là x. nếu số 5.1416.

<>. Mỗi thành phầ? (hay toán hạng) có thể là hằng.1 . <. MOD. có kết qủa là 3. . có thể dùng các lệnh sau: Writeln(‘Dien tich hinh tron ban kinh r=5 la: ‘ . như : Pi. 7.1 dưới đây. . Pi*5*5:8:3). Writeln(‘So Integer lon nhat = ‘ .) Các hàm NOT. >.1. nếu không máy sẽ báo lỗi. XOR =.32 ) là biểu thức ký tự. Một biểu thức có thể chứa nhiều phép toán. AND Shl.(trư?. biểu thức sau : 5 + ‘A’ là sai vì ta không thể cộng một số nguyên với một ký tự.0 Chr( ord(‘a’) . có kết qủa là True ‘AB’+’CD’ là biểu thức chuỗi. IN Bảng 7.. là biến hay là hàm.(phép lấy dấu âm) * . Ví dụ. Thứ tự thực hiện các phép toán được cho trong bảng 7. Cấp ưu tiên 1 2 3 4 5 6 7 Phép toán biểu thức trong ngoặc đơn (. còn MaxInt = 32767. <=. Biểu thức : Biểu thức là một công thức gồm có một hay nhiều thành phần được kết nối với nhau bởi các phép toán.. Ví dụ: 3* 5 div 2 + 7 mod 4 là biểu thức nguyên. là số Integer lớn nhất. Hằng Pi có gía trị bằng số π . có kết qủa là 10 2 + sin(pi/2) là biểu thức thực. có kết qủa là ‘A’ (4+2=6) and (‘B’<>‘b’) là biểu thức lôgic.Turbo Pascal có sẵn một số hằ?g chuẩn cho phép sử dụng mà không phải khai báo. Khi các phép toán trong biểu thức được thực hiện thì ta nhận được một gía trị gọi là kết qủa của biểu thức. /. có kết qủa là ‘ABCD’ Các thành phần trong biểu thức cầ? phải có kiểu dữ liệu phù hợp để cho các phép toán thực hiện được. Kiểu dữ liệu của kết qủa gọi là kiểu dữ liệu của biểu thức. MaxInt). >=. OR.3. DIV. MaxInt . Chẳng hạn. Shr +.

Quy tắc 2: Ðối với các phép toán đứng liền nhau và có cùng cấp ưu tiên. thì cái nào đứng trước được tính trước.5 Ví dụ : tính biểu thức lôgic : ( 2 > 4 div 2) or Not ( 49. Lệnh gán và lời gọi thủ tục được xếp vào loại đơn giản.2. Phân loại câu lệnh : Câu lệnh là một dãy các ký tự cơ bản được xây dựng theo một quy tắc nhất định (gọi là cú pháp) nhằm chỉ thị cho máy thực hiện một công việc xác định. Ví dụ : tính biểu thức số học : (4+5)*2 div 7 + sin(pi/6) = = 9 * 2 div 7 + 0. Các câu lệnh được chia ra hai loại: câu lệnh đơn giản và câu lệnh có cấu trúc. phép toán có cấp ưu tiên lớn thì được tính sau.Việc tính toán một biểu thức dựa theo hai quy tắc : Quy tắc 1: Phép toán có cấp ưu tiên nhỏ thì được tính trước. Writeln(k) . chúng được xây dựng từ các lệnh đơn giản. Ví dụ: k := 20. Các lệnh rẽ nhánh và lệnh lặp được xếp vào loại có cấu trúc.25 + 2 < 50) = (2 > 2) or Not ( 51.25 < 50) = FALSE or Not FALSE = FALSE or TRUE = TRUE 7. Clrscr .5 = 2.5 = 18 div 7 + 0.5 = 2 + 0.1.2. ví dụ: If k>=0 then Writeln(k) . CÂU LỆNH VÀ LỜI CHÚ GIẢI 7.

End. ví dụ: If k>= 0 then Writeln(k) else Begin Writeln(‘ k âm. Ví dụ. Readln(k). Hai hay nhiều lệnh đơn giản được gom lại và đặt giữa hai từ khóa BEGIN và END tạo thành một câu lệnh ghép. K : Integer. 7. rồi lưu kết qủa tính được vào tên biến ở vế trái. Lệnh gán : Lệnh gán có cú pháp như sau : TênBiến := Biểuthức .2. Ý nghĩa : tính toán biểu thức bên phải. Khi dùng lệnh các lệnh: K := 10 . End. ví dụ: Begin Write(‘ nhập k :’). Readln(k). . cho khai báo : Var A. Từ các lệnh đơn giản và các lệnh có cấu trúc đã có lại có thể xây dựng được các lệnh có cấu trúc phức tạp hơn.else Writeln( -k) . Sau đây sẽ trình bày kỹ về một lệnh đơn giản vàthông dụng : lệnh gán. B : Real. câu lệnh ghép cũng là lệnh có cấu trúc. xin nhập lại : ‘).2.

Ví dụ lệnh K:=10/4. là đúng. rồi đem kết qủa gán cho chính biến B. Tương tự. Khi đó: Lệnh St:=‘A’. thì gía trị của B bây giờ sẽ là 8.5. lệnh gán dưới đây là sai vì vế trái là kiểu thực còn vế phải là kiểu chuỗi : A:=‘Pascal’. thì biến K có gía trị là 10. lệnh B:=B-1. là sai vì vế phải là một số.5. lệnh: B:=B +1.5) cộng thêm 1 (được 9. Yêu cầu để cho lệnh gán thực hiện được là kiểu dữ liệu của biểu thức ở vế phải phải phù hợp với kiểu dữ liệu của biến ở vế trái. Cách thực hiện lệnh B:=B+1 là như sau: lấy gía trị hiện thời của biến B (là 8.5).5. Ðặc biệt.5). Chú ý rằng một số nguyên có thể gán cho một biến thực. là sai vì vế phải là một chuỗi. St: String[20]. . Lệnh St:=‘1234’. biến B có gía trị là 35. là sai vì biến K có kiểu nguyên. tính đến thời điểm đang xét. Xét thêm ví dụ về các kiểu dữ liệu khác : Cho khai báo : Var Ch : Char .B := K* 3+5. kết qủa là B có gía trị bằng 9. còn vế phải cho kết qủa là một số thực (=2. (chẳng hạn lệnh A:=10. Lệnh St:= 100. có tác dụng giảm B đi 1 đơn vị. là đúng ). Như vậy nếu một biến được gán nhiề? lần thì nó sẽ lấy gía trị của lần gán sau cùng. nếu không phù hợp thì khi dịch (Compile) chương trình.5. Ví dụ. Turbo Pascal sẽ thông báo lỗi : "Error 26 : Type mismatch". là đúng. có tác dụng tăng gía trị của biến B lên 1 đơn vị. Lệnh Ch:=‘ABCD’. Nếu thực hiện tiếp lệnh gán : B:= 17/2. nhưng một số thực không thể gán cho một biến nguyên.

Lệnh Ch:=St .. y. chờ ta gõ đủ k số từ bàn phím và kết thúc bằng Enter. y và biến nguyên j. trong đó biến1. và j=4 .. Có nhập được dữ liệu thì mới có dữ liệu để tính toán hay xử lý. ta dùng lệnh: Readln(biến1. Ví dụ. Nhập dữ liệu.1. biến2. Khi gặp lệnh này. Hầu như chương trình nào cũng phải giải quyết vấn đề nhập.. .. biến2. . xuất dữ liệu. thủ tục Readln Nhập và xuất dữ liệu là hai khâu quan trọng trong qúa trình xử lý thông tin. biếnk đã được khai báo và có kiểu dữ liệu là nguyên hay thực..5 4 ↵ (có khoảng trắng giữa hai số ).5 ↵ 4↵ Trong cả hai trường hợp ta đều được: x=10. Có dữ liệu xuất ra thì mới biết được kết qủa của qúa trình xử lý trong máy.3.5. 7. chương trình tạm dừng. rồi gán lần lượt k số đó cho biến1.1.. Nhập dữ liệu kiểu số : Ðể nhập dữ liệu cho biến nguyên hay thực. j). 7. Lời chú giải : Lời chú giải có thể đặt tại bất kỳ chỗ nào trong chương trình và được viết theo một trong hai cách : { lời giải thích } (* lời giải thích *) Lời giải thích là một chuỗi ký tự giải thích mục đích của chương trình hay của một câu lệnh.. Cách nhập như sau: hoặc gõ 10 6.3.3. Nó chỉ có tác dụng cho người dùng tham khảo nhằm hiểu nhanh mục đích của chương trình hay của một câu lệnh mà không cần phải đọc hết chương trình hay câu lệnh đó.. hoặc gõ từng số và Enter như dưới đây : 10 ↵ 6.1. để nhập dữ liệu cho hai biến thực x.. . y=6.. biếnk). biến2. biếnk. ta dùng lệnh: Readln(x. là đúng.2.Lệnh Ch:=‘1’ . 7. là sai vì vế phải là một chuỗi.

7. Phai. ta gõ: Tran Van Thanh ↵ nam ↵ A↵ Kết qủa. Khoi_thi). Khác với dữ liệu số. Readln(Phai).2.1. Ví dụ. mà phải dùng ba lệnh Readln. Readln(y). y. vì sẽ có những nhầm lẫn không kiểm soát được. Readln(j).Ngoài cách dùng một lệnh Readln(x. ba biến sẽ có giá trị là: Ho_ten = ‘Tran Van Thanh’. Khi nhập. mỗi lệnh nhập cho một biến như đã nêu ở trên. Muốn nhập dữ liệu cho ba biến Ho_ten. Phai= ‘nam’ và Khoi_thi=‘A’. Nhập dữ liệu kiểu ký tự hay kiểu chuỗi: Ta dùng lệnh : Readln( biến ). Ví dụ. ta không nên dùng một lệnh Readln để nhập dữ liệu cho hai hay nhiều biến kiểu ký tự hay kiểu chuỗi. không dùng lệnh sau: Readln( Ho_ten. Khoi_thi ta phải dùng ba lệnh : Readln(Ho_ten).3. . cho khai báo : Var Ho_ten: String[18]. Phai. Readln(Khoi_thi). Phai: String[3]. j) . ta cũng có thể nhập riêng cho từng biến bằng ba lệnh sau : Readln(x). Khoi_thi : Char.

còn 4. Write( bt1. . gõ phím Enter thì chương trình chạy tiếp. y).. là một dạng nhập dữ liệu đặc biệt vì nó không có biến nào để nhận dữ liệu nhập vào. còn số 10 thừa không bị xóa mà tự động gán cho biến j trong lệnh Readln(j) tiếp theo. Người ta dùng lệnh này khi muốn tạm dừng chương trình để xem kết qủa trên màn hình.2. Nếu không phù hợp thì chương trình sẽ dừng ngay và hiện thông báo lỗi. Vậy.. .3. mà ta gõ 4.5. xem xong. y=20. Các gía trị nhập thừa của lệnh Read sẽ được tự động gán cho các biến trong lệnh nhập tiếp theo. y).5 20.5.. lệnh Readln sẽ xóa sạch các gía trị nhập thừa. b) Lệnh: Readln . . ta gõ 9↵ . Readln(j).6. thủ tục Write và Writeln Các dữ liệu được in lên màn hình nhờ các lệnh sau: Writeln( bt1. ..6 10 ↵ thì x=12. 7. c) Biến kiểu lôgic không nhập được từ bàn phím. .3.Ví dụ khi gặp lệnh Readln(j) . y=20. bt2 . nhưng ít dùng. ta cũng gõ : 12. còn lệnh Read thì không.6.5 20. bt2 . Các chú ý : a) Dữ liệu nhập phải phù hợp với kiểu của biến. Biến j trong lệnh Readln(j) ở dưới không bị ảnh hưởng.7. btk ). Nếu khi nhập. lệnh Read có thể làm sai ý đồ nhập của lệnh nhập tiếp theo. Nếu khi nhập. Lời khuyên là không nên dùng lệnh Read.1. Xuất dữ liệu.6 10 ↵ thì x=12. Readln(j).5 ↵ thì bị lỗi vì j là biến nguyên. Với đoạn chương trình : Read(x.5 là số thực. Sự khác nhau giữa Read và Readln là ở chỗ: sau khi đã nhận đủ các gía trị cho các biến cần nhập. chỉ dùng Readln . còn số 10 thừa bị xóa luôn. ta gõ : 12. d) Pascal còn có một lệnh nhập dữ liệu nữa là Read. xét hai lệnh: Readln(x. btk ). có công dụng như lệnh Readln. kết qủa j=10 cho dù ta chưa muốn nhập cho j. Muốn nhập số 9 cho j. Ví dụ.3.

thì kết qủa trên màn hình sẽ hiện ra chỉ một dòng: Thao chuong bang ngon ngu pascal 7. Ví dụ : . j+1.. j là các biến nguyên thì khi thực hiện các lệnh sau: i :=10 .. kiểu lô gíc hay kiểu chuỗi. . in ra gía trị của biểu thức bt1. Các gía trị này được in trên một dòng... j:=15*2 . In không định dạng: Ðối với các biểu thức kiểu nguyên.3. Writeln(i. Ví dụ.ở đây. 678). bt2. kết qủa trên màn hình sẽ hiện hai dòng : Thao chuong bang ngon ngu pascal Nếu thay lệnh đầu bằng Write như dưới đây: Write(‘Thao chuong bang ‘). thì lệnh : Writeln( biểuthức ) . in tiếp gía trị của biểu thức bt2. Writeln(‘ngon ngu pascal’).. Ví dụ. một hằng. in tiếp gía trị của biểu thức btk.1.. còn lệnh Write thì không.2. sẽ in nguyên văn gía trị của biểu thức. mỗi biểu thức này có thể là một biến. Trong trường hợp đơn giản. hay một hàm. . Nếu i. Việc in được thực hiện như sau: tại vị trí hiện thời của con trỏ trên màn hình. kiểu ký tự. khi thực hiện hai lệnh sau : Writeln(‘Thao chuong bang ‘). Ðiều này chỉ ảnh hưởng đến lệnh in tiếp theo mà thôi. btk là các biểu thức cầ? phải in gía trị lên màn hình. nếu dài qúa khổ màn hình thì sẽ được in tiếp ở dòng dưới. trên màn hình sẽ hiện: 1031678. bt1. lệnh Writeln(3*2+9). Sự khác nhau giữa lệnh Writeln và Write là ở chỗ: sau khi in xong giá trị của các biểu thức. Writeln(‘ngon ngu pascal’). lệnh Writeln sẽ đưa con trỏ xuống đầu dòng dưới. sẽ in lên màn hình số 15.

x). Vì thế các số thực thường được in có định dạng. Nếu gán: Ho_ten:=‘ Tran Van Thanh’. như sau: Ở đây ta dùng ký hiệu 2 để chỉ một ký tự trắng. Ðối với các biểu thức kiểu số thực thì lệnh: Writeln( biểuthức ).2. sẽ in lên màn hình : x = 2. y). sẽ in lên mà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: ‘ và Ho_ten. Writeln(‘ y= ‘. thì lệnh Writeln(‘Ho va ten: ‘. Ví dụ. Ho_ten). ‘=‘ . còn Ho_ten là một biến kiểu chuỗi nên sẽ in gía trị mà biến này đang chứa. In có định dạng: a). cho x. giống như cách viết số thông thường. y là hai biến thực và gán x:=100/4. tức là một hằng chuỗi nên sẽ được in nguyên văn lên màn hình.3. Chúng khác nhau hoàn toàn: ‘Ho va ten: ‘ là một gía trị chuỗi. 4+15). trong đó có 10 ký số trong phần định trị. còn X đại diện một ký số . bằng lệnh: Writeln( biểuthức : n : k ). 2*3<5).Lệnh Writen(‘ket qủa x=‘ . y:=-9/300.5000000000E+01 y = -3. .2. thì hai lệnh sau : Writeln(‘ x= ‘. sẽ in gía trị của biểu thức ra dưới dạng dấu chấm thập phân di động có cả thảy 17 ký số. sẽ in ra: ket qua x=19 Lệnh Writeln(‘A’ . sẽ in ra: A=FALSE vì biểu thức 2*3< 5 có kết qủa là FALSE.0000000000E-02 7. In số thực có định dạng: In các số thực theo cách trên rất khó đọc.

và thêm các khoảng trắng ở bên trái cho đủ n cột. trên màn hình sẽ hiện : x=12345. Nếu n lớn hơn độ dài của gía trị cần in thì gía trị sẽ được in dồn về bên phải. Nếu số cần in có ít hơn n chữ số thì nó sẽ được in dồn về bên phải và thêm các ký tự trắng ở bên trái cho đủ n cột. x:0:2). ấn định dùng n cột để in gía trị của biểu thức. in ra: * (có 2 ký tự trắng trước dấu *) . b). chuỗi và lôgic có định dạng : Dùng lệnh : Writeln(biểuthức : n).675.có 2 ký tự trắng) Nếu n nhỏ hơn chiều dài của số cần in thì số sẽ được in ra với đầy đủ các chữ số trong phần nguyên. y:=-123. in ra: Pascal (có 3 ký tự trắng trước chữ Pascal) Lệnh Write(‘Pascal’ :2). Ví dụ.00 ( trước số 2 có 1 ký tự trắng) y= -123. y:10:3).4824. y là các biến kiểu thực và: x:=100/4. Ví dụ. trong đó có k cột dành cho phần thập phân. ký tự.Ở đây n và k là các số tự nhiên. Writeln(‘ y=‘. In kiểu nguyên. in ra: 45 (có 2 ký tự trắng trước số 45) Lệnh Write(5+40:1).68 Ở đây máy đã làm tròn số khi bỏ số lẻ cuối cùng.482 (trước dấu . sẽ in lên màn hình: x= 25. Ví dụ: Lệnh Write(5+40:4). Writeln(‘x= ‘. trong đó n là số nguyên ấn định số cột dùng để in gía trị của biểu thức. x:6:2). Nếu n nhỏ hơn độ dài của gía trị cần in thì gía trị sẽ được in nguyên văn. khi thực hiện các lệnh sau : x:=12345. in ra:Pascal (in nguyên văn) Lệnh Write(‘*’:3). in ra:45 (in nguyên văn gía trị 45) Lệnh Write(‘Pascal’ :9). cho x. Hai lệnh sau : Writeln(‘ x=‘.

1: Dưới đây là chương trình cho phép nhập họ tên. Lệnh: Writeln. Writeln(‘ ********************** ’). Var Ten : String[18]. ‘*’:2). Ten:19. in Ten chiếm 19 cột. Maso:12. y. Write(‘ Nhap ma so sv : ‘). không in gì cả. y. rồi in họ tên. ‘*’:2). Writeln. Write(‘ Nhap ho va ten: ‘). { in 1 dấu *. j). như hình dưới chẳng hạn : ********************** * Nguyen Van Tuan * * Ma so: 1972508 * ********************** Chương trình cụ thể như sau: PROGRAM VIDU71. chỉ có tác dụng như một lệnh: Write(x. mã số của sinh viên đó trong một cái khung được vẽ bằng các dấu sao *. in Maso chiếm 12 cột. Writeln(j). in tiếp dấu * chiếm 2 cột } . { in * Ma so. Write(y). mã số của một sinh viên. chỉ có tác dụng như một lệnh: Writeln(x. Ví dụ 7. Readln(Ten).Các chú ý: Nhóm ba lệnh: Write(x). Uses CRT. in tiếp dấu * chiếm 2 cột } Writeln(‘* Ma so:’ . Maso : String[11]. { in 22 dấu * } Writeln(‘*’. Write(j). Readln(Maso). j). Nhóm ba lệnh: Write(x). chỉ đơn giản là đưa con trỏ xuống dòng dưới. Begin CLRSCR. Write(y).

. xanh.EXE> Chép tập tin nguồn <VD71. Trong chương trình. tên2. Ví dụ : Var Ph1. tim.4. ký tư. End.1.PAS> 7. . trang. tênN) . nau). Ten_mau cũng là kiểu dữ liệu liệt kê và có sáu giá trị là : den. tim. lôgic và kiểu chuỗi.Writeln(‘**********************’). Ten_mau = (den.. Khi một kiểu liệt kê đã được định nghĩa thì có thể khai báo các biến thuộc kiểu liệt kê này bằng từ khóa Var.4. Turbo Pascal còn cho phép người thảo chương có thể tự xây dựng các kiểu dữ liệu mới. KIỂU LIỆT KÊ và KIỂU ÐOẠN CON 7.. Kiểu liệt kê được định nghĩa bằng cách sử dụng từ khóa TYPE và liệt kê ra tất cả các gía trị của kiểu. thực.4.1. ta có thể gán : Ph1:=nam. vang. Theo khai báo này thì Phai là một kiểu dữ liệu liệt kê chỉ có hai giá trị là nam và nu. Ví dụ : Type Phai=(nam. tên2.. trang.. Chạy<VD71. xanh.. vang. Kiểu liệt kê (enumerated type) : 7. Cách khai báo : Ngoài các kiểu dữ liệu đã có sẵn như kiểu nguyên. nau. { in 22 dấu * } Readln.1. nu) . trong đó tên1.. tênN là các tên tự đặt theo đúng quy ước về đặt tên. M2 : Ten_mau . theo mẫu sau: Type Tênkiểu = (tên1.. M1. Ph2 : Phai.

tim.4.1. các gía trị liệt kê có thể so sánh với nhau theo quy tắc: gía trị nào có số thứ tự nhỏ hơn thì nhỏ hơn: den < trang < xanh< vang< tim< nau Hàm PRED(tên) và hàm SUCC(tên) : trả về gía trị đứng ngay trước và ngay sau tên trong kiểu liệt kê tương ứng. Nhập . M1:=den. M2:=trang. trang. Ví dụ : các biến Ph1. 7. Các hàm liên quan đến kiểu liệt kê: Hàm ORD(tên) : Trả về số thứ tự của tên trong kiểu liệt kê.1. Ph2. Ord(xanh)=2 Thông qua hàm Ord. 7. Pascal còn 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 bằng cách liệt kê các gía trị mà biến có thể nhận. M2 : ( den. Ví dụ: Ord(nam)=0. Ph2 : (nam. Các gía trị liệt kê được đánh số thứ tự bắt đầu từ 0. M2 nói trên có thể khai báo trực tiếp như sau: Var Ph1. ví dụ: Phai(0)=nam Ten_mau(2)= xanh Hàm này là hàm ngược của hàm Ord.3.4. Ví dụ: Pred(nu)=nam Pred(nau)=tim Succ(den)=trang Hàm Tênkiểu(k) : trả về giá trị liệt kê có số thứ tự là k trong Tênkiểu. xuất kiểu liệt kê: .Ph2:=nu. M1. nau). vang. nu) .2. xanh. M1.

ta dùng hai lệnh: Readln(St). lôgic. . Var Ch : Chu_hoa. xuất trực tiếp bằng lệnh Readln và Write đượ?. VAR Tênbiến : Tênkiểu. Ðây là hạn chế của kiểu liệt kê. If St=‘xanh’ then M1:=xanh. T: Tuoi. Kiểu đoạn con (Subrange type): Kiểu đoạn con được mô tả bằng cách chỉ ra phạm vi gía trị mà các biến thuộc kiểu đó có thể nhận : TYPE Tênkiểu = hằng1.hằng2. hoặc khai báo trực tiếp : VAR Tênbiến : hằng1.’Z’. hay liệt kê Ví dụ: Type Chu_Hoa =‘A’. Tương tự.Các gía trị liệt kê không thể nhập. Muốn in màu xanh lên màn hình . 7. Theo khai báo này thì ch là một biến kiểu đoạn con. hằng1< hằng2 là hai hằng thuộc cùng một kiểu dữ liệu. khiến nó không thông dụng.. Khi muốn nhập hay xuất kiểu liệt kê..200. có thể nhận các gía trị là các ký tự từ ‘A’ đến ‘Z’. muốn nhập màu xanh cho biến M1. tương tự. Tuoi= 0.2. Chẳng hạn. ta có thể dùng một biến trung gian St kiểu chuỗi. ta dùng lệnh : If M1=xanh then Writeln(‘xanh’).. trong đó. Kiểu dữ liệu của hằng1 và hằng2 chỉ có thể là kiểu nguyên.4.. biến T có thể nhận các gía trị là các số nguyên từ 0 đến 200.hằng2. ký tự.

sau khi thực hiện hai lệnh : x:=10 . Tùy theo phạm vi hằng1. thì máy sẽ báo lỗi "const out of range". Trong ví dụ trên. Câu 2: Cho x. Câu 3: Cho x là biến kiểu thực. c) x+y:=z. b) 10. nếu đối với biến T mà gán: T:=201. lệnh nào là sai: a) x:=y+z. d)Readln(x. Kết qủa in lên màn hình là : a) 10. y là các biến kiểu thực. b) Readln(x.0000000000E+01. y. x).5).’Z’. Ví dụ.. CÂU HỎI TRẮC NGHIỆM Câu 1:Cho x. z:0:2).5. c) Readln(x:5:2). b) Readln(‘x= ‘. d)+1. việc khai báo đoạn con có tác dụng tiết kiệm bộ nhớ. Ngoài ra khi chạy chương trình trong mode {$R+}. c) 1. T : 0. z là các biến kiểu thực. . lệnh nào là đúng : a) Readln(x. 7. d) Writeln(x+y. y. chương trình sẽ dừng ngay nếu biến nhận gía trị vượt khỏi phạm vi.Cũng có thể khai báo hai biến Ch và T trực tiếp theo cách sau: Var Ch : ‘A’. Kiểu liệt kê và kiểu đoạn con thuộc loại đơn giản và đếm được..0000000000E+01. Trong nhiều trường hợp.. Kiểu đoạn con còn cho phép kiểm soát được gía trị của biến có vượt ra ngoài phạm vi của nó hay không.200. Writeln(x). mỗi biến Ch hay T sẽ được chứa trong 1 byte. z). y).hằng2 mà Turbo Pascal sẽ cấp phát cho biến một số byte tối thiểu.00.

b) Var x. do. y := Integer . y of Integer. ten : String[15]. Câu 6: Khai báo kiểu liệt kê như sau là sai : Type Mau = (XANH. d) writeln(' X=.Câu 4: Cho biến X kiểu thực và gán X:= 12. X:5:2). Câu 8: Cho khai báo : Var Ho.41 chọn lệnh nào : a)Writeln(X). X:5:2 ' ). y = Integer. c) Var x. y : Integer . c) writeln('X= '. vì : a) Tên do trùng với từ khóa. tim. b) Tên XANH viết chữ hoa. Ðể in lên màn hình như sau: X= 12. b) lô gic. Lệnh nào sai : . Câu 7: Khai báo nào đúng : a) Var x. d)Tên tim viết chữ thường. Câu 5: Kiểu dữ liệu của biểu thức 4 div 6 + 6 / 3 + Ord(‘A’) là : a) nguyên. c)Tên Vang có chữ V hoa . c) ký tư .41 . d) thực. Vang) . b) writeln(X:5). d)Var x.

Câu 2.5?.a) Write(' Ho ten la : ' . y = 2 }. Lệnh nào sai. j. Ho + Ten) . {x = 3. c) đều đúng .5 =1. y = 3 }. k là ba biến nguyên. j. Cho S là biến kiểu Boolean. Ten) . Viết chương trình in lên màn hình như sau : **************** . với {x = 3. c) 3? 4? 5? .4.1 . cách nhập nào đúng : a) 3 4 5?. để nhập dữ liệu cho lệnh: Readln( i. Ho . Câu 10: Cho i. c) S:= 3< 2 and 6 .6. b). j. b) Write(' Ho ten la : ' + Ho + Ten). Ho . b) 3. b) S:= 3< 2. d) S:= (3< 2) and (6 . BÀI TẬP Câu 1. y = 4 }. và {x = 3. d)3? 4? E? . j. nếu đúng thì cho biết gía trị của S: a) S:= 3*2. d) Write(' Ho ten la : '. c) Write(' Ho ten la : '.4.5?. để nhập dữ liệu cho lệnh: Readln( i. k) . Câu 9: Cho i. b) 3. 7. k) . cách nhập nào sai : a) 3 4 5?. Câu 3.5 =1). Ten). k là ba biến nguyên. d)Câu a). Cho biết gía trị của biến lô gic A : A := ( x2 + y2 ? 25 ) and ( x2 + y2 ? 16 ). c) 3? 4? 4+1? . lệnh nào đúng.

b. tạm ứng (TU) và phụ cấp (PC) của một người. Nhập vào số xe (có bốn chữ số) trong biển số xe máy của bạn. Hiện ký tự bằng cách gõ phím Alt với mã của ký tự đó. . 19 mod 10 =9. nơi sinh.?/font> : 200 . Câu 9*. Câu 6. Bạn có may mắn không ?. năm sinh. Cho biết số xe của bạn được mấy nút. Í :205. định dạng các số lấy 2 số lẻ. Câu 5. . tổng thu nhập . ? :187. đơn gía. Câu 7. ? :188. Viết chương trình in lên màn hình thẻ sinh viên có dạng như sau: (Hd: Cho mã của các ký tự :?/font> :201. số lượng. số lượng. . phái và tuổi của người đó. In HT và CL lên màn hình.. Nhập họ tên.. nơi sinh.. Bạn là người may mắn nếu số nút=9. sau đó in các hằng a. tính tổng thu nhập (TTN) của người đó: TTN = ML + PC Tính qũy bảo hiểm (QBH) : QBH=15%* TTN Tính tiền được lãnh (TIEN): TIEN=TTN .QBH In họ tên. Nhập họ tên (HT). Ví du: số xe là 4546. tổng các chữ số là 4+ 5 + 4 + 6 = 19. Nên khai báo các hằng a=‘?/font> ‘. Nhập họ tên (HT). b= ‘Í ‘. qũy bảo hiểm và tiền được lãnh lên màn hình. năm sinh. Câu 8. đơn gía. * **************** Câu 4*. để tạo khung). Số nút là 9. Nhập tên một vật tư. may mắn. In lên màn hình họ tên. c. mức lương tháng (ML) và phụ cấp (PC) của một người.* THAO CHUONG BANG * * NGON NGU PASCAL. tính phần còn lãnh (CL) của người đó: CL = ML -TU + PC. mức lương tháng (ML). Tính tiền và thuế gía trị gia tăng : Tien =số lượng * đơn gía Thuế = 10% Tiền In tên vật tư. phái (nam hay nữ) của một người. tiền và thuế trị gia tăng lên màn hình.? :186... nhớ dùng các phím số bên phải bàn phím.

Nhập tên ba môn học. thì nhớ là các lệnh này phải được đặt trong khối: begin và end . Ta dùng một biến phụ đặt tên là Max để chứa gía trị lớn nhất phải tìm. Nếu Ðiềukiện là sai thì không làm LệnhP mà chuyển ngay sang lệnh kế tiếp.Câu 10.1.1. tức là gồm nhiều lệnh. lệ phí đăng ký là 2000đ.1.1. 8.1: Nhập vào hai số a và b.1. Câu lệnh IF dạng 1: 8. LệnhP có thể là một lệnh đơn giản hoặc một lệnh có cấu trúc.1. Ý nghĩa: Tùy theo Ðiềukiện là đúng hay sai mà quyết định có làm LệnhP hay không. Nếu LệnhP là một lệnh ghép. Chi chú : Câu có đánh dấu * là câu tương đối khó.2. Tính số tiền phải nộp cho tài vụ biết rằng đơn gía mỗi tín chỉ là 25000đ. Ðiềukiện là một biểu thức lôgic cho kết qủa TRUE (đúng) hay FALSE (sai). số tín chỉ của mỗi môn học.1. 8. tìm và in lên màn hình số lớn nhất của hai số đó. lưu đồ và ý nghĩa: Cú pháp : IF Ðiềukiện THEN LệnhP .1. Sơ đồ?cú pháp của lệnh IF được vẽ trong hình 8. Các ví dụ : Ví dụ 8. Thuật toán gồm hai bước: Bước 1: Gán số thứ nhất vào Max.1. Cú pháp. CÂU LỆNH IF 8. Nếu Ðiềukiện là đúng thì làm LệnhP rồi chuyển sang lệnh kế tiếp ở phía dưới. tức là: .

Max :=a . Bước 2: Kiểm tra nếu Max nhỏ hơn số thứ hai thì gán số thứ hai vào Max: If Max < b then Max:=b. Readln(a. và thực hiện các lệnh sau: Min:=a. max : Real. If Min > b then Min:=b. Max:6:2).EXE> Chép file nguồn <VD81. b cũng tương tự. Sang bước 2. Chương trình cụ thể như sau: PROGRAM VIDU81. ta dùng biến phụ Min chứa gía trị nhỏ nhất.PAS> Nhận xét: Việc tìm số nhỏ nhất của hai số a. Readln. tức gía trị của Max là lớn nhất rồi nên không phải làm gì nữa.b). b. { Tim Max của hai so } Var a. biến Max có gía trị bằng a. tức b là số lớn nhất.Max:=a. khi đó gía trị lớn nhất b được gởi vào biến Max * Hoặc là Max >= b. Writeln(‘ So lon nhat la: ‘ . Bước 3: In gía trị Max lên màn hình. có thể xảy ra hai tình huống : * Hoặc là Max < b . . End. Giải thích: Sau bước 1. Begin Write(‘ Nhap a va b :’). Chạy<VD81. If Max < b then Max:=b .

‘Kha’. { Max là số lớn nhất của a và b } If Max < c then Max:=c. Readln(DTB). { phân loại theo DTB } If DTB< 5 then Loai:=‘Kem’. b. ký hiệu là Max. nên biến Loai phải có kiểu dữ liệu là kiểu chuỗi. PROGRAM VIDU82. là Khá nếu 7 ≤ DTB<9. ‘Tbinh’. Loai: String[6]. If Max < b then Max:=b. . Ðầu tiên ta tìm số lớn nhất của hai số a và b.2: Nhập vào họ tên và điểm trung bình (DTB) của một sinh viên. Readln(Ho_ten). là Giỏi nếu DTB ≥ 9. sau đó tìm số lớn nhất của hai số Max và c. DTB: Real. { Phân loại sinh viên } Var Ho_ten: String[18]. In họ tên.Có thể mở rộng thuật toán trên để tìm số lớn nhất trong ba số hoặc nhiều hơn. điểm trung bình và phân loại sinh viên. { Max là số lớn nhất của a. cũng vẫn ký hiệu là Max. Trong chương trình. Dưới đây là các lệnh chính để tìm số lớn nhất trong ba số a. Begin Write(‘ Nhap ho va ten :’). Hãy phân loại sinh viên theo DTB như sau: Loại là Kém nếu DTB<5. Write(‘ Nhap điem trung binh :’). Vì có năm loại cầ? lưu trữ là các chuỗi ‘Kem’. ‘Gioi’. là Tbình nếu 5 ≤ DTB<7. b và c } Ví dụ 8. c : Max:=a. ta dùng một biến phụ đặt tên là Loai để lưu trữ phân loại của sinh viên.

B. C. Loai). X2 : Real. Begin .If (DTB>= 5) and (DTB<7) then Loai:=‘Tbinh’. Writeln(Ho_ten. { #32 là ký tự trắng } Readln. (A ? 0) rồi giải và biện luận phương trình bậc hai: Ax2 + Bx + C = 0 Việc đầu tiên là phải tính Delta : Delta = B2 . If (DTB >= 7) and (DTB< 9) then Loai:=‘Kha’. End. C. If DTB >= 9 then Loai:=‘Gioi’. Chạy<VD82. B. #32 .4AC Sau đó biện luận theo Delta: Nếu Delta<0 : phương trình vô nghiệm Nếu Delta=0 : phương trình có nghiệm kép : Nếu Delta > 0: phương trình có hai nghiệm : Chương trình cụ thể như sau: PROGRAM VIDU83. Delta. #32 . { Giải phương trình bậc 2 } Var A.PAS> Ví dụ 8. DTB:4:1 . X1.EXE> Chép file nguồn <VD82.3: Nhập vào ba hệ số A.

Delta:=B*B .EXE> Chép file nguồn <VD83. C: ‘). C).4*A* C. Until A<>0.Sqrt(Delta) ) / (2*A). End. If Delta > 0 then begin X1 := (-B+ Sqrt(Delta) ) / (2*A). Writeln(‘ Có ng. X2 := (-B . X1:8:2). Writeln(‘X2= ‘ . Writeln(‘X1= ‘ . bằng không hoặc dương. If Delta < 0 then Writeln( ‘ Ptrinh vô nghiệm! ‘). Readln. If Delta = 0 then begin X1:=-B/(2*A). Readln(A). end. X2:8:2). Write( ‘ Nhap cac he so B.Repeat Write( ‘ Nhap he so A khac khong :’). Chú ý rằng khi Delta=0 thì phải làm hai lệnh: . kép X1=X2= ‘ . end. Writeln(‘ Có hai nghiệm : ’). Readln(B. X1:8:2).PAS> Trong chương trình có ba lệnh IF xét riêng từng trường hợp Delta âm. Chạy<VD83.

Chú ý : Trước từ khóa ELSE không có dấu chấm phẩy. Tương tự.1. kép X1=X2= ‘ . nếu nhập A=0 thì phải nhập lại cho đến khi A? 0 mới cho làm tiếp các lệnh ở phía dưới. nên hai lệnh này phải được đặt giữa hai từ khóa begin và end để tạo thành một câu lệnh ghép. Ý nghĩa của lệnh: Tùy theo Ðiềukiện là đúng hay sai mà quyết định làm một trong hai lệnh: LệnhP hoặc LệnhQ . nếu Ðiềukiện là sai thì không làm LệnhP mà làm LệnhQ rồi chuyển sang lệnh kế tiếp ở sau LệnhQ. 8. mà chuyển ngay sang thực hiện lệnh kế tiếp ở sau LệnhQ. tức là gồm nhiều lệnh được đặt trong khối begin và end. .. Câu lệnh IF dạng 2: Cú pháp : IF Ðiềukiện THEN LệnhP ELSE LệnhQ . khi Delta>0 thì phải làm năm lệnh. và do đó cả năm lệnh cũng phải để trong khối begin và end.2.. X1:8:2).X1:=-B/(2*A). Writeln(‘ Có ng. Nếu Ðiềukiện là đúng thì làm LệnhP. Until (sẽ trình bày ở phần sau) để buộc người dùng phải nhập hệ số A? 0. Ngược lại. không làm LệnhQ. LệnhP và LệnhQ có thể là một lệnh ghép. Chương trình có sử dụng lệnh Repeat .

Ví dụ 8. Begin Write(‘ Nhap a va b :’). Min : Real. Writeln(‘ So nho nhat la: ‘ . Min:6:2). Writeln(‘ So lon nhat la: ‘ . Max. Chạy<VD84.EXE> Chép file nguồn <VD83. b. Min:= b. Min:= a. Readln.b). dùng lệnh: If a<b then Max:=b else Max:=a. If a < b then begin Max:= b. end else { trước else không có dấu .4: Ðể tìm số lớn nhất của hai số a và b. } begin Max:= a. End. Chương trình dưới đây sẽ nhập vào hai số a và b.PAS> . Readln(a. { Tim so lon nhat va so nho nhat của hai so } Var a. Max:6:2). end. tìm và in số nhỏ nhất và số lớn nhất của chúng: PROGRAM VIDU84.

Nếu chiso2=1234. ELSE lồng nhau : IF Ðiềukiện1 THEN If Ðiềukiện2 then LệnhP else LệnhQ ELSE LệnhR .3. chiso2.. do lượng điện tiêu thụ vượt qúa 60 kw nhưng chưa vượt qúa 160 kw nên tiền điện được tính là: Tien=60*5 + (130-60) *8 = 860 đ. ông A có chỉ số điện tháng trước là chiso1=1020 và chỉ số điện tháng này là chiso2=1070. thì Ldtt = 1234-1020= 214. do lượng điện tiêu thụ vượt qúa 160 kw nên tiền điện sẽ là: Tien=60*5 + 100*8 + (214-160)*10= 300+800+54*10= 1640 đ. Ldtt. Câu lệnh IF lồng nhau : Trong câu lệnh IF.1. do lượng điện tiêu thụ < 60 nên số tiền sẽ là: Tien = 50*5= 250đ. Chương trình được viết như sau: PROGRAM VIDU85. Tien : Real. { Tính tiền điện } Var Ho_ten: String[18]. Nếu chiso2=1150 thì Ldtt = 1150-1020=130. chỉ số điện kế tháng trước (chiso1) và chỉ số điện kế tháng này (chiso2). Từ kw thứ 61 đến kw thứ 160 có đơn giá 8đ.8. . nếu LệnhP hoặc LệnhQ. hoặc cả hai. Chẳng hạn dưới đây là hai câu lệnh IF. Từ kw thứ 161 trở lên có đơn gía 10đ. Ví dụ 8. lượng điện tiêu thụ tính ra là Ldtt= 1070-1020=50.. biết rằng : Mỗi kw trong 60 kw đầu tiên có đơn gía là 5đ. Ví dụ. chiso1. lại là câu lệnh IF thì ta có cấu trúc IF lồng nhau.5: Nhập vào họ tên một chủ hộ. tính tiền điện tháng này cho hộ.

60)*8 else Tien:=60*5 + 100*8 + (Ldtt . chiso2). Ldtt:=chiso2. If Ldtt<= 60 then Tien:=Ldtt*5 else if Ldtt <=160 then Tien:=60*5+(Ldtt . Tien:10:2). Ho_ten). Readln( chiso1. Writeln(‘ Tiền phải trả là ‘ .160) * 10. Write(‘ Nhap chỉ số tháng trước. Áp dụng công thức toán học: x = elnx với x>0. Readln. chỉ số tháng này: ‘). Writeln(‘ Họ và tên là ‘. Chạy<VD85. Ðể tính Exp(x) và Ln(x).6: Nhập số thực x bất kỳ.Begin Write(‘ Nhap ho va ten :’). tính : Trong Turbo Pascal không có hàm tính căn bậc ba của x. ta có: ta phải dùng hai hàm . Readln(Ho_ten). End.EXE> Chép file nguồn <VD85.chiso1.PAS> Ví dụ 8.

{ Sắp xếp ba tên} . PROGRAM VIDU87. TUAN.PAS> Ví dụ 8. Writeln(‘ gia tri y= ‘ . Readln(x). nhập ba tên là MAI.Ví dụ. BINH.Vậy : Chương trình như sau: PROGRAM VIDU86. C. y : Real. End.Exp( 1/3*ln(-x) )..7: Nhập tên của ba sinh viên. Readln. thì in ra là BINH. Begin Write(‘ Nhap x :’). in các tên đó lên màn hình theo thứ tự đã sắp xếp theo vần A. { tinh y } If x= 0 then y:=0 else If x> 0 then y:=Exp( 1/3*ln(x) ) else y:= . . Chạy<VD86.EXE> Chép file nguồn <VD86. y:8:4). MAI. B. TUAN. { Tinh can bac ba cua x } Var x..

#32 . T2. Chạy<VD87. #32. Write( ‘Nhập tên thứ ba: ‘). #32. T2) ELSE { tức là T2<= T1} If T1<T3 then writeln(T2. T1. #32.Var T1. T3) Else { tức là T3<= T1} if T2<T3 then writeln(T2. T3. #32. IF T1<T2 THEN If T2<T3 then writeln(T1. Readln(T1). End. Writeln(‘ Các tên được sắp thứ tự là:’). #32. #32 . T3) Else { tức T3 <= T2 } if T1<T3 then writeln(T1. Readln(T3). #32. Begin Write( ‘Nhập tên thứ nhất: ‘). Readln. T2. T1) else { tức là T3<= T2 } writeln(T3. T2. T3 : String[8]. T3. #32 . T1. Readln(T2). #32. T1). #32. T2) else { tức T3 <= T1 } writeln(T3.EXE> Chép file nguồn <VD87. #32.PAS> . Write( ‘Nhập tên thứ hai: ‘).

Lệnh IF trong chương trình trên lồng nhau nhiều cấp nên rất phức tạp. Khi học cấu trúc mảng ta sẽ giải bài toán này 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 nào đi với từ khóa IF nào là như sau: xét ngược từ dưới lên, ELSE luôn đi với IF gần nhất ở phía trên nó mà chưa có ELSE để bắt cặp. 8.2. CÂU LỆNH CASE 8.2.1. Cú pháp, lưu đồ và ý nghĩa : Trong một số trường hợp, khi phải lựa chọn một việc trong nhiều việc thì các cấu trúc IF lồng nhau tỏ ra rắc rối, khó viết, khó kiểm tra tính đúng đắn của nó. Việc dùng cấu trúc CASE có thể khắc phục được nhược điểm này. Lệnh CASE có hai dạng, chúng chỉ khác nhau ở một điểm là trong dạng 2 có ELSE LệnhQ, còn trong dạng 1 thì không ( hình 8.3). CASE biểuthức OF hằng1 : LệnhP1; hằng2 : LệnhP2; .... hằngk : LệnhPk; END; CASE biểuthức OF hằng1 : LệnhP1; hằng2 : LệnhP2; .... hằngk : LệnhPk; ELSE LệnhQ; END; Dạng 1 Hình 8.3 : Cú pháp của lệnh Case Chú ý là lệnh CASE phải kết thúc bằng END; Các yêu cầu: Kiểu dữ liệu của biểuthức chỉ có thể là nguyên, ký tự, Lôgic, hoặc kiểu liệt kê hay kiểu đoạn con. Xin nhấn mạnh rằng: biểuthức không được là kiểu thực hay kiểu chuỗi, và đây chính là hạn chế của lệnh CASE so với lệnh IF. Các hằng1, hằng2, ..., hằngk phải có kiểu dữ liệu phù hợp với kiểu dữ liệu của biểuthức. Ý nghĩa: Tùy theo gía trị của biểuthức bằng hằng nào trong các hằng1, hằng2, ..., hằngk mà quyết định thực hiện lệnh nào trong các lệnhP1, lệnhP2, ..., LệnhPk. Cách thức thực hiện của lệnh CASE như sau: Dạng 2

Bước 1: Tính toán gía trị của biểuthức Bước 2: So sánh và lựa chọn: Nếu gía trị của biểuthức = hằng1 thì thực hiện LệnhP1, rồi chuyển sang lệnh kế tiếp sau End, ngược lại: Nếu gía trị của biểuthức = hằng2 thì thực hiện LệnhP2, rồi chuyển sang lệnh kế tiếp sau End, ngược lại: .v.v. Nếu gía trị của biểuthức = hằngk thì thực hiện LệnhPk, rồi chuyển sang lệnh kế tiếp sau End, ngược lại : a) chuyển ngay sang lệnh kế tiếp sau End ( nếu là dạng 1) b) thực hiện LệnhQ, rồi chuyển sang lệnh kế tiếp sau End (nếu là dạng 2) . Hình 8.4 và hình 8.5 là các sơ đồ của lệnh CASE vẽ cho trường hợp k=3. Trong hình vẽ , ta ký hiệu: G là gía trị của biểuthức H1, H2, H3 là hằng1, hằng2, hằng3 P1, P2, P3, Q là LệnhP1, LệnhP2 , LệnhP3 va?LệnhQ.

8.2.2. Các ví dụ : Ví dụ 8.8: Nhập vào họ tên và năm sinh của một người, cho biết người này thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên hay người lớn tuổi, biết rằng: Sơ sinh có tuổi từ 0 đến 1 Nhi đồng : có tuổi từ 2 đến 9 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 trên 50. Chương trình được viết như sau: PROGRAM VIDU88; Var Ho_ten: String[20]; Namsinh, Namnay, Tuoi : Integer ; Phanloai : String[14]; Begin Write(‘ Nhập họ và tên: ‘); Readln(Ho_ten); Write(‘ Nhập năm sinh và năm nay : ‘);

Readln(Namsinh, Namnay); Tuoi:=Namnay - Namsinh; If Tuoi< 0 then writeln( ‘Nhập sai ‘) else begin Case Tuoi OF 0 ,1 : Phanloai:= ‘sơ sinh’; 2 ..9 : 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 là hai số 0 và 1 viết cách nhau bởi dấu phẩy, và dòng : 0,1: Phanloai:=‘So sinh’ ; có nghĩa là khi Tuổi bằng 0 hoặc bằng 1 thì thực hiện lệnh gán: Phanloai:=‘So sinh’ ; Ðóng vai trò hằng2 là tất cả các số nguyên trong phạm vi từ 2 đến 9, và dòng : 2 ..9 : Phanloai:= ‘nhi đong’; có nghĩa là khi Tuổi bằng một trong các số nguyên từ 2 đến 9 thì thực hiện lệnh gán: Phanloai:= ‘nhi đong’;

Ví dụ 8.9: Xây dựng thực đơn cho phép lựa chọn một trong bốn việc : tính tổng , tính hiệu, tính tích hoặc tính thương của hai số x, y nhập từ bàn phím. Màn hình cần hiện ra bốn mục sau cho mọi 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 nào ta gõ chữ cái đầu của mục đó. Ví dụ gõ A? thì màn hình hiện kết qủa của x+y, gõ B? thì hiện kết qủa của x-y, ... Ðối với mục D, nếu y khác không thì in kết qủa của x/y, còn y=0 thì in câu " Không xác định". Nếu người dùng nhập một ký tự khác A, B, C, D, a, b, c, d thì máy hiện lời nhắc : " Không có mục này ". Biến Ch kiểu ký tự được dùng để lưu chữ cái (mục) mà người dùng đã chọn. Tùy theo giá trị của Ch mà lệnh CASE sẽ quyết định phải làm gì. Chương trình được viết như sau : PROGRAM VIDU89; { Thực đơn } Uses Crt; Var x, y : Real; Ch : Char; Begin Clrscr; Write('Nhap x va y:'); Readln(x, y); Gotoxy(10, 3); Write('A. TINH TONG HAI SO'); Gotoxy(10, 5); Write('B. TINH HIEU HAI SO'); Gotoxy(10, 7); Write('C. TINH TICH HAI SO');

dòng thứ n trên màn hình. Gotoxy(2. 8. 10 và 12: có 31 ngày. đặt con trỏ màn hình vào tọa độ cột 10. n) thuộc thư viện CRT. END.Gotoxy(10. CASE Ch of 'A'. D) ?:'). nhưng nếu là năm nhuận thì có 29 ngày. 6. 'a': Writeln('Tong ='. Ch). có chức năng đặt con trỏ màn hình vào tọa độ cột thứ m. x-y :6:2). và 11: có 30 ngày. B. 7. Chạy<VD89. 'c': Writeln(' Tich ='. x/y:6:2 ) else Writeln(' Khong xac dinh !').PAS> Trong chương trình có sử dụng thủ tục : GOTOXY ( m. Theo dương lịch : Các tháng 4. 'b': Writeln(' Hieu ='. Các tháng 1.10: Nhập vào tháng và năm. Write('-Ban chon muc nao (A. Readln. Readln(Ch). TINH THUONG HAI SO'). End. Write('D. 'd': If y<>0 then Writeln(' Thuong ='. 5. C. 'B'. 3. 'C'. . Ví dụ 8. Riêng tháng 2 thì bình thường có 28 ngày. Ví dụ lệnh Gotoxy (10. năm 2000). Cách xác định một năm là nhuận như sau: * hoặc là năm chia hết cho 400 (ví dụ năm 1600. ELSE Writeln(' Khong co muc '. 3). cho biết tháng đó trong năm đó có bao nhiêu ngày.EXE> Chép file nguồn <VD89. 9). x*y :6:2). 'D'. x+y :6:2). 9.11). dòng 3.

8. If Nhuan= TRUE then Songay:=29 else Songay:=28. 3. Readln(Thang. If (Thang<1) or ( Thang>12) then writeln(‘ Nhập sai ’) else begin Case Thang OF 4. Nam : ‘). 9. { Hết Case } Writeln(‘ Số ngày là : ‘ . 11 : Songay:=30. End. 2 : begin Nhuan:= (Nam mod 400=0) or ( (Nam mod 100<>0) and (Nam mod 4=0) ). 6. PROGRAM VIDU810. 10. 1992. 12 : Songay:=31. Nhuan : Boolean. .* hoặc là năm không chia hết cho 100 và chia hết cho 4 ( ví dụ các năm 1988. Begin Write(‘Nhập Thang. Songay : Integer . Songay). { Xác định số ngày của tháng } Var Thang. End. Nam). 1996 đều là năm nhuận). Trong chương trình ta dùng một biến lôgic có tên là Nhuan để xác định có phải là năm nhuận hay không. 7. end. Readln. end. 5. Nam. 1.

. LệnhP2. khi Tháng=2 thì phải làm hai lệnh được đặt trong khối begin và end..PAS> Trong ví dụ này.2. Loai : Char..0 1. phân loại lao động và nơi làm việc của một công nhân. Câu lệnh CASE lồng nhau : Trong cấu trúc CASE. khi một trong các LệnhP1. Coso : Byte.0 Cơ sở 2 2. nên tiền thưởng là =2.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.3.0 Ví dụ nếu ông X được xếp loại A và làm việc ở cơ sở 1 thì có hệ số thưởng là 2. PROGRAM VIDU811. Trong đó Hệ số được tính dựa vào kết qủa bình chọn phân loại lao động (loại A..0*200=400. cụ thể như sau : Loại A B C Cơ sở 1 2. đó chính là một lệnh ghép: begin Nhuan:= (Nam mod 400=0) or ( (Nam mod 100<>0) and (Nam mod 4=0) ).5 1. LệnhPk hay LệnhQ lại là một lệnh CASE thì ta có cấu trúc CASE lồng nhau. 8. { Tính tiền thưởng cho công nhân } Var Ho_ten: String[20]. tính tiền thưởng cho người đó.EXE> Chép file nguồn <VD810.0.8 1.Chạy<VD810. end. B hay C) và nơi làm việc (cơ sở 1 hay cơ sở 2) của mỗi người trong tháng. Ví dụ 8.5 1. . If Nhuan= TRUE then Songay:=29 else Songay:=28. Viết chương trình nhập họ tên.

2: Heso:=2.PAS> 8. Readln(Loai). Writeln(‘Họ và tên Tiền thưởng ‘).B.8. ‘c’: Heso:=1.EXE> Chép file nguồn <VD811. end. Readln(Coso).2. { Hết CASE } Thuong:=Heso*200. Thuong:8:2 ). Write(‘ Nhập cơ sở làm việc (1. END. End.Heso. ‘a’: Case Coso of 1: Heso:=2. Readln. Chạy<VD811. ‘C’.4. So sánh lệnh Case với lệnh If : . Thuong : Real. end.5.0. Begin Write(‘ Nhập họ và tên: ‘). Readln(Ho_ten). ‘b’: Case Coso of 1: Heso:=1. ‘B’. CASE Loai OF ‘A’. 2: Heso:=1. Write(‘ Nhập phân loại lao động (A. Writeln(Ho_ten .2): ‘).0.C) : ‘).5.

b) If N < 10 Write (' Nho hon 10 ') else then write (' Lon hon 10 '). 8. Tuy nhiên không phải lệnh If nào cũng thay bằng lệnh Case được..9. Ví dụ lệnh Case trong chương trình nói trên ( Ví dụ 8.0 else Heso:=2.11 ) có thể thay bằng ba lệnh If sau: If (Loai=‘A’) or (Loai=‘a’) then if Coso=1 then Heso:=2.8. Câu 2: Cho N là biến kiểu nguyên. 8. còn lệnh Case thì yêu cầu biểu thức và các hằng phải thuộc kiểu dữ liệu đếm được: nguyên.. người ta dùng lệnh Case để thay thế các cấu trúc If lồng nhau khi có nhiều ( ba. bốn.10.5. Thông thường. 8. Nhưng cấu trúc If tổng quát và mạnh hơn cấu trúc Case vì lệnh If không hạn chế gì cả. CÂU HỎI TRẮC NGHIỆM Câu 1: Lệnh nào sau đây in ra màn hình số lớn nhất giữa A và B : a) If A > B then write(B) else write(A). cho phép lựa chọn một công việc trong nhiều công việc được lựa chọn. không được là kiểu thực hay chuỗi. If (Loai=‘B’) or (Loai=‘b’) then if Coso=1 then Heso:=1.5 else Heso:=1. If (Loai=‘C’) or (Loai=‘c’) then Heso:=1.0. b) If A > B then write(A) else write(B). d) If A < B then writeln(A) else writeln(B). từ đó dễ đọc.Lệnh If và lệnh Case đều là các câu lệnh rẽ nhánh. liệt kê hay đoạn con. c) If A > B then Readln(A) else Readln(B).3.8. chọn câu đúng cú pháp : a) If N < 10 then write (' Nho hon 10 ') .11 nhưng thay lệnh Case bằng các lệnh IF. Các bạn hãy viết lại các chương trình trong các ví dụ 8. . c) If N < 10 then write (' Nho hon 10 ') else write (' Lon hon 10 '). lô gic. dễ hiểu hơn. else write (' Lon hon 10 '). . ký tự. Lệnh Case nào cũng có thể thay thế tương đương bằng các lệnh IF. ) tình huống rẽ nhánh và khi điều kiện cho phép . 8. Việc sử dụng lệnh Case trong nhiều trường hợp có tác dụng làm rõ ràng và nổi bật bố cục của một đoạn chương trình.

chọn lệnh nào : a) if (a > 1) and ( b > 1) and ( c > 1) then write(1). end. 2: i:=i+2. sau khi thực hiện các lệnh: N:= 9. c) if a > 1 and b > 1 and c > 1 then write(1). 1: Writeln(‘ Le ‘). b. . b) if (a > 1) or (b > 1) or (c > 1) then write(1). If N< 0 then writeln(‘ So am‘) else Case N mod 2 of 0: Writeln(‘ Chan’). Case i of 1: i:=i+1. d) if a. 3: i:=i+3. c đều lớn hơn 1 thì in số 1. b . c đều > 1 then write(1). Câu 4: Cho i là biến nguyên. Câu 3: Kiểm tra nếu ba số a. Sau khi thực hiện các lệnh : i:=2.d) If N < 10 then N := 10 else N > 20 then write (' N > 20 '). Gía trị sau cùng của i là : a) 2 b) 3 c) 4 d) 5 Câu 5: Cho N là biến nguyên.

3: i:=i+3. if x > -1 then y:=Sin(x) else y:= 2*x+1. Case i of 1: i:=i+1.end. x<= -1 y = sinx . -1<x<= 0 x . x>0 Nhóm lệnh nào tính đúng y : a) if x > 0 then y:=x . Kết qủa in lên màn hình là: a) Chan b) Le c) So am d) không in gì cả Câu 6: Cho hàm số: 2x-1 . Câu 7: Giả sử i là biến nguyên. End. 2: i:=i+2. b) if x <= -1 then y:=2*x +1 else if x <=0 then y:=Sin(x) else y:=x. else i:=2*i. thì gía trị sau cùng của i là : a) 10 . sau khi thực hiện các lệnh : i:=5.

14 : ch:='D'. i biến nguyên. else ch:='C'. Ðể gán trị cho biến ch. else ch:='A'. end. ch:='E'.20: ch:='C'... thì lệnh : Case i of 0.8 : ch:='B'.b) 6 c) 8 d) 9 Câu 8: Cho ch biến ký tự. 15. tương đương với nhóm lệnh nào : a) If i<0 then ch:=’C’ b) if (i >= 0) and (i<= 2) then ch:='A'.2 : ch:='A'. End. 3. Case i of 0. i biến nguyên. thì gía trị sau cùng của ch là : a) 'A' b) 'B' c) 'C' d) 'E' Câu 9: Cho ch biến ký tự.24: ch:='B'..1. 21.. sau khi thực hiện các lệnh: i:= -15. .

giải và biện luận các hệ phương trình sau theo quy tắc Cramer : . BÀI TẬP Câu 1) Nhập bốn số x1. S:= 4. Câu 10: Khi chạy chương trình : Var S. ngược lại. 8. Ví dụ : nhập A in ra a. nếu là chữ hoa thì đổi thành chữ thường. tìm số lớn nhất và số nhỏ nhất của bốn số đó . if ( i > 5 ) then S:= 5 /2 + ( 5 . Giá trị sau cùng của S là : a) 0 b) 3 c) 20 d) 40 if (i>=3) and (i<=8) then ch:='B' else ch:='C'. nếu là chữ thường thì đổi thành chữ hoa. x4 . Begin i := 3. Câu 3) Nhập các hệ số.i ) * 2 else if ( i > 2 ) then S:= 5 * i else S:= 0. End.else if i<=2 then ch:=’A’ else if i<=8 then ch:=’B’ else ch:=’C’ . x3. x2. i : Integer.4. Câu 2) Nhập một chữ cái. nhập b thì in ra B.

Câu 4) Nhập số thực x và tính : (Hd: dùng hàm ex và Lnx. Chức vụ (giám đốc. xét ba trường hợp x=0. Câu 5) Nhập số thực x và tính: y= Câu 6) Nhập x thực và tính y theo công thức : Câu 7) Nhập họ tên một chủ hộ. chỉ số điện kế tháng trước và tháng này. Câu 9) Tính tiền thuê máy cho một lớp học như sau : Nhập GBD ( giờ bắt đầu làm) : 6 ≤ GBD ≤ 20 GKT ( giờ kết thúc làm) : GBD < GKT ≤ 21 SLM ( số lượng máy ). Từ kw thứ 101 trên định mức trở lên có đơn gía 10đ. NV ) và Mức lương tháng của một người. Mức lương . Câu 8) Nhập Họ tên.Tính: Phụ cấp lương cho ngưới đó như sau : PC = 50% Mức lương tháng nếu là 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. x<0). trưởng phòng.khi nhập gõ tắt là: GD. phó phòng hay nhân viên . . PP. Phụ cấp và Tổng thu nhập lên màn hình . biết rằng: Mỗi kw trong định mức có đơn gía là 5đ. định mức điện hàng tháng của hộ. TP. Hãy tính tiền điện cho hộ.Chức vụ. x>0. 100 kw đầu tiên trên định mức có đơn giá 8đ.

. Nhâm. biết rằng năm 1999 là năm Kỷ Mão. Có 10 Can là: Giáp. tháng 5. Ngọ. không có môn nào bị điểm<5 : loại Trung bình.. 21 ≤ TONG<27 :-Nếu có một môn bị điểm < 7 : loại Trung bình. 20 Khá : khi TONG= 21. 26 Giỏi : khi TONG ≥ 27 In lên màn hình Họ tên. Câu *11) Cũng hỏi như bài 10 nhưng phân loại như sau : TONG <15 :-Loại Kém 15 ≤ TONG<21 :-Nếu có một môn bị điểm < 5 : loại Kém.. áp dụng trước 16 giờ 3 ngàn đồng/ 1 giờ/ 1 máy. các điểm Toán. Câu 12) Nhập một tháng. Ðinh. tháng 8. áp dụng sau 16 giờ. Câu *15) Năm âm lịch tính theo Can và Chi. 22. Hợi.Cho biết đơn gía : 2.5 ngàn đồng/ 1 giờ/ 1 máy.. Canh. Qúy. Bính. Hạ. Sửu. biết rằng tháng 2. Mùi. cho biết tháng đó thuộc mùa nào (Xuân. cho biết ký tự đó thuộc loại nào: là chữ hoa. Ðông). Ất. không có môn nào bị điểm < 7 : loại Khá. Dậu. in chúng theo thứ tự tăng dần. Mão. 7: mùa Hè. 12. 1: mùa Ðông.. LY. . Tân. . TONG và Phân loại. không có môn nào bị điểm < 9 : loại Giỏi. GKT không nguyên ? Câu 10) Nhập Họ tên. GKT đều nguyên ? b) GBD. Thu. Tỵ. Thìn.14 Trung bình : khi TONG= 15. TONG ≥ 27 :-Nếu có một môn bị điểm < 9 : loại Khá. 1. và có 12 Chi là: Tý. là chữ số hay các ký tự khác. 10: mùa Thu. là chữ thường.. Kỷ. HOA... Mậu. . Hãy nhập vào một năm dương lịch cho biết năm âm lịch tương ứng. Hóa ( kiểu nguyên ) cho một người. Lý. Tuất . Dần. . 16. 9. Tính Tổng điểm ba môn : TONG = TOAN + LY + HOA và phân loại như sau : Kém : khi TONG= 0. Câu 13) Nhập một ký tự bất kỳ. 2. và tháng 11. 6. Câu 14) Nhập ba số bất kỳ. Thân. các điểm TOAN. 3. 4 là mùa Xuân.. Giải quyết bài toán trong hai trường hợp : a) GBD.

cân.1. Cách thức hoạt động của FOR: Bước 1: Gán giá trị biến := m1. vuông cân. c có phải là ba cạnh của một tam giác không . Quay lại bước 2.1.1. lưu đồ. LệnhP có thể là một lệnh đơn giản. LệnhP sẽ được làm đi làm lại. c . ký tự hay lô gic. bắt đầu khi biến=m1.1. CÂU LỆNH LẶP FOR 9. Vì thế.1. Bước 3 : Tăng gía trị của biến : biến:=Succ(biến). m1. và kết thúc khi biến =m2+1. Nếu biến >m2 thì không làm LệnhP mà chuyển sang lệnh kế tiếp ở phía dưới. m2 là các biểu thức có cùng kiểu dữ liệu với biến. Hình 9.Câu *16) Nhập độ dài ba cạnh a. Câu lệnh FOR dạng 1: 9. Tóm lại. cả thảy là m2-m1+1 lần. không thể là kiểu thực hay chuỗi. rồi sang bước 3. hoặc là một lệnh ghép gồm nhiều lệnh đặt trong khối begin và end. b. lệnh có cấu trúc. b.Cho biết a. cách thức hoạt động : Cú pháp: FOR biến := m1 TO m2 DO LệnhP.1. người ta gọi FOR là vòng lặp có số lần lặp đã biết trước.1 là sơ đồ khối của lệnh For với b là viết tắt của biến. nếu là ba cạnh của một tam gíac thì cho biết đó làm tam giác gì: đều. Bước 2: Nếu biến ≤ m2 thì làm LệnhP. Cú pháp . . thường là kiểu nguyên. vuông hay tam giác thường ? 9. Yêu cầu: biến phải thuộc kiểu dữ liệu đơn giản đếm được.

10. { được S=12+22+32+. + 102... Khi i thay đổi từ 1 đến 10 thì các số 12. như sau: For i:=1 To 10 DO S:=S+ i*i . được làm cả thảy 10 lầ?..1. lấy gía trị của biến S cộng với i2... Qúa trình này được diễn đạt bằ?g lệ?h FOR..2.+ N2 .. 102 đều được cộng vào S. . trong đó N là một số nguyên dương bất kỳ. ta dùng hai lệnh: .1. Các ví dụ cơ bản : Ví dụ 9... Tại bước thứ i... 22.+ 102 Thuật toán: Bước 0: gán S:=0.v. . lệnh: S:=S + i*i. 32. 2. Một cách tổng quát. Bước 10: gán S:=S+10*10. { S=12+22+32} . { được S=12+22} Bước 3: gán S:=S+3*3. ứng với i=1.. Tóm lại. do đó gía trị của biến S được tăng thêm một lượng bằ?g i2. { gán gía trị ban đầ? cho S} Bước 1: gán S:=S+1*1..9. kết qủa lại được gán cho biến S. kết qủa là sau bước thứ 10 gía trị của S đúng bằng tổng 12 + 22 + 32 + .1: Bài toán tính tổng : Hãy tính tổng : S= 12 + 22+ 32+..v. để tính tổng :S= 12 + 22+ 32+.+102} Qúa trình từ bước 1 đến bước 10 được gọi là phép cộng dồn vào biến S. { được S=12 } Bước 2: gán S:=S+2*2.

For i:=1 to N do S:=S+i*i . Chạy<VD91. Vậy.22 ) + 32 + (.PAS> Mở rộng bài toán tính tổng: Tính tổng đan dấu : S = 12 .i2 ) vào S nếu i chẵn. +(-1)N-1 N2 Nhận thấy.. số hạng thứ i của vế phải có gía trị tuyệt đối bằng i2 . { Tính tổng các bình phương các số tự nhiên <=N} Var N. End. Dưới đây là chương trình cụ thể : PROGRAM VIDU91. mang dấu cộng nếu i lẻ. mang dấu trừ nếu i chẵn.. i : Integer. Writeln(‘S= ‘. Readln(N). . S:=0. Việc xác định i lẻ hay chẵn dựa vào hàm Odd(i) hay kết qủa của phép toán i Mod 2. ta sẽ cộng dồn i2 vào S nếu i lẻ. S : LongInt.42 +.i*i . Begin Write(‘ Nhập N :’). Nói cách khác. For i:=1 To N DO S:=S+ i*i . S). các lệnh sẽ dùng là : S:=0.+(-1)N-1 N2 Ta viết: S = 12 + (. Readln.EXE> Chép file nguồn <VD91..S:=0. và cộng dồn (.22 + 32 ..42 ) + . For i:=1 To N DO if i mod 2 <> 0 then S:=S+ i*i else S:= S.

*10.v.. . Bước 10: gán S:=S*10. 2. i : Integer.. S : LongInt. { được S=1*2*3*.. Dưới đây là chương trình cụ thể : PROGRAM VIDU92. { Tính S=N! } Var N. Begin Write(‘Nhập số dương N : ‘). Một cách tổng quát...Các bạn hãy viết chương trình để tính tổng đan dấu này..*N . { gán gía trị ban đầ? cho S} Bước 1: gán S:=S*1. For i:=1 To N DO S:=S* i . ta phải cộng dồn vào biến S thì trong ví dụ này ta phải nhân dồn vào biến S.2: Bài toán tính tích: Tính S= 10! . 3. và gía trị của S sau bước thứ 10 đúng bằng 1*2*3*. trong đó N là một số nguyên dương bất kỳ..v.. Readln(N).. { được S=1*2*3} .*10 =10!. ta dùng hai lệnh: S:=1. lấy gía trị của biến S nhân với i. để tính tích: S= 1*2*. Khi i thay đổi từ 1 đến 10 thì S sẽ tích lũy đủ các thừa số 1. Ví dụ 9. { được S=1*2} Bước 3: gán S:=S*3.*10 =10!} Nếu trong ví dụ 1.. { được S=1 } Bước 2: gán S:=S*2.10. Thuật toán: Bước 0: gán S:=1. rồi lại gán kết qủa cho biến S. Ta viết S=1*2*3*. Tại bước thứ i.. Qúa trình thực hiện từ bước 1 đến bước thứ 10 được mô tả bằng câu lệnh For : For i:=1 to 10 DO S:=S * i ..

S). Chạy<VD92. S : 6:2). Sau N bước như vậy. Dưới đây là chương trình cụ thể : PROGRAM VIDU93.EXE> Chép file nguồn <VD92. . For i:=1 TO N DO S:=S*x. i : Byte . x : Real . S sẽ được nhân với x đúng N lần. Readln. Tương tự như tính N!: đầu tiên ta gán S:=1. sau đó tại mỗi bước lặp. S. ta nhân dồn x vào S bằng lệnh S:=S*x.S:=1. { Tính S=lũy thừa N của x } Var N. For i:= 1 to N do S := S * x . tính S= xN . N). For i:=1 to N do S:=S * i . Begin Write(‘Nhập hai số x và N : ‘). End.PAS> Ví dụ 9. Vậy hai lệnh cần dùng là: S:=1. Readln( x. S:=1. Writeln(‘Luy thua= ‘. Writeln(‘Giai thua = ‘.3: Bài toán tính lũy thừa: Nhập số tự nhiên N và một số thực x bất kỳ.

For ch:=‘a’ to ‘z’ do begin ch1:=Upcase(ch). Dem: Integer. Dem:=0. If Dem mod 15 = 0 then . Ord(ch) :6 ). . ch1 : Char. Ord(ch1) :6 . (tức Dem mod 15=0) thì phải làm lệnh Readln. Khi Dem = 15. lệnh này sẽ dừng màn hình cho đến khi ta gõ Enter mới in tiếp. 45. Writeln( ch1 :3 . Var ch.4: In bảng các chữ cái từ A đến Z thành bốn cột như sau: KÝ TỰ A B MÃ 65 66 a b KÝ TỰ 97 98 MÃ Yêu cầu in thành từng trang màn hình..PAS> Ví dụ 9. PROGRAM VIDU94. mỗi trang 15 dòng. 30.Readln. mỗi khi in xong một dòng thì biến Dem được cộng thêm 1. Chạy <VD93. Begin CLRSCR. Inc(Dem). { In bảng các chữ cái} Uses Crt. End.EXE> Chép file nguồn <VD93. ch :6 . Writeln(‘ KY TU MA KY TU MA’). Trong chương trình ta dùng biến Dem để đếm số dòng đã in..

Chạy<VD94. Readln. Readln. . cả thảy là m2-m1+1 lần. Bước 2: Nếu biến ≥ m1 thì làm LệnhP.begin Write(‘ Enter để xem tiếp ‘). ngoài ra. end. Tóm lại. 9. Bước 3 : Giảm gía trị của biến : biến:=Pred(biến). Câu lệnh FOR dạng 2: Cú pháp: FOR biến := m2 DOWNTO m1 DO LệnhP. Quay lại bước 2. gồm nhiều lệnh đặt trong khối begin và end.2. LệnhP sẽ được làm đi làm lại. và kết thúc khi biến = m1-1. đóng vai trò LệnhP là một lệnh ghép.1. bắt đầu khi biến=m2. Nếu biến<m1 thì không làm LệnhP mà chuyển sang lệnh kế tiếp ở phía dưới. End. Cách thức hoạt động của FOR dạng 2: Bước 1: gán gía trị biến := m2. Writeln(‘ HET ‘). rồi sang bước 3. end.EXE> Chép file nguồn <VD94.PAS> Chương trình trên là một ví dụ về cách dùng biến chạy kiểu ký tự (ch) trong lệnh FOR.

X. y. { In các chữ cái theo thứ tự đảo ngược từ z đến a} Var .. C.6 : In các chữ cái theo thứ tự ngược từ Z đến A thành hai dòng : Z. 1. .. lệnh FOR dạng 2 về bản chất chỉ là một cách viết khác của dạng 1... A z. c.. ta có thể viết : S=N*(N-1)*(N-2)*. ..Ví dụ 9. x. Tương tự ... để tính S=xN . Như vậy... 2. B. For i:=N downto 1 do S:=S* x. Y. Tức là: S:=1. N-1. như ví dụ sau đây: Ví dụ 9.*2*1 Cách viết cho thấy ngay cách tính: đầu tiên gán S:=1. ta cũng có thể dùng FOR dạng 2 : S:=1. a Chương trình được viết như sau: PROGRAM VIDU96. tuy nhiên có khá nhiều tình huống mà việc dùng lệnh FOR dạng 2 tỏ ra rất hiệu qủa. For i:=N downto 1 do S:=S* i.5: Ðể tính S= N!. sau đó thực hiện việc nhân dồn S:=S* i với i= N. .. Thông thường người ta hay dùng lệnh FOR dạng 1. b.

. Câu lệnh FOR lồng nhau : Trong cấu trúc FOR. rồi lại làm lệnh FOR ở dòng {2}. . khi LệnhP cũng là một lệnh FOR thì ta có cấu trúc FOR lồng nhau: FOR biến1:= m1 TO m2 DO FOR biến2:=n1 TO n2 DO LệnhP. Ví dụ 9. kết qủa lệnhP được làm thêm n2-n1+1 lần nữa. For ch:=‘z’ downto ‘a’ do write(ch :3 ). Lệnh FOR {1} làm m2-m1+1 lần lệnh FOR {2}. Cách thức hoạt động của lệnh này như sau: Ðầu tiên cho biến1:=m1 và làm lệnh ở dòng {2}. Vì thế lệnhP được làm cả thảy là (m2-m1+1)*(n2-n1+1) lần. Readln. Qúa trình trên cứ tiếp tục cho đến khi biến1=m2+1 thì dừng. kết qủa là LệnhP được làm n2-n1+1 lần..1..7: In hình chữ nhật đặc như dưới đây: {1} {2} . đều phải làm LệnhP.v. còn chính lệnh FOR {2} lại làm n2-n1+1 lần LệnhP.. Bây giờ tăng: biến1:=Succ(biến1).EXE> Chép file nguồn <VD96. Writeln. End.3.Ch: Char. Vì dòng {2} là lệnh FOR nên với mỗi gía trị của biến2=n1. Begin For ch:=‘Z’ downto ‘A’ do write(ch:3 ).v. Writeln.PAS> 9. Chạy<VD96. n2.

21. 2. Dãy số Fibonaci { 1. Cả thảy ta phải in n dòng như thế..4. Dưới đây chỉ xin nêu hai ứng dụng . 4. ở đây m và n là hai số nguyên dương nhập từ bàn phím. cần phải đưa con trỏ xuống dòng dưới bằng lệnh: Writeln.. muốn in dòng thứ i. 9. dễ dùng và giải quyết được nhiều bài toán trong khoa học kỹ thuật và trong thực tiễn. 1. 13. tức là chữ A được in liên tiếp cả thảy m lần. . } được nhắc nhiều trong giới khoa học kỹ thuật. Ví dụ 9. end. Writeln.. 5. end) . Uo và U1 lần lượt là hai số hạng đứng ngay trước U. Ðầu tiên ta gán: Uo:=1. Lệnh Write in m chữ A trên một dòng. Các ứng dụng khác của lệnh FOR : Lệnh For rất thông dụng. Thay In dòng i bằng hai lệnh nói trên (đặt trong khối begin . Uk=Uk-1 + Uk-2 với mọi k= 2. U1=1 . Writeln. nó được xây dựng như sau: U0=1... cần phải làm hai lệnh: For j:=1 to m do write(‘A’). .8: Tìm các số Fibonaci. Gọi U là số hạng thứ k.Ta thấy mỗi dòng gồm m chữ A. Tóm lại. In xong. 8. Các bạn hãy viết chương trình cụ thể cho ví dụ này. con trỏ vẫn nằm ở cuối dòng đó.. việc này được làm bằng lệnh : For j:=1 to m do write(‘A’). tức là: For i:=1 to n do In dòng i . ta có thuật toán để in hình chữ nhật đặc là: For i:=1 to n do begin for j:=1 to m do write(‘A’).. 3. 3.1. vì thế trước khi in dòng tiếp theo.

Bước 1: tính U:=Uo+U1 và in U. U1 : Integer.v. tức là gán: Uo:=U1. tức là gán: Uo:=U1. U1:=U. Uo:=1. Bước 2: tính U:=Uo+U1 và in U. Kết qủa là Uo=1 và U1=2. ta cho Uo đóng vai trò của U1 và U1 đóng vai trò của U. i. U. . U1:=U. Begin Write(‘ Nhập N :’). U1:=1. Ðể chuẩn bị tính U4. U1:=U. Ðể chuẩn bị tính U3. Uo:=U1.v. . Uo. Lúc này U=3 chính là U3 . Readln(N). ta lại cho Uo đóng vai trò của U1 và U1 đóng vai trò của U. chương trình được viết như sau: PROGRAM VIDU98. Lúc này U=2 chính là U2 . Kết qủa là Uo=2 và U1=3.U1:=1. Tóm lại các lệnh phải lặp đi lặp lại là: U:=Uo+U1. { In N+1 số Fibonaci đầu tiên } Var N. Vì sang bước sau thì gía trị của U sẽ bị thay đổi nên tại mỗi bước ta đều phải in U.

U1:=U. End. Tính số tiền nhận được sau mỗi tháng gửi biết rằng tiền lãi hàng tháng được gộp vào tiền vốn. .EXE> Chép file nguồn <VD98. Qúa trình cứ lặp đi lặp lại từ tháng 1 đến tháng N. ‘ số Fibonaci đầu tiên là :’ ). Write(Uo:3 .PAS> Ví dụ 9.9: Bài toán tính tiền lãi gửi ngân hàng: Nhập tiền vốn ban đầu. U1:3).Writeln( N+1 .02 = 104. Sau 1 tháng gửi sẽ có số tiền là: Số tiền=100 + 100*0. lãi suất tháng là 2%. For i :=2 to N do begin U:=Uo+U1. Ví dụ. tiền vốn là100. Chạy<VD98.02 = 102 Sau 2 tháng gửi sẽ có số tiền là: Số tiền=102 + 102*0. Uo:=U1.04 Công thức tính tiền thu được sau mỗi tháng gửi là: Số tiền := Tiền vốn + Tiền vốn * Lãi suất Số tiền này lại trở thành tiền vốn của tháng sau. số tháng gửi N và lãi suất hàng tháng. Write(U:3). end. Readln. tức là: Tiền vốn := Số tiền. Chương trình cụ thể như sau: PROGRAM VIDU99.

Begin Write(‘ Nhập tiền vốn. Readln. Sotien:8:2).{ Tính tiền gửi ngân hàng sau N tháng} Var Tienvon.EXE> Chép file nguồn <VD99. Ý nghĩa : Chừng nào Ðiềukiện còn đúng thì cứ làm LệnhP . i : Byte. Cách thức hoạt động của WHILE: Bước 1: Nếu Ðiềukiện sai thì chuyển ngay sang lệnh kế tiếp sau LệnhP. Tienvon:=Sotien. N). rồi quay lại bước 1. Readln(Tienvon. End. end.1. nếu Ðiềukiện đúng thì làm LệnhP.PAS> 9. Chạy<VD99. . Sotien : Real. lưu đồ. ‘ tháng =‘ . ngược lại. For i:=1 to N do begin Sotien:= Tienvon + Tienvon*Laisuat. Laisuat.2. cho đến khi Ðiềukiện sai thì không làm LệnhP nữa mà chuyển sang lệnh kế tiếp ở phía dưới. lãi suất và số tháng gửi : ‘). cách thức hoạt động : Cú pháp: WHILE Ðiềukiện DO LệnhP . Writeln(‘Số tiền sau ‘. CÂU LỆNH WHILE 9. N. Laisuat. i . Cú pháp.2.

trong thân của vòng WHILE cần có ít nhất một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đó thì Ðiềukiện sẽ sai và do đó vòng lặp sẽ kết thúc. Nếu Ðiềukiện không bao giờ sai thì LệnhP sẽ phải làm hoài.2. dùng lệnh WHILE tính S=N!: PROGRAM VIDU910. Trong trường hợp này.} Var N. {9} While i<= N do begin S:=S*i.Lệnh P được gọi là thân của vòng lặp WHILE. để dừng chương trình.. Ðể tránh các vòng lặp vô hạn. . Begin Write(‘ Nhập N > 0 : ‘ ). i : Integer. hãy gõ đồng thời hai phím Ctrl và Pause ( viết tắt là ^Pause). { Tinh S=N! bằng lệnh WHILE. Các ví dụ về lệnh While : Ví dụ 9. S : LongInt. S:=1. i :=1. Readln(N).10 : Nhập số tự nhiên N. 9. lúc đó ta có vòng lặp vô hạn.2.

2. và do đó vòng lặp sẽ vô hạn .02 = 108. Sự khác nhau của lệnh WHILE so với FOR là ở chỗ: trong lệnh FOR.1208*0. trong khi lệnh FOR không giải quyết được. Trong vòng lặp WHILE. Khi i=N+1 thì điều kiện i<=N bị sai và lúc đó vòng lặp kết thúc. Hãy xem ví dụ sau. 3. Qúa trình lặp kết thúc khi tới tháng đầu tiên có Số tiền ≥ S. biến i được tự động gán gía trị ban đầu và sau mỗi bước lặp được tự động tăng lên. ta phải viết các lệnh đó. sau mỗi lệnh S:=S*i. kết qủa là lệnh S:=S*i. Ta tính số tiền có được sau mỗi tháng gửi: Sau 1 tháng gửi: Số tiền=100 + 100*0.PAS> Khởi đầu biến i được gán gía trị 1 (dòng {9}).04 Sau 3 tháng gửi: Số tiền=104. còn trong WHILE thì không. lãi suất hàng tháng là 2%.2432 Vậy chỉ cần gửi N=4 tháng.04*0.. số tiền cần có là S=108.i:=i+1. nếu không có dòng lệnh {13}: i:=i+1.1208 + 106. biến i được tăng lên 1 đơn vị bằng lệnh i:=i+1.02 = 102 Sau 2 tháng gửi: Số tiền=102 + 102*0.04 + 104. S). số tiền sẽ có là 108. Giả sử tiền vốn là 100..02 = 104. End. .1208 Sau 4 tháng gửi: Số tiền=106. thì i luôn luôn bằng 1 nên điều kiện i<=N luôn luôn đúng (vì N ≥ 1). Ví dụ 9. Ðây chính là điểm mạnh của lệnh WHILE.. {13} Writeln(‘ Giai thua = ‘. được thực hiện đúng N lầ? ứng với i=1.2431. . Câu hỏi bây giờ là: cần gửi tối thiểu là bao nhiêu tháng để có được số tiền ? S cho trước. Lệnh WHILE đặc biệt thích hợp với các vòng lặp có số lần lặp chưa biết trước. Chạy<VD910.02 = 106.9). N. Tất cả các bài toán giải quyết được bằng lệnh FOR thì đều giải quyết được bằng lệnh WHILE. end. Trong chương trình trên.EXE> Chép file nguồn <VD910.11: Trở lại bài toá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. Ðặc điểm chung của các bài toán dạng này là số lần lặp của các vòng lặp đã được biết trước. (dòng {13}). Readln.

Sotien:=Tienvon. . Số lần lặp ít hay nhiều phụ thuộc vào gía trị S nhỏ hay lớn và vào tốc độ tăng nhanh hay chậm của số tiền. Tienvon:=Sotien. không phải do ta ấn định từ trước mà tùy thuộc vào biểu thức Sotien < S là mau bị sai hay chậm bị sai. N:=0. Begin Write(‘ Nhập tiền vốn. End. S : Real. . Laisuat.Chương trình như sau: PROGRAM VIDU911.PAS> Số lần lặp của lệnh: While Sotien < S do . . S). Readln(Tienvon. Chạy<VD911. N . Sotien:= Tienvon + Tienvon*Laisuat . Readln. Laisuat. end.EXE> Chép file nguồn <VD911. Writeln(‘ Cần gửi ‘. Sotien:6:2). lãi suất và số tiền S cần có: ‘). { Tính số tháng gửi ngân hàng để có số tiền S } Var Tienvon. Writeln(‘ Số tiền sẽ có = ‘ . ‘ tháng ‘). { N là số tháng gửi } While Sotien< S do begin N:=N+1. Sotien. N : Byte.

12: Ðảm bảo tính hợp lý của dữ liệu nhập từ bàn phím.3. LệnhP cũng được gọi là thân của vòng lặp REPEAT. Cách thức hoạt động của REPEAT: Bước 1: Làm LệnhP. nếu nó gồm nhiều lệnh thì các lệnh đó không cần phải đặt trong khối begin va?end. Cú pháp. Khi giải phương trình bậc hai Ax2+Bx+C=0. cũng như lệnh WHILE. UNTIL Ðiềukiện . lưu đồ. . Sự hạn chế phạm vi đối với các dữ liệu nhập sẽ đảm bảo tính hợp lý của chúng và làm giảm bớt các phức tạp khi biện luận.3. Trong trường hợp này.3. khi tính S=N!. lúc đó ta có vòng lặp vô hạn. cho đến khi Ðiềukiện đúng thì không làm LệnhP nữa mà chuyển sang lệnh kế tiếp ở phía dưới. Nếu Ðiềukiện không bao giờ đúng thì LệnhP sẽ phải làm hoài.2. Ý nghĩa: Chừng nào Ðiềukiện còn sai thì cứ làm LệnhP. ngược lại. Ðặc biệt.9. Ðể tránh các vòng lặp vô hạn. nếu Ðiềukiện đúng thì chuyển sang lệnh tiếp theo ở phía dưới. nếu Ðiềukiện sai thì quay lại bước 1. hãy gõ đồng thời hai phím Ctrl và Pause (^Pause). cách thức hoạt động : Cú pháp: REPEAT LệnhP.1. ta thường giả thiết A? 0. trong thân của lệnh REPEAT cần có ít nhất một lệnh có tác dụng làm biến đổi các đại lượng tham gia trong Ðiềukiện để đến một lúc nào đó thì Ðiềukiện sẽ đúng và do đó vòng lặp sẽ kết thúc. muốn dừng chương trình. Các vòng lặp có số lần lặp biết trước đều có thể giải được bằng lệnh REPEAT. CÂU LỆNH REPEAT 9. Các ví dụ về lệnh Repeat : Ví dụ 9. lệnh REPEAT rất thích hợp với các vòng lặp có số lần lặp không biết trước 9. rồi kiểm tra Ðiềukiện. ta thường yêu cầu N? 0.

45. 18. { Tìm BSCNN của M và N } Var M.Ðể buộc người sử dụng phải nhập A ≠ 0.} số nhỏ nhất chia hết cho M. Trước hết. Readln(A). Ðầu tiên ta gán : BSCNN:=0.. 27. Trong chương trình ta dùng lệnh repeat để nhập hai số M. Ðể đảm bảo chắc chắn nhập N thỏa điều kiện 0<N<20. Begin . If (N<=0) or (N>=20) then write(#7). dưới đây là một cách đơn giản. Lệnh write( chr(7) ) hay write(#7) có công dụng phát ra tiếng kêu bip để cảnh báo người dùng đã nhập dữ liệu sai yêu cầu.. Sau đó cứ làm lệnh BSCNN:=BSCNN+Max . đó là số 45. N đảm bảo dương. Ví dụ 9. . Max. Until A<> 0. Vì N>M nên ta sẽ tìm trong tập các bội số của N :{ 9. nếu nhập A=0 thì bắt nhập lại cho tới khi nhập A ≠ 0 mới thôi. gọi Max là số lớn nhất của M và N. Một cách tổng quát. hãy xem cách tìm BSCNN của hai số M=5 và N=9. BSCNN : Integer.13: Tìm bội số chung nhỏ nhất của hai số nguyên dương M và N. 36. Readln(N). Until (0<N) and (N<20) . PROGRAM VIDU913. Bài toán này có những cách giải khác nhau. hoài cho đến khi BSCNN chia hết cho cả M và N thì dừng. N. ta dùng cấu trúc : Repeat Write(‘Nhập A khác không : ‘). ta dùng cấu trúc : Repeat Write(‘ Nhập N (0<N<20) : ‘).

Traloi là một biến kiểu ký tự (Char). . điều này sẽ bất tiện nếu cần chạy chương trình nhiều lần ứng với các bộ dữ liệu thử khác nhau. nếu muốn dừng thì gõ N? . BSCNN:=0. Ở đây. Until (BSCNN mod N=0) and (BSCNN mod M=0) . N).Repeat Write(‘ Nhập M và N dương :’).PAS> Ví dụ 9. {5} UNTIL (Traloi =‘N’) or ( Traloi=‘n’). Repeat BSCNN:=BSCNN + Max. If N>M then Max:=N else Max:=M. Writeln(‘ Bội số chung nhỏ nhất= ‘. BSCNN) . Cấu trúc sau đây cho phép ta chạy chương trình một số lần theo ý muốn: REPEAT { Các lệnh của chương trình} Write(‘ Tiếp tục nữa không (Y/N) ? :’). Chạy <VD913. Trong Turbo Pascal. nếu muốn chạy tiếp thì ta gõ phím Y ? .14: Thiết kế để chạy nhiều lần một chương trình. Until (M>0) and (N>0). Chú ý : lệnh Readln(Traloi). Readln. Sau khi thực hiện xong {các lệnh của chương trình }. mỗi lần muốn chạy chương trình ta phải gõ cặp phím Ctrl và F9 (viết tắt là ^F9). Readln(Traloi). End. ở dòng thứ {5} có thể thay bằng: Traloi:=Readkey.EXE> Chép file nguồn <VD913. Readln(M.

{ in đỉnh } { In hai cạnh bên của tam gíac } For k:=1 to m-2 do {15} . Until (m>0) and ( m<20) . { In tam giác cân đặc } Uses CRT. Writeln(sao :m). Traloi : Char . If (m <= 0) or ( m>=20) then write(#7). j. Var k. Repeat {11} {9} Write(‘ Nhập m (0<m<20) : ‘). Const sao =‘*’.Hàm Readkey thuộc thư viện CRT cho kết qủa là một ký tự gõ từ bàn phím. Chương trình dưới đây cho phép thực hiện một số lần việc : in tam giác cân đặc có chiều cao m (0<m<20) : PROGRAM VIDU914. nó khác lệnh Readln(Traloi) ở chỗ là khi nhập ký tự ta không cần phải Enter. m: integer. Begin REPEAT Clrscr. Readln(m).

từ dòng {9} đến dòng {28}. End. So sánh các lệnh For. for i:=1 to 10 do s := s+i. nhưng thường dùng cho các vòng lặp có số lần lặp chưa biết trước. Khi chạy đoạn chương trình : s:=0. điều này xảy ra khi thân của một lệnh Repat lại chứa một lệnh Repeat khác: lệnh Repeat thứ nhất. chứa lệnh Repeat thứ hai từ dòng {11} đến dòng {15}. {28} .4. Ngoài ra. 9.EXE> Chép file nguồn <VD914. còn lệnh Repeat thực hiện lệnhP rồi mới kiểm tra điều kiện. CÂU HỎI TRẮC NGHIỆM Câu 1: Cho S và i là biến nguyên. For k:=1 to 2*m-1 do Write(sao). lệnh Repeat kết thúc khi điều kiện đúng.begin Write(chr(32): m-k-1). lệnh While kết thúc khi điều kiện sai. dùng được cho tất cả các loại vòng lặp.3. lệnh Repeat sẽ thực hiện các lệnh ghi trong thân của nó ít nhất được một lần.PAS> Chương trình 9.14 là một ví dụ về hai câu lệnh Repeat lồng nhau. Lệnh While và Repeat khác nhau ở điểm sau: lệnh While kiểm tra điều kiện trước. { in 2k+1 dấu *} Writeln. { in m-k-1 ký tự trắng} For j:=1 to 2*k+1 do Write(sao). UNTIL (Traloi=‘N’) or ( Traloi=‘n’). Vì thế. nếu đúng mới thực hiện các lệnh ghi trong thân của nó ( lệnhP ). Chạy<VD914. While và Repeat: Lệnh For dùng cho các vòng lặp có số lần lặp đã biết trước Lệnh While hay Repeat tổng quát hơn lệnh For. Readln( Traloi). end. 9. Write(‘ Tiếp tục nữa không (Y/N) ?: ‘).3. {in cạnh đáy} Writeln.

j : Integer. d) S := 1. Kết quả in lên màn hình là : a) s = 11 b) s = 55 c) s = 100 d) s = 101 Câu 2: Cho S. i và N>0 là các biến nguyên. FOR i:=1 TO 100 DO S := S + SQR(i). d) S:=1. End.writeln(s). c) S:=0. For i := 1 to N do S := S * i. b) S:=0. for i:= 1 to 3 do for j:= 1 to 4 do S := S + 1 . Ðể tính S = N!. + 1002 .. FOR i:=1 TO 100 DO S := S + i*i. For i:= 1 to N do S := S + i. Câu 3: Cho S = 12 + 22 + . Nhóm lệnh nào tính sai Giá trị của S: a) S:=0. c) S := 1. chọn câu nào : a) S := 1. i. b) S := 0. Giá trị sau cùng của S là : .. For i := 1 to N do S := S * N. For i := 1 to N do S := S * i. Begin S := 0. FOR i:=1 TO 100 DO S := S + i*i. Câu 4-Khi chạy chương trình : Var S. FOR i:=100 DOWNTO 1 DO S := S + i*i.

while i<= 6 do begin S:= S + i. end. Khi chạy đoạn chương trình : S:= 0. Until i > 4 . i : Integer. i:= i + 1.a) 0 b) 12 c) 3 d) 4 Câu 5: Cho S và i biến kiểu nguyên. Repeat S:= S + i * i. . i:= 1. Giá trị sau cùng của S là : a) 6 b) 9 c) 11 d) 0 Câu 6: Khi chạy chương trình : Var S. Begin S:= 0. i:= i + 2. i:= 1. End.

i là các biến nguyên. Until i > 4 . Giátrị sau cùng của i là : a) 20 b) 5 c) 4 . n. Repeat i:=i+1.Giá trị sau cùng của S là : a) 0 b) 14 c) 16 d) 30 Câu 7: Cho i là biến nguyên. i:=5. Repeat i := i + 1. Giá trị sau cùng của i là : a) 6 b) 4 c) 5 d) 0 Câu 8: Cho m. Khi chạy đoạn chương trình : i := 5. n:=5. Until (i Mod m = 0) and (i Mod n = 0). Khi chạy đoạn chương trình : m:=4.

Ðể lệnh Readln(A) được thực hiện ít nhất một lần.. lệnh nào trong các lệnh dưới đây ? a) A:=0. chọn câu nào : a) S := 1. while i<= 10 do i := i + 1.. end. while i<= 10 do S := S * i. . d) S := 1.. while i<= 10 do begin S := S * i. phải điền vào chỗ . b) A:=1. Câu 10: Giảsử các khai báo biến đều hợp lệ. Ðể tính S = 10!. S := S * i. i := i + 1. d) A <> 0. i := 1. i := 1.d) 0 Câu 9: Cho chương trình : Var A : Real. Begin . i := 1. c) S := 0. While A = 0 do begin write ('nhap A # 0:'). Readln (A). while i<= 10 do begin S := S * i. i := 1. End. b) S := 1. c) A:=-1..

i := i + 1..4 + 3. Câu 2) Nhập một số nguyên dương N.3 + 2.4. k nguyên đảm bảo phải dương và k<= n. Tính tổ hợp chập k của n theo công thức : . end. end.5. yêu cầu hiển thị từng trang một .+ n(n+1)(n+2) Câu 5) Nhập một số nguyên dương n . Tính : S4 = 1. 9.. ( Nếu nhập n ? 0 thì chương trình phải bắt nhập laị ). tính gần đúng ex theo công thức : Câu 7) Nhập n..3. Tính : Câu 3) Nhập số n nguyên đảm bảo sao cho n dương. Tính : Câu *6) Nhập số x thực và số n nguyên ? 1. (mỗi trang 22 dòng) rồi dừng lại chờ ta gõ Enter mới hiện trang kế tiếp..2..+ (2n+1)2 Câu 4) Nhập một số nguyên dương n .5 +. BÀI TẬP Câu 1) In bảng mã ASCII thành hai cột : Mã Ký tự . cứ thế cho đến hết. i := i + 1. rồi tính : S1 = 12 + 32 + 52 + 72 + .

MẢNG MỘT CHIỀU 10. Tính tổng các số lẻ ? N. n nhập từ bàn phím. và hình chữ nhật có chiều dài n.1. nếu N=8 thì S=1+3+5+7=16. Ví dụ : nếu N=5 thì tổng S=1+3+5 = 9.1. Câu 14) Nhập m. Tương tự đối với số 44 . Câu 9) Tìm và in lên màn hình tất cả các số nguyên trong phạm vi từ 10 đến 99 sao cho tích của hai chữ số của nó thì bằng hai lầ? tổng của hai chữ số của nó. Câu 13) Tìm bội số chung nhỏ nhất của hai số nguyên dương m. ( Hd : BSCNN * USCLN = m* n ). gọi là chỉ so? Các yếu tố để xác định một mảng gồm có: . tìm số n nhỏ nhất thỏa mãn : Câu 12) Nhập vào tuổi cha và tuổi con hiện nay đảm bảo sao cho tuổi cha lớn hơn hai lần tuổi con. Hỏi sau bao nhiêu năm nữa thì tuổi cha bằng hai lần tuổi con.1. Fn = Fn-1 + Fn-2 . F1=1. tuổi con là 5. n nguyên ( 0 < m. Câu 10) Nhập N nguyên đảm bảo lớn hơn 1. Mảng và cách khai báo mảng : Khái niệm : Mảng là một tập gồm nhiều phần tử có cùng chung một kiểu dữ liệu.. n < 20 ) . Ví dụ : số N=36 có hai chữ số là 3 và 6. Mỗi phần tử của mảng có một đại lượng xác định vị trí tương đối của phần tử đó so với các phần tử khác trong mảng. sau 20 năm tuổi cha là 50 sẽ gấp đôi tuổi con 25. Suy ra ước số chung lớn nhất của chúng.. và 3*6 = 2*(3+6).Câu 8) Cho dãy Fibonaci xác đinh như sau: F0=0. chiều rộng là m : 10. Câu 11) Nhập số thực A đảm bảo 0<A< 2.+ Fn . In lên màn hình tam giác cân có chiều cao m. với n >= 2 Hãy nhập số nguyên N>0 và tính S= F0 + F1 + F2 +. Ví dụ tuổi cha là 30.

1.. A[1]. A[10] Mảng thứ hai tên là HTen gồm 5 phần tử cùng kiểu dữ liệu là String[18] ứng với các chỉ số từ 1 đến 5: Hten[1]. Theo khai báo trên.Tên mảng Kiểu dữ liệu chung của các phần tử trong mảng Kiểu dữ liệu của chỉ số và phạm vi của chỉ số. có thể khai báo theo một trong hai cách : Cách 1: Khai báo trực tiếp theo cách sau : VAR Tênmảng : Array[m1 . ‘c’. kiểu dữ liệu của chỉ số thì không được là kiểu thực hay kiểu chuỗi. m2] of Tênkiểudữliệu . ta hình dung có một dãy nhà một tầng... ký tự. Ví dụ: Cho khai báo dưới đây: Var A : Array[0. gồm 4 phần tử cùng kiểu Integer ứng với các chỉ số ‘a’. đối với mảng A.. liệt kê hay đoạn con. 1.. Hten: Array[1. Hten[3]. gồm 11 phần tử cùng kiểu Real. tên gọi là dãy A. 2. ‘d’: B[‘a’]. Hten[2]. Khai báo mảng một chiều : Mảng một chiều. Kiểu dữ liệu của các phần tử mảng là mọi kiểu dữ liệu mà một biến có thể có. đó là: A[0]. chúng có chung một kiểu dữ liệu.10] of Real.. 10. . gồm 11 phòng liên tiếp giống hệt nhau được đánh số thứ tự từ 0. đến 10 : . lôgic. Tuy nhiên..5] of String[18]. ứng với các chỉ số 0. B: Array[‘a’.. . . còn gọi là dãy.. B[‘b’]. 2. Hten[5] Mảng thứ ba tên là B. nó chỉ có thể là kiểu đếm được : nguyên. A[2]... Ở đây m1. m2 là hai hằ?g xác định phạm vi của chỉ số. ‘b’. .. Hten[4].?và m1? m2.’d’] of Integer. B[‘c’]. hay đơn giản là mảng. B[‘d’] Ðể có một hình ảnh về mảng. ta có ba mảng: Mảng thứ nhất tên là A.

như sau: Type Mang1 = array[0.. .. 16.10] of Real. X[5]=20. Ví dụ. gồm hai bước: Bước 1: Ðịnh nghĩa kiểu dữ liệu mảng : TYPE Tênkiểumảng = Array[m1 . Var A : Mang1. X[2]=14.5] of String[18]. B và Hten ở trên ta có thể khai báo theo cách 2. m2] of Tênkiểudữliệu. Khai báo mảng có gán trị ban đầu: Pascal cho phép vừa khai báo mảng vừa gán gía trị ban đầu cho các phần tử mảng.. c. đối với các mảng A. Bước 2: Khai báo biến có kiểu dữ liệu là kiểu mảng: VAR Tênmảng : Tênkiểumảng . 18.A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 Tương tự. mảng B cũng giống như dãy nhà B một tầng có 4 phòng được đánh số thứ tự là các chữ a. d : Ba Bb Bc Bd Cách 2 : Khai báo qua một kiểu dữ liệu mới. chẳng hạn như dưới đây: Const X : array[1. Khi đó X là một mảng gồm 5 phần tử cùng kiểu nguyên và có giá trị X[1]=12. . B: Mang3. X[3]=16.5] of Integer = (12.’d’] of Integer. Mang2 = array[1. 14. Mang3 = array[‘a’. b. X?4]=18. Hten: Mang2. 20) ..

25. Hai lệnh trên tương đương với một lệnh: A[6]:=100. nhập dữ liệu cho các phần tử của mảng A: For i:=0 to 10 do begin Write(‘Nhập phần tử thứ ‘ .5. tương đương với lệnh: A[4]:=4.Mặc dù từ khóa ở đây là Const song X lại được dùng như là một biến mảng.25. Truy xuất các phần tử mảng: Các xử lý trên mảng được quy về xử lý từng phần tử mảng. X[2]:=5+20. While hay Repeat. . B[‘a’]:=100. khi đó ta có thể dùng các lệnh: i:=6. Ví dụ. Nếu biến i có giá trị là 6 thì lệnh : A[ i div 2 +1] := 4. A[i]:=100.2. trong chương trình ta có thể gán: X[1]:= 2. hay một biểu thức. vì biểu thức i div 2 +1 có gía trị là 4. Khi nhập dữ liệu cho các phần tử của một mảng . A[1]:= 2*A[0]. i . ‘: ‘). cho i là biến kiểu nguyên. Ví dụ. tức là các phần tử của X có thể thay đổi gía trị được. 10. ta dùng cách viết : Tênmảng[ chỉ số của phầ? tử ] Ví du : có thể gán : A[0]:= 15. Ðể xác định một phần tử của mảng.5. một hằng. ta có thể dùng câu lệnh For. Chỉ số của một phần tử có thể là một biến.1. Ví dụ. Hten[3]:= ‘Nguyen Thi Loan’.8.

Tương tự để nhập dữ liệu cho các phần tử của mảng B. end. i. Y là hai biến mảng cùng một kiểu mảng thì lệnh: X := Y. Chú ý : Turbo Pascal cho phép gán một mảng này cho một mảng khác. cho khai báo: Var . ta thay lệnh Write bằ?g Writeln. Ví dụ. Readln(A[i]). ta viết : For i:=0 to 10 do Write(A[i]:6:2). Các gía trị của mảng A sẽ được in liên tiếp nhau trên cùng một dòng. i:=i+1. Còn nếu muốn in mỗi phần tử trên một dòng. end. ‘: ‘).Readln(A[i]). hoặc (dùng While) : i:=0. mảng B được in lên màn hình bằng lệnh : For ch:=‘a’ to ‘d’ do Write(B[ch]). While i<= 10 do begin Write(‘Nhap phần tử thứ ‘. end. Nếu X. Ðể in các gía trị của mảng A lên màn hình. ta viết: For ch:=‘a’ to ‘d’ do begin Write(‘Nhap phần tử thứ ‘. có nghĩa là lấy gía trị của từng phần tử của mảng Y gán cho phần tử tương ứng trong mảng X. Tương tự. ‘: ‘). ch. Readln(B[ch]).

Chương trình sau nhập một mảng A có N phần tử. ta viết: Dem:=0.. Hai lệnh chính của thuật toán là: Dem:=0. Ví dụ gía trị x=6 xuất hiện 3 lần trong dãy 6 7 1 2 6 0 6 1. Dem . ta được thuật toán tổng quát hơn : Dem:=0. 10. For i:=1 to N do If A[i]=x then Dem:=Dem+1. lệnh: X := Y.20] of Real. mỗi khi có một phần tử bằng x thì tăng biến Dem lên một đơn vị. và đếm xem mảng A có bao nhiêu số dương : PROGRAM VIDU101. vậy bài toán trên có thể mở rộng là: hãy đếm số phần tử của mảng A thỏa mãn một điều kiện cho trước. For i:=1 to N do if A[i]=0 then Dem:=Dem+1. Trong lệnh For ở trên. For i:=1 to N do If A[i] thỏa điều kiện then Dem:=Dem+1. Y : Array[1. ‘ số không ‘). tương đương với lệnh : For i:=1 to 10 do X[i] :=Y[i]. Ví dụ. . Var . { Ðếm số dương trong mảng} Type Kmang = Array[1.. khi thay đẳng thức A[i]=x bằng A[i] thỏa điều kiện . Ðầu tiên ta gán Dem:=0. An . A2. Các bài toán cơ bản về mảng : Ví dụ 10. An..1. sau đó duyệt từng phần tử A1. Writeln(‘ Có ‘.X.... đếm trong dãy số A có bao nhiêu số 0.. . Kết qủa là biến Dem có gía trị đúng bằng số phần tử bằng x. Nhận xét: Ðẳng thức A[i]=x ( hay A[i]=0 ) là điều kiện để biến Dem được tăng thêm 1.1: Ðếm số lần xuất hiện của gía trị x trong dãy A1.3. A2. in mảng A lên màn hình.10] of Real. Ta dùng biến Dem kiểu nguyên để đếm số lần xuất hiện của x. Khi đó..

.. Dem ). Writeln(‘ Số số dương = ‘ . Readln. A2. N.. For i:=1 to N do If A[i]>0 then Dem:=Dem+1. end. Until (N>0) and ( N<21). Readln( A[i] ). End. Writeln. For i:=1 to N do Write(A[i]:3:0). { nhập mảng } For i:=1 to N do begin Write(‘Nhập A[‘ . An. .A: Kmang.EXE> Chép tập tin nguồn <VD101. i. { In mảng A} Writeln(‘ Mảng A là : ’). { đếm số dương } Dem:=0. Chạy<VD101. ‘ ]: ‘).2: Tìm số lớn nhất của dãy A1. Begin Repeat Write(‘ Nhập số phần tử N : ‘). Readln(N). Dem : Integer.PAS> Ví dụ 10. . i .

Max được gán giá trị A[1]. nói rằng A là một dãy tăng nếu A[1] ≤ A[2] ≤ .v.. Bước 3: Nếu Max<A[3] thì gán Max:=A[3]. Kết qủa. Sang bước 2. vừa là dãy giảm.... A là dãy giảm nếu A[1] ≥ A[2] ≥ .v. ≤ A[n]. nhưng khi đó biến i trong lệnh For phải chạy bắt đầu từ 1.. Nhận xét: Trong lệnh For trên. Có thể mở rộng thuật toán đó để tìm số lớn nhất của n số : Gọi Max là biến chứa số lớn nhất phải tìm.. Bước 2: Nếu Max<A[2] thì gán Max:=A[2]. =A[n] là trường hợp đặc biệt.. thế thì : Bước 1: Gán Max:=A[1].. Ví dụ: Dãy 1 3 3 5 5 6 6 6 là dãy tăng Dãy 9 9 8 5 5 4 0 0 là dãy giảm Dãy 1 3 3 2 5 4 6 6 là dãy không tăng không giảm.. . của ba số. Bước n: Nếu Max<A[n] thì gán Max:=A[n].3: Bài toán sắp xếp mảng tăng dần (hay giảm dần) Cho dãy A[1]. Max được so sánh với A[2] để chọn ra số lớn nhất giữa A[1]. A[n] bất kỳ.. A[2].. nhưng kết qủa vẫn đúng nếu cho i chạy bắt đầu từ 1.. A[2]. A[n]... A[2].Trong bài 8. Dãy đồng nhất A[1]=A[2]= . ví dụ phần tử A[n] chẳng hạn. Max được tiếp tục so sánh với A[3] để tìm ra số lớn nhất giữa A[1]. tương tự. A[3]. A[n].. ta đã chỉ ra cách tìm số lớn nhất của hai số. mà có thể gán cho Max một phần tử tùy ý trong mảng. .. Khởi đầu. A[2]. . A[2] và lưu vào biến Max. biến i chạy bắt đầu từ 2. . biến Max sẽ chứa số lớn nhất của dãy A[1]. Quá trình trên được mô tả bằng hai lệnh: Max:=A[1]. For i:=2 to n do if Max<A[i] then Max:=A[i]. vừa là dãy tăng.. ≥ A[n]. Bài toán đặt ra là: cho một dãy A[1]. . Không nhất thiết phải gán giá trị ban đầu cho Max là A[1]. sau bước n. Ví dụ 10.. Sang bước 3. hãy thực hiện các hoán đổi các gía trị của các phần tử trong mảng A để A lập thành một dãy tăng.

tuy chưa phải là hay nhưng đơn giản và dễ hiểu cho những người mới lập trình. được: {3. trong trường hợp tổng quát khi mảng A có N phần tử thì lệnh For thứ nhất sẽ có biến i chạy từ 1 đến N-1.4} Bước 3: Nếu A[3]>A[4] thì đổi A[3] với A[4].3..3..v.Ví dụ.3} Bước 2: Nếu A[2]>A[3] thì đổi A[2] với A[3].3. dãy A đã được sắp xếp xong. được: {1.1}: Bước 1: Nếu A[1]>A[2] thì đổi A[1] với A[2].4. A[3]=5. Ý tưởng của phương pháp là như sau: Bước 1: Tìm số nhỏ nhất trong các phần tử A[1]. nếu A[i]>A[j] thì hoán đổi các gía trị của A[i] và A[j].5} Sau ba bước. được: {1. A[3].4. ta phải so sánh A[i] lần lượt với A[j] (j chạy từ i+1 đến 4). đó là phương pháp lựa chọn trực tiếp (Straight selection sort). cần thực hiện các hoán đổi như thế nào để có A[1]=2. được: {1. nói cho gọn là đổi chỗ A[i] với A[j].1} Nếu A[1]>A[3] thì đổi A[1] với A[3]: không đổi Nếu A[1]>A[4] thì đổi A[1] với A[4]. A[2]=5. tức là : For i:=1 to N-1 do For j:=i+1 to N do if A[i]>A[j] then Ðổi chỗ A[i] và A[j] . A[n] và để vào vị trí đầ? tiên A[1].. .5.4.v. và A[5]= 2. Chẳng hạn. A[4]=8 và A[5]=9. A[3]=7. Có những phương pháp sắp xếp mảng khác nhau. Sau bước này thì A[n] sẽ là gía trị lớn nhất. . A[2]. Bước n-1: Tìm số nhỏ nhất trong hai phần tử A[n-1]. được: {1. A[n] và để vào vị trí n-1. Mảng A ở trên chỉ có 4 phần tử. A[2]=7.3} Nếu A[2]>A[4] thì đổi A[2] với A[4].5.. cho dãy A có 5 phần tử A[1]=9. A[n] và để vào vị trí thứ hai A[2]. xét dãy A có 4 phần tử: {5. ở đây chỉ xin giới thiệu một phương pháp. Bước 2: Tìm số nhỏ nhất trong các phần tử A[2]. Qúa trình trên được thể hiện bằng hai vòng lặp For : For i:=1 to 3 do For j:=i+1 to 4 do if A[i]>A[j] then Ðổi chỗ A[i] và A[j] .5..5. và lệnh For thứ hai sẽ có biến j chạy từ i+1 đến N. Tại bước thứ i (i chạy từ 1 đến 3 ).4..4. A[4]=8.

Trong đó N là số phần tử của dãy A còn Z là một biến trung gian có cùng kiểu dữ liệu với các phần tử của mảng A. A[i]:=A[j]. và cuối cùng đưa gía trị trong Z vào A[j]. tức là phải làm ba lệnh : Z:=A[i]. A: Kmang. Type Kmang = array[1. Max : Real. Ðầu tiên gởi tạm gía trị của A[i] vào biến Z. A[j]:=Z. end. N : Integer.. Chương trình dưới đây tìm số lớn nhất của mảng A và sắp dãy A tăng dần: PROGRAM VIDU103. sau đó đưa gía trị của A[j] vào A[i]. A[j]:=Z. Begin . A[i]:=A[j]. Var i.Việc đổi chỗ các gía trị trong A[i] và A[j] được tiến hành bằng cách dùng một biến Z trung gian cùng kiểu dữ liệu với A[i] và A[j]. z.20] of Real. { Tìm Max và sắp dãy A tăng dần } Uses CRT. j. thuật toán sắp xếp dãy A tăng được viết như sau: For i:=1 to N-1 do For j:=i+1 to N do if A[i]>A[j] then begin { Ðổi chỗ A[i] và A[j] } Z:=A[i]. Tóm lại.

i. . For i:=1 to N do Write(A[i]:3:0). Readln(A[i]). ‘]: ‘). End. { Tìm số lớn nhất } Max :=A[1]. Writeln(‘ Số lớn nhất là: ’ . Writeln(‘ Dãy đã sắp xep tăng là : ‘). For i :=1 to N do if Max< A[i] then Max:=A[i].Clrscr. { sắp xếp dãy tăng } For i:=1 to N-1 do For j:=i+1 to N do If A[i]>A[j] then begin {23} { đổi chỗ A[i] và A[j] } z:=A[i]. A[i]:=A[j]. end. Max : 4:1). Readln(N). Until (N>0) and ( N<21). For i:=1 to N do { nhập mảng } begin Write(‘Nhập A[‘. Readln. end. A[j]:=z. Repeat Write(‘ Nhập số phần tử N : ‘).

Chạy<VD103. Vậy hai lệnh cần dùng là: Kiemtra:=TRUE.. Muốn sắp dãy con A[m]. Ta thường gặp bài toán kiểm tra xem mọi phần tử của mảng A có thỏa mãn một điều kiện không. sau đó ta xét từng phần tử của A. ngược lại. . A[m+1].. Tức là thay dấu lớn hơn > bằng dấu nhỏ hơn < . có phải là một cấp số cộng không. Mảng A thỏa tính chất đang xét nếu mọi phần tử của nó thỏa một điều kiện xác định nào đó.. A[m+1]. A[h] là một dãy con của dãy A. A[j]:=Z.PAS> Chú ý 1: Muốn sắp dãy A giảm dần thì trong chương trình trên chỉ cần thay dòng {23}: If A[i] > A[j] then ..4: Kiểm tra mảng có thỏa một tính chất không. Ðầu tiên ta gán giả định Kiemtra:= TRUE. . chỉ cần có một phần tử không thỏa điều kiện thì gán ngay Kiemtra:=FALSE .. ví dụ mảng A có phải là dãy tăng không.. khi đó A[m]. . A[i]:=A[j].. Chú ý 2 : Sắp xếp một bộ phận của dãy. có phải là dãy đối xứng không...EXE> Chép tập tin nguồn <VD103.. mảng A không thỏa tính chất đang xét nếu có một phần tử của nó không thỏa điều kiện này.. end. ta dùng lệnh sau: For i:= m to h-1 do For j:=i+1 to h do if A[i]>A[j] then begin { Ðổi chỗ A[i] và A[j] } Z:=A[i]. A[h] tăng (hay giảm) mà không làm ảnh hưởng đến các phần còn lại của dãy A. bằng dòng : If A[i] < A[j] then . Ví dụ 10. .. Gọi m và h là hai số nguyên sao cho 1<= m< h<= N. Hai trạng thái thỏa hay không thỏa được thể hiện bằng hai gía trị TRUE hay FALSE của một biến Kiemtra kiểu lôgic.

An là đối xứng nếu A1=An. Như vậy.. If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘). n. Ðẳng thức : Ai = An-i+1 chính là điều kiện mà mọi phần tử của dãy A phải thỏa để A là một dãy đối xứng. 2. Việc xác định điều kiện là tùy từng bài toán cụ thể. A2. Giả thiết biến Kiemtra đã được khai báo kiểu Boolean... Trong thuật toán trên. Chú ý Câu lệnh : If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) . . tốc độ sẽ nhanh hơn song cũng khó hiểu hơn: Kiemtra:=TRUE.. Bạn đọc hãy viết chương trình cho ví dụ này. .For i:=1 to N do if A[i] không thỏa điều kiện then Kiemtra:= FALSE. i:=1. An=A1. If Kiemtra=TRUE then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘). lệnh For có thể thay bằng lệnh While..... dãy N phần tử A1. While ( i <=N ) and ( Kiemtra=TRUE) do if A[i]<>A[N-i+1] then Kiemtra:=FALSE else i:=i+1. Trong chương trình ta dùng các lệnh sau: Kiemtra:=TRUE. tức Ai = An-i+1 với mọi i=1. . Ví dụ: Kiểm tra xem A có phải là một dãy đối xứng không ? Dãy 1 3 5 4 5 3 1 là đối xứng. A2=An-1. For i:=1 to N do if A[i]<>A[N-i+1] then Kiemtra:=FALSE. Dãy 1 3 5 4 2 3 1 là không đối xứng vì A[3] khác A[5]..

else Writeln( ‘Dãy A không đối xứng ‘). Ta viết : P= aoU0 + a1U1 + a2U2 + . x)... U : Real. .5: Tính gía trị của đa thức : P = ao + a1x + a2x2 + . số thực x và các hệ số a0.. nếu tính được gía trị U ở bước i-1 thì sẽ tính được gía trị U ở bước i bằng lệnh U:= U*x. For i:=0 to N do { nhập mảng các hệ số} .20] of Real.. Ui = xi = xi-1 *x = Ui-1*x với i=1. P. N Như vậy. Ví dụ 10.. hoàn toàn tương đương với lệnh : If Kiemtra then writeln(‘ Dãy A đối xứng’) else Writeln( ‘Dãy A không đối xứng ‘). Begin Repeat Write(‘ Nhập N và x : ‘). Chương trình được viết như sau : PROGRAM VIDU105. + anUn . x. { Tính gía trị của đa thức bậc N } Var i. Until (N>0) and ( N<21). A: Array[0.. a1. trong đó : U0=1. sau đó ta chỉ việc cộng dồn biểu thức ai*U vào P bằng lệnh P:= P+ ai*U.. Readln(N.. an được nhập từ bàn phím.. . + anxn trong đó số nguyên n. N : Integer.2...

Writeln(‘ P=‘. End. chúng xác định phạm vi của chỉ số thứ hai. U:=1. Ta cũng có hai cách khai báo.EXE> Chép tập tin nguồn <VD105. ký tự. n2 là các hằng có cùng kiểu dữ liệu và n1 ≤ n2. chúng xác định phạm vi của chỉ số thứ nhất. còn gọi là ma trận. trong đó n1. liệt kê hay đoạn con. . Cách 1: Khai báo trực tiếp : VAR Tênmảng : Array[n1. Tương tự m1.n2 . kiểu dữ liệu của các chỉ số chỉ có thể là kiểu đếm được: nguyên. m1. không được là kiểu thực hay chuỗi. Readln. For i:=1 to N do begin U:=U*x.1. Giống như mảng một chiều. P:=P+A[i]*U. Chạy<VD105. lô gic. MẢNG HAI CHIỀU (MA TRẬN) 10...m2] of Tênkiểudữliệu. i.PAS> 10. P:6:2).begin Write(‘Nhập hệ số A[‘. m2 là các hằng có cùng kiểu dữ liệu và m1 ≤ m2. P:=A[0]. end. end. Readln(A[i]).2. gọi là chỉ số cột. là sự mở rộng trực tiếp của mảng một chiều. ‘]: ‘). Khai báo mảng hai chiều: Mảng hai chiều.2. gọi là chỉ số dòng.

‘c’. Các tầng được đánh số từ 1 đến 2.3] of String[15]. Cách 2: Biến mảng được khai báo thông qua một kiểu mảng đã được định nghĩa trước đó bằ?g từ khóa TYPE.1]..3] of String[15]. trong mỗi tầng.. X[1.2].2].m2] of Tênkiểudliệu.3] of Real. Y[‘b’. Y : Kmang2. 2. 1. các tầng được đánh số lần lượt là ‘a’. . Y[‘b’.Ví dụ.2].n2 . 1. m1.. ‘b’.1]... Y[‘a’.2.2].1]. tức là: TYPE Tênkiểumảng= Array[n1. Y[‘c’. 3] Y[‘c’... 3. Kmang2 = array[‘a’.. 3] Có thể ví X là một nhà hai tầng. Y[‘a’.3] Mảng Y gồm 9 phần tử cùng kiểu chuỗi String[15] : Y[‘a’. Ví dụ: Hai mảng X và Y nói trên có thể được khai báo theo hai bước sau: Type Kmang1 = array[1. Y[‘c’.2].3] X[2. các phòng được đánh số từ 1 đến 3. X[2. 3] Y[‘b’. X[1. Var X : Kmang1.’c’ . cho khai báo : Var X : array[1. VAR Tênmảng : Tênkiểumảng . Y là một nhà ba tầng.1].’c’ . mỗi tầng có ba phòng giống nhau.1]. Kết quả ta nhận được hai mảng hai chiều: Mảng X gồm 6 phần tử cùng kiểu dữ liệu thực: X[1. X[2. 1. Tương tự.3] of Real.. mỗi tầng có ba phòng được đánh số lần lượt là 1.. Y : array[‘a’. 1.2.

3. X[1. Hai mảng X.2]=2. chẳng hạn: Type Kmang1 = array[1.. tức là các phần tử của X có thể thay đổi giá trị được.2. Y : Kmang2. Khi đó X là một mảng hai chiều có 6 phần tử cùng kiểu thực và có giá trị là: X[1. Hai cách viết X[i][j] và X[i. Var X : Kmang1.3] of Real..5.2] of array[1.3] of Real. Khai báo và gán giá trị ban đầu: Có thể khai báo và gán giá trị ngay cho một mảng hai chiều. 7.5. X[1][2]. X[2][2].j] cùng chỉ một phần tử. X[1.0. Y nói trên có thể khai báo như sau: Type Kmang1 = array[1.0 Cần nhấn mạnh rằng mặc dù từ khóa ở đây là Const song X và các phần tử của X có thể dùng như các biến. X[1][3] X[2] là mảng có 3 phần tử kiểu thực X[2][1].5.0) ).5.3]=7.5).. X[2. Kmang2 = array[‘a’. 6.’c’] of array[1.Có thể xem mảng hai chiề? là mảng một chiều mà mỗi phần tử của nó lại là một mảng một chiều. Hiểu theo cách này thì X là một mảng gồm hai phần tử X[1] và X[2] mà mỗi phần tử này lại là một mảng gồm 3 phần tử : X[1] là mảng có 3 phần tử kiểu thực X[1][1].3]=3..5. X[2][3] Ðiều tương tự cũng áp dụng cho biến mảng Y.1]=1.5 X[2.2. (5. 2.2. 10. Const X : Kmang1 = ( (1.. Các thao tác trên ma trận : .1]=5. 1.2]=6.Chú ý: .5.3] of String[15]. X[2.0..

Ðể nhập dữ liệu cho một mảng hai chiều.1]:=X[1. chuẩn bị in hàng tiếp theo } . Readln(X[i. { in hàng thứ i} Writeln. chỉ số 2] Ví dụ: X[1. chẳng hạn muốn nhập dữ liệu cho mảng X. j]:3:1). { xuống dòng.1]:=12. ch . trong đó ch là biến kiểu ký tự. j]).1]:=‘Tran Thi Mai’. end. Y[‘a’. ‘: ‘). Tương tự. ta phải dùng hai vòng lặp duyệt theo hai chỉ số. i. ‘ cột ‘. j . ta viết: For i:=1 to 2 do For j:=1 to 3 do begin Write(‘nhập phần tử hàng ‘. lệnh nhập dữ liệu cho mảng Y được viết là: For ch:=‘a’ to ‘c’ do For j:=1 to 3 do begin Write(‘nhập phần tử hàng ‘. ta viết: Tênbiếnmảng[chỉ số 1. ta dùng lệnh : For i:=1 to 2 do begin For j:=1 to 3 do write(X[i. j . j]).5. mỗi hàng in trên một dòng. còn i và j là các biến nguyên.Ðể xác định một phần tử trong mảng hai chiề?. Ðể in mảng X lên màn hình.1]+15. ‘ cột ‘. trình bày giống như cách viết ma trận. end. Readln(X[ch. X[2. ‘: ‘).

For i:=1 to N do For j:=1 to M do begin Write(‘Nhập A[‘ .j ] = A[i. 10.. M Chương trình như sau: PROGRAM VIDU106.. N..j]). j . Ví dụ 10. { Tính tổng hai ma trận } Uses CRT.. Until ( N>0) and ( N<11) and ( M>0) and (M<11).. j] với i=1.10] of Real. i. Readln(N. M). ‘. 1.’ ..6: Tính tổng của hai ma trận Nhập vào hai ma trận A... số cột M : ‘). M : Integer. B cấp NxM. Begin Clrscr.2. N. Tính ma trận C là tổng của hai ma trận A và B. Các ví dụ về ma trận : Vì ma trận là mảng một chiều của các mảng một chiều nên nhiều bài toán về mảng được mở rộng tự nhiên cho ma trận. Repeat Write(‘Nhập số hàng N. Var A. C : Array[1. .10. in ma trận C lên màn hình.3. j . i.. ‘]: ‘). j] + B[i. Công thức tính các phần tử của ma trận C= A+B : C[i.end. Readln(A[i. B.. và j=1.

{ nhập B và tính C luôn} For i:=1 to N do For j:=1 to M do begin Write(‘Nhập B[‘ . end. j] + B[i. j]:3:0).j]). end. i. { In ma trân A lên màn hình } Writeln(‘ Ma tran A la :’). For i:=1 to N do begin . j]:=A[i. j]. Readln(B[i. For i:=1 to N do begin For j:=1 to M do write(B[i.’ . end. Writeln. ‘]: ‘). j]:3:0). For i:=1 to N do begin For j:=1 to M do write(A[i. j . ‘. C[i. { In ma trân B lên màn hình } Writeln(‘ Ma tran B la :’).end. { In ma trân C lên màn hình } Writeln(‘ Ma tran C la :’). Writeln.

. j]. tức là: For i:=1 to N do begin { tìm số lớn nhất của hàng i } . nếu phần tử nào lớn hơn Max thì lưu nó vào Max.PAS> Ví dụ 10.. For j:=1 to M do if Max< A[i.1] cho Max. A[i. và Max là biến chứa số lớn nhất phải tìm.. Writeln. tức là: Max:=A[1..M] Nếu xem i là cố định thì đó là mảng một chiều có M phần tử. Vì có cả thảy N hàng nên công việc trên phải làm N lần ứng với i=1.For j:=1 to M do write(C[i. 1]. End. Ví dụ 10. N. . nên số lớn nhất của hàng i được tìm bằng các lệnh: Max:=A[i. For i:=1 to N do For j:=1 to M do if Max< A[i. j] then Max:=A[i. j]:3:0).1]. Readln.2].. Max). M cột. Writeln(‘Sln của hàng ‘. sau đó duyệt tất cả các phần tử của ma trận. Khởi đầ? ta gán A[1. A[i. Chạy chương trình <VD106. 2.7: Tìm số lớn nhất (số nhỏ nhất) trong ma trận A: Giả sử A là ma trận N hàng.1]. Writeln(‘ Số lớn nhất là ’.EXE> Chép tập tin nguồn <VD106.. Max) . end. . j] then Max:=A[i. i.8 : Tìm số lớn nhất (hay số nhỏ nhất) trong từng hàng (hay từng cột) của ma trận A: Hàng i ( 1≤ i ≤ N ) của ma trận A có dạng : A[i. ‘ là: ‘. j].

If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘) else writeln(‘ Không đối xứng ‘). Thật vậy. cho hai ma trận dưới đâỵ: thì A là đối xứng. Max) . Các phầ? tử trên đường chéo chính thì đối xứng với chính nó nên không cần phải kiểm tra. N và với mọi j=1.Max:=A[i. 1]..i] thì A là ma trận không đối xứng. Nếu mỗi phầ? tử ở nửa bên trái đều bằng phần tử đối xứng với nó ở nửa bên phải thì ma trận rõ ràng là đối xứng. Ví dụ 10.. Vì vậy chỉ cần duyệt kiểm tra các phần tử ở nửa bên trái đường chéo chính là đủ (vùng tam giác). i] then Kiemtra:=FALSE . i. Writeln(‘Sln của hàng ‘. Trong đó Kiemtra là một biến kiểu lôgic. . end. N. ma trận A là đối xứng khi và chỉ khi A[i. Vậy các lệnh kiểm tra tính đối xứng của ma trận A là: Kiemtra := TRUE.1]. j] then Max:=A[i.. j sao cho A[i. đường chéo chính chia ma trận ra làm hai phần: nửa trái và nửa phải.2] ? B[2. .j] =A[j. Nói cách khác. Chỉ cần có một cặp i. For i:=1 to N do For j:=1 to N do if A[i. ‘ là: ‘. j]<>A[j.. .i] với mọi i=1. For j:=1 to M do if Max< A[i. còn B không đối xứng vì B[1.9: Kiểm tra ma trận vuông A có đối xứng không ?. Nhận xét rằ?g hai lệnh For ở trên quét qua tất cả các phần tử của ma trận nên có hơn nửa số lần lặp là thừa.. j]. Ví dụ. Ma trận vuông A gọi là đối xứng nếu nó không thay đổi khi ta đổi cột thành hàng và đổi hàng thành cột.j]<>A[j.

j] <> A[j. While ( Kiemtra=TRUE) and ( j<=i-1) do if A[i. i] then Kiemtra:=FALSE else j:=j+1.j]<>A[j. If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘) else writeln(‘ Không đối xứng ‘). i chạy đến N và j đến i-1. Chỉ cần xảy ra A[i. Hai câu lệnh For trên vẫn còn một nhược điểm là: khi xảy ra A[i. For i:=2 to N do For j:=1 to i-1 do if A[i. Kiemtra:=TRUE.i] một lần là biến Kiemtra được gán ngay gía trị FALSE. khi đó điều kiện Kiemtra=TRUE bị sai và cả hai vòng lặp đều kết thúc . end. lẽ ra có thể dừng lại và kết luận không đối xứng ngay thì các vòng For vẫn tiếp tục.j]<>A[j. j]<>A[j. i:=i+1.Thuật toán tốt hơn được đề nghị là : Kiemtra := TRUE. While (Kiemtra=TRUE) and (i<= N) do begin j:=1. i] then Kiemtra:=FALSE . i] rồi. Sử dụng câu lệnh While sẽ khắc phục được nhược điểm này. i:=2. If Kiemtra=TRUE then writeln(‘ Ðối xứng ‘) .

j .. Kiemtra: Boolean. i. Min : Real.’ . PROGRAM VIDU109. Type Matran = Array[1..10] of Real. i. Uses CRT. Until ( N>0) and ( N<11) . Chương trình dưới đây thực hiện các công việc sau: Nhập vào ma trận vuông A cấp N và in ma trận A lên màn hình Ðếm trong ma trận A có bao nhiêu số 0 Tìm số lớn nhất trong A Tìm số nhỏ nhất trong từng hàng của A Kiểm tra xem A có phải là ma trận đối xứng không. Max. ‘]: ‘). For i:=1 to N do For j:=1 to N do begin Write(‘Nhập A[‘. Var A : Matran.10. Repeat Write(‘Nhập cấp N : ‘). . Readln(N). 1.else writeln(‘ Không đối xứng ‘). j . N. Dem : Integer. Begin Clrscr. ‘.

1]. Writeln(‘ Có ‘. Writeln(‘ Số nhỏ nhất của hàng ‘. . Writeln.Readln(A[i.j]. Min : 4:1).j]. For i:=1 to N do For j:=1 to N do if A[i.j] then Max:=A[i. For i:=1 to N do begin For j:=1 to N do write(A[i.j]).j] then Min:=A[i. { Ðếm số số 0 } Dem:=0. ‘ là: ‘. { Tìm số lớn nhất của ma trận } Max:=A[1. i . end. Dem. j]=0 then Inc(Dem). Max : 4:1). Writeln(‘ Số lớn nhất của ma trận= ‘. end.1]. end. For j:=1 to N do if Min > A[i. ‘ số không’). j]: 3 :0). { In ma trân A lên màn hình } Writeln(‘ Ma tran A la : ’). For i:=1 to N do For j:=1 to N do if Max < A[i. { Tìm số nhỏ nhất trong từng hàng của ma trận } For i:=1 to N do begin Min:=A[i.

chọn câu nào : .10] of integer.3.10] of integer.PAS> 10.{ Kiểm tra ma trận có đối xứng không} Kiemtra:=True.. Readln. Ðể nhập dữ liệu cho A. Chạy<VD109.EXE> Chép tập tin nguồn <VD109. i : Integer .. For i:=1 to N do For j:=1 to i-1 do if A[i .j]<>A[j . If Kiemtra=True then Writeln(‘ Ðối xứng’) else Writeln(‘ Không đối xứng’) .10] of integer.10] of integer. CÂU HỎI TRẮC NGHIỆM Câu 1: Chọn khai báo đúng : a) Var A: array[1... End.4] of Real. c) Var A:= array[1. d) Var A: array[1. Câu 2: Cho khai báo: Var A: Array[1.i] then Kiemtra:=False. b) Var A= array[1.

’d’] of Real . Ch : Char ..5] of Integer. d) Write(‘ Nhập A:’). Chọn lệnh đúng : a) A[1] := 4/2 . Câu 3: Cho khai báo biến : Var A : array[1. một chỗ. End. Max : . Readln(A). vì chưa xác định được kiểu dữ liệu của biến Max : Var A: Array[‘a’. . b) A[2] := -6 . d) A := 10 . i. ‘]:’).a) For i:=1 to 4 do Write(‘ Nhập A[‘. . ‘]:’). c) For i:=1 to 4 do Begin Write(‘ Nhập A[‘. Readln(A[i]). Câu 4: Trong khai báo sau còn bỏ trống . ‘]:’). i. . . b) For i:=1 to 4 do Readln(‘ Nhập A[‘.. i.4] of Integer . Muốn biến Max lưu gía trị lớn nhất của mảng A thì cần khai báo biến Max kiểu gì vào chỗ . Readln(A[i]). . . . . c) A(3) := 6 .. : a) Char b) Integer c) String d) Real Câu 5: Cho khai báo: Var A: Array[1.

2] of Integer. A[2]=2. A[3]=1.. b) For i:=1 to 2 do Readln(A[i. Var A: array[1. A[3]=2. c) Var n. A: array[1. j]).m] of integer.n.. A[3]=4. b) Const n=2. A[2]=1.1.. m : integer . A[4]=3 d) A[1]=1.m] of integer. m=3. A[4]=5 c) A[1]=0. Sau khi thực hiện các lệnh : For i:=1 to 4 do A[i]:= i.1. A[4]=1 Câu 6: Khai báo nào đúng : a) Var A : array[1. A[2]=1. Ðể nhập dữ liệu cho ma trận A.n.. thì mảng A có gía trị là : a) A[1]=1. i.1... Câu 7: Cho khai báo : Var A : array[1.i : Integer . Readln(A) . A[3]=3. d) Var A: array[3...2. j : integer. For i:=1 to 4 do A[i]:= A[i]+1.n.m] of integer.3] of Real. A[2]=3. chọn : a) Write(‘ Nhập A:’). . A[4]=4 b) A[1]=2.1.

j]. i. b) Max:=A[1.2. j]). ‘]:’).j]. i. Begin A[1. For i:=1 to 2 do For j:=1 to 3 do if Max< A[i.j]:=Max.j].1.. For i:=1 to 2 do For j:=1 to 3 do if Max < A[i. c) A[1.2.j] then A[i. Ðể tìm số lớn nhất của ma trận A.2]:= -1 .j] then Max:=A[i.1]:= 3 ... j. i.3]:= -4 . Max : Real.1. j. i. j]). A[1. j.c) For i:=1 to 2 do For j:=1 to 3 do begin write(‘Nhập A[‘.j] then Max:=A[i. If Max < A[i. readln(A[i. d) Max:=A[1.3] of integer. j : integer. chọn câu nào : a) Max:=A[1. d) For i:=1 to 2 do For j:=1 to 3 do write(‘Nhập A[‘. Câu 9: Khi chạy chương trình : Var A : array[1. A[1. For i:=1 to 2 do if Max < A[i. Câu 8: Cho khai báo : Var A : array[1.1]. .j] then Max:=A[i.1]. readln(A[i.. end. S : integer. ‘]:’).1]:=Max .3] of Real.1].

A[2,1]:= -9 ; A[2,2]:= 0 ; A[2,3]:= 5 ; S:=0; for i:=1 to 2 do for j:=1 to 3 do If A[i,j] < 0 then S:=S+1; Write(S); End. Kết qủa in ra gía trị của S là : a) 0 b) -9 c) 3 d) 5 Câu 10: Cho X1, X2,...Xn là một mảng số thực. Ðể tính :

ta có đoạn chương trình sau gồm ba lệnh, một lệnh còn bỏ trống . . . : S:=0; For i:=1 to N do 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 và một dãy số thực x1, x2, ..., xn. Tìm số lớn nhất và số nhỏ nhất của dãy Ðếm trong dãy có bao nhiêu số dương, bao nhiêu số âm, bao nhiêu số 0 ? Loại nào nhiều nhất ? Câu 2) Nhập một dãy số nguyên x1, x2, ..., xn. In riêng các số chẵn và các số lẻ, mỗi loại trên một dòng. Câu 3) Nhập một số nguyên dương N, xây dựng dãy số nguyên x0, x1, ..., xn trong đó xi là số Fibonaci thứ i: x0=1, x1=1, xi =xi-1 + xi-2 với mọi i ? 2. In dãy x lên màn hình. Câu 4) Nhập một dãy số x1, x2,..., xn. Tính :

Câu 5) Nhập một dãy số bất kỳ x1, x2,..., xn. In đảo ngược dãy đó, ví dụ cho dãy 1 5 3 8, in ra: 8 3 5 1. 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ố bất kỳ x1, x2,..., xn và y1, y2,..., yn. Xây dựng dãy thứ ba z1, z2, .., zn là tổng của hai dãy trên (zi= xi + yi), in ba dãy lên màn hình, mỗi dãy trên một dòng. Câu 7) Cho hai đa thức : Pn(x) = anxn + an-1 xn-1 + ...+ a1 x + a0 (an ? 0 ) Qm(x) = bmxm + bm-1 xm-1 + ...+ b1 x + b0 (bm ? 0 ) Gọi R(x) = Pn(x) + Qm(x). Nhập các số tự nhiên n và m, các hệ số ai và bj của hai đa thức Pn(x) và Qm(x), in bậc và các hệ số của đa thức R(x). Câu 8) Nhập x thực, n nguyên dương và một mảng các hệ số a0, a1, ..., an , rồi tính gía trị của đ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 - 4 )x + 7)x + 9 .

Câu 9) Nhập một dãy số bất kỳ x1, x2,..., xn , cho biết dãy có đối xứng không?, dãy có lập thành một cấp số cộng không?. Ví dụ dãy 1 3 5 4 5 3 1 là đối xứng, dãy 1 3 5 7 là một cấp số cộng. Câu 10) Nhập một dãy số bất kỳ 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 một 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 các số chẵn, dãy B gồm các số lẻ, sắp xếp dãy A tăng dần, dãy B giảm dần, in hai dãy A và B trên hai dòng khác nhau. Nối hai dãy A và B theo thứ tự đó thành một dãy duy nhất và 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, 9 } thì dãy A={ 0, 2, 4, 6}, dãy B={ 9, 7, 5, 1}, và x={ 0, 2, 4, 6, 9, 7, 5, 1}. Câu 12) Nhập hai số m, n và hai ma trận Am,n và Bm,n . In các ma trận A, B, C=A+2B và D=A-B lên màn hình. Câu 13) Nhập và in ma trận Am,n . Tìm số nhỏ nhất và số lớn nhất trong ma trận . Tính tổng của tất cả các phần tử trong ma trận. Ðếm trong ma trận có bao nhiêu số dương, bao nhiêu số 0, bao nhiêu số âm. Câu 14) Nhập và in ma trận Am,n Tìm và in số lớn nhất trong từng hàng của ma trận. Tìm và in số lớn nhất trong từng cột của ma trận. Tìm và in số nhỏ nhất trên đường chéo chính của ma trận. Câu 15) Nhập và in ma trận vuông An,n . A có phải là ma trận đối xứng không A có phải là ma trận đơn vị không? (A là đối xứng nếu Aij=Aji với mọi i,j =1,..., n. A là ma trận đơn vị nếu tất cả các phần tử trên đường chéo chính đều bằng 1 và các phần tử còn lại đều bằng 0). 11.1. CÁC VÍ DỤ NÂNG CAO VỀ CÂU LỆNH LẶP

Phần này trình bày cách vận dụng các câu lệnh lặp để giải quyết một số bài toán tiêu biểu ở mức khó hơn. Thông qua các ví dụ, người học sẽ tìm thấy những tư liệu có ích để giải các bài tập tương tự, nâng cao thêm một bước kỹ năng lập trình. Ví dụ 11.1: Nhập x và n, tính gần đúng Sinx theo công thức:

Ta viết : S= U0 - U1 + U2 - U3 +U4 - ... +(-1)N UN , trong đó : U0 = x

.v.v.

Như vậy, Uk sai khác Uk-1 một thừa số C có thể tính trực tiếp được theo x và theo k :

Thành ra, nếu lưu được số hạng U ở bước trước thì sẽ tính được số hạng U ở bước sau bằng lệnh : U:=U*C; , và vì sang bước sau thì gía trị U sẽ thay đổi nên tại mỗi bước ta phải cộng hoặc trừ ngay U vào tổng S. Việc cộng hay trừ U vào tổng S được giải quyết nhờ một biến dau gọi là biến chứa dấu của U, biến này chỉ nhận gía trị là +1 hay -1 ứng với phép cộng hay trừ U vào tổng S. Ðầu tiên ta gán: dau:= -1; Tại mỗi bước lặp ta cộng U đã nhân với dau vào S, rồi đảo dấu đi để chuẩn bị cho bước tiếp theo bằng các lệnh: S:= S+ dau * U; dau:= -dau ; Thành ra nếu bước trước dau=-1 thì ở bước sau dau=+1 và ngược lại. Kết qủa là lệnh S:= S+ dau * U; sẽ cộng hay trừ U vào S theo luật đan dấu.

Câu lệnh lặp được dùng ở đây là lệnh FOR vì số lần lặp N được nhập từ bàn phím tức là đã biết trước. Chương trình cụ thể như sau: PROGRAM VIDU11_1; { Tính gần đúng 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; Writeln(‘ Giá trị Sin = ‘, S:8:4); Readln; End. Chạy <VD11_1.EXE > Chép tập tin nguồn <VD11_1.PAS> Khi chạy chương trình, nếu nhập N=6 và x=1.5708 (= π /2) thì cho kết qủa Sinx= 1.0000 ; Nếu nhập N=6 và x=3.1416 (= π ) thì cho kết qủa Sinx = 0.0000.

v. rồi tính U cho bước tiếp theo bằng cách nhân U với thừa số 2/k. Cho công thức : ( vế phải là một tổng vô hạn ) Hãy tính gần đúng e2 bằng cách lấy tổng ( hữu hạn ) các số hạng ở đầu chuỗi cho đến khi gặp số hạng đầu tiên có gía trị tuyệt đối nhỏ hơn một số epsilon (EPS) dương khá bé cho trước. Vì số vòng lặp là không biết trước nên câu lệnh lặp được dùng là WHILE. ta kiểm tra nếu? U? ? EPS thì cộng U vào tổng S.+Un . 1. Tại mỗi bước.. Ta viết : S = Uo +U1 +. Tương tự ví dụ 11. ta dùng biến U để lưu số hạng tại mỗi bước lặp k=0. { Tinh e2 theo sai số EPS dương khá bé cho trước} Var k : Integer. Chương trình được viết như sau : PROGRAM VIDU11_2... Qúa trình kết thúc khi gặp số hạng U đầu tiên có ? U? < EPS. trong đó : Uo=1 .. .v.2: Tính gần đúng số e với sai số cho trước. tức là : với n là số sao cho: .Ví dụ 11. 2.1. .

. Begin Repeat Write(‘Nhap sai so > 0 : ‘). Ví dụ N= 15742 in ra 24751. S:8:4 . in các chữ số của N theo thứ tự đảo ngược. end. Cách làm như sau: Tách và in hàng đơn vị của N ra bằng hai lệnh: k:= N mod 10.001 thì cho kết qủa S=7. Readln. Chạy < VD11_2. While ABS(U) >= EPS DO begin S:=S +U.EXE> Chép tập tin nguồn <VD11_2. End. Ví dụ 11.S. nếu nhập EPS=0. { được k=2 } Write(k: 3). Until EPS >0. U. S :=0.3: Nhập số nguyên dương N. tính đến số hạng k=10. U :=1. k). Readln(EPS). k :=0.PAS> Khi chạy chương trình. k:=k+1. EPS : Real. ‘ tính đến số hạng k= ‘.3887 . Writeln(‘ S= ‘ . U:=U* 2/ k.

‘ được in đảo ngược thành :’). 17. Repeat k:= N mod 10. Số lần lặp là không biết trước mà tùy thuộc vào việc nhập số N có ít hay có nhiều chữ số. { In đảo ngược các chữ số của N } Var N. N:=N div 10. Chạy <VD11_3. .PAS> Ví dụ 11. 11. 13. Begin Repeat Write(‘ Nhập N : ‘). Readln(N). Until N=0. End. 19. 5. Số N? 1 là số nguyên tố nếu nó chỉ chia hết cho 1 và chính nó. Writeln( N.EXE> Chép tập tin nguồn <VD11_3.4: Kiểm tra số tự nhiên N có phải số nguyên tố không. Ví dụ các số 2. k: LongInt . PROGRAM VIDU11_3. nên ta phải dùng lệnh Repeat hay While. 3. 7. Until (N>0). Readln.Bỏ đi hàng đơn vị. 21. Write(k: 3). { được N=1574 } Lặp lại qúa trình trên cho đến khi N=0. 23 đều là số nguyên tố. giữ lại các chữ số từ hàng chục trở lên: N:= N div 10.

Begin Repeat Write(‘ Nhập N : ‘).. 4. đến N-1 thì N là nguyên tố. k: integer. Readln. Readln(N).Xuất phát từ địng nghĩa. . ‘ không phải số nguyên tố ‘). chỉ cần N chia hết cho một số k nào đó trong tập { 2.. ta kiểm tra nếu N không chia hết cho tất cả các số từ 2. k:=1.. . PROGRAM VIDU11_4. If k<N then Kiemtra:= False.. N-1} thì N không phải số nguyên tố. ‘ là số nguyên tố ‘) else Writeln(N.. 4. . Until N mod k=0 . If N =1 then Kiemtra:= False else { xét N > 1} begin Kiemtra:= True. If Kiemtra=True then Writeln(N.. 3. ngược lại. end. End. 3. Repeat k:= k+1. Until (N>0). { Kiểm tra số N có phải số nguyên tố không } Var N. Kiemtra: Boolean .

. If k<N then Kiemtra:= False.2. Ðếm xem có bao nhiêu em có điểm toán bằng 10 ?. điểm toán và phân loại. loại khá nếu 7 ≤ điểm toán< 9. Vòng lặp trên kết thúc khi gặp số k đầu tiên (nhỏ nhất) thỏa điều kiện N mod k=0. Until N mod k=0 . Nếu k=N thì chứng tỏ N chỉ chia hết cho N và không chia hết cho các số 2. . CÁC VÍ DỤ NÂNG CAO VỀ MẢNG Ví dụ 11. Kmang2 = Array[1. Type Kmang1 = Array[1. . PROGRAM VIDU11_5.EXE> Chép tập tin nguồn <VD11_4. Loai: Kmang1.. Dem10 : Integer..Chạy <VD11_4. N. mỗi người trên một dòng. Dtoan : Kmang2. Nhận xét: Vì số chẵn (trừ số 2) không phải số nguyên tố nên chương trình có thể cải tiến chỉ kiểm tra các số lẻ thôi. nếu k<N thì có nghĩa N chia hết cho một số k khác N nên N không phải số nguyên tố.50] of Real.PAS> Chương trình có một đoạn cần giải thích rõ thêm: Repeat k:= k+1.. Hãy phân loại các học sinh như sau : loại giỏi nếu điểm toán ≥ 9. Var i. Hoten. Uses CRT. Lúc đó. loại trung bình nếu 5 ≤ điểm toán< 7. và loại kém nếu điểm toán< 5.50] of String[18]. gồm họ tên. 3. j. Yêu cầu danh sách được sắp thứ tự theo trật tự giảm của điểm toán. N-1 nên N là số nguyên tố. 11..5: Nhập một danh sách N (N<50) học sinh gồm họ tên và điểm thi môn toán. In danh sách lên màn hình.

Begin Clrscr. z: Real. ‘ : ‘). Hoten[i]:=Hoten[j]. Dtoan[i]:=Dtoan[j]. i . For i:=1 to N do { nhập danh sách hs } begin Write(‘Nhập họ và tên của hs thứ ‘. .St: String[18]. Hoten[j]:=St. i . Readln(Dtoan[i]). ‘ : ‘). Readln(Hoten[i]). end. Write(‘Nhập điểm toán của hs thứ ‘. { sắp xếp giảm theo điểm toán} For i:=1 to N-1 do For j:=i+1 to N do If Dtoan[i]<Dtoan[j] then begin { hoán đổi Dtoan và họ tên } z:=Dtoan[i]. Readln(N). Dtoan[j]:=z. end. Repeat Write(‘ Nhập số lượng học sinh : ‘). Until (N>0) and ( N<51). St:=Hoten[i].

For i:=1 to N do if Dtoan[i]=10 then Dem10 :=Dem10 +1. #32. đổi thành chữ thường nếu là chữ hoa.PAS> Trong chương trình. Dem10). Chạy <VD11_5. Dtoan[i]:5:1. qúa trình kết thúc khi nhập ký tự trắng. End. d mỗi loại. Ví dụ 11. c. Loai[i]) . Vì thế. và lưu vào một mảng. Readln. { Ðếm số em được điểm 10} Dem10 := 0.{ Phân loại } For i:=1 to N do If Dtoan[i] >= 9 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’. khi sắp xếp mảng Dtoan giảm dần. b.EXE> Chép tập tin nguồn <VD11_5. #32. Writeln(‘ Số em được điểm 10 là :’ . For i:=1 to N do Writeln(Hoten[i]: 18. Loai và Dtoan với quy ước phần tử thứ i của các mảng này chứa các thông tin về cùng một người: đó là học sinh thứ i trong danh sách. trong đó có bao nhiêu chữ a. mỗi khi có sự đổi chỗ Dtoan[i] với Dtoan[j] thì tương ứng cũng phải đổi chỗ Hoten[i] với Hoten]j].6: Nhập các ký tự từ bàn phím. Writeln(‘ Danh sách hs đã sắp giảm theo Ðtoán là: ‘). ta sử dụng ba mảng: Hoten. . Cho biết có bao nhiêu ký tự đã nhập.

Dem[ch]). N. Kytu[i]:= ch. If ch IN [‘a’. b. ch. Write(‘Nhập ký tự thứ ‘ .’Z’] then ch:=Chr( Ord(ch) + 32 ). Until ( ch= #32) or (i=20). Dem : Array[‘a’. Begin i:=0. b. ‘: ‘). Repeat i:=i+1.’d’] then Dem[ch] := Dem[ch]+1.’d’] of Integer. d } For ch:=‘a’ to ‘d’ do Dem[ch]:=0. c. N:=i. i . { Ðếm ký tự a.. ‘=‘. {24} end. d } Var Kytu : Array[1. c. N ). i. Max : Integer. { Ðếm các chữ a. Writeln(‘ Số ký tự đã nhập là :’ ...20] of Char . Readln(ch).PROGRAM VIDU11_6. For i:=1 to N do begin ch:=Kytu[i]. . ch : Char.. { đổi ra chữ thường } If ch IN [‘A’. For ch:=‘a’ to ‘d’ do writeln(‘ Số chữ ‘.

đếm chữ z. Dùng bốn lệnh này thì dễ hiểu hơn song bài toán sẽ không phát triển được khi ta phải đếm nhiều loại ký tự. If ch =‘d’ then Dem[‘d’] := Dem[‘d’]+1.. Var A : Kmang. Tìm Max là số lớn nhất trong mảng Dem. Ta khai báo Dem là một mảng gồm N phầ? tử với quy ước Dem[i] lưu số lượng số 0 của hàng i.Readln. { Tìm trong ma trận các hàng có nhiều số 0 nhất } Type Kmang= Array[1.. đếm xem mỗi hàng có bao nhiêu số 0. end. tương đương với lệnh ghép sau: begin If ch =‘a’ then Dem[‘a’] := Dem[‘a’]+1.EXE> Chép tập tin nguồn <VD11_6. If ch =‘c’ then Dem[‘c’] := Dem[‘c’]+1. i.10] of Real. câu lệnh ở dòng {24}: If ch IN [‘a’. chẳng hạn như đếm chữ a.7: Nhập ma trận A cấp NxM. ... những hàng nào có nhiề? số 0 nhất. Chạy <VD11_6. Ví dụ 11. Những hàng i nào có Dem[i] =Max là hàng có nhiều số không nhất. đếm chữ b. .PAS> Trong chương trình. j.’d’] then Dem[ch] := Dem[ch]+1. N. If ch =‘b’ then Dem[‘b’] := Dem[‘b’]+1. 1. End.. Dưới đây là chương trình cụ thể : PROGRAM VIDU11_7 . M : Integer..10.

end. end. j]:4:0). end. ‘]: ‘). Readln(N. Until ( N>0) and ( N<11) and ( M>0) and (M<11).j]).. i.Dem : Array[1. j]=0 then Inc(Dem[i]). For i:=1 to N do begin For j:=1 to M do Write(A[i. i. { In ma trân A } Writeln(‘ Ma tran A la:’). For j:=1 to M do if A[i. M). For i:=1 to N do For j:=1 to M do begin Write(‘Nhập A[‘. Writeln(‘Số số 0 của hàng ‘. j . Dem[i]). { Ðếm số 0 trong từng hàng} For i:=1 to N do begin Dem[i]:=0. ‘. ‘ là: ‘ .’ . Begin Repeat Write(‘Nhập số hàng N.10] of Integer . Readln(A[i. Writeln. số cột M : ‘). Max : Integer . .

Ở đây z là biến trung gian cùng kiểu dữ liệu với các phần tử của ma trận A. A[k.. .2]..1] với A[k. A[h.. { Tìm các hàng có nhiều số 0 nhất} If Max =0 then writeln(‘ Không hàng nào có số 0 ‘) else For i:=1 to N do if Dem[i]=Max then writeln(‘ Hàng nhiều số 0 nhất là ‘.. A[h.1].. Readln. end.1].2]. Writeln(‘ Số 0/hàng nhiều nhất = ‘... i:3 ).1].2]. A[k. tức là đổi chỗ A[h. A[h.M] Hàng k có dạng : A[k..EXE> Chép tập tin nguồn <VD11_7. . Chạy <VD11_7.j]:=A[k. M: For j:=1 to M do begin { đổi chỗ A[h. Max). End.j].j]:=z.M] với A[k.M] Việc đổi hàng h và hàng k được quy về việc đổi chỗ từng cặp phần tử: A[h.. A[h.2] với A[k. .8: Hoán đổi hai hàng h và k của ma trận A Hàng h có dạng : A[h. A[k.j] với mọi j=1.PAS> Ví dụ 11.j] với A[k.M]..j] } z:=A[h. A[h. For i:=1 to N do if Max< Dem[i] then Max:=Dem[i]..j] và A[k..j]. . 2.{ Tìm số lớn nhất của mảng Dem } Max:=Dem[1]..

3. cho khai báo : Var St : String[17].3. Dưới đây là ba chuỗi : ‘Ngon ngu Pascal’ ‘Tin hoc 1998’ ‘12345678’ Chuỗi không có ký tự nào ‘‘ (chỉ gồ? hai dấu nháy đơn liên tiếp) gọi là chuỗi rỗng. Cần phân biệt độ dài với độ dài tối đa của biến chuỗi: độ dài tối đa được xác định ngay khi khai báo là khả năng có thể chứa của biến chuỗi. Biến nhận gía trị là các hằng chuỗi gọi là biến kiểu chuỗi. Số ký tự có trong chuỗi gọi là độ dài của chuỗi. trong đó N là một hằng nguyên (0 ? N ? 255) ấn định số ký tự tối đa mà biến có thể nhận và gọi là độ dài tối đa của biến chuỗi. Cách khai báo như sau: Var Tênbiếnchuỗi : String[N] . hay đơn giản là một chuỗi. hoặc: Tênbiếnchuỗi : String . còn độ dài của chuỗi là số ký tự đang thực có trong chuỗi. Nếu không có chỉ thị [N] thì chuỗi có độ dài tối đa là 255 ký tự.Các bạn hãy viết chương trình cho ví dụ này. Chuỗi ‘ABCD’ có độ dài 4. Chuỗi và khai báo biến chuỗi : Một dãy các ký tự đặt trong cặp nháy đơn gọi là một hằng chuỗi. Khi đó St là biến chuỗi có độ dài tối đa là 17 ký tự.1. 11. còn biến Diachi có độ dài tối đa là 255 ký tự. Chuỗi rỗng có độ dài bằng không. Diachi : String. Ví dụ. KIỂU CHUỖI KÝ TỰ 11. Nếu gán: . chuỗi ‘Pascal’ có độ dài là 6.

11. một biến chuỗi sẽ chiếm một số byte bằ?g độ dài tối đa của nó cộng thêm 1. Ví dụ : Length(St)=14. Ví du. mặc dù khả năng nó có thể chứa tới 17 ký tự.3. thì gía trị của biến St sẽ là St=‘Quan 1.2. Chẳng hạn có thể khai báo chuỗi St nói trên theo cách sau: Type KStr17 = String[17]. Thanh pho Ho Chi Minh’. Diachi := ‘Quan 1. nếu gán: St := ‘Quan 1. mỗi phần tử của chuỗi được truy nhập thông qua tên chuỗi và chỉ số của phần tử. Thanh pho’. . chứa một ký tự có mã bằng độ dài thực của chuỗi. Thanh pho Ho Chi Minh’. Cấu trúc của biến St nói trên có dạng: N g u y e n T h i M a i Ðộ dài N (=14) của biến St và ký tự trong byte 0 (ký hiệu là St[0]) liên quan với nhau như sau: N = Ord ( St[0] ) St[0]= Chr( N ) Turbo Pascal có sẵn hàm Length(chuỗi) cho ngay độ dài thực của chuỗi mà không cần phải dùng đến byte 0. Trong bộ nhớ của máy.St := ‘Nguyen Thi Mai’. Chú ý Cũng có thể khai báo chuỗi thông qua việc định nghĩa một kiểu dữ liệu mới bằng từ khóa Type. Truy nhập vào từng phần tử của chuỗi : Giống như mảng. Khi một biến chuỗi được dùng làm đối số của hàm hay thủ tục thì nó cần phải được khai báo theo cách này ( trừ các biến chuỗi có kiểu String ). mỗi byte còn lại chứa một ký tự. Tương tự. gọi là byte 0. Khi gán cho biến chuỗi một hằng chuỗi dài hơn độ dài tối đa của nó thì các ký tự thừa sẽ bị bỏ qua. Byte đầu tiên. thì biến St có độ dài là 14 ký tự. biến Diachi có độ dài là 29 ký tự còn độ dài tối đa cho phép là 255. Var St : KStr17 .

N) của St được ký hiệu là St[i].Gọi N =Length(St).. sẽ biến đổi St thành St=‘aBC’.Ví dụ : ‘tin’ + ‘hoc’ =‘tinhoc’ ‘1234’+ ‘5678’ = ‘12345678’ Phép so sánh chuỗi: Khi so sánh hai chuỗi. Các thao tác trên chuỗi : Phép cộng (nối) chuỗi: Khi cộng hai chuỗi. 11.. cho : St :=‘ABC’. Lệnh St[1]:=‘a’. Write(St). mỗi chuỗi lại có thể xem là một gía trị duy nhất. ta so sánh từng cặp ký tự của hai chuỗi từ trái qua phải. ví dụ: ‘an’ < ‘anh’ ‘chu’ < ‘chung’ . vì có thể nhập và in chuỗi trực tiếp bằng các lệnh: Readln(St). St[3]=‘C’.. khi đó ký tự thứ i (i=1. thì N=3 và St[1]=‘A’. Ví dụ. Như vậy mỗi ký tự St[i] được dùng như một biến kiểu ký tự. và chuỗi có thể xem là một mảng các ký tự. Ðặc điểm này cho thấy chuỗi còn là một kiểu dữ liệu có tính đơn giản.3. Nhưng mặt khác. 2. Nếu phát hiện ra một cặp ký tự khác nhau thì chuỗi nào chứa ký tự nhỏ hơn sẽ nhỏ hơn. St[2]=‘B’. ta được một chuỗi mới gồm các ký tự của hai chuỗi ban đầu ghép lại. .3. Ðiều này cho thấy chuỗi là một kiểu dữ liệu có tính cấu trúc. Ví dụ: ‘Hong’ > ‘Han’ vì ‘o’ > ‘a’ ‘thanh’ > ‘thao’ vì ‘n’ > ‘o’ Nếu so sánh hết chiều dài của chuỗi ngắn hơn mà không có cặp nào khác nhau thì chuỗi ngắn hơn sẽ nhỏ hơn. Chẳng hạn để in chuỗi ta có thể in từng ký tự như sau: For i:=1 to Length(St) do write(St[i]).

. St): Cho vị trí đầu tiên tìm thấy chuỗi S trong chuỗi St. St2..3. sau khi thực hiện các lệnh: St:=‘ TurboPascal’.. Chuỗi rỗng có độ dài bằng 0. St2. 2) =‘DE’. Delete(St. Ví dụ: Copy (‘ABCDEF’. Các hàm liên quan đến chuỗi : Hàm Length(St) : cho độ dài của chuỗi St. . Hàm Pos(S. .. 4.. ví dụ : Copy (‘ABCD’.. k. thì gía trị của St=‘Pascal’ vì 5 ký tự đầu đã bị xóa. Ví dụ: Pos(‘Ab’. Nếu k > Length(St) thì không xóa gì cả. . 10) = ‘CD’ Hàm Concat( St1. Nếu m > số ký tự đứng sau kể từ vị trí k thì xóa hết từ vị trí k đến cuối chuỗi.5. Vậy : Concat( St1..4.3. . nếu không tìm thấy thì hàm cho kết qủa bằng 0. 5). Ví dụ.. Stn) : Ghép nối các chuỗi St1. 11. Stn theo thứ tự đó thành một chuỗi duy nhất. ‘cdAb3Abm’) = 3. Các thủ tục liên quan đến chuỗi : Thủ tục Delete(St. Pos(‘Ab’. m) : Xóa m ký tự trong biến chuỗi St bắt đầu từ vị trí thứ k.. St2.+Stn. m) : cho m ký tự của St tính từ vị trí k..Hai chuỗi bằng nhau khi chúng cùng độ dài và các ký tự ở các vị trí tương ứng thì bằng nhau. 11. Ví dụ: Length(‘ABCD’)=4 vì chuỗi ‘ABCD’ có 4 ký tự. Stn) = St1+St2+. Nếu k> Length(St) thì kết qủa sẽ là một chuỗi rỗng Nếu m> số ký tự đứng sau kể từ vị trí k thì hàm Copy chỉ lấy các ký tự từ vị trí k đến hết chiều dài của St.. Hàm Copy(St. ‘1bA3b’) = 0. 3. k. 1.

k) : Chèn chuỗi S vào biến chuỗi St tại vị trí k. St). St. St. Delete(St. x. thì in ra chữ Turbo Pas vì St đã bị xóa đi 3 ký tự cuối nên chỉ còn St=‘Turbo Pas’. 3). Write(St). 10. thì kết qủa là St= ‘4752’.950’ (trước số 34. Lệnh Str(4752 : 6.Ví dụ. Ví dụ. Thủ tục Insert(S. sau khi thực hiện hai lệnh : St:=‘XYZ’. k ): Biến đổi chuỗi số St thành số nguyên hay thực và gán cho biến nguyên hay thực x. St). Nếu k> Length(St) thì S được nối vào cuối của St. cho kết qủa St=‘ 4752’ (trước số 4752 có 2 ký tự trắng) . St). Nếu x là biến thực và gía trị của x=34. Số nguyên k dùng để phát hiện lỗi: nếu đổi được thì k=0. sau khi thực hiện lệnh : Str(4752. Ví dụ. St): Biến đổi số nguyên hay thực x thành kiểu chuỗi và gán cho biến chuỗi St. ngược lại. Ví dụ.950 có 1 ký tự trắng) . . St. cho : St:=‘ABCD’. Thủ tục Val(St. sau khi thực hiện ba lệnh : St:=‘Turbo Pascal’. Sau khi thực hiện lệnh: Insert(‘**’. cho kết qủa St=‘ 34. 6). gía trị của k là vị trí có lỗi trong chuỗi St. Thủ tục Str(x.95 thì lệnh : Str(x :7:3. thì St bị biến đổi thành St=‘AB**CD’. 20). Insert(‘ABC’. Số x có thể được định dạng như khi in ra màn hình. thì St=‘XYZABC’.

cho ba biến n. sau khi thực hiện các lệnh : St:=‘385’.1). Nếu gán St := ‘3a7’. và giữa hai từ chỉ giữ lại đúng một ký tự trắng. k).3. k.59 và k=0. k). Ðể đổi cả chuỗi St thành chữ hoa. Val(St. n. 11. n.59’. Muốn xóa hết các ký tự trắng ở đầu chuỗi ta dùng lệnh: While St[1]=#32 do Delete(St. x. ta đổi từng ký tự của chuỗi đó ra chữ hoa. Ví dụ 11. ta cũng đổi từng ký tự của chuỗi St ra chữ thường: For i:=1 to Length(St) do if ( St[i]>=‘A’) and (St[i]<=‘Z’) then St[i]:=Chr( Ord(St[i]) + 32) . Diễn giải: chừng nào ký tự đầu tiên của St vẫn còn là ký tự trắng thì cứ xóa nó đi cho đến khi ký tự đầu tiên là khác trắng. Cho chuỗi St có nhiều ký tự trắng thừa ở đầu.10: Chuẩn hóa một chuỗi ký tự .1). thì n=385. x=12.Ví dụ. Tương tự.1. Các ví dụ về chuỗi: Ví dụ 11. j=0.6. như St=‘ nguyen van tuan ‘. để đổi cả chuỗi St thành chữ thường. ta dùng lệnh: If St[1]=#32 then Delete(St. j kiểu nguyên và biến x kiểu thực. Chuẩn hóa chuỗi St là xóa hết các ký tự trắng thừa ở đầu và ở cuối. .9: Ðổi một chuỗi ra chữ hoa hay chữ thường. tại đó không đổi ra số được. ở cuối và giữa các từ.1. a) Xóa các ký tự trắng ở đầu chuỗi : Ðể xóa một ký tự trắng ở đầu của chuỗi St. Val(‘12. thì gía trị của n không xác định còn k=2 là vị trí của chữ a trong chuỗi St. tức là : For i:=1 to Length(St) do St[i]:=Upcase(St[i]). như St =‘nguyen van tuan’. Sở dĩ phải dùng vòng lặp While là vì số ký tự trắng ở đầu chuỗi là không biết trước. và thực hiện lệnh: Val(St. j).

nên ta so sánh từng cụm 6 ký tự của St với chuỗi pascal. nếu có thì thay bằng chữ ‘pascal’. St). i. Diễn giải: chừng nào ký tự cuối cùng của St còn là khoảng trắng thì cứ xóa nó đi cho đến khi ký tự cuối cùng là khác trắng. nếu không có thì in câu ‘không có’. { Tìm chữ basic và thay bằng chữ pascal } . và thủ tục Insert sẽ chèn chuỗi ‘pascal’ vào St tại vị trí đang xét: PROGRAM VIDU11_12 . { ‘ ‘ là 2 ký tự trắng } While k > 0 do begin Delete(St. Ví dụ St=‘ngon ngu basic duoc dung pho bien’.11 : đếm trong chuỗi St có bao nhiêu chữ pascal. Ví dụ 11. bắt đầu từ vị trí 1: Dem:=0. 1). length(St). sau khi thay thế ta được St = ‘ngon ngu pascal duoc dung pho bien’. 1). 6) =‘pascal’ then Inc(Dem). For i:=1 to Length(St) do if Copy (St. muốn xóa tất cả các ký tự trắng ở cuối của chuỗi St. St). Writeln(‘ Số chữ pascal là ‘ . Tức là : k:=Pos(‘ ‘. Dem). end.12: Tìm kiếm và thay thế. Vì chữ pascal có 6 ký tự. Ta dùng hàm Pos để tìm xem trong St có chứa chữ ‘basic’ không. và lặp lại thao tác trên cho đến khi trong St không còn chỗ nào có hai ký tự trắng liên tiếp. k. Ví dụ 11. c) Xóa các ký tự trắng thừa ở giữa hai từ trong chuỗi : Muốn xóa các ký tự trắng thừa để giữa hai từ chỉ còn đúng một ký tự trắng ta làm như sau: tìm trong St chỗ nào có hai ký tự trắng thì xóa đi một. k:=Pos(‘ ‘. Thủ tục Delete sẽ xóa chuỗi ‘basic’ khỏi St.b) Xóa các ký tự trắng ở cuối chuỗi : Tương tự. ta dùng lệnh: While St[ length(St) ]= #32 do Delete(St. Tìm trong chuỗi St xem có chứa chữ ‘basic’ không.

Begin Write(‘ Nhập chuỗi St :’). { chèn chữ pascal } Writeln(‘ St = ‘. Readln.Var St: String. end else Writeln( St. k).PAS> Ví dụ 11. St). j . { Tính tổng các bình phương các chữ số của số N} Var N. Chạy <VD11_12. St : String[40]. k. k: Integer.EXE> Chép tập tin nguồn <VD11_12. k : Integer. St. If k> 0 then begin Delete(St. Readln(St). T : Longint. { xóa chữ basic } Insert(‘pascal’ . End.13: Tính tổng các bình phương của các chữ số của một số tự nhiên N. Begin . 5). Ví dụ N= 325 thì T=32+22+52 = 38. k:= Pos(‘basic’ . PROGRAM VIDU11_13 . ‘ không có chữ basic ‘) . St). i.

End. Chạy <VD11_13. Bước 2: -Tìm k là vị trí của ký tự trắng đầu tiên.EXE> Chép tập tin nguồn <VD11_13. St ). Chương trình cụ thể như sau: PROGRAM VIDU11_14 . Readln(N). T). Writeln(‘ Tổng= ‘. For i:=1 to Length(St) do begin Val ( St[i]. Readln.PAS> Ví dụ 11. end. j. cần in ra : ngon ngu pascal Phương pháp: Bước 1: -Chuẩn hóa chuỗi St thành St=‘ngon ngu pascal’. k ). {Ðổi St[i] ra số gởi vào j} T:=T+ j*j. { Tách các từ và in riêng trên các dòng } . kết qủa St=‘ngu pascal ‘. đó chính là từ thứ nhất.Write(‘Nhập số N : ‘). -Thêm một ký tự trắng vào cuối để St=‘ngon ngu pascal ‘. in k-1 ký tự đầu tiên. Str( N. xóa k ký tự đầu tiên. { Ðổi số N ra chuỗi gởi vào St } T:=0. Lặp lại qúa trình trên cho đến khi trong St không còn ký tự trắng nào nữa.14: Tách mỗi từ của chuỗi in riêng trên một dòng: Cho St=‘ ngon ngu pascal ‘.

Tu : String[10]. St). St). 1.1. Var St: String. 1). k: Integer. k-1). k. { thêm 1 ký tự trắng vào cuối St} k:=Pos(#32. 1. k). Readln(St). Writeln(Tu). While k>0 do begin Tu:=Copy(St. k:=Pos(‘ ‘. Begin Clrscr.1). Delete(St. St:=St + #32. Write( ‘Nhập chuỗi St :’). Writeln(‘ Chuỗi đã chuẩn hóa là : ’ .1). { Chuẩn hóa chuỡi St } While St[1]=#32 do Delete(St. end. { ‘ ‘ là 2 ký tự trắng } While k > 0 do begin Delete(St. Writeln( ‘ Tách và in mỗi từ trên một dòng: ‘). . St). k:=Pos(‘ ‘. While St[ length(St) ]=#32 do Delete(St. length(St) .Uses Crt. St).

{ Tạo chữ chạy ngang màn hình} Uses Crt.10). TextColor(yellow).HCM ‘ . Thủ tục Delay(k) ngừng chương trình một thời gian là k/1000 giây. thì trước khi xóa St[1] ta nối St[1] vào cuối của St.k:=Pos(#32. . Hai hàm và thủ tục này đều thuộc thư viện CRT. ta in chuỗi St rồi ngừng trong giây lát nhờ thủ tục Delay. Dưới đây là chương trình cụ thể: Chú ý rằng hàm Keypressed trả về gía tri logic là TRUE khi có một phím trên bàn phím được bấm. Ðể St không bị ngắn dần và tạo cảm giác các chuỗi St chạy nối đuôi nhau. Var St: String[80].PAS> Ví dụ 11. Sau đó ta xóa ký tự đầu tiên của St đi rồi lại in St tại vị trí dòng 10.HCM’ chạy ngang màn hình từ phải qua trái. cột 10. Clrscr.15 : Ðể kết thúc phần này xin giới thiệu chương trình tạo dòng chữ ‘DAI HOC QUOC GIA TP. Begin St:=‘DAI HOC QUOC GIA TP. TextBackground(green). Readln. Chương trình kết thúc khi ta nhấn một phím bất kỳ. Repeat Gotoxy(10. Lặp lại các thao tác trên ta sẽ thấy chuỗi St chạy sang phải. end. Kết qủa là ta có cảm giác chuỗi St dịch sang phải một cột. cột 10. PROGRAM VIDU11_15 . Chạy <VD11_14. St). TextMode(C40). End. Tại vị trí dòng 10.EXE> Chép tập tin nguồn <VD11_14.

End.4. { Xóa ký tự đầu} Until Keypressed.PAS> 11. b) Write('Ho ten la : ' + Ho + Ten). b) SS := 'A' = 'a'. Delay(500).Write(St). CÂU HỎI TRẮC NGHIỆM Câu 1: Cho biến SS kiểu lô gic. 1). { nối ký tự đầu vào cuối chuỗi} Delete(St. d) SS := 'PASCAL' < 'pascal'. Ho . c) Write('Ho ten la : '.EXE> Chép tập tin nguồn <VD11_15. St:=St+ St[1]. 1. Lệnh nào làm SS có gía trị là TRUE : a) SS := 'a' < 'A'. Câu 3: Cho khai báo : . Ho + Ten). c) SS := 'an' < 'a'. -Lệnh nào sai : a) Write('Ho ten la : ' . Câu 2: Cho khai báo : Var Ho. TextMode(C80). Ho . ten : String[15]. Chạy <VD11_15. d) Write('Ho ten la : '. Ten). Ten).

2). 7) .Var Chuoi : string[10]. Insert(‘XYZ’. b) Str(x:5:2. d) x := Chuoi .5 b) VERSION c) PASCAL d) 5. x : real. Delete(St. -Kết qủa in lên màn hình là: a) VERSION 5. -Kết qủa in lên màn hình là: a) ABXYZEF b) AXYZBCDEF . Chuoi). -Lệnh nào đúng : a) Chuoi := Str(x:5:2) . 3. sau khi thực hiện bốn lệnh: St:=’ABCDEF’.5' .5 Câu 5: Cho St là biến chuỗi. 2). 8. sau khi thực hiện hai lệnh : St:= Copy( 'PASCAL VERSION 5. c) Chuoi := x . St. Write(St). Câu 4: Cho St là biến chuỗi. Write(St).

i = 0 Câu 7: Cho các biến St chuỗi và k nguyên. i = 0 d) x = 0 . k := Pos('Tin'. Sau khi gán: St:='Sinh vien Tin hoc hoc Tin hoc'. ST) . -Gía trị của k là : 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. Begin St :='Hom nay thuc tap'. Khi thực hiện lệnh : VAL('1234'. -Gía trị của x và i là bao nhiêu : a) x = 0 . x.c) AXYZ d) AXYZBEF Câu 6: Cho i và x là hai biến kiểu nguyên. . i. L : integer. i). For i := 1 to L do If (St[i] >= 'a') and (St[i] <= 'z') then St[i]:= Upcase (St[i]). i = 4 c) x = 1234 . i = 1234 b) x = 1234 . L:=Length(St).

End.Write (St).1. Write(St).1). i. For i:= L Downto 1 do write (St[i]). -Chương trình in ra : a) Hom Nay Thuc Tap b) hom nay thuc tap c) Hom nay thuc tap d) HOM NAY THUC TAP Câu 9: Khi chạy chương trình : Var St : String. Sau khi thực hiện hai lệnh : While St[1]=’A’ do Delete(St. -Chương trình in ra : a) DCAB b) ABCD c) 4321 d) DCBA Câu 10: Cho St là biến chuỗi và St:=’AAABAAB’. Begin St:='ABCD'. Kết qủa in ra là: . End.L : integer. L := Length(St).

Nhập số N nguyên dương.5. Bài tập nâng cao về mảng: . 0 < x ? 2 . Nhập x thực. sinh ngày 17/2/1977 thì từ đầu năm 1977 đến ngày đó có 48 ngày. Tính gần đúng giá trị của Ln(x) . n nguyên ? 0 . với sai số ss = 0. tháng. Bài tập nâng cao về lệnh lặp : Câu 1. II. Nhập ngày. Từ đầu năm sinh đến ngày tháng năm sinh của bạn có bao nhiêu ngày?. Ví dụ. tính S là tổng của N số nguyên tố đầu tiên. Nhập số N nguyên dương. Ví dụ: số N = 1275 có bốn chữ số.a) AABAAB b) BAAB c) BB d) AAA 11. Nhập số nguyên dương N. và chữ số lớn nhất là bao nhiêu. tính : Câu *6. Tương tự đối với số 500. và 32+02+42 = 25. Ví dụ :số N=304 có ba chữ số là 3. Ví dụ N=3 thì S=2+3+5=10. Câu 7. Câu 3. BÀI TẬP I. tính gần đúng cosx : Câu *2. năm sinh của bạn. chữ số lớn nhất là 7. 0 và 4. bằng cách bỏ đi các số hạng có trị tuyệt đối < ss : Câu 4. cho biết số đó có bao nhiêu chữ số. Tìm và in lên màn hình tất cả các số nguyên dương có ba chữ số (trong phạm vi từ 100 đến 999) sao cho tổng các bình phương của các chữ số của nó bằng 25.01. Câu 5.

Câu *10) Nhập một dãy số nguyên dương x1. Cho biết những hàng nào của A lập thành dãy tăng Cho biết những hàng nào của A lập thành dãy đối xứng Câu *15) Nhập và in ma trận Am.n các số nguyên dương.. Câu *16) Nhập và in ma trận Am. Câu *11) Nhập một dãy số nguyên dương x1. 0. x2. -6.n ...Câu *8) Tìm số dương nhỏ nhất trong dãy x1. nếu không thì hãy hoán đổi hàng 1 và hàng 2. 4. sau khi hoán đổi hai hàng ta được ma trận bên phải: Câu *13) Nhập và in ma trận Am. xn . 2} có biểu đồ ngang và biểu đồ đứng như sau: Câu 12) Nhập và in ma trận Am.n . -5..n .. x2. Tìm bội số chung nhỏ nhất của tất cả các phần tử của ma trận.. 0. Tính : .n .. 5. Câu *9) Sắp xếp dãy x1. rồi đến các số còn lại ( số âm và số 0) theo thứ tự tăng dần. 3. -1. Câu *14) Nhập và in ma trận Am. x2. Ví dụ dãy { 3. Vẽ biểu đồ ngang và biểu đồ đứng cho dãy bằng các dấu *. xn . 4. Tìm số dương nhỏ nhất trong ma trận. nhập dãy 3. 0..Hãy hoán đổi các hàng của ma trận A sao cho các phần tử của cột một lập thành một dãy tăng. 7. Tìm bội số chung nhỏ nhất của chúng.. 2... Ví dụ. -5.. Câu 17) Nhập vào một số nguyên N ( 1< N < 11) và một ma trậ? vuông A cấp N có các phần tử là các số nguyên bất kỳ. xn sao cho các số dương đứng trước theo thứ tự giảm dần... Ví dụ: ma trận bên trái dưới đây có hàng 1 và hàng 2 không trùng nhau. xn .. x2. 0. 2.Cho biết hàng 1 và hàng 2 có giống nhau không. -6.. -1. sắp thành: 7. 6. Ví dụ dãy 1 2 5 4 6 3 5 có bội số chung nhỏ nhất là 60.

Ví dụ: các chuỗi ‘BCD1DCB’ và ‘ABCCBA’ là đối xứng.trong đó Aij là phần tử ở hàng i cột j của ma trận A.5 : Rớt Nếu 4.. Ví dụ cho St=‘AbcD12’. và phân loại. Ví dụ : St = ‘ABCD’. Phái (nam/ nữ). -Tìm số lớn nhất trong khu vực tam giác kể từ đường chéo phụ trở ngược lên góc trên bên trái của ma trận A. in ra ‘DCBA’ Câu 21) Nhập chuỗi St. Ví dụ. chỉ số điện kế tháng trước và chỉ số điện kế tháng này. kiểm tra chuỗi có đối xứng không. . và Ðiểm thi. Ðiểm thi. gồm các thông tin về Tên.c. nhập một danh sách N (0<N<50) chủ hộ gồm họ tên. khu vực tam giác có số lớn nhất là 8 . sau khi đổi ta được St= ‘ABCD12’ và St1=‘21dcba’.. Ðổi chuỗi St thành chữ hoa và?đổi chuỗi St1 thành chữ thường. lượng điện tiêu thụ trong tháng và số tiền điện phải trả. là nữ thì Ðậu .5 ≤ Ðiểm thi< 5: là nam thì Rớt. In danh sách đã sắp theo trật tự tăng của Tên (sắp xếp theo thứ tự a. Phái. rồi phân loại đậu. Câu *19) Dùng cấu trúc mảng. In ra tổng số tiền điện của tất cả các hóa đơn. III. rớt như sau : Nếu Ðiểm thi ≥ 5 : Ðậu. thì St1=‘21DcbA’. nhập một danh sách N (0<N<50) sinh viên gồm Tên. . còn ‘ABCDBA’ là không đối xứng. Nếu Ðiểm thi < 4.b. xây dựng chuỗi St1 gồm các ký tự của St nhưng đảo ngược thứ tự. Dùng cấu trúc mảng. trong ma trận bên. Câu 22) Nhập chuỗi St. Tính tiền điện cho từng hộ theo đơn gía: 100 kw đầu tiên có đơn gía 500đ/kw 50 kw tiếp theo có đơn gía là 600 đ/kw từ kw thứ 151 trở lên có đơn gía là 900 đ/kw In danh sách lên màn hình liệt kê từng người gồm họ tên. Bài tập về chuỗi ký tự : Câu 20) Nhập chuỗi St. in St theo thứ tự đảo ngược.).

cho biết trong St có bao nhiêu ký số ‘0’. Ví dụ nhập năm tên: lan. Câu 31) Nhập một số nguyên dương N. bich. Câu *24) Nhập chuỗi St. In ra: ‘Hom Nay Thuc Tap’. BICH. Giả thiết St có không qúa 20 từ. và cho biết vị trí của các chữ a đó. 6. Ví dụ St=‘pas12pas34’. thanh. xóa bỏ các ký tự trắng thừa ở đầu và cuối chuỗi. St1. Ví du: cho St=‘ABC1234E’. Ví dụ : N = 15. 10. in ra: có 2 ký số 1. LAN.. Câu 32) Nhập một số nguyên dương N. Ví dụ St=‘13163’. Hãy chuẩn hóa tất cả các tên này. Câu 28) Nhập ba chuỗi St. an. Sắp xếp và in các từ của mảng A theo trật tự giảm của độ?dài của từ. A[4]=‘Nang’. đếm xem trong chuỗi có bao nhiêu chữ a không phân biệt viết hoa hay viết thường. anh. c. với A[i] chứa từ thứ i của St.1.Z có bao nhiêu chữ số 0.. Xây dựng một mảng A chứa các từ của St. Câu *26) Nhập một chuỗi St. b. 2.. ANH. Ví dụ St=‘Anh van la quan trong’ có 4 chữ a tại các vị trí 1. mỗi từ dài không qúa 10 ký tự.. Câu 25) Nhập chuỗi St. đếm xem trong St : có bao nhiêu chữ cái A. Ví dụ cho St=‘ Thanh pho da Nang’ thì : A[1]=‘Thanh’. chuỗi St1 =‘pas’ xuất hiện 2 lần tại các vị trí 1.. in ra : AN. Trong bốn loại trên thì loại nào nhiều nhất ? Câu 27) Nhập hai chuỗi St và St1.C. đổi ra số thập lục phân (hệ đếm 16) tương ứng : Ví dụ : N = 59. có 1 ký số 6. và tại các vị trí nào?. ‘9’ mỗi loại. . 14. Câu 29) Nhập một mảng gồm N tên các sinh viên. đổi ra số nhị phân (hệ đếm 2) tương ứng. tìm xem trong chuỗi St có chứa chuỗi St1 không ?. 6. ‘2’. St2.. In ra: Thanh Nang pho Da. sắp xếp và in lên màn hình theo thứ tự a. có 2 ký số 3. 9 có bao nhiêu ký tự trắng có bao nhiêu các ký tự khác. 3. . Sau khi thay thế ta được St=‘ABC*E’. Ví dụ : St =‘ Hom nAy tHUC taP ‘. đổi ra chữ hoa hết... Câu *30) Nhập một chuỗi St gồm nhiều từ. riêng các chữ đầu từ thành chữ hoa.Câu 23) Nhập chuỗi St. . các loại khác không có.. đổi ra 3B. nếu có thì thay thế St1 bằng St2. A[2]= ‘pho’. Cho biết chuỗi St1 xuất hiện mấy lần trong St. đổi ra 1111. đổi chuỗi thành chữ thường. và sao cho giữa hai từ chỉ có đúng một ký tự trắng. ‘1’. St1=‘1234’ và St2 =‘*’.B... . THANH. A[3]=‘Da’.

Khi phải giải quyết một bài toán lớn. . Mỗi khi cần tính một trong các gía trị e1. . Như vậy mỗi chương trình con thay thế được cho một hay nhiều đoạn chương trình có bản chất giống nhau. còn thủ tục thì không trả về giá trị nào qua tên thủ tục và nó được sử dụng như một lệnh đơn giản. Số lệnh trong thân của chương trình chính sẽ không nhiều.2.... e2. ta gọi chương trình con đó nhưng thay X bằng A. Tên hàm là Sqrt. Tương tự như thế. Các đặc trưng của hàm: Các yếu tố đặc trưng cho một hàm gồm có: Tên hàm Kiểu dữ liệu của các tham số Kiểu dữ liệu của gía trị hàm Ví dụ : Hàm Sqrt(x): cho căn hai của x. bớt dài dòng mà còn đặc biệt có ý nghĩa trong việc tổ chức chương trình. ví dụ Sqrt(4)=2.. Mỗi bài toán nhỏ được giải quyết riêng rẽ bằng một chương trình con sẽ dễ dàng hơn khi phải kiểm tra lỗi và kiểm tra thuật toán.12. 12..... khi cần nhập dữ liệu cho hai ma trận A và B. ô tô.2.1. ta chỉ cần gọi tên chương trình con đó nhưng thay x bằng một giá trị cụ thể 1. chủ yếu là các lời gọi chương trình con. KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON Chương trình con (subprogram) là một đoạn chương trình có chức năng giải quyết một vấn đề chuyên biệt mà chương trình chính cần phải thực hiện một số lần ứng với các gía trị khác nhau của tham số. . thay vì phải viết hai đoạn chương trình nhập riêng cho A và cho B thì ta chỉ cần viết một chương trình con có nhiệm vụ nhập dữ liệu cho một ma trận X bất kỳ. đó là chương trình chính.1. và để nhập dữ liệu cho B. e10 thì ta nên viết một chương trình con có nhiệm vụ tính ex với x la đối số bất kỳ & đặt tên là EXP(x). người ta lắp ráp các sản phẩm ( như xe máy.) từ các phụ tùng và các bán sản phẩm được 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 như thế nào.. ti vi. Sự khác nhau cơ bản của hàm và thủ tục là ở chỗ: hàm luôn luôn trả về một gía trị duy nhất thông qua tên hàm và do đó có thể sử dụng hàm như sử dụng một biểu thức. 2. Chẳng hạn.10. . Việc còn lại là ghép các chương trình con này để tạo thành một chương trình lớn. tham số x là nguyên hay thực còn gía trị hàm kiểu thực. Ðiều này tương tự như trong dây chuyền sản xuất công nhiệp. e2. Việc sử dụng chương trình con không chỉ có tác dụng làm cho chương trình chính bớt rườm rà. vì thế người thảo chương dễ có được một cái nhìn tổng quan toàn bộ chương trình trước khi xem xét từng chương trình con một cách chi tiết. Có hai loại chương trình con là hàm và thủ tục. nếu phải tính một loạt các gía trị e1. ta gọi chương trình con đó nhưng thay X bằng B.0. Sau đó trong chương trình chính. e10 . e3.. HÀM (Function) 12.. . người ta tìm cách chia nó ra thành nhiều bài toán nhỏ. để nhập dữ liệu cho A.

. 12. { Các khai báo dùng trong hàm } Const .. 2. Cần phân biệt hai trạng thái của các tham số: trạng thái dùng để mô tả hàm và trạng thái để gọi hàm.Hàm Chr(k): cho ký tự có mã là k. k và n kiểu nguyên. tham số k kiểu nguyên và gía trị hàm kiểu lôgic? ví dụ Odd(4)=False.. 3) = ‘BCD’. Hàm Odd(k): cho True hay False tùy theo k là lẻ hay chẵn. Tên hàm là Odd. Ví dụ: For k:=1 to 10 do S := S+ Sqrt(k).. chúng có thể được sử dụng mà không cần phải khai báo. ta thường phải tự xây dựng thêm các hàm mới. Các tham số luôn luôn phải để trong cặp nháy đơn ( ). Tên hàm là Chr. Hàm Readkey : không có tham số. Var .2. các tham số chỉ mang tính tượng trưng. Còn khi gọi hàm y:=Sqrt(4). k. Khai báo hàm tự viết: Tất cả các hàm có sẵn trong Turbo Pascal gọi là các hàm chuẩn. nếu có nhiều tham số thì chúng phải phân cách nhau bằng dấu phẩy. còn khi gọi hàm. Các hàm tự viết cần phải được khai báo. n): cho chuỗi con gồm n ký tự của St tính từ vị trí k. hàm có thể không có tham số hoặc có một đến nhiều tham số.. Tóm lại. Hàm Copy( St. y:= 3* Sqr(2) . nên gọi là tham số hình thức. Tuy nhiên số lượng các hàm chuẩn thường không đáp ứng được yêu cầu đa dạng của người sử dụng. các tham số phải là các biến hay các gía trị cụ thể nên gọi là các tham số thực sự. nó đại diện cho một gía trị nào đó.2.. ví dụ Chr(65)=‘A’. khi viết Sqrt(x) thì x là tham số hình thức. có ba tham số là St kiểu chuỗi. và gía trị hàm kiểu chuỗi? ví dụ Copy(‘ABCD’. cho nên khi thảo chương. Write( Chr(65) ). Mỗi khi gọi hàm (call) ta phải cho các tham số các gía trị cụ thể phù hợp với kiểu dữ liệu của tham số. theo cú pháp sau: Function Tênhàm(tênthamsố: kiểuthamsố : kiểugíatrị .. hàm nhận một ký tự được gõ từ bàn phím. tham số k kiểu nguyên còn gía trị hàm kiểu ký tự. gía trị hàm kiểu ký tự. nhưng hàm luôn trả về một gía trị duy nhất. Tên hàm là Copy. Khi khai báo hàm.Sin(pi/4) . thì 4 là tham số thực sự. Ví dụ. Type .

Tên tham số ở mức khai báo này chỉ mang tính tượng trưng nên mới gọi là tham số hình thức. còn tham số y có kiểu Real. khai báo kiểu dữ liệu mới (Type) và khai báo biến (Var). hàm là một chương trình con nên nó cũng có đầ? đủ các thành phần như một chương trình bình thường.. 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 là chương trình chính. Type.2." chứ không phải là dấu chấm. { khai báo kiểu dữ liệu mới} Var . ví dụ: Function F(x.. Khai báo hàm tự viết phải được để sau phần khai báo biến VAR và trước BEGIN của thân chương trình chính. { Các khai báo Const. 12. Thân của hàm là các lệnh được đặt giữa hai từ khóa Begin và End . Nếu có nhiều tham số hình thức thuộc cùng một kiểu dữ liệu thì chúng được viết phân cách nhau bằng dấu phẩy.. Tên hàm và tên tham số phải được đặt theo đúng quy tắc của một tên. ở đây tham số x có kiểu Integer.. Như đã nói. tức là cũng có thể có khai báo hằng (Const).. { khai báo hằng} Type .. y: Real): Real. Uses . y : Integer) :Real. Thông thường tên hàm nên đặt sao cho gợi nhớ gía trị mà nó chứa. ở đây hai tham số x và y cùng kiểu Integer... { khai báo dùng thư viện chuẩn} Const .3.. Nếu các tham số có kiểu dữ liệu khác nhau thì phải khai báo riêng ra và dùng dấu chấm phẩy để phân cách. Tóm lại cấu trúc của một chương trình có chứa hàm tự viết là như sau: PROGRAM TênCtchính. kết thúc bằng dấu chấm phẩy ". còn hàm gọi là chương trình con. Var dùng trong hàm } . { khai báo biến của ctrình chính} Function Tênhàm(tênthamsố: kiểuthamso? : kiểugíatrị. ví dụ: Function F( x: Integer . Chú ý Trong hàm không có khai báo sử dụng thư viện chuẩn (Uses)..Begin {Các lệnh của hàm} End.

4. hay con trỏ. Nhưng nếu là kiểu chuỗi (trừ kiểu String) hay kiểu tự xây dựng thì phải được định nghĩa trước bằng từ khóa Type. BEGIN { Các lệnh của chương trình chính} END. 12.. với kiểu String thì khai báo sau là đúng: Function F( x: Real) : String. bản ghi (record).31.31. Tuy nhiên. Nếu là kiểu liệt kê.. Ví dụ. tập hợp (set) hay tập tin (file). khai báo sau là sai: .. Ngay = 1. Function F( x: Real) : Ngay. Kiểu dữ liệu của tham số trong hàm và thủ tục thì không hạn chế. Kiểu dữ liệu của tham số và gía trị hàm: Kiểu dữ liệu của kết qủa của hàm không the?là mảng (array). chuỗi. đoạn con hay chuỗi (trừ kiểu String) thì phải định nghĩa trước thông qua từ khóa Type. Kiểu dữ liệu của kết qủa của hàm có thể là các kiểu đơn giản. Ví dụ. rồi mới khai báo: Function F( x: Real) : Str20. Khai báo hàm như dưới đây là sai: Function F( x: Integer) : array[1. Function F( x: Real) : 1. các khai báo như sau là sai: Function F( x: Real) : String[20].10] of Real. Mà phải định nghĩa kiểu trước : Type Str20= String[20].Begin {Các lệnh của hàm} End.2.

For i:=1 to N do S:=S + Canba( x[i] ). Các ví dụ : Ví dụ 12... nó được xây dựng như sau: FUNCTION Canba( z: Real) :Real. Function F( St : String[20]) : Char .2. rồi mới khai báo: Function F( x : Kmang) : Integer .5.. xn. Kstr20= String[20]. tức là : khi đó. tham số z kiểu thực. Function F( St : Kstr20) : Char . { Hàm tính căn bậc ba của z} Var F: Real. N. Hàm này có tên là Canba. Vấn đề còn lại là phải viết hàm tính căn ba của z.. Begin .Function F( x : array[1. Tuy nhiên.1: Nhập dãy các số thực x1. Ở đây hàm Canba được tính N lần ứng với các tham số thực sư?là các gía trị x[i].. tổng S được tính như sau: S:=0. . x2.. tính tổng : Phân tích: Giả sử đã có hàm Canba(z) tính căn bậc ba của z. và gía trị hàm cũng kiểu thực. với kiểu String thì khai báo sau là đúng: Function F( St : String) : Boolean . Mà phải định nghĩa kiểu trước : Type Kmang =Array[1.10] of Real. i=1. 12...10] of Real) : Integer ..

Begin If z=0 then F:= 0. Var x : Array[1. If z>0 then F:= exp( 1/3*Ln(z) ). End. N. Canba:=F . Ðặt đoạn khai báo hàm trên đây vào ngay trước phần thân của chương trình chính. . Until ( N>0) and ( N<21).exp( 1/3*Ln(-z) ). If z<0 then F:= . FUNCTION Canba( z: Real) :Real.exp( 1/3*Ln(-z) ). End. If z>0 then F:= exp( 1/3*Ln(z) ). Readln(N). S : Real. { Hàm tính căn bậc ba của z} Var F: Real. Canba:=F . If z<0 then F:= .If z=0 then F:= 0.20] of Real. ta được chương trình đầy đủ sau đây: PROGRAM VID12_1. BEGIN { vào chương trình chính} Repeat Write(‘ nhap N: ‘). i : integer..

Writeln(‘ S= ‘. Var St : String. Giả sử đã có hàm Chuthuong(ch) đổi ký tự ch từ chữ hoa ra chữ thường. Readln(x[i]). FUNCTION Chuthuong( ch: Char):Char.2: Nhập chuỗi St. S:=S + Canba( x[i] ). Như vậy. { Hàm đổi chữ hoa ra chữ thường} Var C: Char. i. ta phải viết hàm Chuthuong(ch) có tham số ch kiểu ký tự và gía trị hàm cũng kiểu ký tự.S:=0.PAS> Ví dụ 12. i : integer. khi đó để đổi tất cả các ký tự của chuỗi St ra chữ thường ta dùng lệnh: For i:=1 to Length(St) do St[i]:= Chuthuong(St[i]). end. chẳng hạn St=‘ABcdE2’ thì đổi thành ‘abcde2’. đổi tất cả các ký tự của chuỗi thành chữ thường. như sau: PROGRAM VIDU12_2.EXE> Chép tập tin nguồn <VD12_1. và đặt khai báo hàm này vào ngay trước phần thân của chương trình chính. Begin . Readln. For i:=1 to N do begin Write(‘nhap x[‘. N. ví dụ Chuthuong(‘A’)=‘a’. END. S:8:2). ‘]:’). Chạy <VD12_1.

Readln. N:=Length(St). tức là Gt(k)=k! . Chuthuong:=C. k) tính zk. END. Writeln(‘ St = ‘.3: Nhập số N nguyên dương và số thực x bất kỳ.PAS> Ví dụ 12. Thành ra.EXE> Chép tập tin nguồn <VD12_2. Chạy<VD12_2. tính: Ta viết : Vậy việc tính S được quy về việc tính các số hạng Ui rồi thực hiện phép cộng dồn Ui vào S. Readln(St). k)=zk * Hàm Gt(k) tính k!. For i:=1 to N do St[i]:=Chuthuong( St[i] ). nếu đã có hai hàm : * Hàm Lt(z.If ( ch>=‘A’ ) and ( ch<=‘Z’) then C:=Chr( ord(ch)+32 ) else C:=ch. BEGIN { vào chương trình chính} Write(‘ Nhập chuỗi chữ hoa St : ‘). tức là Lt(z. Ðể tính Ui ta nhận thấy tử số (x+i)i có dạng tổng quát là zk còn mẫu số (2i-1)! có dạng tổng quát là k! . End. St).

For i:=1 to N do S :=S + Lt(x+i.thì việc tính S được thực hiện bằng các lệnh: S:= Lt(Pi. hàm Lt(z. k) được tính ứng với các tham số thật là z=x+i và k=i. i : Integer . Q: Real. k: Byte) : Real . và hàm Lt(z. 2)/4. Dưới đây là chương trình cụ thể : PROGRAM VIDU12_3. Tương tự. x : Real. Begin Q:=1. k) được tính ứng với các tham số thật là z=Pi và k=2. End. Q: Real. Trong lệnh For. Begin . Trong lệnh gán đầu tiên. i)/Gt(2*i -1). For j:=1 to k do Q:=Q*z. hàm Gt(k) được tính ứng với k=2*i-1. Var S. N. { hàm tính Lt=zk } Var j : Byte. Function Lt(z : Real . { hàm tính Gt= k!} Var i : Byte. Function Gt( k: Byte) : Real. Lt:=Q. tại mỗi bước lặp ta có i là một số xác định.

For i:=1 to N do S:= S + Lt(x+i. x). i)/Gt(2*i -1).1. trước khi kết thúc hàm. BEGIN { Chương trình chính } Repeat Write(‘ Nhập N và x :’). Readln. Các tham số hình thức chính là các dữ liệu phục vụ cho các tính toán trong hàm. Ở ví dụ 12. Thông thường ta dùng một biến trung gian để tính gía trị hàm .PAS> 12. Vì tên hàm chứa gía trị hàm nên trong thân của hàm phải có ít nhất một lệnh gán : TênHàm:= Biểuthức . END. Readln(N. Về phong cách lập trình. Write).Q:=1. Gt:=Q.EXE> Chép tập tin nguồn <VD12_3. xong xuôi mới gán biến trung gian đó cho tên hàm trước khi kết thúc hàm. Write( ‘ Giai thừa của 4 là ‘.6. Ví dụ. S:= Lt(Pi. vì Gt(4) là một gía trị nên ta có thể viết : k:= Gt(4) . Until ( N>0). 2)/4. chúng sẽ có . trong hàm Canba ta dùng biến F để tính gía trị hàm. Các chú ý khi viết hàm: Ta chọn chương trình con là hàm khi cần nhận lại một gía trị duy nhất thông qua tên hàm. Writeln(‘S= ‘. For i:=1 to k do Q:=Q* i.2. Gt(4) ). sau cùng mới gán Canba:=F. End. nhờ đó có thể dùng tên hàm trong các biểu thức. Chạy<VD12_3.1 . trong hàm nên tránh dùng các lệnh nhập hay in dữ liệu (Readln. S:10:4).

" .gía trị cụ thể khi gọi hàm.v. y. Ngoài các thủ tục chuẩn đã có sẵn trong Turbo Pascal. x. Do thủ tục không trả về gía trị nào thông qua tên gọi của nó nên tên thủ tục không thể đứng trong các biểu thức. b). thủ tục xuất cảnh. 2). Như vậy thủ tục có thể không có tham số hoặc có từ một đến nhiề? tham số. y) định vị con trỏ vào toạ độ cột x. Việc nhập dữ liệu hay in kết qủa thường để trong thân chương trình chính. Khi gọi thực hiện một thủ tục. vì Delete và Val là hai thủ tục chứ không phải là hai hàm. Thủ tục Clrscr thì chỉ đơn giản là xóa màn hình . Thủ tục Gotoxy(x. 12. Ðể đặt con trỏ vào vị trí cột 8. mỗi thủ tục đó là một dãy có trình tự các công việc phải làm. 1). song thủ tục khác hàm ở chỗ: nếu như hàm luôn trả về một gía trị duy nhất thông qua tên hàm thì thủ tục lại không trả về?một gía trị nào thông qua tên gọi của nó. . Thủ tục Readln(x. Ví dụ các lệnh sau là sai cú pháp: St1 := Delete( St. dòng 2 trên màn hình ta viết: Gotoxy(8.v. thủ tục cũng là một chương trình con. Ðể in biểu thức 4+5*6 lên màn hình. thủ tục nhập cảnh.3. z. ta viết : Write(4+5*6). y. THỦ TỤC (Procedure) 12. thủ tục mua bán nhà đất. k) ).. z . Write( Val(‘123’.v. Trong đời sống hàng ngày. Ví dụ. b là hai biến đã được khai báo trong chương trình thì để nhập dữ liệu cho hai biến a. ta viết tên thủ tục đó và thay các tham số hình thức bằng các tham số thực sự. 1. . y. kết thúc bằng dấu chấm phẩy ". và được đặt một cái tên để gọi. z) in gía trị của x. nếu a. lời gọi thủ tục là một lệnh đơn giản. z) có nhiệm vụ nhập các gía trị từ bàn phím cho các biến x.1. Một thủ tục thực chất là một nhóm các lệnh được sắp xếp theo một trình tự nhất định có tác dụng giải quyết một nhiệm vụ cụ thể.v. y. ta thường nghe nói đến thủ tục nhập học của sinh viên. dòng y trên màn hình. b ta viết : Readln(a. Thủ tục và cách khai báo: Giống như hàm. Thủ tục Write(x. Như vậy. người thảo chương có thể tự xây dựng các thủ tục mới nhưng phải khai báo theo cú pháp sau: Procedure Tênthủtục( tênthamsố : kiểuthamsố ) .3.

'x+' . b=1. . a:4:1. b=13.5.{ Các khai báo Const. a=1. '=0').2. Type. PROGRAM VIDU12_4. Ðoạn khai báo trên phải được đặt sau phầ? khai báo VAR và trước BEGIN của thân chương trình chính. BEGIN { Thân chương trình chính } Clrscr. -b/a:4:2) else if b<>0 then Writeln(' Vo nghiem') else Writeln(' Vo so nghiem'). và gọi thực hiện thủ tục này 10 lần ứng với các gía trị cụ thể của a. Ta viết một thủ tục có nhiệm vụ giải và biện luận phương trình ax+b=0 với hai tham số a. Các ví dụ về thủ tục : Ví dụ 12. b=0. b cho trong gỉa thiết. Begin Writeln(' -Giải phương trình : ' . { Giải phương trình AX+B=0 bằng thủ tục} Uses Crt. b tùy ý. Var i. j: integer. Procedure Giaipt (a. If a<>0 then Writeln(' Nghiem x='. a=0. b=2. End. Var dùng trong thủ tục } Begin {Các lệnh của thủ tục } End. 12. b:4:1.3. b tạo bởi a=-1. và với các cặp a.4: Giải và biện luận phương trình ax+b= 0 với a=4. b: Real).5.

Ở đây.. lên màn hình Mỗi công việc a. c với các tham số thích hợp.... END.. A2. ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm vì phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0).5. trong chương trình chính.. sắp xếp dãy tăng rồi in dãy lên màn hình. có một việc phải làm nhiều lần là đổi chỗ hai phần tử A[i] và A[j] nên cũng có thể xây dựng thành một thủ tục gọi tên là Ðổi chỗ.5 và b=13. 13. nó lại là chương trình con của thủ tục sắp xếp. For i:=-1 to 1 do For j:=0 to 2 do Giaipt (i. Vậy kết qủa giải phương trình phải xuất ra ngay trong chương trình con. j cụ thể..EXE> Chép tập tin nguồn <VD12_4. j). j).An. c thuộc về một lãnh vực riêng nên có thể xây dựng thành các thủ tục độc lập với nhau. Hai vòng lặp For xác định 9 cặp gía trị i.5: Nhập vào một mảng A1. Giaipt (4..TRÌNH:' ) . đó là công việc của thủ tục.An.5.An. b. b=j tương ứng : For i:=-1 to 1 do For j:=0 to 2 do Giaipt (i. Do tách riêng việc giải phương trình ax+b=0 thành một thủ tục nên số lệnh trong thân chương trình chính giảm đi.. 13.. Ví dụ 12.An.. ta chỉ cần gọi tên các thủ tục này theo thứ tự a. Chương trình cụ thể như sau: .5). và cứ mỗi lần như vậy lại gọi thực hiện thủ tục Giaipt với tham số a=i. A2.5. A2. Readln.. nổi bật được thuật toán chính của chương trình. Có thể chia bài toán ra thành ba công việc lớn sau: a-Nhập dãy A1... Chạy<VD12_4.PAS> Khi gọi Giaipt (4. Khi thiết kế thủ tục sắp xếp dãy tăng.5).. b. tăng c-In dãy A1. là ta yêu cầu máy thực hiện thủ tục Giaipt với tham số a=4.. Ðể liên kết chúng lại. b-Sắp xếp dãy A1.Writeln(' KẾT QỦA GIẢI CÁC P. Thành ra ta không tìm được một gía trị thích hợp để gán cho tên hàm. A2.

N: Integer). Procedure Doicho(Var u. Begin . end.PROGRAM VIDU12_5. ‘]: ‘). { Sắp xếp dãy A tăng dần bằng thủ tục } Uses CRT. End. Readln(X[i]). { hoán vị các gía trị của u và v} Var Tam: Real. v : Real) . Begin For i:=1 to N do { nhập mảng X } begin Write(‘Nhập ‘. A: Kmang. ten .. Procedure SapTang( Var X : Kmang . Var N : Integer. j : Integer. i . N: Integer . Var i : Integer. ten: Char ). { Sắp dãy X tăng} Var i. Procedure Nhap(Var X: Kmang . ‘[‘ . Type Kmang = Array[1.20] of Real.

N). { Het Saptang } Procedure Inday( Chugiai: String . v:=Tam. u:=v. X: Kmang . Inday( ‘ Dãy đã sắp tăng là: ‘ . BEGIN { chương trình chính } Clrscr. { Hết Doicho } Begin { Vào Saptang } For i:=1 to N-1 do For j:=i+1 to N do If X[i]>X[j] then Doicho(X[i]. Begin Writeln(Chugiai). X[j]) . Readln. writeln. Until (N>0) and ( N<21). { In dãy X lên màn hình } Var i : Integer. End. . N. Readln(N).Tam:=u. N). A. N: Integer). Nhap( A. A. N). Repeat Write(‘ Nhập số phần tử N : ‘). Inday( ‘ Dãy chưa sắp là: ‘. ‘A’ ). SapTang( A. End. For i:=1 to N do write(X[i]:5:1). End.

EXE> Chép tập tin nguồn <VD12_5. Doicho là chương trình con của thủ tục Saptang. 12. nhiệm vụ của nó là nhập dữ liệu cho mảng X gồm N phần tử. Câu 3: Khai báo đầu chương trình con nào đúng: a) Function F : Boolean . Khi một tham số đượ? khai báo trong chương trình con. Chạy<VD12_5. thủ tục Saptang có nhiệm vụ sắp xếp N phần tử của dãy X thành dãy tăng. b) Procedure TT : Integer . tham số X đi sau từ khóa Var. d) Function F( St: String[20]) : Integer .PAS> Thủ tục Nhap có ba tham số hình thức là X. b) Function F( x: integer) : Real. c) Proceduce TT( k : Integer ) . x: Real). v bất kỳ. c) Procedure TT(x).4. b) Procedure TT(x: Integer . Tương tự. N và ten. d) Procedure TT(x :Integer . Thủ tục Inday sẽ in N phần tử của dãy X sau khi đã in lời giải thích chứa trong tham số chugiai . X gọi là tham số biến còn N gọi là tham số trị. Câu 2: Khai báo đầu hàm nào đúng: a) Function F( x: real ). có nhiệm vụ hoán vị các gía trị của hai biến u. còn tham số N thì không. Ví dụ trong thủ tục Saptang. nó có thể có hoặc không có từ khóa Var ở đằng trước. CÂU HỎI TRẮC NGHIỆM Câu 1: Khai báo đầu thủ tục nào đúng: a) Procedure TT(x :Integer):Real. Thủ tục Saptang chứa một thủ tục con là Doicho. c) Function F(x) : Real. Sự khác nhau giữa hai loại tham số này sẽ được trình bày kỹ ở phần sau.END. Var a:Real) .

ch) . b) S:= F( x. ch : Char . Câu 6: Khi chạy chương trình : Procedure TINHS. kytu : char). For i:=1 to 4 do S:=S*i. Begin S:=1. Câu 5: Cho khai báo biến và khai báo đầu của thủ tục TT như sau: Var x. -Lệnh gọi thủ tục nào đúng : a) S := TT(x. . S : Integer . d) TT(x. Câu 4: Cho khai báo biến và khai báo đầu của hàm F: Var x. n: Integer .d) Function F ( ch: Char) . S : integer. FUNCTION F( y: Real. c) S:= F( n). m : Integer) : Real. d) S:= F( x). c) TT . x) . n).Lời gọi hàm nào dưới đây là đúng : a) S:= F(n. x). ch) . Procedure TT(y : Integer. b) TT(ch. Var i. . S : Real.

END. BEGIN TINHS. Gía trị của F(2+1) là : a) 9 b) 3 c) 4 d) 1 Câu 8: Cho khai báo hàm : Function F( x. Begin F:=x*x. . End. End. End.Write(S). y : Integer) : Integer. -Kết qủa in ra : a) 12 b) 6 c) 24 d) 4 Câu 7: Cho khai báo hàm : Function F( x : Integer) : Integer. Begin If x< y then F:=x else F:=y.

BEGIN TT(2) . Gía trị của hàm F( F(1) ) là : a) 7 b) 3 c) 1 d) 5 Câu 10: Khi chạy chương trình : Procedure TT( a : Integer) . 0) là : a) 3 b) 2 c) 1 d) 0 Câu 9: Cho khai báo hàm : Function F( k : Integer) : Integer. Until a>15 . End. Begin F:=2*k+1. End. Begin Repeat a:= 2* a . .Gía trị của F(9. Write(a).

. Câu *4) Nhiệt độ F (Fahrenheit). trình bày thành hai cột : ÐỘ F ÐỘ C Sau đó. Cn tùy ý ..k) tính : Câu 3) Sử dụng hai hàm Lt(x. Fn tùy ý . Nhập n. sắp xếp dãy này theo trật tự tăng. đối với mỗi Fi đó hãy tính và in lên màn hình các độ C tương ứng. sử dụng hàm đó tính số tổ hợp chập k của n theo công thức : Câu 2) Xây dựng hàm LT(x... Nhập số x thực và số N nguyên >0.. nhập vào một dãy các độ F1..5. C2. k ( n ≥ k ≥ 0 ) từ bàn phím. k) để tính lũy thừa xk của số thực x bất kỳ với k nguyên dương.k) =xk và Gt(k)=k! tính gần đúng: trong đó các số n nguyên dương.. sử dụng hàm Lt(x. -Kết quả in ra là: a) 8 b) 16 c) 32 d) 2 12. và nhiệt độ C (Cecius) liên hệ nhau theo công thức : Viết chương trình.END. BÀI TẬP Câu 1) Viết một hàm tính k! với k nguyên dương bất kỳ. sắp xếp dãy này theo trật tự tăng. x thực được nhập từ bàn phím. trình bày thành hai cột : ÐỘ C ÐỘ F . nhập vào một dãy các độ C1.. đối với mỗi Ci đó hãy tính và in lên màn hình các giá trị độ F tương ứng. F2.

k: Byte) : Real.Yêu cầu. Còn theo khai báo của thủ tục Doicho : Procedure Doicho(Var u.. các tham số hình thức có từ khóa Var đứng trước gọi là tham số biến. Thủ tục sắp xếp một dãy tăng . THAM SỐ TRỊ VÀ THAM SỐ BIẾN Trong khai báo ở đầu của chương trình con. Câu 5) Viết một hàm tìm bội số chung nhỏ nhất của hai số nguyên dương a và b bất kỳ. Ví dụ. 13. ta viết : Function Lt(z : Real .. Viết chương trình nhập vào hai số thực a. trong chương trình có hai hàm. .. nếu không có từ khóa Var đi trước thì gọi là tham số trị. thì u và v đều là các tham số biến hình thức. Câu *6) Cho hàm F(x) = x3 . Thủ tục in lên màn hình . An. . và hai thủ tục : Hàm tính độ C theo độ F . v : Real) .1 . thì z và k đều là các tham số trị hình thức . Nhập vào N số nguyên dương A1. ngược lại. Hàm tính độ F theo độ C . dùng hàm nói trên tìm bội số chung nhỏ nhất của N số đó. trong khai báo hàm tính lũy thừa zk.b] theo công thức hình thang sau : trong đó : và yi = F( a + ih ) Yêu cầu : có một hàm tính gía trị F(x) theo tham số x .1. b và số nguyên n : 10 < n < 50. Tính tích phân xác định của hàm F(x) trên đoạn [a.

hằ?g hay biểu thức. Trong lời gọi chương trình con các tham số trị thực sự có thể là biến. 3). gía trị của tham số thực sự x không hề bị thay đổi. Sau đó chương trình con có thể thay đổi giá trị của tham số trị hình thức ở bên trong chương trình con. các biến được truyền vào chương trình con dưới dạng tham số trị thì không bị thay đổi. Tham số trị : Tham số trị hình thức được cấp một ô nhớ riêng khi chương trình con được gọi và bị xóa bỏ khi chương trình con chạy xong.1. nhận gía trị ban đầu là tham số thực sự được chuyển đến từ chương trình chính qua lời gọi chương trình con. Ðể hoán đổi gía trị của a và b ta dùng lệnh: Doicho(a. x vẫn có gía trị là 4. 13. S:= Lt(x.13. trong đó x là biến kiểu thực . Trước và sau khi thực hiện chương trình con. Nó được coi như một biến địa phương. Tham số biến : Trong lời gọi chương trình con các tham số biến thực sự chỉ có the?là biến. nên Lt=43. . hoặc : x:=4. { Sai vì 3 và 4 là các hằng} Doicho(a+1. Gía trị này được gán tiếp cho S. muốn tính S= 43. b).1. 2+1). 2+1). Ví dụ. không the?là hằ?g hay biểu thức. các lệnh sau đây là sai : Doicho(3. { Sai vì a+1 là một biểu thức} Giả sử trong chương trình chính có hai biến thực a. kết qủa là z=4 và k=3.1. Kế đó các lệnh trong hàm Lt sẽ tính toán zk và gán kết qủa cho tên hàm. ta viết : S:= Lt(4. 4). b). Ví dụ.2. là như sau: Ðầu tiên các tham số hình thức z và k sẽ được khởi tạo giá trị ban đầu z:=x. và k:=2+1. Cách thức hoạt động của lệnh S:= Lt(x. song điều đó không làm thay đổi gía trị của tham số thực sự. Vậy. mọi sự thay đổi của tham số trị hình thức trong chương trình con không làm thay đổi gía trị của tham số thực sự tương ứng được truyền vào từ chương trình chính. b có gía trị a=4 và b=3. Nói cách khác.

sau khi thực hiện thủ tục xong thì a=4. Kết qủa là trước khi gọi thủ tục Doicho(a. b). a). tương tự. thì lệnh : Saptang(A. N là số phần tử của mảng X thì không cần thay đổi. các biến được truyền vào chương trình con dưới dạng tham số biến thì sẽ thay đổi theo tham số biến hình thức tương ứng trong chương trình con. Mọi thay đổi của tham số u trong chương trình con đều là thay đổi của chính biến a. y: Integer. b=4. N: Integer). Thông thường. thủ tục TT có hai tham số a và b : a là tham số trị còn b là tham số biến. Writeln(‘b= ’. mọi thay đổi của tham số v đều là thay đổi của chính biến b. tức là: Procedure SapTang( X : Kmang . Thực chất của sự truyền tham số đối với các tham số biến là sự truyền địa chỉ. Nếu ta bỏ từ khóa Var trước X đi. còn mảng X thì lại cần thay đổi để trở thành một dãy tăng. y của chương trình chính trước và sau khi gọi thủ tục TT: PROGRAM VIDU13_1. sẽ không làm thay đổi dãy A.b) thì a=3. N: Integer). Begin a:=a+6. Chương trình con sẽ dùng các ô nhớ của chính các biến đượ? truyền vào dưới dạng tham số biến. Var x.1: Trong chương trình dưới đây. N). End. ta dùng tham số biến khi muốn nhận lại một gía trị mới sau khi thực hiện chương trình con.Vì u và v là các tham số biến hình thức nên chương trình con sẽ đồng nhất u với a và đồng nhất v với b. Bây giờ ta hiểu tại sao trong thủ tục Saptang thì N là tham số trị còn X là tham số biến: Procedure SapTang( Var X : Kmang . PROCEDURE TT( a : integer . Hãy xem sự thay đổi gía trị của hai biến x. b=3. Ví dụ 13. b:=b+8. Var b : integer). Vậy. . Writeln(‘a= ’.

a). Chạy<VD13_1. sẽ làm thay đổi các tham số a và b : a=10. và b=7. b của hình chữ nhật và sử dụng một thủ tục để tính cả diện tích và chu vi. Tính chất trên đây của tham số biến cho phép khai thác thêm các khả năng của thủ tục và hàm. sẽ in ra a = 10 Writeln(‘b= ’.BEGIN x:=4.PAS> Trước khi gọi thủ tục TT thì x=4.2: Chương trình sau nhập vào hai cạnh a. Ngược lại. b). biến y được truyền vào chương trình con thông qua tham số biến b nên mọi sự thay đổi của b trong thủ tục TT đều kéo biến y thay đổi theo. x). Khi gọi thủ tục TT(x. x được truyền vào chương trình con thông qua tham số trị a nên mọi sự thay đổi của a trong chương trình con đều không ảnh hưởng gì đến x. Ví dụ 13. x). y=7. b được gán a:=x. nên a=4. Các lệnh trong thủ tục a:=a+6.2. y). sẽ in ra y =15 Như vậy. còn hàm thì trả về một gía trị duy nhất qua tên hàm. TT(x. y:=7. Song một chương trình con hoàn toàn có thể trả về hai hay nhiều gía trị thông qua các tham số biến. và b:=b+8.EXE> Chép tập tin nguồn <VD13_1. END. thì các tham số hình thức a. như ví dụ 13. {16} Readln. máy trở lại chương trình chính làm tiếp các lệnh {15} và {16} : Writeln(‘x= ’.y). PROGRAM VIDU13_2. và do đó hai lệnh: Writeln(‘a= ’. b} . Ta biết thủ tục không trả về gía trị nào thông qua tên nó. y). sẽ in ra x = 4 Writeln(‘y= ’. {15} Writeln(‘y= ’. { Tính diện tích S và chu vi L của HCN theo 2 cạnh a. y). b=15. {14} Writeln(‘x= ’. b:=y. sẽ in ra b = 15 Thực hiện xong thủ thục TT.

Vì thế. b.1. S:4:1). trong chương trình chính. L:4:1). End.EXE> Chép tập tin nguồn <VD13_2. L: Real. DT. 13. Var DT. {12} thì c1:=a. Chạy <VD13_2. Readln. biến L đồng nhất với CV. S. TINH(a. b và gọi thủ tục : TINH(a. PHẠM VI TÁC DỤNG CỦA CÁC KHAI BÁO 13. b: ‘).2. Trong chương trình chính. song hai biến S và L vẫn còn tồn tại cho đến khi kết thúc chương trình. ta in S và L. ta khai báo hai biến tương ứng là S và L.PAS> Vì thủ tục TINH cần phải trả về hai gía trị diện tích và chu vi nên ta khai báo hai tham số biến là DT và CV. b. Sau khi nhập hai cạnh a. chứ không in DT và CV. biến S đồng nhất với DT. Biến toàn cục và biến địa phương : . Khi thực hiện xong thủ tục TINH. { Tính diện tích DT và chu vi CV theo hai cạnh c1 và c2} Begin DT:=c1*c2. Readln(a. Writeln(‘Chu vi = ’. CV : Real).b). L). c2 : Real . S. END. c2:=b. L=CV ). Procedure TINH( c1. L). CV không tồn tại trong bộ nhớ nữa. CV:=2*(c1+ c2). các tham số c1.Var a.2. BEGIN Write(‘ Nhập hai cạnh a.b. c2. khi tính diện tích DT và chu vi CV thì S và L cũng được tính ( S=DT. S. Thành ra. {12} Writeln(‘Dien tích= ’.

v.v. Sở dĩ gọi là địa phương vì chúng chỉ có tác dụng trong chương trình con nơi nó được khai báo mà thôi. {2} {3} Procedure TTUC1. Saptang và Inday đều có một biến địa phương tên là i. Các biến địa phương chỉ tồn tại trong thời gian chương trình con đang thực hiện. Mỗi thủ tục Nhap. Readln. biến j là biến địa phương của thủ tục Saptang. . khi chương trình con thực hiên xong thì các biến địa phương sẽ bị xóa khỏi bộ nhớ. khai báo hằng. Writeln(y). Vì chương trình con cũng là một chương trình nên trong chương trình con cũng có khai báo biến. Các tham số trị hình thức của chương trình con cũng là biến địa phương. BEGIN x:=10.. Writeln(y). Trong ví dụ 12. chúng dùng được ở mọi nơi kể từ lúc khai báo cho đến khi kết thúc chương trình. {4} Var y: Integer.. Các biến được khai báo trong chương trình chính gọi là biến toàn cục (global variable). End. Ví dụ 13. biến N và A là các biến toàn cục. cũng có khai báo chương trình con của riêng nó. còn biến Tam là biến địa phương của thủ tục Doicho..Một chương trình có chứa hàm hay thủ tục gọi là chương trình chính. {5} {6} {7} {8} {9} {10} { hết TTUC1 } {11} {12} {13} {14} { lệnh này bị lỗi} {15} . Tương tự.3 : Xét chương trình dưới đây : Program VIDU13_3.5 ( Bài 12 ). nó chỉ có tác dụng trong thủ tục Doicho mà thôi. Begin y:=x+5. thủ tục hay hàm gọi là chương trình con. Các biến được khai báo trong một chương trình con gọi là biến địa phương (local variable). tuy chúng trùng tên song trong bộ nhớ chúng là ba ô nhớ khác nhau. TTUC1. . {1} Var x: Integer. có phạm vi tác dụng khác nhau.

Thật vậy. Biến y là biến địa phương của TTUC1 nên có phạm vi tác dụng từ dòng {6} đến dòng {10}. . ngoài khu vực đó nó bị xem là chưa khai báo. ở dòng {14} lại bị lỗi. 13.1 mô tả một chương trình có hai chương trình con A và B ở mức 1. nên y=15 và dòng {9} in gía trị 15 của y. dòng {13} gọi TTUC1 và điều khiển chuyển đến dòng {4}. mức 2 là các chương trình con của các chương trình con mức 1. Hình vẽ 13. dòng {8} gán y:=x+5.2. chương trình con) dựa trên các nguyên tắc sau: . Việc xác định phạm vi tác dụng của các biến (hay hằng. {16} Chương trình gồm 16 dòng được đánh số từ {1} đến {16}.END. Biến x là toàn cục nên có phạm vi tác dụng từ dòng {3} đến dòng {16}. Lệnh Writeln(y). của các khai báo nói chung. Phạm vi tác dụng của các khai báo : Hình 13. kiểu dữ liệu. kiểu dữ liệu. chương trình con) là khu vực mà trong đó nó có thể sử dụng được. Các dòng {5} {6} cấp ô nhớ cho biến y địa phương. ở dòng {9} in ra số 15. Ðể diễn tả phạm vi tác dụng của biến nói riêng. sau khi thực hiện lệnh {12} gán x:=10. và máy sẽ báo lỗi. ta đưa ra khái niệm gọi là mức: mức 0 là chương trình chính. mức 1 là các chương trình con của chương trình chính. TTUC1 kết thúc và biến y bị xóa khỏi bộ nhớ. kể cả khai báo chương trình con.v. trong chương trình con A lại có hai chương trình con A1 và A2 ở mức 2. nhưng vì y đã bị xóa nên không thể in được. Ðến đây.v.2. còn lệnh Writeln(y).1 Phạm vi tác dụng hay tầm tác dụng của biến (hay hằng. điều khiển được trả về cho lệnh {14} trong chương trình chính.

Writeln(x). kể cả các mức cao hơn nằm trong mức này. Ví dụ : Nếu chương trình chính và thủ tục B có khai báo hai biến trùng tên là x. Var {5} {6} {2} {3} {4} x: Integer.4: Xét chương trình sau: Program VIDU13_4. {1} Var x: Integer. Các biến được khai báo ở mức nào sẽ có phạm vi là vùng giới hạn mức đó. Ví dụ: các biến được khai báo trong thủ tục A sẽ dùng được trong thủ tục A. Ví dụ 13.Các biến được khai báo ở mức 0 (chương trình chính) có phạm vi tác dụng là toàn bộ chương trình . biến x địa phương của B bị xóa và biến x toàn cục hoạt động lại bình thường. {7} {8} Writeln(x). A1 và A2. BEGIN x:=10. Nếu hai biến trùng tên lại nằm trong hai mức có phạm vi bao trùm nhau thì biến ở mức thấp hơn sẽ tạm bị che khuất khi làm việc ở mức cao hơn. Ra khỏi thủ tục B. Readln. A1 và A2. -Có thể khai báo hai (hay nhiều) biến trùng tên ở các mức khác nhau nhưng chúng vẫn là hai biến khác nhau có phạm vi tác dụng khác nhau. nhưng không dùng được trong chương trình chính và trong thủ tục B. B. {9} End. {10} {11} {12} {13} {14} {15} . Begin x:=5. thì trong thủ tục B chỉ có biến x địa phương của B là có tác dụng. Procedure B. còn biến x của chương trình chính tạm thời bị che đi. Các biến được khai báo trong thủ tục B sẽ dùng được trong thủ tục B nhưng không dùng được trong chương trình chính và trong các thủ tục A.

. {16} Chạy<VD13_4. Tính ma trận C=A-B. Khi trở lại chương trình chính thì biến x địa phương bị xóa khỏi bộ nhớ và biến x toàn cục hoạt động trở lại. kể cả trong thủ tục A. Cho biết ma trận nào gồm toàn số 0. A2 và B.5: Nhập hai ma trận A. phạm vi của thủ tục A1 là toàn bộ thủ tục A. Vì thủ tục B cũng có biến địa phương tên x nên biến x toàn cục tạm thời ngưng hoạt động và lệnh {8} gán cho biến x địa phương gía trị x:=5 . cách thức xây dựng và sử dụng các thủ tục và hàm.EXE> Chép tập tin nguồn <VD13_4. đây chỉ là một loại công việc nên có thể viết thành một thủ tục để gọi hai lần.END. Về bản chất. tính ma trận hiệu C=A-B. ta xét ví dụ sau : Ví dụ 13. Phân tích: Có bốn việc chính phải làm: Nhập hai ma trận A và B. lệnh {14} sẽ in gía trị của biến x toàn cục là số 10. in ba ma trận lên màn hình. Ðể hiểu rõ thêm về phạm vi của các biến. nghĩa là: Có thể gọi thủ tục A2 từ một vị trí trong thân của thủ tục A.và cả trong thân của A2 (gọi đệ quy). Lệnh {9} in gía trị của biến x địa phương là số 5. A1. Phạm vi của thủ tục A hay B là toàn bộ chương trình. Ðây là một việc nhưng chuyên biệt có thể viết thành một thủ tục để chương trình sáng sủa. Lệnh {13} gọi thủ tục B.PAS> Khi chạy chương trình kết qủa in ra là : 5 10 Ðầu tiên lệnh {12} gán cho biến x của chương trình chính gía trị x=10. B cấp MxN. trong thân của thủ tục A1. Phạm vi của các chương trình con cũng được xác định tương tự. Tóm lại phạm vi của thủ tục A2 là toàn bộ thủ tục A. Câu hỏi là thủ tục A2 có thể gọi được ở những đâu ? Vì thủ tục A2 được khai báo trong thủ tục A nên nó chỉ được biết đến bên trong thủ tục A. Tương tự.

. Var N. X: Kmatran). ‘[‘ .10. { Hết Nhập} Procedure InMatran( Chugiai: String . { Tính hiệu hai ma trận } Uses CRT. 1. Procedure Nhap(Var X: Kmatran . Type Kmatran = Array[1. Về bản chất đây chỉ là một loại công việc nên có thể viết thành một thủ tục và gọi ba lần. B và C. B. A. End. B và C. ten: Char ). end. Chương trình như sau: PROGRAM VIDU13_5. j : Integer. ‘. ten ..’ . Kiểm tra xem ma trận nào toàn số 0 ? : Câu trả lời là một gía trị lôgic đúng hay sai (True hay False).In ba ma trận A. { In ma trân X lên màn hình } Var i. vậy phải viết dạng hàm và gọi ba lần ứng với các đối số là A. Var i. M : Integer.10] of Integer . i. j . Readln(X[i. C: Kmatran. j : Integer. . Begin For i:=1 to M do { nhập mảng X } For j:=1 to N do begin Write(‘Nhập ‘. ‘]: ‘).j]).

{ Kiểm tra ma tran X gồm toàn số 0 ? } Var i. End.Begin Writeln(Chugiai). end. Writeln. A .j] <> 0 then Ktra:=FALSE. For i:=1 to M do begin For j:=1 to N do write(X[i. Begin For i:=1 to M do For j:=1 to N do X[i. { Hết In Ma trận} Procedure Tinh( Var X: Kmatran. . Bang0:=Ktra. End.j]. Begin Ktra:=TRUE. Ktra: Boolean. j : Integer.j]-B[i.j]:4 ). { Hết Tính } Function Bang0( X : Kmatran) : Boolean . B : Kmatran).j]:=A[i. { Tính ma trận X=A-B} Var i . For i:=1 to M do For j:=1 to N do if X[i.j : Integer.

hai biến M và N được sử dụng tự nhiên mà không cần phải khai báo dưới dạng tham số vì chúng là các biến toàn cục. If Bang0(A) =TRUE then writeln(‘ A toàn số 0 ‘).EXE> Chép tập tin nguồn <VD13_5. Nhap( A. Until (N>0) and ( N<11) and ( M>0) and ( M<11) . { Hết hàm Bằng 0} BEGIN { chương trình chính } Clrscr. ‘A’ ). InMatran( ‘ Ma trận C là: ‘ . phạm vi của chúng là toàn bộ chương trình. Readln(M. Rõ ràng nếu không sử dụng thủ tục và hàm thì chương trình trên sẽ viết rất dài dòng. SỰ THAM KHẢO TRƯỚC VÀ SỰ ÐỆ QUI 13. N). If Bang0(C) =TRUE then writeln(‘ C toàn số 0 ‘). If Bang0(B) =TRUE then writeln(‘ B toàn số 0 ‘). B). Tinh(C. ‘B’ ).3. A).End. B). Chạy<VD13_5. N : ‘). InMatran( ‘ Ma trận A là: ‘ .PAS> Trong các chương trình con ở ví dụ trên. Repeat Write(‘ Nhập số hàng. END. InMatran( ‘ Ma trận B là: ‘ . A. số cột M.3. Nhap( B. Tham khảo trước (Forward reference): . Readln. C). 13.1.

nếu ta đưa khai báo đầy đủ B lên trước A thì không cần phải tham khảo trước. { khai báo tham khảo B trước} Procedure A. Readln. 13. Procedure B. Song đặt giả thiết A gọi B rồi B lại gọi A thì nhất định phải tham khảo trước thôi. Begin Writeln(‘ Chào chị ‘).3. thì B gọi được A nhưng A không gọi được B. B. Khi đó để A gọi được B ta phải tiến hành khai báo phần đầu của B với từ khóa Forward trước khi khai báo B đầy đủ.PAS> Khi chương trình chạy sẽ in lên màn hình: Chào chị Chào anh Tất nhiên. B sau. . BEGIN A. Chạy<VD13_6. B được khai báo kế tiếp nhau A trước. Ví dụ 13.2.EXE> Chép tập tin nguồn <VD13_6.Bình thường khi trong chương trình chính có hai chương trình con A. khi đó ta nói có sự đệ qui. Forward . Procedure B.6: PROGRAM VIDU13_6. Begin Writeln(‘ Chào anh ‘). Sự đệ qui (Recursion): Một thủ tục hay hàm có thể gọi chính nó. End. End. END.

. Gt(N):0:0 ).. { Hàm tính k! bằng đệ qui} Begin If k=0 then Gt:= 1 else Gt:= k* Gt(k-1). Ta viết : Muốn tính k! ta phải tính được (k-1)!.EXE> Chép tập tin nguồn <VD13_7. tính và in gía trị N!. suy ra cuối cùng phải tính được 0!. Readln(N). ‘ != ‘. Readln. . Until N>0. BEGIN Repeat Write(‘ Nhập N: ‘). End. Chương trình sau nhập N. nhưng vì 0!=1 nên qúa trình kết thúc. Writeln( N.PAS> . Function Gt( k : Byte) : Real. END. Chạy<VD13_7. Trong chương trình có xây dựng và sử dụng một hàm đệ quy tính k! : PROGRAM VIDU13_7.. { Tính N! bằng đệ qui} Var N : Byte.7: Tính S= k! bằng đệ qui.Ví dụ 13. muốn tính (k-1)! lại phải tính (k-2)!.

{ Hàm tính số Fibonaci thứ k bằng đệ qui} Begin If k=0 then Fibo:= 1 else if k=1 then Fibo:=1 else . U(k)=U(k-1) + U(k-2) với k>1. Chương trình sau in ra số Fibonaci thứ N bằng cách gọi hàm đệ qui Fibo.Khi nhập N=4. Function Fibo( k : Integer) : Integer. Công thức truy chứng trên là cơ sở để xây dựng hàm đệ qui tính U(k): để tính được một số hạng ta phải tính được hai số hạng đứng trước nó. U(1)=1. { Tính số Fibonaci thứ N } Var N : Integer. qúa trình gọi các hàm được diễn giải như sau: Gt(4) =4*Gt(3) =4*3*Gt(2) =4*3*2*Gt(1) =4*3*2*1*Gt(0) { vì k=0 nên Gt=1} =4*3*2*1* 1 =24. Ví dụ 13.8: Tính số hạng U(k) của dãy Fibonaci bằng đệ qui: U(0)=1. PROGRAM VIDU13_8. Ta viết: U(k) = 1 nếu k=0 hoặc k=1 = U(k-1) + U(k-2) nếu k>1.

BEGIN Write(‘ Nhập N: ‘). END.Fibo:=Fibo(k-1) + Fibo( k-2). Lời khuyên là nên tránh dùng đệ qui nếu có thể được.4. Câu 2: Cho khai báo đầu của một hàm: Function F( k : Integer) : String . Muốn gán X:= F(5). N. ‘ = ‘. Writeln( ‘ Số Fibo thứ ‘.PAS> Ghi chú: Việc sử dụng đệ qui đòi hỏi nhiều về bộ nhớ.EXE> Chép tập tin nguồn <VD13_8. Chạy<VD13_8. c) Var X: Integer. b) Var X: String. Begin If k mod 2=0 then F:=’Chan’ else F:=’Le’. Fibo(N) ). 13. End. Readln. thì biến X phải khai báo kiểu gì : a) Var X: Real. Begin . End. d) Var X : Char. Readln(N). CÂU HỎI TRẮC NGHIỆM Câu 1: Cho khai báo đầu của một hàm: Function F( k : Integer) : String .

If k mod 2=0 then F:=’Chan’ else F:=’Le’. If x < y then F := y. -Lệnh nào đúng : a) TT(x +1. x) . c) TT(x. Begin F:=x. c) Var y : Integer. St) . BEGIN x:=10. b : String). thì biến y phải khai báo kiểu gì : a) Var y : Real. b) TT(10. St :String . End. Muốn in Write( F(y) ). y : Real. St) . Function F(x. y:Real):Real. Câu 3: Cho khai báo biến và khai báo đầu của thủ tục TT: Var x. St) . y : Integer . d) Var y : Char. Procedure TT( Var a : Integer . Câu 4: Khi chạy chương trình : Var x. d) y:= TT(St. . y:=15. b) Var y : String. End.

Write(F(x. y:=3. End. y là hai biến nguyên và khai báo thủ tục : Procedure Doicho( Var a : Integer. .y) Câu 5: Cho a là biến nguyên a=3. b : Integer). Var z : Integer. End. a:=b. -Sau khi thực hiện các lệnh: x:=7. b:=z. END. Begin x:=x+2. Begin z:=a. thì Giá trị của biến a là : a) 2 b) 5 c) 3 d) 0 Câu 6: Cho x. y): 0:0). -Kết qủa in ra: a) 10 b) 15 c) 0 d) F(x. Sau khi gọi thủ tục TT(a). và khai báo thủ tục : Procedure TT( x : Integer) .

END. x:= x+5.Doicho(x. Begin If a=1 then F:=1 else F:= a*a+ F(a-1). End. Procedure TT . Begin x:=4. End. y). y là: a) x=7. y=3 Câu 7: Cho khai báo hàm đệ quy : Function F( a : Integer) : Integer. Giá trị của hàm F(4) là: a) 1 b) 25 c) 14 d) 30 Câu 8: Khi chạy chương trình : Var x : Integer. y=3 c) x=3. y=7 d) x=7. Write(x). thì giá trị của x. BEGIN x:=0. . y=7 b) x=3. TT.

BEGIN x:=10. Var x: Integer . Procedure TINH . Procedure TTA .-Kết quả in ra là: a) 4 b) 5 c) 9 d) 0 Câu 9: Khi chạy chương trình : Var x : Integer. TINH. Begin . x:= x+12. Begin x:=1. END. Var x : Integer. End. -Kết quả in ra là: a) 10 b) 12 c) 22 d) 13 Câu 10: Khi chạy chương trình : Var x : Integer. Write(x).

x:= 7* 5; Write(x, ‘,’); End; BEGIN x:=4; TTA; Write(x:2); END. -Kết quả in ra là: a) 35, 4 b) 4, 35 c) 4, 75 d) 354 13.5. BÀI TẬP Câu 1) Viết một thủ tục nhập hai ma trận vuông A, B cấp N có các phần tử là các số nguyên. Viết một thủ tục tính ma trận C= A+2B Viết một thủ tục in các ma trận A, B và C lên màn hình Viết một hàm kiểm tra A, B, C có phải là ma trận đối xứng không ? Câu 2) Viết một hàm kiểm tra hàng thứ k của một ma trận A cấp MxN có lập thành một dãy tăng không ?. Nhập ma trận A và cho biết những hàng nào của A lập thành một dãy tăng ? Câu 3) Viết một hàm để chuẩn hóa một chuỗi: xóa bỏ mọi ký tự trắng thừa ở đầu và cuối chuỗi, và giữa hai từ chỉ giữ lại đúng một ký tự trắng. Câu 4) Viết một hàm để đổi một ký tự từ chữ hoa ra chữ thường. Dùng hàm đó đổi tất cả các ký tự của một chuỗi St nhập từ bàn phím ra chữ thường hết. Câu 5) Viết một hàm để kiểm tra một chuỗi có đối xứng không. Câu 6) Nhập vào một chuỗi số nhị phân, đổi ra số hệ thập phân tương ứng. Ví dụ : nhập chuỗi ‘1111’ , đổi ra số 15. Yêu cầu phải có một hàm tính y = 2k và không sử dụng hàm chuẩn EXP(x) . ( Hd : 1111 = 1x 23 + 1x 22 + 1x 21 + 1x 20= 15 ) .

Câu 7) Viết một hàm đệ qui tính S= xn (x thực, n nguyên dương). Câu 8) Viết một hàm đệ qui tính Sn:

14.1 KIỂU BẢN GHI 14.1.1. Khái niệm Các phần trình bày trước cho thấy ngôn ngữ Pascal rất mạnh trong việc giải quyết các bài toán thiên về tính toán. Trong phần này chúng ta sẽ thấy thêm một khả năng mạnh mẽ nữa của ngôn ngữ Pascal trong lĩnh vực quản lý: quản lý nhân sự, quản lý vật tư, quản lý tài chánh,.v.v. Hàng ngày chúng ta rất quen thuộc với một danh sách sinh viên như dưới đây:

Mỗi dòng liệt kê các dữ liệu về một người, mỗi cột là một dữ liệu thành phần cung cấp thông tin về một thuộc tính cụ thể của những người đó. Trong ngôn ngữ Pascal, mỗi dòng được gọi là một RECORD (dịch là bản ghi hay thẻ ghi), mỗi cột là một FIELD (dịch là trường hay thành phần, hay thuộc tính cho sát với thực tế). Nói tổng quát, mỗi bản ghi là một tập gồm nhiều trường (field), các trường có thể có kiểu dữ liệu khác nhau. 14.1.2. Mô tả bản ghi : Kiểu bản ghi được mô tả bằng cách dùng từ khóa RECORD kèm theo một danh sách khai báo các tên trường và kiểu dữ liệu tương ứng, kết thúc bằng từ khóa END; , tức là: TYPE Tênkiểu = RECORD Têntrường1 : Kiểudliệu1; Têntrường2 : Kiểudliệu2; ... Têntrườngk : Kiểudliệuk;

End; Ví dụ 1: Ta định nghĩa một kiểu KSVIEN như sau: TYPE KSVIEN = RECORD Hoten:String[20]; Maso : String[8]; Toan, Ly, DTB: Real; End; Theo mô tả trên, ta có một kiểu dữ liệu mới đặt tên là KSVIEN có cấu trúc bản ghi gồm 5 trường (thuộc tính) là:

Ví dụ 2: Ta mô tả thời gian là kiểu KDATE có ba trường ngày , tháng, năm như sau: TYPE KDATE = RECORD Ngay : 1..31; Thang : 1..12; Nam : Integer; End; Ví dụ 3: Ðể quản lý các sách trong một thư viện, ta xây dựng một kiểu bản ghi KSACH như sau: TYPE KSACH = RECORD

Ma_so_sach: String[6]; Ten_doc_gia: String[20]; Nam_xban :Integer; Gia_tien: Real; Ngay_muon : KDATE; End; Kiểu KSACH là một bản ghi có 5 trường mô tả 5 thuộc tính của sách là: mã số sách, tên độc giả, năm xuất bản, gía tiền và ngày mượn. Ví dụ này cho thấy các bản ghi có thể được mô tả lồng nhau: kiểu dữ liệu của một trường của bản ghi này lại có thể là một kiểu bản ghi khác đã được định nghĩa trước đó. Trong bản ghi KSACH, Ngay_muon là một trường có kiểu dữ liệu là một bản ghi kiểu KDATE. Mỗi đối tượng cần quản lý có thể có nhiều trường, song tùy yêu cầu quản lý mà ta chỉ lựa chọn và khai báo những trường thật sự cần thiết. Khai báo thừa thì hao phí bộ nhớ, nhưng nếu thiếu thì công tác quản lý sẽ khó khăn do thiếu thông tin. Vì vậy, nên khai báo các trường với số lượng ít nhất nhưng đủ dùng. 14.1.3. Sử dụng bản ghi : Kiểu bản ghi sau khi đã được định nghĩa có thể dùng khai báo cho các biến. Ví dụ : Var X, Y, Z : KSVIEN; Trong đó KSVIEN là bản ghi đã mô tả ở phần trên. Theo khai báo này, X ,Y và Z là ba biến kiểu bản ghi KSVIEN, mỗi biến đều có 5 trường Hoten, Maso, Toan, Ly và DTB. Ðể thâm nhập vào một trường của bản ghi ta viết tên biến kiểu bản ghi, sau đó là dấu chấm ‘.’ và tên trường, tức là : Tênbiến .Têntrường Các lệnh dưới đây gán gía trị cho từng trường của biến X : X.Hoten :=‘Nguyen Van An’; X.Maso :=‘1973208’; X.Toan :=8.0; X.Ly :=7.0;

X.DTB :=(X.Toan+X.Ly)/2; Ðể nhập dữ liệu cho trường Hoten của biến Y, ta viết: Write(‘Nhap ho ten sinh vien Y : ‘); Readln(Y.Hoten); Sở dĩ phải viết tên biến bản ghi ở trước tên trường là để xác định trường đó là của biến bản ghi nào. Mỗi biến X, Y, Z đều có trường Hoten, nên nếu chỉ viết Hoten thôi thì không biết đó là Hoten của ai: X, Y hay Z ?. Còn viết X.Hoten là chỉ rõ đây là Hoten của biến X. Như vậy, mỗi trường của biến bản ghi có thể thâm nhập và sử dụng như một biến bình thường. X.Hoten là biến kiểu String[20], X.Maso là biến kiểu String[8], ..., X.DTB là biến kiểu Real. Ðối với các bản ghi lồng nhau, cách truy xuất đến từng trường cũng tương tự. Ví dụ: Cho khai báo biến S kiểu KSACH: Var S : KSACH ; Ðể truy nhập đến các trường Ngay, Thang, Nam của Ngay_muon ta viết : S.Ngay_muon.Têntrường Chẳng hạn gán : S.Ngay_muon.Ngay := 2; S.Ngay_muon.Thang := 9; S.Ngay_muon.Nam := 1999; Hai biến bản ghi cùng kiểu có thể gán cho nhau. Lệnh : Y:=X; gán gía trị của từng trường của biến X cho trường tương ứng của biến Y. Vậy lệnh trên tương đương với khối 5 lệnh sau : begin Y.Hoten :=X.Hoten; Y.Maso :=X.Maso; Y.Toan :=X.Toan; Y.Ly :=X.Ly; Y.DTB :=X.DTB;

Hoten =‘Tran Thi Nga’ X. trong đó Z là biến trung gian cùng kiểu bản ghi với X và Y.DTB =7.0 X.DTB =6.Toan =5. Câu lệnh WITH : Khi làm việc với nhiều trường của một biến bản ghi thì cách thâm nhập ở trên tỏ ra rườm rà vì phải viết nhiều lần tên biến trước tên trường. If X<>Y then writeln(‘ X khác Y ‘).Ly =7.Maso =‘1973208’ X.Toan =8.end.Toan =5.0 Y. Ví dụ: Nếu biến X và Y có các trường tương ứng là : X. >. <=.0 Y.0 Y.5 14.Hoten =‘Nguyen Van An’ X. ta được : X.Maso =‘1973208’ Y.DTB =6.Hoten =‘Tran Thi Nga’ Y. Hai bản ghi có thể hoán đổi gía trị cho nhau theo nghĩa hoán đổi từng cặp gía trị của các trường tương ứng.4. Y:=Z.0 X.DTB =7. >= cho các bản ghi.0 X.Toan =8.Ly =8. Các bản ghi có thể so sánh bằng nhau hoặc khác nhau: Ví dụ: If X=Y then writeln(‘ X và Y là một người ‘).5 Y.5 thì sau khi hoán đổi. Tuy nhiên không có phép so sánh <. X:=Y. Giống như các biến đơn giản.Maso =‘1974564’ Y.1.5 Y.0 Y. để hoán đổi hai bản ghi X và Y ta dùng ba lệnh: Z:=X.Ly =8.0 X.Maso =‘1974564’ X. .Ly =7.Hoten =‘Nguyen Van An’ Y.

End. ta viết: WITH X DO Begin Writeln(‘ Họ và tên :’ . Ten_doc_gia:=‘Nguyen van Mai’. WITH Ngay_muon DO . Gia_tien:= 15000. Writeln(‘ Ðiểm trung bình : ‘ . Ví dụ. Hoten). Toan: 4:1). Nam_xban :=1999. Writeln(‘ Ðiểm Lý :’ . Ly: 4:1).Hoten:= ‘Nguyen Van An’. DTB :4:1). Ðể in các trường của biến X lên màn hình. Pascal đưa ra câu lệnh : WITH Tênbiến DO LệnhP. Các lệnh sau gán các gía trị cho các trường của biến S kiểu KSACH là một bản ghi lồng nhau: WITH S DO begin Ma_so_sach:=‘TH-435’.Ðể đơn giản cách viết. Writeln(‘ Mã số sinh viên :’ . Nếu LệnhP có truy xuất đến các trường của Tên biến thì không cần phải viết Tên biến và dấu chấm trước các tên trường. ta có thể viết : WITH X DO Hoten:= ‘Nguyen Van An’. Writeln(‘ Ðiểm Toán :’ . thay vì viết: X. Maso). Tất cả các tên trường nằm trong khối begin và end được hiểu là các trường của biến X (nếu không ghi rõ tên biến nào khác). Tên biến thuộc kiểu bản ghi.

một danh sách các quyển sách trong thư viện. Mảng các bản ghi : Trong thực tế.’ : ‘). 14.. Nam:=1999. Write(‘Nhap ma so sinh vien thu ‘. Readln(Maso). Ví thế mảng các bản ghi được dùng rất phổ biến.i.begin Ngay:=2. Thang:=9. Write(‘Nhap điểm Toan.. end. Maso.50] of KSVIEN. DTB lưu trữ các thông tin về sinh viên thứ i trong danh sách. Ðể nhập dữ liệu ( Hoten.. ta dùng vòng lặp For phối hợp với câu lệnh WITH : For i:=1 to 50 do WITH DS[i] DO begin Write(‘Nhap ho ten sinh vien thu ‘. Ly). Ly. ta thường phải quản lý một danh sách sinh viên của một lớp. Mỗi DS[i]. .i..’ : ‘).’ : ‘). Toan. i=1. Readln(Toan. Ly ) rồi tính Ðiểm trung bình cho 50 sinh viên này.i. Khi khai báo : VAR DS : Array[1. Ly sinh vien thu ‘...50] of KSVIEN. Maso..5.1. hoặc : TYPE KMang = Array[1. Toan.. end... DS[50] cùng kiểu bản ghi KSVIEN. VAR DS: KMang. thì ta có một mảng DS gồm 50 phần tử DS[1]. Readln(Hoten). 50 là một bản ghi có 5 trường Hoten.

DTB:5:1). Ðể sắp xếp danh sách sinh viên theo trật tự giảm của DTB sao cho người có DTB cao thì đứng trước. Ðể in danh sách đã sắp xếp lên màn hình. ta có thể áp dụng phương pháp sắp xếp mảng. end. DS[i]:=DS[j].2. Ở đây Z là biến bản ghi cùng kiểu với các phần tử DS[i]. Mã số. 14. end. người có DTB thấp thì đứng sau. Toan:5:1. hãy tính điểm trung bình : DTB=(Toan + Ly)/2 .DTB < DS[j]. hoặc Maso. có thể sắp xếp danh sách sinh viên theo khóa là điểm Toan. hoặc theo Hoten.DTB then begin { Ðổi chỗ DS[i] và DS[j] } Z:=DS[i]. hoặc điểm Ly. song chỉ lấy trường DTB làm tiêu chuẩn so sánh: For i:=1 to 49 do For j:=i+1 to 50 do If DS[i]. DS[j]:=Z. Ly:5:1. Một cách tương tự.DTB:=(Toan + Ly)/2. Khi sắp xếp theo DTB tăng hoặc giảm thì trường DTB được gọi là "khóa" ( key) sắp xếp. các điểm Toán. Hoten:25.1: Nhập một danh sách N ( 1≤ N ≤ 50) sinh viên gồm các trường: Họ tên. Lý. ta dùng lệnh : For i:=1 to 50 do WITH DS[i] DO Writeln( i:2. Maso:9 . . và phân loại như sau: Loại= Giỏi nếu DTB ≥ 9. CÁC VÍ DỤ VỀ BẢN GHI Ví dụ 14. Ðối với mỗi sinh viên.

Bình nếu 5 ≤ DTB < 7. Họ tên. PROGRAM VIDU14_1. điểm Toán. Max. chỗ nào có ký hiệu ' ' thì hãy thay bằng một ký tự trắng . BEGIN CLRSCR.Khá nếu 7 ≤ DTB < 9. Ly.50] of KSVIEN. N. i. j. Var DS : Array[1. in danh sách lên màn hình. Toan. Bài giải : Trong chương trình dưới đây. Type KSVIEN = RECORD Hoten:String[18]. Uses CRT. End. Readln(N). Ðiểm trung bình môn Toán cho cả danh sách là bao nhiêu ?. DTB và phân loại. Lý. DTB : Real. TBToan: Real. Repeat Write(‘ Nhập số sinh viên N= ‘) . Z : KSVIEN. Loai : String[8]. Dem : Integer. Maso.. Có bao nhiêu người được điểm cao nhất đó ?. Mã số. Sắp xếp danh sách theo trật tự giảm của DTB. Kém nếu DTB < 5. . mỗi người trên một dòng gồm các mục: Số thứ tự. Cho biết điểm Tóan cao nhất là mấy ?.

i.’ : ‘).DTB then begin Z:=DS[i]. Write(‘Nhap ma so sinh vien thu ‘. If DTB >=9 then Loai:=‘Gioi’ else if DTB >=7 then Loai:=‘Kha’ else if DTB >=5 then Loai:=‘Binh’ else Loai:=‘Kem’. Readln(Toan.i. tính DTB va phân loại } For i:=1 to N do WITH DS[i] DO begin Write(‘Nhap ho ten sinh vien thu ‘. Write(‘Nhap điểm Toan. DS[i]:=DS[j]. { Sắp xếp giảm theo DTB } For i:=1 to N-1 do For j:=i+1 to N do if DS[i]. .i. Writeln(‘ In danh sach len man hinh ‘ ). end. Readln(Maso).DTB < DS[j]. Readln(Hoten). Ly). DTB:=( Toan + Ly)/2.’ : ‘). Ly sinh vien thu ‘.’ : ‘).Until ( N>0) and ( N < 51). end. { Nhập danh sach. DS[j]:=Z.

Toan =Max then Dem:=Dem+1. Với mỗi đầu sách. { Tính điểm trung bình môn Toán cho cả danh sach } TBToan:=0. Maso:8. For i:=1 to N do if DS[i].Toan. Writeln(‘ Có ‘. TBToan:=TBToan/N .Toan. ' TOAN LY DTB LOAI’). Chạy<VD14_1. TBToan:6:2). Hoten.2: Nhập một danh sách N (1≤ N ≤ 50) đầu sách gồ? các thông tin về Tên sách. #32 :19-Length(Hoten). Max:4:1). Max:4:1). Dem.EXE> Chép tập tin nguồn <VD14_. For i:=1 to N do if Max< DS[i].Toan. Loai:5). { Lấy tổng điểm môn Toán} For i:=1 to N do TBToan := TBToan + DS[i].Toan then Max:=DS[i]. Số lượng (SL) và Ðơn gía (DG).Ly:4:1. Writeln(‘Diem Toan cao nhat = ‘. Writeln(‘Diem trung binh mon Toan= ‘ . ‘ em có điểm Toán= ‘. tính Gía tiền như sau: . { Ðếm số em có điểm Toán =Max} Dem:=0. DTB:4:1. For i:=1 to N do WITH DS[i] DO Writeln(i:2. #32 .PAS> Ví dụ 14. Readln. END.Writeln(‘STT HO VA TEN MA SO '. Toan:4:1. { Tìm điểm Toán cao nhất } Max:=DS[1].

Var S : Mang.5%*SL*DG nếu 10 ≤ SL<30 = SL*DG .8%* SL*DG nếu 30 ≤ SL <50 = SL*DG . Mang = Array[1. mua từ 30 đến 49 cuốn thì được giảm 8% đơn gía.GT = SL * DG nếu SL<10 = SL*DG . BEGIN Repeat Write(‘ Nhập N: ‘). . Uses CRT. N. Type KSACH = RECORD Tensach : String[20]. DG. Bài giải: PROGRAM VIDU14_2. i : Integer. mua từ 50 cuốn trở lên thì được giảm 10% đơn gía).10%* SL*DG nếu SL ≥ 50 (Tức là nếu mua từ 10 đến 29 cuốn thì được giảm 5% đơn gía. Z : KSACH..50] of KSACH. Nếu có thì cho biết có bao nhiêu cuốn và đơn gía của nó. SL : Integer. Tongtien : Real. Tìm xem trong danh sách đó có cuốn "TIN HOC DAI CUONG" không. GT: Real. Tính Tổng số tiền phải chi cho việc mua sách. End. kể cả 10% thuế gía trị gia tăng đánh vào tổng gía tiền.

Readln(DG). Until (N>0) and ( N<51). end. For i:=1 to N do Tongtien:=Tongtien+S[i].08). Write(‘Nhập đơn giá : ‘). 10.29 : GT:=SL*DG*(1-0. { Nhập N sách và tính tiền} For i:=1 to N do With S[i] do begin Write(‘Nhập tên sách thứ ‘. { Cộng thêm thuế 10% gía tri gia tăng} Tongtien:=Tongtien + 0.. i .. else GT:=SL*DG*(1-0.. { Tìm cuốn ‘TIN HOC DAI CUONG’} .Readln( N ).1*Tongtien .05).9 : GT:=SL*DG. Repeat Write(‘Nhập Số lượng : ‘).GT. Until SL>0. Case SL of 1. Writeln(‘Tổng tiền phải chi là: ‘. 30. Readln(Tensach). { Hết For} { Tính tổng gía thành các đầu sách} Tongtien:=0. Readln(SL). Tongtien :6:2). { Hết Case} end.’: ‘).49 : GT:=SL*DG*(1-0.1).

trình bày thành biểu sau : TỔNG KẾT TIỀN MUA SÁCH NĂM 1999 Giải: Thủ tục INBIEU sau đây chứa một thủ tục con INCHITIET có nhiệm vụ in chi tiết từng dòng cho từng cuốn sách . .PAS> Ví dụ 14. Chỗ nào có ký hiệu thì hãy thay bằng một ký tự trắng. Chạy<VD14_2. Thủ tục in biểu được viết như sau: PROCEDURE INBIEU.EXE> Chép tập tin nguồn <VD14_2. If i> N then writeln (‘ Không có cuốn THDC?‘) else WITH S[i] DO writeln(‘ Sách THDC có ‘. END. Nhắc lại rằng #32 cũng là một ký tự trắng. sau đó là lời gọi thủ tục INCHITIET.i:=1. đó là N và S. ‘ cuốn.3: Sử dụng dữ liệu của ví dụ 2 viết thủ tục in danh sách các đầu sách lên mà hình. While (i<=N) and ( S[i]. đơn gía= ‘. SL:4. Readln. Var i: Integer . DG:6:2).2. Các dữ liệu phục vụ cho thủ tục này là các biến toàn cục được khai báo ở chương trình chính trong ví dụ 14.Tensach<> ‘ TIN HOC DAI CUONG’) do i:=i+1. Thân của thủ tục INBIEU là các lệnh in tiêu đề.

‘ |’). Write(‘| ‘. . { hết in chi tiết} Begin { Vào thủ tục Inbiểu } { In tiêu đe?} Writeln(' TONG KET TIEN MUA SACH NAM 1999’). #32). end. { Thủ tục in chi tiết từng cuốn sách} Var i : Integer. ‘------------------------------------------------------------’). #32). Write(‘| STT ‘). #32:7 ). Writeln. Write(‘| SO LUONG ‘). Write(‘|’ . SL:8. Writeln. #32:7 . GT:8:2. Write(‘| ‘ . End. Write(‘| ‘. Write(‘| ‘. For i:=1 to 63 do write(‘-’). DG:8:2.Procedure INCHITIET. #32). i:3. For i:=1 to 63 do write(‘-’). ‘TEN SACH’. Write(#32: 21-Length(Tensach) ). Tensach). Writeln( #32 :6 . Begin For i:=1 to N do WITH S[i] DO begin Write(‘| ‘ . Writeln.

SL : Integer. ta được một chương trình đầy đủ mà khi chạy sẽ in biểu theo đúng yêu cầu.2. phần tính tổng gía thành các cuốn sách vào một thủ tục riêng gọi là TINH. End . và phần tìm cuốn TIN HOC DAI CUONG vào một thủ tục gọi là TIM. Var S : Mang. Writeln.Thủ tục Nhập -----} . N. PROGRAM VIDU14_3. Ráp toàn bộ thủ tục INBIEU vào phần khai báo của chương trình trong ví dụ 14. Uses CRT. {--. vào cuối của thân của chương trình đó. GT: Real.Write(‘| DON GIA ‘). DG. ta đưa phần nhập dữ liệu vào một thủ tục riêng gọi là NHAP.50] of KSACH. End. Z : KSACH. i : Integer. For i:=1 to 63 do write(‘-’). Trong chương trình chính ta chỉ phải gọi tên các thủ tục đó ra mà thôi. Ngoài ra. Write(‘| GIA TIEN |’). Type KSACH = RECORD Tensach : String[20]. để chương trình chính bớt rườm rà. INCHITIET. Writeln. và thêm lệnh gọi INBIEU.. Mang = Array[1. Tongtien : Real.

{ Nhập N đầu sách và tính gía thành } Var i : Integer. { Hết For} End.. { Hết Case} end.29 : GT:=SL*DG*(1-0.Thủ tục Tinh -----} .49 : GT:=SL*DG*(1-0... Readln(DG). i . Repeat Write(‘Nhập Số lượng : ‘). Readln(SL). For i:=1 to N do With S[i] do begin Write(‘Nhập tên sách thứ ‘. {--. Begin Repeat Write(‘ Nhập số lượng sách N: ‘). Until (N>0) and ( N<51). Case SL of 1.’: ‘). else GT:=SL*DG*(1-0. End.08).05). Readln(Tensach). 10. Write(‘Nhập đơn giá : ‘). 30.9 : GT:=SL*DG. Readln( N ).PROCEDURE NHAP ( Var N : Integer). Until SL>0.1).

Tongtien :6:2). Writeln(‘Tổng tiền phải chi là: ‘. SL:4. For i:=1 to N do Tongtien:=Tongtien+S[i].1*Tongtien . If i> N then writeln (‘ Không có cuốn THDC ‘) else WITH S[i] DO writeln(‘ Sách THDC có ‘.GT.Tensach<> ‘ TIN HOC DAI CUONG’) do i:=i+1. While (i<=N) and ( S[i].Thủ tục In biểu ----------------} PROCEDURE INBIEU. End. {---------. { Tìm cuốn ‘TIN HOC DAI CUONG’} Var i : Integer. End. {--. Begin i:=1.PROCEDURE TINH . Begin Tongtien:=0. ‘ cuốn với đơn gía= ‘.Thủ tục Tìm -----} PROCEDURE TIM . { Cộng thêm thuế 10% gía tri gia tăng} Tongtien:=Tongtien + 0. { Tính tổng gía thành các đầu sách} Var i: Integer. DG:6:2). Var .

#32). end. ‘-------------------------------------------------------------’). Write(‘| ‘ . GT:8:2. #32:7 ). SL:8. Tensach). ‘TEN SACH’. Writeln. Writeln. { hết in chi tiết} Begin { Vào thủ tục Inbiểu } { In tiêu đề} Writeln(‘~~~~~~TONG KET TIEN MUA SACH NAM 1999’). ‘ |’). #32). Write(‘|’ . Write(‘| ‘. #32). i:3. End. Write(‘| ‘. For i:=1 to 63 do write(‘-’). Begin For i:=1 to N do WITH S[i] DO begin Write(‘| ‘ . Writeln( #32 :6. Writeln.i: Integer . Write(‘| STT ‘). { Thủ tục in chi tiết từng cuốn sách} Var i : Integer. Write(‘| ‘. Write(#32: 21-Length(Tensach) ). DG:8:2. #32:7 . For i:=1 to 63 do write(‘-’). Procedure INCHITIET. .

END. b) Type Phan so = Record . Chạy<VD14_3. Write(‘| GIA TIEN |’).EXE> Chép tập tin nguồn <VD14_3.Write(‘| SO LUONG ‘). Write(‘| DON GIA ‘). Mau: Integer. Writeln. TINH.3. CÂU HỎI TRẮC NGHIỆM Câu 1: Chọn khai báo đúng : a) Type Phanso = Record Tu. Readln. For i:=1 to 63 do write(‘-’). INBIEU. End . end . TIM. Writeln.PAS> 14. {---------.Hết thủ tục In biểu --------------} BEGIN NHAP ( N). INCHITIET.

end . end.y : Real.y : Real. . y . Tu. end. end. end. c) Type DIEM = Record x. Mau: Integer. d) Type Record = Phanso . y : Real. end. d) DIEM = Record x. Dtb:Real. Câu 3: Cho khai báo : Type SV = Record Ten :String[20]. Mau : Integer. Tu. end. b) Type DIEM = Record x. Câu 2: Chọn khai báo đúng : a) Type DIEM = Record x. Mau so : Integer.Tu so. c) Var Phanso = Record .

. c) X.Var X. Var X : SV .. -Chọn câu đúng : a) With X do Dtb:= 4. Y : SV . Maso : String[10].10] of SVIEN. -Chọn câu đúng : a) SV. b) Var A : array [1.5 . end. -Câu nào đúng : a) Var A : array [1. b) Dtb:= 4. end. . d) X := Y.5 . d) X := 4.Dtb:= 4. Câu 4: Cho khai báo : Type SV = Record Ten :String[20]. b) X.Dtb:=’ Le Van Toan’. Câu 5: Cho khai báo : Type SVIEN = Record Ten.5 . Dtb:Real.5 .Dtb.10] of Record. c) With SV do Dtb:=4.Ten:=’Anh’ .5 .

Begin A. end. y : Integer. B. -Kết qủa in ra là: a) 2 b) -5 c) -7 d) -3 Câu 7: Khi chạy chương trình : Type Vector = Record x.x+A. Var A. y : Integer. B : Vector .c) Var A: array[1. A. End. B. Câu 6: Khi chạy chương trình : Type Vector = Record x.y := -3 . Write( A. B : Vector .x := -1...10] of Ten .x := 2 . B.10] of Maso . B. .y := 1.x*B. d) A: array[1.x := 2 . Begin A.y := 4.y := 0 . end.y) . Var A. A.x := -1.y*B.

Tien: Real.x) + Sqr(A. y=4.x:= 3. -Kết qủa in ra là: a) 5 b) 16 c) 9 d) 25 Câu 8: Cho khai báo : Type Vector = Record x. Câu 9: Cho khai báo : Type Sach = Record Masach : String[4]. b) For i:=1 to 4 do With S[i] do x:= 3. Var DS : Array[1.y=4. Var S : Array[1.Write( Sqr( A. d) For i:=1 to 4 do begin S. Gia: Real.10] of Sach .4] of Vector . c) For i:=1 to 4 do begin S[i].x-B.y) ).. . end. i : Integer . y : Integer. end. End.x:= 3.y-B.y=4. i : Integer . -Lệnh nào đúng : a) For i:=1 to 4 do S[i]. S. S[i]. end.. end . y=4.x:= 3.

Gia . 2 hay 3 ). 14.4 . d) With A do hoanh:= B. Câu 10: Cho khai báo : Type Toado = Record hoanhdo. Var A. Xét xem Kết qủa thí sinh này đậu hay rớt dựa vào bảng điểm chuẩn sau : .hoanh . b) A:=A-1. end.hoanh :=B. TÐ. 2. -Lệnh nào SAI : a) A:=B . a) Hãy nhập vào một danh sách 100 thí sinh gồm Họ tên. d) For i:=1 to 10 do Tien:=Tien+ Sach[i].Masach . b) For i:=1 to 10 do Tien:=Tien+ Gia . KV. c) For i:=1 to 10 do Tien:=Tien+ DS[i]. TÐ : tổng diểm ba môn thi . NH : thí sinh thuộc nhóm nào ? ( 1. hay 3). cần biết các thông tin sau: Họ tên : họ và tên của thí sinh KV : thí sinh thuộc khu vực nào? ( 1.BÀI TẬP Câu *1) Ðể biết một thí sinh đậu hay rớt trong kỳ thi tuyển sinh. tungdo : Integer. c) A. NH. B: Toado .tung .-Lệnh nào đúng : a) For i:=1 to 10 do With DS [i] do Tien:=Tien+ Gia .

B(xb. Có một thủ tục (hay hàm) tính độ dài các cạnh AB. B. với P là nửa chu vi tam giác : P = (AB+BC+AC) / 2 .5 thì đậu. ngược lại thì tính và in diện tích của tam giác ABC lên màn hình theo công thức Hêrông : . NH. TÐ và Kết qủa đậu. Nếu có thì bắt nhập lại cho đến khi được ba điểm A. y : real. Trong đó có một hàm kiểm tra xem có một cặp điểm nào trùng nhau không ?. . Nếu không phải thì in ra chữ " Không phải Tamgiác" . End. B. C . b) In danh sách đã sắp xếp theo trật tự giảm của TÐ lên màn hình. rớt. AC theo công thức : Nếu A(xa. Nhóm 2. c) Chỉ in danh sách những người đậu lên màn hình theo mẫu: Câu *2) Mỗi điểm M(x. KV. Viết chương trình với các yêu cầu sau : Có một thủ tục nhập vào tọa độ của ba điểm A. có Tổng điểm ? 17.y) trong mặt phẳng toạ độ Oxy được mô tả như sau : Type DIEM = Record x. C phân biệt.ya).yb) thì Có một thủ tục kiểm tra xem AB. gồm các mục Họ tên. ngược lại thì rớt. AC có phải là ba cạnh của một tam giác không? ( Hd : tổng hai cạnh phải lớn hơn cạnh còn lại ). BC. BC.Ví dụ : Thí sinh ở Khu vực 1 .

Văn. PP. 100 kw đầu tiên trên định mức có đơn giá 8đ. C) và các điểm Toán. Hãy tính tiền điện cho mỗi hóa đơn. TP. chỉ số điện kế tháng trước (Socu). biết rằng: Mỗi kw trong định mức có đơn gía là 5đ. Câu 5) Nhập một danh sách N người gồm Họ tên. Tìm trong các hóa đơn xem có hộ nào tên là Tuan không ? Nếu có thì in lên màn hình các hóa đơn có chủ hộ tên là Tuan gồm các thông tin về Socu. Somoi. Sinh kiểu thực. Dmuc và Tien điện phải trả. chuyên ban (A . Chức vụ (GD.Câu 3) Viết một chương trình pascal để thực hiện các yêu cầu sau : Nhập số nguyên N ( 0<N<100) và một danh sách N học sinh với các thông tin về: họ và tên. B. mỗi hóa đơn có họ tên chủ hộ. Từ kw thứ 101 trên định mức trở lên có đơn gía 10đ. Tính Phụ cấp lương (PC) cho từng người như sau : PC = 50% Mức lương tháng nếu chức vụ là GD = 40% " = 30% " = 20% " " " " " " " " " " TP PP NV Tính Thu nhập (TN) trong tháng cho từng người : TN = Mức lương + PC . NV) và Mức lương tháng (ML) . Tính tổng số tiền thu được từ tất cả các hóa đơn. chỉ số điện kế tháng này (Somoi). Với mỗi học sinh hãy tính điểm trung bình như sau : DTB =(2*Toán+ Sinh+Văn)/4 nếu em thuộc chuyên ban A =(Toán+2*Sinh+Văn)/4 nếu em thuộc chuyên ban B =(Toán+Sinh+2*Văn)/4 nếu em thuộc chuyên ban C Chuyên ban nào có nhiều em có điểm trung bình ? 5 nhất ? Câu 4) Nhập số nguyên N ( 0<N<50 ) và N hóa đơn tính tiền điện. và định mức (Dmuc) điện hàng tháng của hộ.

TapS : SET OF Byte. TapB : Kky_tu. 15. và nếu là đoạn con thì phạm vi của đoạn con không được vượt qúa phạm vi của kiểu Byte: Var T1: SET OF Integer. TapB. chẳng hạn: Nguyen Thi Loan. TapH. kế đến là kiểu cơ bản của các phần tử. TapH: Kchu_hoa. Yêu cầu phần này viết thành một thủ tục. Mức lương. Số phần tử của tập hợp tối đa là 256 phần tử.1. TapB : SET OF Char. Kiểu cơ bản phải là kiểu vô hướng đếm được. Khai báo : Một tập hợp thì gồm nhiều gía trị có chung một kiểu dữ liệu.1. Chú ý rằng các khai báo dưới đây là sai.. TapS nói trên cũng có thể khai báo trực tiếp như sau: Var TapA. TapS : Kso. Chức vụ. ‘Z’. In Họ tên.. KIỂU TẬP HỢP 15. ký tự . tức chỉ có thể là kiểu byte. vì kiểu cơ bản không thể là Integer. Ví dụ: TYPE Kky_tu = SET OF Char. gọi là kiểu cơ bản. ‘Z’. Kchu_hoa = SET OF ‘A’. . riêng chữ cái đầu từ thành chữ hoa.Ðổi họ tên của mọi người ra chữ thường hết. Var TapA. Kiểu tập hợp được mô tả bằng từ khóa SET OF . lôgic hay liệt kê. TapH : SET OF ‘A’.1. Các tập hợp TapA. Phụ cấp và Thu nhập của những người có thu nhập cao nhất lên màn hình. Kso = SET OF Byte.

. 2*j] : tập hợp này có 4 phần tử là 3. có thể gán: TapA:=[‘1’. ‘C’.6. 5. j là các số nguyên sao cho i+j và 2*j nằm trong phạm vi từ 0 đến 255.20.’9’].1. 9... trong đó i. ký hiệu là A+B. 15] Phép giao: . 9.. ‘X’. ‘B’. 6.1.’5’. 15. [ ] : tập rỗng [3.8]. ví dụ: [3. TapH:=[‘C’. Lệnh gán dưới đây là sai vì hai vế không cùng kiểu dữ liệu: TapA:=[1. là một tập hợp gồm các phần tử hoặc thuộc tập A hoặc thuộc tập B.. i+j.. TapS:=[‘1’.T2: SET OF 1. 3. và đặt giữa hai dấu ngoặc vuông.. 30.. 40].’C’. ‘A’]. ‘9’. 12 [‘A’. Ví dụ. ‘X’.. với các biến khai báo ở trên.. 5. 5.10. ‘Z’] : tập các chữ ‘A’. các phần tử được phân cách nhau bởi dấu phẩy. 4. 15.2.. ‘Z’ Các phần tử của tập hợp có thể là biến hay biểu thức. Các phép toán : Phép gán: Có thể gán một tập hợp cho một biến tập hợp cùng kiểu.3. Xác định một tập hợp : Một tập hợp được xác định bằng cách liệt kê các phần tử của nó. 10. Ví dụ: [3.. 15]=[ 3. 5. TapS:=[15.5]+[4. Tập rỗng [ ] gán cho biến tập hợp kiểu nào cũng được : TapA:=[ ].6.6] : tập các số nguyên 4. TapH:= [ ]. 12] : tập các số nguyên 3. Phép hợp: Hợp của hai tập hợp A và B. 6 [3.6.’F’]. hai phần tử kia có gía trị bằng i+j và 2*j.256 .

Ví dụ: [1. và kết qủa là một tập hợp C cùng kiểu với A và B. <=. 3. ký hiệu là A*B. nói cách khác A>=B khi và chỉ khi B<=A.Giao của hai tập hợp A và B.2. ‘B’]<>[‘a’. Biểu thức x IN TapA cho kết qủa là True nếu gía trị x thuộc TapA.... Phép bằng: A=B khi và chỉ khi mỗi phần tử của A đều thuộc B và mỗi phần tử của B đều thuộc A.5] [‘A’.5]<=[3. kết qủa của các phép so sánh A với B sẽ là TRUE hoặc FALSE. ‘n’] cho kết qủa là TRUE ‘y’ IN [‘N’.4. ví dụ: [3.10] .10] Phép hiệu: Hiệu của hai tập hợp A và B. trong trường hợp ngược lại. ‘n’] cho kết qủa là FALSE Các phép so sánh (=. là một tập hợp gồm các phần tử thuộc tập A nhưng không thuộc tập B. ta nói A khác B và viết A<>B. . Ví dụ: [3...5] [3.10]*[5.5]= [2.’B’] Phép nhỏ hơn hoặc bằng : A<=B khi và chỉ khi mọi phần tử của A đều thuộc B..15] =[5.. Ví dụ : ‘N’ IN [‘N’... Phép thử IN (thuộc về) : Dùng để kiểm tra xem một biến hay một gía trị có phải là phần tử của một tập hợp nào đó không. là một tập hợp gồm các phần tử đồng thời thuộc A và B.[5.5]<=[1. <>.4] Nhận xét: Các phép toán trên chỉ thực hiện được khi A và B cùng kiểu. ký hiệu là A-B. >=) : Cho A và B là hai tập hợp cùng kiểu. cho gía trị False trong trường hợp ngược lại..15] =[1. Ví dụ: [1..6] Phép lớn hơn hoặc bằng : A>=B khi và chỉ khi mọi phần tử của B đều thuộc A.

For i:=1 to N do if St[i] IN [‘A’. Ví dụ 15.’D’] Chú ý rằng trong các tập hợp không có phép so sánh nhỏ hơn (<) và lớn hơn (>).. Readln(St).5] [‘A’. i: byte. 15.. B. Ví dụ St=‘ABc3BAFdzA’ thì có các chữ hoa là A.[3. St : String.’Z’. If (A>=B) and ( A<>B) then writeln(‘A > B’)..1: Nhập vào một chuỗi St .’Z’]>=[‘A’. F. ch : char. End.1. Var Taphoa : Set of ‘A’. Taphoa:=[]. PROGRAM VIDU15_1. cho biết trong St có những chữ hoa nào. Khi cần so sánh lớn hơn hay nhỏ hơn ta có thể viết: If (A<=B) and ( A<>B) then writeln(‘A < B’).4.. Begin Write(‘ Nhập chuỗi St: ‘)..’Z’] then Taphoa := Taphoa+[ St[i] ]. Các ví dụ : Ví dụ 15. Readln.. For ch:=‘A’ to ‘Z’ do if ch IN Taphoa then write(ch:3). Writeln(‘ Cac chu hoa co trong St la :’). N. N:=length(St).5]>=[3.2: .

bao nhiêu số lẻ (các số trùng nhau chỉ kể 1 lần). i. Ví dụ. 4. Taple : Set of byte. N1:=N1+1.Nhập N số nguyên trong phạm vi từ 0 đến 255. Writeln( ‘ Co ‘. Taple:=Taple+[k]. ‘ số chẵn’). PROGRAM VIDU15_2. N2. Taple:=[]. k: byte. lẻ và cho biết có bao nhiêu số chẵn. 5 thì có hai số chẵn là 2 và 4 và có 3 số lẻ là 1. end. 3. Readln(k). If odd(k)=False then Tapchan:=Tapchan+[k] else end. 3. 4. i. N1. 1. 2. Var Tapchan. N1:=0. In ra các tập số chẵn. For i:=0 to (255 div 2) do if 2*i IN Tapchan then begin Write(2*i : 3). ‘: ‘). Const N=10. 2. writeln(‘ Các số chẵn là: ‘). For i:=1 to N do begin Write(‘Nhap so thu ‘. N1. 3. 5. nhập 9 số : 1. Begin Tapchan:=[]. .

11. Ví dụ: S=[2.5.3.13 ] Bước 4:-đưa 7 vào tập số nguyên tố. Tapsnt:=[2.15]. Xuất phát từ tập số nguyên S=[2.3. dưới đây giới thiệu phương pháp của Eratosthene.15 ] Bước 2:-đưa 3 vào tập số nguyên tố. End.13.N] ta loại ra số nguyên tố đầu tiên và tất cả các bội số của nó ra khỏi S. Tapsnt:=[2.7.3. ta được S=[3.11.7. N2. Có nhiều cách giải khác nhau. Bước 1:-đưa 2 vào tập số nguyên tố.3: Tìm các số nguyên tố ? số nguyên dương N cho trước.7] -loại 7 và các bội của 7 ra khỏi S.13 ] Bước 5:-đưa 11 vào tập số nguyên tố. end. ‘ số lẻ’). Tapsnt:=[2.9.5. Tapsnt:=[2. được S=[5. N2:=0. Readln.5..11] .5] -loại 5 và các bội của 5 ra khỏi S.11. sử dụng dữ liệu kiểu tập hợp và không cần đến các phép toán nhân. Ví dụ 15. Tapsnt:=[2] -loại 2 và các bội của 2 ra khỏi S. N2:=N2+1. được S=[11. được S=[7.7. writeln( ‘ Co ‘. For i:=0 to (255 div 2) do if (2*i +1) IN Taple then begin Write(2*i+1 : 3).3] -loại 3 và các bội của 3 ra khỏi S..Writeln(‘ Các số lẻ là: ‘).13 ] Bước 3:-đưa 5 vào tập số nguyên tố. lặp lại quá trình trên cho đến khi S thành tập rỗng.

{ Loại các bội của snt ra khỏi S } i:=snt. Const N=20.N. { dua vao Tapsnt } Write(snt:4).5.13] -loại 13 và các bội của 13 ra khỏi S. Chương trình cụ thể như sau: PROGRAM VIDU15_3.7. snt:=2. Tập S giống như một cái sàng để lọc và loại ra các số không phải số nguyên tố.7.3. S: Set of 1. { so nguyen to nho nhat } Writeln(‘ Cac so nguyen to la :’ ). Tapsnt:= Tapsnt+[snt].13]. While i<=N do begin S:=S .3.-loại 11 và các bội của 11 ra khỏi S. .N].[i].11. i: Integer.5. Begin S:=[2. snt.. Tapsnt:=[2. Tapsnt:=[]. Var Tapsnt. được S=[ ] Kết qủa được Tapsnt = [2. được S=[13 ] Bước 6:-đưa 13 vào tập số nguyên tố.11. Repeat { tim snt la so nho nhat trong S} While Not (snt IN S) do snt:=snt+1..

gọi là con trỏ tệp. Cách khai báo kiểu tập tin như sau: Type TênkiểuTtin = File of Kiểuphầntử . 15. End. Các dữ liệu này được tổ chức trong bộ nhớ của máy. gọi là vị trí hiện thời. Số phần tử của mảng được xác định ngay khi khai báo.. Dưới đây sẽ trình bày hai loại tập tin thường gặp là tập tin có định kiểu và tập tin văn bản. chúng tồn tại khi chương trình đang chạy và bị xóa khi chương trình kết thúc. Song tập tin khác mảng ở những điểm sau đây: Mảng được tổ chức trong bộ nhớ còn tập tin chủ yếu được tổ chức trên đĩa.2. Các phần tử của mảng được truy xuất thông qua chỉ số. lô gic. Tập tin có định kiểu: Tập tin mà các phần tử của nó có cùng một kiểu dữ liệu gọi là tập tin có định kiểu. Tại mỗi thời điểm. Khái niệm : Nhập và xuất dữ liệu là hai công việc rất phổ biến khi thực hiện một chương trình. Tập tin (file) trong Pascal là một kiểu dữ liệu có cấu trúc. Ví dụ: . Until S=[]. 15. end. Muốn lưu trữ các dữ liệu lâu dài để sử dụng nhiều lần thì phải ghi chúng lên đĩa thành các tập tin.. Khái niệm tập tin và mảng có những điểm rất gần nhau. Các tập tin được kết thúc bằng một dấu hiệu đặc biệt gọi là EOF ( End Of File).2. ký tự . ta mới chỉ nhập dữ liệu từ bàn phím và xuất dữ liệu ra màn hình. Kiểu dữ liệu của các phần tử của tập tin có thể là kiểu đơn giản ( nguyên. còn số phần tử của tập tin thì không.) hoặc kiểu có cấu trúc ( mảng. DỮ LIỆU KIỂU TẬP TIN 15. thực.1. Cho đến nay. Các phần tử của tập tin được truy xuất nhờ một biến trung gian chỉ điểm vào vị trí của chúng trên đĩa. con trỏ sẽ chỉ vào một vị trí nào đó trong tập tin.i:=i+snt.2. Readln.2. chuỗi ký tự. bản ghi). Mỗi tập tin là một tập hợp các phần tử có cùng chung một kiểu dữ liệu được nhóm lại thành một dãy và được ghi trên đĩa dưới một cái tên chung.

một loại biến đặc biệt. KieuT2 là tập tin có các phần tử là các chuỗi ký tự ( String[20] ). Theo khai báo trên thì KieuT1 là tập tin có các phần tử kiểu nguyên ( Integer ). ta có thể khai báo các biến tập tin : Var F1 : KieuT1. . xóa tập tin. F3 thông qua việc địng nghĩa các kiểu dữ liệu mới như trên. Mỗi biến này đại diện cho một tập tin mà thông qua các biến đó ta có thể thực hiện các thao tác trên tập tin như : tạo tập tin.Type Ksvien = Record Ten: String[20]. end. F3 : KieuT3. thực hay chuỗi. còn KieuT3 là tập tin có các phần tử là các bản ghi kiểu Ksvien. Namsinh : Integer. KieuT3 = File of Ksvien . F2 : KieuT2. F3 là các biến kiểu tập tin. F2. Ví dụ: có thể khai báo ba biến F1. KieuT1 = File of Integer. DTB : Real... F2. đóng. ghi dữ liệu vào tập tin và đọc dữ liệu từ tập tin. F3 nói trên theo cách sau : Type Ksvien = Record Ten: String[20]. F1. mở. Ngoài cách khai báo các biến F1. Pascal còn cho phép khai báo trực tiếp các biến tập tin như sau: Var TênbiếnTtin : File of Kiểuphầntử . không dùng để gán gía trị như các biến nguyên. KieuT2 = File of String[20]. F2. Khi đã có kiểu tập tin. .

DAT’). biến F1 đồng nhất với tập tin DLIEU. biểu thức kiểu chuỗi là tên thực sự của . F3 : File of Ksvien .DAT’). khi đó lệnh : Write(F1. Ví dụ : Assign(F1.. bN. Ví dụ : Reset ( F3). nếu tập tin đã có trên đĩa thì nó xóa đi và tạo mới. i. DTB : Real.. têntậptin) : Gán tên tập tin cho biến tập tin.DAT 3) Thủ tục RESET(biếntậptin): Mở tập tin đã có để sử dụng. k ) . F2 : File of String[20]. Tương tự.. mọi thao tác trên biến F1 chính là thao tác trên tập tin DLIEU. 15. j. Var F1 : File of Integer.. k là các biến kiểu Integer và i=10. Các thủ tục chuẩn: 1) Thủ tục ASSIGN( biếntậptin. Ví dụ : Rewrite(F1) . .DAT 4) Thủ tục WRITE( biếntậptin.DAT. .. b2. Ở đây tên tập tin là một tập tin.DAT.DAT 2) Thủ tục REWRITE( biếntậptin) : Khởi tạo tập tin mới.1...2. khởi tạo tập tin QLSV. Sau hai lệnh này.Cho i. b2. bN phải cùng kiểu dữ liệu với các phần tử của tập tin.. ‘DLIEU. b1. bN): Tuần tự ghi vào tập tin các gía trị của các biến b1. Con trỏ tập tin trỏ vào phần tử đầu tiên (có số thứ tự là 0) của tập tin . j. Các biến b1.DAT Rewrite(F3) . end.2. Ví dụ: . j=20. . Assign(F3.Namsinh : Integer. biến F3 đồng nhất với tập tin QLSV. khởi tạo tập tin DLIEU. mở tập tin QLSV.. k=100. ‘QLSV.

DAT ( kể từ vị trí hiện thời) và gán cho các biến nguyên i. con trỏ tập tin tự động dời đến vị trí của phần tử tiếp theo.sẽ ghi lần lượt các gía trị 10.. Thủ tục này cho phép truy xuất trực tiếp một phần tử của tập tin mà không phải thực hiện tuần tự từ đầu tập tin. X.5. Write(F3. bN. đọc hai số nguyên trong tập tin DLIEU. . 20..Namsinh :=1980 .. . 6) Thủ tục CLOSE( biếntậptin) : Ðóng tập tin . 100 vào tập tin DLIEU. 5) Thủ tục READ( biếntậptin.DAT: X.. j .. i. 10). Ví dụ: Lệnh Read(F1. Mỗi khi đọc xong một phần tử. con trỏ tập tin tự động dời đến phần tử tiếp theo. b2.DAT và gán cho biến bản ghi X. X). X. Lệnh Read(F3..Ten:=’Ng Van An’. Read(F1. Sau khi ghi X vào tập tin QLSV. b2. Kiểu dữ liệu của các biến b1. Write(i).DAT. Các lệnh sau gán gía trị cho X và ghi X vào tập tin QLSV. bN phải cùng kiểu với các phần tử của tập tin. đọc bản ghi hiện thời của tập tin QLSV. . 8) Thủ tục ERASE( biếntậptin) : Xóa tập tin trên đĩa ... j).DAT và gán cho biến nguyên i rồi in gía trị của i: Seek(F1. b2. X).DAT -Cho khai báo: Var X : Ksvien.. b1. i). 7) Thủ tục SEEK( biếntậptin.DTB :=6. Ví dụ: đọc phần tử thứ 10 của tập tin DLIEU. bN) : Ðọc tuần tự các phần tử của tập tin từ vị trí hiện thời của con trỏ tập tin và gán cho các biến b1. k ) : Ðặt con trỏ tập tin vào phần tử thứ k trong tập tin.

PROGRAM VIDU15_4. Dtb : Real. Trong chương trình . tênmới ) : Ðổi tên tập tin . 15. 2) Hàm FILESIZE(biếntậptin) : Cho số phần tử của tập tin.4: Nhập một danh sách sinh viên gồm Họ tên. Var . Ví dụ : Ghi số 100 vào cuối tập tin DLIEU. điểm Toán. Lý. Các hàm chuẩn: 1) Hàm EOF(biếntậptin): Cho kết qủa True khi con trỏ tập tin đang ở cuối tệp. Yêu cầu là tập tin phải đang đóng thì mới xóa hay đổi tên được. { Ghi gía trị của i vào cuối tệp} Ví dụ 15. Phần tử cuối cùng có số thứ tự bằng FileSize -1. tính điểm trung bình rồi lưu vào tập tin HOSO. FileSize(F1) ) . Uses CRT. 3) Hàm FILEPOS(biếntậptin) : Cho vị trí hiện thời của con trỏ tập tin.2.2. chỗ nào có dấu ~ thì thay bằng một ký tự trắng.DAT’.2. trong các trường hợp khác hàm cho gía trị False. end. Const Tenttin = ‘HOSO. Type Ksvien= Record Hoten: String[20].DAT. KieuTtin = File of Ksvien .DAT. Nếu tập tin rỗng thì số phần tử bằng 0. {Ðặt trỏ vào cuối tập tin} Write(F1. Seek( F1. Toan. i). dùng các lệnh: i:=100. Phần tử đầu tiên có số thứ tự là 0. Ly. Sau đó đọc dữ liệu tập tin này và in ra màn hình.9) Thủ tục RENAME( biếntậptin.

Hoten). end. Rewrite(F). TenTtin). X.DTb:4:1). Write( ‘NHẬP SINH VIÊN THỨ?‘. Gotoxy(10. X : Ksvien . i:=0. {Hết hiển thị} BEGIN Clrscr. ‘ÐTOÁN~~~ÐLÝ~~~~DTB’). ‘HỌ VÀ TÊN’.F : KieuTtin . end. X. With X do begin . Reset(F). i . X. Assign(F. #32:3. Repeat Clrscr.#32:3. #32:20-Length(X. Procedure Hienthi ( Var F : KieuTtin). begin Clrscr. i: Integer. While Not Eof(F) do begin Read(F. Writeln(X.Ly:4:1. X).Toan:4:1. #32:6 . ‘: ( Enter để kết thúc) ‘ ).Hoten.4). Writeln(#32 :5.

Hienthi(F). Tập tin văn bản: Trong Pascal có một kiểu tập tin đã được định nghĩa sẵn. If Hoten<>’’ then begin Gotoxy(20. Gotoxy(10.8). Chú ý : Nếu tham số trong chương trình con là tập tin thì nó phải là tham số biến.X). end.2. If X. Readln(Hoten). Readln(Ly). END. Readln(Toan). i:=i+1. Write(‘Ho va ten:’). 15.8).10).6).Gotoxy(10.6). Ðể khai báo F là biến tập tin văn bản ta viết : Var F: Text. đó là kiểu TEXT hay tập tin văn bản. Close(F). Write(‘Ðiem Ly :’). Gotoxy(10. Gotoxy(20. .Hoten<>’’ then Write(F. Readln. không thể là tham số trị.3. Close(F).Hoten=’’. Gotoxy(20. end. Until X. Write(‘Ðiem Toan:’). DTB:=(Toan+Ly)/2.10).

. . bt1. Reset. trước tiên phải khởi tạo tập tin bằng lệnh Rewrite hay mở tập tin và đưa trỏ về cuối tệp bằng lệnh Append. đoạn văn bản sau : Tap tin van ban Text 12345 Het được chứa trong tập tin văn bản thành một dãy : Tap tin van ban Text CR LF 12345 CR LF Het Eof Các thủ tục Assign. Rename đều dùng được cho tập tin văn bản... lôgic) hay kiểu chuỗi.Các phần tử của tập tin văn bản là các ký tự được ghi thành từng dòng có độ dài khác nhau. 4. Var F: Text. Sau đó ghi dữ liệu vào tập tin bằng thủ tục Write hay Writeln. Nếu mở tập tin bằng Reset thì không thể ghi được bằng Write hay Writeln. btN vào tập tin văn bản. trước tiên ta phải mở tập tin bằng lệnh Reset. 3. Read. . ký tự. bt2.TXT : Program VIDU. btN phải thuộc kiểu đơn giản chuẩn ( nguyên. Erase..50 Chương trình dưới đây sẽ tạo tập tin văn bản T1. Close. Ðó là hai ký tự điều khiển CR ( Carriage return : nhảy về đầu dòng) và LF ( Line feed: xuống dòng dưới). Ðể ghi dữ liệu. Ngoài ra còn có thêm thủ tục Append(biếntậptin) dùng để mở tập tin văn bản và cho phép ghi thêm dữ liệu vào cuối tập tin. thực. và chúng không cần phải có kiểu giống nhau. Sau đó đọc dữ liệu bằng thủ tục Read hay Readln. Write. Nếu mở tập tin bằng Rewrite hoặc Append thì không thể đọc được bằng Read và Readln. ‘a’:2. Ghi dữ liệu vào tập tin văn bản : Thủ tục WRITE( biếntậptin. bt2. không thể đồng thời vừa ghi vừa đọc dữ liệu như tập tin có định kiểu.. . Ví dụ . Ðối với tập tin văn bản. Rewrite. btN) : cho phép tuần tự ghi các gía trị của các biểu thức bt1. ‘Text’.5:6:2). Ví dụ : Write(F. 10:4. bt2. sẽ ghi vào tập tin thành dãy như sau ( Dấu ~ hiểu là một ký tự trắng): 3~~10~aText~~4. Các biểu thức bt1. . Ðể đọc dữ liệu một tập tin đã có. Các dòng được phân cách nhờ các dấu kết thúc dòng ( End of line).

biến1.A : Integer.45 thì để đọc lại các dữ liệu này. . B:7:2). Nội dung của các tập tin văn bản tạo bằng Pascal hoàn toàn có thể xem được bằng lệnh Type của MSDOS. B:=1234. cách ghi dữ liệu vào tập tin văn bản hoàn toàn giống như khi in dữ liệu lên màn hình.. Nội dung của tập tin T1. biếnN phải có kiểu dữ liệu phù hợp vơí dữ liệu cần đọc tại vị trí tương ứng trong tập tin... Close(F). Ví dụ: Nếu tập tin T1. biến2. Thủ tục WRITELN cũng có công dụng như WRITE. biếnN) đọc tuần tự các gía trị từ tập tin và gán cho các biến. Các biến1. Rewrite(F).5.45 Như vậy.. ‘Ket qua=’ :10. Ðọc dữ liệu của tập tin văn bản : Thủ tục READ( biếntậptin.. chỉ đưa con trỏ tập tin xuống dòng. End. Ðặc biệt. Write(F.. Z : Real. ta phải khai báo: Var St :String[10]. biến2. Begin A:=100. A:5.TXT là : ~~Ket qua=~~100~123.TXT có nội dung như sau: ~~Ket qua=~~100~123. B : Real. lệnh Writeln(F). . Và dùng các lệnh: .. bằng Norton hay bằng chính Turbo Pascal. Assign(F. i: Integer . ’T1.TXT’). nhưng ghi xong dữ liệu thì đưa con trỏ tập tin xuống dòng dưới. không ghi gì cả. ..

i. lệnh READLN( biếntậptin). Lệnh Readln(Input. Thủ tục READLN(biếntậptin. . x). Lệnh Writeln(Output. btN). Output : Text ... và dùng lệnh : Write(LST. Ðể in các biểu thức bt1. không đọc gì cả. i=100. Chú ý Hàm Eof(F) cũng dùng được cho tập tin văn bản. sửa trực tiếp một cách dễ dàng bằng các hệ soạn thảo văn bản đơn giản. Khi Eof(F)=True thì Eoln(F) cũng có gía trị là True. được ngầm khai báo với tên là LST. . bt2. i. ta phải khai báo sử dụng thư viện chuẩn PRINTER. Z sẽ là: St=’~~Ket qua=’. btN ra máy in. Input thường là bàn phím còn Output thường là màn hình. như NC hay chính Turbo Pascal. biến1.Reset(F). Z).. x). Gía trị của St.. Ðặc biệt. máy sẽ đọc tiếp gía trị =~~100 cho biến nguyên i. biếnN ) đọc dữ liệu cho các biế? xong sẽ đưa trỏ tập tin xuống đầu dòng dưới. Read(F. chỉ đưa con trỏ tập tin xuống dòng. được viết tắt thành Writeln(x). Z=123. . So sánh tập tin văn bản với tập tin định kiểu: Các tập tin có định kiểu cho phép vừa đọc vừa ghi và truy nhập trực tiếp vào từng phần tử gần giống như thao tác với mảng. St.. nhưng vì gía trị này bắt đầu là dấu = nên không đổi ra số nguyên được..45.. ghi và chỉ có thể đọc hoặc ghi tuần tự. FilePos không dùng cho tập tin văn bản. Nếu khai báo St có kiểu String[9] thì sẽ bị lỗi vì sau khi đọc xong 9 ký tự đầu. Thủ tục Seek và các hàm FileSize. . bt2. . tức là máy đã ngầm khai báo : Var Input . bt1.. Các tập tin văn bản ngầm định: Trong Pascal có hai biến tập tin văn bản đã được khai báo sẵn là Input và Output . được viết tắt thành Readln( x) . biến2. nhưng cho phép ta có thể xem. ngoài ra còn có hàm EOLN(F) cho kết qủa là True hoặc False tùy theo con trỏ tập tin có đang ở cuối dòng hay không. Máy in cũng là một tập tin văn bản. Các tập tin văn bản không cho phép đồng thời đọc.

Số dòng và số cột của ma trận A được ghi ở hai dòng đầu tiên trong tập tin T2.j : Byte. F : Text. .1.Ví dụ 15. { vi du ve File Van ban } uses crt. Begin Assign(F. N. Type MANG = array[1. st: string[5]..TXT. Var i.20. M : integer.TXT'). Program VIDU15_5. Procedure Nhap. 'T2.5: Cho tập tin văn bản tên là T2.20] of integer ..TXT và có nội dung là: dong=6 cot =7 0 8 8 -2 6 11 1 8020702 8 2 0 11 12 9 3 -2 0 11 0 -7 9 4 6 7 12 -7 0 6 5 11 0 9 9 6 0 6 Hãy đọc tập tin này đưa vào một ma trận A và in ma trận A lên màn hình. Var A : MANG.

j]:4). j : Integer. A[i. Readln(F). Close(F). N). For i:=1 to N do begin For j:=1 to M do Read(F. Readln(F. Procedure InMatran. St. Nhap. Readln. end. BEGIN Clrscr. End.j]). InMatran. Begin For i:=1 to N do begin for j:=1 to M do write( A[i. END.Reset(F). end. St. End. M). writeln. . Var i. Readln(F.

.300 .. d) Type T = Set of 0.12] là tập hợp nào: a) [4.15.. b) Var T : Set of -10...10..10. CÂU HỎI TRẮC NGHIỆM Câu 1: Khai báo nào đúng : a) Type T = Set of Real... 20] là tập hợp nào: a) [1.5] Câu 4: Hiệu của hai tập hợp [10.12] Câu 5: Cho khai báo: Var T : Set of Char . 20] b) [1. c) Var T : Set of ‘A’.5] c) [1....10] d) [10.. b) Type T = Set of Integer.’z’ ... Câu 3: Tổng của [1. Câu 2: Khai báo nào sai : a) Var T : Set of Char .15]-[4.5] + [3.9 .15] b) [13.3.. . c) Type T = Set of String .20] d) [3.15] c) [4. d) Var T : Set of Boolean .

Rewrite(F). Rewrite(F). ch : Char.ch : Char . Rewrite( F. ch). i. Write(F. Chọn câu có các lệnh đều đúng : a) Assign( F. k :Integer . Sau khi thực hiện các lệnh: T:=[‘A’. ‘T1. Rewrite(F). .’D’] b) [‘A’. k ).. For ch:=’A’ to ‘F’ do Write(F. j .DAT ). ch).. Write(F. i . ‘tt. i.DAT’ ).DAT’ ). Write(F. Begin Assign(F.’F’] Câu 6: Cho khai báo : Var F: File of Integer .’Z’] c) [‘A’. 4). ‘T1. b) Assign(F.. Write(ch). For ch:=’A’ to ‘F’ do T:=T+[ch] . Tập T sẽ là: a) [‘A’. c) Assign(F). Rewrite(F). ‘Z’]. k ).. Close(F). Seek(F.’F’] d) [‘C’. i. j. d) Assign(F. ‘D’] * [‘A’. j. Read(F. j. Câu 7: Khi chạy chương trình : Var F : File of Char. ‘T1.DAT’ ).txt’). T1.. k ). Write(F. i+ j+ k )..

txt’). Write(F. Kết quả in ra là: a) E b) F c) C d) D Câu 8: Cho khai báo: Var F : TEXT . d) Write( FilePos(F1) ) .TXT là tập tin văn bản có nội dung là : Turbo Pascal 6.End. ‘tt1. 0). 0).0 Khi chạy chương trình : . Sau khi thực hiện các lệnh: Assign(F. Rewrite(F). Close(F). 123+456).txt sẽ là: a) 123+456 b) 123456 c) 579 d) 123 456 Câu 9: Cho F1 là biến tập tin có định kiểu và F2 là biến tập tin văn bản. b) Seek(F2. Câu 10: Cho TT2. Nội dung của tập tin tt1. c) Write( Filesize(F1) ) . Lệnh nào không dùng được : a) Seek( F1.

End. 4. Ví dụ : cho mảng 1. 6. 6. ngược lại là thua. Reset(F).Var F : Text. ‘tt2.0 b) Turbo c) Pascal 6. Nếu thuộc thì người chơi thắng.1. 4. S2.. sẽ in ra chữ : a) Turbo Pascal 6. Close(F). BÀI TẬP Câu 1) Nhập một chuỗi St. in ra: 0. St).1. . . Read(F. 9 ( Hướng dẫn : xây dựng tập hợp gồm các phần tử của mảng A) Câu 3) Viết chương trình thực hiện trò chơi sau: Người chơi nhập một số k trong phạm vi từ 1 đến 9 Tạo một tập S gồm ba số ngẫu nhiên trong phạm vi từ 1 đến 9 Kiểm tra xem k có thuộc tập S không?. St : String[20].. 9.txt’). 6. A2. 9 .4. A10 các số nguyên dương < 10. Begin Assign(F. 3. Hãy in các gía trị của mảng này theo thứ tự tăng dần sao cho các phần tử trùng nhau chỉ được in một lần. Write(St). S3 trên một dòng.0 d) Turbo Pascal 15. In k và tập S lên màn hình.. 0. xây dựng ba tập hợp: S1 là tập các chữ hoa có trong St S2 là tập các chữ thường có trong St S3 là tập các chữ số có trong St In các gía trị của mỗi tập S1. Câu 2) Nhập vào một mảng A1. 6. 3.

. các điểm Toán. Hãy nhập một danh sách sinh viên gồm Họ tên.DAT có bao nhiêu số chẵn. mau : Integer. lưu vào tập tin QLY. Chép danh sách sinh viên vào tập QLY.DAT và in danh sách lên màn hình. điểm Toán và điểm Lý. Ðọc bốn phân số đó từ tập tin và in lên màn hình. Quá trình nhập kết thúc khi nhập Họ tên là rỗng ( tức không nhập gì cả. tạo một tập tin chứa hai phân số đó và hai phân số là tổng.DAT. hiệu của chúng. end.IDX sao cho các phần tử của QLY. Toan. cứ Enter).. Câu 4) Mỗi phân số được mô tả như sau : Type Phanso = Record tu. rồi tính Ðiểm trung bình: Dtb:=(Toán+Lý)/2. Câu 6) Ðể quản lý Họ tên . Ðọc danh sách sinh viên từ tập tin QLY.DAT.Hướng dẫn: Trong thư viện CRT có hàm Random(n) trả về một số ngẫu nhiên j thuộc phạm vi: 0 ? j<n.5 8. Nhập hai phân số từ bàn phím. Ðếm trong tập tin DL. AN .0 L . A2.IDX và ghi vào tập tin văn bản tên là QLY.. Ðọc các số lẻ từ tập DL. . Ðọc dữ liệu của tập tin QLY. Lý và Ðiểm trung bình của sinh viên. Ghi dãy số đó vào tập tin DL.DAT và in lên màn hình. ta mô tả kiểu Ksvien như sau : Type Ksvien= Record Hoten: String[20]. Câu 5) Nhập số nguyên dương N (0<N< 20 ) và một dãy N số nguyên : A1.IDX được sắp xếp theo trật tự giảm của điểm trung bình.TXT theo dạng : STT 1 2 L Họ và tên Nguyen Van Tuan Pham Thi Mai L Ðiểm trung bình 8. Ly. end. Dtb : Real.

DAT để tính ma trận C=A+B.DAT và in lên màn hình. Lấy dữ liệu từ tập tin MT.DAT.DAT chứa hai ma trận vuông cấp 3 là A và B có các phần tử là các số nguyên. B. C từ tập tin MT.Câu 7) Dùng hệ soạn thảo của Turbo Pascal để tạo một tập tin văn bản có tên là MT. Ghi ma trận C vào cuối tập tin MT. . Ðọc các ma trận A.

Sign up to vote on this title
UsefulNot useful