Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
506,5 KB
Nội dung
Tổ Tin Học - Trường CĐSP Bến Tre Giaùo trình Chủ biên: Võ Thanh Ân Hiệu đính bổ sung: Vương Đức Bình Bến Tre, 5-2008 Trang Tổ Tin Học - Trường CĐSP Bến Tre Lời ngỏ cho lần hiệu đính Tài liệu viết lần đầu giảng viên Võ Thanh Ân, theo yêu cầu Tổ môn CNTT, vào tháng năm 2004 Tài liệu viết trình bày mạch lạc, gọn nhẹ, dễ hiểu dùng để dạy cho lớp K2 CNTT Cho đến nhận thấy cần có số điều chỉnh bổ sung nhằm thích hợp với công tác giảng dạy như: Turbo Pascal, trình bày giảng viên Võ Thanh Ân, không chạy tốt Windows XP Thay vào Borland Pascal chạy ổn định Dù Pascal gần ngôn ngữ bị phê phán nhiều giới lập trình viên yếu Chủ yếu không cho phép tải cấu trúc liệu hàm Dù có so với Borland C++ vấn đề lập trình hướng đối tượng, song tính khúc chiết - mạch lạc sáng cú pháp ngôn ngữ, ngôn ngữ tốt để dạy cho người bắt đầu học lập trình Về mặt sư phạm có lẽ khó có ngôn ngữ tốt Cần nói tới Free Pascal, phiên miễn phí hoàn toàn, giữ lại hầu hết cú pháp, từ khóa, thao tác Borland Pascal lại chạy ổn định Windows XP Kinh nghiệm cho thấy sinh viên Khoa năm qua, công tác tuyển sinh, có hạ thấp yêu cầu đầu vào Do buộc phải xem xét lại giáo trình viết để giúp cho người học - xuất phát điểm thấp – đạt chất lượng đầu theo yêu cầu Với lí đó, xem xét lại giáo trình giảng viên Võ Thanh Ân không làm việc Tổ môn CNTT, định hiệu đính lại tài liệu Trên tinh thần tôn trọng tác giả ban đầu tài liệu này, chỗ có thêm vào hiệu đính dùng màu chữ xanh dương đậm với font size nhỏ để phân biệt Tổ môn CNTT cảm ơn giảng viên Võ Thanh Ân cho phép tiếp tục dùng giáo trình mong giáo trình hiệu đính, phụ lục giúp cho sinh viên học tập hiệu Vương Đức Bình (Tháng 01/2008) Trang Tổ Tin Học - Trường CĐSP Bến Tre Mục lục ( Phần 1) Chương I: GIỚI THIỆU NGÔN NGỮ PASCAL VÀ BORLAND PASCAL 7.0 I.GIỚI THIỆU NGÔN NGỮ PASCAL .5 1.Ngôn Ngữ PASCAL 2.TURBO PASCAL II.SỬ DỤNG PASCAL 7.0 1.Khởi Động Turbo Pascal .6 2.Các Thao Tác Thường Sử Dụng Trên Turbo Pascal III.CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ PASCAL 1.Bộ Chữ Viết – Từ Khoá – Tên 2.Hằng – Kiểu – Biến 3.Biểu Thức – Dấu Chấm Phẩy – Lời Giải Thích 10 4.Cấu Trúc Của Một Chương Trình Pascal 11 Chương II: CÁC KIỂU VÔ HƯỚNG CHUẨN VÀ CÁC CÂU LỆNH ĐƠN 12 I.CÁC KIỂU VÔ HƯỚNG CHUẨN .12 1.Các Kiểu Vô Hướng Chuẩn (Standard scalar types) 12 2.Một Số Phép Toán Trên Các Kiểu 12 II.CÂU LỆNH 14 1.Khái Niệm Về Một Câu Lệnh 14 2.Một Số Lệnh Đơn 15 Chương III: CÁC LỆNH CÓ CẤU TRÚC 18 I.LỆNH CẤU TRÚC RẼ NHÁNH 18 1.Dạng Không Đầy Đủ 18 2.Dạng Đầy Đủ 18 II.LỆNH CẤU TRÚC LỰA CHỌN 19 1.Dạng Không Đầy Đủ 19 2.Dạng Đầy Đủ .19 III.CÁC LỆNH VÒNG LẶP 20 1.Lệnh Lặp Với Số Lần Xác Định 20 2.Lệnh Lặp Với Số Lần Lặp Không Xác Định 22 Chương IV: CHƯƠNG TRÌNH CON 24 I.KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON 24 II.HÀM (FUNCTION) 25 III.THỦ TỤC (PROCEDURE) 26 IV.LỜI GỌI CHƯƠNG TRÌNH CON VÀ VẤN ĐỀ TRUYỀN THAM SỐ 27 V.HOẠT ĐỘNG CỦA CHƯƠNG TRÌNH CON KHI ĐƯỢC GỌI VÀ SỰ BỐ TRÍ BIẾN 29 VI.VẤN ĐỀ TRUYỀN THAM SỐ KHI GỌI CHƯƠNG TRÌNH CON 29 VII.TÍNH ĐỆ QUI CỦA CHƯƠNG TRÌNH CON 32 Chương 5: UNIT 36 I.KHÁI NIỆM VỀ UNIT 36 1.Khái Niệm Về Unit 36 2.Các Unit Chuẩn 36 II.THIẾT LẬP UNIT 37 1.Các Bước Tạo Một Unit 37 Trang Tổ Tin Học - Trường CĐSP Bến Tre 2.Ví dụ ứng dụng 38 III.TẬP TIN TURBO.TPL .39 Trang Tổ Tin Học - Trường CĐSP Bến Tre Chương I: GIỚI THIỆU NGÔN NGỮ PASCAL VÀ BORLAND PASCAL 7.0 I GIỚI THIỆU NGÔN NGỮ PASCAL Ngôn Ngữ PASCAL Vào đầu năm 1970 nhu cầu học tập sinh viên, giáo sư Niklaus Writh - Trường Đại Học Kỹ Thuật Zurich - Thụy Sĩ sáng tác ngôn ngữ lập trình cấp cao cho công tác giảng dạy sinh viên Ngôn ngữ đặt tên PASCAL để tưởng nhớ đến nhà toán học người Pháp Blaise Pascal Pascal ngôn ngữ lập trình có cấu trúc thể phương diện - Về mặt liệu: Ngoài kiểu liệu đơn giản có kiểu liệu có cấu trúc Ta xây dựng kiểu liệu phức tạp từ kiểu liệu có - Về mặt câu lệnh: Từ câu lệnh đơn giản lệnh có cấu trúc ta xây dựng câu lệnh hợp thành - Về mặt chương trình: Một chương trình chia làm nhiều chương trình TURBO PASCAL Khi đời, Standart Pascal ngôn ngữ đơn giản, dùng để giảng dạy học tập, ưu điểm phát huy trở thành ngôn ngữ mạnh Từ Pascal chuẩn ban đầu, nhiều công ty phần mềm cải tiến với nhiều thêm bớt khác TURBO PASCAL sản phẩm hãng Borland dùng phổ biến giới ưu điểm như: tốc độ nhanh, cải tiến so với Pascal chuẩn phù hợp với yêu cầu người dùng TURBO PASCAL 4.0 trở có cải tiến quan trọng đưa khái niệm Unit để dịch sẵn Module đĩa, làm cho việc lập trình trở nên ngắn gọn, dễ dàng, chương trình viết dễ hiểu Từ phiên 5.5 (ra đời năm 1989) trở đi, Turbo Pascal có kiểu liệu hoàn toàn kiểu Object cho phép đưa mã lệnh xen kẽ với liệu Ngoài thư viện đồ hoạ phong phú với nhiều tính mạnh, ngôn ngữ lập trình cấp cao Delphi sử dụng cú pháp tương tự Turbo Pascal Turbo Pascal 7.0 phiên cuối Borland Sau phiên hãng Borland chuyển sang Pascal For Windows thời gian ngắn sản xuất DELPHI Turbo Pascal 7.0 hỗ trợ mạnh mẽ lập trình hướng đối tượng có nhược điểm bị lỗi “Devide by zero” tất máy có xung nhịp lớn 300 MHz Giải vấn đề có hai phương án: a Cập nhật file TURBO.TPL thư mục \BP\BIN b Sử dụng Free Pascal.1 Ngoài nên lưu ý Turbo Pascal chạy chế độ thực (real mode) nên chạy Windows XP hay khởi động lại máy Nên chạy Borland Pascal Khi Windows tạo môi trường DOS giả lập chạy chế độ đa nhiệm tiện lợi Gói phần mềm download miễn phí từ Internet (từ khóa: Free Pascal) hỏi chép từ Tổ môn CNTT Trang Tổ Tin Học - Trường CĐSP Bến Tre II SỬ DỤNG PASCAL 7.0 Khởi Động Turbo Pascal Nếu máy tính cài đặt Turbo Pascal đĩa, ta khởi động chúng sau (Nếu máy tính chưa có, phải cài đặt Turbo Pascal sau thực thi được) - Từ MS-DOS: Đảm bảo thư mục hành vị trí cài đặt (hoặc dùng lệnh PATH) Turbo Pascal Ta đánh vào TURBO Enter - Từ Windows: Ta nên giả lập MS-DOS Mode cho tập tin TURBO.EXE Shortcut nó, không ta thực thi TURBO PASCAL chương trình thoát khỏi Windows, trở MS-DOS Sau thoát Turbo Pascal ta phải đánh lệnh EXIT để khởi động lại Windows Cách giả lập sau: · Nhắp chuột phải lên tập tin TURBO.EXE Shortcut nó, chọn Properties · Chọn thẻ Program đánh check hình sau Click vào chọn hình Chọn OK hộp thoại, sau khởi động Turbo Pascal, hình soạn thảo sau khởi động TURBO PASCAL xuất Trang Tổ Tin Học - Trường CĐSP Bến Tre Cài đặt sử dụng Borland Pascal 7.0: Gói cài đặt Borland Pascal thường đặt thư mục BP70 Mở thư mục chạy file cài đặt INSTALL.EXE Làm theo hướng dẫn trình cài đặt Thông thường sau cài đặt xong, chương trình đặt C:\BP Hãy vào C:\BP\BIN để cập nhật lại file Turbo.tpl (Chép đè file tên thư mục \BP70\Huongdan\ lên file này) Thay chạy TURBO PASCAL (File thực thi: BP\BIN\Turbo.exe) tạo Shorcut chạy BORLAND PASCAL (File thực thi: BP\BIN\BP.exe) Các thao tác sử dụng Borland Pascal hoàn toàn giống với thao tác Turbo Pascal nói Các Thao Tác Thường Sử Dụng Trên Turbo Pascal Khi ta muốn tạo mở tập tin có đĩa ta dùng phím F3 Sau đưa vào tên vị trí tập tin Nếu tập tin tồn Turbo Pascal mở nội dung lên cho ta xem, tên tập tin chưa có Turbo Pascal tạo tập tin (với tên mà ta định) Khi muốn lưu lại tập tin ta dùng phím F2 Trước thoát khỏi chương trình, ta nên lưu tập tin lại, chưa lưu chương trình hỏi ta có lưu tập tin lại hay không Nếu ta chọn Yes (ấn phím Y) chương trình lưu lại, chọn No (ấn phím N)chương trình không lưu Một số phím thông dụng TURBO PASCAL 7.0 Biểu tượng Home End Pg Up Pg Down Del Back Insert F1 F2 F3 F4 F5 F6 F7 F8 F9 Tổ hợp Tên phím Enter Up Down Left Right Home End Page Up Page Down Delete BackSpace Insert F1 F2 F3 F4 F5 F6 F7 F8 F9 Alt + F9 Diễn giải Đưa trỏ xuống dòng Đưa trỏ lên dòng Đưa trỏ xuống dòng Đưa trỏ qua trái ký tư Đưa trỏ qua phải ký tự Đưa trỏ đầu dòng Đưa trỏ cuối dòng Lên trang hình Xuống trang hình Xoá ký tự vị trí trỏ Xoá ký tự trước trỏ Thay đổi chế độ viết xen hay viết chồng Gọi chương trình giúp đở Lưu tập tin lại Tạo mở tập tin Thực thi chương trình đến dòng chứa trỏ Phóng lớn cửa sổ Chuyển đổi cửa sổ Chạy dòng lệnh (hàm xem lệnh) Chạy dòng lệnh đơn Kiểm tra lỗi chương trình Biên dịch chương trình Trang Tổ Tin Học - Trường CĐSP Bến Tre Tổ hợp Tổ hợp Tổ hợp Tổ hợp Tổ hợp Tổ hợp Tổ hợp Tổ hợp Ctrl + F9 Ctrl + N Ctrl + Y Ctrl + K + B Ctrl + K + K Ctrl + K + C Ctrl + K + V Ctrl + K + Y Chạy chương trình Thêm dòng trước trỏ Xoá dòng trỏ Đánh dấu đầu khối Đánh dấu cuối khối Sao chép khối Di chuyển khối Xoá khối Trong Borland Pascal thao tác khối đơn giản dễ sau: + Đánh dấu khối: SHIFT + (phím mũi tên) + Copy khối vào clipboard: CTRL+ Ins (phím Insert) + Dán khối (đã copy vào clipboard) vào vị trí mới: SHIFT+ Ins Tổ hợp Ctrl + K + W Tổ hợp Ctrl + K + R Tổ hợp Tổ hợp Tổ hợp Ctrl + K + H Ctrl + F4 Alt + X Ghi khối lên đĩa thành tập tin (nội dung tập tin khối chọn) Xen nội dung tập tin (từ đĩa) vào sau vị trí trỏ Tắt/Mở đánh dấu khối Kiểm tra giá trị biến chạy chương trình Thoát khỏi chương trình III CÁC THÀNH PHẦN CƠ BẢN CỦA NGÔN NGỮ PASCAL Bộ Chữ Viết – Từ Khoá – Tên a Bộ chữ viết Bộ chữ ngôn ngữ Pascal gồm: · 26 chữ la tinh lớn: A, B, C… Z · 26 chữ la tinh nhỏ: a, b, c, … z · Dấu gạch _ (đánh vào cách kết hợp phím Shift với dấu trừ) · Bộ chữ số thập phân: 0, 1, 2, 3, 4, 5, 6, 7, 8, · Các ký hiệu toán học: +, -, *, /, =, , (, ) · Các ký hiệu đặc biệt: , : ; [ ] ? % @ \ | ! # $ { } · Dấu khoảng cách (khoảng trắng – Space) b Từ khoá Các từ khoá từ dành riêng (reserved words) Pascal mà người lập trình sử dụng chúng chương trình để thiết kế chương trình Không dùng từ khoá để đặt cho tên riêng tên biến, tên kiểu, tên hàm… Một số từ khoá Pascal gồm: Absolute And Array Begin Case Const External File For Forward Function Goto Mod Nil Not Object Of Or Trang Shr String Then To Type Unit Tổ Tin Học - Trường CĐSP Bến Tre Constructor Desstructot Div Do Downto Else End If Implementation In Inline Interface Interrupt Label Packed Procedure Program Record Repeat Set Shl Until Uses Var Virtual While With Xor c Tên Tên hay gọi danh biểu (identifier) dùng để đặt cho tên chương trình, hằng, kiểu, biến, chương trình con…tên chia thành loại - Tên chuẩn PASCAL đặt trước, chẳng hạn hàm số SIN, COS, LN, … số PI, kiểu INTEGER, BYTE, REAL… Tên người dùng tự đặt Dùng chữ cái, chữ số dấu gạch để đặt tên, phải tuân theo qui tắc: · Bắt đầu chữ “_” sau chữ chữ số · Lưu ý: Không có khoảng trống tên Không trùng với từ khoá Độ dài tối đa tên 127 ký tự, nhiên cần đặt cho tên gọn có ý nghĩa Pascal không bắt lỗi việc đặt tên trùng với tên chuẩn, ý nghĩa tên chuẩn không giá trị Pascal không phân biệt chữ hoa chữ thường (case insensitive) từ khóa, tên chuẩn hay tên Ví dụ “BEGIN” hay “Begin” hay “BeGin” Tuy nhiên sinh viên nên tập thói quen viết cách thống tên toàn chương trình Điều giúp bạn tránh nhầm lẫn gây tốn chuyển sang lập trình ngôn ngữ có phân biệt chữ hoa chữ thường (case sensitive) ngôn ngữ C Hằng – Kiểu – Biến a Hằng (Constant) Hằng đại lượng không đổi trình thực chương trình Có hai loại chuẩn người dùng định nghĩa - Hằng chuẩn Pascal định sẵn, ví dụ số PI, số màu RED=4,… Người sử dụng không cần định nghĩa lại thấy không cần thiết Các Pascal định nghĩa sẵn Unit Cần tham khảo hướng dẫn (help) Unit để biết Unit có định nghĩa - Hằng người dùng định nghĩa thông qua việc khai báo Cú pháp: CONST = ; [ = ;] Ví dụ: Const A = 50; Ch = ‘K’; Trang Tổ Tin Học - Trường CĐSP Bến Tre D = true; b Kiểu Một kiểu liệu tập hợp giá trị mà biến thuộc kiểu nhận tập hợp phép toán áp dụng giá trị Có hai loại kiểu kiểu chuẩn kiểu người dùng định nghĩa - Kiểu chuẩn kiểu Pascal định nghĩa sẵn: REAL, INTEGER, CHAR… Kiểu người lập trình định nghĩa thông qua việc khai báo kiểu Cú pháp: TYPE Ví dụ: TYPE = ; [ = ;] NguyenDuong = MaxInt; MaTran = [1 10,1 10] of Integer; c Biến Biến ô nhớ nhớ máy tính, giá trị biến thay đổi trình thực chương trình, biến giải phóng (thu hồi ô nhớ) chương trình kết thúc Chương trình quản lý biến thông qua tên biến biến tương ứng với kiểu liệu định Biến trước sử dụng phải khai báo Cú pháp: VAR Ví dụ: VAR []: ; [[]: ;] a, b, c: Integer; X, Y: Real; I, J: NguyenDuong; {Đã định nghĩa trước} Biểu Thức – Dấu Chấm Phẩy – Lời Giải Thích a Biểu thức Là phần câu lệnh bao gồm hằng, biến, hàm liên kết với phép toán dấu ngoặc đơn ( ) Ví dụ: (-b + sqrt(delta))/(2*a) Thứ tự thực phép toán biểu thức sau: o Các thành phần cặp ngoặc thực trước tới thành phần cặp ngoặc phía o Các phép toán nhân (*) chia (/) (có mức ưu tiên) thực trước so với phép toán cộng (+) trừ (-) (có mức ưu tiên) Ví dụ (x*y –z) phép nhân thực trước phép trừ o Nếu hai phép toán liên tiếp có mức ưu tiên thứ tự thực từ trái qua phải Ví dụ (x*y/z) phép nhân thực trước.2 Lưu ý: Trong lập trình hai biểu thức (x*y/z) (x/z*y) cho kết Trang 10 Tổ Tin Học - Trường CĐSP Bến Tre Begin Clrscr; Repeat Write(‘Nhập bán kính: ’); Readln(BanKinh); Writeln(‘Diện tích hinh tron tuong ung: ‘ ,DT(Bankinh):0:2); Writeln; Write(‘Tiếp tục (C/K)? ’); Repeat ch:=readkey; Until Upcase(ch) in [‘C’,’K’]; Until UpCase(Ch) = ‘K’; {Lưu ý: ‘K’ in hoa} End Ví dụ 2: Program TinhGiaithua; USES CRT; Var Num:longint; Ch:char; X,Y:byte; { -} Function GiaiThua(m: longint): longint; Var Tam, Dem:Longint; BEGIN IF (M=0); Writeln(M,’! = ’,GiaiThua(Num)); REPEAT Write(‘Tinh nua khong ? (C/K) :’); CH:=READKEY; UNTIL Upcase(Ch) in [‘C’,’K’]; Writeln(Ch); UNTIL Upcase(Ch)=’K’; Readln END III THỦ TỤC (PROCEDURE) Cấu trúc thủ tục sau: PROCEDURE (:[;: ]): ; Trang 26 (Header) Tổ Tin Học - Trường CĐSP Bến Tre [VAR :[;: ] Khai báo biến cục có BEGIN Thân tục thủ END; Như cấu trúc thủ tục tương tự cấu trúc hàm Chỉ có hai điều khác: - Header khóa Procedure thay Function - Không có câu lệnh gán thân Procedure Ví dụ: Thủ tục INSO sau in số từ đến giá trị biến truyền vào Với n tham số thực tế, So tham số hình thức Program TEST; Var n: Integer; { -} Procedure INSO(So: Integer); Var i: Integer; Begin For i := to So Write( i:10 ); End; { Chương trình } Begin Write(‘Nhập số lớn không: ’); Readln(n); INSO( n ); Readln; End IV LỜI GỌI CHƯƠNG TRÌNH CON VÀ VẤN ĐỀ TRUYỀN THAM SỐ Một chương trình gồm chương trình nhiều chương trình Kèm theo biến, tham số khai báo vị trí khác chương trình Khả từ vị trí chương trình “nhìn thấy” chương trình con, biến khai báo quan trọng Mặt khác làm việc theo nhóm, chương trình con, modune khác chương trình nhiều người, nhiều nhóm lập trình khác thực Khi khả xảy nhóm khác dùng tên biến, tên hàm, tên thủ tục cho Trang 27 Tổ Tin Học - Trường CĐSP Bến Tre mục đích khác lớn Vì khả “nhìn thấy”, chương trình cần có chế cấu trúc cho “che khuất” biến cần thiết Phần sau đây, nhằm mục đích đó, nghiên cứu khái niệm liên quan đến “tầm vực “ biến chương trình (con) hiệu ứng lề (side effect) xảy KHỐI (block): Một khối Header (PROGRAM | FUNCTION | PROCEDURE) khối từ khóa END (END END;) thân chương trình/chương trình tương ứng Minh họa: PROGRAM ProgName; VAR a,b: type1; x:type2 PROCEDURE Proc1(t,h:type1; Var k:type2); VAR x,y Begin …… …… End; PROCEDURE Proc2 Var q FUNCTION func1(r:type): type; Var x Begin …… …… End; BEGIN …… …… END; BEGIN …… …… END Trong minh họa ta có khối ứng với chương trình chính, khối ứng với Procedure Proc1, Procedure Proc2, Function func1, Proc1 Proc2 hai khối cấp, func1 khối khối Proc2 TẦM VỰC: Tầm vực biến hay chương trình phạm vi mà biến chương trình nhìn thấy chương trình (ie: gọi biến Trang 28 Tổ Tin Học - Trường CĐSP Bến Tre chương trình đó) Tầm vực biến hay chương trình chỗ khai báo khối hết khối mà khai báo đó, kể khối trừ khối có khai báo lại biến chương trình đó.8 Theo qui định trên, Và áp dụng cho hình minh họa trước ta thấy: - Các biến a,b biến toàn cục gọi nới đâu chương trình - Biến x chương trình gọi đâu chương trình trừ PROCEDURE Proc1 FUNCTION func1vì procedure/function có khai báo lại biến x Trong thân procedure/function gọi x ta gọi đến biến x cục biến x toàn cục - Các biến t,h,k y gọi Proc1 mà - Biến x gọi Proc1 biến cục riêng mà - Biến q gọi Proc2 func1 mà Biến r gọi Func1 mà Biến x gọi func1 biến cục riêng func1, không liên quan đến biến x khai báo chương trình Proc1 - Procedure Proc1 gọi Proc2, Func1 chương trình Trong Procedure Proc1 dĩ nhiên, theo qui định này, gọi (Đây trường hợp gọi đệ qui mà ta nghiên cứu sau) - Proc2 gọi chương trình chính, Func1 Proc1 gọi Proc2 - Func1 gọi bới Proc2 - Proc1 chương trình gọi Func1 - Có ngoại lệ: Chương trình gọi V HOẠT ĐỘNG CỦA CHƯƠNG TRÌNH CON KHI ĐƯỢC GỌI VÀ SỰ BỐ TRÍ BIẾN - Khi chương trình chương trình gọi biến, “tên” chương trình bố trí vùng nhớ gọi STACK Khi chương trình gọi biến toàn cục bố trí vào stack tồn lúc chấm dứt chương trình Khi chương trình gọi biến khai báo tham số sau từ khóa VAR (của nó) bố trí vào stack giải phóng chương trình chấm dứt Điều có lợi cho phép ta sử dụng vùng nhớ hợp lí Người ta dùng biến toàn cục tốt để tránh lỗi (trong thời gian chạy) làm tràn stack (Stack overflow error) VI VẤN ĐỀ TRUYỀN THAM SỐ KHI GỌI CHƯƠNG TRÌNH CON - Khi gọi chương trình (thủ tục hay hàm) ta phải theo qui định sau đây: · - Nếu chương trình có qui định tham số phải truyền giá trị biến cho tham số · - Phải truyền đủ số tham số.9 · - Phải truyền kiểu liệu theo thứ tự tham số khai báo Để hiểu rõ cách Pascal xử lí việc truyền tham số cần xem qua ví dụ sau đây: Program ParameterPassing; Var a,b:byte; c:integer; Qui định tầm vực qui định riêng ngôn ngữ Mỗi học ngôn ngữ sinh viên cần tham khảo qui định vê tầm vực riêng ngôn ngữ Có điều khó chịu Pascal cho phép “quá tải” tham số thủ tục “bản thân” thủ tục Write, Writeln Chúng ta gọi Writeln(‘Mot tham so’) hay Writeln(‘Tham so thu nhat’,’Tham so thu hai’) điều lại không cho phép chương trình viết bới người dùng! Trang 29 Tổ Tin Học - Trường CĐSP Bến Tre { } Procedure TestVar (x,y,z: byte; Var t: integer); Var d: byte; Begin D:=4; {1} X:=X+D; B:=B+X; T:=T+D; {2} Writeln(‘Ben thu tuc:’); Writeln(‘A=’,a, ‘B=’,b,’C=’,c,’D=’,d,’X=’,x,’Y=’,y,’Z=’,z,’T=’,t); End; { } BEGIN A:=3; B:=5; C:=8; Writeln(‘Truoc goi thu tuc:’); Writeln(‘A=’,a, ‘ B=’,b,’ C=’,c); TestVar(a,5,c,c); Writeln(‘Sau goi thu tuc:’); Writeln(‘A=’,a, ‘ B=’,b,’ C=’,c); Readln; END - Quá trình chạy chương trình diễn biến nhớ sau: - * Trước gọi thủ tục: Cấp vùng nhớ cho biến toàn cục a,b,c STACK · A=3 B=5 C=8 · Kết xuất chương trình: Truoc goi thu tuc: A=3 B=5 C=8 - * Trong thực thủ tục: · Cấp vùng nhớ cho biến cục x,y,z,t,d · Chuyển giao tham số: TestVar(a,5,c,c); Các tham số x,y,z gọi tham trị Việc chuyển giao giá trị cho tham số thực trị biến, giá trị chuyển giao COPY vào ô nhớ tương ứng biến Các ô nhớ ứng với x,y,z có giá trị 3,5,8 Tham số T khai báo sau từ khóa VAR gọi tham biến Việc chuyển giao tham số thực biến Ở ta chuyển giao biến C cho vị trí tham số T Pascal không copy giá trị biến C vào ô nhớ ứng với T mà tạo “con trỏ” để trỏ C, thao tác T thực ô nhớ C Biến D khởi tạo (lần đầu) Trang 30 Tổ Tin Học - Trường CĐSP Bến Tre STACK · A=3 y=5 B=5 z=8 C=8 T= (Trỏ C) x=3 d=0 · Sau dòng lệnh {1} {2} thủ tục nhớ là: STACK · A=3 Y=5 B=5+(3+4) z=8 C=8+4 T= (Trỏ C) x=3+4 d=4 · Kết xuất chương trình chạy đến câu lệnh cuối thủ tục là: Truoc goi thu tuc: A=3 B=5 C=8 Ben thu tuc: A=3 B=12 C=12 D=4 X=7 Y=5 Z=8 T=12 - * Sau thực thủ tục: Thu hồi vùng nhớ cấp cho thủ tục: STACK · A=3 B=5+(3+4) C=8+4 · Kết xuất chương trình chạy đến câu lệnh cuối là: Truoc goi thu tuc: A=3 B=5 C=8 Ben thu tuc: A=3 B=12 C=12 D=4 X=7 Y=5 Z=8 T=12 Sau goi thu tuc: A=3 B=12 C=12 ♥ Mấy vấn đề cần nhớ: Đối với tham trị chuyển giao trị biến Giá trị chuyển giao COPY vào nội dung ô nhớ biến tham trị Đối với tham biến chuyển giao biến Một trỏ trỏ biến chuyển giao, thao tác thực biến chuyển giao ♥ Và kết luận quan trọng: Sự thay đổi tham biến bên thủ tục làm thay đổi giá trị biến chuyển giao (Trường hợp biến C) Điều không xảy tham trị (Trường hợp biến A, thay đổi biến X không ảnh hưởng đến nội dung ô nhớ A) Sự thay đổi biến chuyển giao trường hợp tham biến gọi hiệu ứng lề (Side effect) Người lập trình phải lưu ý để phòng ngừa hiệu ứng lề mong muốn Trang 31 Tổ Tin Học - Trường CĐSP Bến Tre VII TÍNH ĐỆ QUI CỦA CHƯƠNG TRÌNH CON Như nói chương trình Pascal gọi Một lời gọi gọi lời gọi đệ qui (recursion) Gọi đệ qui kỹ thuật lập trình quan trọng thường ngắn gọn thường … phù hợp với suy nghĩ tự nhiên nhiều cách giải toán Thậm chí nhiều toán dùng đệ qui Tuy nhiên xét tốc độ giải thuật tối ưu không gian nhớ đệ qui thường giải pháp tốt Người ta thường cố gắng khắc phục đệ qui cách dùng vòng lặp sử dụng stack công việc không dễ dàng Ví dụ 1: Định nghĩa giai thừa số nguyên không âm m sau: if (m=0) or (m=1) m! = m*(m-1)! if (m ≥ 2) Lập trình để tính giai thừa số nguyên không âm nhập từ bàn phím Cách 1: Dùng đệ qui Function GT(m: Integer): Longint; Begin If ( m = ) or ( m = ) then GT := Else GT := m * GT( m-1 ); End; Rõ ràng cách viết đệ qui “phù hợp cách tự nhiên” với định nghĩa giai thừa Việc thực thi lời gọi đệ qui diễn tương tự sau: Ví dụ ta truyền vào giá trị m = 4, tức gọi GT(4) GT(4) m = Tính * GT(4-1) gọi GT(3) GT(3) m = Tính * GT(3-1) gọi GT(2) GT(2) m = Tính * GT(2-1) gọi GT(1) GT(1) m = Gán GT(1):=1 Cuối trình “tính ngược” cho phép trả giá trị GT(4): GT(4) * (3 * (2 * GT(1))) Cách 2: Dùng vòng lặp Function GiaiThua(m: longint): longint; Var Tam, Dem:Longint; BEGIN IF (M ‘,Y); END; { } Procedure Doi(N:byte; A,B,C:Cot); {Dời N đĩa từ cọc A sang cọc C lấy cọc B làm trung gian} BEGIN IF (N>0) THEN Begin Doi(N-1,A,C,B); {Dời N-1 đĩa từ cọc A sang cọc B lấy cọc C làm trung gian} Chuyen(A,C); Doi(N-1,B,A,C); {Dời N-1 đĩa từ cọc B sang cọc C lấy cọc A làm trung gian} End; END; { } BEGIN Clrscr; Write(‘Cho biet so dia :’); Readln(Sodia); Writeln(‘Cac buoc thuc hien:’); Doi(Sodia,’A’,’B’,’C’); Writeln; Writeln(‘Thuc hien xong!’); READLN; END Nếu áp dụng chương trình cho trường hợp N=3 ta có trình gọi đệ qui sau: Doi(1,A,B,C) Doi(2,A,C,B) Doi(3,A,B,C) Doi(0,A,C,B) Chuyen(A,C) Doi(0,B,A,C) Chuyen(A,B) Doi(1,C,A,B) Doi(0,C,B,A) Chuyen(C,B) Doi(0,A,C,B) Doi(1,B,C,A) Doi(0,B,A,C) Chuyen(B,A) Doi(0,C,B,A) Chuyen(A,C) Doi(2,B,A,C) Chuyen(B,C) Doi(1,A,B,C) Doi(0,A,C,B) Chuyen(A,C) Doi(0,B,A,C) Ví dụ cho thấy việc kết xuất câu lệnh Chuyen(X,Y) xảy toàn lời gọi đệ qui thực cho thấy thứ tự lời gọi đệ qui lần cuối Nhận xét quan trọng bạn viết thủ tục đệ qui lẽ bạn cần phải hình dung trước thứ tự kết xuất lời gọi đệ qui có nhiều nhánh Trang 35 Tổ Tin Học - Trường CĐSP Bến Tre Chương 5: UNIT I KHÁI NIỆM VỀ UNIT Khái Niệm Về Unit Việc tạo chương trình chương trình làm cho việc lập trình đỡ vất vã nhiều Tuy nhiên, chương trình có tác dụng chương trình chứa chúng mà thôi, chương trình khác muốn sử dụng chương trình bắt buộc phải viết lại chúng, thời gian Để khắc phục, người ta gom chương trình thường sử dụng thành module độc lập biên dịch sẵn đĩa Sau đó, chương trình sử dụng lại chương trình mà không cần phải viết lại chúng Các module gọi UNIT Khái niệm Unit tạo từ version 4.0 Turbo Pascal Có hai loại UNIT Unit chuẩn Pascal tạo Unit người lập trình tự tạo để phục vụ riêng cho Các Unit Chuẩn - a Giới thiệu số Unit chuẩn Unit CRT: Gồm hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ hình văn (TEXT mode) - Unit PRINTER: Gồm hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ in ấn qua cổng LPT1 (Connector DB25) - Unit GRAPH: Gồm hằng, kiểu, biến, hàm, thủ tục liên quan đến chế độ đồ họa - Unit DOS: Gồm hằng, kiểu, biến, hàm, thủ tục liên quan đến việc xử lí trực tiếp ghi, ngắt lời gọi đến hàm chức hệ điều hành MS-DOS Unit OVERLAY: Gồm hằng, kiểu, biến, hàm, thủ tục liên quan đến việc bố trí đoạn mã thực thi truy xuất đĩa (nạp/ nhã) thay đặt hết lúc vào nhớ chạy chương trình - - Các Unit khác: SYSTEM, TURBO3, GRAPH 3… Unit phiên 3.0 sử dụng Khi muốn sử dụng Unit ta phải khai báo tên Unit đầu chương trình (trừ unit mặc định Pascal unit SYSTEM) với cú pháp Cú pháp: USES [, ]; - b Một số hàm thủ tục hay dùng Unit CRT ClrScr: Thủ tục xoá hình GotoXY(x, y: Byte): Dời trỏ tới vị trí cột x, dòng y hình Thông thường, hình TextMode(Co80) có 25 dòng (từ dòng đến dòng 25) 80 cột (cột đến cột 80) Vậy toạ độ góc trái hình (1, 1), toạ độ góc phải (80, 25)10 10 Hiện hình TextMode giả lập Windows chạy Borland Pascal thiết lập mặc định tới 80 cột 50 dòng Sinh viên phải thử cụ thể hình Một số hình LCD wide screen Trang 36 Tổ Tin Học - Trường CĐSP Bến Tre - Delay(ms: Word): Thủ tục trì hoãn chương trình ms mili-giây Sound(hz: Word): Thủ tục phát âm qua loa bên (internal speaker) với tần số hz - Nosound: Thủ tục ngừng phát âm - Keypressed: Hàm cho kết TRUE có phím ấn - Readkey: Hàm cho kết mã ASCII ký tự phím ấn - TextBackGround(color: Byte): Thủ tục chọn màu Ta đặt màu cho toàn hình cách đặt lệnh vừa trước lệnh ClrScr - TextColor(color: Byte): Thủ tục chọn màu cho chữ Dưới danh sách màu mà Pascal định sẵn · Black = Đen · Blue = Xanh dương · Green = Xanh lục · Cyan = Xanh trứng sáo · Red = Đỏ · Magenta = Tím cánh sen · Brown = Nâu · LightGray = Xám sáng · DarkGray = Xám tối · LightBlue = Xanh dương sáng · LightGreen = 10 Xanh lục sáng · LightCyan = 11 Xanh trứng sáo sáng · LightRed = 12 Đỏ sáng · LightMagenta = 13 Tím cánh sen sáng · Yellow = 14 Vàng · White = 15 Trắng (8 trị từ Black đến LightGray áp dụng cho màu chữ lẫn màu Các trị lại áp dụng cho màu chữ) Unit CRT thiết lập biến hệ thống TextAttr để xác định chế độ màu hình văn Ví dụ để thiết lập hình có màu chữ xanh lục sáng xanh da trời ta thiết lập câu lệnh gán: TextAttr:=LightGreen+16*Blue; II THIẾT LẬP UNIT Các Bước Tạo Một Unit a Bước Tạo tập tin Pascal có đuôi PAS có cấu trúc trình bày đây, lưu ý tên unit phải trùng với tên tập tin UNIT ; INTERFACE {Tên unit bắt buộc phải trùng với tên tập tin} {Không có dấu ; đây} cho số cột lớn hơn! Hầu projector hỗ trợ chế độ văn Cần cẩn thận lập trình để hiển thị (cuối cùng) projector Trang 37 Tổ Tin Học - Trường CĐSP Bến Tre {Đây phần giao diện Unit Trong phần khai báo unit có mà unit sử dụng, khai báo hằng, kiểu, biến mà chương trình khác sử dụng Khai báo hàm, thủ tục mà chương trình khác gọi tới, khai báo tên chương trình con, tham số, kiểu kết Những hàm, thủ tục thiết lập phần sau mà không khai báo phần chương trình khác không gọi tới được.} IMPLEMENTATION {Không có dấu ; đây} {Đây phần thực hàm, thủ tục khai báo phần Interface Trong phần có chương trình dùng riêng bên Unit mà không khai báo phần Interface, chương trình truy cập người dùng Unit.} BEGIN {Phần chứa câu lệnh thực thi trước câu lệnh chương trình gọi Unit thực Phần không bắt buộc phải có, nhiên trường hợp phải giữ lại từ khóa “END.” đây.} END b Bước Unit không thiết kế để chạy mà để biên dịch đặt lên đĩa nên ta nhấn CTRL+F9 mà làm theo trình tự sau: Chọn menu Compile (Alt + C) Tiếp tục chọn Destination để chuyển thành Disk Lưu ý: Destination Disk tạo unit lên đĩa, Memory tạo unit lên nhớ RAM Chọn lại menu Complie chọn tiếp chức Complie (Alt + F9) Lúc đĩa xuất tập tin tên unit ta tạo với phần mở rộng TPU Kể từ đây, ta sử dụng unit cách gọi câu lệnh USES nói Ví dụ ứng dụng Dưới chương trình tạo unit đơn giản có hàm HamMu để tính a mũ n (an), GiaiThua để tính n giai thừa (n!) USCLN để tính ước số chung lớn hai số nguyên không âm Unit MyUnit; {Trùng tên với tập tin MyUnit.pas} INTERFACE Function HamMu(a: Real; n: Integer): Real; Function GiaiThua(n: Integer): Longint; Function USCLN(X,Y:Word):word; IMPLEMENTATION Trang 38 Tổ Tin Học - Trường CĐSP Bến Tre Function HamMu(a: Real; n: Integer): Real; Var tam: Real; i: Integer; Begin tam := 1; For i:=1 to n tam := tam * a; HamMu := tam; End; Function GiaiThua(n: Integer): Longint; Var tam: Longint; i: Integer; Begin tam := 1; For i:=1 to n tam := tam * i; GiaiThua := tam; End; Procedure HoanChuyen(var x,y:word); VAR Tam:word; BEGIN Tam:=x; x:=y; y:=Tam; END; Function USCLN(x,y:Word):word; BEGIN While (y0) DO Begin IF (x[...]... lượt bằng 10 và 22, thuộc kiểu byte Biểu diễn nhị phân của X là 0000 10 10 và của Y là 00 01 011 0 Khi đó phép toán được thực hiện theo thứ tự từng bit như sau: 3 Thật ra chúng thuộc về Unit SYSTEM.TPU Trang 13 Tổ Tin Học - Trường CĐSP Bến Tre X 0 0 0 0 1 0 1 0 Y 0 0 0 1 0 1 1 0 X AND Y 0 0 0 0 0 0 1 0 Vậy (10 AND 22) cho kết quả là 2 X 0 0 0 0 1 0 1 0 Y 0 0 0 1 0 1 1 0 X OR Y 0 0 0 1 1 1 1 0 Vậy (10 OR 22)... 0 1 0 1 0 Y 0 0 0 1 0 1 1 0 X XOR Y 0 0 0 1 1 1 0 0 Vậy (10 XOR 22) cho kết quả là 28 Còn có hai phép toán bit nữa là SHIFT LEFT và SHIFT RIGHT, lần lượt được kí hiệu là SHL và SHR Phép toán SHL làm đẩy các bit lên một số vị trí về bên trái và thêm các giá trị 0 vào các bit tận cùng bên phải Cú pháp: SHL Ví dụ: X 0 0 0 0 1 0 1 0 X SHL 1 0 0 0 1 0 1 0 0 {Đẩy về bên trái 1. .. số Kiểu trả về Số nguyên, số thực Số nguyên, số thực Số nguyên, số thực Số nguyên, số thực Số nguyên, số thực Số nguyên Số nguyên Giống đối số Giống đối số Giống đối số Giống đối số Số thực Số nguyên Số nguyên Trang 12 Ví dụ Đối số của 2 là -2 10 + 9 19 10 - 9 1 10*9 90 10 / 4 2.5 10 div 3 3 10 mod 3 1 Tổ Tin Học - Trường CĐSP Bến Tre b Một Số Hàm Số Dưới đây là một số hàm được Pascal thiết... gọi GT(2) GT(2) m = 2 Tính 2 * GT(2 -1) gọi GT (1) GT (1) m = 1 Gán GT (1) : =1 Cuối cùng một quá trình “tính ngược” sẽ cho phép trả về giá trị của GT(4): GT(4) 4 * (3 * (2 * GT (1) )) Cách 2: Dùng vòng lặp Function GiaiThua(m: longint): longint; Var Tam, Dem:Longint; BEGIN IF (M ... Trường CĐSP Bến Tre X 0 0 1 Y 0 1 X AND Y 0 0 0 Vậy (10 AND 22) cho kết X 0 0 1 Y 0 1 X OR Y 0 1 1 Vậy (10 OR 22) cho kết 30 X 0 0 1 Y 0 1 X XOR Y 0 1 0 Vậy (10 XOR 22) cho kết 28 Còn có hai... byte byte 10 byte byte Miền xác định FALSE TRUE 256 ký tự bảng mã ASCII -12 8 12 7 255 -32768 32767 65535 - 214 7483648 214 7483647 2.9E-39 1. 7E+38 1. 5E-45 3.4E+38 5.0E-324 1. 7E+308 3.4E-4932 1. 1E+4932... func1 mà Biến r gọi Func1 mà Biến x gọi func1 biến cục riêng func1, không liên quan đến biến x khai báo chương trình Proc1 - Procedure Proc1 gọi Proc2, Func1 chương trình Trong Procedure Proc1