1. Trang chủ
  2. » Luận Văn - Báo Cáo

LẬP TRÌNH BẰNG Turbo Pascal

274 95 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 274
Dung lượng 2,01 MB

Nội dung

Lập trình Turbo Pascal LơI NOI đầU L ngôn ngữ lập trình có cú pháp chặt chẽ, đơn giản v dễ hiểu, Pascal đợc giảng dạy cho sinh viên tin học năm học Nó l ngôn ngữ sở để giới thiệu cho sinh viên lm quen với kĩ thuật xây dựng chơng trình Ngoi ra, đợc dùng để trình by nhiều chuyên đề khác tin học năm học Nắm vững thnh phần bản, hiểu rõ yếu tố cú pháp ngôn ngữ lập tr×nh Pascal, lμ rÊt quan träng Nh−ng vËn dơng nã để xây dựng đợc chơng trình l điều quan trọng Qua kinh nghiệm nhiều lần giảng dạy ngôn ngữ Pascal cho đối tợng sinh viên khác nhau, cã thĨ nhËn thÊy r»ng sinh viªn lóng tóng khâu vận dụng xây dựng chơng trình cụ thể, lm no, đâu Giáo trình ny đặt trọng tâm vo trình by kĩ thuật xây dựng chơng trình song song với việc giới thiệu ngôn ngữ lập trình Pascal Các ví dụ ứng dụng tổng hợp cuối chơng đợc chọn lọc để minh hoạ vấn đề lí thuyết trình by chơng Những ví dụ ứng dụng ny có liên quan chặt chẽ với nhau, đợc phát triển hon thiện dần cách có hệ thống để sinh viên hiểu rõ bớc xây dựng chơng trình, từ thô sơ, đơn giản đến hon thiện, hiệu qủa Vì l hệ thống lại bi giảng lần nên chắn nhiều thiếu sót Rất mong đóng góp ý kiến thầy, cô đồng nghiệp nh bạn sinh viên l đối tợng phục vụ giáo trình ny Tác giả Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội i Lập trình Turbo Pascal NÔI DUNG LơI NOI đầU i Chơng - Giíi thiƯu chung 1 C¸c kh¸i niƯm 1.1 Mở đầu 1.2 Các kí tự 1.3 Các từ khoá 1.4 Tên - Identifier 1.5 Tên chuẩn 1.6 Câu lệnh Phát triển chơng trình Pascal 2.1 Cấu trúc chơng trình Turbo Pascal 2.2 Các bớc xây dựng chơng trình Môi trờng phát triển tích hợp Turbo Pascal 3.1 Các công cụ phát triển 3.2 Các chức v cách dùng 3.3 Các bớc xây dựng chơng trình môi trờng Turbo Pascal 1 3 4 5 7 11 C©u hái vμ bμI tËp 12 Chơng - Các kiểu liệu chuẩn, hm chuẩn 14 Các kiểu liệu chuẩn 1.1 Khái niệm kiểu liệu 1.2 Phân loại kiểu liệu TurboPascal 1.3 Các kiểu đơn giản chuẩn Các hm chuẩn 2.1 Bảng hm chuẩn 2.2 Sử dơng 14 14 14 16 18 19 20 C©u hái v bi tập 20 Chơng - Các khai báo v câu lệnh đơn giản 21 Khai báo vμ biÕn 1.1 Khai b¸o h»ng 1.2 Khai b¸o biÕn Biểu thức ngôn ngữ Pascal 2.1 Biêủ thức l 2.2 Bảng thứ tự u tiên 2.3 Viết biểu thức Các câu lệnh đơn giản 3.1 Lệnh gán 3.2 Lệnh in mn hình không kèm định dạng 3.3 Quy cách mặc định in kiĨu d÷ liƯu 3.4 LƯnh in cã kÌm quy c¸ch 21 21 22 23 23 24 25 25 26 26 27 28 Nguyễn Đình Hoá, Viện CNTT - ĐHQG Hμ néi ii LËp tr×nh b»ng Turbo Pascal 3.5 LƯnh in máy in 3.6 Lệnh nhập liệu từ bμn phÝm Mét sè hμm, thđ tơc tr×nh bμy mn hình 29 30 32 Câu hỏi v bi tập 32 Chơng 4- Các cấu trúc điều khiển 35 Câu lệnh ghép Câu lệnh IF 2.1 Cú pháp v công dụng 2.2 Các ví dụ minh hoạ 2.3 If lång hay d·y if 2.4 AND hay IF lồng Câu lệnh CASE 3.1 Cú pháp v tác dụng 3.2 Ví dụ minh hoạ 3.3 Chú ý 3.4 Các lỗi thờng gặp Câu lệnh FOR 4.1 Cú pháp v tác dụng 4.2 Ví dụ minh hoạ Câu lệnh Repeat 5.1 Cú pháp v tác dụng 5.2 Ví dụ minh hoạ Câu lệnh While 6.1 Cú pháp v công dụng 6.2 Ví dụ minh hoạ Xây dựng cấu trúc lặp 7.1 Điều khiển vòng lặp giá trị canh chừng 7.2 Điều khiển vòng lặp cờ báo Các lệnh kết thúc sớm vòng lặp chơng trình 8.1 Lệnh nhảy không điều kiện - goto 8.2 Lệnh chấm dứt sớm vòng lặp 8.3 Lệnh thoát khỏi chơng trình 8.4 Lệnh dừng chơng trình bất thờng 35 35 36 37 38 39 40 40 41 42 42 43 43 44 45 45 46 48 48 49 50 50 51 51 51 52 53 53 Câu hỏi v bi tập 53 Chơng - Định nghĩa Các kiểu liệu đơn giản 56 Khai báo kiểu liệu 1.1 Cú pháp chung 1.2 Ví dụ Kiểu liệt kê 2.1 Định nghÜa vμ có ph¸p 2.2 TÝnh chÊt vμ c¸c phÐp toán 2.3 Ví dụ minh hoạ Kiểu đoạn 3.1 Định nghĩa v cú pháp 3.2 Ví dụ minh hoạ Kiểu tập hợp 56 56 56 57 57 58 60 60 60 62 62 Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội iii Lập trình Turbo Pascal 4.1 Định nghĩa v cú pháp 4.2 Các phép toán tập hợp 4.3 Ví dụ minh hoạ 62 63 64 Chơng - Kiểu mảng 66 Mảng chiều 1.1 Định nghĩa v cú pháp 1.2 Các tính chất 1.3 Tại nên khai báo kiểu 1.4 Ví dụ minh hoạ Mảng nhiều chiều 2.1 Định nghÜa có ph¸p vμ cÊu tróc 2.2 VÝ dơ minh hoạ Tìm kiếm mảng 3.1 Tìm kiếm 3.2 Tìm kiếm nhị phân Một vi cách xếp mảng 4.1 Phơng pháp đổi chỗ trực tiếp 4.2 Phơng pháp chèn trực tiếp 4.3 Phơng pháp chọn trùc tiÕp 66 66 67 68 68 69 69 70 71 71 72 73 73 75 77 C©u hái vμ bi tập 79 Chơng - Kiểu xâu kí tự 81 Có ph¸p vμ cÊu tróc 1.1 Có ph¸p 1.2 CÊu tróc kiĨu x©u kÝ tù - Truy cËp trực tiếp thnh phần Thao tác với xâu kÝ tù 2.1 C¸c phÐp to¸n 2.2 C¸c thđ tơc v hm xâu kí tự 81 81 82 84 84 84 Câu hỏi v bi tập 86 Chơng - Kiểu ghi 88 Định nghĩa v khai báo 1.1 Định nghĩa 1.2 Khai báo kiểu ghi Sư dơng 2.1 Truy cËp tõng thμnh phÇn 2.2 Các phép toán với ton ghi 2.3 Đọc vμo, viÕt víi mét biÕn kiĨu b¶n ghi 2.4 Câu lệnh With Bản ghi có cấu trúc thay đổi 3.1 Định nghĩa v cú pháp 3.2 Sử dụng ghi có cấu trúc thay đổi 88 88 88 90 90 90 91 92 93 93 94 Ch−¬ng - Kiểu tệp 98 Các khái niệm v định nghĩa 1.1 Mục đích sử dụng tệp 1.2 Tệp định kiểu 98 98 98 Nguyễn Đình Hoá, Viện CNTT - §HQG Hμ néi iv LËp tr×nh b»ng Turbo Pascal 1.3 Tệp truy cập Viết tệp, đọc vμo tõ tƯp 2.1 Më tƯp ®Ĩ viÕt 2.2 Viết liệu tệp 2.3 Mở tệp để đọc vo 2.4 Đọc liệu vo từ tệp 2.5 Tệp truy cËp trùc tiÕp C¸c thao t¸c kh¸c 3.1 Mét sè hμm vμ thđ tơc víi tƯp 3.2 BÉy lỗi mở tệp Tệp văn 4.1 Định nghĩa v cấu trúc 4.2 Viết tệp văn 4.3 Đọc vo từ tệp văn 4.4 Các hm, thủ tục chuẩn khác cho tệp văn 4.5 Các thiết bị vo chuẩn Tệp không định kiểu 5.1 Định nghĩa v cấu trúc 5.2 Các hm, thđ tơc kh¸c 99 100 100 101 102 102 103 104 104 105 107 107 108 108 109 111 112 112 112 Câu hỏi v bi tập 114 Chơng 10 - Chơng trình 115 Chơng trình - Hm v thủ tục 1.1 Tại cần sử dụng chơng trình 1.2 Khai báo chơng trình 1.3 Xây dựng chơng trình 1.4 Lời gọi chơng trình 1.5 VÝ dơ minh ho¹ Hμm hay thđ tục, tham biến hay tham trị 2.1 Phân biệt hm víi thđ tơc 2.2 Ph©n biƯt tham biÕn vμ tham trị 2.3 Một vi lu ý xây dựng chơng trình 2.4 Khai báo trớc - Forward Chơng tr×nh lång 3.1 BiÕn toμn cơc, biÕn cơc bộ, tầm tác dụng 3.2 Minh hoạ 115 115 115 117 117 118 120 120 121 122 124 125 125 126 C©u hái vμ bμi tËp 128 Ch−ong 11 - Thiết kế chơng trình 129 Phơng pháp xây dựng chơng trình 1.1 Khái niệm Công nghệ phần mềm 1.2 Chu kì phát triển phần mềm 1.3 Ví dụ minh hoạ 1.4 Lập trình mô đun - Modula programming 1.5 Thđ tơc ho¸ - Procedural abstraction ThiÕt kÕ chi tiết dần bớc 2.1 Sơ đồ cấu trúc chơng tr×nh - structure chart 2.2 VÝ dơ 129 129 129 130 131 133 133 133 134 Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội v Lập trình Turbo Pascal Tính đệ quy v thuật giải đệ quy 3.1 Tính đệ quy 3.2 Thuật giải đệ quy 3.3 Thiết kế giải thuật đệ quy Một số ví dụ thuật giải đệ quy 4.1 Bi toán tháp H nội 4.2 Bi toán vết mực 4.3 Tìm kiếm nhị phân 4.4 Sắp xếp kiểu phân đoạn hay xÕp nhanh - Quick Sort Tù x©y dùng th− viện chơng trình - Units 5.1 Sử dụng lại chơng trình 5.2 Cấu trúc unit 5.3 Biên dịch v sử dụng 5.4 Ví dụ minh hoạ 5.5 So sánh việc dùng Unit với chèn trực tiÕp tƯp m· ngn 5.6 C¸c unit chn cđa Turbo Pascal Giíi thiƯu Unit CRT 6.1 C¸c biÕn 6.2 Các hm, thủ tục 6.3 Mu sắc v chế độ mn hình văn 6.4 Xử lí gõ phím 6.5 C¸c thđ tơc kh¸c VÝ dơ øng dơng - Lm bảng chọn 7.1 Các bớc xây dựng bảng chọn 7.2 Phân tích thiết kế chi tiết dần bớc 7.3 Chơng trình chi tiết 7.4 Chuyển thnh Unit bảng chọn Một chơng trình ứng dụng 8.1 Phân tích thiết kế 8.2 Triển khai chi tiết chơng trình 138 138 139 140 141 141 142 144 145 147 147 147 149 149 150 150 151 151 152 153 156 156 157 157 158 162 165 167 167 170 C©u hái vμ bμi tËp 174 Ch−¬ng 12 - Con trá v cấu trúc liệu động 176 Con trỏ 1.1 Biến tĩnh v biến động 1.2 Định nghĩa v khai báo 1.3 Các phép toán trỏ Biến động 2.1 Cấp phát vùng nhớ v truy cập biến động 2.2 Giải phóng biến động, thu hồi vùng nhớ Con trỏ không định kiểu - Pointer 3.1 Định nghĩa 176 176 177 178 179 179 180 180 180 3.2 ứng dụng Vùng ngăn xếp v vùng Heap 4.1 Khái niệm 4.2 Giải toả heap 4.3 Ví dụ minh hoạ - mảng cỡ lớn 181 182 182 183 183 Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội vi Lập trình Turbo Pascal Câu hỏi v bi tập 184 Chơng 13 sách & danh sách móc nối Danh 187 Danh sách mảng 1.1 Mô hình danh sách 1.2 Danh sách biểu diễn cấu trúc mảng 1.3 Các phép toán danh sách mảng 1.4 Các u, nhợc điểm 1.5 Ví dụ minh hoạ Danh sách kiểu ngăn xếp - Stack 2.1 Định nghía danh sách kiểu ngăn xếp 2.2 Biểu diễn danh sách kiểu ngăn xếp 2.3 Các phép toán kiểu ngăn xếp Danh sách kiểu hng đợi - Queue 3.1 Định nghĩa danh sách kiểu hng đợi 3.2 Biểu diễn danh sách kiểu hng đợi mảng 3.2 Các phép toán Danh sách nối đơn 4.1 Mô tả 4.2 Cấu trúc móc nối 4.3 Các phÐp to¸n Danh s¸ch nèi kÐp 5.1 CÊu tróc danh s¸ch nèi kÐp 5.2 C¸c phÐp to¸n víi danh s¸ch nèi kÐp VÝ dơ øng dơng cđa danh sách móc nối 6.1 Cải tiến chơng trình quản lí hồ sơ 6.2 Phân tích thiết kế 6.3 Triển khai chi tiÕt 187 187 188 188 189 190 193 193 194 194 195 195 196 196 198 198 198 200 202 202 203 205 205 205 207 C©u hái vμ bi tập 213 Chơng 14 - Dồ hoạ 215 Các khái niệm 1.1 Hai chế độ hiển thị mn hình 1.2 Khởi tạo v đóng chế độ đồ hoạ 1.3 Một chơng trình đồ hoạ đơn giản 1.4 Mu sắc, kiểu nét vẽ, kiểu tô Các thủ tục đồ hoạ thờng dùng 2.1 Di chuyển, vẽ điểm, đoạn thẳng 2.2 Các thủ tục vẽ hình 2.3 Tỷ lệ biểu kiến 2.4 Viết chữ mn hình đồ hoạ Các thủ tục môi trờng đồ hoạ 3.1 Các thủ tục thiết lập mu 3.2 Các thủ tục mẫu tô, mẫu nét vẽ 3.3 ViewPort Vẽ đồ thị hm số 4.1 Ph©n tÝch thiÕt kÕ 215 215 216 218 218 219 219 220 221 222 224 224 225 229 230 231 Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội vii Lập trình Turbo Pascal 4.2 Chơng trình chi tiết 4.3 Chuyển thnh chơng trình Lm hoạt hình 5.1 Di chuyển hình vẽ trơn 5.2 Di chuyển hình vẽ hình ảnh tĩnh 5.3 Sư dơng phÐp lËt trang mμn h×nh 232 234 235 235 236 240 Câu hỏi v bi tập 242 Chơng 15 - Thâm nhập hệ thống v Hệ điều hnh DOS 244 Gọi thực chức ROM-BIOS v DOS 1.1 Các ghi 8086 v địa nhớ 1.2 Các ngắt - interrupt 1.3 Thâm nhập trực tiếp qua ghi v ngắt 1.4 Các ví dụ minh hoạ 1.5 Sử dụng hm, thđ tơc cđa unit DOS §iỊu khiĨn cht 2.1 Toạ độ chuột 2.2 Ngắt điều khiển chuột $33 2.3 Ví dụ minh hoạ 2.4 Th viện thủ tục thao t¸c chuét 244 244 245 246 247 250 251 251 252 253 255 2.5 øng dơng vμo b¶ng chän Th©m nhËp trùc tiÕp vμo bé nhí vμ cỉng 3.1 Th©m nhËp trùc tiÕp bé nhí 3.2 Th©m nhËp cổng Chơng trình thờng trú 4.1 Khái niệm 4.2 Cách xây dựng chơng trình thờng trú 4.3 Ví dơ minh ho¹ 256 257 257 259 260 260 261 261 Câu hỏi v bi tập 265 Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội viii Lập trình Turbo Pascal Ch−¬ng Giíi thiƯu chung Pascal lμ mét ngôn ngữ lập trình cho máy tính, Niklaus Wirth, giảng viên trờng Đại học Kĩ thuật Zurich, Thuỵ sĩ xây dựng nên vo năm 1970 với mục đích để giảng dạy L ngôn ngữ lập trình cấu trúc, sáng, dễ hiểu, Pascal vợt khỏi nh trờng, phát triển thnh ngôn ngữ mạnh, dùng để phát triển chơng trình chuyên nghiệp N Wirth đợc giải Turing công lao sáng tạo v phổ biến ngôn ngữ Pascal Hiện ngôn ngữ lập trình Pascal có nhiều biến thể công ty khác bỉ xung hoμn thiƯn thªm: TURBO PASCAL cđa Borland, QUICK PASCAL cđa Microsoft, ANSI PASCAL Nãi riªng Turbo Pascal đợc cải tiến hon thiện qua nhiều phiên bản, từ 1.0 ban đầu 5.5 năm 1989, 6.0 năm 1990, 7.0 năm 1992 Các khái niệm 1.1 Mở đầu Pascal l ngôn ngữ lập trình cấp cao, nghĩa l gần với ngôn ngữ ngời Khái niệm cấp cao, cấp thấp ngôn ngữ lập trình máy tính để nói gần với ngôn ngữ ngời hay với ngôn ngữ máy tính để nói khả Tơng tự nh ngôn ngữ thông thờng, Pascal sử dụng kí tự để tạo nên từ, dùng "từ" v yếu tố khác để tạo thnh "câu" có ý nghĩa xác định Các "câu" đợc phối hợp thnh "văn bản" hon chỉnh gọi l văn chơng trình nhằm lệnh cho máy tính thực hiƯn mét sè c«ng viƯc xư lÝ th«ng tin nμo Để minh hoạ ta xét văn chơng trình Pascal sau Program HinhTron; Var BanKinh,ChuVi,DienTich: real; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội Lập tr×nh b»ng Turbo Pascal Begin Write(' Cho ban kinh = '); Read(BanKinh); If BanKinh > then begin ChuVi:= 2* pi * BanKinh ; DienTich:= pi * BanKinh * BanKinh ; Write(' Chu vi la = ' , ChuVi ); Write(' Dien tich la = ' , DienTich); End Else Write(' Ban kinh am, khong hop le !'); End Cã thể "dịch" văn chơng trình cho máy tính thnh ngôn ngữ thông thờng nh sau Chơng trình Hình Tròn; Các biến: Bán Kính, Chu Vi, Diện Tích: l số thực; Bắt đầu Viết mn hình: Cho Bán Kính = Đọc từ bn phím: Bán Kính Nếu Bán Kính > Thì Bắt đầu ChuVi = x π x B¸n KÝnh DiƯnTÝch = π x B¸n KÝnh x B¸n KÝnh ViÕt ra: Chu vi lμ = gi¸ trị ChuVi (tính đợc trên) Viết ra: Diện tích l = giá trị DiệnTích (tính đợc trên) Kết thúc Trái lại Viết: Bán Kính âm, Không hợp lệ ! KÕt thóc 1.2 C¸c kÝ tù Turbo Pascal sư dụng kí tự sau bảng mã ASCII: - Các chữ thờng v hoa: a z, A Z - 10 ch÷ sè: - DÊu nèi d−íi: _ - C¸c dÊu phÐp to¸n: + - * / = - Một số kí hiệu đặc biệt: , ; ! ? : ' " ( ) { } [ ] % @ & # $ ^ ý nghĩa kí hiệu ny đợc quy định riêng, khác với cách dùng thông thờng Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội Lập trình Turbo Pascal Để chuyển sang toạ độ x_text, y_text mn hình văn bản, lu ý x_text ≤ 80, ≤ y_text ≤ 25 ta sÏ cã c«ng thức đổi toạ độ chuột sang toạ độ mn hình văn l x_text = x_mouse/8 + y_text = y_mouse/8 + Theo công thức trên, ta ®−ỵc x = 64 ®iĨm cht mét ô kí tự mn hình văn Khi nhấn chuột vo điểm ny ứng với ô vị trí kí tự mn hình văn m Công thức chuyển toạ độ chuột sang toạ độ mn hình đồ hoạ l x_graphics = (x_mouse / 632) * getmaxx; y_graphics = (y_mouse / 192) * getmaxy; getmaxx, getmaxy l toạ độ x, toạ ®é y lín nhÊt cđa chÕ ®é ®å ho¹ ®ang xét 2.2 Ngắt điều khiển chuột $33 Con chuột đợc điều khiển thông qua sử dụng ngắt số hiệu $33 Ngắt ny có nhiều chức khác Cần gán số hiệu chức (sẽ liệt kê dới đây) cho ghi AX (chứ AH nh ngắt khác) Các chức điều khiển chuột ngắt $33 1- Chức 0: khởi tạo chuột Đầu AX:= cha ci đặt chuột AX:= -1 cI ®Ỉt cht BX: = sè phÝm cht (th−êng lμ 2) 2- Chức 1: Lm trỏ chuột 3- Chức 2: Lm ẩn trỏ chuột 4- Chức 3: Lấy vị trí v kiểm tra nhấn phím Đầu CX:= toạ độ x_mouse chuột DX:= toạ độ y_mouse chuột BX cho trạng thái phím chuột Bit = phím trái nhả Bit = phím trái đợc nhấn Bit = phÝm ph¶I nh¶ Bit = phÝm phảI đợc nhấn - Chức 4: Di chuyển trỏ chuột Đầu vo CX = toạ độ x DX = toạ độ y Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 252 Lập trình Turbo Pascal 6- Hỏi trạng thái v số lần nhấn phím kể từ gọi chức ny Đầu vo BX = phím cần hỏi: = trái, = phải, = Đầu AX cho trạng thái phÝm (0 = nh¶, = nhÊn) BÝt cho trạng thái phím trái Bít cho trạng thái phím phải Bít cho trạng thái phím BX:= số lần nhấn CX:= toạ độ x lần nhấn cuối DX:= toạ độ y lần nhấn cuối 7- Hỏi trạng thái v số lần nhả phím kể từ gọi chức ny Đầu vo BX = phím cần hỏi: = tráI, = phảI, = Đầu AX cho trạng thái phím (0 = nhả, = nhấn) Bít cho trạng thái phím trái Bít cho trạng thái phím phải Bít cho trạng thái phím BX:= số lần nhấn CX:= toạ độ x lần nhấn cuối DX:= toạ độ y lần nhấn cuối - Chức 7: Hạn chÕ ph¹m vi di chun ngang cđa cht (ph¹m vi biến đổi x_mouse) Đầu vo: CX:= cột trái DX:= cột phải - Chức 8: Hạn chế phạm vi di chuyển dọc chuột (phạm vi biến đổi y_mouse) Đầu vo: CX:= Dòng DX:= Dòng d−íi cïng 2.3 VÝ dơ minh ho¹ 2.3.1 Khëi t¹o chuột Ta xây dựng thủ tục mouseInit thực chức năng: kiểm tra ci đặt chuột thiết lập toạ độ ban đầu chuột, hạn chế phạm vi tác dụng chuột khung hình chữ nhật v cho hiển thị chuột (một hình chữ nhật) mn hình văn Để dễ nhớ, ta định nghĩa số l chức ngắt $33 nh trình by x,y l toạ độ ban đầu chuột Left, Top, Right, Bottom Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 253 Lập trình Turbo Pascal Trong thủ tục dới v thđ tơc kh¸c tiÕp theo sau, Regs lμ biÕn kiĨu ghi var Regs: registers; const INT_MOUSE = $33; (*ngat chuot*) MOUSE_INIT = $00; MOUSE_X_LIMIT = $07; MOUSE_Y_LIMIT = $08; MOUSE_SET_POSITION = $04; MOUSE_SHOW = $01; procedure mouseInit(x,y,left,top,right,bottom: integer); var mouse_status: integer; begin regs.AX:=MOUSE_INIT; intr(INT_MOUSE,regs); mouse_status:= regs.AX; if (mouse_status -1) then begin writeln('No mouse driver'); exit; end; regs.AX:= MOUSE_X_LIMIT; regs.CX:= left; regs.DX:= right; intr(INT_MOUSE,regs); regs.AX:= MOUSE_Y_LIMIT; regs.CX:= top; regs.DX:= bottom; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SET_POSITION; regs.CX:= x; regs.DX:= y; intr(INT_MOUSE,regs); regs.AX:= MOUSE_SHOW; intr(INT_MOUSE, regs); end; 2.3.2 LÊy vÞ trÝ chuét Sè hiệu chức lấy vị trí l 03 Toạ độ chuột đợc ghi vo biến nguyên x, y Toạ độ ny đợc dùng để đổi sang toạ độ mn hình văn x_text, y_text hay toạ độ mn hình đồ hoạ x_graphics, y_graphics nh ®· nãi trªn const MOUSE_GET_POSITION = $03; procedure getMousePosition(VAR x,y: integer); begin Nguyễn Đình Hoá, Viện CNTT - ĐHQG H néi 254 LËp tr×nh b»ng Turbo Pascal regs.AX:= MOUSE_GET_POSITION; intr(INT_MOUSE,regs); x:= regs.CX; y:= regs.DX; end; 2.3.3 B¾t sù kiƯn nhÊn v nhả phím chuột Sự kiện thông dụng chuột cần xử lí l nhấn phím v nhả phím Thđ tơc getMouseClickLeft cho phÐp ghi l¹i sù kiƯn nhÊn phím chuột trái v toạ độ điểm nhấn Thủ tục getMouseReleaseLeft cho phép ghi lại kiện thả phím chuột trái v toạ độ điểm thả chuột Hon ton tơng tự ta đón bắt kiện chuột ph¶i Const MOUSE_CLICK_COUNT = $05; MOUSE_RELEASE_COUNT = $06; procedure getMouseClickLeft(VAR numclick, x, y: integer); begin regs.AX:= MOUSE_CLICK_COUNT; regs.BX:= $00; intr(INT_MOUSE,regs); numclick:= regs.BX; x:= regs.CX; y:= regs.DX; end; procedure getMouseReleaseLeft(VAR numrelease, x, y: integer); begin regs.AX:= MOUSE_RELEASE_COUNT; regs.BX:= $00; intr(INT_MOUSE,regs); numrelease:= regs.BX; x:= regs.CX; y:= regs.DX; end; 2.4 Th− viƯn c¸c thủ tục thao tác chuột Tập hợp thủ tục ta xây dựng th viện hμm tiƯn Ých thao t¸c cht VÝ dơ, unit mouse; INTERFACE const MOUSE_X_MAX = 632; MOUSE_Y_MAX = 192; Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 255 Lập trình b»ng Turbo Pascal INT_MOUSE = $33; (*ngat chuot*) MOUSE_INIT = $00; MOUSE_SHOW = $01; MOUSE_HIDDEN = $02; MOUSE_GET_POSITION = $03; MOUSE_SET_POSITION = $04; MOUSE_CLICK_COUNT = $05; MOUSE_RELEASE_COUNT = $06; MOUSE_X_LIMIT = $07; MOUSE_Y_LIMIT = $08; procedure mouseInit(x,y,left,top,right,bottom :integer); procedure getMousePosition(VAR x,y: integer); procedure getMouseClickLeft(VAR numclick, x, y : integer); procedure getMouseReleaseLeft(VAR numrelease, x, y : integer); { khai b¸o c¸c thủ tục khác } IMPLEMENTATION { Triển khai chi tiết thủ tục khai báo } 2.5 ứng dụng vào bảng chọn Ta xây dựng bảng chọn, xử lí gõ phím mũi tên Có thể bổ xung thêm thđ tơc xư lÝ sù kiƯn cht ®Ĩ cho phÐp chän b»ng nhÊn phÝm tr¸i cht Thđ tơc xư lÝ gõ phím đợc mở rộng thêm thnh thủ tơc xư lÝ sù kiƯn, bao gåm c¶ sù kiƯn nhÊn chuét nh− sau procedure XuLiSuKien; var i: integer; gophim: char; mouseclick: boolean; raw_x,raw_y, mouse_x, mouse_y, numclick: integer; begin i:=0; {mac dinh ban dau la muc chon thu nhat} mouseclick:= false; mouseInit(MOUSE_X_MAX div 2, MOUSE_Y_MAX div 2, 0,0,MOUSE_X_MAX, MOUSE_Y_MAX); repeat if keyPressed then begin {xu li go phim} Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 256 Lập trình b»ng Turbo Pascal end; {== phan xu li chuot ==} getMouseClickLeft(numclick,raw_x, raw_y); if (numclick > 0) then begin mouseclick:= true; mouse_x:= raw_x DIV + 1; mouse_y:= raw_y DIV + 1; {nhan chuot ben ngoai bang} if ((mouse_x < x) or ( x+rong < mouse_x) or (mouse_y < y) or ( y+SoMucChon < mouse_y)) then BangChon:= -1 else {nhan chuot ben bang} for i:=0 to SoMucChon begin LamChimMucChon(i) ; if (mouse_y = y+i) then LamNoiMucChon(i); BangChon:=i; delay(50); { để kịp nhận thấy!} end; end; until (gophim=enter) or (gophim=esc) or mouseClick; end; Th©m nhËp trực tiếp vào nhớ cổng 3.1 Thâm nhập trực tiếp nhớ Turbo Pascal hỗ trợ thâm nhập trùc tiÕp vμo bé nhí C¶ bé nhí coi nh− mảng Kích thớc phần tử mảng (ô nhí) cã thĨ lμ byte, word (= byte) hay LongInt (= byte) BiÕn m¶ng Mem dïng ®Ĩ truy cËp ®Õn tõng byte bé nhí Biến mảng MemW dùng để truy cập theo Word Biến mảng MemL dùng để truy cập theo LongInt Cần rõ địa ô nhớ d−íi d¹ng Segment: offset VÝ dơ: Mem[$xxxx: $yyyy]: truy cËp byte nhớ địa $xxxx: $yyyy Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 257 Lập tr×nh b»ng Turbo Pascal MemW[$xxxx: $yyyy]: truy cËp byte nhớ (1 word) kể từ địa $xxxx: $yyyy MemL[$xxxx: $yyyy]: truy cËp byte bé nhí (1 LongInt) kể từ địa $xxxx: $yyyy Ví dụ Vùng nhớ mn hình l bắt dầu từ địa $B800:0000 Chế độ văn cần lu trữ 2000 (80 x 25) kí tự Mỗi kí tự chiếm byte, byte l mã ASCII, byte lại l thuộc tính hiển thị video (xem phần Unit Crt) Ta thâm nhập trực tiếp vo vùng nhớ ny để tăng tốc độ cho thao tác hiển thị mn hình Chơng trình dới thay ton kÝ tù trèng b»ng dÊu “*” var i: word; begin for i:=1 to 2000-1 if mem[$B800:i*2] = $20 then Mem[$B800:i*2]:= Ord('*'); end VÝ dơ Khi ta x©y dựng chơng trình có chứa lệnh lm thay đổi hiển thị mn hình ví dụ nh lm bảng chọn, thông báo yêu cầu l phải chép lu ton hay vùng mn hình bị thay đổi v cho hiển thị lại nguyên trạng ban đầu sau chơng trình ®· kÕt thóc Sư dơng phÐp th©m nhËp trùc tiÕp nhớ viết hai thủ tục đơn giản nh chơng trình sau uses crt; type one_screen = array[0 4000-1] of word; {80*25*2=2000} var old_src: one_screen; origMode: integer; {để lu lại mode mn hình trớc thay ®ỉi} procedure get_screen(var scr: one_screen); {truy cËp bé nhí mμn hình v chép lại ton mn hình tại} var i: word; begin for i:=0 to 4000-1 scr[i]:= memL[$B800:i]; end; procedure put_screen(var scr: one_screen); {truy cËp bé nhí mn hình v cho hiển thị mn hình lu} var i: word; begin Nguyễn Đình Hoá, Viện CNTT - §HQG Hμ néi 258 LËp tr×nh b»ng Turbo Pascal for i:=0 to 4000-1 memL[$B800:i]:= scr[i]; end; BEGIN origMode:= lastMode; {thay đổi mode hiển thị} TextBackGround(Red); Clrscr; gotoxy(10,5); Writeln(' Day la man hinh se luu lai !'); Writeln(' go ENTER de luu man hinh !!!'); readln; get_screen(old_src); TextMode(origMode); Clrscr; Writeln('Man hinh cu da duoc luu lai'); Writeln('Go ENTER de xem man hinh cu !!!'); Readln; put_screen(old_src); Readln; TextMode(origMode); END 3.2 Thâm nhập cổng Các thiết bị ngoại vi cắm vo máy tính giao tiếp với xử lí thông qua trung gian mét vïng nhí gäi lμ c¸c cỉng C¸ch truy cËp trùc tiÕp c¸c cỉng xt nhËp (I/O port) còng gièng nh− truy cËp trùc tiÕp bé nhí tr×nh by phần Mảng Port để truy cập cổng theo byte, Mảng PortW để truy cập cæng theo tõng Word Port[ i ]: truy cËp mét byte vùng nhớ cổng có địa chứa biÕn i PortW[ i ]: truy cËp mét Word vïng nhớ cổng có địa chứa biến i Thay đổi địa ny ta truy cập cổng thiết bị khác Chơng trình minh họa dới lm mn hình trôi liên tục từ phải sang trái cách thâm nhập trực tiếp vo cổng CRT program CuonManHinh; Nguyễn Đình Hoá, Viện CNTT - ĐHQG Hμ néi 259 LËp tr×nh b»ng Turbo Pascal uses crt; const CrtAddr = $3D4; var i: word; procedure ScrollLeft(num: byte); begin for i:= to num begin asm CLI end; {CLI = Clear Interrupt flag} PortW[CrtAddr]:= Hi(i) SHL + $0C; PortW[CrtAddr]:= Lo(i) SHL + $0D; asm STI end; Delay(50); {STI = Set Interrupt flag} end; end; BEGIN ScrollLeft(80); END Chơng trình thờng trú 4.1 Khái niệm Khi thi hnh chơng trình, hệ điều hnh dnh riêng khối nhớ để chứa mã lệnh v liệu chơng trình Lúc chơng trình kết thúc, DOS sÏ gäi hμm $4C - kÕt thóc tiÕn tr×nh v giải phóng vùng nhớ dnh riêng cho chơng trình, chép Command.com đè lên vùng ny Một cách thứ hai để kết thúc chơng trình l dùng hm Keep Sự khác biệt Keep v kết thúc bình thờng l DOS không giải phóng vùng nhớ dnh cho chơng trình, nghĩa l không chép Command.com đè lên vùng ny m chép vo phần trống khác Nh vậy, chơng trình nằm lại nhớ Chơng trình th−êng tró hay TSR- Terminate and Stay Resident - lμ chơng trình m kết thúc không bị xoá khỏi nhớ, lu lại chờ v thực chức công việc phục vụ cho chơng trình khác cần đến Ví dụ phần mỊm ®Ĩ chun bμn phÝm tõ gâ tiÕng Anh sang gõ đợc tiếng Việt l chơng trình thờng trú Nó chặn ngắt bn phím v thay vec tơ ngắt thông thờng thủ tục xử lí khác ®Ĩ gâ aa th× sÏ chun thμnh m· cđa â, gõ dd chuyển thnh mã đ, v.v Kĩ thuật lập trình thờng trú đòi hỏi phải kết hợp chặt chẽ với hệ thống, chặn v thay ®ỉi mét sè ng¾t ®Ĩ phơc vơ cho mơc ®Ých Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 260 Lập trình Turbo Pascal 4.2 Cách xây dựng chơng trình thờng trú 4.2.1 Các bớc Các bớc để xây dựng chơng trình thờng trú l: - Xây dựng thủ tục xử lí ngắt - Lu lại véc tơ ngắt m chơng trình chiếm dụng - Thiết đặt lại véc tơ ngắt để ứng với thủ tục ngắt - Phơc håi l¹i chóng kÕt thóc - T¹o phím nóng để kích hoạt, gỡ bỏ chơng trình 4.2.2 Các thủ tục hỗ trợ Có thể sử dụng ngắt $27 để kết thúc chơng trình v cho thờng tró Tuy nhiªn Unit Dos cđa Turbo Pascal cung cÊp cho chóng ta mét sè thđ tơc phơc vơ x©y dựng chơng trình thờng trú Trớc hết l hm Keep nói đến Keep(exitCode: word) ; Cho kết thúc chơng trình v lại thờng trú Mã thoát exitCode = l kết thúc bình thờng, exitCode = lμ tho¸t b»ng Ctrl+C, exitCode = l thoát chia cho Vậy chơng trình thờng trú phải có Keep(0) trớc từ khoá END Ngoi số thủ tục hỗ trợ lm việc vói véc tơ ngắt GetIntVec (IntNo: Byte; Vector: Pointer) ; Lu lại véc tơ ngắt số hiệu IntNo vo địa xác dịnh biến Vector SetIntVec (IntNo: Byte; Vector: Pointer); Đặt lại véc tơ ngắt số hiệu IntNo ứng với địa xác định biến Vector Toán tử lấy địa @ hay Addr() thờng đợc sử dụng để lấy địa thủ tục xử lí ngắt thủ tục xử lí ngắt phải có kiểu Interrupt Một điểm cần lu ý l chơng trình thờng trú biết ngắt có phải l gốc BIOS , DOS hay không chơng trình thờng trú khác thay thÕ nã råi ! 4.3 VÝ dơ minh ho¹ Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 261 Lập trình Turbo Pascal 4.3.1 Ví dụ Đầu tiên ta xét ví dụ đơn giản, lm chơng trình thờng trú chiếm ngắt số $05 l ngắt có chức in nội dung mn hình máy in Ngắt ny ứng với phím Print-screen Ta thay nã b»ng mét thđ tơc ng¾t míi, thùc hiƯn việc in kí tự #1 (khuôn mặt cời) gãc mμn h×nh program Smile1; {$M 1024,0,0} uses dos; procedure VietRaGocManHinh; interrupt; begin MemW[$B800:0]:=$0701; {07 lμ byte thuéc tÝnh, 01 lμ m· kÝ tù #1} end; BEGIN SetIntVec($00,saveInt00); {kh«i phơc ngắt chia cho 0} SetIntVec($05,@VietRaGocManHinh); keep(0); END Trong chơng trình cần lu ý điểm sau 1- Phải có thị biên dịch {$M 1024,0,0} để hạn chế vùng Heap Nhắc lại thị cho trình biên dịch phân bố nhớ {$M StackSize, HeapMin, HeapMax} có giá trị mặc định l {$M 16384, 0, 655360}, nghĩa l HeapMax đạt đến địa cao nhớ RAM Nếu HeapMax không đợc giơí hạn v dùng hm Keep để kết thúc chơng trình nhớ bị chiếm dụng hết đến byte cuối cùng, không chỗ để tái nạp lại Command.com kết thúc thi hnh chơng trình 2- Khai báo Interrupt l bắt buộc thủ tục ngắt, tức l thủ tục đợc gọi có ngắt xảy Trong chơng trình ny l thủ tục VietRaGocManHinh Lúc ny trình biên dịch sinh mã để cất giữ tạm thời nội dung tất ghi tr−íc gäi thđ tơc ng¾t vμ hoμn nguyên lại giá trị ghi sau thủ tục ngắt kết thúc Nếu thiếu khai báo ny, trình biên dịch coi thủ tục ngắt l thủ tục thông thờng nh thủ tục khác, không báo lỗi vo thời điểm dịch v chơng trình đổ vỡ 3- Lệnh SetIntVec($00, SaveInt00) để khôi phục lại ngắt $00 - "chia cho không" Chơng trình quan tâm lm no chiếm chỗ ngắt khác Nó viết đè lên giá trị gốc ban đầu ngắt $05 Không có cách no để khôi phục lại chức gốc phím Print-Screen ngoi việc tắt máy khởi động lại Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 262 Lập trình Turbo Pascal Chơng trình dới khắc phục nhợc điểm ny Nó lu lại địa chứa vec tơ ngắt $08 (l ngắt đồng hồ hệ thống) Sau thay địa thủ tục ngắt VietRaGocManHinh_2 Trong thủ tục ny, véc tơ ngắt $08 đợc đặt lại để trỏ đến thủ tục xử lí cũ l−u program Smile2; {$M 1024,0,0} uses dos; var SaveInt08: pointer; procedure VietRaGocManHinh_2; interrupt; begin Inline($9C/ {PUSHF } $FF/$1E/SaveInt08); {CALL FAR [SaveInt08]} MemW[$B800:0]:=$0701; {07 lμ byte thuéc tÝnh, 01 lμ m· kÝ tù #1} end; BEGIN GetIntVec($08, SaveInt08); SetIntVec($08,@VietRaGocManHinh_2); keep(0); END 4.3.2 Ví dụ Một chơng trình hẹn Ta thử xây dựng chơng trình thờng trú phức tạp hơn, có xử lí dòng lệnh Dòng lệnh Alarm n khởi động chơng trình v chờ n phút máy phát tiếng còi v dòng thông báo mn hình để nhắc l đến hẹn Trong thời gian chờ máy hoạt động bình thờng Chơng trình sử dụng ngắt $1C l nhịp đồng hồ cho ngời sử dụng Cứ đặn Tic ngắt ny đợc gọi lần Một giây ngắt ny đợc gọi khoảng 18.2 lần Ta chặn ngắt ny v thay thủ tục xử lí mới, tăng biến đếm CurrentTime lên đơn vị v so sánh với khoảng thời gian chờ ấn định Nếu vợt phát lệnh báo động Các bớc công việc mμ thđ tơc xư lÝ ph¶i lμm lμ - Phơc hồi vectơ ngắt $1C trả lại cho hệ thống - Lu vectơ ngắt bn phím, thay thủ tục xử lí l: phát còi liên tục, thông báo v đợi gõ phím F12 để kết thúc thật chơng trình program Alarm; {$M $1024,0,0} {cap bo nho $M Stacksize,heapmin,heapmax} uses crt,dos; const DefaultTime = 1; {Tham sè mỈc định, báo thức sau phút} Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 263 Lập trình Turbo Pascal Var CurrentTime: longint; Worktime: word; {khoảng thời gian đợi báo thức} KbdIntVec: procedure; {để lu địa chơng trình xử lí ngắt bn phím hệ thống} {$F+} { force Far call} procedure KeyClick; interrupt; Begin gotoXY(1,1); TextColor(Yellow); TextBackGround(Red); Write(' Over time ! - Press F12 to continue.'); While Port[$60] 88 Write(#7); { phát còi ch−a gâ F12(cã m· 88)®Ĩ chÊm døt} { Port[i] truy cËp cæng i=$60 lμ cæng bμn phÝm } SetIntVec($9,Addr(KbdIntVec)); Inline($9C); KbdIntVec; {gọi lại chơng trình xử lí ngắt bn phím cò} end; {$F-} {$F+} procedure TestTime; interrupt; begin Inc(CurrentTime); if (CurrentTime >= Round(workTime*60*18.2)) then begin SetIntVec($1C,Addr(KbdIntVec)); {phơc håi vecto ng¾t $1C cò} GetIntVec($9,Addr(KbdIntVec)); {l−u vecto ng¾t bμn phÝm} SetIntVec($9,Addr(KeyClick)); {ng¾t bn phím nối đến KeyClick} end; Inline($9C); KbdIntVec; {gọi lại chơng trình xử lí ngắt bn phím cũ } end; {$F-} procedure TestParam; {xư lý tham sè dßng lệnh = số phút đợi báo thức} var WorkTimeStr: String; i: byte; code: integer; begin WorktimeStr:=''; For i:=1 to ParamCount WorkTimeStr:= WorkTimeStr + ParamStr(i); Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 264 Lập trình Turbo Pascal Val(WorkTimeStr,WorkTime, code); if code then workTime:=DefaultTime; end; BEGIN TestParam; CurrentTime:=0; GetIntVec($1C,Addr(KbdIntVec)); {l−u vecto ng¾t $1C } SetIntVec($1C,Addr(TestTime)); {trá đến chơng trình xử lí testTime ta} keep(0); END Câu hỏi v bi tập Véc tơ ngắt l Chúng thực chức Để gọi trực tiếp thực ngắt từ chơng tình Pascal cần phải theo bớc nh no Tham số đầu vo đặt đâu, kết trả vể lấy đâu Vai trò kiểu ghi Registers Unit DOS l Tại lại đợc khai báo l kiểu ghi có cấu trúc thay đổi Thâm nhập hệ thống qua hỗ trợ Unit DOS có u nhợc điểm Nguyên lí chung để xây dựng chơng trình thờng trú l Khi no cần thâm nhập trực tiêp nhớ, cổng thiết bị Cách lm Thực hnh Lập hai thủ tục lu lại mn hình (ở chế độ văn bản) v khôi phục mn hình lu ứng dụng để hon thiện chơng trình bảng chọn: sau chọn bảng chọn biến v mn hình cũ đợc khôi phục lại Lập hai thủ tục lu lại phần mn hình (ở chế độ văn bản) nằm khung cửa sổ hình chữ nhật v khôi phục lại phần cửa sổ ứng dụng để hon thiện chơng trình bảng chọn: sau chọn bảng chọn biến v mn hình cũ đợc khôi phục lại Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 265 Lập trình Turbo Pascal TI liệu tham khảo Hong Kiếm (chủ biên), Tin học đại cơng nâng cao, Nxb Giáo dục, 1998 Quách Tuấn Ngọc, Ngôn ngữ lập trình Pascal, Nxb Giáo dục, 2000 Quách Tuấn Ngọc, Bi tập ngôn ngữ lập trình Pascal, Nxb Giáo dục, 2000 Schapers A., MĐo vμ thđ tht lËp tr×nh b»ng Turbo Pascal 5.5”, Nxb KHKT Hμ néi, 1996 Bïi ThÕ T©m, Vâ Văn Tuấn Dũng, Giáo trình tin học đại cơng, Nxb GTVT, Hμ néi, 1995 Koffman E B., “ Pascal- Problem Solving and Problem Design”, Addison-Wesley Pub Company, 1993 Catambay B., “The Pascal Programming Language”, Academic Press, 2001, http://www.pascal-central.com/ppl/ Nguyễn Đình Hoá, Viện CNTT - ĐHQG H nội 266 ... Viện CNTT - ĐHQG H nội Lập trình Turbo Pascal Phát triển chơng trình Pascal 2.1 Cấu trúc chơng trình Turbo Pascal Để cho dễ hiểu từ ta quy ớc trình by thnh phần cú pháp Pascal ta dùng cách nhấn... ngôn ngữ Pascal Hiện ngôn ngữ lập trình Pascal có nhiều biến thể công ty khác bổ xung hon thiện thêm: TURBO PASCAL cña Borland, QUICK PASCAL cña Microsoft, ANSI PASCAL Nãi riêng Turbo Pascal đợc... chuẩn 1.6 Câu lệnh Phát triển chơng trình Pascal 2.1 Cấu trúc chơng trình Turbo Pascal 2.2 Các bớc xây dựng chơng trình Môi trờng phát triển tích hợp Turbo Pascal 3.1 Các công cụ phát triển 3.2

Ngày đăng: 18/08/2019, 21:38

TỪ KHÓA LIÊN QUAN