Đ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.. + Cấu trúc về chương trình : Một chương trình có t
Trang 1chươ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 }
TYPE Tên kiểu = Kiểu cần khai báo; { Khai báo kiểu }
VAR Tên biến : Kiểu giá trị của biến; { Khai báo biến }
PROCEDURE { Thủ tục (chương trình con) }
FUNCTION { Hàm (chương trình con) }
BEGIN
END
Ví dụ :
PROGRAM Duong_tron;
Uses CRT;
Const pi= 3.14;
Var s, r : real;
Begin
Clrscr;
Readln(r);
S:=pi*r*r;
Write(‘Dien tich hinh tron la: ’, s :4:2);
Readln;
End
Trang 2III Các phím chức năng cơ bản khi thao tác với PASCAL:
F1: Trợ giúp;
F2: Lưu 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 logex
- EXP(x): cho giá trị của ex
- 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
- TRUNC(x):cho giá trị phần nguyên của x Ví dụ : TRUNC(3.146)= 3
- ROUND(x): cho giá trị làm tròn phần thập phân cuả x
Ví dụ : ROUND(3.421)= 3; ROUND(5.56)= 6
chương ii: các kiểu dữ liệu, các khai báo, biểu thức, câu lệnh vμ
thủ tục vμo ra dữ liệu vμ một số chương trình con có sẵn trong
pascal
I Các kiểu dữ liệu :
1 Kiểu số nguyên:
a Kiểu Integer: Là kiểu số nguyên chiếm 2 bytes trong bộ nhớ RAM, nhận giá trị từ
-32768 đến +32767
b Kiểu Byte: là kiểu số nguyên chiếm 1 byte trong bộ nhớ RAM, nhận giá trị từ 0 đến
255
c Kiểu ShortInt: là kiểu số nguyên chiếm 1 byte trong bộ nhớ RAM, nhận giá trị từ –128
đến + 127
d Kiểu Word: là kiểu số nguyên chiếm 2 bytes trong bộ nhớ RAM, nhận giá trị từ 0 đến
65535
e Kiểu LongInt: là kiểu số nguyên chiếm 4 bytes trong bộ nhớ RAM, nhận giá trị từ
- 2.147.483.648 đến + 2.147.483.647
2 Kiểu số thực:
a Kiểu Real: là kiểu số thực chiếm 6 bytes trong bộ nhớ RAM, nhận giá trị từ 2.9E-39
đến 1.7E+38
Trang 3b Kiểu Single: là kiểu số thực chiếm 4 bytes trong bộ nhớ RAM, nhận giá trị từ 1.5E-45
đến 3.4E+36
c Kiểu Double: là kiểu số thực chiếm 8 bytes trong bộ nhớ RAM, nhận giá trị từ
5.0E-324 đến 1.7E+308
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;
Ví dụ: Type
Color = ( Red, Green, Blue);
Mang = Array[1 100] of Integer;
Var
C: Color;
A: Mang;
III Biểu thức:
Biểu thức là một công thức tính toán để có một giá trị theo một qui tắc toán học nào đó
Một biểu thức bao gồm toán tử và toán hạng
Ví dụ : 6+Pi*Cos(x);
A+B;
KT= TRUE;
IV.Câu lệnh:
Bên cạnh phần mô tả dữ liệu là phần lệnh của chương trình Câu lệnh được chia ra hai
loại:
1 Câu lệnh đơn giản: là những lệnh không chứa những lệnh khác:
- Phép gán ;
- Lời gọi Procedure;{ thủ tục }
- Lệnh nhảy GOTO {lệnh nhảy vô đIều kiện, thường ít dùng trong PASCAL}
2 Câu lệnh có cấu trúc: là khối lệnh, lệnh thử và rẽ nhánh, lệnh lặp:
Trang 4- Câu lệnh ghép BEGIN END;
- Câu lệnh lựa chọn IF THEN ELSE;
CASE OFF;
- Các vòng lặp: FOR TO DO ;
` REPEAT UNTIL ;
WHILE DO ;
- Câu lệnh WITH DO ;
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 nhưng con trỏ xuống dòng
- Readln;
4 Một số thủ tục nhập phím đặc biệt của PASCAL:
- Hàm ReadKey; có kiểu ký tự, cho giá trị là ký tự nhận vào từ bàn phím ngay từ khi
bạn gõ phím mà không cần ấn tiếp nút Enter
Ví dụ: ch:= ReadKey;
- Hàm KeyPressed có kiểu Boolean, cho giá trị TRUE nếu bàn phím có chứa ký tự gõ
vào mà chưa được lấy ra xử lý, FALSE nếu không có ký tự gõ vào
VI Một số chương trình con của PASCAL
1 Thủ tục Delay(Time): tạo ra thời gian trễ Time (tính bẵng ms) Time là số nguyên
2 Thủ tục Sound(F) và NoSound; : tạo ra dao động âm thanh với tần số F (F:số nguyên) cho
đến khi ta gọi NoSound;
Ví dụ:
Sound(500);
Delay(100);
NoSound;
3 Thủ tục Exit; : là thủ tục thoát khỏi chương trình con
4 Thủ tục Break; :là thủ tục thoát khỏi những vòng lặp
Trang 55 Thủ tục Halt; : là thủ tục thoát khỏi chương trình PASCAL
6 Hàm tạo số ngẫu nhiên:
Hàm Random(n); với n :0 65535;(cho giá trị ngẫu nhiên trong n phần tử)
Trước khi gọi hàm Random ta phảI gọi thủ tục Randomize; để tạo bộ số ngẫu nhiên
7 Hàm UpCase(ch) :hàm cho ký tự hoa của ký tự ch
Ví dụ: ch:=’a’; UpCase(ch)=’A’;
Chương III Câu Lệnh Có Cấu Trúc
I Câu lệnh đIều kiện IF THEN ELSE :
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;
Begin
Write(‘Nhap thang:’);readln(thang);
Write(‘Nhap nam:’);readln(nam);
CASE thang OF
4, 6, 9,11 : songay:= 30;
2:If (nam Mod 4 = 0) then songay:= 29
else
songay:= 28;
1, 3, 5, 7, 8, 10, 12 : songay:= 31;
END;
Write(‘So ngay cua Thang ’,thang,’ Nam ’,nam,’ la ‘,songay);
End
Trang 62 Dạng 2:
CASE < biểu thức > OF
hằng 1 : < công việc 1>;
hằng n : < công việc n>;
ELSE < công việc n+1>;
END;
Ví dụ : Với ch là biến ký tự:
Write(‘Nhap ky tu:’);readln(ch);
CASE ch OF
‘0’ ’9’ : Write(Ch,’ la chu so’);
‘A’ ’Z’ : Write(Ch,’ la chu cai’);
ELSE { câu lệnh trước ELSE của CASE có dấu chấm phẩy (;) }
Write(Ch,’ khong thuoc cac lua chon tren’);
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;
End;
2 Dạng 2:
REPEAT
< công việc >;
UNTIL < biểu thức logic >;
Ví dụ : Như ví dụ trên
S:= 0; I:= 1; { giá trị khởi tạo ban đầu }
Repeat
S:= S + 1/I;
Trang 7I:= I +1;
Until I > N;
3 Sự khác nhau giữa REPEAT và WHILE:
- Trong vòng lặp Repeat thì máy sẽ thực hiện < công việc > sau đó mới kiểm tra < biểu
thức logic > Còn trong vòng lặp WHILE thì nó kiểm tra < biểu thức logic > rồi sau đó
mới làm < công việc >
- Điều kiện trong < biểu thức logic > giữa hai vòng lặp luôn trái ngược nhau Trong
REPEAT Sai (FALSE) thì nó làm tiếp, Đúng (TRUE) thì nó thoát Còn trong WHILE
thì Đúng nó mới làm, Sai nó thoát
- Điều kiện Đúng trong WHILE thoả mãn điều kiện Bài toán còn REPEAT thì ngược
lại
V Lệnh nhảy vô đIều kiện GOTO:
Lệnh GOTO thuộc loại lệnh đơn giản, cho phép chương trình nhảy vô điều kiện tới một
vị trí trong chương trình thông qua tên nhãn
Ví dụ :Tìm các số nguyên tố giữa 2 số nguyên dương n1 va n2:
Program nhay;
Label
L1,L2 ;
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 )
- Function ( hàm )
Sự khác nhau cơ bản và duy nhất của hai loại chương trình con này là Function có giá
trị trả về thông qua tên hàm và do đó nó được sử dụng trong một biểu thức Còn Procedure
không có giá trị trả về thông qua tên của nó nên các Procedrre không thể viết trong các biểu
thức
Trang 8• CÊu tróc chung cña mét ch−¬ng tr×nh ®−îc m« t¶ nh− sau:
Program Tªn_ch−¬ng_tr×nh;
Uses Tªn_th−_viÖn;
Label Tªn_nh·n;
Const { Khai b¸o h»ng };
Type { Khai b¸o kiÓu };
Var { Khai b¸o biÕn toµn côc };
Procedure Tªn_thñ_tuc( Khai b¸o tham sè, tham biÕn nÕu cÇn );
Var { nÕu cã biÕn côc bé }
Begin
{ Th©n ch−¬ng tr×nh con };
End;
Function Tªn_hµm(Khai b¸o tham sè, tham biÕn nÕu cÇn):KiÓu_d÷_liÖu;
Var { nÕu cã }
Begin
.{ Th©n ch−¬ng tr×nh con };
End;
BEGIN
{ Th©n ch−¬ng tr×nh chÝnh }
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
Clrscr;
Nhap; { gäi thñ tôc th× b×nh th−êng }
Trang 9Bt := Chia(a,b); { gọi hàm thì nằm trong biểu thức gán }
Write(‘Bieu thuc chia la: ‘,bt);
Readln;
END
Chú ý: -Biến toàn cục là biến được dùng chung cho cả chương trình Còn biến cục bộ( địa
phương) thì chỉ có giá trị trong chương trình con
-Tham số và tham biến được khai báo trong chương trình con nhưng tham biến thì
có Var phía trước còn tham số thì không
Vidụ : Procedure tinh( x,y:integer; Var s:real);
{ x, y là tham số ; s: là tham biến vì s bị thay đổi giá trị }
Begin
End;
III Tính đệ qui của chương trình con:
Trong Procedure và Function có thể gọi chính thủ tục hoặc hàm vào thân chương trình
của chính nó Tính chất này được gọi là tính đệ qui
Ví dụ: Tìm ước số chung của hai số x va y có thể được định nghĩa như sau:
USCLN(x, y)= x nếu y= 0
= (y, phần dư của x/y) nếu y<>0
Như vậy hàm USCLN có thể được viết theo đệ qui như sau:
Function USCLN(x, y: integer): integer;
Begin
If y= 0 then USCLN:= x
Else USCLN:= USCLN(y, x mod y);
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 để lưu 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:
Trang 10a Khai báo gián tiếp:
Type
Tên_kiểu = ARRAY[Kiểu_chỉ_dẫn] OF < Kiểu_phần_tử >;
Var Biến_mảng : Tên_kiểu;
Ví dụ : Type
So = Array[1 100] of Integer;
Kytu = Array[‘A’ ‘Z’] of Char;
Color = (Red, Blue, Green, White, Black);
Var
A : So; Kt : Kytu; Cl : Array[Color] of Boolean;
b Khai báo trực tiếp:
Var Biến_mảng : ARRAY[Kiểu_chỉ_dẫn] OF < Kiểu_phần_tử >;
Ví dụ : A : Array[1 100] of integer;
Ví dụ : Viết chương trình nhập dãy số vào mảng sau đó sắp xếp mảng theo thứ tự tăng
dần:
Program Day_so;
Uses CRT;
Type mang = Array[1 50] of integer;
Var a:mang; n: integer;
Procedure Nhap;
Var I: byte;
Begin
Write(‘Nhap so phan tu cua mang:’);readln(n);
For I:=1 to n do
Begin
Write(‘ A[ ‘, I , ’]= ’);
Readln(A[ I ] );
End;
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;