I. Giới thiệu về ngôn ngữ PASCAL :
PASCAL là một trong những ngôn ngữ lập trình cấp cao được giáo sư Niklaus Wirth ở trường Đại học Zurich (Thuỵ Sĩ) thiết kế và công bố vào năm 1971.Ông đặt tên cho ngôn ngữ này là Pascal để tưởng nhớ đế Blaise Pascal, nhà Toán học, triết học nổi tiếng của Pháp ở thế kỷ 17. Sau được sửa đổi trong năm 1972 và ngày càng đựơc chuẩn hoá, đến nay trở thành ngôn ngữ phổ cập trong dạy lập trình cũng như được ứng dụng rộng rãi trên các máy vi tính.
Ngôn ngữ Pascal nhanh chóng có ảnh hưởng sâu rộng và chiếm được cảm tình của những người lập trình vì nhiều nguyên nhân; trong đó có nguyên nhân đáng kể là tính cấu trúc chặt chẽ và khoa học. Tính cấu trúc của ngôn ngữ này thể hiện trên 3 mặt:
1) Tổ chức dữ liệu có tính cấu trúc.
2) Xây dựng được đầy đủ các cấu trúc điều khiển để thực hiện giải thuật.
3) Tạo cho chương trình khả năng cấu trúc.
Vì vậy khi lập trình, cần cố gắng khai thác hết sức mạnh của ngôn ngữ này về phương diện cấu trúc, nhằm đạt tới các bài giải toán có hiệu suất cao.
II. Những khái niệm cần thiết :
1. Các Kí tự :
Các kí tự trong ngôn ngữ Pascal gồm :
+ 26 chữ cái la tinh hoa : A, B,... Z ( mã số từ 65 tới 90 trong bảng mã ASCII )
+ 26 chữ cái la tinh thường a, b... z ( mã số 97 --> 122 )
+ Kí tự gạch nối : _ ( mã số 95 )
+ 10 kí tự chữ số : 0, 1, 2,..., 9 (mã số 48 --> 57 )
+ Cộng + , trừ - , nhân * , chia / , bằng nhau = , lớn hơn > , nhỏ hơn <
dấu mở ngoặc ( hoặc dấu đóng ngoặc )
+ Các kí tự đặc biệt khác :
. , ; , : , [ , ] , { , } , ? , ! , \ , & , % , # , $
+ Kí tự dấu cách (còn gọi là dấu trống - có mã số 32 ) Tạo 1 khoảng cách bằng độ rộng chứa 1 kí tự, dấu cách dùng để phân cách 2 từ.
2. Các từ khoá: Là các từ riêng của Pascal đã được xác định ngữ nghĩa trước, người lập trình phải tuân theo ngữ nghĩa này, không được dùng từ khoá vào các định nghĩa khác
Danh sách các từ khoá :
Program, Begin, End, Procedure, Function, Unit, Implementation, Interface ...
Uses, Const, Type, Var, Label, Array, String, Record, Set of ... , File of ...
If ... then ... Else ..., Case ... of,
For ... to ... do, For ... downto ... do, While ... do, Repeat ... until
With, goto, Exit, Halt, Forward, and, or, xor , not, in, div, mod, SHL, SHR
3. Tên: Là dãy các kí tự chữ cái hoặc chữ số và dấu gạch nối dùng để xác định các đại lượng khác nhau trong chương trình.
Qui định đặt tên:
+ Chiều dài tối đa 127 kí tự.
+ Không được đặt kí tự chữ số làm kí tự đầu của tên.
+ Không được đặt tên trùng với từ khoá.
Nên đặt tên có tính gợi nhớ để dễ theo dõi và hiệu chỉnh chương trình, không nên đặt tên quá dài và trùng với các tên chuẩn nêu dươí đây
4. Tên chuẩn:
Tên chuẩn là những tên được Pascal đặt trước và định nghĩa sẵn .
Danh sách các tên chuẩn
Boolean, Char, Integer, Real, Byte, Text ...
False, True, MaxInt
Abs, Chr, Cos, Sin, Arctan, Eof, Eoln
Exp, Ln, Odd, Ord
Round, Trun , Sqr, Sqrt, Pred, Succ
Dispose, New, Close, Get, Put, Read, Readln, Write, Writeln, Reset, ReWrite
...
Các kiểu dữ liệu đơn giản và phép toán tương ứng
I. Kiểu số nguyên :
Từ khoá Phạm vi Số byte nhớ
Integer -32768 .. 32767 2 Byte
Byte 0 .. 255 1 Byte
Word 0 .. 65535 2 Byte
ShortInt -128 .. 127 1 Byte
LongInt -2147483648.. 2147483647 4 Byte
Những qui định về kiểu số nguyên :
+ Không gán trị vượt quá phạm vi của kiểu .
+ Các chữ số phải viết liền nhau
+ Số âm: phải đặt dấu trừ ngay sát chữ số đầu tiên của số
+ Không được sử dụng dấu chấm thập phân .
+ Để viết số dưới dạng cơ số 16 (dạng Hexa) đặt dấu $ sát chữ số đầu .
Các phép toán (operater):
a) Phép toán số học:
Cộng : + Cho kết quả là số nguyên
Trừ : - Cho kết quả là số nguyên
Nhân : * Cho kết quả là số nguyên
Chia : / Cho kết quả là số thực
Div : Cho thương nguyên của phép chia
Mod : Dư nguyên của phép chia.
b) Phép toán quan hệ:
= ( bằng )
> ( lớn hơn )
< ( nhỏ hơn )
>= ( Không nhỏ thua )
<= ( Không lớn hơn )
<> ( Khác )
Kết quả của các phép toán quan hệ là Kiểu Boolean (Có 2 giá trị: True, False)
II. Kiểu thực :
Kiểu Phạm vi Số chữ số có nghĩa Số Byte
Single 1.5E-45 .. 3.4E+38 7-8 4
Real 2.9E-39 .. 1.7E+38 11-12 6
Double 5.0E-324 .. 1.7E+308 15-16 8
Extended 3.4E-4932 .. 1.1E+4932 19-20 10
Comp -9.2E+18 .. 9.2E+18 19-20 8
+ Trong 4 kiểu trên, phạm vi được hiểu như là trị tuyệt đối của phạm vi.
+ Cách viết số ở cột phạm vi là cách viết chữ số kiểu động,
1.5E-45 = 1.5 * 10 -45 ; 3.4E+38 = 3.4 * 10 38
+ Kiểu số thực với mode thường dùng là Real. Còn các kiểu còn lại phải dùng mode 8087 ( Đầu chương trình phải có hưóng biên dịch {$N+}.) Các phép toán trên kiểu số thực: Cũng có các phép toán như kiểu nguyên; nhưng không có phép DIV và MOD và kết quả của mọi phép toán trên Real là Real; kết quả của mọi phép toán trên Extended là Extended
III. Kiểu Boolean:
Kiểu Boolean chỉ có 2 giá trị: True và False. (trong đó False < True)
Một giá trị kiểu Boolean chiếm 1 Byte bộ nhớ.
Các phép toán lôgic trên kiểu Boolean:
Phép OR
True False
True True True
False True False
Phép AND
True False
True True False
False False False
Phép XOR
True False
True False True
False True False
Phép NOT
x = True --> Not (x) = False
x = False --> Not (x) = True
IV. Kiểu Kí tự: (Kiểu Char)
Một kí tự chiếm 1 byte bộ nhớ. Mỗi kí tự tương ứng với 1 mã số, ghi trong bảng mã ASCII (American Standar Code Information Interchange). Có tất cả 256 kí tự đánh số từ Mã số 0 tới mã số 255. Vậy kiểu kí tự có 256 giá trị. Các kí tự từ 0 đến 31 là các kí tự điều khiển, không in ra được, chúng dùng để điều khiển quá trình vào, ra các thiết bị ngoại vi.
Ví dụ: Kí tự có mã số 13 báo hiệu hết dòng trên màn hình và máy in
Kí tự có mã số 10 chuyển con trỏ màn hình xuống đầu dòng dưới, và chuyển đầu kim in xuống đầu dòng in tiếp theo.
Kí tự có mã số 7 làm phát chuông kêu ...
Chú ý:
+ Để biểu diễn kí tự , phải đặt kí tự trong dấu nháy. ví dụ: a A ] ... hoặc dùng hàm Char ví dụ: Char(97) , Char(65) , Char(93) ... hoặc dùng kí hiệu #97 , #65 , #93 ...
Sau đây là 1 chương trình nhỏ hiện các kí tự và mã số của chúng lên màn hình :
Uses crt;
Var i : Byte;
BEGIN
Clrscr;
For i:=33 to 255 do Write(i:4,Char(i):2,#32#32);
Readln;
END.
V. Kiểu Xâu kí tự: (Kiểu String)
Xâu kí tự là dãy các kí tự đặt giữa 2 dấu nháy đơn. Số kí tự của xâu không quá 255.
Các phép toán trên xâu kí tự sẽ đề cập ở phần sau. Có thể tạo ra kiểu xâu kí tự có độ dài n (1<=n<255) bằng khai báo
Var Tên_biến : String[n];
C - Dữ liệu kiểu mảng
Khai báo mảng 1 chiều:
+ Mảng có N phần tử, chỉ số của các phần tử là số nguyên từ 1 đến N
Type Tên_kiểu = Array[1..N] of <Kiểu_phần _tử >;
Var Tên_biến : Tên_kiểu ;
+ Mảng có N phần tử, chỉ số của các phần tử là số nguyên từ -1 đến N-2
Type Tên_kiểu = Array[-1..N-2] of <Kiểu_phần _tử >;
+ Mảng có 10 phần tử , chỉ số của các phần tử là kí tự từ A đến K
Type Tên_kiểu = Array[ A .. K] of <Kiểu_phần _tử >;
Khai báo mảng 2 chiều :
+ Mảng có NxN phần tử , chỉ số của các phần tử là cặp số nguyên từ (i,j)
Type Tên_kiểu = Array[1..N,1..N] of <Kiểu_phần _tử >;
Khai báo mảng 3 chiều :
+ Mảng có N xN xN phần tử , chỉ số của các phần tử là bộ 3 số nguyên từ (i,j,k)
Type Tên_kiểu = Array[1..N,1..N ,1..N] of <Kiểu_phần _tử >;
Chú ý :
Mỗi phần tử thứ i của mảng 1 chiều (mảng A với chỉ số nguyên chẳng hạn) được tương ứng với 1 ô nhớ trong máy Muốn nạp hoặc lấy giá trị ô nhớ đó, phải thông qua phần tử thứ i của mảng tương ứng với ô nhớ ấy kí hiệu là A[i].
Mỗi phần tử có chỉ số (i,j) của mảng 2 chiều ( mảng A với chỉ số là cặp số nguyên chẳng hạn được kí hiệu A[i,j] trong đó i là chỉ số hàng, j là chỉ số cột
Như vậy việc duyệt các giá trị của các phần tử của mảng rất dễ dàng. Song cần lưu ý biến chỉ số của mảng không được vượt ra ngoài phạm vi đã khai báo. Ví dụ Mảng A khai báo có 10 phần tử với chỉ số từ -5 đến 4 thì kí hiệu A[5] là phạm lỗi.
Nhược điểm của kiểu mảng là tốn bộ nhớ do khai báo ban đầu phải lường trước mọi giá trị của dãy nào đó đều được đưa vào mảng, nên kích thước mảng sẽ lớn, nhưng thực tế có thể không dùng hết các phần tử của mảng đã khai báo.
D - Một số hàm thông dụng
1) ABS(x) : giá trị tuyệt đối của x có kiểu như x
2) SQR(x) : Bình phương của x có kiểu như x
3) SQRT(x) : Căn bậc hai của x có kiểu Real
4) Sin(x) : sin của x có kiểu Real
5) Cos(x) : côsin của x có kiểu Real
6) Arctan(x) : a rctg của x có kiểu Real
7) Ln(x) : Loga cơ số e của x có kiểu Real
8) Exp(x) : cho e x
9) Random(n) : Cho một số nguyên ngẫu nhiên từ 0 tới n-1 ( n nguyên )
10) Odd(n) : cho giá trị True nếu n lẻ; cho giá trị False nếu n chẵn
11) Round(x) : là số nguyên làm tròn của số thực x
12) Trunc(x) : là số nguyên, bằng phần nguyên của số thực x
13) Int(x) : là số thực, bằng phần nguyên của số thực x
14) Frac(x) : là số thực, bằng phần thập phân của số thực x
Với các kiểu dữ liệu vô hướng đếm được (Kiểu số nguyên: Integer, Byte, LongInt, ShortInt, Word, Kiểu Lôgic: Boolean, Kiểu kí tự: Char ) có quan hệ thứ tự nên còn được xây dựng các hàm sau đây : ORD, PRED, SUCC
Ví dụ :
ORD(10) = 10 , PRED(10) = 9 , SUCC(10) = 11
ORD(B) = 66 , PRED(B) =A , SUCC(B) =C
ORD(False) = 0 , ORD(True) = 1 ,
ORD(3*4=12) = 1 , ORD(3*4=11) = 0 ,
PRED(True) = False , SUCC(False) = True
15) INC(x,k) : Tăng số nguyên x lên thêm k đơn vị (x := x+k)
16) DEC(x,k) : Giảm số nguyên x đi k đơn vị (x := x-k)
E - Cấu trúc một chương trình dạng đơn giản
Một chương trình TURBO PASCAL có các thành phần sau:
(* Phần khai báo chương trình *)
Program Tên_chương_trình;
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
(* Phần thân chương trình *)
Procedure Tên_thủ_tục_1(Tên_tham_trị ; Var Tên_tham_biến : Kiểu_tham_biến);
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của thủ tục 1 gồm các lệnh nào đó *)
End ;
......
Procedure Tên_thủ_tục_n(Tên_tham_trị ; Var Tên_tham_biến : Kiểu_tham_biến);
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của thủ tục n gồm các lệnh nào đó *)
End ;
Function Tên_Hàm(Tên_tham_trị; Var Tên_tham_biến : Kiểu_tham_biến):Kiểu_giá_trị_hàm ;
Uses Tên _các_ Unit_ cần _thiết ;
Label Tên_nhãn;
Const Tên_hằng = Giá_trị_của_hằng;
Type Tên_kiểu : Kiểu_hằng ;
Var Tên_biến : Kiểu_biến;
Begin
(* Phần thân của hàm gồm các lệnh nào đó *)
End ;
BEGIN
(* Thân của chương trình chính gồm các lệnh, trong đó có cả lệnh gọi thủ tục và hàm *)
END.
Chú ý : Khi khai báo hằng hoặc biến , máy sẽ cấp phát vùng nhớ cho chúng. Giá trị trong vùng nhớ này chính là giá trị của hằng và biến tương ứng. Ví dụ:
Var x : Integer;
ch : Char;
S : String[30];
y : Real;
nam : Boolean;
thì x được cấp phát vùng nhớ 2 Byte , Ch được cấp phát vùng nhớ 1 Byte, S được cấp phát vùng nhớ 31 Byte, y được cấp phát vùng nhớ 4 Byte, nam được cấp phát vùng nhớ 1 Byte ...
F- Bước đầu sử dụng phần mềm TURBO PASCAL 7.0
TURBO PASCAL là phần mềm nhằm soạn thảo, sửa chữa, biên dịch và chạy chương trình .
Để khởi động TURBO PASCAN 7.0 cần có tối thiểu 2 File
+ Turbo.EXE : 403.655 Kb
+ Turbo.TPL ( Chứa các Unit chuẩn ) : 48.432 Kb
Tại dấu mời của DOS ( thường là tại thư mục chứa 2 File trên ) gõ TURBO và ấn ENTER thì TURBO được nạp vào bộ nhớ. Trên màn hình xuất hiện Local Menu như sau :
File Edit Search Run Compile Debug Tools Options Window Help
______________________________________________________________________
F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10 Local menu
File, Edit, Search, Run, Compile, Debug, Tools, Options, Window, Help gọi là các mục chọn của Local Menu. Đó là các nhóm chức năng của TURBO. Để chọn một chức năng nằm trong mục chọn, ấn và giữ phím ALT đồng thời gõ kí tự chữ trắng trong tên mục chọn
Ví dụ :
Ấn và giữ phím Alt đồng thời gõ F để hiện ra menu dọc của mục chọn File như hình sau:
File Edit Search Run Compile Debug Tools Options Window Help
New
Open... F3
Save F2
Save as...
Save all
------------------
Change dir...
Print
Printer setup...
DOS shell
Exit Alt+X
F1 Help Create a new file in a new Edit window
Các dòng New, Open, Save, Save as, Save all, Change dir, Print, Print Seup, DOS shell, Exit được gọi là các mục chọn dọc trong Mục chọn File của Local Menu. Đó là từngchức năng riêng của nhóm này.
Để tìm hiểu kỹ càng về từng nhiệm vụ của các mục chọn dọc nằm trong các Menu dọc, tương ứng với các mục chọn của Local Menu, hãy tìm qua sách khác giới thiệu về Môi trường TURBO. Ở đây chúng ta bước đầu chỉ tìm hiểu một số chức năng chính:
ALT_F +NEW Mở một trang văn bản mới để soạn một chương trình mới.
F3 (ALT_F + OPEN) Mở 1 File (File này đã được ghi vào đĩa bây giờ muốn mở ra để xem lại hoặc sửa đổi, nếu File này chưa có trên đĩa thì phải gõ tên File vào dòng sáng hiện trên màn hình sau đó soạn chương trình mới).
F2 (ALT_F +SAVE) Lưu chương trình vào File đang mở. Nếu chương trình này là chương trình mới và chưa được đặt tên thì màn hình hiện lên một khung yêu cầu đặt tên File cho chương trình mới này.
ALT_F +SAVE AS Lưu chương trình vào File với tên khác (phải nhập tên mới vào)
ALT_X (ALT_F +EXIT) Để thoát khỏi soạn thảo chương trình, kết thúc TURBO trở về môi trường cũ.
F9 Để biên dịch chương trình
CTRL_F9 Để chạy toàn bộ chương trình
F7 Lần theo dõi từng dòng lệnh
F8 Lần theo dõi từng dòng lệnh trong chương trình chính .
CTRL_F7 Theo dõi giá trị của các biến khi cho chạy F7 hoặc F8
Trong khi soạn và thử nghiệm và chạy chương trình, có thể dùng nhiều loại cửa số khác nhau trên màn hình. Cửa sổ nào có con trỏ được gọi là cửa sổ hiện hành.
F6 Để chuyển từ cửa sổ này sang cửa sổ kia.
F5 Để phóng to hoặc thu nhỏ cửa sổ hiện hành.
CTRL_F5 Sau đó dùng phím mũi tên ( ) di chuyển cửa sổ hiện hành đến vị trí thích hợp, hoặc dùng SHIFT + phím mũi tên ( ) để thay đổi kích thước cửa sổ, cuối cùng ENTER
Alt_F3 Để đóng cửa sổ soạn thảo hiện hành (có con trỏ).
Trong khi soạn thảo chương trình thường dùng các thao tác sau :
+ Phím ENTER ( ) Đưa con trỏ về đầu dòng tiếp theo
+ Phím mũi tên ( ) Di chuyển con trỏ
+ HOME Đưa con trỏ về đầu dòng
+ END Đưa con trỏ về cuối dòng
+ CTRL_HOME Đưa con trỏ về đầu trang
+ CTRL_ END Đưa con trỏ về cuối trang
+ CTRL_PAGE UP Đi lên 1 trang màn hình văn bản
+ CTRL_ PAGE DOWN Đi xuống 1 trang màn hình văn bản
+ Phím DEL Xoá kí tự tại vị trí con trỏ
+ Phím BACK SPACE Xoá kí tự ngay bên trái vị trí con trỏ
+ Phím SPACE BAR Tạo 1 kí tự trống
+ SHIFT_Phím mũi tên( ) Đánh dấu khối
+CTRL_INSERT Chép khối đánh dấu vào CLIPBOARD
+SHIFT_INSERT Chép CLIPBOARD vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_C Chép khối đánh dấu vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_V Chuyển khối đánh dấu vào vị trí mới trong văn bản hiện thời
+CTRL_DEL Xoá đoạn văn bản đã đánh dấu khối
+CTRL_K + H Xoá hộp sáng trên đoạn văn bản đã đánh dấu
+CTRL_F1 Hiện màn hình giúp đỡ tương ứng với từ tại vị trí con trỏ
+SHIFT_F1 Hiện bảng giúp đỡ sử dụng các lệnh, thủ tục, hàm, toán tử, ...
G - Thủ tục vào ra dữ liệu, thủ tục liên quan màn hình
1 ) WRITE (danh sách kết quả ra); sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng, bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình.
2 ) WRITELN (danh sách kết quả ra); sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng, bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình. Ghi xong, con trỏ màn hình tự động dời xuống đầu dòng tiếp theo của màn hình.
3) WRITELN; Lệnh chuyển con trỏ xuống đầu dòng dưới.
4) READLN(danh sách tên biến); Nhập từ bàn phím lần lượt các giá trị cho các biến được nêu trong danh sách. Sau khi gõ giá trị của biến cuối cùng thì gõ ENTER. Con trỏ trên màn hình tự động chuyển xuống dòng dưới.
5) READLN; Lệnh dừng chờ cho đến khi gõ ENTER mới thi hành lệnh tiếp theo và con trỏ chuyển xuống đầu dòng dưới.
6) Gotoxy(x1,y1); Lệnh di chuyển con trỏ màn hình tới vị trí cột x1, dòng y1. (Trên màn hình ở chế độ 25 line trang màn hình có 25 dòng, 80 cột)
7) Textcolor(n); với n là số nguyên từ 0 tới 15: Đặt chế độ màu cho chữ viết trên màn hình.
8) TextBackGround(n); Đặt chế độ màu cho màn hình.
9) Clrscr; Xoá sạch trên trang màn hình
Lưu ý 1: Khi nhập giá trị cho các biến bằng lệnh Readln(ds biến ), máy chưa thực hiện lệnh tiếp theo của chương trình, chỉ khi gõ ENTER máy nạp giá trị vào các vùng nhớ tương ứng với các biến, sau đó mới thực hiện lệnh tiếp theo.
Lưu ý 2: Để kiểm tra dữ liệu nhập vào có đúng kiểu đã khai báo không, dùng hàm IoResult(Kiểu Boolean) theo dõi với chế độ hướng dẫn biên dịch là {$I-}. Sau khi nhập giá trị cho biến (x chẳng hạn) nếu giá trị của hàm IoResult = 0 thì giá trị nhập cho x là đúng; ngược lại nếu IoResult <>0 thì nhập sai. Ví dụ : Đoạn chương trình nhập giá trị cho biến x nguyên dương là:
Uses Crt;
Var x : Integer;
Begin
Repeat
Write(Nhap gia tri x = );
{$I-} Readln(x); {I$+}
Until (IoResult =0) and ( x>0);
Readln
End.
Nguồn: ST -- đang chỉnh sửa