Tải bản đầy đủ (.doc) (329 trang)

GIÁO án HAY DÀNH CHO DAY đội TUYỂN HSG

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 (947.11 KB, 329 trang )

Làm quen lập trình với ngơn ngữ Pascal

Chương 1: Những chương trình đầu tiên
Ta bắt đầu bằng việc phân tích một chương trình Pascal đơn giản:
1.Program VD_01_01;
2.Begin
3.

Write('Xin chao tat ca cac ban.');

4.

Readln;

5.

{Chờ gõ Enter}

6.End.

Để thử nghiệm chương trình, bạn khởi động mơi trường lập trình Turbo Pascal
(xin xem ngay Error! Bookmark not defined. để biết chi tiết về sử dụng mơi
trường lập trình Turbo Pascal) rồi soạn thảo, dịch và Error! Bookmark not
defined.. Bạn chú ý không gõ số số dịng, đó là tác giả thêm vào để tiện giải thích
hoạt động của chương trình.
Đây là một chương trình Pascal rất đơn giản, chỉ thực hiện mỗi một việc là in ra
màn hình dịng chữ “Xin chào tất cả các bạn” rồi chờ Error! Bookmark not
defined. (user) nhấn Enter. Tuy vậy chúng ta cũng nên phân tích nó:
Dịng 1 của chương khai báo tên của chương trình. Khai báo bắt đầu bằng Error!
Bookmark not defined. (keyword) Program và theo sau đó là một Error!
Bookmark not defined. dùng để đặt cho chương trình. Chương trình trên được


đặt tên là “VD_01_01”.
Khai báo Program thường là khơng cần thiết nên rất ít khi xuất hiện, bạn có thể
bỏ qua trong các chương trình riêng của mình.
Dịng 2 và dịng 6 là 2 từ khố “Begin End.” khai báo nội dung chương trình.
Dịng 3 là một câu lệnh của chương trình, write là Error! Bookmark not defined.
trong Pascal dùng để đưa thông tin ra thiết bị ngồi. Trong chương trình này câu
lệnh có ý nghĩa: viết ra màn hình dịng chữ “Xin chao tat ca cac ban”.
Dòng 4 là câu lệnh tiếp theo của chương trình, nó chỉ làm mỗi việc là chờ người
dùng gõ Enter.
Dịng 5 là một dịng chú thích. Chú thích là những văn bản mà lập trình viên
(programmer) thêm vào nhằm mục đích giúp người đọc chương trình dễ hiểu hơn.
Chẳng hạn trong trường hợp này là giải thích ý nghĩa của dịng lệnh readln ở trên.
Chú thích được đặt giữa cặp ngoặc {} hay giữa cặp (* *). Chú thích giúp
chương trình dễ hiểu hơn nhưng khơng làm tăng kích thước chương trình (vì
Turbo Pascal khơng dịch phần văn bản được đánh dấu là chú thích. Vì thế đơi khi
1


Làm quen lập trình với ngơn ngữ Pascal
người ta đánh dấu chú thích phần chương trình cịn sai để kiểm tra các phần khác
mà khơng cần thiết phải xố những đoạn chương trình ấy).
Sau q trình phân tích chúng ta rút ra một số điều sau:
1- Từ khoá Program dùng để khai báo tên chương trình. Khai báo đó khơng nhất
thiết phải có. Nếu có thì tên chương trình phải đặt theo các quy tắc đặt tên.
2- Nội dung chương trình nằm giữa cặp từ khóa Begin End. Chú ý có dấu chấm
sau từ End.
3- Đơn vị cấu trúc nên nội dung chương trình là các câu lệnh. Đó có thể là cấu trúc
điều khiển, lệnh gọi chương trình con hay lệnh gán trị (chúng ta sẽ nghiên cứu về
chúng trong những phần sau). Mỗi lệnh đều kết thúc bằng dấu ;. Chương trình
thực hiện các câu lệnh tuần tự từ đầu đến cuối.

3.1- Lệnh write có thể dùng để viết ra màn hình các câu thơng báo. Chú ý câu
thông báo đặt trong cặp dấu “nháy” trên (' '). Ví dụ 'This is Turbo
Pascal'.
3.2- Lệnh readln; (đọc là read-line) sẽ chờ người dùng nhấn Enter rồi mới chạy
tiếp.
4- Chú thích có thể thêm vào chương trình giúp chương trình dễ hiểu hơn. Chú
thích nằm giữa cặp dấu { } hay giữa (* và *).
5- Tên (identifier) trong Pascal không phân biệt chữ hoa hay chữ thường. Chẳng
hạn bạn gõ WRITE hay write Pascal đều coi chúng như nhau. Tuy nhiên người ta
thường đặt tên trong Pascal theo cách ngắn gọn, dễ đọc, gợi nhớ (chẳng hạn trong
tiếng Anh write có nghĩa là “viết”)…
Cấu trúc của một chương trình Pascal có dạng như sau:
program <tên chương trình>;
<các khai báo>
begin
<nội dung chương trình>
end.
Trong đó các khai báo gồm có:
1. khai báo sử dụng unit.
2. khai báo hằng số.
3. khai báo kiểu dữ liệu.
4. khai báo biến
2


Làm quen lập trình với ngơn ngữ Pascal
5. khai báo chương trình con.
… (và một số khai báo khơng phổ biến khác)
Ngồi khai báo unit ln phải đặt đầu tiên, ngay sau dòng khai báo program, các
khai báo còn lại có thể đặt trình tự tuỳ ý, khơng nhất thiết phải giống như thứ tự ở

trên.
Nội dung chương trình là dãy các câu lệnh. Có các 3 câu lệnh sau:
1. lệnh tính tốn biểu thức.
2. lệnh gọi chương trình con.
3. cấu trúc điều khiển.
Các câu lệnh trong chương trình khi chạy sẽ được thực hiện theo trình tự từ đầu
đến cuối.
Các khai báo và các câu lệnh phân tách nhau bằng dấu ;. Nghĩa là phải gõ ; ở
cuối mỗi câu lệnh hay khai báo (ngoại trừ trước từ khoá end và else).
Một chương trình đầy đủ có dạng như sau:
program
... ;

