Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 1
chơng i giới thiệu sơ lợc về pascal
I. Giới thiệu về ngôn ngữ PASCAL:
PASCAL là ngôn ngữ lập trình cấp cao do giáo s Niklaus Wirth thuộc trờng đại học kỹ
thuật Zurich Thuỵ sĩ sáng tác và công bố vào đầu những năm 1970, với tên là PASCAL để kỹ
niệm nhà toán học ngời Pháp Blaise PASCAL ở thế kỷ 17.
PASCAL là một ngôn ngữ có định kiểu mạnh mẽ. Điều đó có nghĩa là mọi biến và hằng của
một kiểu dữ liệu không thể tự do đem trộn lẫn với các biến và hằng của một kiểu dữ liệu khác .
PASCAL là một ngôn ngữ có cấu trúc. Tính cấu trúc đó đợc thể hiện trên các mặt sau :
+ Cấu trúc về dữ liệu : Từ các dữ liệu đã có ta có thể xây dựng các cấu trúc dữ liệu phức tạp
hơn.
+ Cấu trúc về lệnh : Từ các lệnh đã có ta có thể nhóm chúng lạI với nhau và đặt giữa hai từ
khoá Begin và End thành câu lệnh phức tạp hơn.
+ Cấu trúc về chơng trình : Một chơng trình có thể chia thành các modun chơng trình độc
lập (chơng trình con).
II. Cấu trúc chung của chơng trình PASCAL:
PROGRAM Tên_chơng_trình; { Dòng tiêu đề }
USES Tên th viện; { CRT; DOS; PRINTER;GRAPH; }
LABEL Tên nhãn ; {Khai báo nhãn}
CONST Tên hằng = giá trị; { Khai báo hằng }
F1: Trợ giúp;
F2: Lu chơng trình;
F3: Mở file hoặc tạo file mới (*.PAS);
F9: Dịch chơng trình;
Ctrl + F9: Chạy chơng trình;
Alt + F5 : Xem kết quả;
Alt + X : Thoát khỏi PASCAL;
IV. Các phép toán tử, toán hạng và quan hệ:
- + , - , * , /, DIV, MOD ( phép chia lấy phần nguyên(DIV) và phần d(MOD))
Ví dụ: 5 div 2 = 2; 5 mod 2= 1;
- AND, OR, NOT, XOR(cho giá trị đúng khi 2 toán hạng khác nhau)
- <>, =, >=, <=, >, <, IN ( Ví dụ : A IN [A Z] )
V. Các hàm số học chuẩn:
- ASB(x): cho giá trị tuyệt đối của toán hạng x. Ví dụ : ASB(-3)= 3
- SQR(x): cho giá trị bình phơng của x. Ví dụ : SQR(2)= 4
- SIN(x), COS(x), ARCTAN(x): cho giá trị các hàm lợng giác
- LN(x): cho giá trị của log
e
x
- EXP(x): cho giá trị của e
x
- SQRT(x): cho giá trị căn bậc hai của x. Ví dụ : SQRT(9)= 3
- SUCC(x): cho giá trị đứng sau x. Ví dụ : SUCC(3)= 4
- PRED(x): cho giá trị đứng trớc x. Ví dụ : PRED(3)= 2
- ODD(x): cho giá trị TRUE nếu x lẻ và FALSE nếu x chẵn
d. Kiểu Extended: là kiểu số thực chiếm 10 bytes trong bộ nhớ RAM, nhận giá trị từ
1.9E-4951 đến 1.1E+4932.
3. Kiểu Boolean: là kiểu logic cho hai giá trị TRUE(đúng) và FALSE(sai).
4. Kiểu Char: là kiểu biểu diễn các ký tự từ bàn phím nh:A,B, ,0,1, @,{
5. Kiểu String: là kiểu biểu diễn xâu ký tự (chuỗi) nh : Cong hoa, .
II. Các khai báo:
1. Khai báo hằng:
Hằng là các đại lợng không thay đổi giá trị. Có các loại khai báo hằng số (nguyên và
thực), hằng ký tự, hằng Boolean.
Cách viết:
Tên_hằng = giá_trị_của_hằng;
Ví dụ: Const
L= True;
N = 5;
Pi = 3.146;
C = Z ;
2. Khai báo biến:
Biến là đại lợng có thể thay đổi giá trị. Tên biến của chơng trình là tên của ô nhớ cất
giữ dữ liệu.
Cách viết:
Tên_biến : kiểu_dữ_liệu_của_biến;
Ví dụ: Var
I; byte;
Hoten: String[30];
Kt: Boolean;
3. Kiểu tự định nghĩa: khác với các kiểu dữ liệu có sẵn trong PASCAL thì kiểu dữ liệu này
ngời lập trình tự định nghĩa theo yêu cầu của bài toán
Cách viết Tên_kiểu = dữ_liệu_tự_định_nghĩa;
3. Phép gán: Biến := biểu_thức;
Ví dụ : x:= a+b;
Kt:= false;
I:= I+1;
V. Thủ tục vào ra dữ liệu:
1. Thủ tục viết dữ liệu ra màn hình:
- Write(item); Trong đó item có thể là một xâu ký tự, một biểu thức hay một giá trị
nào đó.
Ví dụ: Write(Chao cac ban); Write(a); Write(x*3+4*sin(x));
- Writeln(item); Chỉ khác nhau với Write ở chỗ là nó đa con trỏ màn hình xuống
dòng.
- Writeln;
2. Các thủ tục trình bày màn hình:
- GOTOXY(x,y); Là thủ tục đa con trỏ nhảy đến toạ độ (x,y), trong đó x là cột
(1 80 cột), y là dòng (1 25 dòng).
- Clrscr; Là thủ tục xoá toàn bộ màn hình và sau khi xoá con trỏ sẽ ở vị trí góc phía
trên bên trái màn hình.
- TextColor(Color); Là thủ tục lựa chọn màu ký tự.
- TextBackground(Color); Là thủ tục chọn màu nền màn hình.
Trong đó Color nhận giá trị từ 0 đến 15, và 128 (nhấp nháy).
( Nhớ khai báo USES CRT;)
3. Thủ tục vào dữ liệu: Read và Readln:
- Read(biến); Là thủ tục đọc dữ liệu đợc nhập từ bàn phím vào trong bộ nhớ RAM
Ví dụ:
Var n : integer;
Begin
Write(Nhap n:=); read(n);
End.
- Readln(biến); Tơng tự nh Read nhng con trỏ xuống dòng .
- Readln;
1. Dạng 1: IF < đIều kiện >THEN < công việc >;
Ví du: If n>0 Then Write(n, la so duong);
2. Dạng 2: IF <đIều kiện> THEN <công việc1> ELSE <công việc 2>;
Ví dụ: Tìm giá trị MAX và MIN của 2 số a và b
IF a< b THEN
Begin
Max:= b;
Min:= a;
End
ELSE { nghĩa là a>b }
Begin
Max:= a;
Min:= b;
End;
Chú ý: + Câu lệnh trớc ELSE của lệnh IF không có dấu chấm phẩy(;)
+ Trong đoạn lệnh nếu có từ hai công việc trở lên thì
Begin
End;
II. Câu lệnh lựa chọn CASE OF
1. Dạng 1:
CASE < biểu thức > OF
hằng 1 :< công việc 1>;
hằng n : < công việc n>;
END;
Ví dụ : Tính số ngày của một tháng:
Var songay:byte; thang:1 12 {kiểu liệt kê} ; nam:integer;
END;
III. Vòng lặp có số bớc lặp xác định FOR :
1. Dạng 1:
FOR < biến:= giá_trị_đầu > TO < giá_trị_cuối> DO < công việc > ;
2. Dạng 2:
FOR < biến:= giá_trị_cuối > DOWNTO < giá_trị_đầu > DO < công việc > ;
Ví dụ : Tính tổng các số nguyên từ 1 đến 200:
Uses CRT;
Var s, I :integer;
Begin
Clrscr; { thủ tục dùng xoá sạch màn hình }
S:=0; { lệnh khởi tạo giá trị đầu}
For I:= 1 To 200 Do s:= s+1;
{ hoặc For I:= 500 Downto 1 Do s:= s+1; }
Write(Tong la :, s);
Readln; { để giữ lạI màn hình cho ta thấy đợc kết quả }
End.
IV. Câu lệnh có số bớc lặp không xác định REPEAT và WHILE :
1. Dạng 1:
WHILE < biểu thức logic > DO
Begin
< công việc >;
End;
Ví dụ : Tính tổng sau : S= 1+1/2 +1/3 +. +1/N ;
S:= 0; I:= 1;
While I<= N DO
Begin
S:= S + 1/I;
I:=I+1;
Var i, j, n1, n2: integer;
tt: char;
Begin
L1: Write(Nhap hai so n1 va n2:);readln(n1, n2);
For i:= n1 to n2 do
Begin
For j:= 2 to i-1 do If ( i mod j = 0 ) then Goto L2;
Write( i, );
L2 : ; { lệnh không làm gì cả }
End;
Writeln;
Write(Ban co muon tiep tuc khong ?( C / K )); readln(tt);
If Upcase(tt)= C then Goto L1;
End.
Tuy nhiên lệnh nhảy GOTO rất ít dùng trong PASCAL vì nó sẽ làm mất tính cấu trúc
thuật toán của ngôn ngữ .
Chơng IV Chơng Trình Con
I.KháI niệm:
Trong khi lập chơng trình chúng ta thờng gặp những đoạn chơng trình đợc lặp đi lặp
lại nhiều lần ở những chỗ khác nhau. Để tránh rờm rà, những đoạn chơng trình này đợc
thay thế bằng các chơng trình con tơng ứng khi cần. Hơn nữa, một vấn đề phức tạp sẽ tơng
ứng với một chơng trình có thể rất lớn, rất dài. Do đó việc nhìn tổng quan cả chơng trình
cũng nh việc gỡ rối, hiệu chỉnh sẽ rất khó khăn.Ta có thể giải quyết các vấn đề đó thành các
vấn đề nhỏ hơn (chơng trình con) để dễ kiểm tra, gỡ rối từng khối một và sau đó ghép lại
thành chơng trình lớn. Đây cũng là ý tởng cơ bản của lập trình cấu trúc.
II. Procedure và Function ( Thủ tục và Hàm):
PASCAL có hai loạI chơng trình con :
- Procedure ( thủ tục )
END.
Ví dụ : Tính biểu thức
Program Bieu_thuc;
Uses CRT;
Var a,b: integer; bt: real;
Procedure Nhap;
Var OK : Char ;
Begin
Repeat
Write(Nhap tu:);readln(a);
Write(Nhap mau:);readln(b);
Write(Có sua lai so lieu khong ( C / K )?);
OK:= ReadKey;
Writeln;{ đa con trỏ xuống dòng }
Until ( OK= K ) Or ( OK= k );
End;
Function Chia( x, y: integer): real;
Var z : real;
Begin
If y<>0 then z:= x/y
Else
Begin
Writeln(#7, Khong chia duoc vi mau so bang= 0);
Halt; { thủ tục halt dừng lại chơng trình}
End;
Chia:= z; { giá trị trả về của hàm }
End;
BEGIN
End;
Và hãy so sánh gì ? với chơng trình không đệ qui sau:
( Dành riêng cho các ban !)
Function USCLN(x, y: integer): integer;
Var sodu : integer; { số d }
Begin
While (y < > 0 ) do
Begin
Sodu:= x mod y;
x: = y;
y:= sodu;
End;
USCLN:= x;
End;
Chú ý :
Chỉ nên dùng đệ qui đối với những bài toán không có tính lặp. Chơng V Kiểu Dữ Liệu Có Cấu Trúc : Kiểu Mảng V Kiểu Tập Hợp I. Kiểu Mảng ( Array):
Mảng là kiểu dữ liệu có cấu trúc đợc tạo ra nhằm mục đích để lu một số hữu hạn
dữ liệu có cùng kiểu. Số phần tử của mảng đợc xác định ngay từ khi định nghĩa ra
mảng. Mỗi phần tử của mảng đợc truy nhập trực tiếp thông qua tên mảng cùng
với chỉ dẫn truy nhập đợc để giữa hai ngoặc vuông [ ] .
1. Mảng một chiều:
Có hai hình thức khai báo mảng:
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
End;
{ Đây là thủ tục sắp xếp mà các bạn cần tham khảo }
Procedure Sapxep; { sắp xếp tăng dần }
Var I, j : byte; T: integer;
Begin
For I:=1 to n-1 do
Begin
For j := I+1 to n do
If a[ I ] > a[ j ] then { nếu sắp xếp giảm thì dấu ngợc lạI }
Begin
T: = a[ I ];
A[ I ] := A[ j ]; { đây là thuật hoán đổi 2 giá trị }
A[ j ] := T;
End;
End;
End;
{ Chơng trình chính }
Begin
Clrscr;
Nhap;
Sapxep;
Readln;
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 11
End .
3. Mảng nhiều chiều:
Readln(a[ I , j ] );
End;
for I:=1 to n do
for j:=1 to n do
Begin
Write( b[ , I , , , j , ]= );
Readln(b[ I , j ] );
End;
End;
Procedure Nhan;
Var I, j, k: byte;
Begin
for I:=1 to n do
for j:=1 to n do
Begin
C[ I, j ]:= 0;
For k:=1 to n do
C[ I, j ]:= a[ I, k ] * b[ k , j ];
End;
End;
Procedure Xuat;
1 2 3 4
2 7 4 12
5 9 6 1
8 3 10 5
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 12
Var I, j : byte;
Ch: Char;
Begin
Clrscr;
Chu: =[ ];
Write(Nhap n:=);
readln(n);
For I:= 1 to n do
Begin
Readln(ch);
Ch:= Upcase(ch); {đổi chữ thờng thành hoa}
End;
For ch:=A to Z do
If ch IN chu then
write(ch);
End. Chơng VI Kiểu Xâu Ký Tự
I. KháI niệm:
Xâu( String ) là kiểu dữ liệu có cùng cấu trúc dùng để xử lý các xâu ký tự. Kiểu String
có nhiều đIểm tơng tự nh kiểu mảng nhng cũng có nhiều đIểm khác nhau là: số ký
tự trong một biến xâu có thể thay đổi còn số phần tử của kiểu mảng luôn cố định.
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 13
II. Khai báo:
Var
Biến : String[ n ];
Trong đó n là số ký tự tối đa có thể có của xâu. Chiều dàI tối đa của một xâu là 255.
c. Concat(St1, St2, , Stn); : hàm này dùng để ghép tất cả các xâu ký tự thành một xâu.
Nếu tổng chiều dàI xâu mới >255 thì máy báo lỗi.
Ví dụ: Nếu st1=Cong ; st2=hoa thì: { ta có thể sử dụng phép + }
St := Concat(st1+ , st2); cho kết quả St=Cong hoa
d. Pos(St1, St2); dùng để tìm vị trí xuất hiện đầu tiên của xâu St1 có trong xâu St2. Nếu
tìm thấy thì hàm này sẽ trả về giá trị nguyên >0, còn không tìm thấy thì Pos= 0 .
Ví dụ: Nếu St1= as; St2= aeasnhasju thì: vt:= Pos(St1, St2); cho kêt quả vt= 3 .
Ví dụ: Xoá các ký tự trắng d thừa trong xâu St :{ St= Xa hoi ; }
Program Xoa_Trang;
Uses CRT;
Var St: string;
I: byte;
Begin
Clrscr;
Write(Nhap xau ky tu:); readln(st);
While st[1]= do delete(St,1,1); { xoá đầu }
While st[length(st)]= do delete(St, length(st),1); { xoá cuối }
For I:= 1 to length(st) do
If st[I] and st[I+1] then delete(St, I, 1);
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 14
Readln;
End.
Ví dụ: Viết hàm chuyển chữ hoa thành chữ thờng:
Function Hoa_Thuong (St : string): string;
Var I: byte;
Begin
Type
NhanSu = Record
Hoten: string[30];
Ngaysinh: Date;
Luong: real;
CoGiaDinh: Boolean;
End;
Var
NV: Array[1 100] of NhanSu;
II. Sử dụng Record: Muốn truy cập một biến kiểu Record, ta phảI truy cập theo thành
phần của chúng. Cú pháp để truy cập đến một thành phần nào đó là:
< Tên biến Record > . < Tên trờng >
Ví dụ: Var NVV : NhanSu;
NVV.Hoten:=Tran An;
NVV.Ngaysinh.Ngay:= 6;
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 15
NVV.Ngaysinh.Thang:= 5;
NVV.Ngaysinh.Nam:= 1980;
III. Câu lệnh With:
Khi cần truy cập nhiều thành phần của một biến kiểu Record, ta có thể dùng câu lệnh
With để chơng trình đợc gọn hơn .
Cú pháp:
WITH < Biến kiểu Record > DO < Câu lệnh >
Ví dụ: Nhập lý lịch nhân viên trong mộ cơ quan :
Uses CRT;
End;
Write(Luong:); Readln(luong);
Write(Co gia dinh(Y/N)?:); readln(GD);
If Upcase(GD)= Y then Cogiadinh:= true
Else Cogiadinh:= false;
End;
Readln;
End.
IV. Bản ghi có cấu trúc thay đổi:
NgoàI những bản ghi có cấu trúc cố định nh đã trình bày. Pascal còn cho phép lập các
Record có một phần cấu trúc thay đổi đợc.
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 16
Ví dụ : Trong phần khai báo NhanSu ở ví dụ trớc , nếu ta xét thêm trờng
Nghenghiep thì sẽ có nhiều trờng hợp xảy ra, chẳng hạn nh :
- Công nhân: Cần ghi rõ ngành gì? Bậc thợ mấy?
- Kỹ s: Ngành gì? Trình độ?
- Bác sĩ: Chuyên khoa gì?
- Cá biệt: Không có gì nữa?
Type
Nghe= (Congnhan, Kysu, Bacsi, Cabiet);
Nganh= (Khaithac, Cokhi, Dien,Hoa);
Khoa= (Noi, Ngoai, Nhi);
NhanSu = Record
Hoten: string[30];
Ngaysinh: Record {Kiểu khai báo mới}
Ngay: 1 31;
Thang: 1 12;
đợc nhóm lạI với nhau tạo thành một dãy. Chúng thờng đợc chứa trong một thiết bị
nhớ ngoài của máy tính( đĩa cứng, )với một cáI tên nào đó. Tệp có các dữ liệu khác
nhau nh ký tự, văn bản
Định nghĩa một kiểu tệp T với các phần tử có kiểu phần tử đợc viết trong mô tả kiểu
với từ khoá File Of nh sau:
Type
Filereal = File of real;
Date = Record
Ngay: 1 31;
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 17
Thang: 1 12;
Nam: Word;
End;
Type
NhanSu = Record
Hoten: string[30];
Ngaysinh: Date;
Luong: real;
CoGiaDinh: Boolean;
End;
FnhanSu = File Of NhanSu;
Var
F1: Filereal;
F2: FNhanSu;
F3: File of Array[1 50] of Integer;
II. Các thao tác trên tệp:
1. Mở tệp mới để cất dữ liệu:
Việc mở tệp đợc tiến hành với hai thủ tục đI liền nhau theo thứ tự :
Reset(FileVar);
Để đọc dữ liệu từ tệp ra biến nào đó ta dùng thủ tục Read :
Cú pháp:
Read(FileVar, Var1, Var2, , Varn); hoặc Readln();
Trong đó Var1, Var2, , Varn là các biến có cùng kiểu với FileVar
Ví dụ: Đọc nội dung từ file Vanban.txt :
Trung tỏm tờnh toaùn thọỳng kó aỡ Nụng 54 - Trỏửn Quọỳc Toaớn aỡ Nụng
Giaùo trỗnh Pascal http://www.ebook.edu.vn 18
Program Doc_File;
Uses CRT;
Var
F: Text; { Đây là khai báo kiểu File Text }
dong : string[80];
Begin
Clrscr;
Assign(F, Vanban.txt); Reset(F);
While Not EOF(F) Do
Begin
Read(F, dong);
Write(dong, );
End;
Close(F);
Readln;
End.
4. Thủ tục thêm dòng:
Cú pháp: Append(Var F: Text);
Ví dụ: Assign(F,Vanban.txt); Append(F); Write(F,Tạm biet);
Ghi chú : - Cuối chơng trình khi nào cũng nhớ dùng thủ tục Close(biến_file) để đóng
File.