Tải bản đầy đủ (.pdf) (18 trang)

bài giảng lập trình pascal đại học bách khoa

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (113.25 KB, 18 trang )

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 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 }


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
Các câu lệnh;
END.

Ví dụ :
PROGRAM Duong_tron;
Uses CRT;
Const pi= 3.14;
Var s, r : real;
Begin
Clrscr;
Write(Nhap ban kinh :);
Readln(r);
S:=pi*r*r;
Write(Dien tich hinh tron la: , s :4:2);
Readln;
End.
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 2

III. Các phím chức năng cơ bản khi thao tác với PASCAL:


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

- 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 vo 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.
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 3
b. 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:
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 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 nhng 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à cha đợ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
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 5
5. 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.
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 6
2. 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;
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 7
I:= 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.
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 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 }
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 9
Bt := 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 nhng 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 để 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


Giaùo trỗnh Pascal 10
a. 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;
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 11
End .

3. Mảng nhiều chiều:

Kiểu phần tử của mảng không bị hạn chế nhiều nh kiểu chỉ dẫn. Nó còn có thể là các
kiểu có cấu trúc . ( Array[Kiểu_chỉ_dẫn1, 2, ] Of Kiểu_phần_tử; )
( Về mặt khai báo cũng nh mảng một chiều )
Ví dụ : Mảng 2 chiều:
Type Mang = Array[ 1 3, 1 4] of integer;
Var A: Mang;
Mô tả :
Cột


Dòng 1
2
3


Ví dụ : A[2, 3] = 6; { dòng 2, cột 3 }

Ví dụ : Nhân hai ma trận vuông cấp n (dòng = cột) :
Program Nhan_hai_mt;
Uses CRT;
Var a,b,c: Array[1 50,1 50] of integer; n: byte;
Procedure Nhap;
Var I,j :byte;
Begin
Write(Nhap chi so dong va cot);readln(n);
{ nếu không phảI là ma trận vuông thì nhập dòng riêng, cột riêng }
for I:=1 to n do
for j:=1 to n do
Begin
Write( a[ , I , , , j , ]= );

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 12
Var I, j : byte;

Begin
For I:= 1 to n do
Begin
For j:=1 to n do write(c[ I, j ]: 5);writeln;
End;
BEGIN
Clrscr;
Nhap; nhan; xuat;
Readln;
END.

II. Kiểu tập hợp:
Là kiểu bao gồm một số các đối tợng nào đó có cùng bản chất, cùng một mô tả kiểu.
Kiểu tập cũng có hai hình thức khai báo nh mảng.

Ví dụ:

Type So= Set OF 0 9;
Mang = array[ 1 50 ] OF SET OF A Z;
Ngay= (Hai, Ba, Tu, Nam, Sau, Bay, Chunhat);

Var S : so; A: mang;
Ngay_tuan: set of ngay;

Ví dụ : Nhập vào n ký tự để xây dựng một tập các ký tự:

Program XD_CHU;
Uses CRT;
Var Chu : SET OF A Z;
I, n: integer;

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 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.

Ví dụ:
Var
Hoten: string[30];
St: string;
III. Các thủ tục và hàm xử lý xâu ký tự:
1. Các thủ tục:
a. Delete(St, Pos, Num); :dùng để xoá xâu St .
Trong đó St: xâu ký tự, Pos: là vị trí bắt đầu xoá,Num: là số ký tự cần xoá.
Ví dụ:
Nếu St=Tin hoc thì:
Delete(St,4,4); -> St=Tin
b. Insert(St2, St1, Pos); : Dùng để chèn xâu St2 vào xâu St1 ở vị trí Pos.
Ví dụ: Nếu St1=Trung ; St2=Tam thì:
Insert(St2,St1,6); -> St1=Trung Tam;
c. Str(Value, St); : dùng để đổi giá trị số Value thành xâu St.
Ví dụ: Nếu I=234 thì:
Str(I, St); -> St= 234;
d. Val(St, Var, Code); :dùng để đổi xâu St thành số rồi lu vào biến Var. Nếu
đổi thành công thì Code = 0 ,còn không thì ngợc lại.
Ví dụ: Nếu St= 456 thì:
Val(St, I, cd); -> I= 456 và cd = 0;
2. Các hàm:
a. Length(St): cho ta độ dàI của xâu St.
Ví dụ: Nếu St=adecs12vf thì dd:=Length(St); cho kết quả dd= 9.
b. Copy(St, Pos, Num); : dùng để tạo ra một xâu mới từ xâu St , hàm này sẽ chép ra số ký
tự từ vị trí Pos và chép ra Num ký tự.
Ví dụ: Nếu St =kuioj thì: Stm:= Copy(st,4,2); cho kết quả Stm=oj;
Chú ý:
-Nếu Pos+ Num > Length(St) thì hàm sẽ trả về các ký tự trong xâu St .
-Nếu Pos > Length(St) thì hàm sẽ trả về một xâu rỗng .

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 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

