Mọi chi tiết xin liên hệ theo địa chỉ : Email: thienthanvitinh.ntb.sp2@gmail.com.. *) Bước 2: Dịch file này lên đĩa theo trình tự sau:.. Mọi chi tiết xin liên hệ theo địa chỉ : Email: [r]
(1)CHƯƠNG NGƠN NGỮ LẬP TRÌNH PASCAL I GIỚI THIỆU
Pascal tên ngơn ngữ lập trình cấp cao thơng dụng Ngơn ngữ lập trình Pascal giáo sư Niklaus Wirth trường Đại học Kỹ thuật Zurich (Thụy sĩ) thiết kế công bố vào năm 1970 Niklaus Wirth đặt tên cho ngôn ngữ Pascal để tưởng nhớ đến nhà Toán học Triết học Pháp kỷ 17 Blaise Pascal, người phát minh máy tính khí đơn giản người
Ngôn ngữ Pascal dùng có nhiều điểm khác biệt với chuẩn Pascal nguyên thủy Giáo sư Wirth Tùy theo quốc gia công ty phát triển cho đời chương trình biên dịch ngơn ngữ Pascal như:
- ISO PASCAL (International Standards Organization) Châu Âu - ANSI PASCAL (American National Standards Institute) Mỹ - TURBO PASCAL hãng BORLAND (Mỹ)
- IBM PASCAL hãng Microsoft (Mỹ) - v.v
Đến nay, ngôn ngữ Pascal phát triển đến phiên Turbo Pascal Version Các diễn giải ví dụ giáo trình chủ yếu sử dụng chương trình Turbo Pascal 5.5 - 7.0, sử dụng rộng rãi Việt Nam
II CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ PASCAL II.1 Bộ ký tự
- Bộ 26 chữ Latin:
Chữ in : A, B, C, , X, Y, Z Chữ thường : a, b, c, , x, y, z - Bộ chữ số thập phân : 0, 1, 2, 3, , 8,
- Ký tự gạch nối : _
- Các ký hiệu toán học : +, -, *, /, =, <, >, (, ), [,} II.2 Từ khóa
Là từ riêng Pascal, có ngữ nghĩa xác định, khơng dùng vào việc khác đặt tên trùng với từ khóa
- Từ khóa chung: PROGRAM, BEGIN, END, PROCEDURE, FUNCTION - Từ khóa để khai báo: CONST, VAR, TYPE, ARRAY, STRING, RECORD, SET, FILE, LABEL
- Từ khóa lệnh lựa chọn: IF THEN ELSE, CASE OF.
- Từ khóa lệnh lặp: FOR TO DO,
FOR DOWNTO DO,
WHILE DO, REPEAT UNTIL.
- Từ khóa điều khiển: WITH, GOTO, EXIT, HALT.
(2)- Từ khóa toán tử: AND, OR, NOT, IN, DIV, MOD. II.3 Tên chuẩn
Tên chuẩn tên định nghĩa sẵn Pascal, người ta định nghĩa lại muốn Trong Pascal ta có tên chuẩn sau đây:
Boolean, Char, Integer, Word, Byte, Real, Text False, True, MaxInt
Abs, Arctan, Chr, Cos, Sin, Eof, Eoln Exp, Ln, Odd, Ord
Round, Trunc, Sqr, Pred, Succ
Dispose, New, Get, Put, Read, Readln,
Write, Writeln
Reset, Rewrite
II.4 Danh hiệu tự đặt
Trong Pascal để đặt tên cho biến, hằng, kiểu, chương trình ta dùng danh hiệu (identifier) Danh hiệu Pascal bắt đầu chữ cái, sau có thể chữ cái, chữ số dấu nối, khơng có khoảng trắng độ dài tối đa cho phép 127
Ví dụ 6.1: Sau danh hiệu: x, S1, Delta, PT_bac_2
Pascal không phân biệt chữ thường chữ hoa danh hiệu Ví dụ 6.2: aa AA một; XyZ_aBc xyZ_AbC
Khi viết chương trình ta nên đặt danh hiệu cho chúng nói lên ý nghĩa đối tượng mà chúng biểu thị iều giúp viết chương trình dễ dàng người khác dễ hiểu nội dung chương trình interger III CẤU TRÚC MỘT CHƯƠNG TRÌNH PASCAL
Hình 6.1: Sơđồ cấu trúc chương trình Pascal Ví dụ 6.3:
(3)PROGRAM Hello; {Dòng tiêu đề}
USES Crt; {Lời gọi sử dụng đơn vị chương trình} VAR Name: string; {Khai báo biến}
PROCEDURE Input; {Có thể có nhiều Procedure Function} Begin
ClrScr; {Lệnh xóa hình}
Write(' ‘Hello ! What is your name ? ‘');Readln(Name); End;
BEGIN {Thân chương trình chính} Input;
Writeln (' ‘Welcome to you, ‘, Name');
Writeln (' ‘Today, we study PASCAL PROGRAMMING ‘'); Readln;
END
Một chương trình Pascal có phần: * Phần tiêu đề:
Phần khóa Program tiếp đến tên chương trình chấm dứt dấu chấm phẩy (;)
Tên chương trình phải đặt theo qui cách danh hiệu tự đặt Phần tiêu đề có hay khơng được.
* Phần khai báo liệu:
Trước sử dụng biến phải khai báo biến đó, nghĩa xác định rõ xem biến thuộc kiểu liệu Một chương trình Pascal có số tất khai báo liệu sau:
CONST: khai báo
TYPE: định nghĩa kiểu liệu
VAR: khai báo biến
* Phần khai báo chương trình con:
Phần mơ tả nhóm lệnh đặt tên chung chương trình để thân chương trình gọi đến nhóm lệnh thi hành
Phần có khơng tùy theo nhu cầu
* Phần thân chương trình:Phần thân chương trình phần quan trọng bắt buộc phải có, phần ln nằm từ khoá BEGIN END lệnh mà chương trình cần thực Sau từ khóa END dấu chấm (.) để báo kết thúc chương trình.
* Dấu chấm phẩy (;): Dấu; dùng để ngăn cách câu lệnh Pascal thiếu được.
(4)* Lời thích: Lời thích dùng để giải cho người sử dụng chương trình nhớ nhằm trao đổi thơng tin người người, máy tính khơng để ý đến lời thích Lời thích nằm ký hiệu: {} (* *)
IV CÁC KIỂU DỮ LIỆU CƠ SỞ: INTEGER, REAL, BOOLEAN, CHAR IV.1 Khái niệm
Dữ liệu (data) tất mà máy tính phải xử lý Theo Niklaus Wirth:
CHƯƠNG TRÌNH = THUẬT TỐN + CẤU TRÚC DỮ LIỆU
Một kiểu liệu (data type) qui định hình dạng, cấu trúc giá trị liệu cách biểu diễn cách xử lý liệu
Trong Pascal kiểu liệu gồm loại sau:
- Kiểu đơn giản (Simple type): bao gồm kiểu số nguyên (Integer), kiểu số thực (Real), kiểu logic (Boolean), kiểu ký tự (Char)
- Kiểu có cấu trúc (Structure type): bao gồm mảng (Array), chuỗi (String), ghi (Record), tập hợp (Set), tập tin (File)
- Kiểu chỉđiểm (pointer):
Trong chương này, xét kiểu liệu đơn giản. IV.2 Kiểu số nguyên (Integer type)
IV.2.1 Kiểu số nguyên thuộc Z chứa Turbo Pascal Được định nghĩa với từ khóa sau:
Từ khoa Số byte Phạm vi
BYTE 255
SHORTINT - 128 127
INTEGER - 32768 + 32767
WORD 65535
LONGINT - 2147483648 2147483647 VAR
I:BYTE; S: INTEGER; …
S:=1;
FOR I:=1 TO DO S:=S*I;
IV.2.2 Các phép toán số học số nguyên
Ký hiệu Ý nghĩa
+ Cộng
- Trừ
* Nhân / Chia cho kết số thực
DIV Chia lấy phần nguyên
(5)MOD Chia lấy phần dư
SUCC (n) n +
PRED (n) n -
ODD (n) TRUE n lẻ FALSE n chẵn IV.3 Kiểu số thực (Real type)
Ở Turbo Pascal, kiểu số thực thuộc tập hợp R chứa bytes, định nghĩa với từ khóa REAL: R =([2.9 x 10-39, 1.7 x 1038]
Hay viết theo dạng số khoa học: R = ( [2.9E-39, 1.7E38]
Số thực viết theo kiểu có dấu chấm thập phân bình thường viết theo kiểu thập phân có phần mũ phần định trị
Các phép toán số học +, -, *, /dĩ nhiên sử dụng kiểu real Bảng hàm số học cho kiểu số thực:
Ký hiệu Ý nghĩa
ABS (x) |x|: lấy giá trị tuyệt đối số x SQR (x) x2: lấy bình phương trị số x SQRT(x) : lấy bậc số x
SIN(x) sin (x): lấy sin x COS (x) cos (x): lấy cos x
ARCTAN (x) arctang (x)
LN (x) lnx: lấy logarit nepe trị x (e ( 2.71828)
EXP (x) ex
TRUNC (x) lấy phần nguyên lớn không vượt trị số x ROUND (x) làm tròn giá trị x, lấy số nguyên gần x IV.4 Kiểu logic (Boolean)
Một liệu thuộc kiểu BOOLEAN đại lượng chứa byte Turbo Pascal nhận hai gía trị logic TRUE (đúng) FALSE (sai)
Qui ước: TRUE > FALSE Các phép toán kiểu Boolean:
A B NOT A A AND B A OR B A XOR B
TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE Nhận xét:
Phép AND (và) cho kết TRUE toán hạng TRUE Phép OR (hoặc) cho kết FALSE toán hạng FALSE
Phép XOR (hoặc triệt tiêu) ln cho kết TRUE tốn hạng khác ngược lại
(6)Các phép toán quan hệ cho kết kiểu Boolean:
Ký hiệu Ý nghĩa
< > khác
=
> lớn < nhỏ > = lớn < = nhỏ IV.5 Kiểu ký tự (Char type)
Tất liệu viết dạng chữ ký tựđược khai báo từ khóa CHAR Một ký tự viết hai dấu nháy đơn ( ) ể tiện trao đổi thông tin cần phải xếp, đánh số ký tự, cách xếp gọi bảng mã Bảng mã thông dụng bảng mã ASCII (xem lại chương 3)
Để thực phép toán số học so sánh, ta dựa vào giá trị số thứ tự mã ASCII ký tự, chẳng hạn: 'A' < 'a' số thứ tự mã ASCII tương ứng 65 97
Trong Turbo Pascal ký tựđược chứa byte Các hàm chuẩn liên quan đến kiểu ký tự:
Ký hiệu Ý nghĩa
ORD(x) Cho số thứ tự ký tự x bảng mã CHR(n) hay #n Cho ký tự có số thứ tự n
PRED(x) Cho ký tự đứng trước x SUCC(x) Cho ký tựđứng sau x V CÁC KHAI BÁO HẰNG, BIẾN, KIỂU, BIỂU THỨC, V.1 Hằng (constant)
V.1.1 Định nghĩa
Hằng đại lượng có giá trị khơng đổi q trình chạy chương trình Ta dùng tên để chương trình rõ ràng dễ sửa đổi
V.1.2 Cách khai báo CONST
<Tên hằng> = <giá trị hằng>; Ví dụ 6.4: CONST
Siso = 100;
X = ‘xxx ‘;
V.2 Biến (variable) V.2.1 Định nghĩa
Biến cấu trúc ghi nhớ có tên (đó tên biến hay danh hiệu biến) Biến ghi nhớ liệu gọi giá trị (value) biến Giá trị biến biến đổi thời gian sử dụng biến
(7)Sự truy xuất biến nghĩa đọc giá trị hay thay đổi giá trị biến thực thơng qua tên biến
Ví dụ 6.5: Readln (x);
Writeln (x);
x:= 9;
Biến cấu trúc ghi nhớ liệu phải tn theo qui định kiểu liệu: biến phải thuộc kiểu liệu định
V.2.2 Cách khai báo VAR
<Tên biến>: <Kiểu biến>; Ví dụ 6.6: VAR
a: Real; b, c: Integer;
TEN: String [20]
X: Boolean;
Chon: Char;
Cần khai báo biến trước sử dụng chúng chương trình Khai báo biến khai báo tồn biến cho biết thuộc kiểu
V.3 Kiểu (Type) V.3.1 Định nghĩa
Ngoài kiểu định sẵn, Pascal cho phép ta định nghĩa kiểu liệu khác từ kiểu theo qui tắc xây dựng Pascal
V.3.2 Cách khai báo TYPE
<Tên kiểu> = <Mô tả xây dựng kiểu>; Ví dụ 6.7:
TYPE
SoNguyen = Integer;
Diem = Real;
Tuoi = 100;
Color = (Red, Blue, Green); Thu = (Sun, Mon, Tue, Wed, Thu, Fri, Sat);
và khai báo kiểu ta có quyền sử dụng để khai báo biến ví dụ sau:
Ví dụ 6.8: VAR
i, j: SoNguyen;
Dtb: Diem;
T: tuoi; Mau: Color;
Ngay_hoc: Thu;
(8)V.4 Biểu thức (Expression) V.4.1 Định nghĩa
Một biểu thức cơng thức tính tốn bao gồm phép toán, hằng, biến, hàm dấu ngoặc
Ví dụ 6.9: + A * SQRT(B) / SIN(X) (A AND B) OR C
V.4.2 Thứ tự ưu tiên
Khi tính giá trị biểu thức, ngôn ngữ Pascal qui ước thứ tự ưu tiên phép toán từ cao đến thấp sau:
Mức ưu tiên: Các phép toán:
1 Biểu thức ngoặc đơn ( ) Phép gọi hàm
3 Not, -
4 *, /, DIV, MOD, AND +, -, OR, XOR
6 =, <>, <=, >=, <, >, IN
Ví dụ 6.10: (4+5)/3 + - (sin((/2)+3)*2 = (9)/3 + - (1+3)*2 = + - = V.4.3 Qui ước tính thứ tự ưu tiên
Khi tính biểu thức có qui tắc thứ tự ưu tiên sau: Qui tắc 1: Các phép toán có ưu tiên cao tính trước
Qui tắc 2: Trong phép toán có thứ tự ưu tiên tính tốn thực từ trái sang phải
Qui tắc 3: Phần ngoặc từ ngồi tính tốn để trở thành giá trịđơn
V.4.4 Kiểu biểu thức
Là kiểu kết sau tính biểu thức
Ví dụ 6.11: Biểu thức sau gọi biểu thức Boolean:
not (('a'>'c') and ('c'>'C')) or ('B'='b') có giá trị TRUE VI CÁC THỦ TỤC XUẤT/NHẬP
VI.1 Câu lệnh (statement)
VI.1.1 Trong chương trình Pascal, sau phần mơ tả liệu phần mô tả câu lệnh Các câu lệnh có nhiệm vụ xác định cơng việc mà máy tính phải thực để xử lý liệu mô tả khai báo
VI.1.2 Câu lệnh chia thành câu lệnh đơn giản câu lệnh có cấu trúc - Câu lệnh đơn giản
+ Vào liệu : Read, Readln + Ra liệu : Write, Writeln
+ Lệnh gán : :=
+ Lời gọi chương trình (gọi trực tiếp tên chương trình con) + Xử lý tập tin: RESET, REWRITE, ASSIGN
(9)- Câu lệnh có cấu trúc
+ Lệnh ghép: BEGIN END + Lệnh chọn : IF THEN ELSE
CASE OF + Lệnh lặp : FOR TO DO
REPEAT UNTIL
WHILE DO
VI.1.3 Các câu lệnh phải ngăn cách với dấu chấm phẩy (; ) Các câu lệnh viết dịng hay nhiều dòng
VI.2 Cấu trúc
VI.2.1 Lệnh gán (Assignment statement)
Một lệnh đơn giản Pascal lệnh gán Mục đích lệnh gán cho biến khai báo giá trị kiểu với biến
* Cách viết:
<Tên_biến>:= <biểu thức>; Ví dụ 6.12: Khi khai báo
VAR c: Char;
i,j: Integer;
x, y: Real;
p, q: Boolean; ta có phép gán sau:
c:= ‘A’;
c:= Chr(90);
i:= (35+7)*2 mod 4; i:= i div 7;
x:= 0.5;
x:= i + 1; q:= i > 2*j +1; q:= not p; * Ý nghĩa:
Biến phát biểu gán khái niệm quan trọng họ ngôn ngữ lập trình mà Pascal đại diện tiêu biểu Chúng phản ánh cách thức hoạt động máy tính nay, là:
- Lưu trữ giá trị khác vào ô nhớ thời điểm khác - Một q trình tính tốn coi q trình làm thay đổi giá trị (hay số) ô nhớ đó, đạt giá trị cần tìm
VI.2.2 Lệnh ghép (Compound statement)
Một nhóm câu lệnh đơn đặt chữ BEGIN END tạo thành câu lệnh ghép
(10)Trong Pascal ta đặt lệnh ghép lệnh ghép lớn bao ngồi hiểu tương tự cấu trúc ngoặc đơn ( ) biểu thức toán học
* Sơđồ:
Hình 6.2: Sơđồ cấu trúc BEGIN END;
Ở hình minh họa ta dễ thấy nhóm lệnh thành khối (block) Một khối lệnh bắt đầu BEGIN chấm dứt END; Trong khối lệnh có khối lệnh nằm Một khối chương trình thường dùng để nhóm từ lệnh trở lên để tạo thành <Cơng việc> lệnh có cấu trúc, ta gặp khái niệm nhiều ví dụ phần sau
VI.3 Cấu trúc rẽ nhánh
VI.3.1.Lệnh IF THEN Lệnh IF THEN ELSE * Lưu đồ diễn tả lệnh ý nghĩa cách viết:
Hình 3: Lệnh IF <Điều kiện> THEN <Công việc>;
(11)
Hình 4: Lệnh IF THEN ELSE ; Chú ý:
- iều kiện biểu thức Boolean
- Nếu <Công việc>sau THEN ELSE có nhiều lệnh ta phải gói lại BEGIN END;
- Tồn lệnh IF THEN ELSE xem lệnh đơn Ví dụ 6.13: Tính bậc số
PROGRAM Tinh_can_bac_hai; VAR
a: Real;
BEGIN
Write ( Nhập số a = ); Readln(a);
IF a < THEN
Write (' a: 10: 2, số âm nên không lấy !!! ') ELSE
Writeln (' Căn số bậc của, a: 2: 2, la, SQRT(a):10: '); Writeln (' Nhấn ENTER để thoát ');
Readln; {Dừng hình để xem kết quả} END
Ghi chú:
Trong chương trình trên, a ta thấy có dạng a:m:n với ý nghĩa m số định khoảng mà phần nguyên a chiếm chỗ n khoảng cho số trị phần thập phân a
VI.3.2 Lệnh CASE OF
(12)* Lưu đồ biểu diễn:
Hình 6.5: Lưu đồ lệnh CASE OF
* Cách viết, ý nghĩa:
Cách viết Ý nghĩa
CASE <Biểu thức > OF Xét giá trị biểu thức chọn
GT1: Công việc 1; Nếu có giá trị (GT1) thi hành Công việc
GTi: Cơng việc i; Nếu có giá trị i (GT i) thi hành Cơng việc i
[ELSE Cơng việc 0;]
Nếu khơng có giá trị thỏa thực Cơng việc
END; Kết thúc lệnh CASE Ghi chú:
- Lệnh CASE OF khơng có ELSE
- Biểu thức chọn kiểu rời rạc Integer, Char, không chọn kiểu Real - Nếu muốn ứng với nhiều giá trị khác biểu thức chọn thi hành lệnh giá trị viết hàng cách dấu phẩy (,): Giá trị k1, k2, , kp: Lệnh k;
Ví dụ 6.14: PROGRAM Chon_mau; VAR color: char;
BEGIN
write (' Chọn màu theo ký tự đầu R / W / B '); readln ( color);
CASE color OF
'R','r': write (' RED = màu đỏ ');
'W', 'w': write (' WHITE = màu trắng '); 'B', 'b': write (' BLUE = màu xanh dương '); END;
Readln; END
(13)VI.4 Cấu trúc lặp VI.4.1 Lệnh FOR
Cấu trúc FOR cho phép lặp lại nhiều lần dãy lệnh Số lần lặp lại dãy lệnh biết trước Phát biểu FOR có dạng:
FOR TO DO đếm lên FOR DOWNTO DO đếm xuống * Cú pháp tổng quát là:
FOR <biến đếm>:= <trị đầu> TO/DOWNTO <trị cuối> DO <Công việc>;
* Lưu đồ:
Hình 6: Lưu đồ phát biểu FOR TO DO
Chú ý: Trịđầu, trị cuối biến biến đếm phải kiểu rời rạc Ví dụ 6.15: Chương trình in dãy số từ đến
(14)PROGRAM Day_So; VAR i: Integer; BEGIN
FOR i:= TO DO Write (i); Readln;
END
VI.4.2 Lệnh WHILE DO * Lưu đồ lệnh
Hình 7: Lưu đồ cấu trúc WHILE DO * Ý nghĩa lưu đồ:
Trong mà điều kiện thực Cơng việc, quay trở kiểm tra điều kiện lại Vòng lặp tiếp tục, đến điều kiện đặt khơng cịn tới thực lệnh
* Cú pháp
WHILE <điều kiện> DO <Công việc>
Hình 6.8: Sơđồ cú pháp lệnh WHILE DO Ghi chú:
Điều kiện cấu trúc lặp WHILE DO biểu thức logic kiểu Boolean có giá trị úng (True) Sai (False)
Nếu điều kiện úng chương trình chạy cấu trúc WHILE DO
Sau lần lặp, chương trình trở lại kiểm tra điều kiện Tùy theo biểu thức logic điều kiện úng hay Sai chương trình thực Cơng việc tương ứng
Nếu Sai chuyển xuống cấu trúc WHILE DO
Ví dụ 6.16: Chương trình tính trung bình n số: x1 + x2 + x3 + + xn Program Trung_binh_Day_So;
VAR n, count: Integer; x, sum, average: real; BEGIN
count:= 1;
(15)sum:= 0; Write (' Nhập n = ');
readln (n);
WHILE count < n+1 DO BEGIN
Write (' Nhập giá trị thứ', count,' x = ' );
readln (x);
sum:= sum + x;
count:= count + 1;
END;
average:= sum/n;
Writeln (' Trung bình =', average: 10: ); Writeln (' Nhấn Enter để thoát ' );
Readln; END
VI.4.3 Lệnh REPEAT UNTIL
Câu lệnh REPEAT UNTIL dùng trường hợp biến điều khiển khơng có kiểu rời rạc đặc biệt trường hợp số lần lặp trước
Hình 6.9: Lưu đồ cấu trúc REPEAT UNTIL * Ý nghĩa câu lệnh:
Nếu điều kiện logic Sai (False) lặp lại lệnh điều kiện úng khỏi cấu trúc REPEAT UNTIL
Nếu có nhiều câu lệnh lệnh ngăn cách dấu chấm phẩy (;)Công việc REPEAT UNTIL không thiết phải dùng lệnh ghép để nhóm từ lệnh đơn trở lên thành cơng việc
Hình 6.10: Sơ đồ cú pháp REPEAT UNTIL
Ví dụ 6.17: Với tốn trung bình cộng dãy số ví dụ trước viết theo cấu trúc REPEAT UNTIL sau:
PROGRAM Trung_binh_Day_So; VAR n, count: Integer;
(16)x, sum: real; BEGIN
count:= 1;
sum:= 0;
Write:= (' Nhập n = '); readln (n); REPEAT
Write (' Nhập giá trị thứ', count, 'của x = '); readln(x);
sum:= sum + x;
count:= count + 1;
UNTIL count > n;
Writeln (' Trung bình =', sum/n: 8:2 ); Readln;
END Ghi chú:
So sánh cách viết WHILE DO REPEAT UNTIL ta thấy có khác biệt: - Trong cấu trúc WHILE DO <iều kiện> kiểm tra trước, thỏa <iều kiện> thực <Cơng việc>
- Ngược lại, cấu trúc REPEAT UNTIL <Cơng việc> thực thi trước sau kiểm tra <iều kiện>, khơng thỏa <iều kiện> tiếp tục thi hành <Công việc> <iều kiện>
Lệnh REPEAT UNTIL thường sử dụng lập trình, lúc người sử dụng muốn tiếp tục toán trường hợp thay đổi biến mà khơng phải trở chương trình nhấn tổ hợp phím Ctrl + F9 lại
Ví dụ 6.18: Nhân số a b PROGRAM Tich; VAR a, b: integer;
CK: char;
BEGIN
REPEAT
Write (' Nhập số a = '); Readln (a); Write (' Nhập số b = '); Readln (b); Writeln (' Tích số a x b là:', a*b: 10 );
Writeln (' Tiếp tục tính khơng (CK) ? '); Readln (CK);
UNTIL upcase(CK) = K; {hàm chuyển đổi ký tự biến} {CK thành ký tự in hoa}
END
BÀI ĐỌC THÊM
NHẬP VÀ XUẤT DỮ LIỆU TRONG TURBO PASCAL
(17)- OOO -
Thơng thường, chương trình Turbo Pascal đặt thư mục riêng rẽ có tên TP ể sử dụng Turbo Pascal, ta cần có tập tin tối thiểu:
- TURBO.EXE - TURBO.TPL
- TURBO.TP - GRAPH.TPU
- Các file đồ họa: *.BGI - Các Font chữ đồ họa: *.CHR Sử dụng câu lệnh Turbo nhấn Enter, hình xuất hiện:
Để trợ giúp người sử dụng, phím chức F10 có tác dụng mở Menu với nhiều Options khác Ta kích hoạt Menu cách kết hợp phím <Alt - Ký tự mục tương ứng>, ví dụ để kích hoạt mục File, ta nhấn đồng thời phím Alt- F, sau dùng phím mũi tên nút Enter để chọn lựa lệnh thi hành Phím F1 trợ giúp thể thơng tin hình
Ta sử dụng tổ hợp phím để tạo khối chữ câu lệnh (trên hình thấy có thay đổi màu) để ta chép, cắt dán, xóa bỏ
Ctrl-K-B Đánh dấu đầu khối Ctrl-K-K Đánh dấu cuối khối
Ctrl-K-C Chép khối sau vị trí trỏ Ctrl-K-V Di chuyển khối tới sau vị trí trỏ Ctrl-K-Y Xóa khối hành
Ctrl-K-W Ghi khối hành vào đĩa tập tin
Ctrl-K-R ọc khối tập tin ghi vào đĩa vào sau vị trí trỏ Ctrl-K-H Tắt/ Mở khối
Một chương trình máy tính, có bước sau:
Trong thảo chương Turbo Pascal, thủ tục nhập liệu dùng:
THỦ TỤC NHẬP Ý NGHĨA
READ(x1, x2, , xn) Nhập biến x1, x2, , xn theo hàng ngang từ bàn phím (con trỏ không xuống hàng)
(18)READLN(x1, x2, , xn) Nhập biến x1, x2, , xn theo hàng dọc từ bàn phím (mỗi lần nhập trỏ xuống hàng) READLN; Dừng chương trình, đợi Enter tiếp tục ASSIGN(F, File_Name); Mở tập tin F có tên File_Name
RESET(F); Chuẩn bịđọc tập tin
READ(F, x1, x2, , xn); Đọc giá trị tập tin F biến x1, x2, , xn tương ứng
CH:= ReadKey; Đọc ký tự từ bàn phím vào biến ký tự CH
KEYPRESSED Một hàm có giá trị TRUE có phím bấm FALSE ngược lại
THỦ TỤC XUẤT Ý NGHĨA
WRITE(x1, x2, , xn) Viết giá trị biến x1, x2, , xn hình theo hàng ngang (con trỏ không xuống hàng) WRITELN(x1, x2, , xn) Viết giá trị biến x1, x2, , xn hình theo hàng dọc (mỗi lần viết trị x có xuống hàng) WRITELN; Xuống hàng
WRITELN(I: n); Viết giá trị biến nguyên I vào n chỗ tính từ phải sang trái Nếu dư chỗ (chữ số I < n) để trống WRITELN(R: n: m); Viết giá trị biến thực R vào n chỗ, lấy
m số thập phân
WRITELN( abc ); Viết nguyên văn chuỗi ký tự abc WRITELN (LST, x1, x2, , xn) Viết máy in trị biến x1, x2, , xn ASSIGN(F, File_Name) Mở tập tin F có tên File_Name
REWRITE(F); để chuẩn bị viết vào
WRITE (F, x1, x2, , xn); Viết giá trị x1, x2, , xn vào tập tin F CLOSE (F); Đóng tập tin F
Cần lưu trữ chương trình ta dùng phím F2 Mở file có ta dùng phím F3
Để thay đổi kích thước/Di chuyển cửa sổ chương trình, dùng phím F5 Ctrl+F5
Trường hợp mở nhiều chương trình, ta dùng phím F6 Ctrl+F6 để đến/trở
về trước chương trình hành
Để biên dịch kiểm tra lỗi, ta dùng phím F9
Để chạy chương trình soạn thảo xong, đánh Ctrl+F9 Muốn thoát khỏi Turbo Pascal trở DOS, đánh Alt+X
(19)CHƯƠNG TRÌNH CON VÀ ĐƠN VỊ CHƯƠNG TRÌNH I KHÁI NIỆM VỀ CHƯƠNG TRÌNH CON
Khi lập trình, thường có đoạn chương trình hay phép tính lặp lại nhiều lần Nếu lần lặp lại, ta phải viết đoạn lệnh chương trình trở nên dài dòng, rối rắm thời gian vơ ích ể giải trường hợp vậy, Pascal cho phép tạo module, module mang đoạn chương trình gọi chương trình (subroutine hay subprogram) Mỗi chương trình mang tên khác Một module cần viết lần sau truy xuất nhiều lần, nơi chương trình Khi cần thiết, việc gọi tên chương trình để thi hành lệnh
Nhờ sử dụng chương trình con, chương trình tiết kiệm nhớ ồng thời, ta kiểm tra tính logic tiến trình lập trình cho máy tính điện tử, nhanh chóng loại bỏ sai sót cần hiệu chỉnh hay cải tiến chương trình ây khái niệm ý tưởng lập chương trình có cấu trúc Một q trình tính có nhiều chương trình lồng ghép vào
Trong Pascal, chương trình viết dạng thủ tục (procedure) hàm (function) Cấu trúc kiểu chương trình tương tự với nhau, mặc dầu cách truy xuất chúng có khác cách trao đổi thông tin kiểu có điểm khác Hàm (function) trả lại giá trị kết vô hướng thông qua tên hàm hàm sử dụng biểu thức
Ví dụ hàm chuẩn, hàm sin(x) mà biết chương trước xem chương trình kiểu function với tên sin tham số x Trong đó, thủ tục (procedure) không trả lại kết thông qua tên nó, vậy, ta khơng thể viết thủ tục biểu thức Các lệnh Writeln, Readln chương trước xem thủ tục chuẩn
Một chương trình có chương trình tự thiết lập có khối (block): * Khối khai báo
* Khối chương trình * Khối chương trình chính II THỦ TỤC VÀ HÀM
* Một số khái niệm biến:
Biến toàn cục (global variable): Còn gọi biến chung, biến được khai báo đầu chương trình, sử dụng bên chương trình bên chương trình Biến tồn cục tồn suốt trình thực chương trình
Biến cục (local variable): Còn gọi biến riêng, biến khai báo đầu chương trình con, sử dụng bên thân chương trình bên thân chương trình khác nằm bên (các chương trình lồng nhau) Biến cục tồn chương trình
(20)hoạt động, nghĩa biến cục sẽđược cấp phát nhớ chương trình gọi để thi hành, sẽđược giải phóng sau chương trình kết thúc
Tham số thực (actual parameter) tham số mà biến tồn cục, biểu thức giá trị số (cũng biến cục sử dụng chương trình lồng nhau) mà ta dùng chúng truyền giá trị cho tham số hình thức tương ứng chương trình
Tham số hình thức (formal parameter) biến khai báo sau Tên chương trình con, dùng để nhận giá trị tham số thực truyền đến. Tham số hình thức biến cục bộ, ta xem đối số hàm tốn học.
* Lời gọi chương trình (thủ tục hàm):
Để chương rrình thi hành, ta phải có lời gọi đến chương trình con, lời gọi chương trình thơng qua tên chương trình danh sách tham số tương ứng (nếu có) Các qui tắc lời gọi chương trình con:
Trong thân chương trình thân chương trình con, ta gọi tới chương trình trực thuộc
Trong chương trình con, ta gọi chương trình ngang cấp thiết lập trước
1 Thủ tục (Procedure): Thủ tục đoạn cấu trúc chương trình chứa bên chương trình Pascal chương trình Thủ tục đặt tên chứa danh sách tham số hình thức (formal parameters) Các tham số phải đặt dấu ngoặc đơn ( ) Ta truy xuất thủ tục cách gọi tên thủ tục Chương trình tự động truy xuất thủ tục tên gọi thực lệnh chứa thủ tục Sau thực thủ tục xong, chương trình trở lại sau vị trí câu lệnh gọi thủ tục
Có loại thủ tục: + thủ tục không tham số + thủ tục có tham số
a Cấu trúc thủ tục không tham số PROCEDURE < Tên thủ tục >;
{Các khai báo hằng, biến, kiểu cục } BEGIN
{ lệnh nội thủ tục } END;
Ví dụ 7.1: Tìm số lớn trị số nguyên
PROGRAM Largest; (* Xác định số lớn trị số nguyên nhập vào *)
VAR a, b, c: integer;
yn: char;
PROCEDURE maximum;
(21)VAR max: integer; BEGIN
IF a > b THEN max:= a ELSE max:= b; IF c > max THEN max:= c;
Writeln (' Số lớn là', max ); END;
BEGIN (* oạn chương trình *) yn:= ‘Y‘;
WHILE ( upcase(yn) = ‘Y ‘) DO BEGIN
Writeln (' Nhập số nguyên: '); Readln (a, b, c );
maximum; (* - Lời gọi thủ tục maximum - *) Write (' Tiếp tục nhập số không (y/n) ? ');
Readln (yn); END;
END Chú ý:
Trong chương trình trên, thủ tục maximum khai báo trước truy xuất, biến a, b, c gọi nhập vào chương trình biến max định nghĩa bên thủ tục iều cho ta thấy, lúc cần thiết khai báo biến đầu chương trình
b Cấu trúc thủ tục có tham số
PROCEDURE < Tên thủ tục > (<danh sách tham số hình thức: kiểu biến>);
{Các khai báo hằng, biến, kiểu cục } BEGIN
{ lệnh nội thủ tục } END;
Khi viết thủ tục, có tham số cần thiết, ta phải khai báo (kiểu, số lượng, tính chất, ) Các tham số gọi tham số hình thức (formal parameters)
Một thủ tục có nhiều tham số hình thức Khi tham số hình thức có kiểu ta viết chúng cách dấu phẩy (,) Trường hợp kiểu chúng khác khai báo tham số truyền tham biến truyền tham trị (sẽ học phần sau ) ta phải viết cách dấu chấm phẩy (;)
Ví dụ 7.2: Tính giai thừa số PROGRAM Tinh_Giai_thua;
VAR
(22)n: integer; gt: real; {các biến chung} PROCEDURE giaithua (m: integer );
VAR i: integer; {i biến riêng} BEGIN
gt:= 1;
FOR i:= TO m DO gt:= gt * i; END;
BEGIN (* Thân chương trình *)
Write('Nhập số ngun n (0 <= n < 33) = '); Readln (n); If n>=0 then
Begin
giaithua (n);
Writeln ('Giai thừa của, n, là:', gt: 10: 0); End
Else Writeln(' Khơng tính giai thừa số âm! '); Readln;
END
Trong chương trình m tham số hình thức thủ tục giaithua Khi gọi thủ tục giaithua (n) tham số thực n truyền tương ứng cho tham số hình thức m
Ví dụ 7.3: Giải phương trình ax2 + bx + c = 0, theo dạng chương trình lồng nhau:
PROGRAM Giai_PTB2;
VAR hsa, hsb, hsc:real; {các biến toàn cục}
PROCEDURE Ptb2(a,b,c:real); {a, b, c tham số hình thức Ptb2}
Var delta:real; {biến cục bộ}
PROCEDURE Ptb1(a1,b1:real); {a,b tham số hình thức Ptb1}
Begin
if a1=0 then if b1=0 then
writeln('Phương trình vơ số nghiệm') else
writeln('Phương trình vơ nghiệm') else
writeln('Phương trình có nghiệm =',-b1/a1:8:2); End; {kết thúc thủ tục Ptb1}
Begin {bắt đầu thủ tục Ptb2}
(3) if a=0 then ptb1(b,c) {b, c tham số thực cho Ptb1}
(23)(4) else begin
delta:=sqr(b)-4*a*c; if delta>0 then begin
writeln('Nghiệm x1= ',(-b+sqrt(delta))/(2*a):8:2); writeln('Nghiệm x2= ',(-b-sqrt(delta))/(2*a):8:2); end
else
if delta=0 then
writeln('Nghiệm kép x1=x2= ',-b/(2*a):8:2) else
writeln('delta <0 => Phương trình vơ nghiệm'); end;
End; {kết thúc thủ tục Ptb2} Begin {chương trình chính}
(1) write('Nhập hệ số a, b, c = ');readln(hsa, hsb, hsc);
(2) Ptb2(hsa,hsb,hsc); {hsa, hsb, hsc tham số thực cho Ptb2} (5) readln;
End {kết thúc chương trình}
Ở ví dụ trên, thủ tục Ptb2 thủ tục Ptb1 gọi thủ tục lồng Ở dòng (4), ta thấy hsa, hsb, hsc lại hiểu tham số thực, chúng truyền giá trị biến cho tham số hình thức a, b, c tương ứng thủ tục Ptb2
Nếu ta lại xét đến thủ tục thủ tục Ptb2 Ptb1 tham số a, b, c (chính xác b c) lại tham số thực Ptb1, với b c truyền tương ứng cho tham số hình thức a, b thủ tục Ptb1
Như ta nhận thấy rằng, vấn đề xác định đâu biến toàn cục, đâu biến cục bộ, đâu tham số thực đâu tham số hình thức (tham số biến tham số trị) ứng bước mà chương trình thực hiện? ây phần then chốt để nắm cách vận hành kết chương trình xử lý
Sơ đồ minh họa cách vận hành quản lý biến chương trình:
(24)2 Hàm (Function):
Hàm chương trình cho ta giá trị kiểu vơ hướng Hàm tương tự thủ tục trả giá trị thông qua tên hàm lời gọi hàm tham gia biểu thức
Cấu trúc hàm tựđặt gồm:
FUNCTION <Tên hàm> (<Tham số hình thức: kiểu biến>): <Kiểu kết quả>;
{các khai báo hằng, biến, kiểu cụcbbộ } BEGIN
{ khai báo nội hàm } END;
Trong đó:
- Tên hàm tên tựđặt cần tuân thủ theo nguyên tắc đặt tên Pascal - Kiểu kết kiểu vô hướng, biểu diễn kết giá trị hàm - Một hàm có hay nhiều tham số hình thức, có nhiều tham số hình thức kiểu giá trị ta viết chúng cách dấu phẩy (,) Trường hợp tham số hình thức khác kiểu ta viết chúng cách dấu chấm phẩy (;)
- Trong hàm sử dụng hằng, kiểu, biến khai báo chương trình ta khai báo thêm hằng, kiểu, biến dùng riêng nội hàm Chú ý phải có biến trung gian có kiểu kết hàm để lưu kết hàm q trình tính tốn để cuối ta có lệnh gán giá trị biến trung gian cho tên hàm
Ví dụ 7.4: FUNCTION TINH (x, y: integer; z: real ): real;
Đây hàm số có tên TINH với tham số hình thức x, y, z Kiểu x y kiểu số nguyên integer kiểu z kiểu số thực real Hàm TINH cho kết kiểu số thực real
(25)Ví dụ 7.5: Bài tốn tính giai thừa (factorials) PROGRAM giaithua;
VAR x: integer;
FUNCTION factorial (n: integer): integer; VAR heso, tichso: integer;
BEGIN
tichso:= 1;
IF n <= THEN factorial:=
ELSE BEGIN
FOR heso := TO n DO
tichso := tichso * heso; factorial:= tichso;
END; END;
BEGIN
Write (' Nhập vào số nguyên dương x = '); Readln (x); Writeln (' Với x =, x, giai thừa là: x ! = ', factorial(x)) Readln;
END Ghi chú:
Khi khai báo kiểu kiệu cho tham số hình thức thủ tục hàm, ta cần phải ý điểm sau:
Nếu kiểu liệu tham số hình thức kiểu liệu có cấu trúc (kiểu array, string, kiểu record, ) việc khai báo kiểu liệu cho tham số hình thức nên khai báo theo cách gián tiếp, tức phải thơng qua từ khóa TYPE
Ví dụ 7.6: Procedure Xuat1(hoten: string[25]);
Procedure Xuat2(mang: array[1 10] of integer);
Hai chương trình Xuat1 Xuat2 bị lỗi phần khai báo kiểu liệu cho hai tham số hình thức hoten mang
Để khắc phục lỗi này, ta khai báo gián tiếp kiểu liệu str25 M10 thơng qua từ khóa TYPE sau:
TYPE
Str25=string[25]; {Str25 kiểu chuỗi có độ dài 25}
M10=Array[1 10] of integer; {M10 kiểu kiệu mảng có 10 phần tử nguyên}
Tiếp đến, dùng kiểu liệu định nghĩa Str25 M10 đểđịnh kiểu cho tham số hình thức hoten mang sau:
Procedure Xuat1(hoten: Str25); Procedure Xuat2(mang: M10);
(26)III TRUYỀN THAM SỐ CHO CHƯƠNG TRÌNH CON
Khi truyền tham số Pascal, địi hỏi phải có tương ứng tên kiểu liệu tham số hình thức tham số thực Một số định nghĩa qui tắc truyền tham số Pascal:
- Những tham số hình thức nằm sau từ khóa VAR gọi tham số biến (variable parameter) Với tham số biến, tham số thực bắt buộc phải biến không giá trị Khi giá trị tham số biến thay đổi làm thay đổi giá trị tham số thực tương ứng khỏi chương trình đó, tham số thực giữ giá trị thay đổi
- Những tham số hình thức khơng đứng sau từ khóa VAR gọi tham số trị (value parameter), tham số thực biến, biểu thức, hằng, giá trị số Các tham số trị nhận giá trị từ tham số thực truyền giá trị ban đầu, giá trị tham số trị thay đổi khơng làm thay đổi giá trị tham số thực, nghĩa giá trị tham số thực sau thoát khỏi chương trình ln với giá trị tham số thực trước truyền đến chương trình Do tham trị không kết tính tốn chương trình
Một vài thí dụ tham số biến:
Ví dụ 7.7: Viết chương trình tính lập phương PROGRAM Parameter1;
VAR num: integer; {num biến toàn cục}
PROCEDURE LapPhuong(var a:integer); {a tham số biến} Begin
a:=a*a*a; End;
Begin
write('Nhập số cần tính lập phương num = '); readln(num);
LapPhuong(num); {tham số thực num truyền cho tham số biến a}
writeln('Lập phương số vừa nhập =', num); readln;
End Ví dụ 7.8:
PROGRAM parameter2;
VAR a, b: integer; {biến toàn cục}
PROCEDURE thamso (x: integer; VAR y: integer );
BEGIN {x: tham số trị, y tham số biến} x:= x + 1;
y:= y + 1;
(27)Writeln (‘Trong procedure thamso, ‘);
Writeln (' Hai số bạn a =, x: 3, b =, y: ); END;
BEGIN
Write (' Nhập vào trị số nguyên a, b: '); Readln (a, b); Writeln (' Ban đầu, Bạn nhập vào a =', a: 3, 'và b =', b: );
thamso (a, b); {tham số thực a truyền cho tham số trị x
tham số thực b truyền cho tham số biến y}
Writeln (' Ngoài procedure thamso, ');
Writeln (' Hiện nay, số a là, a: 3, b là, b: '); Writeln (' Ta thấy, a không đổi b thay đổi ! '); Readln;
END.
IV TÍNH ĐỆ QUI CỦA CHƯƠNG TRÌNH CON
Một chương trình mà q trình thiết lập, gọi thân chương trình có tính đệ qui (recursion)
Ví dụ 7.9: Bài tốn tính giai thừa (factorials) theo cách đệ qui Bài tốn có phần chương trình giống có ví dụ trước:
PROGRAM Giaithua; (*Tính giai thừa số n theo phương pháp đệ qui *) VAR x: integer;
FUNCTION factorial (n: integer): longint; BEGIN
IF n <= THEN factorial:= {điều kiện neo} ELSE factorial:= n * factorial (n -1);
END; BEGIN
Write (' Nhập vào số nguyên dương x = '); Readln (x);
Writeln;
Writeln (' Kết ',x,'! =, factorial(x)); Readln;
END
Giả sử ta nhập x = 4, 4! = factorial(n), với n = 4, ta có sơ đồ minh họa sau:
(28)Chú ý:
- Ưu điểm thuật toán đệ qui ngắn gọn Nó có khả định nghĩa tập hợp lớn đối tượng số câu lệnh hữu hạn Thuật tốn đệ qui thích hợp cho toán mà tự thân cấu trúc liệu định nghĩa theo lối đệ qui.
- Có số thuật toán đệ qui sử dụng cho toán đơn giản thay thuật tốn khác khơng tự gọi chúng, thay gọi khử đệ qui
- Trong số tốn ta giải theo cách: thuật toán lặp (xem chương trước) thuật toán đệ qui Thơng thường, cách giải theo thuật tốn lặp (WHILE DO) tốt so với thuật tốn đệ qui đệ qui địi hỏi thêm nhớ thời gian Khi ghi sử dụng cho lưu trữ quay trở phải khôi phục lại trạng thái cũ lần gọi đến chương trình Mức độ phức tạp gia tăng chương trình theo thuật tốn đệ qui có chứa chương trình khác Vì vậy, dùng đệ qui ta cần thận trọng, thuật tốn thường khơng cho ta thấy rõ trực tiếp tồn q trình giải bước Nói chung, n khơng thể dùng thuật tốn lặp ta nên sử dụng thuật toán đệ qui
V ĐƠN VỊ CHƯƠNG TRÌNH (UNIT) 1 Khái niệm
Lập trình tốn lớn phức tạp vất vả phải sử dụng nhiều thuật toán lập lập lại Việc tạo nhiều mẫu chương trình nhằm giảm nhẹ cơng việc lập trình viên (programmer) Tuy nhiên, chương trình có ứng dụng chương trình chứa mà thơi ể khỏi thời gian để viết lại chúng, người ta biến chương trình thành module độc lập, biên dịch sẵn lưu trữ đĩa thư viện Khi cần ta việc gọi module mà không cần phải viết lại chúng Mỗi module gọi đơn vị chương trình, hay gọi tắt UNIT
(29)Khái niệm Unit vào sử dụng từ chương trình Pascal version 4.0 trở Có hai loại Unit Unit chuẩn Turbo Pascal tạo sẵn Unit tự tạo người lập trình tự viết
2 Các Unit chuẩn
a Một số Unit chuẩn Turbo Pascal 5.5 trở
* Unit SYSTEM : gồm hằng, biến, kiểu, hàm, thủ tục version 3.0
* Unit CRT : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến chế độ Text version 5.5
* Unit PRINTER : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến chế độ in ấn
* Unit GRAPH : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến chế độđồ thị version 5.5
* Unit TURBO3 : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến chế độ Text version 3.0
* Unit GRAPH3 : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến chếđộ đồ thị version 3.0
* Unit DOS : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến hệ điều hành MS-DOS
* Unit OVERLAY : gồm hằng, biến, kiểu, hàm, thủ tục liên quan đến việc truy xuất đĩa phủ lấp chạy chương trình
Các Unit lưu trữ tập tin TURBO.TPL Turbo Pascal Chúng ta sử dụng chương trình TPUMOVER.EXE để lấy đưa vào hay nhiều Unit nhằm tiết kiệm nhớ hay tăng cường tiện ích sử dụng b Cách gọi Unit
Muốn sử dụng UNIT đầu chương trình ta phải khai báo Unit theo cú pháp sau:
USES <Tên Unit> [{, <Tên Unit>}]; Ví dụ 7.10 USES CRT, GRAPH;
ặc biệt, riêng Unit SYSTEM khơng cần phải khai báo c Một số thủ tục hàm Unit CRT
* ClrScr : thủ tục xóa hình
* ClrEol : thủ tục xóa ký tự bên phải trỏ hình, sau xóa trỏ chỗ
* InsLine : thủ tục xen vào hàng vị trí trỏ hình * DelLine : thủ tục xóa bỏ hàng vị trí trỏ hình
* GotoXY(XPos, Ypos): đưa trỏ hình vị trí có tọa độ Xpos Ypos X có giá trị từ - 80, Y có giá trị từ - 25 * Delay(time): tạo thời gian trễ tính theo milisecond Time số nguyên dùng để làm chậm chương trình cho ta kịp quan sát liệu
* Sound(F) : thủ tục tạo âm với tần số F (hz) F số nguyên
(30)* NoSound : thủ tục tắt âm
* LowVideo NormVideo: thủ tục hình, gọi LowVideo ký tự viết hình có độ sáng yếu dần nhận thủ tục NormVideo vềđộ sáng bình thường
* TextBackGround (color): thủ tục chọn màu nền, color cho bảng (từ -7) * KeyPressed: hàm cho giá trị kiểu kết Boolean, cho giá trị True
có phím bấm
* TextColor (color): thủ tục chọn màu chữ, color lấy bảng Các số màu CRT unit
Hằng số color Màu hiển thị Giá trị Black Blue Green Cyan Red Magenta Brown LightGray DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow White en
Xanh da trời Xanh Xanh lơ Đỏ Tím Nâu Xám nhạt Xám đậm
Xanh da trời nhạt Xanh nhạt Xanh lơ nhạt Đỏ nhạt Tím nhạt Vàng Trắng
0 10 11 12 13 14 15
Để tạo màu nhấp nháy, ta cộng thêm số Blink CRT vào màu chữ mà ta chọn Ta làm nhấp nháy màu
Ví dụ để trình bày chữ vàng xanh, ta viết:
TextColor(Yellow); TextBackground(Blue); Muốn có dịng chữ đỏ nhấp nháy lệnh:
TextColor(Red + Blink);
* ReadKey : hàm có kiểu kết Char, nhấn phím chức bàn phím có kết ký tự mã ASCII Nếu ký tự ReadKey trả ASCII ký tự kế theo chỉđịnh phím bảng Các phím Home, phím mũi tên, ln tạo nên ký tự theo ASCII Các phím chức từ F1 đến F10 sinh ký tự tùy theo ta dùng với tổ hợp phím Alt, Ctrl hay Shift hay dùng
Các phím chức đặc biệt
(31)Tên phím Bình thường
Alt Ctrl Shift F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 Home .↑ PageUp ← → End ↓ PageDn Ins Del : (59) < (60) = (61) > (62) ? (63) @ (64) A (65) B (66) C (67) D (68) G (71) H (72) I (73) K (75) M (77) O (79) P (80) Q (81) R (82) S (83) h (104) i (105) j (106) k (107) l (108) m (109) n (110) o (111) p (112) q (113) ^ (94) - (95) (96) a (97) b (98) c (99) d (100) e (101) f (102) g (103) T (84) U (85) V (86) W (87) X (88) Y (89) Z (90) [(91) \ (92) ] (93)
VI UNIT TỰ TẠO
1 Một số bước để tạo Unit
Để tạo Unit cần qua bước sau:
Bước 1: Tạo file Unit có phần mở rộng là.PAS với bố cục sau: UNIT <Tên Unit>; (* Chú ý: Tên Unit phải trùng với tên File *)
INTERFACE (* Chú ý: Phần giao diện với bên ngồi, khơng có dấu; *)
[Uses <danh sách unit>]; {Khai báo unit dùng chương trình} [Khai báo hằng, kiểu, biến dùng chung];
[Khai báo thủ tục, hàm (tên, danh sách tham số thủ tục hàm]; IMPLEMENTATION (* Cài đặt hàm, thủ tục Unit, khơng có dấu; *)
[Các khai báo kiểu, hằng, biến cục bộ]; [Nội dung cài đặt thủ tục, hàm unit];
[BEGIN] (* Phần khởi tạo: Initialization Part *) [Các lệnh khởi tạo];
END (* Dù có BEGIN để khởi tạo hay khơng, có END *) Bước 2: Dịch file lên đĩa theo trình tự sau:
(32)i) Gõ Alt - C để vào Menu COMPILE
ii) i đến mục Destination nhấn Enter để chương trình tự động đổi Memory thành Disk
iii) Gõ C (hoặc F9) để biên dịch chương trình tạo nên file.TPU
iv) Khi dịch xong gõ phím Sau ta lập lại bước a b để chuyển Destination từ Disk sang Memory
2 Ví dụ '
Ví dụ 7.11: Tạo UNIT tính Cộng, Trừ, Nhân, Chia cho học sinh tiểu học Tên file Unit TTIEUHOC.PAS với nội dung sau:
UNIT TTieuHoc; {Phần đầu: Chương trình Tốn Tiểu học} INTERFACE {Phần giao diện}
PROCEDURE Cong (Var So1, So2, So3: Real); PROCEDURE Tru (Var So1, So2, So3: Real); PROCEDURE Nhan (Var So1, So2, So3: Real); PROCEDURE Chia (Var So1, So2, So3: Real); INPLEMENTATION {Phần cài đặt}
PROCEDURE Cong;
BEGIN
IF So1 + So2 = So3 THEN Writeln ('Giỏi ! Em làm đúng! ') ELSE Writeln (' Rất tiếc, em làm sai ! ');
END;
PROCEDURE Tru;
BEGIN
IF So1 - So2 = So3 THEN Writeln (' Giỏi ! Em làm đúng!') ELSE Writeln (' Rất tiếc, em làm sai ! ');
END;
PROCEDURE Nhan; BEGIN
IF So1 * So2 = So3 THEN Writeln ('Giỏi ! Em làm !') ELSE Writeln (' Rất tiếc, em làm sai ! ');
END;
PROCEDURE Chia;
BEGIN
IF So2 = THEN Writeln ('Số chia phải khác 0') ELSE
IF So1 / So2 = So3 THEN Writeln ('Giỏi lắm! Em làm đúng! ')
ELSE Writeln (' Rất tiếc, em làm sai ! '); END;
END {Chấm dứt UNIT}
(33)Sau gõ chương trình Unit trên, đổi Compile Destination thành Disk, biên dịch tạo tập tin TTIEUHOC.TPU đĩa
Chương trình Pascal cho toán Cộng, trừ, Nhân, Chia dùng Unit TTIEUHOC:
PROGRAM Toan_Tieu_Hoc; USES CRT, TTieuHoc;
VAR
chon: Integer;
So1, So2, So3: Real;
PROCEDURE Menu (Var chon: integer); BEGIN
ClrScr;
Writeln (' == TOáN TIểU HọC == '); Writeln (' = Chấm dứt = ');
Writeln (' = Toán cộng = '); Writeln (' = Toán trừ = '); Writeln (' = Toán nhân = '); Writeln (' = Toán chia = '); Writeln (‘ ================== ‘);
Write (' Bạn chọn số ? ');
Readln (chon);
END;
PROCEDURE nhapso (Var So1, So2, So3: real ); BEGIN
Write (' Nhập vào số thứ 1: '); Readln(So1); Write (' Nhập vào số thứ 2: '); Readln(So2); Write (' Kết : '); Readln (So3);
END;
{=====================Chương Trình Chính
========================} BEGIN
CLRSCR; REPEAT
Menu (chon);
CASE chon OF
1: BEGIN
Writeln;
Writeln (' == Toán cộng == ');
Nhapso(So1, So2, So3);
Cong(So1, So2, So3);
(34)END;
2: BEGIN
Writeln;
Writeln (' == Toán trừ == ');
Nhapso(So1, So2, So3);
Tru(So1, So2, So3);
END;
3: BEGIN
Writeln;
Writeln (‘ == Toán nhân == ‘);
Nhapso(So1, So2, So3);
Nhan(So1, So2, So3);
END;
4: BEGIN
Writeln;
Writeln (‘ == Toán chia == ‘);
Nhapso(So1, So2, So3);
Chia(So1, So2, So3);
END;
END; {case}
Writeln (' Gõ phím để tiếp tục '); Readln;
UNTIL chon = 0;
END {Ngưng làm toán}
=========================================================== ====
BÀI ĐỌC THÊM
TOP - DOWN STRUCTURED PROGRAMMING hay
LẬP TRÌNH THEO CẤU TRÚC TRÊN - XUỐNG oOo
-Nếu bạn người bắt đầu khởi thực hành lập trình tốn đó, bạn thường tự hỏi: Ta phải bắt đầu việc đây? ây câu hỏi trả lời chung Tuy nhiên, dựa vào kinh nghiệm thu thập người lập trình tài tử lập trình viên chuyên nghiệp, tác giả Francis Scheid, tác phẩm Computer and Programming mình, cho số lời khuyên sau:
1 Ôn lại kinh nghiệm qua để xem coi vấn đề bạn có chút tương tự đến vấn đề mà bạn chạm trán trước không;
(35)2 Trước tiên, thử làm phiên đơn giản Nếu có thể, đưa vào số trường hợp đặc biệt mà bạn có, nhằm tạo chương trình bạn có vẻ sâu sắc Chia toán thành nhỏ, tiếp tục chẻ nhỏ thành phần nhỏ hơn, được, chẻ tiếp phần nhỏ thành mảnh nhỏ nữa, sau giải quyế phần hay mảnh nhỏ
Mỗi thuật tốn thể lưu đồ (flow chart) Lưu đồ đồ lộ trình thuật tốn Khơng hẳn tất chun viên máy tính phải thực lưu đồ trước lập trình nhờ có lưu đồ mà cơng việc bạn trở nên rõ ràng mang tính logic Bạn khơng cảm thấy bối rối cần phải trình bày tiến trình giải tốn bạn cho người khác hiểu Bạn thời gian cho lưu đồ có giá trị ngàn từ phải cắt nghĩa thuật toán
Chúng ta tưởng tượng toán to lớn cổ thụ nhiều cành rậm rạp Ta muốn đốn nhà làm củi chụm dĩ nhiên, ta chặt ngang gốc mà vác nhà (thí dụ khơng có ý khuyến khích phá hoại mơi trường đâu ! ) Vậy ta không tỉa cành nhỏ tốn ln ? Giải vấn đề Bạn xem toán gốc lộn ngược đầu Chia nhỏ toán thành vấn đề nhỏ hơn, nhỏ cịn phức tạp, minh họa hình sau đây:
Trong hình vẽ trên, tốn phân thành vấn đề nhỏ A, B, C D Vấn đề B D giải Riêng vấn đề A C lại tiếp tục chia nhỏ để thành mảnh nhỏ giải nhánh khơng dài ngắn nhau, dễ hiểu mức độ phức tạp vấn đề tùy theo thuật toán cần giải mà ta phân nhỏ Bài tốn từ vấn đề trừu tượng đến cụ thể Cách giải giống hệ thống phân quyền tổ chức phủ:
(36)Lập trình cấu trúc trường phái lập trình xuất vào thập niên 1970 nhanh chóng nhiều người hưởng ứng iểm lập trình cấu trúc tổ chức chương trình thành hệ phân cấp (hierarchy) phải điều khiển cho mối tương tác thành phần hệ tối thiểu ây ý tưởng phép tinh chế bước (stepwise refinement) hay phương pháp chia để trị giải toán theo cách top-down Một ta thực việc phân tích top-down xong, mảnh tốn chi tiết giải theo cách thành phần thuật tốn sau:
* Dịng (Sequential Flow): Trong thuật giải này, bước giải thể luồng lệnh hình vẽ sau:
* Dòng điều kiện (Conditional Flow): Trong thực tế nhiều tốn máy tính, ta đến việc chọn lựa hai điều kiện Mỗi điều kiện (úng Sai) dẫn đến định khác Minh họa hình sau:
* Dòng lặp (Repetitive Flow): Trong nhiều trường hợp, ta cần thực nhiều lần liên tiếp hay nhiều thao tác cho để điều kiện thỏa
(37)Cha đẻ ngôn ngữ lập trình Pascal N.Wirth phát triển phương pháp tinh chế bước, xem phương pháp khoa học cần thiết cho việc phân tích vấn đề lập trình
Khởi đầu, chương trình phải thể khái quát vấn đề, nêu bậc phân tích tổng thể tốn bước sau đó, có giải pháp giải vấn đề cách chi tiết hơn, giải pháp đặc tả (specification) công việc Như vậy, bước một, ta tinh chế toán Sự tinh chế phải hướng đến thuật tốn ngơn ngữ lập trình Nếu tốn nhỏ trở nên đơn giản ta thay câu lệnh Nếu tỏ cịn phức tạp ta xem thủ tục tiếp tục tìm cách tinh chế
Trong trình tinh chế, cần thiết đưa cách biểu diễn liệu song song với cách chi tiết hoá việc giải toán ây phương pháp khoa học mang phần tính nghệ thuật thể nhạy bén tư người lập trình
(38)CHƯƠNG 8
MỘT SỐ CẤU TRÚC DỮ LIỆU CƠ SỞ
I KIỂU LIỆT KÊ, KIỂU MIỀN CON
1 Kiểu vô hướng liệt kê (enumerated scalar type)
Chương trước qua kiểu liệu đơn giản liệu kiểu liệu vô hướng chuẩn (Standard Scalar-type Data) Integer, Real, Char, Boolean Các kiểu định nghĩa sẵn chương trình cài đặt máy Ngơn ngữ Pascal cho phép người lập trình tự đặt kiểu vô hướng cách tự liệt kê giá trị kiểu vô hướng phải khai báo định nghĩa kiểu Danh sách giá trị đặt ngoặc đơn ( ) mô tả tên kiểu (như phần mô tả kiểu TYPE) Kiểu vô hướng theo cách gọi kiểu vô hướng liệt kê (Enumerated Scalar Type)
a Cách khai báo
Có cách khai báo biến kiểu liệt kê:
+ Khai báo gián tiếp: ịnh nghĩa kiểu (dựa vào từ khóa type) trước khai biến (var)
TYPE
<tên kiểu liệt kê> = (<danh sách giá trị kiểu liệt kê>); VAR
<danh sách biến>: <tên kiểu liệt kê>; Ví dụ 8.1:
TYPE
Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); Colors =(Red, Yellow, Green, White, Blue, Black);
Subjects = (Mathematics, Physics, Chemistry, Biology); VAR
Ngay: Days;
MauVe: Colors;
MonThi, Kiemtra: Subjects;
+ Khai báo trực tiếp: Kiểu sau biến định nghĩa trực tiếp. VAR
<danh sách biến>: (<danh sách giá trị kiểu liệt kê>); Ví dụ 8.2:
VAR
Ngay: (Sun, Mon, Tue, Wed, Thu, Fri, Sat); MauVe: (Red, Yellow, Green, White); Ta gán cho biến giá trị kiểu tương ứng:
Ngay:= Mon;
MauVe:= Red;
Biến theo định nghĩa kiểu nhận giá trị kiểu mà
(39)Theo khai báo ví dụ 8.2 trên, ta khơng thể có MauVe:= Mon; Kiểu vô hướng liệt kê kiểu đếm
Theo định nghĩa kiểu vô hướng liệt kê, thứ tự danh sách giá trị liệt kê ngầm đánh số tăng tuyến tính số trở theo thứ tự từ trái sang phải Như vậy, ví dụ trên: Sun < Mon < Tue < Wed Red < Yellow < Green
b Một số hàm chuẩn áp dụng cho kiểu vô hướng * Hàm thứ tự ORD (X)
Hàm cho ta thứ tự giá trị x kiểu vô hướng đếm Hàm ORD thực chất hàm biến đổi giá trị kiểu vô hướng đếm sang giá trị kiểu số nguyên
Theo ví dụ trên:
ORD (Sun) = úng Sun có thứ tự ORD (Mon) = úng Mon có thứ tự
ORD (Green) = Sai Green có thứ tự
ORD (n) = n n giá trị kiểu Longint * Hàm PRED (X)
Hàm cho giá trịđứng trước x định nghĩa kiểu x Theo ví dụ trên:
PRED (Mon) = Sun PRED (Green) = Yellow PRED (n) = n -
* Hàm SUCC (X)
Hàm cho giá trịđứng sau x định nghĩa kiểu x Theo ví dụ trên:
SUCC (Mon) = Tue SUCC (Green) = White SUCC (n) = n +
* Hàm chuyển số nguyên thành giá trị vô hướng
Tên hàm tên kiểu vơ hướng mà ta khai báo trước Theo ví dụ trên:
Days(2) = Tue
Colors(3) = White
LONGINT (n) = n c Viết đọc vào kiểu liệt kê
Viết đọc theo kiểu liệt kê khác với kiểu vơ hướng chuẩn * Viết kiểu liệt kê
Thủ tục Write Writeln chấp nhận đưa giá trị thuộc kiệu vô hướng chuẩn (Real, Integer, Byte, Char, Boolean) mà không chấp nhận viết giá trị kiểu vơ hướng liệt kê, ví dụ cách viết sau không đúng:
Writeln(Color(4)) Writeln(Red) Writeln(Days)
(40)mà chấp nhận viết:
Writeln (Char(78)) Char(78) = N giá trị vơ hướng chuẩn Để viết giá trị biến vơ hướng liệt kê, ta áp dụng thủ thuật sau:
IF MauVe = Red THEN Writeln(‘Red’); * Đọc vào kiểu liệt kê
Thủ tục Read Readln chấp nhận đọc vào giá trị kiểu vô hướng chuẩn mà không chấp nhận đọc trực tiếp giá trị kiểu vô hướng liệt kê, ví dụ khơng thể đọc Readln(Days) ể đọc vào giá trị kiểu liệt kê ta dùng phương pháp sau: đọc số thứ tự giá trị biến vô hướng biến đổi kiểu liệu thêm:
Ví dụ 8.3:
TYPE Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); VAR i: Integer;
BEGIN
Write('Nhập số từ tương ứng cho ngày:'); Readln(i);
Case Days(i) of
Sun: writeln('Ngày Chủ nhật'); Mon: writeln('Ngày thứ hai'); Tue: writeln('Ngày thứ ba'); Wed: writeln('Ngày thứ tư'); Thu: writeln('Ngày thứ năm'); Fri: writeln('Ngày thứ sáu'); Sat: writeln('Ngày thứ bảy'); Else writeln('Nhập sai');
end;
Readln; END
Mục phần II phía sau, giới thiệu chuỗi String, ta dùng thủ thuật sau đểđọc kiểu liệt kê:
Ví dụ 8.4: Readln(St);
IF St = ‘Mon’ THEN Ngay:= Mon; 2 Kiểu miền (Sub-range type) a Khái niệm
Khi khai báo số trường hợp, ví dụ Tuổi người iểm thi học sinh, ta viết:
VAR
TuoiTho: Integer; {Integer có miền xác định -32 768 32 767} Hay Diem: Real; {Real có miền xác định 2.9 E-39 1.7 E38}
(41)thiên khoảng từ đến 200 lớn điểm thi học sinh khoảng từ đến 10 chẳng hạn
Trong Pascal cho phép ta xác định biến lấy giá trị khoảng giới hạn cận (first data item) cận (last data item) Hai giá trị phải kiểu vô hướng đếm cận có giá trị lớn cận Khai báo gọi khai báo kiểu miền (Sub-range type) biến chiếm byte ô nhớ mà Trong lúc chạy chương trình, ta kiểm tra giá trị biến không vượt khỏi giới hạn khoảng
b Cách khai báo
Miền tập hợp kiểu đếm Có cách khai báo: + Khai báo gián tiếp:
TYPE
<Tên kiểu miền con> = <hằng cận dưới> <hằng cận trên>; VAR
<danh sách biến>: < Tên kiểu miền con>; Ví dụ 8.5:
TYPE
TuoiTho = 200; VAR Tho: TuoiTho;
+ Khai báo trực tiếp: VAR
<danh sách biến>: <hằng cận dưới> <hằng cận trên>; Ví dụ 8.6:
VAR Tuoi: 200; II KIỂU MẢNG, KIỂU CHUẨN
Pascal có kiểu cấu trúc liệu kiểu mảng (ARRAY), tập hợp (SET), ghi (RECORD) tập tin (FILE) Sau ta tìm hiểu kiểu cấu trúc 1 Dữ liệu kiểu mảng (Array-Type Data)
Một mảng liệu tập hợp số hữu hạn phần tử có giống biến, có kiểu, gọi kiểu
Mảng được tổ chức theo trật tự xác định Số phần tử mảng khai báo từ định nghĩa mảng
a Mảng chiều (One-Dimensional Array)
Mảng chiều hiểu danh sách phần tử (theo cột), có kiểu Mỗi phần tử mảng xác định truy nhập trực tiếp thông qua tên mảng với dẫn truy nhập để hai ngoặc vuông []
Ví dụ 8.7: List mảng chiều có n phần tử Các phần tử List mang tên List[1], List[2], List[3], , List[n], minh họa hình sau:
(42)
List[1] List[2] List[3] List[4] List[n] Hình 8.1: Minh họa mảng chiều
+ Khai báo gián tiếp: TYPE
<Kiểu mảng> = ARRAY [Kiểu số] OF <Kiểu phần tử >; VAR
<Danh sách biến>: Kiểu mảng; + Khai báo trực tiếp:
VAR
< Danh sách biến >: ARRAY [Kiểu số] OF < Kiểu phần tử >; * Chú ý: Kiểu số phải kiểu rời rạc (đếm được)
Ví dụ 8.8: TYPE
KM1 = ARRAY [1 100] OF INTEGER; KM2 = ARRAY [1 20] OF CHAR; DAY = (Sun, Mon, Tue, Wed, Thu, Fri, Sat); VAR
TUOI: KM1;
TEN: KM2;
NGAY: ARRAY [DAY] OF BOOLEAN;
Ý nghĩa:
- KM1 kiểu mảng gồm 100 phần tử đánh số từ đến 100 thông qua kiểu dẫn miền số nguyên từ 100 TUOI biến có kiểu KM1
- KM2 kiểu mảng gồm 20 phần tử đánh số từ 20 có kiểu ký tự Biến TEN có kiểu KM2
- NGAY biến mảng gồm phần tử kiểu Boolean đánh dấu qua kiểu dẫn tên ngày tuần
Chú ý: Khi khai báo mảng, kiểu dẫn là:
- Kiểu miển loại liệu vô hướng đếm ký tự, số nguyên - Kiểu liệt kê người viết định nghĩa (như NGAY tuần)
- Kiểu Boolean
Kiểu dẫn kiểu không đếm REAL Viết sau SAI: X1: ARRAY [Real] OF Integer; Ta khai báo như: X2: ARRAY [Integer] OF Integer;
Mặc dầu Integer kiểu vô hướng đếm giới hạn vùng nhớ dành cho liệu, số lượng phần tử mảng bị hạn chế tùy theo kích thước kiểu liệu phần tử, ta nên dùng kiểu miền để khai báo số phần tử mảng + Truy xuất phần tử mảng:
(43)Mỗi phần tử mảng truy xuất thông qua Tên Biến Mảng với số mảng dấu ngoặc vuông [] Ví dụ tên biến mảng A, viết A[7], ta hiểu phần tử thứ mảng A
Ví dụ 8.9: Lập trình giải tốn tính trung bình dãy số x[i]: x[1], x[2], x[3], , x[n]
sau tiếp tục tính độ lệch (deviation) phần tử so với trị trung bình, theo cơng thức:
độ_lệch = x[i] - trung_bình
Giả sử dãy số có giới hạn n = 100 phần tử trở lại, n biến số để khai báo số phần tử muốn tính Sau ta nhập tính giá trị phần tử kiểu số thực (real) từ phần tử thứ đến phần tử thứ n Trong chương trình tạo mảng chiều x với n phần tử Tính trung bình n phần tử độ lệch In kết hình
PROGRAM Average_deviations;
{Nhập n số phần tử kiểu số thực, tính trị trung bình chúng, sau tính tiếp độ lệch phần tử số so với trị trung bình}
VAR
n, count: integer;
sum, average, deviation: real; x: ARRAY [1 100] OF real; BEGIN
(* Nhập số phần tử tính trung bình*)
Write (' Nhập số n để tính trung bình ? '); Readln (n);
Writeln; sum:= 0;
FOR count:= TO n DO BEGIN
Write ( ‘ i = ‘, count: 3, ‘ x = ‘ ); Readln (x [count] );
sum:= sum + x[count]; END;
average:= sum/n;
Writeln (' Trung bình dãy số =, average '); Writeln;
(* Tính độ lệch so với trị trung bình *) FOR count:= TO n DO
BEGIN
deviation:= x[count] - average;
Write ( ‘ i = ‘, count: 3, ‘ x = ‘, x[count] );
(44)Writeln (' ộ lệch d =, deviation '); END;
Readln; END
Giả sử, ta nhập vào số hạng (các số có gạch phần người nhập): x[1] = 3.0 x[2] = -2.0 x[3] = 12.0 x[4] = 4.4 x[5] = 3.5
Khi chạy chương trình (nhấn Ctrl + F9), hình ta thấy: Nhập số n để tính trung bình ?
i = x = 3.0 i = x = -2.0 i = x = 12.0 i = x = 4.4 i = x = 3.5
Trung bình dãy số = 1800000E+00
i = x = 0000000E+00 ộ lệch d = - 1800000E+00 i = x = -2 0000000E+00 ộ lệch d = - 1800000E+00 i = x = 2000000E+00 ộ lệch d = 8200000E+00 i = x = 4000000E+00 ộ lệch d = 2000000E - 01 i = x = 5000000E+00 ộ lệch d = - 8000000E - 01 Ta định khoảng chừa kết phần lẻ thập phân, dùng lệnh: m: n Ví dụ 8.10: Sắp xếp dãy số theo thứ tự từ nhỏđến lớn
Tiến trình tốn:
- Giả sử chuỗi số ta có n phần tử Lần lượt cho chương trình đọc giá trị phần tử nhập
- Một thủ tục (Procedure) làm công việc xếp sau: đưa phần tử thứ so sánh với phần tử tiếp theo, lớn phần tử so sánh đem đổi chổ giá trị hai phần tử với Sau tiếp tục đem phần tử thứ so sánh phần tử theo trình tự vậy, phần tử thứ n -
- In kết hình Chương trình Pascal sau: PROGRAM Reorder;
(* Sắp xếp mảng phần tử số thực từ nhỏ đến lớn*) VAR n, i, loc: 100;
x: ARRAY [1 100] OF real; temp: real;
PROCEDURE interchange;
(* ổi chỗ phần tử mảng từ nhỏđến lớn*) BEGIN
FOR loc:= TO n-1 DO
(45)FOR i:= loc + TO n DO IF x[i] < x [loc] THEN
BEGIN
temp:= x[loc];
x[loc]:= x[i];
x[i]:= temp;
END; END;
BEGIN
Write (' Có phần tử số ? '); Readln (n); FOR i:= TO n DO
BEGIN
Write ( ‘ x[‘, i: 3, ‘] = ? ‘ );
Readln( x[i] );
END; interchange; Writeln;
Writeln (' Số liệu xếp: '); Writeln;
FOR i:= TO n DO
Writeln ( ‘x[‘, i: 3, ‘] = ‘, x[i]: 4: ); Readln;
END
Khi chạy chương trình, giả sử ta có số liệu phần nhập: (các số có gạch phần nhập từ bàn phím)
Có phần tử số ? x[1] = ?
x[2] = ? - x[3] = ? 12 x[4] = ? 8 x[5] = ? Kết là:
Số liệu xếp: x[1] = ? - x[2] = ? x[3] = ? x[4] = ? 8 x[5] = ? 12
b Mảng nhiều chiều (Multi-Dimensional Array)
(46)Trong số toán thực tế, người ta sử dụng mảng nhiều chiều, gọi mảng nhiều chiều
Ví dụ 8.11: Phịng tạo quản lý điểm sinh viên Trong khoá 22 chẳng hạn, người ta tạo mảng chiều: ví dụ chiều số thứ tự sinh viên, chiều lại môn học (dạng kiểu vô hướng liệt kê), ta hình dung dạng mảng ghi điểm (tên mảng ghi_diem) sau:
Lưu ý: Thực tế, danh sách tên sinh viên lưu lại máy tính thường ghi cách gán mã số sinh viên (coding) cho sinh viên từ năm đầu vào học
Với ví dụ trên, muốn nhập điểm sinh viên ta phải khai báo tham số số thứ tự sinh viên môn học
Tương tự, với khố theo học mơn vậy, ta tạo mảng nhiều chiều hình vẽ minh họa sau:
Trong trường hợp này, muốn biết điểm sinh viên ta phải khai báo tham số: Khoá học, số thứ tự sinh viên môn học, chẳng hạn:
ghi_diem[K22,0001,AV] nhập điểm 10,
Khai báo có cách nhưđối với mảng chiều: + Khai báo gián tiếp:
TYPE
(47)<Kiểu mảng> = ARRAY [Kiểu_chỉ_số_1, , Kiểu_chỉ_số_n] OF <Kiểu phần tử>;
VAR
<Danh sách biến>:<Kiểu mảng>; Ví dụ 8.12:
TYPE matrix = ARRAY [1 20, 30] OF integer; VAR A:matrix;
Lệnh khai báo kiểu tên matrix ây mảng chiều, chiều thứ có số từ đến 20, chiều thứ hai có số từ đến 30, tổng cộng ta có (20 x 30) phần tử số nguyên Và ta có biến A biến có kiểu matrix
Ví dụ khai báo tương đương với:
TYPE matrix = ARRAY [1 20] OF ARRAY [1 30] OF integer; VAR A:matrix;
+ Khai báo gián tiếp: VAR
<Danh sách biến>: ARRAY [Kiểu_chỉ_số_1, , Kiểu_chỉ_số_n] OF <Kiểu phần tử>;
Khai báo biến A có dòng 10 cột kiểu phần tử Integer sau: VAR A: ARRAY [1 5, 10] OF integer;
+ Truy xuất phần tử mảng:
Tương tự cách truy xuất phần tử mảng chiều, mảngg nhiều chiều truy xuất thông qua tên biến mảng kết hợp với số đặt cặp dấu ngoặc vng
Mảng chiều ma trận, ví dụ ta có ma trận dịng 10 cột Các phần tử ma trận A ký hiệu a[i,j] với i vị trí cột j dịng Khi viết a[2, 7] hiểu phần tử dòng cột
Trong Pascal, ta viết a[i,j] thành a[i] [j] với ý nghĩa hoàn toàn Chú ý: Trên nguyên tắc, ta khai báo mảng có đến 255 chiều Tuy vậy, điều cần lưu ý kích thước nhớ máy tính có hạn nên thường khai báo mảng từ đến chiều Khai biến nhiều phải cần máy lớn
Chẳng hạn báo mảng [1 10] phần tử số nguyên lấy 10 bytes nhớ - Mảng chiều 10 x 10 = 100 bytes nhớ
- Mảng chiều 10 x 10 x 10 = 000 bytes nhớ
- Mảng chiều 10 x 10 x 10 x 10 = 10 000 bytes nhớ - Mảng chiều 10 x 10 x 10 x 10 x 10 = 100 000 bytes nhớ
- v.v
Ví dụ 8.13:
Viết chương trình Pascal để đọc bảng số thực nhập vào máy tính dạng mảng chiều Tính tổng giá trị số theo hàng theo cột Kết quảđược in hình theo vị trí hàng cột tương ứng
(48)Trước tiên, ta bắt đầu định nghĩa biến:
table = mảng chiều chứa số thực dạng bảng gồm số nhập kết nrows = biến số nguyên số hàng
ncols = biến số nguyên số cột row = sốđếm nguyên số hàng col = sốđếm nguyên số cột
ể đơn giản, giả sử kích thước số liệu nhập vào bảng tính khơng vượt q 10 hàng 10 cột Ta thêm vào hàng cộng phía cột cộng bên phải vào bảng để ghi kết tính cộng phần tử hàng cột tương ứng Như vậy, mảng chiều trở thành mảng in có số hàng (nrows + 1) số cột (ncols +1) Do vậy, ta phải khai báo biến table mảng chiều số nguyên có tối đa 11 cột 11 hàng
ể dễ theo dõi chương trình, ta thực cấu trúc module viết chương trình cách tiến hành làm thủ tục procedure cho đọc số liệu, tính tổng phần tử theo hàng, tính tổng phần tử theo cột in hình bảng kết Các thủ tục có tên tương ứng readinput, rowsums, columsums writeoutput
Thuật toán logic yêu cầu cho thủ tục cách khai báo thẳng trước (straightforward), ý thủ tục ta có vịng lặp đơi (double loop) Ví dụ, đểđọc số liệu bảng gốc, ta phải làm vịng lặp đơi sau:
FOR row:= TO nrows DO BEGIN
FOR col:= TO ncols DO readln( table[row, col] ); Writeln;
END;
Câu lệnh Writeln để báo chương trình nhảy tới dòng kế
Tương tự, vòng lặp sau viết để tính tổng phần tử theo hàng: FOR row:= TO nrows DO
BEGIN
table [row, ncols + 1]:= 0; FOR col:= TO ncols DO
table [row, ncols + 1]:= table [row, ncols + 1] + table [row, col]; END;
Tương tự, cấu trúc vịng lặp đơi dùng để tính tổng phần tử cột in bảng kết cuối
Sau chương trình Pascal tốn trên: PROGRAM Tongbang;
{đọc bảng số, tính tổng cột hàng cá bảng} VAR
row, col: 11;
(49)nrows, ncols: 10;
table: ARRAY [1 11, 11] OF real;
PROCEDURE Rowsums; {cộng phần tử theo cột bên hàng} BEGIN
FOR row:= TO nrows DO BEGIN
table [row,ncols+1]:= 0; FOR col:= TO ncols DO
table[row, ncols+1]:= table[row, ncols+1] + table[row,col]; END;
END;
PROCEDURE Columnsums; {cộng phần tử theo hàng bên cột} BEGIN
FOR col:= TO ncols DO BEGIN
table [nrows+1, col]:= 0; FOR row:= TO nrows DO
table[nrows+1,col]:= table[nrows+1,col] + table[row,col]; END;
END;
PROCEDURE Readinput; {đọc phần tử bảng} BEGIN
Write(' Nhập số hàng (1 10) ? ');Readln(nrows); Write(' Nhập số cột (1 10) ? ');Readln(ncols);
FOR row:= TO nrows DO BEGIN
Writeln (' Nhập số liệu hàng số, row:2');
FOR col:= TO ncols DO readln(table [row, col] ); END;
END;
PROCEDURE Writeoutput; {In bảng số liệu kết tính tổng} BEGIN
Writeln('Bảng số liệu kết tính tổng phần tử theo hàng cột '); Writeln(‘============================================= ‘); Writeln;
FOR row:= TO nrows + DO BEGIN
FOR col:= TO ncols+1 DO Write (table [row,col]: 6: 1); Writeln;
END;
(50)END;
BEGIN {Thân chương trình chính} Readinput;
Rowsums; Columnsums; Writeoutput;
END {Chấm dứt chương trình} Giả sử, ta có bảng số liệu sau:
2.5 -6.3 14.7 4.0 10.8 12.4 -8.2 5.5
-7.2 3.1 17.7 -9.1
Khi chạy chương trình, ta có (số có gạch số người thử chương trình): Nhập số hàng (1 10 ) ?
Nhập số cột (1 10) ? Nhập số liệu hàng số 2.5 -6.3 14.7 4.0 Nhập số liệu hàng số 10.8 12.4 -8.2 5.5 Nhập số liệu hàng số -7.2 3.1 17.7 -9.1
Chương trình tính tổng giá trịở hàng cột, xong in hình kết quả: Bảng số liệu kết tính tổng phần tử theo hàng cột
2.5 -6.3 14.7 4.0 14.9 10.8 12.4 -8.2 5.5 20.5 -7.2 3.1 17.7 -9.1 4.5 6.1 9.2 24.2 0.4 0.0
Ta kiểm tra kết hàng cột 2 Dữ liệu kiểu chuỗi (String Type Data)
Một chuỗi liệu loạt ký tự định nghĩa từ khoá STRING theo sau số ký tự cực đại có chuỗi ký tự String kiểu cấu trúc thêm vào Turbo Pascal
a Khai báo
Chúng ta khai báo kiểu chuỗi ký tự String gián tiếp trực tiếp Khai báo gián tiếp khai kiểu trước sau khai báo biến Cách khai báo trực tiếp khai thẳng biến số Chiều dài tối đa chuỗi ký tự phải nguyên đặt dấu ngoặc vng [] Trường hợp khơng khai báo chương trình lấy giá trị 255 ký tự
+ Khai báo gián tiếp TYPE
<Tên kiểu String> = STRING [hằng nguyên];
(51)VAR
<Tên biến>: <Tên kiểu String>; Ví dụ 8.14:
TYPE
TenSV = STRING [25]; {định độ dài tối đa 25} Diachi = STRING; {mặc nhiên có độ dài tối đa 255} VAR
HT: TenSV;
DC: Diachi;
+ Khai báo trực tiếp VAR
<Tên biến>: STRING [hằng nguyên]; Ví dụ 8.15:
VAR
HT: STRING [25];
DC: STRING;
Chuỗi ký tự chiếm số byte nhớ số ký tự lớn khai báo trước cộng thêm byte chứa số ký tự có chuỗi ký tự
Ví dụ 8.16:
TYPE DH = STRING[10]; VAR CT: DH;
và ta gán CT:= CAN THO;
thì CT cấp phát + 10 = 11 ô nhớ (byte) liên tục, với hình ảnh sau:
Chú ý:
- Độ dài chuỗi ký tự CT ký tự độ dài lớn cho phép 10 - Vì ta dùng byte để chứa chiều dài nên string có tối đa 255 ký tự
b Các thao tác chuỗi + Phép gán
Giống phép gán kiểu vô hướng khác, phép gán chuỗi lệnh gắn biến với biểu thức ký tự để cặp dấu nháy đơn
Cú pháp:
<Tên biến>:= Biểu thức ký tự; Ví dụ 8.17:
HT:= Lê Văn Hai;
DC:= Số 12/4 đường Trần Hưng ạo, TP Cần thơ;
(52)+ Phép cộng
Phép cộng thuật toán nối chuỗi lại với dấu cộng (+) Ví dụ ghép HT + DC ta được:
Lê Văn Hai Số 12/4 đường Trần Hưng ạo, TP Cần thơ Ghi chú: Khơng có phép trừ, nhân, chia chuỗi ký tự + Các phép so sánh
Các so sánh gồm có =, lớn >, lớn >=, khác <>, nhỏ <, nhỏ <=
Khi so sánh chuỗi ký tự ký tự so sánh cặp từ trái sang phải theo giá trị bảng mã ASCII Có khả xảy so sánh: - Nếu chuỗi có độ dài khác số ký tự giống độ dài chuỗi ngắn chuỗi ngắn nhỏ chuỗi dài
Ví dụ 8.18: 'Nation' < 'National ''Lan' < 'Lang' - Nếu chuỗi có độ dài nội dung giống
Ví dụ 8.19: 'Hello' = 'Hello'
Ghi chú: Chuỗi rổng (null string, viết '') chuỗi khơng có chứa Nó có giá trị nhỏ string khác rỗng
Vì vậy: 'A' >'' chr(32)> '' + Câu lệnh Read Readln
Hai câu lệnh chuỗi tương tự kiểu vô hướng khác, cần lưu ý:
- Lệnh Read Readln cho phép đọc tối đa 127 ký tự chuỗi nhập từ bàn phím chiều dài tối đa chuỗi đến 255 ký tự
- Nếu ta đọc lúc nhiều biến theo kiểu Read(biến1, biến2, , biếnN) ( Readln(biến1, biến2, , biếnN)) bị nhầm lẫn ta nhập giá trị có độ dài vượt độ dài tối đa biến1 phần vượt gán cho biến2 Ngược lại, ta nhập giá trị độ dài biến1 chương trình lại lấy giá trị biến2 gán thêm cho biến1 kể khoảng trống Do vậy, cách tốt biến kiểu String nên nhập lần biến
Ví dụ 8.20: Nên tránh viết kiểu Read(TenSV, Diachi); mà nên viết: Read(TenSV);
Read(Diachi); hoặc:
Readln(TenSV); Readln(Diachi);
- ộ dài thực tế chuỗi độ dài thực tế ta đọc vào từ bàn phím trước ta có khai báo độ dài chuỗi Nếu ta gõ Enter mà không gõ ký tự trước chương trình hiểu chuỗi rỗng (null string hay st = '') + Câu lệnh Write Writeln
Tương tự cần số lưu ý cách viết:
(53)- Nếu viết Write(st) Writeln(st) gọi cách viết không qui cách ký tự chiếm vị trí hình
- Nếu viết Write(st: n) Writeln(st: n) gọi cách viết theo qui cách, với n số nguyên, hình dành n vị trí để viết chuỗi st theo lối canh trái n> ngược lại theo lối canh phải n <
- Một số chuỗi mà có dấu chữ viết tắt, ví dụ câu: Hes an Intal staff (Ơng ta nhân viên quốc tế) nơi có dấu phải viết thành (đây dấu nháy đơn dấu nháy kép )
Ta viết:
Writeln ( ‘ He ‘’s an Int’’al staff ‘); c Các thủ tục hàm chuẩn xử lý chuỗi ký tự
Chuỗi ký tự dùng phổ biến lập trình nên Turbo Pascal đưa sẵn vào số thủ tục hàm chuẩn để xử lý chuỗi ký tự
* Thủ tục xóa DELETE (St, Pos, Num)
ý nghĩa: Xóa khỏi chuỗi St số ký tự Num vị trí Pos tính từ trái sang
Ví dụ 8.21: VAR st: string [20]; BEGIN
St:= ' BÀ BA BÁN BÁNH BÒ '; Writeln (St); DELETE (St, 10, 4); Writeln(St); Readln; END
Khi chạy chương trình, ta thấy hình: BÀ BA BÁN BÁNH BỊ
BÀ BA BÁN BÒ
* Thủ tục INSERT (Obj, St, Pos)
Ý nghĩa: Chèn chuỗi Obj xen vào chuỗi St kể từ vị trí Pos tính từ bên trái Ví dụ 8.22: VAR st: string [25];
BEGIN
St:= 'Bà BA BáN BáNH Bò'; Writeln (St);
INSERT ( BụNG Bự, St, 6); Writeln(St); Readln;
END
Khi chạy chương trình, ta thấy hình: Bà BA BáN BáNH Bò
Bà BA BụNG Bự BáN BáNH Bò * Thủ tục STR (S [: n[: m]], St)
ý nghĩa: ổi giá trị số S thành chuỗi gán cho St, Giá trị n:m có số vị trí số chữ số thập phân S
Ví dụ 8.23: VAR S: real;
St: string[10];
BEGIN
(54)S:= 12345.6718; Writeln(S:5:2); Str(S:6:2:st); Readln;
END Kết hình:
12345.67 {ây số} 12345.67 {ây chuỗi} * Thủ tục VAL(St, S, Code)
ý nghĩa: ổi chuỗi số St (biểu thị số nguyên số thực) thành số (số nguyên số thực) gán giá trị cho S Code số nguyên dùng để phát lỗi: đổi Code có giá trị = 0, sai St không biểu diễn số nguyên số thực Code nhận giá trị vị trí ký tự sai chuỗi St
Ví dụ 8.24: VAR St: String[10]; SoX: real;
maloi: integer;
BEGIN
St:= ‘123.456’;
VAL(St,SoX,maloi);
Writeln('Số X =, SoX:5:2, mã lỗi =, maloi); Readln;
St:=‘123.XXX ’;
VAL(St,SoX,maloi);
Writeln('St = 123.XXX không đổi thành số !'); Writeln('Sai lỗi vị trí thứ ', maloi); Readln;
END
Khi chạy, ta thấy hình: 123.45 maloi =
St = 123.XXX không đổi thành số ! Sai lỗi vị trí thứ
* Hàm LENGTH (St)
ý nghĩa: Cho kết số nguyên chỉđộ dài chuỗi ký tự St
ể viết chuỗi ký tự trung tâm hình, ta dùng thủ thuật viết chuỗi (80 - lenght(st)) div
Ví dụ 8.25:
USES CRT;
VAR St: String[80]; BEGIN
ClrScr;
Write(' Nhập vào câu: '); Readln(St);
(55)Gotoxy(80 - Lenght(St)) div2, 12); Writeln(St);
Readln; END
* Hàm COPY (St, Pos, Num)
ý nghĩa: Cho kết chuỗi ký tự có cách chép từ chuỗi St, vị trí Pos chép Num ký tự
Nếu vị trí Pos lớn chiều dài chuỗi St hàm COPY cho chuỗi rỗng Nếu giá trị vị trí Pos số ký tự Num (Pos + Num) lớn chiều dài chuỗi St hàm COPY nhận ký tự nằm chuỗi St
Ví dụ 8.26:
VAR St1, St2: string[25]; BEGIN
St1:= ‘UNIVERSITY OF CANTHO: 1966 - 1996’; St2:= COPY (St1, 15, 6);
END
Như vậy, giá trị biến St2 CANTHO * Hàm CONCAT (St1, St2, , StN)
ý nghĩa: Cho kết chuỗi ghép theo thứ tự từ chuỗi St1, St2, , StN Hàm giống phép cộng chuỗi Chuỗi không vượt 255 ký tự
* Hàm POS (Obj, St):
ý nghĩa: Cho kết vị trí chuỗi Obj chuỗi St Nếu khơng tìm thấy hàm POS cho giá trị
Ví dụ 8.27:
nếu St:= 1234567890, Obj:= 456 POS (Obj, St) = POS(4X, St)=0 d Truy xuất ký tự chuỗi
Ta truy xuất đến ký tự chuỗi với tên biến số dấu ngoặc vuông [] truy xuất phần tử mảng Ví dụ với chuỗi St St[i] ký tự thứ i chuỗi St, dĩ nhiên Chỉ số i chạy dài từ đến độ dài lớn chuỗi ký tự
Ví dụ 8.28:
PROGRAM DoiChu; VAR St:String; i: integer;
BEGIN
Write('Hãy nhập tên bạn: '); Readln(St);
FOR i:= TO Length(St) DO St[i]:= Upcase(St[i]);
(56)(*Hàm Upcase đổi ký tự thành chữ in hoa*) Writeln;
Writeln(St); Readln;
END
III KIểU TậP HợP (SET)
1 ịnh nghĩa khai báo TO
Một tập hợp (SET) bao gồm số phần tử có chất kiểu kiểu Trong Turbo Pascal IBM Pascal, số phần tử tối đa tập hợp 256 Kiểu kiểu vơ hướng liệt kê, kiểu miền kiểu Char, không số thực Khái niệm tập hợp Pascal tương tự khái niệm tập hợp toán học
+ Khai báo gián tiếp TYPE
<Kiểu bản> = (phần_tử_1, phần_tử_2, , phần_tử_n); <Tên kiểu tập hợp> = SET OF <Kiểu bản>;
VAR
<Tên biến >: <Tên kiểu tập hợp>; Ví dụ 8.29: TYPE
Sizes = (short, medium, large); Shirtsizes = SET OF sizes; VAR
shortleeve, longleeve: shirtsizes; + Khai báo trực tiếp
VAR
<Tên biến>: SET OF <Kiểu bản>; Ví dụ 8.30:
VAR
Chu : SET OF Char; So : SET OF 9; ABC : SET OF 256;
Date : SET OF (Sun, Mon, Tue, Wed, Fri, Sat);
2 Mô tả tập hợp TO
Một tập hợp mô tả cách liệt kê phần tử tập hợp, chúng cách dấu phẩy (,) đặt hai dấu móc vng [], phần tử hằng, biến biểu thức
Ví dụ 8.31:
[] {tập hợp rỗng, khơng có phầnt tử} [5 15] {tập hợp chữ số nguyên từ đến 15}
[1, 3, 5] {tập hợp số 1, 5}
(57)[Hồng, Lan, Cúc, Mai] {tập hợp tên loài hoa}
[i, i + j*2, 4, 5] {tập hợp biến nguyên gồm số 4, số nhận từ i, i +j*2 với i, j biến nguyên}
3 Các phép toán tập hợp TO
a Phép gán
Ta gán giá trị tập mô tả vào biến tập kiểu Riêng tập hợp rỗng gán cho biến kiểu tập hợp khác
Với ví dụ trên, ta gán:
Chu := [X,Y,Z];
So := [2,3,4]; Date := [];
Nếu ta viết Chu:= [1,2]; khơng hợp lệ Chu tập hợp chữ b Phép hợp
Hợp tập hợp A B tập hợp chứa tất phần tử tập A B A B
Ký hiệu phép hợp dấu cộng (+) Phép hợp có tính giao hốn: A+B = B+A
Ta mơ tả phép hợp qua hình ảnh sau:
Ví dụ 8.32 A:= [0,1,3,5,7,9];
B:= [0,2,4,6,8,9];
C:= A + B;
{tập hợp C có phần tử [0,1,2,3,4,5,6,7,8,9]} c Phép giao
Giao tập hợp A B tập chứa phần tử A B Ký hiệu A * B Phép giao có tính giao hốn, nghĩa A * B = B * A Minh họa sau:
Với ví dụ phép hợp, nếu:
D:= A * B; {tập D chứa phần tử [0,9]}
Nếu A B khơng có phần tử giống phép hợp cho tập rỗng d Phép hiệu
(58)Hiệu tập hợp A B, ký hiệu A - B, tập hợp chứa phần tử thuộc A mà khơng thuộc B Lưu ý: A - B khác B - A
Ví dụ 8.33: A:= [3 7];
B:= [1 6, 10, 15];
thì A - B tập hợp [7] cịn B - A tập hợp [1,2, 10,15] e Phép thuộc IN
Phép thuộc IN cho phép thử xem giá trị thuộc tập hay khơng? Phép thuộc IN cho kết có kiểu Boolean Nếu cho kết TRUE, ngược lại FALSE
Ví dụ 8.34: Chu biến kiểu Char, A biến kiểu SET OF Char Chu:= ‘X’;
A:= [‘X’, ‘x’,’Y’, ‘y’, ‘Z’, ‘z’];
thì phép tốn Chu IN A cho kết TRUE f Các phép so sánh =, <>, <= >=
Muốn so sánh tập hợp với chúng phải có kiểu Kết phép so sánh giá trị kiểu Boolean, tức TRUE (úng) FALSE (Sai) Hai tập hợp A B gọi (A = B) chúng có phần tử giống với đôi (không kế thứ tự xếp phần tử tập) Ngược lại phép so sánh (=) phép so sánh khác (<>) Nghĩa là, A = B TRUE A <> B FALSE ngược lại
Phép so sánh nhỏ (<=) A <= B cho kết TRUE phần tử có A có B ịnh nghĩa tương tự lớn hoặc (>=) Với A >= B phần tử B có A, kết này TRUE, ngược lại FALSE
Chú ý: Trong Pascal khơng có phép so sánh nhỏ (<) lớn (>) ể kiểm tra xem tập A có thực nằm tập B hay không (A nhỏ B), ta phải sử dụng thêm phép logic sau:
IF (A <> B) AND (A <= B) THEN WRITELN ( ‘A < B’)
4 Viết đọc liệu kiểu tập hợp T
Với liệu kiểu tập hợp, ta viết đọc vào thủ tục (Write) Writeln (Read) Readln Tuy nhiên, ta thực thao tác mà kiểu tập hợp số nguyên, ký tự
Ví dụ 8.35: Viết chương trình để đọc câu bất kỳ, xếp chữ câu theo thứ tự ABC abc từ chữ in đến chữ thường Chương trình chấm dứt nhận chữ END end
PROGRAM Letters_used; TYPE letters = SET OF char;
(59)VAR used, unused: letters;
count, charcount: 80; alpha: char;
line: string;
PROCEDURE Readinput; {đọc câu bất kỳ} BEGIN
FOR count:= TO 80 DO line[count]:= ‘ ‘; Writeln (' Nhập vào dòng câu đây: ');
Count:= 0;
WHILE NOT eoln DO {hàm eoln trả giá trị false ký tự nhận vào khác}
BEGIN {ký tự kết thúc dòng CR: carry return} count:= count + 1;
read(line[count]); END;
readln;
charcount:= count; END;
PROCEDURE Writeoutput; {trình bày phân tích dịng câu} BEGIN
writeln;
write(' Các chữ sử dụng: '); FOR alpha:= ‘A’ to ‘z’ DO
IF [alpha] <= used THEN write( ‘ ‘, alpha); writeln;
writeln; END;
BEGIN {Thân chương trình chính} Readinput;
WHILE NOT (([line[1]] <= [‘E’, ‘e’]) AND ([line[2]] <= [‘N’, ‘n’]) AND ([line[3]] <= [‘D’, ‘d’])) DO
BEGIN used:= [];
unused:= [‘A’ ‘Z’, ‘a’ ‘z’];
FOR count:= TO charcount DO IF [line[count]] <= unused THEN
BEGIN
used:= used + [line[count]];
unused:= unused - [line[count]]; END;
(60)Writeoutput; Readinput;
END; END
Khi chạy chương trình, ta thấy (Các dòng chữ gạch người dùng): Nhập vào dòng câu đây:
Pascal is a structured programming language derived from ALGOL - 60 Các chữ sử dụng: A G L O P a c d e f g i l m n o p r s t u v
Nhập vào dòng câu đây: END
IV KIểU BảN GHI (RECORD)
1 ịnh nghĩa khai báo TOP
Các cấu trúc liệu kiểu mảng (Array) tập hợp (Set) có hạn chế chỗ phần tử tập hợp chúng phải kiểu mơ tả Song thực tế, có kiểu cấu trúc liệu khác lại có mối liên quan
Ví dụ 8.36:
ể mô tả liệu lý lịch người đó, người ta phải khai báo họ tên người (kiểu String), Phái (Nam:=True, Nữ:= False theo kiểu Boolean), ngày sinh (mô tả kiểu date), địa (kiểu String) mức lương (kiểu integer), v.v Với kiểu khác Pascal, ta phải dùng kiểu ghi (RECORD)
Kiểu ghi ngôn ngữ Pascal gắn liền với kiểu tập tin (FILE) - trình bày phần Tuy nhiên, ta sử dụng RECORD cách độc lập với FILE
RECORD kiểu liệu bao gồm nhiều thành phần khác kiểu liệu, thành phần gọi trường (Field)
Cú pháp khai báo kiểu ghi (Record) trước khai báo biến sau: + Khai báo gián tiếp:
TYPE
<Tên kiểu ghi> = RECORD
<Tên trường 1a>[,<Tên trường1b>, ]: <Kiểu trường>;
<Tên trường 2a>[,<Tên trường2b>, ]: <Kiểu trường>;
.; END;
VAR
<Tên biến1>[,<Tên biến2>, ]: <Tên kiểu ghi>; Ví dụ 8.37:
(61)Ta làm khai báo khách hàng cơng ty chun bán hàng trả góp Số liệu cần sử dụng ngày tháng làm ghi thông tin khách hàng nợ tốn cho cơng ty, theo minh họa hình dưới:
Trong chương trình này, Cơng ty phân tình trạng loại khách nợ (status): kỳ hạn phải trả (current), hạn phải trả (overdue) loại khách chểnh mảng, dây dưa việc trả nợ nhiều lần (delinquent) đây:
- Status khai báo theo kiểu liệu liệt kê (enumerated data type)
- Account (Số kế toán) kiểu record, chứa thông tin tên địa khách nợ (kiểu chuỗi string), số khách nợ (kiểu số nguyên integer-type), loại khách nợ (kiểu liệt kê enumerated type) số liệu tồn đọng nợ khách (kiểu số thực real-type)
- Date (Ngày tháng) kiểu Record chương trình ghi ngày, tháng năm đáo nợ khách hàng
Biến chương trình khách hàng (customer) Ta khai báo sau:
TYPE status = (current, overdue, delinquent);
date = RECORD
day: 31;
month: 12;
year: 1900 2100;
END;
account = RECORD
Custname: String;
Custaddress: String;
Custno: 9999;
(62)Custtype: status;
Custbalance: Real;
Lastpayment: date;
END; VAR customer: account; + Khai báo trực tiếp VAR
<Tên biến1>[,<Tên biến2>, ]: RECORD
<Tên trường 1a>[,<Tên trường1b>, ]: <Kiểu trường>;
<Tên trường 2a>[,<Tên trường2b>, ]: <Kiểu trường>;
.; END;
2 Truy xuất Record TOP
ể truy xuất vào trường kiểu Record, ta cần dùng tên biến kiểu Record, sau dấu chấm (.) đến tên trường Dạng tổng quát sau:
<Biến Record>.<Tên trường> Ví dụ 8.39: Nhập lý lịch nhân viên quan TYPE
Lylich = RECORD {Lý lịch gồm Họ tên, Tuổi, Phái, Lương}
Hoten: string [25];
Tuoi: integer;
PhaiNam: boolean; {Nam: M (Male), Nữ: F (Female)}
Luong: real;
END;
VAR x, y: Lylich;
nv: ARRAY [1 200] OF Lylich; {nv mảng lý lịch nhân viên}
Write('Nhập tổng số nhân viên: '); readln(n); FOR i:= TO n DO
BEGIN
Write(' Họ tên: '); readln(nv[i].Hoten); Writeln(' Tuổi: '); readln(nv[i].Tuoi);
Write(' Phái (Nam:M, Nữ: F) ? '); readln (Phai);
IF (Phai = ‘M’) or (Phai =‘m’) THEN nv[i].PhaiNam:= TRUE ELSE nv[i].PhaiNam:= FALSE;
Writeln(' Lương: '); read(nv[i].Luong); END;
(63)Lưu ý:
Các biến Record gán cho Ví dụ x y biến ghi có kiểu Lylich, ta gán:
x:= y; Như ta lặp lại:
x.Hoten:= y.Hoten;
x.Tuoi:= y.Tuoi;
Không viết hình đọc từ bàn phím biến record như: Writeln(x); Readln(x);
Không thể so sánh record phép toán quan hệ <, >, <=, >=,=,<> Khơng dùng tốn số học logic với kiểu record
Ví dụ 8.40: Nhập vào số phức C1 C2 tính C3 tổng chúng
Với chương trình loại ta phải nhập phần thực phần ảo riêng rẽ C1 C2 Ta dùng dòng lệnh C3 = C1 + C2 Kết tính C3 phải phép cộng riêng rẽ phần thực phần ảo C1 C2 ghép lại
PROGRAM So_Phuc; TYPE
Sophuc = Record
pt, pa: real; End;
VAR
c1, c2, c3: Sophuc; BEGIN
Write('Lần lượt nhập phần thực phần ảo số phức C1 C2'); Write('Nhập phần thực số phức C1: '); Readln(c1.pt);
Write('Nhập phần ảo số phức C1: '); Readln(c1.pa); Write('Nhập phần thực số phức C2: '); Readln(c2.pt); Write('Nhập phần ảo số phức C2: '); Readln(c2.pa);
c3.pt:= c1.pt + c2.pt;
c3.pa:= c1.pa + c2.pa;
Writeln('Kết phép cộng số phức:'); Write(‘C3 = C1 + C2 ‘);
Write(‘ = (‘, c1.pt:5:2, ‘+i ‘, c1.pa:5:2, ‘) +(‘, c2.pt:5:2, ‘+i ‘,c2.pa:5:2, ‘) ‘);
Write(‘C3 = ‘, c3.pt:5:2, ‘+i’, c3.pa:5:2 ); Readln;
END
Các Record lồng T
(64)Record lồng record mà có trường (field) lại có kiểu một record khác Ta định nghĩa record lồng theo cách trực tiếp hay gián tiếp cách khai báo hoàn toàn tương tự cách khai báo record
Ví dụ 8.41: TYPE
dd_mm_yy = Record
dd:1 31;
mm:1 12;
yyyy:1900 2100; end;
hoso = Record
masv:string[7];
ngsinh:dd_mm_yyyy; diem:real;
end;
VAR
Lop: Array[1 20] of hoso;
4 Câu lệnh WITH T
Nhiều chương trình địi hỏi phần tử khác record phải thao tác vị trí khác bên chương trình Như phải cần có nhiều thị trường khác đặc trưng Việc làm chương trình trở nên phức tạp, tẻ nhạt khó theo dõi ể giải tình trạng này, Pascal đưa cấu trúc câu lệnh WITH DO record nhằm bớt rắc rối từ thị trường (hay nói cách khác, câu lệnh WITH DO phép toán đặt thừa số chung mà thừa số chung tên biến record)
Dạng tổng quát câu lệnh WITH là: WITH <tên biến record> DO
BEGIN
<Câu lệnh với tên trường 1>; .;
<Câu lệnh với tên trường n>; END;
Ví dụ 8.42:
Một biến ghi DANSO có trường KHUVUC, HOTEN, NGAYSINH, DIACHI, NGHE đưa liệu từ bàn phím sau:
WITH DANSO DO BEGIN
Write ('Khu vực điều tra:'); Readln (KHUVUC); Write ('Họ tên công dân:'); Readln (HOTEN);
(65)Write ('Ngày-tháng-năm sinh:'); Readln (NGAYSINH); Write ('ịa công dân:'); Readln (DIACHI);
Write ('Nghề nghiệp: '); Readln (NGHE); END;
ối với ghi có nhiều thứ bậc:
R1 biến ghi có trường R2 R2 biến ghi có trường R3 R3 biến ghi có trường R4
thì câu lệnh WITH tổ chức lồng nhau: WITH R1 DO
WITH R2 DO
WITH RN DO <Câu lệnh >; hay viết đơn giản hơn:
WITH Record1, Record2, , RecordN DO <Câu lệnh BEGIN END>; ở ví dụ 8.41, ta viết sau:
WITH Lop[i] DO Begin
With Ngsinh Do
Begin dd:= 25; mm:=05; yyyy:=1978; End; masv:='7962343'; diem:=9.0;
End;
(66)PHỤ CHƯƠNG
éỒ HỌA TRONG TURBO PASCAL
I KHÁI NIỆM VỀ ĐỒ HỌA
II KHỞI ĐỘNG CHẾ ĐỘ ĐỒ HỌA III LỔI ĐỒ HỌA
IV MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH Màu mẩu(kiểu)
2 Điểm, kiểu đường thẳng, đường thẳng Cỏc hỡnh khụng tụ
4 Cỏc hỡnh cú tụ
5 Xử lý chuỗi ký tự trờn hỡnh đồ họa Cửa sổ chế độ đồ họa
7 Đóng chế độ đồ họa V MỘT VÀI VÍ DỤ MINH HỌA
Phần nhằm giới thiệu số khái niệm chế độ đồ họa, thủ tục hàm để: khởi động chế độ đồ họa, vẽ hỡnh đường thẳng, đường trũn, cung elip, hỡnh quạt, đa giác, chuỗi ký tự, cửa sổ ViewPort, khai báo sẵn Unit Graph Turbo Pascal
I KHÁI NIỆM VỀ éỒ HỌA TO
Trong Turbo Pascal có hai chế độ thường sử dụng là: chế độ văn (text mode) chế độ đồ họa (graphics mode) Chế độ văn thỡ hỡnh thiết lập hiển thị 25 dũng 80 cột nhưđó giới thiệu phần trước Cũn chế độđồ họa, thỡ hỡnh lại thiết lập dựa điểm ảnh (pixel), hỡnh gồm nhiều điểm ảnh xếp đường thẳng nằm ngang đường thẳng đứng, trí số pixel loại hỡnh gọi độ phân giải (Resolution), độ phân giải cao thỡ số pixel nhiều hỡnh ảnh mịn
Hệ tọa độ cho loại hỡnh cú khỏc (xem bảng 1), chẳng hạn loại hỡnh VGA 640x480 hỡnh sau:
(67)Một chương trỡnh đồ họa thường gồm phần sau: · Khởi tạo chếđộđồ họa
· Xác định màu nền, màu kiểu chữ, màu đường vẽ, màu tô kiểu tô ã Vẽ tụ cỏc hỡnh ta cần thực
· Các thao tác khác cho dũng chữ, chỳ thớch ã éúng chế độđồ họa để trở chếđộ văn
II KHỞI éỘNG CHẾ éỘ éỒ HỌA T
éể cú thể thực chương trỡnh trờn chế độ đồ họa, trước tiên ta phải khởi động chế độđồ họa Việc thông qua thủ tục sau:
Procedure InitGraph(var GraphDriver:Integer; var GraphMode: Integer; PathToDriver: string);
Với: GraphDriver, GraphMode loại hỡnh mốt hỡnh (xem bảng 1) PathToDriver đường dẫn thư mục chứa tập tin điều khiển đồ họa Vớ dụ: Giả sử ta cú loại hỡnh VGA, mốt VGAHi, cỏc tập tin điều khiển đồ họa thư mục F:\WINAPPS\BP\BGI, ta viết phần chương trỡnh khởi động đồ họa sau:
Uses Graph;
Var mh,mode: integer; {mh: loại hỡnh} Begin
mh:=VGA; mode:=VGAHi; {cú thể dựng DETECT cho mh} (1) Initgraph(mh,mode,’ F:\WINAPPS\BP\BGI’);
End
Việc nhớ cỏc loại hỡnh mốt hỡnh điều gây dễ nhầm lẫn, ta máy tự động dũ tỡm loại mốt hỡnh Như chương trỡnh trờn ta bỏ dũng (1) thỡ thực mỏy tự động dũ tỡm (DECTECT), điểm hay vỡ nú cho khởi động loại hỡnh sử dụng mốt đồ họa có độ phân giải cao
Bảng 1: Cỏc giỏ trị Grapdriver, GraphMode Resolution số loại hỡnh thụng dụng
GraphDriv GraphMode Resolution
(68)er
DETECT (0)
éộ phõn giải cao loại hỡnh sử dụng
CGA (1) CGAC0 (0) CGAC1 (1) CGAC2 (2) CGAC3 (3) CGACHi (4)
320 x 200 320 x 200 320 x 200 320 x 200 640 x 200
EGA (3) EGALo (0) EGAHi (1)
640 x 200 640 x3 50 VGA (9) VGALo (0) VGAMed (1) VGAHi (2)
640 x 200 640 x 350 640 x 480
Chỳ ý: Ở bảng cỏc DETECT cú giỏ trị 0, VGA cú giỏ trị 9, VGAHi
cú giỏ trị 2,
Ta xác định Grapdriver, GraphMode Resolution máy hoạt động chương trỡnh sau:
Uses Graph;
Var mh,mode:integer; Begin
mh:=Detect; {Cú thể bỏ dũng này} initgraph(mh,mode,'f:\winapps\bp\bgi');
writeln('GraphDriver = ',mh,' Graphmode = ',mode,' Resolution =',GetmaxX,
'x',GetMaxY); readln;
closegraph; End
(69)Với: GetmaxX, GetMaxY hàm trả giá trị lớn tương ứng cho hàng, cột hỡnh mốt hành
III LỖI éỒ HỌA TO
Khi khởi động đồ họa, máy không tỡm thấy chương trỡnh điều khiển đồ họa thỡ phỏt sinh lỗi đồ họa chương trỡnh khụng thể thực treo máy
Trong trường hợp có khơng có lỗi, ta nên sử dụng hàm GraphResult để biết có lỗi hay khơng? Có thể kết hợp với hàm GraphErrorMsg để nhận thông báo Bảng liệt kê số thông báo lỗi thường gặp: Bảng 2: Các lỗi đồ họa
Hằng Trị mó
lỗi
Thụng tin lỗi phỏt GrOk GrNoInitgraph GrNotDetected GrFileNotFound GrInvalidDriver GrNoloadMem GrNoScanMem GRNoFloodMem GrFontNoFound GrNoFontMem GrInvalidMode GrError GrIOError GrInvalidFont GrInvalidFontNum -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14
Khơng có lỗi khởi động đồ họa Chưa khởi động dồ họa
Khơng có phần cứng đồ họa
Khụng tỡm thấy trỡnh điều khiển đồ họa Trỡnh điều khiển không hợp lệ
Không đủ nhớ RAM cho đồ họa Tràn vựng nhớ Scan Fill Tràn vựng nhớ Flood Fill Khụng tỡm thấy tập tin Font
Không đủ nhớ RAM để nạp Font
Kiểu đồ họa không hợp lệ cho trỡnh điều khiển
Lỗi đồ họa tổng quát Lỗi đồ họa vào
Tập tin Font khụng hợp lệ
Số hiệu đại diện cho Font không hợp lệ
Ví dụ: Chương trỡnh kiểm tra quỏ trỡnh khởi động đồ họa có lỗi thơng báo lỗi hỡnh:
Uses Graph; Var
maloi: Integer;
GrDriver, GrMode: Integer; Begin
GrDriver:= Detect;
InitGraph(GrDriver, GrMode, 'f:\winapps\bp\bgi'); maloi:= GraphResult; {Check for errors}
if maloi <> grOk then
(70)begin
Writeln('Lỗi đồ họa là: ', GraphErrorMsg(maloi)); Writeln('Lỗi!, Thoát khỏi chương trỡnh ');
Halt(1); {Lệnh ngắt ngang kết thúc chương trỡnh} end
else {Phần chương trỡnh cần thực khụng cú lỗi đồ họa} End.
IV MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH
1 Mầu mẫu (kiểu) TO
éối với hỡnh trắng đen (Hercules Monochrome) ta có giá trị màu 1, cũn cỏc hỡnh màu (VGA, EGA, ) thỡ cú 16 giỏ trị màu từ 15 liệt kê bảng 3, kiểu tơ màu thỡ cú 11 kiểu định sẵn từ 11 kiểu người lập trỡnh định nghĩa (User - defined fill) kiểu tô liệt kê bảng
a Thủ tục chọn màu đường vẽ
SetColor(ColorNum:word); b Thủ tục đặt màu hỡnh
SetBkColor(ColorNum:word); c Thủ tục chọn kiểu tụ màu tụ
SetFillStyle(Pattern:word; ColorNum:word); d Hàm nhận màu trả thủ tục SetColor đặt màu trước
GetColor: word;
e Hàm nhận màu trả thủ tục SetBkColor đặt trước
GetBkColor: word;
f Hàm trả giỏ trị màu lớn
GetMaxColor: word;
Bảng 3: Cỏc giỏ trị cú thể nhận biến màu ColorNum
Tờn Giỏ trị
màu
Màu hiển thị Black Blue Green Cyan Red Magenta Brown LightGray DarkGray LightBlue LightGreen 10 éen
Xanh da trời Xanh lỏ cõy Xanh lơ éỏ Tớm Nõu
Xỏm nhạt Xỏm sẫm
Xanh da trời nhạt Xanh lỏ cõy nhạt
(71)LightCyan LightRed LightMagenta Yellow White 11 12 13 14 15
Xanh lơ nhạt éỏ nhạt Tớm nhạt Vàng Trắng Bảng 4: Cỏc giỏ trị cú thể nhận biến kiểu tụ Pattern
Tờn Giỏ trị kiểu tụ
Diễn giải kiểu tụ EmptyFill SolidFill LineFill LtSlashFill SlashFill BkSlashFill LtBkSlashFill HatchFill XHatchFill InterleaveFill WideDotFill CloseDotFill UserFill 10 11 12
Tụ màu Tô đặc
Tụ gạch ngang Tụ ///
Tô /// in đậm Tô \\\ in đậm Tụ \\\
Tơ đường gạch bóng nhạt Tơ đường gạch bóng chữ thập
Tơ đường đứt qng Tơ dấu chấm thưa Tụ dấu chấm dày
Mẫu tụ tự tạo
2 éiểm, kiểu đường thẳng, đường thẳng T
a Thủ tục vẽ điểm tọa độ (x,y)
PutPixel(x,y:integer;ColorNum:word); b Thủ tục chọn kiểu đường thẳng
SetLineStype(linestyle:word;pattern:word;thickness:word); Với tham số LineStyle có giá trị bảng sau:
Bảng 5: Tham số LineStyle
Hằng Giỏ
trị Diễn giải SolidLn DottedLn CenterLn DashedLn UserBitLn
Nét đậm Nột chấm Nột chấm gạch Nột gạch Mẫu tự tạo Với tham số thickness có giá trị bảng sau:
(72)Bảng 6: Tham số Thickness
Hằng Giỏ trị Diễn giải NormWidt
h
ThickWidt h
1
Bề dày bỡnh thường
Bề dày đậm
c Thủ tục vẽ đường thẳng từ tọa độ (x1,y1) đến tọa độ (x2,y2) Line(x1,y1,x2,y2: integer);
3 Cỏc hỡnh khụng tụ TOP
a Thủ tục vẽ hỡnh chữ nhật
Rectangle(x1,y1,x2,y2:integer); b Thủ tục vẽ hỡnh trũn
Circle(x,y:integer;r:word); Với x,y tọa độ tâm, r bán kính c Thủ tục vẽ cung trũn
Arc(x,y:integer; StAngle,EndAngle:word; r:word); Với StAngle góc bắt đầu, EndAngle góc kết thúc d Thủ tục vẽ cung Ellipse Ellipse
Ellipse(x,y:integer;StAngle,EndAngle:word;Xradius,Yradius:word);
Nếu StAngle = EndAngle =360 thỡ hỡnh Ellipse, EndAngle < 360 thỡ cung Ellipse
4 Cỏc hỡnh cú tụ TOP
a éường gấp khúc (đa giác)
Muốn vẽ đường gấp khúc qua n điểm tọa độ: (x1,y1), (x2,y2), , (xn,yn ) thỡ ta phải đưa tạo độ n điểm vào mảng poly mà phần tử mảng có kiểu PointType định nghĩa sẵn sau:
Type
PointType = Record
x,y: integer;
end;
Khi điểm cuối (xn,yn ) có tọa độ trùng với điểm đầu (x1,y1 ) thỡ n điểm tạo thành đường gấp khúc khép kín
Dùng thủ tục DrawPoly(n, poly); để vẽ đường gấp khúc qua n tọa độ định sẵn mảng poly
Dùng thủ tục FillPoly(n,poly); để vẽ tô đường gấp khúc qua n tọa độđó định sẵn mảng poly
Vớ dụ:
Uses Graph; Const
(73)gkkk: Array[1 4] of Pointtype = ((x:405;y:200),(x:590;y:5),(x:500;y:300),(x:405;y:200));
Var Gd, Gm: Integer; Begin
Gd:= Detect;
InitGraph(Gd, Gm, 'F:\WINAPPS\BP\BGI'); if GraphResult <> grOk then Halt(1);
SetBkcolor(CYAN);
SetColor(YELLOW);
SetFillStyle(SolidFill,MAGENTA);
DrawPoly(3,gk);
FillPoly(3,gk); {đường gấp khúc khơng khép kín} FillPoly(4,gkkk); {đường gấp khúc khép kín}
Readln;
CloseGraph;
End
b Thủ tục vẽ hỡnh chữ nhật Bar(x1,y1,x2,y2: integer); c Thủ tục vẽ hỡnh hộp chữ nhật
Bar3D(x1,y1,x2,y2:integer; depth:word;top:boolean); Tham số depth: số điểm bề sõu khối chiều
Tham số top có giá trị định nghó sẵn là: TopOn (True) tương ứng khối chiều có nắp TopOff (False) ứng với khối chiều khơng có nắp (xem hỡnh vẽ)
d Thủ tục vẽ hỡnh Ellipse
FillEllipse(x,y:integer;xradius,yradius:word); e Thủ tục vẽ hỡnh quạt
PieSlice(x,y:integer; StAngle,EndAngle,radius:word);
5 Xử lý chuỗi ký tự trờn hỡnh đồ họa T
a Thủ tục nạp Font chữ
Cỏc font chữ nằm cỏc tập tin cú phần mở rộng là.CHR éể nạp cỏc font chữ ta dựng thủ tục:
SetTextStyle(font,direction,charsize:word);
(74)Với: Tham số font cú thể nhận cỏc giỏ trị sau:
Hằng DefauFont hay giỏ trị
Hằng TriplexFont hay giỏ trị Hằng SmallFont hay giỏ trị Hằng SansSerifFont hay giỏ trị Hằng GothicFont hay giỏ trị Tham số direction cú thể nhận cỏc giỏ trị sau:
Hằng HorizDir hay giỏ trị Hằng VertDir hay giỏ trị
Tham số charsize cỡ ký tự nú cú thể nhận giá trị từ đến 10
b Thủ tục đặt chế độ chỉnh chuỗi văn SetTextJustify(horiz, vert:word);
Trong đó:
Tham số horiz cú thể cỏc hằng: LeftText, CenterText, RightText
Tham số vert cú thể cỏc hằng: BottomText, CenterText, TopText
c Thủ tục hiển thị chuỗi văn vị trí nháy OutText (text:string);
d Thủ tục hiển thị chuỗi văn tọa độ (x,y) OutTextXY (x,y:integer;text:string);
6 Cửa sổ chế độ đồ họa (ViewPort) TO
éể thiết lập cửa sổ trờn hỡnh đồ họa, ta sử dụng đến chức ViewPort Cửa sổ ViewPort xem vùng chữ nhật hỡnh độ họa, giống thủ tục Window chế độ văn (Text mode), nghĩa ta dũng văn bản, vẽ hỡnh xúa nằm gọn ViewPort định, ta minh họa cửa sổ ViewPort hỡnh sau:
(75)éể hiểu rừ cỏch thiết lập ViewPort, ta hóy xột đến cách khai báo kiểu ViewPort sau:
ViewPortType = Record
x1, y1, x2, y2: Integer; Clip: Boolean;
End;
Trong đó: (x1, y1), (x2, y2) góc tọa độ bên trái tọa độ góc bên phải, mà chúng phải thỏa tính chất sau: Clip biến trường có kiểu Boolean mà có ý nghĩa sau:
ã Nếu cú giỏ trị True (hay ClipOn) thỡ khụng cho phộp vẽ bờn ViewPort
ã Nếu cú giỏ trị False (hay ClipOff) thỡ cho phộp vẽ bờn ViewPort
a Thủ tục thiết lập ViewPort
SetViewPort(x1,y1,x2,y2:integer; Clip:Boolean);
Sau thiết lập ViewPort ta có hệ tọa độ mà góc bên trái ViewPort có tọa độ (0,0)
Ví dụ: Như hỡnh vẽ trờn (giả sử ta chọn Clip ClipOn) thỡ ta phải thiết lập ViewPort sau: SetViewPort(300,250,500,350,ClipOn);
* Tọa độ âm dương
Với số đồ thị tốn học phải có tọa độ âm dương, để vẽ ta phải chia hỡnh làm phần tương ứng với vùng (I, II, III, IV) âm dương hệ trục tọa độ xy éể thực việc này, ta phải dựng đến cửa sổ ViewPort, với cách thiết lập cho tọa độ (0,0) trục tọa độ xy tâm tuyệt đối hỡnh gúc trờn bờn trỏi ViewPort sau:
- éặt: x1= GetmaxX; y1= GetmaxX; x2= GetmaxX; y2= GetmaxX;
- Dùng thủ tục SetViewPort(x1,y1,x2,y2,ClipOff), với Clip = ClipOff để vẽ ngồi giới hạn ViewPort
(76)Vớ dụ:
Vẽđồ thị hàm sin(x) hệ trục tọa độ âm dương, với hoành độ Program Dothi;
Uses Crt,Graph; Const
ScaleX=20; ScaleY=80;
Var mh,mode,x,y,i:integer; Begin
InitGraph(mh,mode,'F:\WINAPPS\BP\BGI');
SetViewPort(GetmaxX DIV 2,GetmaxY DIV 2,GetmaxX,GetmaxY,ClipOff);
SetColor(blue);
Line(-(GetmaxX DIV 2),0,GetmaxX DIV 2,0); Line(0,-(GetmaxY DIV 2),0,GetmaxY DIV 2); SetTextJustify(CenterText,CenterText);
SetColor(White);
OutTextXY(-GetmaxX DIV 4,-GetmaxX DIV 4,'DO THI HINH SIN '); SetColor(Red);
OutTextXY(GetmaxX DIV 2- 32,2,'Truc x >'); OutTextXY(27,-(GetmaxY DIV 2-5),'^ Truc y'); OutTextXY(0,0,'0,0');
for i:= -400 to 400 begin
x:=Round(2*Pi*i* ScaleX /200); y:=Round(Sin(2*Pi*i/200)* ScaleY); PutPixel(x,y,Yellow);
end;
Repeat Until KeyPressed; CloseGraph;
End
b Thủ tục nhận ViewPort hành
GetViewSettings(Var ViewPort: ViewPortType); c Thủ tục xúa bờn hỡnh ViewPort hành
ClearViewPort;
Thủ tục xúa tất cỏc phần (hỡnh vẽ, chuỗi ký tự, ) bờn ViewPort đưa trỏ tọa độ (0,0) cửa sổ ViewPort hành
d Thủ tục xúa hỡnh đồ họa ClearDevice;
7 éúng chế độ đồ họa TOP
(77)éể trở chếđộ văn bản, ta dùng thủ tục: CloseGraph;
V MỘT VÀI VÍ DỤ MINH HỌA TO
Ví dụ 1: Vẽ Bầu trời đầy PROGRAM Vebautroi; Uses Graph,Crt;
Var gd,gm,x,y:integer; maxcolor:word; Begin
Gd:=Detect;
Initgraph(gd,gm,'C:\TP70\BGI'); If Graphresult<> Grok Then Halt(1); x:=GetmaxX; y:=GetmaxY; Maxcolor:=Getmaxcolor; Randomize;
While (not keypressed) Begin delay(100);
Putpixel(random(x),random(y), Random (maxcolor-1)+1);
end; Closegraph; End
Ví dụ 2: Vẽđồ thị hàm số: Sin(x),Cos(x) Arctan(x) PROGRAM VeDothi;
Uses Crt,Graph; Var
mh,mode:integer;chon:char;chugiai:string; Procedure Chonham;
begin
writeln('Các đồ thị có thể:');
writeln('1 >éồ thị hỡnh Sin(x)'); writeln('2 >éồ thị hỡnh Cos(x)'); writeln('3 >éồ thị hỡnh ArcTan(x)'); write('Chọn đồ thị ?'); readln(chon);
Case chon of
'1': chugiai:=éỒ THỊ HÀM SIN; '2': chugiai:=éỒ THỊ HÀM COS; '3': chugiai:=éỒ THỊ HÀM ARCTAN; end;
end;
(78)Function F(chon:char;x:real):real; begin
Case chon of '1': F:=Sin(x); '2': F:=Cos(x); '3': F:=Arctan(x); end;
end;
Procedure Dothi(a,b:real;x1,y1,x2,y2:integer;mn,md:integer); var fx,k,h,r,c,d:real;
x,y,n,m,i:integer; begin
c:=f(chon,a); d:=f(chon,a); r:=a; h:=(b-a)/1000;
while r <= b
begin
fx:=f(chon,r);
if c>fx then c:=fx; if d<fx then d:=fx; r:=r+h;
end;
Setcolor(md);Setbkcolor(mn); n:=x2-x1;
h:=(b-a)/n; m:=y2-y1; k:=(d-c)/m;
for i:=0 to n begin
x:=x1+i;
fx:=f(chon,a+i*h); y:=round((fx-c)/k)+y1; y:=y2-y+y1;
if i=0 then moveto(x,y)
else lineto(x,y);
end; end;
Begin (* Chương trỡnh chớnh *) Clrscr;
Chonham; mh:=detect;
(79)Initgraph(mh,mode,'u:\bgi');
Setviewport(GetmaxX DIV 2,GetmaxY DIV 2,GetmaxX,GetmaxY,ClipOff); Line(-(GetmaxX DIV 2),0,GetmaxX DIV 2,0);
Line(0,-(GetmaxY DIV 2),0,GetmaxY DIV 2); SetTextJustify(CenterText,CenterText);
OutTextXY(-GetmaxX DIV 4,-GetmaxX DIV 4,chugiai); SetColor(Red);
OutTextXY(GetmaxX DIV 2- 32,2,'Truc x >'); OutTextXY(27,-(GetmaxY DIV 2-5),'^ Truc y'); OutTextXY(0,0,'0,0');
Dothi(-4*pi,4*pi,-(getmaxx div 2)+100,-(getmaxy div 2)+100,getmaxx div -100, Getmaxy div - 100,magenta,yellow);
Readln; Closegraph; End
(80)BÀI ĐỌC THÊM
TÓM TẮT CÁC CÚ PHÁP TRONG NGÔN NGỮ PASCAL
Niklaus Writh, cha đẻ ngôn ngữ Pascal, đề xuất việc xây dựng sơ đồ mơ tả tóm tắt cú pháp ngơn ngữ lập trình Pascal Sơ đồ cú pháp (syntax diagram) giúp ta nắm đợc dạng thức yếu tố cấu trúc chơng trình Một số phần tử sơ đồ có ý nghĩa sau:
ở sơ đồ tên (danh hiệu) phải bắt đầu chữ cái, sau có nhiều chữ, nhiều số gạch dới
ở sơ đồ biến, biến biến có số hay khơng có số Mọi biến nhận diện qua tên đợc đặt theo qui tắc đặt tên, có số số có dạng biểu thức, cách dấu phẩy ',' tất số đợc đặt dấu ngoặc vuông '[' ']'
I SƠ ĐỒ CẤU TRÚC CĂN BẢN
(81)(82)(83)(84) KHÁI NIỆM VỀ ĐỒ HỌA KHỞI ĐỘNG CHẾ ĐỘ ĐỒ HỌA. LỔI ĐỒ HỌA. MỘT SỐ HÀM VÀ THỦ TỤC CHUẨN TRONG UNIT GRAPH. Màu mẩu(kiểu). Điểm, kiểu đường thẳng, đường thẳng Cỏc hỡnh khụng tụ Cỏc hỡnh cú tụ. Xử lý chuỗi ký tự trờn hỡnh đồ họa. Cửa sổ chế độ đồ họa. Đóng chế độ đồ họa. MỘT VÀI VÍ DỤ MINH HỌA. TO