{ tiêu đề chương trình }

uses

... ;

{ khai báo các unit sử dụng}

label

... ;

{ khai báo các nhãn}

const

... ;


{ khai báo các hằng}

type

... ;

{ khai báo các kiểu dữ liệu }

var

... ;

{ khai báo các biến}

procedure

... ;

{ khai báo chương trình: thủ tục}

function

... ;

{ và hàm}

begin
statement;


{ dãy các câu lệnh}

...
end.

3


Làm quen lập trình với ngơn ngữ Pascal

Chương 2 : Biến và kiểu dữ liệu
Trong chương trình bạn rất hay gặp nhu cầu phải lưu trữ và xử lý những dữ liệu
nào đó. Chẳng hạn trong chương trình giải phương trình thì bạn cần phải ghi nhớ
các hệ số và tính tốn các nghiệm của nó. Các biến(varible) trong Pascal được sử
dụng trong trường hợp này.
Biến trong chương trình có thể hiểu là một vùng nhớ có kích thước thích hợp để
lưu trữ dữ liệu theo một cấu trúc nào đó. Thơng tin về cấu trúc ấy tạo ra khái niệm
về kiểu dữ liệu của biến. Như vậy kiểu là tập hợp nhiều đối tượng có cấu trúc
giống nhau và có thể xử lý theo cùng một cách.
Pascal là ngơn ngữ có cấu trúc về mặt dữ liệu: đó là Pascal cung cấp cho bạn một
số kiểu dữ liệu cơ sở (cịn gọi là vơ hướng chuẩn) và bạn có thể xây dựng những
kiểu dữ liệu mới dựa trên những kiểu dữ liệu đã xác định bằng cách khai báo cấu
trúc và các cách thức xử lý chúng.
Mỗi biến trong chương trình sẽ chứa 2 thơng tin: địa chỉ (là vị trí của nó trong bộ
nhớ) và giá trị nó đang lưu trữ. Địa chỉ của mỗi biến cố định và khơng thay đổi
được. Cịn giá trị của nó thì có thể thay đổi được.

Cách khai báo biến trong chương trình:
Biến được khai báo sau từ khố var trong phần khai báo của chương trình (trước
từ khố begin khai báo bắt đầu nội dung lệnh).

Khai báo biến có dạng:
<tên> : <kiểu>;
Trong đó <tên> là tên (identifier) ta đặt cho biến, <kiểu> là kiểu dữ liệu
của biến. Chú ý dấu : và dấu ;
Nếu bạn muốn khai báo nhiều biến cùng một kiểu dữ liệu thì bạn đặt tên chung
tách nhau bởi dấu , .
Ví dụ đoạn chương trình khai báo biến hợp lệ:
Var
n

: Integer ;

a,b : Real ;

{integer, real là những kiểu dữ liệu cơ sở của Pascal, ta sẽ xét trong phần sau }.
Có những giá trị khơng thay đổi trong q trình chương trình chạy, chúng ta có thể
coi chúng là những hằng số và gọi chúng là các hằng (constant). Chẳng hạn 0, 1,
pi, e…
4


Làm quen lập trình với ngơn ngữ Pascal
Chúng ta có thể khai báo các hằng số trong chương trình của mình bằng từ khố
const. Phần khai báo const cần được đặt trước nội dung chương trình chính,
có dạng sau:
Const

<tên> = <biểu thức>;
Ví dụ khai báo một hằng max = 100, một hằng ký tự esc = #27:
Const

max

= 100;

esc = #27;

Biểu thức được tạo từ tổ hợp các biến, hằng và phép tốn thích hợp.

Những kiểu dữ liệu cơ sở của Turbo Pascal:
1.Kiểu nguyên:
Các số nguyên trong máy tính được lưu trữ một cách chính xác và hữu hạn. Nghĩa
là tập số nguyên mà máy biểu diễn được chỉ là một tập con của tập các số ngun
mà thơi.
Tuỳ vào kích thước vùng nhớ dành lưu trữ biến mà khoảng biểu diễn lớn hay nhỏ.
Bảng sau đây là thông tin các kiểu nguyên trong Turbo Pascal:
Tên
Integer

Kích thước (byte)
2

Khoảng biểu diễn
-32768..32767

LongInt

4

-231..231-1


Byte

1

0..255

Word

2

0..65535

ShortInt

1

-128..127

Danh sách trên xếp theo thứ tự giảm dần mức độ trường dùng. Trong đó Integer
được dùng thường xuyên nhất khi các số không quá lớn. Và LongInt được dùng để
lưu các số lớn hơn.

5


Làm quen lập trình với ngơn ngữ Pascal

Các phép tốn thường dùng trên dữ liệu kiểu
nguyên:
1- Các phép toán số học +, - , * div và mod. Trong đó + (cộng ), - (trừ), * (nhân) là

các phép toán số học thông thường; div, mod là phép chia lấy phần nguyên và số
dư.
ví dụ: 5 div 2=2, 5 mod 2 =1.
2- Các phép toán so sánh logic: = (bằng ), < (nhỏ hơn ), > (lớn hơn), <= (nhỏ hơn
hoặc bằng), >= (lớn hơn hoặc bằng),<> (khác)…

2.Kiểu thực:
Kiểu thực trong Pascal dùng lưu trữ các số thực. Tuy nhiên giá trị của số thực
trong máy tính chỉ là dạng xấp xỉ, nghĩa là số thực mà biến thực biểu diễn khác số
thực cần biểu diễn với một sai số nhỏ nào đó. Và kiểu thực chúng cũng chỉ lưu trữ
một khoảng con của tập số thực mà thôi.
Bảng sau là thông tin về các kiểu thực trong Turbo Pascal :
Tên

Kích thước

Khoảng biểu diễn

Số chữ số đáng tin

Real

6

2,9.10-39.. 1,7.1038

11-12

Single


4

1,5.10-45.. 3,4.1038

7-8

Double

8

