Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 114 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
114
Dung lượng
260,22 KB
Nội dung
NGƠNNGỮLẬPTRÌNHNgơnngữlậptrình Mục lục CHƯƠNG 0: TỔNG QUAN i MỤC ĐÍCH YÊU CẦU i ĐỐI TƯỢNG SỬ DỤNG i NỘI DUNG CỐT LÕI i KIẾN THỨC TIÊN QUYẾT ii DANH MỤC TÀI LIỆU THAM KHẢO ii CHƯƠNG 1: MỞ ĐẦU TỔNG QUAN KHÁI NIỆM VỀ NGÔNNGỮLẬPTRÌNH VAI TRỊ CỦA NGƠNNGỮLẬPTRÌNH .2 LỢI ÍCH CỦA VIỆC NGHIÊN CỨU NNLT CÁC TIÊU CHUẨN ÐÁNH GIÁ MỘT NGÔNNGỮLẬPTRÌNH TỐT CÂU HỎI ƠN TẬP .7 CHƯƠNG 2: KIỂU DỮ LIỆU TỔNG QUAN ÐỐI TƯỢNG DỮ LIỆU BIẾN VÀ HẰNG 10 KIỂU DỮ LIỆU .10 SỰ KHAI BÁO .13 KIỂM TRA KIỂU VÀ BIẾN ÐỔI KIỂU 14 CHUYỂN ÐỔI KIỂU 17 GÁN VÀ KHỞI TẠO 17 CÂU HỎI ÔN TẬP .20 CHƯƠNG 3: KIỂU DỮ LIỆU SƠ CẤP 22 TỔNG QUAN 22 ÐỊNH NGHĨA KIỂU DỮ LIỆU SƠ CẤP .22 SỰ ÐẶC TẢ CÁC KIỂU DỮ LIỆU SƠ CẤP 22 CÀI ÐẶT CÁC KIỂU DỮ LIỆU SƠ CẤP 23 KIỂU DỮ LIỆU SỐ 24 KIỂU LIỆT KÊ 27 KIỂU LOGIC 28 KIỂU KÝ TỰ 29 CÂU HỎI ÔN TẬP .29 CHƯƠNG 4: KIỂU DỮ LIỆU CÓ CẤU TRÚC 30 TỔNG QUAN 30 ÐỊNH NGHĨA KIỂU DỮ LIỆU CÓ CẤU TRÚC 30 SỰ ÐẶC TẢ KIỂU CẤU TRÚC DỮ LIỆU 30 SỰ CÀI ÐẶT CÁC CẤU TRÚC DỮ LIỆU 32 VÉCTƠ 34 MẢNG NHIỀU CHIỀU 36 MẨU TIN 39 MẨU TIN CÓ CẤU TRÚC THAY ÐỔI .41 CHUỖI KÝ TỰ .45 CẤU TRÚC DỮ LIỆU CĨ KÍCH THƯỚC THAY ÐỔI 47 CON TRỎ 48 TẬP HỢP .50 TẬP TIN 52 CÂU HỎI ÔN TẬP .54 CHƯƠNG 5: KIỂU DO NGƯỜI DÙNG ÐỊNH NGHĨA 58 TỔNG QUAN 58 SỰ PHÁT TRIỂN CỦA KHÁI NIỆM KIỂU DỮ LIỆU .58 Ngơnngữlập Mục trình TRỪU TƯỢNG HÓA 58 lục ÐỊNH NGHĨA KIỂU .60 CÂU HỎI ÔN TẬP .62 CHƯƠNG 6: CHƯƠNG TRÌNH CON .63 TỔNG QUAN 63 ÐỊNH NGHĨA CHƯƠNG TRÌNH CON .63 CƠ CHẾ GỌI CHƯƠNG TRÌNH CON 65 CHƯƠNG TRÌNH CON CHUNG 68 TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON .68 CÂU HỎI ÔN TẬP 70 CHƯƠNG 7: ÐIỀU KHIỂN TUẦN TỰ 71 TỔNG QUAN 71 KHÁI NIỆM ÐIỀU KHIỂN TUẦN TỰ .71 ÐIỀU KHIỂN TUẦN TỰ TRONG BIỂU THỨC 71 ÐIỀU KHIỂN TUẦN TỰ GIỮA CÁC LỆNH 75 SỰ NGOẠI LỆ VÀ XỬ LÝ NGOẠI LỆ 78 CÂU HỎI ÔN TẬP .80 CHƯƠNG 8: LẬPTRÌNH HÀM .81 TỔNG QUAN 81 NGƠNNGỮLẬPTRÌNH HÀM 81 NGÔNNGỮ LISP 83 CHƯƠNG 9: LẬPTRÌNH LOGIC 95 TỔNG QUAN 95 GIỚI THIỆU VỀ LẬPTRÌNH LOGIC 95 NGÔNNGỮ PROLOG 96 Ngơnngữlậptrình Tổng quan TỔNG QUAN MỤC ĐÍCH U CẦU Mục đích mơn học Ngơnngữlậptrình cung cấp cho sinh viên khối lượng kiến thức tương đối hoàn chỉnh nguyên lí ngơnngữlậptrình Cùng với mơn học Tin học lí thuyết, Ngơnngữlậptrình mơn học tiên để học mơn Trình biên dịch Sau học xong môn học này, sinh viên cần: - Nắm khái niệm đối tượng liệu kiểu liệu Các khía cạnh cần nghiên cứu đặc tả cài đặt kiểu liệu Vấn đề kiểm tra kiểu chuyển đổi kiểu cần quan tâm - Nắm kiểu liệu sơ cấp có cấu trúc Với kiểu liệu cần nắm định nghĩa, đặc tả cách cài đặt kiểu liệu - Nắm khái niệm trừu tượng hố lậptrình thể hai khía cạnh trừu tượng hố liệu cách sử dụng kiểu liệu tự định nghĩa trừu tượng hố chương trình cách chia chương trình thành chương trình Vấn đề truyền tham số cho chương trình cần lưu tâm - Nắm khái niệm điều khiển tuần tự, nguyên tắc điều khiển biểu thức câu lệnh ĐỐI TƯỢNG SỬ DỤNG Môn học ngônngữlậptrình dùng để giảng dạy cho sinh viên năm thứ chuyên ngành Tin học NỘI DUNG CỐT LÕI Trong khn khổ 45 tiết, giáo trình cấu trúc thành chương Chương 1: Mở đầu Chương trình bày khái niệm ngơnngữlập trình, lợi ích việc nghiên cứu ngơnngữlậptrình tiêu chuẩn để đánh giá ngơnngữlậptrình tốt Chương 2: Kiểu liệu Chương trình bày khái niệm đối tượng liệu kiểu liệu; phương pháp kiểm tra kiểu chuyển đổi kiểu; Phép gán trị cho biến khởi tạo biến Chương 3: Kiểu liệu sơ cấp Chương trình bày khái niệm kiểu liệu sơ cấp, đặc tả nguyên tắc cài đặt kiểu liệu sơ cấp nói chung Phần chủ yếu chương trình bày số kiểu liệu sơ cấp phổ biến kiểu số, kiểu miền con, kiểu liệt kê, kiểu kí tự kiểu logic Chương 4: Kiểu liệu có cấu trúc Chương trình bày khái niệm kiểu liệu có cấu trúc, đặc tả thuộc tính, đặc tả phép toán, đặc biệt phép toán lựa chọn phần tử; phương pháp lưu trữ cấu trúc liệu nhớ phương pháp lựa chọn phần tử Nội dung chủ yếu chương trình bày cấu trúc cụ thể mảng, mẩu tin, chuỗi ký tự, tập hợp… Chương 5: Kiểu liệu tự định nghĩa Chương trình bày trừu tượng hoá, định nghĩa kiểu liệu tương đương kiểu liệu định nghã i v Chương 6: Chương trình Chương trìn bày định nghĩa chế gọi thực chương trình con, phương pháp truyền tham số cho chương trình Chương 7: Điều khiển Chương trình bày loại điều khiển vấn đề xử lý ngoại lệ Chương 8: Lậptrình hàm Chương trình bày khái niệm, chất lậptrình hàm giới thiệu ngơnngữlậptrình hàm điển hình LISP Chương 9: Lậptrình logic Chương trình bày khái niệm, chất lậptrình logic giới thiệu ngơnngữlậptrình hàm điển hình PROLOG KIẾN THỨC TIÊN QUYẾT Để học tốt mơn học ngơnngữlậptrình cần phải có kiến thức kĩ lậptrình DANH MỤC TÀI LIỆU THAM KHẢO [1] Terrence W Pratt, Marvin V Zelkowitz; Programming Languages: Design and Implementation; Prentice-Hall, 2000 [2] Doris Appleby, Julius J VandeKopple; Programming Languages; McGraw- Hill; 1997 [3] Ryan Stensifer; The Study of Programming Languages; Prentice Hall, 1995 [4] Maryse CONDILLAC; Prolog fondements et applications; BORDAS, Paris 1986 [5] Website XLISP http://webmaker.web.cern.ch/WebMaker/examples/xlisp/www/cldoc_1.html [6] Website Turbo Prolog http://www.csupomona.edu/ %7Ejrfisher/www/prolog_tutorial/contents.html Ngơnngữlậptrình Chương I: Mở đầu CHƯƠNG 1: MỞ ĐẦU TỔNG QUAN Mục tiêu Sau học xong chương này, sinh viên cần phải nắm: - Khái niệm phân loại ngơnngữlậptrình - Vai trò ngơnngữlậptrình cơng nghệ phần mềm - Lợi ích việc nghiên cứu ngơnngữlậptrình - Các tiêu chuẩn để đánh giá ngơnngữlậptrình Nội dung cốt lõi - Khái niệm ngônngữlậptrình - Vai trò ngơnngữlậptrình - Lợi ích việc nghiên cứu ngơnngữlậptrình - Các tiêu chuẩn để đánh giá ngônngữlậptrình tốt Kiến thức cần thiết Kiến thức kĩ lậptrình KHÁI NIỆM VỀ NGƠNNGỮLẬPTRÌNH Như biết, máy tính bao gồm phần cứng thiết bị điện tử thơng tin biểu diễn dạng số nhị phân phần mềm bao gồm chương trình tạo cách sử dụng ngơnngữlậptrình Như ngơnngữlậptrình (NNLT) ngơnngữ dùng để viết chương trình cho máy tính Cũng ngơnngữ thơng thường, NNLT có từ vựng, cú pháp ngữ nghĩa Theo tiến trình lịch sử phát triển, ngơnngữlậptrình chia làm ba loại chủ yếu sau: Ngônngữ máy (machine language): Là thị dạng nhị phân, can thiệp trực tiếp vào mạch điện tử Chương trình viết ngơnngữ máy thực không cần qua bước trung gian Tuy nhiên chương trình viết ngơnngữ máy dễ sai sót, cồng kềnh khó đọc, khó hiểu tồn số Hợp ngữ (assembly language): Hợp ngữ bước tiến vượt bậc đưa ngônngữlậptrình khỏi ngơnngữ máy khó hiểu Ngơnngữ xuất vào năm 1950, thiết kế để máy tính trở nên thân thiện với người sử dụng Hợp ngữ đưa khái niệm biến (variable), nhờ mà ta gán ký hiệu cho vị trí nhớ mà viết lại địa dạng nhị phân lần sử dụng Hợp ngữ chứa vài "phép tốn giả", tức ta biểu biễn mã phép toán dạng phát biểu (hay gọi câu lệnh) thay dạng nhị phân Các câu lệnh bao gồm hai phần: phần mã lệnh (viết tựa tiếng Anh) phép toán cần thực phần tên biến địa chứa tốn hạng phép tốn Ðể máy thực chương trình viết hợp ngữ chương trình phải dịch sang ngơnngữ máy Cơng cụ thực việc dịch gọi Assembler Ngônngữ cấp cao (High level language): Là ngônngữ tạo phát triển nhằm phản ánh cách thức người lậptrình nghĩ làm Ngơnngữ cấp cao gần với ngônngữ người (Anh ngữ) xác ngơnngữ tốn học Nhờ ngơnngữ cấp cao mà lĩnh vực lậptrình trở nên phổ biến, nhiều người viết chương trình, nhờ mà phần mềm phát triển vũ bão, phục vụ nhiều lĩnh vực sống Cùng với phát triển hệ máy tính, ngơnngữlậptrình cấp cao phát triển đa dạng phong phú, việc lậptrình cho máy tính mà có nhiều khuynh hướng khác nhau: lậptrình cấu trúc, lậptrình hướng đối tượng, lậptrình logic, lậptrình hàm Một chương trình viết ngơnngữ cấp cao gọi chương trình nguồn (source programs) Ðể máy tính "hiểu" thực lệnh chương trình nguồn phải có chương trình dịch để dịch chương trình nguồn (viết ngơnngữ cấp cao) thành chương trình đích Trong khn khổ tài liệu này, thuật ngữngơnngữlậptrình dùng để ngơnngữlậptrình cấp cao VAI TRỊ CỦA NGƠNNGỮLẬPTRÌNH Ðể thấy rõ vai trò ngơnngữlậptrình cơng nghệ phần mềm xét giai đoạn chủ yếu để xây dựng phần mềm Các giai đoạn bao gồm: - Xác định: Mục tiêu giai đọan xác định để hiểu rõ yêu cầu khách hàng Kết giai đọan mơ hình giới thực phản ánh thông qua tài liệu đặc tả yêu cầu - Phân tích: Mục tiêu giai đoạn xác định xác hệ thống làm theo quan điểm người sử dụng Kết giai đoạn phân tích tài liệu đặc tả chức mơ tả hệ thống có chức - Thiết kế: Mục tiêu giai đọan thiết kế xác định xác hệ thống làm việc Kết giai đọan tài liệu đặc tả thiết kế Ðây tài liệu kỹ thuật mà người thực vào mà tạo phần mềm - Cài đặt: Là việc thực cách giải vấn đề đề xuất người thiết kế NNLT Kết giai đọan hệ chương trình máy tính - Tích hợp kiểm thử hệ thống: Do chuyên viên tin học thực nhằm ghép nối phận hệ thống kiểm tra xem hệ thống có thực theo thiết kế khơng - Chấp nhận: Do chuyên viên tin học với khách hàng tiến hành nhằm xác nhận hệ thống chương trình bảo đảm yêu cầu người sử dụng - Vận hành khai thác: Hệ thống triển khai để sử dụng Ở trình bày mơ hình làm phần mềm, gọi mơ hình thác nước (water fall), ngồi có nhiều mơ hình khác Tuy nhiên tất mơ hình phải có giai đoạn cài đặt Trong NNLT đóng vai trò cơng cụ giúp người thực bước cài đặt Cơng cụ ngày cải tiến hồn thiện nói tiến tin học thể NNLT NNLT vừa công cụ giúp nhà tin học giải vấn đề thực tế đồng thời nơi mà nghiên cứu tin học đưa vào Lĩnh vực vừa mang tính truyền thống vừa mang tính đại LỢI ÍCH CỦA VIỆC NGHIÊN CỨU NNLT Trước nghiên cứu NNLT, cần thảo luận xem sinh viên tin học nhà lậptrình chuyên nghiệp cần phải nắm khái niệm tổng quát NNLT Việc nghiên cứu tốt NNLT đạt lợi ích sau: Cho phép lựa chọn NNLT phù hợp với dự án thực tế Hiện có nhiều dự án cơng nghệ thơng tin ứng dụng vào nhiều lĩnh vực khác sống Do tính chất dự án mà phần mềm cài đặt NNLT khác Với vốn kiến thức rộng NNLT, người làm dự án lựa chọn nhanh chóng NNLT phù hợp với đề án thực tế Chẳng hạn lựa chọn ngơnngữlậptrình Java cho dự án lậptrình truyền thơng, hay hướng lậptrình logic cho dự án trí tuệ nhân tạo Sử dụng cách có hiệu cơng cụ ngơnngữ Các ngơnngữ nói chung cung cấp công cụ đặc biệt để tạo tiện ích cho lậptrình viên, sử dụng chúng khơng đắn gây sai lầm lớn Một ví dụ điển hình phép đệ quy (recursion) - công cụ lậptrình đặc biệt có hiệu lực nhiều ngơnngữ Khi sử dụng đệ quy cách đắn cài đặt giải thuật đẹp đẽ có hiệu Nhưng trường hợp khác gây lãng phí thời gian chạy máy lớn cho giải thuật đơn giản Ðiều tránh lậptrình viên có hiểu biết sâu sắc ngơnngữlậptrình cài đặt bên Làm tăng vốn kinh nghiệm xây dựng chương trình Nếu người lậptrình có nghiên cứu cách rộng rãi nhiều ngônngữ mà chúng có cài đặt sẵn cơng cụ tự thiết lập cơng cụ tương tự phải viết chương trìnhngơnngữ mà cơng cụ chưa cài đặt Tạo dễ dàng để học ngơnngữ Mặc dù có nhiều NNLT khác chúng có nguyên tắc chung NNLT Rất nhiều ngơnngữ có chung cú pháp (sai khác chút cách viết), có chung kiểu liệu (sai khác chút tên gọi) Việc nắm vững nguyên lý NNLT điều kiện thuận lợi lớn để tiếp cận cách nhanh chóng với ngơnngữlậptrình cụ thể Thực tế cho thấy với người nắm vững NNLT, gặp ngônngữlậptrình cụ thể mới, họ vừa nghiên cứu ngônngữ vừa áp dụng để lậptrình giải tốn theo u cầu Tạo tiền đề để thiết kế ngônngữ Việc thiết kế ngơnngữ đòi hỏi khoa học phát triển NNLT Nếu không nghiên cứu NNLT khơng thể có kiến thức để xây dựng ngônngữ CÁC TIÊU CHUẨN ÐÁNH GIÁ MỘT NGƠNNGỮLẬPTRÌNH TỐT Những yếu tố sau tạo nên ngơnngữ tốt, tiêu chuẩn để người lậptrình đánh giá ngônngữ tốt ngônngữ lựa chọn ngơnngữ để sử dụng Ngồi thiết kế ngơnngữlậptrình mới, ta phải quan tâm đến tiêu chuẩn để có ngơnngữ tốt Tính dễ đọc Tính dễ đọc NNLT dễ dàng đọc hiểu chương trình viết ngơnngữ Tính dễ đọc đặc trưng thuộc tính sau: 1.- Sự giản dị Một ngônngữ gọi có tính giản dị ngơnngữ có thành phần sở, tức yếu tố định nghĩa trước Các ngônngữ mà đạt phép tốn nhiều cách khác khơng phải ngơnngữ giản dị Chẳng hạn ngônngữ C để tăng thêm đơn vị cho biến count ta sử dụng nhiều cách count = count + 1, count += 1, count++ ++count Các phép toán chồng (overload) làm cho ngônngữ trở nên phức tạp Chẳng hạn tốn tử + hiểu cộng hai số nguyên, cộng hai số thực, hợp hai tập hợp hay ghép nối hai chuỗi ký tự 2.- Cấu trúc điều khiển Các lệnh có cấu trúc cho phép viết chương trình sáng sủa, dễ đọc, dễ hiểu Chúng ta nhận thấy điều ngônngữ thuộc thập niên 1960 BASIC, FORTRAN thiếu cấu trúc điều khiển nên chương trình phải sử dụng nhiều lệnh GOTO, khó theo dõi để hiểu chương trình Ta so sánh hai đoạn chương trình in hình 10 số tự nhiên viết ngônngữ BASIC (khơng có lệnh cấu trúc FOR) ngơnngữ Pascal Viết BASIC 10 20 30 40 50 60 i=1; IF i>10 THEN GOTO 60; PRINT i ; i=i+1; GOTO 20; PRINT “In xong”; Viết Pascal FOR i:=1 TO 10 DO Writeln(i); Writeln(‘In xong’); 3.- Kiểu liệu cấu trúc liệu Xem xét kiểu liệu cấu trúc liệu ngônngữ góp phần đánh giá ngơnngữ đọc hay khơng Chẳng hạn ngơnngữ khơng có kiểu liệu logic phải sử dụng kiểu số để thay mà chương trình trở nên khó đọc Ví dụ ta hay sử dụng biến found chương trình tìm kiếm phần tử x mảng a gồm n phần tử Nếu ngơnngữ sử dụng có kiểu logic ta gán cho found giá trị TRUE FALSE để biểu diễn trạng thái tìm thấy phần tử cần tìm hay không, ngược lại ngônngữ kiểu logic ta phải dùng kiểu số gán cho found giá trị Ta so sánh hai đoạn chương trình sau để xem đoạn chương trình dễ hiểu found := 0; i := 1; While (i a ; biến a lúc giải phóng nên LISP thơng báo lỗi error: unbound variable - A Biến cục che biến tồn cục Trong lậptrình hàm, người ta hạn chế sử dụng biến, thật cần thiết nên sử dụng biến cục Tuy nhiên việc khai báo biến cục hàm LET gây khó khăn cho việc viết chương trình sử dụng biến tồn cục Để khắc phục tình trạng này, ta kết hợp hai hàm LET SETQ để sử dụng biến cục che biến toàn cục Cách làm sau: - Trong phần gán trị cho biến LET ta tạo biến gán cho giá trị bất kỳ, chẳng hạn số - Trong phần định trị biểu thức, ta sử dụng SETQ để gán trị cho biến tạo trên, biến biến cục khơng tồn cục - Cụ thể viết: (LET ( (var E1)… ) …… (SETQ var E2) …… ) Với cách làm biến var hàm SETQ trở thành biến cục Ví dụ: Giả sử ta định nghĩa hàm (ptb2 a b c), giải phương trình bậc hai ax +bx+c = Bây ta viết hàm (giai_ptb2) cho phép nhập hệ số a, b, c từ bàn phím gọi hàm (ptb2 a b c) để thực việc giải phương trình Có hai phương pháp để viết hàm Phương pháp 1: dùng biến toàn cục a, b, c (defun giai_ptb2 () (progn (print “Chương trình giải phương trình bậc hai“) (princ “Nhập hệ số a: “) (setq a (read)) (princ “Nhập hệ số b: “) (setq b (read)) (princ “Nhập hệ số c: “) (setq c (read)) (ptb2 a b c) ) ) Sau thực chương trình này, biến tồn cục a, b c Phương pháp 2: dùng biến cục d, e, f (defun giai_ptb2 () (let ((d 0) (e 0) (f 0)) (print “Chương trình giải phương trình bậc hai“) (princ “Nhập hệ số a: “) (setq d (read)) (princ “Nhập hệ số b: “) (setq e (read)) (princ “Nhập hệ số c: “) (setq f (read)) (ptb2 d e f) ) ) Sau thực chương trình này, biến cục d, e f giải phóng Hướng dẫn sử dụng LISP Sử dụng XLISP XLISP trình thơng dịch, chạy hệ điều hành Windows Chỉ cần chép tập tin thực thi XLISP.EXE có dung lượng 288Kb vào máy tính bạn thực Để thực hàm, cần gõ trực tiếp hàm vào sau dấu chờ lệnh (>) XLISP Trong trường hợp khơng có dấu chờ lệnh, dùng menu Run/Top level Ctrl-C để làm xuất dấu chờ lệnh Việc định nghĩa hàm gõ trực tiếp vào sau dấu chờ lệnh Tuy nhiên cách làm khó sửa chữa hàm ta thường định nghĩa hàm tập tin chương trình, sau nạp vào cho XLISP để sử dụng Ta lưu trữ lại tình trạng làm việc hành vào tập tin WKS cách dùng menu File/Save workspace sau khơi phục lại cách dùng menu File/Restore workspace Soạn thảo tập tin chương trình Do XLISP khơng có cơng cụ để soạn thảo chương trình nên ta sử dụng Notepad để soạn thảo tập tin chương trình Trong tập tin chương trình ta định nghĩa nhiều hàm Lưu tập tin chương trình có tên theo quy định DOS (8.3) với phần mở rộng LSP để cặp dấu nháy kép Nạp hàm tự định nghĩa cho XLISP Có hai phương pháp để nạp hàm tự định nghĩa cho XLISP: • Phương pháp 1: Copy dán khối - Trong Notepad, đánh dấu khối hàm tự định nghĩa copy khối (Edit/Copy Ctrl-C) - Trong XLISP, dán khối dấu chờ lệnh (Edit/Paste Ctrl-Ins) - Với phương pháp viết hàm, khơng nên viết dòng lệnh q dài - Nếu khối hàm dán vào khơng có lỗi tên hàm xuất ta sử dụng hàm - Phương pháp phù hợp với việc kiểm thử hàm • Phương pháp 2: Mở tập tin chương trình - Trong XLISP, sử dụng menu File-Open/Load để mở tập tin chương trình chứa hàm viết lưu trữ Notepad Chúng ta sử dụng hàm (LOAD ) để mở tập tin chương trình - Nếu việc mở thành cơng gọi thực hàm có tập tin chương trình - Nếu có hàm viết sai dấu ngoặc việc mở tập tin thất bại ta khơng thể dùng hàm tập tin - Phương pháp thích hợp với việc nạp nhiều hàm kiểm chứng tập tin chương trình để sử dụng Một số thơng báo lỗi thường gặp - Unbound function: Hàm khơng có - Bad function: Hàm sai - Too many arguments: Thừa tham số - Too few arguments: Thiếu tham số - Misplaced close paren: Thừa dấu ngoặc đóng/ Thiếu dấu ngoặc mở - EOF reached beore expression end: Thừa dấu ngoặc mở/ Thiếu dấu ngoặc đóng - Not a number: Đối số hàm phải số - Bad argument type: Kiểu tham số sai Ngônngữlậptrình CHƯƠNG 9: LẬPTRÌNH LOGIC Chương IX: Lậptrình logic TỔNG QUAN Mục tiêu Sau học xong chương này, sinh viên cần phải nắm: - Khái niệm lậptrình logic - Các nguyên tắc lậptrình logic - Viết chương trình đơn giản ngơnngữ Prolog Nội dung cốt lõi - Lậptrình logic - Căn ngơnngữlậptrình Prolog Kiến thức cần thiết Kiến thức kĩ lậptrình GIỚI THIỆU VỀ LẬPTRÌNH LOGIC Trong lậptrình logic, ta sử dụng vị từ để định nghĩa khái niệm tất mơn khoa học khác Ví dụ định nghĩa số nguyên tố: Số nguyên tố N số nguyên lớn 1, chia hết cho Để xét xem số N có phải số nguyên tố hay không, người ta thường sử dụng dấu hiệu nhận biết: Số nguyên tố số nguyên dương, không chia hết cho số nguyên tố nhỏ số nguyên tố nhỏ Dấu hiệu mơ tả vị từ sau: - số nguyên tố - N số nguyên tố N>0, M số nguyên tố đó, M0, M số ngun tố đó, M0, so_nguyen_to(M), M0, so_nguyen_to(M), M X=thuy • Do dep(thuy) sai nên quay lui đồng khoe(X) với khoe(lan) => X=lan • Do dep(lan) nên tiếp tục kiểm tra thong_minh(lan) • Do thong_minh(lan) sai nên quay lui để đồng khoe(X) với khoe(binh) để có X=binh, sau kiểm tra thấy dep(binh) thong_minh(binh) nên X=binh nghiệm Bộ ký tự, từ khoá Prolog dùng ký tự sau: chữ chữ số (A – Z, a – z, – 9); toán tử (+, -, *, /, ) ký hiệu đặc biệt Một số từ khoá: a Trace: Khi có từ khố đầu chương trình, chương trình thực bước để theo dõi; dùng phím F10 để tiếp tục b Fail: Khi ta dùng goal nội, chương trình cho ta kết (mặc dù kết khác), để nhận tất kết chạy goal nội, ta dùng toán tử Fail 109 c ! hay gọi nhát cắt, goal ngoại cho ta kết quả, muốn nhận kết từ goal ngoại, ta dùng ký hiệu ! Các kiểu liệu Trong prolog có kiểu liệu chuẩn kiểu người lậptrình định nghĩa Kiểu liệu chuẩn Là kiểu liệu prolog định nghĩa sẵn Prolog cung cấp kiểu liệu chuẩn là: char, integer, real, string symbol a Char: Là kiểu ký tự Hằng ký tự phải nằm hai dấu nháy đơn Ví dụ: ‘a’, ‘#’ b Integer: Là kiểu số nguyên, tập giá trị bao gồm số nguyên từ -32768 đến 32767 c Real: Là kiểu số thực, tập giá trị bao gồm số thực thuộc hai đoạn: đoạn số âm từ -10307 đến -10-307 đoạn số dương từ 10-307 đến 10307 d String: Là kiểu chuỗi ký tự Hằng chuỗi ký tự phải nằm hai dấu nháy kép Ví dụ: “Turbo prolog 2.0” e Symbol: Là kiểu sơ cấp, có hình thức giống chuỗi ký tự Hằng symbol có hai dạng: Dãy chữ, số dấu gạch viết liên tiếp, ký tự đầu phải viết thường (chẳng hạn: telephone_number); Dãy ký tự cặp hai nháy kép (giống chỗi ký tự) f Một số phép toán kiểu Phép toán số học Phép toán + Ý nghĩa Cộng hai số Kiểu đối số Integer, real - Trừ hai số Integer, real * Nhân hai số Integer, real / Chia hai số Integer, real Phép chia lấy phần dư Phép chia lấy phần nguyên Integer Integer Kiểu kết giống kiểu đối số giống kiểu đối số giống kiểu đối số giống kiểu đối số Integer Integer Kiểu đối số Kết Mod Div Phép toán quan hệ Phép toán Ý nghĩa < Nhỏ Char, integer, real, string Yes No Lớn Char, integer, real, string Yes No >= Lớn hay Char, integer, real, string Yes No Khác Char, integer, real, string Yes No hay >< Các vị từ hàm toán học Vị từ Ý nghĩa Sin(X) Tan(X) Arctan(X) Exp(X) Ln(X) Log(X) SQRT(X) ROUND(X) TRUNC(X) ABS(X) Random(X) Random(Y, X) Kiểu đối số real real real real real real Tính sin X Tính tang X Tính arctang X X Tính e Tính logarit số e X Tính Logarit số 10 X Tính bậc hai X real Cho ta số nguyên số X real làm tròn, dấu dấu X Cho phần nguyên số X, dấu dấu X Cho ta trị tuyệt đối X Cho ta số thực X nằm khoảng [0, 1) Cho ta số nguyên X nằm khoảng [0, Y) Kiểu kết real real real real real real real integer real integer real real real real real integer Ví dụ round(2.3)=2 round(2.5)=3 round(-2.5)=-2 round(-2.6)=-3 trunc(2.5)=2 trunc(-2.6)=-2 Toán tử NOT(X) : Nếu X Yes NOT(X) No ngược lại Các kiểu liệu người lậptrình định nghĩa a Kiểu mẩu tin: Cú pháp: = tên mẩu tin (danh sách kiểu phần tử) Ví dụ: Domains ten, tac_gia, nha_xb, dia_chi = string nam, thang, so_luong = integer dien_tich = real nam_xb = nxb(thang, nam) do_vat = sach(tac_gia, ten, nha_xb, nam_xb); xe(ten, so_luong); nha(dia_chi, dien_tich) predicates so_huu(ten,do_vat) clauses so_huu(“Nguyen Van A”, sach(“Do Xuan Loi”, “Cau truc DL”, “Khoa hoc Ky thuat”, nxb(8,1985))) so_huu(“Le thi B”, xe(“Dream II”, 2)) so_huu(“Nguyen Huu C”, nha(“3/1 Ly Tu Trong, Can Tho”, 100.5)) b Kiểu danh sách Cú pháp: = * Ví dụ: Domains intlist = integer* Một danh sách dãy phần tử phân cách dấu phẩy đặt cặp dấu ngoặc vng Ví dụ: [] % Danh sách rỗng [1,2,3] % Danh sách gồm ba số nguyên 1, Cấu trúc danh sách bao gồm hai phần: Phần đầu phần tử danh sách phần đuôi danh sách phần tử lại Danh sách viết theo dạng [X|Y] X phần tử đầu Y danh sách đuôi Chẳng hạn danh sách [1,2,3] đầu số nguyên đuôi danh sách [2,3] Trong danh sách dùng biến tự do, chẳng hạn ta viết [_|Y] để danh sách có đầu phần tử có danh sách Y Các hàm xuất nhập chuẩn Xuất hình a Write( Arg1, Arg2, … ,Argn) in hình giá trị đối số b Writef( Formatstring, Arg1, Arg2, … ,Argn) in hình giá trị đối số theo định dạng định Formastring Trong Formastring chuỗi là: - “%d”: In số thập phân bình thường; đối số phải char integer - “%c”: Đối số số integer, in ký tự có mã Ascci đối số đó, chẳng hạn writef(“%c”,65) A - “%e”: In số thực dạng lũy thừa 10 - “%x”: In số Hexa; đối số phải char integer - “%s”: In chuỗi symbol Nhập vào từ bàn phím a Readln(X): Nhập chuỗi ký tự vào biến X b ReadInt(X): Nhập số nguyên vào biến X c ReadReal(X): Nhập số thực vào biến X d ReadChar(X): Nhập vào ký tự vào biến X Kỹ thuật đệ quy Đệ quy kỹ thuật lậptrình sử dụng nhiều ngônngữ Trong Turbo Prolog ta sử dụng đệ quy vị từ định nghĩa nhờ vào vị từ Như nói chương lậptrình hàm, chương trình đệ quy phải có trường hợp dừng lời gọi đệ quy phải chứa yếu tố dẫn đến trường hợp dừng Trong Prolog, trường hợp dừng thể kiện, yếu tố dẫn đến trường hợp dừng thể biến, liên hệ với biến ban đầu cơng thức Ví dụ 1: Tính n giai thừa Predicates Facto (integer, integer) Clauses Facto(0,1):- ! Facto(N, FactN) :- N > 0, M = N – 1, facto(M, factM), factN = N*factM Ở ví dụ ta định nghĩa vị từ dùng để tính giá trị giai thừa số tự nhiên, đối số thứ số cần tính giai thừa đối số thứ hai dùng để nhận giá trị trả Trường hợp dừng xác đinh kiện giai thừa Để tính N! ta tính M! với M= N-1 Yếu tố dẫn đến trường hợp dừng biến M có giá trị N-1 Ví dụ 2: Xác định phần tử danh sách symbol domains symbol_list = symbol* predicates element1(integer,symbol_list,symbol) element (integer,symbol_list,symbol) clauses % element1 không suy diễn ngược element1(1,[X|_],X) element1(N, [_|L],Y):M=N-1, element1(M,L,Y) % element suy diễn ngược element(1,[X|_],X) element(N,[_|L],Y):element(M,L,Y), N=M+1 Sự suy diễn thuận chiều cho danh sách vị trí, tìm phần tử vị trí đó, chẳng hạn, ta đưa vào goal element(2,[a,b,c,d],X) ta X=b Sự suy diễn ngược cho danh sách phần tử, tìm vị trí phần tử đó, chẳng hạn, ta đưa vào goal element(N,[a,b,c,d], b) ta N=2 Ví dụ 3: Sắp xếp danh sách số nguyên domains list=integer* predicates insert(integer,list,list) sort(list,list) clauses insert(E,[],[E]) insert(E,[A|B],[E,A|B]):insert(E,[A|B],[A|C]):sort([],[]) sort([X|R1],L):- EA,insert(E,B,C) sort(R1,R), insert(X,R,L) ... kiểu liệu integer tập hợp hữu hạn số nguyên (dĩ nhiên có thứ tự), từ số nguyên nhỏ đến số nguyên lớn Số nguyên nhỏ số nguyên lớn số nguyên tương ứng với giá trị nguyên nhỏ lớn biểu diễn cách thuận... nguyên nhớ, ta sử dụng hai phương pháp: 1.- Sử dụng cách biểu diễn số nguyên phần cứng, chẳng hạn sử dụng 16 bit để biểu diễn cho số nguyên Với phương pháp ta sử dụng ln phép tính số học số nguyên... phần cứng Ví dụ số nguyên lưu trữ cách dùng biểu diễn phần cứng cho số ngun phép tốn phép cộng, trừ phép toán số học khác số nguyên thực cách dùng phép toán số học cho số nguyên xây dựng phần