1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lap trinh Pascal

84 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

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

Ngày đăng: 26/05/2021, 08:58

TỪ KHÓA LIÊN QUAN

w