5,0.10-324.. 1,7.10308

15-16

Extended

10

3,4.10-4932.. 1,1.104932

19-20

Trong đó Real được dùng thường xuyên hơn cả nhất. Để sử dụng 3 kiểu còn lại
bạn phải đặt đoạn mã sau đầu chương trình: {$E+,N+}

Các phép tốn trên kiểu thực:
Kiểu thực cũng có một số phép tốn như kiểu ngun: các phép tốn số học, logic.
Tuy nhiên có một số lưu ý:
1- Ký hiệu phép chia trong kiểu thực là / (ví dụ : a/b). Khơng thể áp dụng phép /
với kiểu nguyên và phép div, mod với kiểu thực.

2- Các biến thực biểu diễn xấp xỉ, vì thế thay vì dùng dấu = để kiểm tra 2 số thực
bằng nhau hay không, bạn kiểm tra xem trị tuyệt đối hiệu của chúng có nhỏ hơn
giá trị độ chính xác hay khơng ( a − b < ε ).
3- Dấu ký hiệu thập phân khi viết hằng số thực là dấu chấm “.” (vì dùng theo quy
ước hệ Anh-Mỹ, khác với dấu phẩy “,” ta vẫn dùng).
6


Làm quen lập trình với ngơn ngữ Pascal
4- Các số thực có thể viết dạng khoa học: xE+n=x.10 n; yE-m=y.10-m. Chẳng hạn:
2E6=2×106=2’000’000; 2.125E-10=2,125×10-10…
5- Các hàm sau dùng cho cả 2 kiểu thực và nguyên:
abs (x) = x
sqr (x) = x 2

6- Các hàm sau lấy đối số thực và kết quả là số thực:
exp (x) = e x
ln (x) = ln x
sqrt (x) =

x

7- Một số hàm lượng giác: sin(x), cos(x), arctan(x) (arctg) …

3.Kiểu logic:
Để lưu những thông tin dạng đúng/sai, có/khơng… Pascal có kiểu dữ liệu logic có
tên là boolean. Chỉ có 2 giá trị thuộc kiểu logic là false (ứng với sai) và
true (ứng với đúng).
Quan trọng hơn là các biểu thức logic. Chúng được sử dụng rất thường xuyên
trong các cấu trúc điều khiển (ta sẽ gặp trong chương 3).