For I:= Length(st) do
If st[I] In [A Z] then
St[I]:= Chr(Ord(St[I]+ 32);
Hoa_thuong:= st;
End;


Chơng VII. Kiểu Bản Ghi

I. Kiểu bản ghi( RECORD ) : là kiểu dữ liệu có cấu trúc nhằm để tạo ra một kiểu dữ liệu
mới với các phần tử dữ liệu có kiểu khác nhau . RECORD là một cấu trúc bao gồm
nhiều thành phần. Các thành phần có thể thuộc các kiểu dữ liệu khác nhau và đợc gọi
là các trờng ( Field ), mỗi trờng đều đợc đặt tên .
Để mô tả một kiểu T có cấu trúc Record với danh sách các trờng có tên là S1, S2, ,
Sn và có các mô tả kiểu tơng ứng là trờng có tên là T1, T2, , Tn ta dùng cách viết
nh sau:
Type
T= Record
S1: T1;
S2: T2;
.
Sn: Tn;
End;
Ví dụ:
Type
Date = Record
Ngay: 1 31;
Thang: 1 12;
Nam: Word;
End;

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 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;

Type
Date = Record
Ngay: 1 31;
Thang: 1 12;
Nam: Word;
End;
Type
NhanSu = Record
Hoten: string[30];
Ngaysinh: Date;
Luong: real;
Cogiadinh: Boolean;
End;
Var
NV: Array[1 100] of NhanSu;
I, SNV: byte; GD: Char;
Begin
Clrscr;
Write(Nhap vao so nhan vien:); readln(SNV);
For I:= 1 to SNV do
With NV[I] do
Begin
Write(Ho ten:); readln(hoten);
Write(Ngay sinh: / /);
{ Nếu không có With thì: readln(NV[I].hoten); }
With Ngaysinh do
Begin
Readln(ngay);
Readln(thang);
Readln(nam);

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 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;

Nam: Word;
End;
Luong: real;
Cogiadinh: Boolean;
CASE Nghenghiep: Nghe Of
Congnhan: (NganhCN: Nganh; Bactho:byte);
Kysu:(NganhKS:Nganh;Trinhdo:(Kem,TB,Kha,Gioi);
Bacsi: (Chuyenkhoa: Khoa);
Cabiet: ( );
End;
End;
Var NVV: NhanSu;
Begin

With NVV do
Begin
Hoten: =Tran An
Nghenghiep:= Congnhan;
NganhCN:= Cokhi;
Bactho:= 3;
End;


End.


Chơng VIII. Dữ Liệu Kiểu Tệp

I. KháI niệm:
Tệp dữ liệu( File ) là một tập hợp các dữ liệu có liên quan với nhau và có cùng kiểu

đợ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 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ự :

Assign(FileVar, FileName);
ReWrite(FileVar);
Trong đó:
- FileVar : biến kiểu File.
- FileName : tên của tệp đặt trong thiết bị nhớ ngoàI đợc đa vào dạng một String.
Ta nên đặt tên sao cho tên đó phản ánh đợc ý nghĩa, bản chất, nội dung của tệp.
Ví dụ:
Assign(F2, Nhanvien.txt); { Gán tên Nhanvien.txt cho biến F2 }
ReWrite(F2); { Mở tệp Nhanvien.txt, tệp cha có phần tử nào }
2. Ghi các giá trị vào tệp với thủ tục Write:
Thủ tục Write sẽ đặt các giá trị mới vào tệp.
Cú pháp:
Write(FileVar, Item1, Item2, , Itemn);
Trong đó Item1, Item2, ,Itemn: là các giá trị cần ghi vào tệp.

Ví dụ: Tạo ra một tệp chứa các số nguyên từ 1 đến 50 với tên tệp trên đĩa là:
Songuyen.txt
Program Tep_so_nguyen;
Var I: byte;
F: File of Integer;
Begin
Assign(F,Songuyen.txt);
ReWrite(F);
For I:= 1 to 50 do
Write(F,I);
Close(F); { Thủ tục đóng File }
End.
3. Đọc dữ liệu từ một tệp đã có:
Cú pháp:
Assign(FileVar, FileName);

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 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.

- Hàm EOF(Var F: Text): cho biết vị trí con trỏ có phảI là cuối File hay cha.
- Hàm EOLN(Var F: Text): cho biết vị trí con trỏ có phảI là cuối dòng hay cha.
Hai hàm trên đều trả về kiểu Boolean.

×