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 (735.23 KB, 141 trang )
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Readln(k)
End;
Từ các lệnh đơn giản và các lệnh có cấu trúc đã có lại có thể xây dựng được các lệnh có
cấu trúc phức tạp hơn, ví dụ:
If k>= 0 then Writeln(k)
else
Begin
Writeln(‘ k âm, xin nhập lại: ‘);
Readln(k);
End;
Sau đây sẽ trình bày kỹ về một lệnh đơn giản và thông dụng: lệnh gán.
b. Lệnh gán
Lệnh gán có cú pháp như sau: TênBiến:= Biểuthức;
Ý nghĩa: tính toán biểu thức bên phải, rồi lưu kết qủa tính được vào tên biến ở vế trái.
Ví dụ, cho khai báo:
Var A, B: Real; K: Integer;
Khi dùng lệnh các lệnh:
K:= 10 ; B:= K* 3+4.5;
thì biến K có giá trị là 10, biến B có giá trị là 34.4.
Nếu thực hiện tiếp lệnh gán: B:= 17/2; thì giá trị của B bây giờ sẽ là 8.4.
Như vậy nếu một biến được gán nhiều lần thì nó sẽ lấy giá trị của lần gán sau cùng, tính
đến thời điểm đang xét.
Yêu cầu để cho lệnh gán thực hiện được là kiểu dữ liệu của biểu thức ở vế phải phải phù
hợp với kiểu dữ liệu của biến ở vế trái, nếu không phù hợp thì khi dịch (Compile) chương
trình, Turbo Pascal sẽ thông báo lỗi: "Error 26: Type mismatch". Ví dụ, lệnh gán dưới đây
là sai vì vế trái là kiểu thực còn vế phải là kiểu chuỗi: A:=‘Pascal’;
Chú ý rằng một số nguyên có thể gán cho một biến thực, (chẳng hạn lệnh A:=10; là
đúng), nhưng một số thực không thể gán cho một biến nguyên. Ví dụ lệnh K:=10/4; là sai
vì biến K có kiểu nguyên, còn vế phải cho kết qủa là một số thực (=2.5).
Xét thêm ví dụ về các kiểu dữ liệu khác:
Cho khai báo:
Ngôn ngữ lập trình Pascal
18
BỘ MÔN TIN HỌC
Var
TRƯỜNG ĐẠI HỌC HOA LƯ
Ch: Char ; St: String[20];
Khi đó: Lệnh St:=‘A’; là đúng.
Lệnh St:=‘1234’; là đúng.
Lệnh Ch:=‘ABCD’; là sai vì vế phải là một chuỗi.
Lệnh St:= 100; là sai vì vế phải là một số.
Lệnh Ch:=‘1’ ; là đúng.
Lệnh Ch:=St ; là sai vì vế phải là một chuỗi.
c. Lời chú giải
Lời chú giải có thể đặt tại bất kỳ chỗ nào trong chương trình và được viết theo một trong
hai cách:
{ lời giải thích } hoặc (* lời giải thích *)
Lời giải thích là một chuỗi ký tự giải thích mục đích của chương trình hay của một câu lệnh.
Nó chỉ có tác dụng cho người dùng tham khảo nhằm hiểu nhanh mục đích của chương trình hay
của một câu lệnh mà không cần phải đọc hết chương trình hay câu lệnh đó.
3. Nhập dữ liệu
Nhập và xuất dữ liệu là hai khâu quan trọng trong quá trình xử lý thông tin. Hầu như
chương trình nào cũng phải giải quyết vấn đề nhập, xuất dữ liệu.
a. Nhập dữ liệu kiểu số
Ðể nhập dữ liệu cho biến nguyên hay thực, ta dùng lệnh:
Readln(biến1, biến2, ..., biếnk);
trong đó biến1, biến2,..., biếnk đã được khai báo và có kiểu dữ liệu là nguyên hay thực.
Khi gặp lệnh này, chương trình tạm dừng, chờ ta gõ đủ k số từ bàn phím và kết thúc
bằng Enter, rồi gán lần lượt k số đó cho biến1, biến2, ..., biếnk.
Ví dụ, để nhập dữ liệu cho hai biến thực x, y và biến nguyên j, ta dùng lệnh:
Readln(x, y);
Cách nhập như sau:
hoặc gõ 10 5.5 (có khoảng trắng giữa hai số ),
hoặc gõ từng số và Enter như dưới đây:
10
5.5
Trong cả hai trường hợp ta đều được: x=10 và y=5.4.
Ngôn ngữ lập trình Pascal
19
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Ngoài cách dùng một lệnh Readln(x, y) ; ta cũng có thể nhập riêng cho từng biến bằng
hai lệnh sau:
Readln(x); Readln(y);
b. Nhập dữ liệu kiểu ký tự hay kiểu chuỗi
Ta dùng lệnh:
Readln(biến );
Ví dụ, cho khai báo:
Var
Ho_ten: String[18];
Phai: String[3];
Khoi_thi: Char;
Muốn nhập dữ liệu cho ba biến Ho_ten, Phai, Khoi_thi ta phải dùng ba lệnh:
Readln(Ho_ten);
Readln(Phai);
Readln(Khoi_thi);
Khi nhập, ta gõ:
Tran Van Thanh
nam
A
Kết qủa, ba biến sẽ có giá trị là: Ho_ten = ‘Tran Van Thanh’, Phai= ‘nam’ và
Khoi_thi=‘A’.
Khác với dữ liệu số, ta không nên dùng một lệnh Readln để nhập dữ liệu cho hai hay
nhiều biến kiểu ký tự hay kiểu chuỗi, vì sẽ có những nhầm lẫn không kiểm soát được.
Ví dụ, không dùng lệnh sau: Readln(Ho_ten, Phai, Khoi_thi);
c. Các chú ý
* Dữ liệu nhập phải phù hợp với kiểu của biến. Nếu không phù hợp thì chương trình sẽ
dừng ngay và hiện thông báo lỗi.Ví dụ khi gặp lệnh Readln(j) ; mà ta gõ 3.5 thì bị lỗi
vì j là biến nguyên, còn 3.5 là số thực.
* Lệnh: Readln ; là một dạng nhập dữ liệu đặc biệt vì nó không có biến nào để nhận dữ
liệu nhập vào. Người ta dùng lệnh này khi muốn tạm dừng chương trình để xem kết qủa
trên màn hình, xem xong, gõ phím Enter thì chương trình chạy tiếp.
* Biến kiểu lôgic không nhập được từ bàn phím.
Ngôn ngữ lập trình Pascal
20
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
* Pascal còn có một lệnh nhập dữ liệu nữa là Read, có công dụng như lệnh Readln, nhưng
ít dùng. Sự khác nhau giữa Read và Readln là ở chỗ: sau khi đã nhận đủ các giá trị cho các
biến cần nhập, lệnh Readln sẽ xóa sạch các giá trị nhập thừa, còn lệnh Read thì không. Các
giá trị nhập thừa của lệnh Read sẽ được tự động gán cho các biến trong lệnh nhập tiếp theo.
Ví dụ, xét hai lệnh:
Readln(x, y); Readln(j);
Nếu khi nhập, ta gõ: 12.5 20.6 10
thì x=12.5, y=20.6, còn số 10 thừa bị xóa luôn. Biến j trong lệnh Readln(j) ở dưới không bị
ảnh hưởng. Muốn nhập số 9 cho j, ta gõ 9 .
Với đoạn chương trình:
Read(x, y);
Readln(j);
Nếu khi nhập, ta cũng gõ: 12.5 20.6 10
thì x=12.5, y=20.6, còn số 10 thừa không bị xóa mà tự động gán cho biến j trong lệnh
Readln(j) tiếp theo, kết qủa j=10 cho dù ta chưa muốn nhập cho j.
Vậy, lệnh Read có thể làm sai ý đồ nhập của lệnh nhập tiếp theo.
Lời khuyên là không nên dùng lệnh Read, chỉ dùng Readln.
4. Xuất dữ liệu
Các dữ liệu được in lên màn hình nhờ các lệnh sau:
Writeln(bt1, bt2 , ... , btk ); Write(bt1, bt2 , ... , btk );
ở đây, bt1, bt2, ..., btk là các biểu thức cần phải in giá trị lên màn hình. Trong trường hợp
đơn giản, mỗi biểu thức này có thể là một biến, một hằng, hay một hàm.
Việc in được thực hiện như sau: tại vị trí hiện thời của con trỏ trên màn hình, in ra giá trị
của biểu thức bt1, in tiếp giá trị của biểu thức bt2, ..., in tiếp giá trị của biểu thức btk. Các
giá trị này được in trên một dòng, nếu dài quá khổ màn hình thì sẽ được in tiếp ở dòng
dưới.
Ví dụ, lệnh Writeln(3*2+9); sẽ in lên màn hình số 14.
Nếu i, j là các biến nguyên thì khi thực hiện các lệnh sau:
i:=10 ; j:=15*2 ; Writeln(i, j+1, 678);
trên màn hình sẽ hiện: 1031678.
Ngôn ngữ lập trình Pascal
21
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Sự khác nhau giữa lệnh Writeln và Write là ở chỗ: sau khi in xong giá trị của các biểu
thức, lệnh Writeln sẽ đưa con trỏ xuống đầu dòng dưới, còn lệnh Write thì không. Ðiều này
chỉ ảnh hưởng đến lệnh in tiếp theo mà thôi.
Ví dụ, khi thực hiện hai lệnh sau:
Writeln(‘Thao chuong bang ‘); Writeln(‘ngon ngu pascal’);
kết qủa trên màn hình sẽ hiện hai dòng:
Thao chuong bang
ngon ngu pascal
Nếu thay lệnh đầu bằng Write như dưới đây:
Write(‘Thao chuong bang ‘);Writeln(‘ngon ngu pascal’);
thì kết qủa trên màn hình sẽ hiện ra chỉ một dòng: Thao chuong bang ngon ngu pascal
a. In không định dạng
Ðối với các biểu thức kiểu nguyên, kiểu ký tự, kiểu lô gíc hay kiểu chuỗi, thì lệnh:
Writeln(biểuthức ) ;
sẽ in nguyên văn giá trị của biểu thức. Ví dụ:
Lệnh Writen(‘ket qủa x=‘ , 4+15); sẽ in ra: ket qua x=19
Lệnh Writeln(‘A’ , ‘=‘ , 2*3<5); sẽ in ra: A=FALSE vì biểu thức 2*3< 5 có kết qủa là
FALSE.
Nếu gán: Ho_ten:=‘ Tran Van Thanh’; thì lệnh
Writeln(‘Ho va ten: ‘, Ho_ten);
sẽ in lên màn hình dòng chữ:
Ho va ten: Tran Van Thanh
Cần phân biệt hai đại lượng ‘Ho va ten: ‘ và Ho_ten. Chúng khác nhau hoàn toàn: ‘Ho
va ten: ‘ là một giá trị chuỗi, tức là một hằng chuỗi nên sẽ được in nguyên văn lên màn
hình, còn Ho_ten là một biến kiểu chuỗi nên sẽ in giá trị mà biến này đang chứa.
Ðối với các biểu thức kiểu số thực thì lệnh: Writeln(biểuthức );
sẽ in giá trị của biểu thức ra dưới dạng dấu chấm thập phân di động có cả thảy 17 ký số,
trong đó có 10 ký số trong phần định trị, như sau:
Ngôn ngữ lập trình Pascal
22
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Ví dụ, cho x, y là hai biến thực và gán x:=100/4; y:=-9/300; thì hai lệnh sau:
Writeln(‘ x= ‘, x); Writeln(‘ y= ‘, y);
sẽ in lên màn hình:
x = 2.5000000000E+01
y = -3.0000000000E-02
b. In có định dạng
* In số thực có định dạng:
In các số thực theo cách trên rất khó đọc. Vì thế các số thực thường được in có định
dạng, giống như cách viết số thông thường, bằng lệnh:
Writeln(biểuthức: n: k );
Ở đây n và k là các số tự nhiên, ấn định dùng n cột để in giá trị của biểu thức, trong đó
có k cột dành cho phần thập phân. Nếu số cần in có ít hơn n chữ số thì nó sẽ được in dồn
về bên phải và thêm các ký tự trắng ở bên trái cho đủ n cột.
Ví dụ, cho x, y là các biến kiểu thực và: x:=100/4; y:=-123.4824;
Hai lệnh sau: Writeln(‘ x=‘, x:6:2); Writeln(‘ y=‘, y:10:3); sẽ in lên màn hình:
x= 24.00 (trước số 2 có 1 ký tự trắng)
y= -123.482 (trước dấu - có 2 ký tự trắng)
Nếu n nhỏ hơn chiều dài của số cần in thì số sẽ được in ra với đầy đủ các chữ số trong
phần nguyên. Ví dụ, khi thực hiện các lệnh sau:
x:=12344.675; Writeln(‘x= ‘, x:0:2);
trên màn hình sẽ hiện: x=12344.68
Ở đây máy đã làm tròn số khi bỏ số lẻ cuối cùng.
* In kiểu nguyên, ký tự, chuỗi và lôgic có định dạng:
Dùng lệnh: Writeln(biểuthức: n);
trong đó n là số nguyên ấn định số cột dùng để in giá trị của biểu thức. Nếu n lớn hơn độ
dài của giá trị cần in thì giá trị sẽ được in dồn về bên phải, và thêm các khoảng trắng ở bên
trái cho đủ n cột. Nếu n nhỏ hơn độ dài của giá trị cần in thì giá trị sẽ được in nguyên văn.
Ví dụ:
Lệnh Write(5+40:4); in ra: 45 (có 2 ký tự trắng trước số 45)
Lệnh Write(5+40:1); in ra:45 (in nguyên văn giá trị 45)
Ngôn ngữ lập trình Pascal
23
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Lệnh Write(‘Pascal’:9); in ra: Pascal (có 3 ký tự trắng trước chữ Pascal)
Lệnh Write(‘Pascal’:2); in ra:Pascal (in nguyên văn)
Lệnh Write(‘*’:3); in ra: * (có 2 ký tự trắng trước dấu *)
Các chú ý:
Nhóm ba lệnh: Write(x); Write(y); Write(j); chỉ có tác dụng như một lệnh:
o
Write(x,y,j);
o
Nhóm ba lệnh: Write(x); Write(y); Writeln(j); chỉ có tác dụng như một
lệnh: Writeln(x, y, j);
o
Lệnh: Writeln; không in gì cả, chỉ đơn giản là đưa con trỏ xuống dòng
dưới.
Ngôn ngữ lập trình Pascal
24
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
CÂU HỎI ÔN TẬP
Câu 1:Cho x, y, z là các biến kiểu thực, lệnh nào là sai:
a) x:=y+z;
b) Readln(x, y, z);
c) x+y:=z;
d) Writeln(x+y, z:0:2);
Câu 2: Cho x là biến kiểu thực, sau khi thực hiện hai lệnh: x:=10 ;Writeln(x);
Kết qủa in lên màn hình là:
a) 10;
b) 10.00;
c) 1.0000000000E+01;
d)+1.0000000000E+01;
Câu 3: Cho biến X kiểu thực và gán X:= 12.41 ;
Ðể in lên màn hình như sau: X= 12.41
chọn lệnh nào: a)Writeln(X); b)writeln(X:5); c)writeln('X= ', X:5:2); d)writeln('X=,
X:5:2');
Câu 4: Kiểu dữ liệu của biểu thức 4 div 6 + 6 / 3 + Ord(‘A’) là:
a) nguyên; b) lô gic; c) ký tư ; d) thực;
Câu 5: Cho khai báo: Var Ho, ten: String[15];
Lệnh nào sai:
a) Write(' Ho ten la: ' ; Ho ; Ten); b) Write(' Ho ten la: ' + Ho + Ten);
c) Write(' Ho ten la: ', Ho , Ten) ;
d) Write(' Ho ten la: ', Ho + Ten) ;
BÀI TẬP
Câu 1. Cho S là biến kiểu Boolean. Lệnh nào sai, lệnh nào đúng, nếu đúng thì cho biết giá
trị của S:
a) S:= 3*2; b) S:= 3< 2;
c) S:= 3< 2 and 6 - 5 =1; d) S:= (3< 2) and (6 - 5 =1);
Câu 2. Viết chương trình in lên màn hình như sau:
********************
* SOAN THAO CHUONG BANG *
* * * NGON NGU PASCAL * * * *
********************
Câu 3*. Nhập vào số xe (có bốn chữ số) trong biển số xe máy của bạn. Cho biết số xe của
bạn được mấy nước. Bạn là người may mắn nếu số nước = 9. Bạn có may mắn không ?.
Ví du: số xe là 4546, tổng các chữ số là 4+ 5 + 4 + 6 = 19.
19 mod 10 =9. Số nước là 9, may mắn.
Câu 3. Nhập họ tên, năm sinh, nơi sinh, phái (nam hay nữ) của một người. In lên màn hình
họ tên, năm sinh, nơi sinh, phái và tuổi của người đó.
Ngôn ngữ lập trình Pascal
25
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Câu 4. Nhập họ tên (HT), mức lương tháng (ML) và phụ cấp (PC) của một người, tính
tổng thu nhập (TTN) của người đó:
TTN = ML + PC
Tính qũy bảo hiểm (QBH): QBH=15%*TTN
Tính tiền được lãnh (TIEN): TIEN=TTN - QBH
In họ tên, tổng thu nhập , quỹ bảo hiểm và tiền được lĩnh lên màn hình.
Câu 5. Nhập tên một vật tư, số lượng, đơn giá. Tính tiền và thuế giá trị gia tăng:
Tien =số lượng * đơn giá
Thuế = 10% Tiền
In tên vật tư, số lượng, đơn giá, tiền và thuế giá trị gia tăng lên màn hình, định dạng các
số lấy 2 số lẻ.
Ngôn ngữ lập trình Pascal
26
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Bài 3: CÁC KIỂU DỮ LIỆU ĐƠN GIẢN
1. Khái niệm về kiểu dữ liệu
* Khái niệm
Chức năng của máy điện toán là xử lý các thông tin. Các thông tin được nhập và lưu trữ
trong bộ nhớ của máy dưới các dạng khác nhau: có thể là số, là chữ, có thể là hình ảnh, âm
thanh,.v.v. mà thuật ngữ tin học gọi chung là dữ liệu. Tính đa dạng của dữ liệu đòi hỏi phải
tổ chức và phân phối bộ nhớ thích hợp để lưu trữ và xử lý tốt các dữ liệu. Ngôn ngữ lập
trình chia các dữ liệu thành từng nhóm riêng trên đó xây dựng một số phép toán tạo nên
các kiểu dữ liệu khác nhau, mỗi kiểu dữ liệu là một tập hợp các giá trị mà một biến thuộc
kiểu đó có thể nhận. Khi một biến được khai báo thuộc kiểu dữ liệu nào thì máy sẽ dành
cho biến đó một dung lượng thích hợp trong bộ nhớ để có thể lưu trữ các giá trị thuộc kiểu
dữ liệu đó.
* Phân loại kiểu dữ liệu
Các kiểu dữ liệu trong ngôn ngữ Pascal được chia ra thành hai loại chính: loại đơn giản
và loại có cấu trúc.
Mỗi kiểu dữ liệu đơn giản là một tập các giá trị cơ sở có thứ tự. Ví dụ kiểu Integer gồm
các số nguyên nằm trong phạm vi từ -32768 đến 32767 và có thứ tự tự nhiên: -32768< ... <
-1 < 0 < 1 < ... < 32767 , kiểu lô gic chỉ có hai giá trị False, True với quy ước False < True.
Các kiểu dữ liệu có cấu trúc được xây dựng từ các kiểu dữ liệu đơn giản. Mỗi kiểu dữ
liệu có cấu trúc là một tập các phần tử thuộc kiểu dữ liệu đơn giản được tổ chức lại theo
một quy tắc nhất định .
Các kiểu dữ liệu đơn giản gồm có: kiểu nguyên, kiểu thực, kiểu lô gic, kiểu ký tự,
kiểu liệt kê và kiểu đoạn con.
Các kiểu dữ liệu có cấu trúc gồm có:kiểu mảng, kiểu bản ghi, kiểu tập hợp và kiểu
tập tin .
Riêng chuỗi ký tự (STRING) là một kiểu dữ liệu đặc biệt, vừa có tính đơn giản lại vừa
có tính cấu trúc. Mỗi chuỗi có thể xem là một giá trị, nhưng cũng có thể xem là một mảng
các giá trị kiểu ký tự. Vì vậy, việc sử dụng chuỗi cũng có hai mức khác nhau: mức đơn
giản và mức có cấu trúc.
Các kiểu dữ liệu đơn giản còn được phân thành hai loại: đếm được (Ordinal type) và
không đếm được. Kiểu thực thuộc loại không đếm được, các giá trị của nó dày đặc. Tất cả
các kiểu dữ liệu đơn giản còn lại: nguyên, ký tự, lô gic, liệt kê và đoạn con đều thuộc loại
đếm được (còn gọi là rời rạc).
Ngôn ngữ lập trình Pascal
27
BỘ MÔN TIN HỌC
TRƯỜNG ĐẠI HỌC HOA LƯ
Dưới đây sẽ lần lượt trình bày kỹ về 4 kiểu dữ liệu đơn giản chuẩn và thông dụng: kiểu
nguyên, kiểu thực, kiểu logic, kiểu ký tự . Kiểu chuỗi được giới thiệu để có thể sử dụng
ngay ở mức đơn giản.
2. Kiểu số nguyên
* Các kiểu số nguyên
Ngoài kiểu Integer là thông dụng nhất, các số nguyên còn được chia ra thành 4 kiểu nữa
đó là: Byte, Word, ShortInt và LongInt. Bảng 3.1 liệt kê chi tiết về tên gọi, phạm vi giá trị
và độ dài tính theo đơn vị byte của từng kiểu nguyên.
Tên kiểu
Phạm vi giá trị
Số byte
ShortInt
-128 .. 127
1
Byte
0..255
1
Integer
-32768 .. 32767
2
Word
0 .. 65535
2
LongInt
-2147483648 .. 2147483647
4
Các biến nguyên chỉ có thể nhận các giá trị là các số nguyên nằm trong phạm vi giá trị
của biến đó. Khi gán cho một biến một số nguyên nằm ngoài phạm vi của biến thì máy sẽ
báo lỗi: "Const out of range". Ví dụ, cho khai báo:
Var
i: Byte;N: Integer;
thì các lệnh dưới đây là đúng:
i:= 200;
N:= -1500;
còn các lệnh dưới đây là bị lỗi:
i:= -5;
N:= 50000;
Ðặc biệt không thể gán một số thực cho một biến nguyên. Câu lệnh sau là sai:
N:= 12.5 ;
Khi gặp tình huống này, máy sẽ báo lỗi "Type mismatch".
Chú ý:
Các số nguyên hệ thập lục phân (hệ 16) được biểu diễn bằng cách viết thêm dấu $ ở
trước số, ví dụ ba số dưới đây: $A , $FF và $10
Ngôn ngữ lập trình Pascal
28