Các phép toán cho giá trị logic:
Các phép so sánh =, <> ("khác"), <, >, <= ("nhỏ hơn hoặc bằng"), >=("lớn hơn
hoặc bằng")…
Biểu thức so sánh thường có dạng <biểu thức 1> <op> <biểu thức 2>
trong đó <biểu thức 1> và <biểu thức 2> là các kiểu thức logic cùng
kiểu, <op> là một trong các dấu phép toán kể trên.
Ví dụ về các biểu thức logic:
(2<3) là một biểu thức logic có giá trị true (đúng).
(4=5) là một biểu thức có giá trị false (sai)
(x<=5), (x<>y) cũng là các biểu thức, giá trị của chúng phụ thuộc giá trị hiện
tại của x, y. Chẳng hạn nếu lúc ấy x=6 thì (x<=5) có giá trị false.
Biểu thức logic phức hợp: ghép các biểu thức logic bằng các phép toán logic ta
đươc biểu thức phức hợp. Các phép toán logic thường dùng:

7


Làm quen lập trình với ngơn ngữ Pascal
- Not: là phép tốn một ngơi. Nếu A là một biểu thức logic thì not A cũng là
một biểu thức logic, có giá trị true nếu A là false và ngược lại.
Ví dụ: not (a<=5) tương đương với a>5.
- And: là phép tốn logic 2 ngơi. Nếu A, B là 2 biểu thức logic thì (A and B)
cũng là một biểu thức logic, sẽ có giá trị true khi cả A, B đều là true (“chỉ đúng khi
cả hai đều đúng”) và là false trong các trường hợp cịn lại.
Ví dụ:
(x=5)

and (x mod 2=1)


(x>5)

and (x<10)

là true khi x=5;

chỉ là true khi 5
- Or: cũng là phép tốn logic 2 ngơi tương tự như phép and. Tuy nhiên phép
or “chỉ sai khi cả 2 cùng sai”.
Ví dụ:(x=0) or (x=1) là true khi x=0 hoặc x=1, chỉ sai khi x khác cả 0 và 1.
Dùng các phép toán so sánh và logic chúng ta có thể biểu diễn được được các biểu
thức đủ phức tạp dùng trong các chương trình của chúng ta.

4.Kiểu ký tự:
Ký tự là kiểu dữ liệu phục vụ cho việc lưu trữ thông tin dưới dạng chữ. Chẳng hạn
tên lớp như A, B, C, E…có thể lưu trữ dưới dạng ký tự. Hay các chữ số 0, 1, 2,…
có thể in ra màn hình dưới dạng các ký tự.
Trong Pascal tên kiểu ký tự là char (viết tắt của character), biểu diễn được 256
ký tự (đánh thứ tự từ 0 đến 255). Các bạn có thể tham khảo mã các ký tự thường
gặp ở phụ lục E.
Các hằng ký tự: để viết một hằng ký tự bạn gõ chúng và đặt giữa hai dấu nháy trên
(tuy nhiên khi in thì khơng có các dấu nháy ấy). Chẳng hạn ‘A’ là ký tự biểu diễn
chữ cái A, ‘ ’ là ký tự dấu cách, ‘0’ là ký tự biểu diễn chữ số 0… Bạn cũng có
thể viết dạng #n, trong đó n là thứ tự của ký tự. Ví dụ #13 là ký tự Enter, #27 là
ký tự Esc, #8 là ký tự Tab, #9 là ký tự Backspace…
Chú ý cách viết 0 và ‘0’: 0 là một hằng nguyên có giá trị 0 còn ‘0’ là ký tự chữ
số 0 (có thứ tự 48).

Các phép xử lý cho kiểu ký tự:

1- hàm ord(ch) cho thứ tự của ký tự ch. Ví dụ ord(‘A’)=65,
ord(‘0’)=48, ord(#13)=13…
8


Làm quen lập trình với ngơn ngữ Pascal
2- hàm chr(n): cho lại ký tự có thứ tự n (tương đương với #n khi n là một hằng
nguyên). Ví dụ chr(65)= ‘A’, chr(48)= ‘0’…
3- hàm Upcase đổi chữ hoa. Ví dụ Upcase(‘a’)=’A’, Upcase(‘B’) vẫn
là ‘B’…
4- các phép so sánh: =, <>, <, >, <=, >=,… So sánh các ký tự được thực hiện bằng
việc so sánh thứ tự của chúng. Ví dụ (‘0’<‘A’) có giá trị true, (A’=#64) có giá
trị false.

5.Kiểu chuỗi (còn gọi là xâu):
Kiểu ký tự chỉ biểu diễn được một chữ . Trong trường hợp dữ liệu lớn, gồm nhiều
chữ (các từ, câu…) chẳng hạn: tên người, địa điểm, dịng thơng báo… bạn phải sử
dụng kiểu dữ liệu dạng chuỗi. Trong Pascal có kiểu String để biểu diễn chuỗi. Các
câu thông báo mà ta viết trong các chương trình ở chương 1 chính là dữ liệu kiểu
chuỗi. Có thể nói chuỗi là một dãy liên tục các ký tự (tối đa là 255 ký tự, đủ dùng
trong đa số trường hợp).
Các hằng chuỗi được viết giữa hai dấu nháy ‘ ’. Các ký tự đặc biệt không được
dùng để đặt tên như dấu cách (‘ ’), dấu ‘-’…đều có thể đặt trong nội dung của
chuỗi.
Ví dụ: ‘Xin chao cac ban’, ‘Turbo Pascal’,…
Để viết dấu nháy ‘ chẳng hạn trong chuỗi “It’s very easy.” các bạn gõ 2
dấu nháy liên tục: ‘It’’s very easy’.

Các phép xử lý cơ bản trên kiểu chuỗi:
1- hàm length(s) cho lại chiều dài (số ký tự thực sự) của chuỗi s. Ví dụ

length(‘Pascal’)=6, length(‘Very easy’)=9 (tính cả dấu cách)…
2- phép cộng chuỗi: nếu s1, s2 là 2 chuỗi thì s1+s2 sẽ là chuỗi trong đó s2 kế
tiếp sau s1. Ví dụ: ‘Hoa ’+‘sen’=‘Hoa sen’.
Đó là các kiểu dữ liệu cơ sở thường dùng trong Pascal. Trong đó các kiểu ngun,
ký tự, logic cịn gọi là các kiểu đếm được (nghĩa là những phần tử của chúng là rời
rạc và có thể đánh số thứ tự được).

6. Các kiểu dữ liệu tự tạo:
Pascal cho phép lập trình viên dựa trên những kiểu dữ liệu cơ sở tạo ra những kiểu
dữ liệu mới. Q trình đó theo hai chiều hướng:
9


Làm quen lập trình với ngơn ngữ Pascal
1- thu hẹp khoảng biểu diễn hay thay tên gọi của phần tử ta được kiểu khoảng con
và kiểu liệt kê.
2- xây dựng kiểu mới có thành phần là các kiểu đã biết. Ta gọi chúng là kiểu dữ
liệu có cấu trúc (chúng gồm kiểu dãy (kiểu mảng: array), kiểu bản ghi (record),
kiểu tập hợp(set), kiểu đối tượng (object))…Chúng ta sẽ nghiên cứu chúng trong
phần sau.
Khai báo các kiểu dữ liệu tự tạo (custom data type) ta dùng từ khố type như
sau:
Type
<tên kiểu>=<mơ tả>;
Trong đó <tên kiểu> là tên ta đặt cho kiểu, <mô tả> là nội dung về cấu trúc
của kiểu, <mô tả> của các kiểu khác nhau là khác nhau.
Vì thế mỗi khi học về kiểu dữ liệu mới (nhất là các kiểu dữ liệu có cấu trúc) ta đều
nghiên cứu cách mô tả chúng đầu tiên.
<mô tả> cho một kiểu có thể là tên của một kiểu khác đã được định nghĩa.
Chẳng hạn bạn muốn khai báo một kiểu có tên là logic với các phần tử có giá trị

logic như của kiểu boolean (nói cách khác là đặt tên khác cho kiểu boolean)
bạn có thể viết như sau:
type
logic

= boolean;

Trong phần này ta sẽ tìm hiểu cách mơ tả và khai báo các kiểu khoảng con và kiểu
liệt kê.
Kiểu khoảng con gồm nhiều phần tử liên tiếp của một kiểu dữ liệu cơ sở đếm được
tạo nên.
Ví dụ các các ký tự chữ số gồm 10 phần tử liên tiếp từ ‘0’ đến ‘9’ của kiểu char.
Ta khai báo kiểu chu_so như sau:
Type
Chu_so = ‘0’..‘9’;

Ta thấy rằng mô tả cho một kiểu khoảng con ta viết a..b, trong đó a là phần tử
đầu tiên, b là phần tử cuối cùng của trong khoảng, dấu .. là 2 dấu chấm viết liên
tiếp. (Chú ý trong tài liệu này tác giả không phân biệt “khoảng” và “đoạn” như
trong Toán. Cả hai đều hiểu là các phần tử liên tiếp từ cận đầu đến cận cuối).
Như vậy mô tả kiểu số nguyên từ 1 đến 100 ta viết là 1..100, mô tả kiểu các chữ
cái Latin hoa ta viết ‘A’..‘Z’…
10


Làm quen lập trình với ngơn ngữ Pascal
Ghi nhớ: chỉ có các kiểu dữ liệu đếm được (nguyên, ký tự, logic) là có kiểu
khoảng con. Khơng thể mơ tả khoảng con của kiểu thực. Nếu bạn khai báo một
kiểu có mô tả: 2.5..3.1 máy sẽ báo lỗi.
Các biến của kiểu khoảng con chỉ được nhận giá trị trong miền đã mô tả, nếu

không máy sẽ báo lỗi.

11


Làm quen lập trình với ngơn ngữ Pascal
Kiểu liệt kê được mô tả bằng các liệt kê tên các phần tử đặt trong cặp ngoặc.
Chẳng hạn ta muốn khai báo một kiểu planet mô tả tên các hành tinh trong hệ Mặt
trời. Ta viết như sau:
Type
Planet=(Mercury, Venus, Earth, Mars,

Jupiter,

Saturn,

Uranus, Neptune, Pluto);

Ghi nhớ: Tên các phần tử của kiểu liệt kê phải viết theo các quy tắc đặt tên.

Các thao tác cơ bản trên dữ liệu:
Phần lớn chương trình đều hoạt động theo các bước:
1- Nhập dữ liệu từ phía người dùng.
2- Xử lý dữ liệu theo mục đích của chương trình.
3- Xuất dữ liệu đã xử lý tới người dùng.
Bước 1 và bước 3 còn gọi là “I/O (Input - Output)”, là những bước tuy
không quan trọng nhất nhưng rất cần thiết.

Các thao tác nhập - xuất cơ bản:
Trong chương này ta chỉ mới học các kiểu dữ liệu cơ sở nên cũng chỉ nghiên cứu

các thao tác nhập - xuất cơ bản với các kiểu dữ liệu cơ sở. Đó là thao tác read và
write.

Read là thao tác nhập dữ liệu (input) cơ bản.
Trong trường hợp nhập dữ liệu từ bàn phím thì lệnh read có dạng sau:
Read(<biến>);
Các kiểu dữ liệu có thể nhập bằng read: kiểu nguyên, kiểu thực, kiểu ký tự, kiểu
chuỗi.
Ví dụ: read(n); read(a); read(c); …
Read khơng chỉ nhập cho một biến mà có thể nhập cho nhiều biến. Bạn chỉ cần
viết dãy biến cách nhau bởi dấu “,”.
Ví dụ: 3 lệnh read trên có thể thay bởi một lệnh read(n, a, c);
Máy sẽ ngừng nhập cho một biến và chuyển sang biến tiếp theo nếu gặp các ký tự
phân cách:
- với kiểu nguyên và thực: ký tự “cách” (Space), Tab, “xuống dòng” (Enter).
12


Làm quen lập trình với ngơn ngữ Pascal
- với kiểu String: ký tự “xuống dịng” (Enter).
Riêng kiểu ký tự thì máy sẽ chuyển sang nhập cho biến tiếp theo ngay khi nhận
được một ký tự, kể cả ký tự phân cách như space, tab, enter.
Nếu bạn thay lệnh Read bằng lệnh ReadLn (đọc là read line) thì máy sẽ nhập cho
đến khi gặp ký tự xuống dòng (do nhấn Enter). Đó là lý do vì sao ở cuối chương
trình thường có lệnh readln; để chờ người dùng xem kết quả rồi nhấn Enter để kết
thúc chương trình. Có thể hiểu readln đơn giản là read rồi xuống dịng.
Đó cũng là lý do vì sao khi nhập ký tự hay nhập chuỗi người ta thường chỉ dùng
lệnh readln: readln(s);

Write là thao tác xuất dữ liệu (output) cơ bản.

Trong trường hợp xuất dữ liệu ra màn hình thì lệnh write có dạng sau:
Write(<biểu thức>);
Các kiểu dữ liệu có thể xuất bởi write: kiểu nguyên, kiểu thực, kiểu ký tự, kiểu
chuỗi, kiểu logic.
Tương tự read, write cũng có thể xuất nhiều biểu thức trong một lệnh và cũng có
dạng tương tự readln là writeln (đọc là write line) Có thể hiểu writeln đơn giản là
write rồi xuống dòng.

Các thao tác xử lý cơ bản :
Thao tác xử lý dư liệu cơ bản nhất là thay đổi giá trị của nó. Ngồi thay đổi bằng
nhập giá trị mới cho nó cịn có một thao tác đơn giản khác là gán trị.
Lệnh gán có dạng như sau:
<biến> := <biểu thức>;
Lệnh sẽ tính giá trị của biểu thức rồi thay đổi giá trị của <biến> bởi giá trị tính
được của biểu thức. Trong đa số trường hợp lệnh gán chỉ có thể thực hiện khi
<biến> và <biểu thức > cùng kiểu. Tuy nhiên có một số ngoại lệ:
1- Biến kiểu thực có thể gán bởi biểu thức kiểu nguyên. Điều ngược lại không hợp
lệ, cần phải dùng các hàm làm tròn:
Hàm round(x) cho số nguyên gần x nhất (làm tròn x).
Hàm trunc(x) cho phần nguyên của số thực x.
2- Biến kiểu chuỗi có thể gán bởi biểu thức kiểu ký tự. Điều ngược lại không hợp
lệ.
13


Làm quen lập trình với ngơn ngữ Pascal
3- Dùng phương pháp chuyển đổi kiểu biểu thức. Đây là phương pháp lập trình
cao cấp, khơng đề cập ngay được trong chương này.
Chú ý phân biệt lệnh gán (:=) với phép so sánh =, bởi đó là hai dạng khác nhau.
Chẳng hạn phép so sánh n = n+1 cho giá trị false cịn lệnh n := n + 1; sẽ

tính biểu thức (n + 1) rồi gán giá trị đó cho n, kết quả là n được tăng thêm một.
Nếu ta khai báo:
Var
n : integer;
a : char;
x : real;
s : string;

Thì các phép gán sau hợp lệ:
a := ‘0’; {gán cho a ký tự ‘0’}
n := ord (a);{gán cho n thứ tự của a -> n =48}
x := n; {gán giá trị của n cho x -> x =48}
s := a; {gán giá trị của a cho s -> s=’0’}
a := chr (n + 8);{gán cho a giá trị của hàm chr(n+8)-> a=’8’}
x := sqr(x) + exp(2);{gán cho x giá trị của x2+e2}

Phép gán thường dùng cho các cơng việc tính giá trị của các biểu thức.
VD_02_01: Tính chu vi và diện tích hình chữ nhật khi biết 2 cạnh của nó.
Phân tích: đây là một bài tốn tính tốn, dữ liệu vào là 2 cạnh, dữ liệu ra là chu vi
và diện tích. Ta sẽ dùng 4 biến kiểu thực là a,b (2 cạnh ) và cv, dt (chu vi và diện
tích). Để tính kết quả ta sử dụng các cơng thức tính chu vi và diện tích hình chữ
nhật trong hình học.
Phần khai báo biến như sau:
var
a, b, cv, dt : real;

Sau đó là phần nhập dữ liệu vào:
write('Nhap do

lon 2 canh


a,b : ');

readln(a,b);

Ta dùng câu lệnh write viết ra dịng thơng báo để người dùng hiểu ý nghĩa của dữ
liệu mình sắp nhập.
Ta tính giá trị cho cv và dt theo cơng thức trong hình học:
14


Làm quen lập trình với ngơn ngữ Pascal
cv := 2 * (a+b);
dt := a * b;

Sau đó là xuất dữ liệu ra:
writeln('Chu vi = ', cv :5:2 );
writeln('Dien tich = ', dt :5:2 );

Trong 2 câu lệnh write trên có sử dụng định dạng output. Đó là cv:5:2. Phần
định dạng ở đây là :5:2 có nghĩa là dành 5 cột để viết nội dung của cv, trong đó
có 2 cột dành cho các chữ số thập phân.
Tồn văn chương trình:
program

VD_02_01;

var
a, b, cv, dt : real;


begin
writeln('Chuong trinh tinh chu vi va dien tich hinh chu nhat.');
write('Nhap do

lon 2 canh

a,b : ');

readln(a,b);
cv := 2 * (a+b);
dt := a * b;
writeln('Chu vi = ', cv :5:2 );
writeln('Dien tich = ', dt :5:2 );
readln;

end.
Error! Bookmark not defined.

VD_02_02: Lập chương trình đổi inch sang cm biết 1 inch = 2,54 cm.
Phân tích: đây cũng là một bài tốn tính tốn. Dữ liệu vào là một độ dài L theo đơn
vị inch, dữ liệu ra là độ dài đó theo đơn vị cm. Theo giả thiết ta chỉ việc nhân 2.54
với L là được kết quả.
Toàn văn chương trình:
program VD_02_02;
var
L : real;
begin
writeln('Chuong trinh doi don vi tu inch sang cm.');
15



Làm quen lập trình với ngơn ngữ Pascal
write('Nhap do dai (theo don vi inch):');
readln(L);
writeln('Do dai do theo don vi cm la: ', 2.54*L :0:2, ' cm.');
readln;
end.
Error! Bookmark not defined.

Trong câu lệnh write ở trên ta dùng :0:2 trong định dạng output cho biểu thức
kiểu thực (2.54*L). Điều đó khơng có nghĩa là không dành cột nào để ghi nội
dung của biểu thức mà là dùng tuỳ ý, đủ để viết hết là được.
VD_02_03: Tính quãng đường đi được s của một vật chuyển động nhanh dần đều
khi biết vận tốc ban đầu v0, gia tốc a và thời gian t.
Phân tích: dữ liệu vào là v0, a và t, dữ liệu ra là s. Ta tính s theo cơng thức trong
vật lý: s =

1 2
at + v0 t.
2

Toàn văn chương trình:
program

VD_02_03;

var
s, v, a, t : real;

begin

writeln('Chuong trinh tinh quang duong trong chuyen dong
nhanh dan deu.');
write('Nhap gia toc, van toc ban dau va thoi gian
readln(a,v,t);
s := a * sqr(t)/2 + v * t;
writeln('Quang duong di duoc la : ', s :0:2);
readln;

end.

16

');


Làm quen lập trình với ngơn ngữ Pascal

Chương 3 : Các cấu trúc điều khiển
Chúng ta sẽ nghiên cứu các cấu trúc điều khiển qua các ví dụ:
VD_03_01: Viết chương trình nhập vào từ bàn phím một số tự nhiên rồi kiểm tra
xem nó là số chẵn hay lẻ.
Phân tích:Những công việc chúng ta sẽ phải làm là:
1- Nhập số nguyên n.
2- Kiểm tra chẵn lẻ.
3- Đưa ra thông báo.
Việc nhập số chắc các bạn đã quen. Trong chương trình ta dùng biến n kiểu
integer để lưu giá trị của số tự nhiên. Khi đó việc đọc số đã cho sẽ được thực hiện
bằng câu lệnh: readln(n);
Việc kiểm tra một số là số chẵn hay lẻ khơng khó. Thật vậy số đó là số chẵn khi và
chỉ khi nó chia cho 2 dư 0. Trong Pascal phép chia dư là phép toán mod (mod chỉ

áp dụng được với số nguyên). Chẳng hạn A, B là 2 biểu thức nguyên thì A mod
B sẽ là số dư của phép chia A cho B.
Vấn đề bây giờ chỉ là việc thông báo kết quả. Mà kết quả chỉ có thể là một trong
hai trường hợp “chẵn” và “lẻ”, phụ thuộc và kết quả của phép toán n mod 2 là 0
hay 1.
Để xử lý những trường hợp dạng này ta có thể dùng cấu trúc điều khiển if của
Pascal.
Cấu trúc có dạng đầy đủ như sau:
if <biểu thức> then
<câu lệnh 1>
else
<câu lệnh 2>;
Trong đó:
* if, then, else là các từ khố (keyword);
* <biểu thức> là một biểu thức có kiểu logic;
* <câu lệnh 1> và <câu lệnh 2> là các câu lệnh. Chú ý <câu lệnh1>
không được kết thúc bằng dấu ;.
Hoạt động của câu lệnh if như sau:
17


Làm quen lập trình với ngơn ngữ Pascal
1- tính giá trị của <biểu thức>
2- nếu kết quả là true thì <câu lệnh 1> được thực hiện, ngược lại thực hiện
<câu lệnh 2>.
Nếu phần else là khơng cần thiết thì bạn có thể viết lệnh ở dạng khuyết:
if
<biểu thức> then <câu lệnh>;
{Nghĩa là nếu <biểu thức> là true thì thực hiện <câu lệnh>.}
Như vậy đoạn chương trình của chúng ta như sau:

readln(n);
if (n mod 2)=0 then
writeln(n, 'la so chan.')

else
writeln(n,'la so le.');
readln;

Toàn văn chương trình:
program

vd_03_01;

var
n : integer;

begin
write('Nhap vao mot so nguyen n = ');
readln(n);
if (n mod 2) = 0 then
writeln(n, ' la so chan.')
else
writeln(n, ' la so le.' );
readln;

end.

Error! Bookmark not defined.
VD_03_02: Viết chương trình giải phương trình bậc nhất ax+b=0.
Phân tích: Thuật tốn có được theo cách giải trong mơn tốn:

Nếu a<>0 thì có một nghiệm là x= - b/a,
ngược lại (a=0) thì
nếu b<>0 thì vơ nghiệm,
18


Làm quen lập trình với ngơn ngữ Pascal
ngược lại (b<>0) thì có mọi số đều là nghiệm.
Rõ ràng là chúng ta có thể dùng lệnh if, và trong trường hợp này <câu lệnh>
của if lại là một lệnh if:
readln(a,b );{ nhập hệ số }
if a=0 then
if b=0 then
writeln('Moi so thuc deu la nghiem')
else
writeln('Phuong trinh vo nghiem')

else
writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5);

Tồn văn chương trình:
program

VD_03_02;

var
a,b

: real;


begin
');

writeln('Chuong trinh giai phuong trinh bac nhat ax+b=0
writeln('Nhap hai he so ');
readln(a,b);
if a=0 then
if b=0 then
writeln('Moi so thuc deu la nghiem')
else
writeln('Phuong trinh vo nghiem')
else
writeln('Phuong trinh co nghiem duy nhat x = ',-b/a:0:5);
readln;

end.

Error! Bookmark not defined.
VD_03_03: Giải phương trình bậc hai ax2 + bx + c = 0;
Phân tích: Ta cũng có thuật tốn theo kiến thức mơn tốn:
Δ = b 2 − 4ac
19


Làm quen lập trình với ngơn ngữ Pascal
Nếu ∆<0 thì phương trình vơ nghiệm.
Nếu ∆=0 thì phương trình có nghiệm kép
Nếu ∆>0 thì phương trình có 2 nghiệm

x=−


x1, 2 =

b
.
2a

−b± ∆
2a

.

Như vậy ta có thể cài đặt bình thường trong Pascal bằng các lệnh if. Tuy nhiên ở
phần ∆>0 ta vừa phải thơng báo có 2 nghiệm vừa output giá trị của 2 nghiệm đó.
Điều đó cũng có thể thực hiện trong một lệnh write bằng cách viết nhiều biểu thức
liền nhau, tuy nhiên trông rất loằng ngoằng (bạn cứ thử mà xem). Cách giải quyết
“đẹp” hơn là sử dụng cấu trúc câu lệnh phức.
Câu lệnh phức có dạng:
begin
<dãy các câu lệnh cách nhau bởi ; >
end;
Câu lệnh phức được xử lý như một câu lệnh thơng thường. Vì thế câu lệnh phức là
cách giải quyết hợp lý trong trường hợp ta cần thực hiện nhiều câu lệnh trong khi
cấu trúc điều khiển chỉ cho phép viết một câu lệnh.
Trong chương trình trên trường hợp ∆>0 ta có thể viết như sau:
if

d>0 then
begin
x1 := (-b + sqrt(d))/ (2*a);

x2 := (-b/a) - x1;

{dùng công thức Vi-et}

writeln('Phuong trinh co 2 nghiem phan biet:');
writeln('x1 = ',x1:0:5);
writeln('x2 = ',x2:0:5);
end;

Tồn văn chương trình:
program

VD_03_03;

var
a, b, c, d : real;
x1, x2 : real;

begin
writeln('Chuong
a*x*x+b*x+c=0');

trinh
20

giai

phuong

trinh


bac

hai


Làm quen lập trình với ngơn ngữ Pascal
write('Nhap he so a,b,c: ');
readln(a,b,c);
d := sqr(b) - 4*a*c ;
if d<0 then
writeln('Phuong trinh vo nghiem.');
if d=0 then
);

writeln('Phuong trinh co nghiem kep: x = ',-b/(2*a):0:5
if d>0 then
begin
x1 := (-b + sqrt(d))/(2*a);
x2 := -b/a - x1 ;
writeln('Phuong trinh co 2 nghiem phan biet:');
writeln('x1 = ',x1:0:5);
writeln('x2 = ',x2:0:5);
end;

readln;
end.
Error! Bookmark not defined.
Thực ra ta không cần tách ra 3 câu lệnh if như ở chương trình trên mà có thể dùng
các lệnh if lồng nhau (câu lệnh của if là một câu lệnh if), chẳng hạn dạng:

if

d<0 then <…>

else
if d=0 then <…>
else begin
<…>
end;

Khi đó chương trình chắc chắn nhanh hơn, vì số lần kiểm tra ít đi. Tuy nhiên nếu
lồng nhau q nhiều thì có thể chương trình sẽ khó đọc vì thiếu sáng sủa. Chẳng
hạn ta xét ví dụ sau:
VD_03_04: Xét học bổng cho học sinh có thể có 4 loại: A (240.000đ), B
(180.000đ), C (120.000đ), D (80.000đ) và O (khơng có học bổng). Cần lập chương
trình xử lý thơng tin về học bổng cho sinh viên: sẽ nhập loại học bổng và số tháng
được lĩnh rồi xuất ra tổng số tiền học bổng sinh viên đó nhận được.
Chương trình đầu tiên dùng cấu trúc if lồng nhau:
21


Làm quen lập trình với ngơn ngữ Pascal
program

VD_03_04;

var
l

: char;


m,t : real;

{có thể t khơng ngun, chẳng hạn 3 tháng rưỡi}

begin
writeln('Chuong trinh tinh hoc bong.');
write('Ban duoc hoc bong loai nao (A,B,C,D) ');
readln(l);
write('So thang ban duoc linh: ');
readln(t);
l := UpCase(l);
if l = 'A' then
m := 240000 * t
else
if l = 'B' then
m := 180000 * t
else
if l = 'C' then
m := 120000 * t
else
if l = 'D' then

m :=

80000 * t

else
m := 0;
writeln('Ban duoc ',m :0:0, ' VND.' );

readln;
end.
Error! Bookmark not defined.
Bạn thấy đấy: với 4 lệnh if lồng nhau, chương trình trông không được đẹp lắm,
mặc dù vẫn chạy đúng. Ngôn ngữ Pascal có một cấu trúc hay hơn dùng cho trường
hợp này, đó là cấu trúc case. Cấu trúc có dạng sau:
case <biểu thức>of
22


Làm quen lập trình với ngơn ngữ Pascal
<nhãn 1> : <câu lệnh 1>;
...
<nhãn n> : <câu lệnh n>;
else
<câu lệnh>
end;
Trong đó:
* case, of, end, else là những từ khoá.
* <biểu thức> là một biểu thức Error! Bookmark not defined..
* <câu lệnh>, <câu lệnh 1>, ..., <câu lệnh n> là những câu
lệnh.
Nhãn có thể là một biểu thức cùng kiểu, một miền con hay một dãy các nhãn hợp
lệ ngăn cách nhau bởi dấu ,.
Câu lệnh thực hiện như sau:
1- Tính giá trị biểu thức.
2- Lần lượt so sánh giá trị đó với các nhãn, nếu nhãn nào thoả mãn thì câu lệnh
tương ứng được thực hiện rồi chuyển sang câu lệnh tiếp theo.
3- Nếu khơng có nhãn nào thoả mãn thì câu lệnh của else sẽ được thực hiện
Cấu trúc case cũng có dạng khuyết khơng có else. Khi đó nếu khơng có nhãn

nào thoả mãn thì đơn giản là chuyển sang câu lệnh tiếp theo.
Chương trình trên được viết lại bằng cấu trúc case như sau, có vẻ trơng đẹp hơn
nhiều:
program VD_03_05;
var
l

: char;

m,t : real;
begin
writeln('Chuong trinh tinh hoc bong.');
write('Ban duoc hoc bong loai nao (A,B,C,D) ');
readln(l);
write('So thang ban duoc linh: ');
23


Làm quen lập trình với ngơn ngữ Pascal
readln(t);
case UpCase(l) of
'A': m := 240000 * t;
'B': m := 180000 * t;
'C': m := 120000 * t;
'D': m :=

80000 * t;

else
m := 0;

end;
writeln('Ban duoc ',m :0:0, ' VND.' );
readln;
end.
Error! Bookmark not defined.
Chúng ta xem xét một ví dụ kiểu khác:
VD_03_06: Tính tổng các số tự nhiên từ 1 đến n với n nhập từ bàn phím.
Phân tích: Trong tốn ta có cơng thức tổng quát: sn = 1 + 2 + … n =
cách giải quyết đơn giản là thay n vào cơng thức để tính kết quả.

n(n + 1)
2

nên

Tuy nhiên khơng phải lúc nào ta cũng có cơng thức tổng qt và tính theo cơng
thức tổng qt khơng phải lúc nào cũng hiệu quả nhất nên ta tìm một cách giải
quyết khác: Sn có thể định nghĩa một cách truy hồi như sau:
s0 = 0.
Sn = Sn-1 + n;

Từ đó ta có thể tính sn bằng cách cho tăng dần i từ 1 đến n và tính si = si -1+ i. Sau
q trình đó i=n và ta được sn là kết quả cần tính.
Như vậy ở đây ta sẽ thực hiện cơng việc tính cơng thức truy hồi (si = si -1 + i) một
số lần xác định trước (n lần). Cấu trúc for trong Pascal cho có thể dùng trong
trường hợp này, tức là khi phải làm một công việc lặp đi lặp lại một số lần định
trước.
Cấu trúc for (cịn gọi là vịng for) có dạng như sau:
for <biến đếm>:= <biểu thức 1> to <biểu thức 2> do lệnh>;

24


Làm quen lập trình với ngơn ngữ Pascal
Trong đó:
* for, to, do là các từ khoá.
* <biến đếm> là một biến có kiểu đếm được (ngun, kí tự, liệt kê, logic…).
* <biểu thức 1>,<biểu thức 2> là các biểu thức có giá trị cùng kiểu với
<biến đếm>
* <câu lệnh> là một câu lệnh, có thể là câu lệnh đơn hoặc phức.
Cấu trúc hoạt động như sau:
1- tính giá trị <biểu thức 1> và <biểu thức 2>.
2- nếu <biểu thức 1> lớn hơn <biểu thức 2> thì chuyển sang
lệnh tiếp theo.
3- gán <biến đếm> bởi giá trị <biểu thức 1>.
4- thực hiện <câu lệnh>.
5- nếu <biến đếm> bằng <biểu thức 2> thì thốt khỏi vịng lặp,
ngược lại thì gán <biến đếm> bằng giá trị tiếp theo của nó (đếm>:=succ(<biến đếm>)) và quay lại bước 4.
Như vậy đoạn chương trình tính tổng có thể viết như sau:
s := 0;
for i := 1 to n do
s := s + i;

Chúng ta không cần đặt tường minh các biến si mà coi s lưu trữ giá trị của si ứng
với mỗi giá trị của i trong vòng lặp. Câu lệnh s := s + i; có nghĩa là gán cho s
giá trị biểu thức (s + i) tương đương với cộng thêm vào s một lượng i.
Tồn văn chương trình:
program


VD_03_06;

var
n, s, i : integer;

begin
writeln('Chuong trinh tinh tong cac so tu 1 den

n.');

write('Cho n = ');
readln(n);
s := 0;
25


×