1. Trang chủ
  2. » Giáo án - Bài giảng

Lý thuyết Turbo Pascal

110 536 5
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Lý thuyết turbo pascal
Tác giả Hoàng Đức Hà
Trường học Trường Đại Học Dân Lập Đông Đô
Chuyên ngành Tin học
Thể loại Giáo trình
Năm xuất bản 2005
Thành phố Hà Nội
Định dạng
Số trang 110
Dung lượng 460 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Một chơng trình Pascal thờng có các khai báo dữ liệu sau : Const * Khai báo hằng * … Type * Khai báo kiểu dữ liệu mới * … Var {Khai báo các biến} Phần khai báo có thể có hoặc không, tuỳ

Trang 1

Phần lý thuyết

1 Nguồn gốc

Pascal là một trong các ngôn ngữ lập trình cấp cao đợc giáo s Niklaus Wirth ở trờng kĩ thuật Zurich(Thụy Sĩ ) thiết kế và công bố vào năm 1971 Ông đặt tên cho ngôn ngữ này là Pascal để tởng nhớ đếnBlaise Pascal, nhà toán học, triết học nổi tiếng của Pháp ở thế kỉ XVII, ngời đã sáng chế ra máy tính cơkhí đầu tiên cho nhân loại

Ngày nay, Pascal là một trong những ngôn ngữ lập trình bậc cao u việt nhất trong lĩnh vực giảng dạy

và lập trình chuyên nghiệp

2 Tính chất cơ bản:

a) Pascal là một ngôn ngữ có định kiểu rõ ràng :

_ Mọi biến và hằng của kiểu dữ liệu nào chỉ đợc gán các giá trị của đúng kiểu dữ liệu đó, không đợc

tự do đem gán cho các giá trị của kiểu dữ liệu khác

_ Việc định kiểu một cách chặt chẽ nh vậy khiến cho ngời lập trình luôn luôn phải có các biểu thứctơng thích với nhau về kiểu dữ liệu

b) Pascal là một ngôn ngữ thể hiện t duy lập trình có cấu trúc :

_ Dữ liệu đợc cấu trúc hóa : từ dữ liệu đơn giản hoặc có cấu trúc đơn giản ngời lập trình có thể xâydựng các dữ liệu có cấu trúc phức tạp hơn

_ Mệnh lệnh đợc cấu trúc hóa : từ các lệnh chuẩn đã có, ngời lập trình có thể nhóm chúng lại vớinhau và đặt giữa hai từ khóa Begin và End khiến chúng trở thành một ngôn ngữ phức tạp hơn gọi là lệnhhợp thành hay lệnh ghép

_ Chơng trình đợc cấu trúc hóa : một chơng trình có thể chia thành các chơng trình con tổ chức theohình cây phân cấp Mổi chơng trình con nhằm giải quyết một nhiệm vụ xác định cụ thể, điều này giúpcho ngời lập trình có thể giải quyết từng phần một, từng khối một và có thể cho nhiều ng ời tham gia lậptrình, mỗi ngời phụ trách một vài khối

_ Từ khóa chung : Program, Begin, End, Procedure, Function …

_ Từ khóa để khai báo : Const, Var, Type, Array, String, Record …

_ Từ khóa của lệnh lựa chọn : If … Then … Else, Case … Of

_ Từ khóa của của lệnh lặp : For … To … Do, While … Do

_ Từ khóa điều khiển : With, Goto, Exit

_ Từ khoá toán tử : And, Or, Not, In, Div, Mod

c) Tên chuẩn :

Trong Pascal có các tên chuẩn sau đây :

Boolean, Char, Integer, Word, Byte, Real, Text

False, True, Maxint

Trang 2

Abs, Arctan, Chr, Cos, Sin, Eof, Eoln

Exp, Ln, Odd, Ord

Round, Trunc, Sqr, Sqrt, Pred, Succ

Dispose, New, Get, Put, Read, Readln

Cho biết tên của chơng trình

Ví dụ : Program Ve_hinh ;

Phần này luôn đợc bắt đầu bằng từ khóa Program và chấm dứt bằng dấu " ; "

Trang 3

Phần tiêu đề có thể không có cũng đợc.

b) Phần khai báo dữ liệu:

Khai báo một biến là xác định rõ xem biến đó thuộc kiểu dữ liệu nào Một chơng trình Pascal thờng có các

khai báo dữ liệu sau :

Const (* Khai báo hằng *)

Type (* Khai báo kiểu dữ liệu mới *)

Var {Khai báo các biến}

Phần khai báo có thể có hoặc không, tuỳ theo nhu cầu

Ví dụ : Chơng trình trên có các kiểu biến là a, x Chúng thuộc kiểu dữ liệu Integer, tức là số nguyên

c) Phần khai báo chơng trình con:

Phần này mô tả một nhóm lệnh đợc đặt tên chung là một chơng trình con để khi thân chơng trìnhchính gọi đến thì cả một nhóm lệnh nào đó đợc thi hành

e) Dấu chấm phẩy:

Dấu chấm phẩy (;) đợc dùng để ngăn cách câu lệnh của Pascal và không thể thiếu đợc

f) Lời giải thích:

Các lời giải thích đợc đặt giữa hai kí hiệu : {} hoặc (* *)

Phần giải thích này là phần trao đổi thông tin giữa ngời với ngời, máy sẽ bỏ qua

Ví dụ :

Var X : Integer ; (* Số hình vuông phải vẽ *)

Trang 4

Chúng ta có thể định nghĩa dữ liệu (Data) là tất cả những gì đợc máy tính xử lý Các loại dữ liệu cầntới máy tính xử lý có rất nhiều, tồn tại dới nhiều dạng khác nhau về bản chất, về ý nghĩa, không riênggì về số liệu mà còn là các kí tự, các mệnh đề logic, thể hiện qua các đối tợng cụ thể cần xử lý nh tiền l-

ơng, địa chỉ, tên tuổi, văn bản, tín hiệu Song nếu xét về phơng diện điện tử thì máy tính chỉ hiểu cácthông tin đợc biểu diễn dới dạng mã nhị phân.Về phơng diện ngôn ngữ bậc cao thì dữ liệu đã đợc kháiquát hóa với các kiểu dữ liệu Khi này, ta không cần quan tâm đến biểu diễn chi tiết trong máy tính củacác kiểu dữ liệu

Một kiểu dữ liệu (Data Type) đợc định nghĩa với 2 điểm chính :

_ Một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận đợc

_ Trên đó xác định một phép toán

Cần nhớ rằng một biến phải gắn liền với một kiểu dữ liệu và chỉ một mà thôi Trong ngôn ngữPascal, kiểu dữ liệu có thể rất phức tạp nhng nói chung đều đợc định nghĩa ra từ các kiểu đơn giản nhất,không có cấu trúc

Kiểu vô hớng (Scalar Type) hay kiểu đơn giản (Simple Type) là kiểu dữ liệu gồm một tập cácgiá trị của nó đợc sắp xếp theo một thứ tự tuyến tính Chúng ta sẽ nghiên cứu kĩ hơn về kiểu vô hớng vàcác kiểu dữ liệu phức tạp khác Trong phần tiếp theo, sẽ nói về 5 kiểu dữ liệu vô hớng đơn giản nhất, đã

đợc định nghĩa sẵn và còn đợc gọi là kiểu đơn giản chuẩn (Simple Standar Type)

_ Trớc khi đi vào nghiên cứu các kiểu số nguyên và kiểu số thực quen biết, chúng ta hãy xét khái niệmkiểu Logic ( Boolean ) Trong thực tế chúng ta thờng hay gặp loại đại lợng chỉ có hai giá trị : Đúng hoặcSai Ví dụ một mệnh đề, một câu hỏi, một phép toán có thể đợc xem xét xem đúng hay sai Ví dụ khi taviết 3 < 1 thì đây là một mệnh đề có giá trị là Sai

_ Theo định nghĩa, một giá trị thuộc kiểu logic Boolean là một đại lợng nhận một trong hai giá trị Logic:TRUE (đúng) hoặc FALSE (sai) True và False là tên các giá trị đã đợc định nghĩa sẵn Kiểu Boolean cũng

đã định nghĩa sẵn quan hệ thứ tự False < True

_ Các phép toán sau có thể áp dụng cho các giá trị Boolean và cho ta kết quả cũng là kiểu Boolean

+ Phép And ( phép "và" logic )

+ Phép Or ( phép "hoặc" logic )

+ Phép Not ( phép "đảo" hay "phủ định" logic )

+ Phép Xor ( phép "hoặc triệt tiêu" )

Ví dụ1 : False And True = False

Not False = True

_ Chúng ta có thể tóm tắt quy tắc thực hiện phép And và Or nh sau :

+ Phép And chỉ cho kết quả là True khi và chỉ khi hai toán hạng đều là True

+ Phép Or chỉ cho kết quả là False khi và chỉ khi hai toán hạng đều là False

+ Phép Xor luôn luôn cho kết quả là True khi hai toán hạng khác nhau Còn nếu hai toán hạng giốngnhau, Xor sẽ cho kết quả là False

* Hai vế của biểu thức so sánh phải cùng kiểu nhau ( trừ kiểu thực và nguyên ) và chúng có thể là cáckiểu Real, Integer, Char, Boolean, Vô hớng do ngời sử dụng định nghĩa (sẽ học sau )

Ví dụ 2 :

3 < 5 cho ta giá trị True

False < True cho ta giá trị True

3.5 > 10 cho ta giá trị False

Trang 5

Cách viết 3 < True là không chấp nhận đợc vì hai vế của biểu thức không cùng kiểu cho phép : 3 thuộckiểu số nguyên, True thuộc kiểu Boolean

Kiểu số nguyên đã đợc máy định nghĩa sẵn với từ khóa INTEGER

Một giá trị kiểu số nguyên là một phần tử của tập các số nguyên mà ta có thể biểu diễn đ ợc trênmáy, nghĩa là nó là một tập nhỏ của không gian các số nguyên chứ không phải tất cả mọi số nguyên đều

có thể xử lý trên máy tính đợc Thông thờng nhất, các số nguyên đợc biểu diễn bằng hai byte (16 bit)nên phạm vi của nó là từ -32768 đến + 32767

Các số nguyên đợc viết ra bằng các dãy chữ số 0, 1, 2, 9 với chữ số đầu có thể là dấu dơng + hoặcdấu âm -, hoặc không có dấu

Ví dụ : +234, -32767, -1, 23

Maxint là tên giá trị cực đại cho phép của kiểu nguyên, tức là Maxint = + 32767

a) Các phép tính số học đối với số nguyên:

_ Phép cộng và trừ : với kí hiệu là + và - nh thờng lệ

_ Phép nhân : đợc kí hiệu bằng dấu *

_ Phép chia : đợc kí hiệu bằng dấu /

_ Phép chia lấy phần nguyên đợc thực hiện với từ khóa Div

Ví du : 14 Div 4 cho giá trị bằng 3

_ Phép chia lấy số d của 2 số nguyên, còn gọi là Modun, đợc thực hiện với từ khóa Mod

Ví du : 14 Mod 4 cho giá trị bằng 2

_ Hàm Boolean Odd(n) cho giá trị True nếu n là một số lẻ, False nếu n là số chẳn

* Khi thực hiện các phép tính số học đối với số nguyên, cần hết sức thận trọng xem các phép toán

đó có cho kết quả vợt ra khỏi phạm vi biểu diễn số nguyên của máy không

Ví dụ : 32000 + 800 - 2000 = 29200

song máy tính sẽ xử lý sai vì lúc làm phép cộng giữa 32000 với 800 đã cho ra kết quả trung gian là

32800, vợt quá giới hạn 32767 của máy Máy có thể phát hiện và báo lỗi trờng hợp quá giới hạnnày

b) Các phép tính quan hệ đối với số nguyên:

Các số nguyên có thể so sánh với nhau và với số thực qua các phép toán quan hệ nh đã nói ởmục trớc Kết quả của phép toán quan hệ là kiểu Boolean tức là có giá trị True (Đúng) hoặc False(Sai)

Ví dụ : Biểu thức 3 < 5 cho ta giá trị True

c) Mô tả số nguyên với Byte, Word, LongInt, ShortInt :

Bên cạnh cách biểu diễn số nguyên nh ở trên (biểu diễn bằng 2 byte), Pascal còn có thêm một kiểu

đơn giản chuẩn làkiểu biểu diễn số nguyên bằng một byte Phạm vi biểu diễn số nguyên khi này là từ 0

đến 255 và đợc gọi là kiểu Byte

Ngoài ra, Turbo Pascal từ Version 4.0 trở đi và một số Pascal khác đã đa thêm vào các định nghĩakiểu số nguyên mới với các từ khoá Word, ShortInt (Short Integer), LongInt (Long Integer)

Kiểu Phạm vi biểu diễn Kích thớc (byte)

Trang 6

1 Kiểu số thực (Real):

Tơng tự nh định nghĩa kiểu số nguyên, kiểu số thực là tập hợp các số thực có thể biểu diễn đợc trongmáy tính và đợc máy định nghĩa sẵn với từ khóa REAL

Các phép toán cộng (+), trừ (-), nhân(*), chia (/) cũng nh các phép toán quan hệ (=, < >, <, >, > =,

<=) đều có thể áp dụng cho các toán hạng là số thực lẫn toán hạng là số nguyên

* L u y : không tồn tại các phép toán Div, Mod cho kiểu số thực

Trong máy tính, các số thực đợc biểu diễn và đợc viết dới 2 dạng : dạng bình thờng và dạng có phần

2. 2.Mở rộng việc mô tả và khai báo số thực :

Kiểu Phạm vi biểu diễn Kích thớc (byte)

Các hàm sau đây đợc định nghĩa sẵn và đợc sử dụng với đối số là các số thực hoặc các số nguyên :

+ Abs(x) : cho ta giá trị tuyệt đối của toán hạng x : | x | Kiểu kết quả cùng kiểu với đối số, nghĩa lànếu x là thực thì Abs(x) cũng là số thực, nếu x là số nguyên thì Abs(x) cũng là số nguyên

+ Sqr(x) : Cho giá trị bình phơng của x Kiểu kết quả cùng kiểu với đối số x

+ Các hàm sau áp dụng cho đối số nguyên hoặc thực nhng kết quả thì luôn luôn là kiểu thực :

- Sin(x), Cos(x), Arctan(x) : là các hàm lợng giác bình thờng

- Sqrt(x) : tính căn bậc hai của x

- Succ(x) : đối số nguyên n, cho số nguyên tiếp theo n, tức là n + 1

- Pred(x) : đối số nguyên n, cho số nguyên trớc n, tức là n - 1

- Odd(n) : đối số nguyên n, True nếu n lẻ, False nếu n chẵn

Việc chuyển một số thực sang số nguyên đợc thực hiện bởi 2 hàm chuẩn : hàm làm tròn và hàm cắt :

+ Hàm cắt Trunc(x) cho ta một số nguyên là phần nguyên của x, tức là cắt bỏ đi phần lẻ thập phâncủa x.Ví dụ : Trunc (3.146) = 3

+ Hàm làm tròn Round(x) cho ta một số nguyên của x bằng cách qui tròn phần lẻ thập phân của x.Nói cách khác, Round(x) cho ta số nguyên gần với x nhất Ví dụ : Round (56.678) = 57

Chúng ta có thể viết định nghĩa của Round qua Trunc nh sau :

+ Nếu x >= 0 thì Round(x) = Trunc(x + 0.5)

Trang 7

+ Nếu x < 0 thì Round(x) = Trunc(x - 0.5)

Máy tính điện tử không chỉ có khả năng xử lý các dữ liệu bằng số nguyên, số thực mà nó còn cókhả năng xử lý các dữ liệu kiểu kí tự nh khi ta soạn thảo văn bản, quản lý hồ sơ

Các kí tự là tất cả các chữ viết mà ta thờng dùng nh các chữ cái a, b, c , các chữ số từ 0 đến 9, cácdấu phân đoạn nh ;, !, Kiểu kí tự đợc định nghĩa trong Pascal với từ khóa Char

Một giá trị kiểu kí tự là một phần tử của một tập hữu hạn các kí tự đợc sắp xếp có thứ tự Tất cả cácmáy tính đều dùng tập kí tự nh vậy để trao đổi thông tin qua các thiết bị vào ra Có nhiều cách sắp xếp

bộ chữ khác nhau và không tồn tại bộ chữ chuẩn cho tất cả các máy tính

Tuy vậy một bộ mã các kí tự đợc dùng rất phổ biến để trao đổi các thông tin giữa các thiết bị nhất

là trên máy vi tính, đó là bộ mã kí tự ASCII (xem ở phần Phụ lục)

Trong bảng mã ASCII, các kí tự từ 0 đến 31 là các kí tự điều khiển, không in ra đợc, dùng để điềukhiển các thiết bị ngoại vi, điều khiển các thủ tục trao đổi thông tin Ví dụ khi thiết bị nhận kí tự số 7(Bel), máy sẽ ra một tiếng chuông Kí tự số 27 (Esc) cũng thờng dùng để thoát khỏi các tình huống, đểnhận biết các mã đặc biệt khác nh điều khiển máy in bằng dãy kí tự bắt đầu là Esc

Phần còn lại trong bảng mã ACSII bố trí toàn bộ các chữ cái A, B, C , các chữ số từ 0 đến 9, cácdấu chấm câu, các kí tự đặc biệt Ví dụ khi nhận kí tự số 50 máy sẽ hiện lên màn hình chữ số 2

Riêng kí tự 127 (Del) lại đợc dùng làm kí tự điều khiển xóa Nếu bạn dùng Editor , phím Del trênmàn hình chính là phím tạo ra mã số 127 để xóa một kí tự trên màn hình

Có 2 hàm chuẩn là Ord và Chr cho phép thiết lập tơng quan giữa bộ mã kí tự và một tập con các số

* Các hằng giữ nguyên giá trị của nó trong suốt chơng trình

2 Khai báo biến:

Trang 8

Biến (variance) là đại lợng có thể thay đổi giá trị Tên biến của chơng trình là tên của ô nhớ cất giữ dữ liệu.Khác với hằng, biến có thể thay đổi đựoc giá trị của nó Các biến đợc khai báo bằng cách đặt tên các biến vàophần khai báo biến ở đầu chơng trình, sau từ khóa Var

Cách viết : Tên_biến : Kiểu_dữ_liệu_của_biến ;

Dấu hai chấm bắt buộc phải có để ngăn cách hai phần của khai báo biến Dấu chấm phẩy kết thúc mộtdòng khai báo

Nhiều biến có cùng kiểu có thể đựoc khai báo với nhau bằng cách viết tên các biến đặt cách nhau qua dấuphẩy (,) nh các biến M23, A25, AAA ở ví dụ dới đây :

Color = (Red, Blue, Green)

Thu = (ChuNhat, ThuHai, ThuBa, ThuTu, ThuNam, ThuSau, ThuBay) ;

Và khi đã khai báo kiểu thì ta có quyền sủ dụng để khai báo biến

Trang 9

báo của chơng trình sau từ khóa Type Sau đó sẽ khai báo các biến thuộc kiểu dữ liệu mới mô tả Chúng ta sẽdần dần tìm hiểu sau này

Color = (Red, Blue, Green)

Thu = (ChuNhat, ThuHai, ThuBa, ThuTu, ThuNam, ThuSau, ThuBay) ;

Và khi đã khai báo kiểu thì ta có quyền sủ dụng để khai báo biến

Ví du: 3 + PI * Sin ( x) ;

Trong ví dụ này, các toán tử (các phép toán) la phép cộng (+) và phép nhân (*) Các toán hạng là hằng số 3

và PI, là hàm Sin với đối số là biến X

* Biểu thức số học là biểu thức có giá trị bằng số (là Integer, Byte, Real)

* Biểu thức logic Bun ( Boolean ) là biểu thức có giá trị là True hoặc False

* Một biểu thức chứa các toán tử quan hệ ( <>, <, >, <=, >=, = ) đựoc gọi là một biểu thức Boolean đơn giảnhay một biểu thức quan hệ Các toán hạng trong biểu thức quan hệ có thể là các số nguyên, số thực, kí tự vàchúng phải tơng thích nhau về kiểu

Ví dụ minh họa về trình tự tính toán :

7 + 3 * 5 = 7 + ( 3 * 5 ) = 22

5 / 2 * 3 = ( 5 / 2 ) * 3 = 7.5

18 Div 4 * 4 = ( 18 Div 4 ) * 4 = 16

2 * ( 3 + 5 ) = 2 * 8 = 16

Ví du: Để giải phơng trình bậc hai ta có thể phát biểu điều kiện về các hệ số A, B, C nh sau :

Nếu ( (A = 0) And (B = 0) And (C = 0) ) = True

thì bài toán không có lời giải

Trang 10

hoặc có thể viết gọn hơn :

Nếu (A = 0) And (B = 0) And (C = 0)

thì bài toán không có lời giải

1 Câu lệnh ( Instruction, Statement ):

Bên cạnh phần mô tả dữ liệu là phần là phấn lệnh (intruction) của chơng trình Phần này xác định các côngviệc mà chơng trình phảo thực hiện để xử lý các dữ liệu đã đợc mô tả và khai báo Các câu lệnh cách nhaubằng dấu chấm phẩy Câu lệnh chia ra hai loại :

_ Câu lệnh đơn giản : là những câu lệnh không chứa các lệnh khác Đó là phép gán, lời gọi chơng trình conloại Procedure ( thủ tục ) bao hàm rất nhiều quá trình xử lý khác nhau nh :

+ Vào dữ liệu : Read, Readln

+ Ra dữ liệu : Write, Writeln

+ Xử lý tập tin : Reset, Rewrite, Assign

_ Câu lệnh có cấu trúc : là khối lệnh, lệnh thử và rẽ nhánh, lệnh lặp

Lệnh hợp thành hay lệnh ghép bao gồm nhiều lệnh đơn giản và có khi có cả lệnh ghép bên trong Các lệnhnày đợc thực hiện theo thứ tự nh đã viết trong lệnh ghép Nó bắt đầu bằng từ Begin và kết thúc bằng từ End Mỗi một câu lệnh của Pascal bao giờ cũng đợc đặt cách nhau bằng dấu chấm phẩy (;) Dấu chấm phẩy chỉ

có tác dụng ngăn cách các câu lệnh chứ không phải là dấu kết thúc câu lệnh và nó không phụ thuộc vào câulệnh.Pascal không bắt buộc viết mỗi câu lệnh một dòng Vấn đề là chúng ta phải trình bày chơng trình sau cho

đẹp, rõ ràng, thể hiện đợc thuật toán

Ví dụ : chúng ta có thể viết liền nhau trên một dòng chơng trình :

X := 6 ; (* có nghĩa là biến X nhận giá trị bằng 6 *)

Y := True ; (* có nghĩa là biến Y nhận giá trị True *)

X := X + 3 ; (* có nghĩa là giá trị của X sẽ bằng giá trị của X cộng với 3 Ví dụ nếu lúc đầu X có giá

trị là 6 thì sau khi thực hiện câu lệnh này, X sẽ có giá trị là 9 Xin bạn nhớ lại cho X chỉ

là tên của một ô nhớ X + 3 đựoc hiểu là lấy nội dung của ô nhớ X đem cộng với 3, sau

đó lại để vào ô nhớ X *)

Trang 11

* Tính tơng thích của các kiểu dữ liệu

Nguyên tắc chung khi dùng phép gán thì kiểu của biến và kiểu của biểu thức ở vế phải phải giống nhau

Ví dụ : Một biến nguyên I không thể nhận một giá trị kí tự đợc

I := 'A' ; là điều không thể chấp nhận đợc

* Ngoại lệ :

Tuy một biến nguyên không thể nhận giá trị là một số thực nhng một số thực thì lại có thể nhận một giá trịnguyên

X := 6.0 ; là sai vì X là biến Integer, 6.0 là giá trị thực

M23 := 6 ; là đúng vì M23 là biến thực, nó có thể nhận trực tiếp giá trị nguyên M23 sẽ chứa số 6 d ới

Màn hình là một thiết bị ra thông dụng nhất hiện nay Để viết dữ liệu ra màn hình, Pascal có 3 mẫuviết nh sau :

Write ( Item1, Item2, , ItemN ) ;Writeln ( Item1, Item2, , ItemN ) ; (* Write Line *)

Writeln ;

Trong đó, ( Item1, Item2, , ItemN ) ; (* Write Line *) là các mục cần viết ra có thể là một hoặcnhững loại sau :

_ Biến Write ( A ) ;_ Hàm Write ( Sin(x) ) ;_ Biểu thức Write ( A * A + B - 2 + Cos(x) ) ;_ Hằng Writeln ( Pi ) ;

_ Các giá trị có kiểu vô hớng chuẩn : Writeln ( Pi ) ;

Trang 12

_ Một số kiểu có cấu trúc nh mảng, xâu kí tự.

Cả 3 mẫu viết trên đều bắt đầu viết từ vị trí hiện tại của con trỏ màn hình Tuy nhiên, sự khác nhau của

3 mẫu lệnh trên là vị trí của con trỏ màn hình sau khi kết thúc lệnh

Trong mẫu viết Write ( Item1, Item2, , ItemN ) ; sau khi viết ra các giá của Item1, Item2, , ItemNtrên cùng một dòng màn hính, con trỏ sẽ xuống đầu dòng tiếp theo

Còn thủ tục Writeln ( Item1, Item2, , ItemN ) ; sau khi viết ra các giá trị của Item1, Item2, ,ItemN, con trỏ sẽ không chuyển xuống đầu dòng tiếp theo mà đợc đặt ở vị trí sau giá trị của ItemN

Thủ tục Writeln ; ( không có tham số ) sẽ chỉ làm một động tác đơn giản là đặt con trỏ xuống đầudòng tiếp theo

sẽ viết ra màn hình :

12345678

123-25671

* Viết ra kiểu số thực :

Trang 13

Writeln ( 73.123456789 : 12 : 6 ) ;Writeln ( R : 12 : 6 ) ;

Writeln ( 3.14 : 12 : 6 ) ;

sẽ viết ra màn hình :

73.123456 _123.456000 (* 12 chỗ cho cả số *) _3.140000 (* 6 chỗ cho phần thập phân *)

Bạn cần lu ý rằng lệnh Write và Writeln có thể viết ra kiểu Boolean :

Var

OK : Boolean ;BEGIN

OK := 3 < 5 ; Write ( OK : 7 ) ;END

Kết quả cho ra :

_TRUE

Phép gán(:=) là lệnh cơ bản, đơn giản nhất để gán giá trị cho một biến ỡ trong ch ơng trình Tuy nhiên đểgán giá trị cho một biến thông qua thiết bị vào(bàn phím), ta phải dùng thủ tục Read và Readln(Read Line) vớicác tham số ở trong ngoặc đơn là các biến(chỉ có thể là các biến mà thôi, không giống nh các tham số của thủtục Write và Writeln)

Read(Biến1, Biến2, , biếnN) ;Readln(Biến1, Biến2, , biếnN) ;

và Readln ; (* không có tham số *)

Khi này ta sẽ gõ vào bàn phím giá trị của biến cần đọc và phải ấn thêm nút Enter là nút đặc biệt trên bànphím có ý nghĩa là " chấm xuống dòng " hoặc còn đợc gọi là nút Return để báo cho máy thực hiện thủ tụcRead và Readln

Các cụm dữ liệu gõ vào bàn phím tơng ứng với Biến1, Biến2, , BiếnN đợc ngăn cách nhau với các dấucách với số lợng dấu cách không quan trọng(song ít nhất là cách một lần)

Trang 14

Ví dụ :

Var

X, Y : Integer ;

A, B : Real ;BEGIN Readln(X, Y, A, B) ;

Giữa các con số là các dấu cách đợc dùng để ngăn cách các số liệu khi đọc,

Trong khi đọc, thủ tục Read và Readln còn kiểm tra xem các dữ liệu gõ vào có tơng thích với kiểu dữ liệucủa biến khi khai báo hay không, nếu không máy sẽ báo lỗi

Thủ tục Readln ; là thủ tục không có tham số, máy tính chờ và chỉ chờ ta ấn phím Enter Readln khôngtham số đợc sử dụng khi bạn muốn chơng trình dừng lại ở một chỗ nào đó(ví dụ để kiểm tra hoạt động của ch-

ơng trình) cho đến khi bạn ấn phím Enter

Xét ví dụ sau :

Var

I : Integer ;BEGIN

I := 1* 2 * 3 * 4 * 5 ; Writeln(I) ;

END

Bạn muốn xem kết quả của phép tính trên ! Dù bạn có ấn Ctrl_F9 từ giờ cho tới sáng cũng không thể thựchiện đợc điều đó Vì kết quả của chơng trình hiện ra và biến đi rất nhanh nên " mắt thờng " của bạn không thểnào thấy đợc Tuy nhiên nếu ta chèn thêm dòng lệnh “Readln ;” vào sau “Writeln(I) ;” thì mọi chuyện sẽ đổikhác !

Hai mẫu câu lệnh nh sau :

IF <Bieu_thuc_Boolean> THEN <viec_1> ;

Trang 15

IF <Bieu_thuc_Boolean> THEN <viec_1> ELSE <viec_2> ;

Theo lệnh này, nếu <Bieu_thuc_Boolean> nhận giá trị True thì máy sẽ thực hiện <viec_1>, còn nếukhông thì hoặc kết thúc ( tức không làm gì cả ) đối với mẫu câu thứ nhất, hoặc máy sẽ đi thực hiện lệnh kháctức là <viec_2> trong mẫu câu lệnh thứ 2 Nh vậy mẫu thứ nhất thực ra là mẫu thứ hai thu gọn với <viec_2>

là rỗng

Ví dụ1 : để thực hiện phép chia hai số a, b với điều kiện b < > 0, ta viết :

If b < > 0 Then t := a / b Else Writeln (' Mẫu số bằng 0 ! Không chia đợc ! ') ;

Ví dụ 2 : tìm giá trị min và max của hai số a, b

If a < b Then Begin

Max := b ; Min := a ;End

Else Begin Max := a ; Min := b ;End ;

Chú y : trớc Else không bao giờ có dấu chấm phẩy

Trong ví dụ này, ta thấy luôn vai trò của lệnh hợp thành ( lệnh ghép ) Giả sử ta viết một lệnh nh sau :

If a < b ThenBegin

Max := b ; Min := a ;End ;

Nghĩa là nếu a < b ta phải thực hiện lần lợt hai lệnh là Max := b và Min := a ( đợc đặt giữa Begin

và End ) Nếu không có Begin và End nh sau :

Trang 16

If a < b Then Max := b ; Min := a ;

thì ta phải hiểu là lệnh max := b đợc thực hiện chỉ khi a < b còn lệnh min := a đợc thực hiện trong mọi ờng hợp

tr-Cũng trong ví dụ này ta thấy cách viết có cấu trúc nhô ra nhô vào để bố trí chơng trình Pascal cho đẹp vàthể hiện đơc thuật toán của chơng trình Đây là một tiêu chuẩn cần phải có cho một chơng trình viết bằngPascal Chữ Begin và End tơng ứng bao giờ cũng cùng ở một cột Tất nhiên ta có thể viết tùy ý nh sau nhngkhông đẹp:

If a < b Then Begin max := b ;

Min := a ;

End Else Begin

Max := a ;Min := b ;End ;

L

u y : cách viết lệnh If nh sau là hoàn toàn đúng :

If <Bieu_thuc_Boolean_1> Then If <Bieu_thuc_Boolean_2> Then <viec_1> Else <viec_2> ;

song rất dễ dẫn đến nhầm lẫn không biết <viec_2> tơng ứng với Else của If nào Vì vậy nên sửa lại cho

Case <Bieu_thuc> Of Case <Bieu_thuc> Of

Gia_tri_1 : <viec_1> ; Gia_tri_1 : < viec_1> ;

Gia_tri_2 : <viec_2> ; Gia_tri_2 : < viec_2> ;

Trang 17

Gia_tri_n : <viec_n> ; Gia_tri_n : <viec_n>

End ;

Trong đó <Bieu_thuc> không còn chỉ là biểu thức Boolean nh trong lệnh If …

Nó có thể là có các kiểu vô hớng đếm đợc (kể cả kiểu liệt kê, kiểu khoảng con sẽ học sau nhngkhông đợc là kiểu Real ) nên nó có thể có nhiều giá trị khác nhau Mẫu 2 sẽ thực hiện <viec_n+1> ( đợc viếtsau từ khóa Else ) nếu nh < Bieu_thuc> không rơi vào các giá trị 1, giá trị 2,… giá trị n kể trên

Cần chú ý rằng câu lệnh Case bao giờ cũng kết thúc bằng từ khóa End

Ví dụ 1: Với I là một biến nguyên

Ví dụ 2: Tính số ngày của một tháng ;

Var so_ngay, thang, nam : integer ; BEGIN

Write ('Thang : ') ; readln ( thang) ; Write ('Nam : ') ; readln ( nam) ; Case thang Of

4, 6, 9, 11 : so_ngay := 30 ;

2 : case nam of

0 : so_ngay := 29 ;

1, 2, 3 : songay := 28 ; end

Else so_ngay := 31 ; End ;

Writeln (' So ngay cua thang ', thang,' nam ', nam,' la ', so_ngay) ;END

Đến đây các bạn có thể hỏi liệu bài toán Giải phơng trình bậc 2 có thể dùng Case cho ba trờnghợp của biến Delta không ? Điều này không thể đợc vì biến Delta thuộc kiểu Real, kiểu không đếm đợc

Trang 18

Trớc hết chúng ta xét một ví dụ sau

Ví dụ1: giả sử ta phải viết ra trên màn hình các số từ 0 đến 24, mỗi số chiếm một dòng :

012

2324

Việc này có thể thực hiện bằng 25 lệnh writeln nh sau :

Writeln (0) ;Writeln (1) ;

Cụ thể hơn, vòng lặp For này đợc thực hiện từng bớc nh sau :

1 Đầu tiên I lấy giá trị 0 là giá trị ban đầu I nhỏ hơn giá trị cuôí là 24 nên lệnh Writeln ( I ) đợcthực hiện, viết ra giá trị 0

2 Sau đó, I nhận giá trị tiếp theo, tức là I := succ ( I ) = I + 1 Lúc này I = 1 và vẫn nhỏ hơn giátrị cuối là 24 nên lệnh writeln ( I ) đợc thực hiện : viết ra giá trị của I ( bằng 1 ) ra màn hình

3 Chơng trình lại quay vòng về điểm 2 cho đến khi nào I = 25, lớn hơn giá trị cuối (24) thì dừng

Mẫu viết tổng quát của ví dụ trên là :

Trang 19

For Bien_dieu_khien := Gia_tri_dau To Gia_tri_cuoi Do <viec> ;

Nếu ta muốn viết các số từ 24 đến 0 ta lại viết nh sau :

For I := 24 Downto 0 Do Writeln ( I ) ;

Với mẫu viết tổng quát nh sau :

For Bien_dieu_khien := Gia_tri_dau Downto Gia_tri_cuoi Do <viec> ;

Trong mẫu 2, máy tính sẽ làm theo chiều ngợc lại, tức là theo chiều giảm của biến điều khiển :

đầu tiên biến điều khiển nhận giá trị ban đầu và sau đó thực hiện chu kì lặp nh sau : chừng nào biến điều khiểncòn lớn hơn hoặc bằng giá trị cuối thì thực hiện <viec>, sau mỗi lần thực hiện, biến điều khiển nhận giá trị tr ớc

nó, tức là :

Bien_đieu_khien := Pred (Bien_đieu_khien) ;

Ví dụ 2: tính tổng các số nguyên từ 50 đến 500 ta viết nh sau :

Var I : integer ; Sum : real ; BEGIN Sum := 0 ; For I := 50 To 500 Do Sum := Sum + I ; (* hoặc For I := 500 Downto 50 Do Sum := Sum + I ; *) Writeln ( ' Tong = ', Sum ) ;

END

Ví dụ 3: viết hai dòng các chữ cái hoa và nhỏ từ 'A' đến 'Z' ra màn hình với quy cách mỗi chữ

chiếm 2 chỗ

USES CRT ; { đơn vị chơng trình CRT để dùng thủ tục Clrscr }Var ch : char ;

BEGIN Clrscr ; For ch := 'A' To 'Z' Do Write (ch : 2) ; Writeln ;

For ch := 'a' To 'z' Do Write (ch : 2) ; Writeln ;

Trang 20

END.

Kết quả hiện ra màn hình :

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

A b c d e f g h I j k l m n o p q r s t u v w x y z

Ví dụ 4: phép thử biến ngày có phải ngày làm việc hay không đợc viết nh sau :

Type ngay = (ChuNhat, Hai, Ba, Tu, Nam, Sau, Bay) ;Var Ngayx, ng : ngay ;

BEGIN Ngayx := nam ; For ng := 'hai' To 'bay' Do

If ngayx = ngay Then Writeln ( ' Ngay lam viec ' );

K := I + J ; Writeln (K) ; End ;

Bạn hãy tự viết kết quả hiện ra màn hình

Có hai kiểu thực hiện vòng lặp không xác định :

Repeat While <Bieu_thuc_Boolean> Do

Trang 21

Until <Bieu_thuc_Boolean> ; <viec> ;

End ;

Trong lệnh Repeat Until , máy tính sẽ thực hiện <viec> cho đến khi <Bieu_thuc_Boolean> cógiá trị True theo chu kì xác định Giữa Repeat và Until không cần dùng Begin và End Có thể ví vòng Repeat Until với câu "Tiền trảm hậu tấu"

Còn trong vòng lặp While Do máy tính sẽ lặp đi lặp lại chu kỳ sau : chừng nào

<Bieu_thuc_Boolean> có giá trị True thì đi thực hiện <viec> đợc đặt giữa Begin và End

Nh vậy sự khác nhau giữa hai loại vòng lặp trên là ở chỗ với vòng lặp Repeat, máy tính sẽ thựchiện <viec> truớc và thử điều kiện của <Bieu_thuc_Boolean> sau Còn trong vòng While, máy sẽ thử

<Bieu_thuc_Boolean> trớc rồi thực hiện <viec> sau

Cả hai vòng lặp đều có số lần lặp không xác định trớc Cần phải lu ý là trong khi thực hiện

<viec> lặp, ta phải có một lệnh làm thay đổi một biến nằm trong <Bieu_thuc_Boolean> để thay đổi giá trị biểuthức nhằm dừng vòng lặp lại vì nếu không nh vậy các vòng lặp sẽ chạy mãi không dừng

Ví dụ 1:

Tính tổng sau :

A = 1 + 1/2 + 1/3 + + 1/N

Ví dụ này hoàn toàn có thể dùng vòng lặp For song ở đây ta áp dụng vòng lặp không xác định để làm ví

dụ minh họa

Program Tinh_tong ;Var I, N : Integer ;

A : Real ; BEGIN

Writeln (' N = ') ; Readln ( N ) ;

A := 0 ;

I := 1 ; Repeat

A := A + 1/ I ;

I := I + 1 ; (* thay đổi giá trị biểu thức Boolean *) Until I > N ;

Writeln (' Tong = ', a :10 : 8 ) ; END

Hoặc viết cách khác dới dạng "đếm lùi" :

Var N : Integer ;

A : Real ;

Trang 22

BEGIN Writeln (' N = ') ; Readln ( N ) ;

A := 0 ; Repeat

A := A + 1/N

N := N - 1 ; (* thay đổi giá trị biểu thức Boolean *) Until N = 0 ;

Writeln (' Tong = ', A :10 : 8 ) ; END

Chúng ta thờng làm các vòng lặp không xác định nh sau để quay vòng theo ý muốn :

Var Traloi : Char ; BEGIN

Repeat

(* thay đổi điều kiện thủ tục *) Writeln (' Co tiep tuc nua khong ? ') ; Readln ( Traloi ) ;

Until ( Traloi = 'K' ) or ( Traloi = 'k' ) ;

Lệnh Goto thuộc loại lệnh đơn giản, cho phép chơng trình nhẩy vô điều kiện tới một vị trí trongchơng trình thông qua tên nhãn các nhãn là các số nguyên hoặc tên đợc khai báo trong phần Label của phần

Trang 23

khai báo ở đầu chơng trình, đặt cách nhau qua dấu phẩy Trong chơng trình, nhãn đợc đặt vào vị trí thích hợptheo sau là dấu hai chấm

Ví dụ1:

Program Vi_du_nhan ; Label 1, 2 ;

Var X, Y, I : Real ; BEGIN

1 : X := X + 1 ;

If X > 5 Then Goto 2 ;

2 : I := X + Y ;

If I < 3 Then Goto 1 ;

END

Tuy đợc trang bị lệnh nhảy Goto song có thể nói Pascal rất ít khi dùng hoặc tuyệt đối không nêndùng lệnh Goto vì Goto sẽ làm mất tính "cấu trúc thuật toán " của ngôn ngữ Pascal Goto chính là khuyết điểmcủa ngôn ngữ Fortran Các lệnh While , Repeat Until , If đã đủ khả năng cho phép ngời lập trình tránhdùng Goto Ngôn ngữ Fortran là loại ngôn ngữ nghèo lệnh : nó chỉ có 3 kiểu lệnh : một kiểu vòng lặp Do t ơng

tự nh vòng For của Pascal, lệnh If thì cha có cấu trúc Else và cuối cùng là Goto

Sự có mặt của Goto trong chơng trình chúng tỏ ngời lập trình cha học cách nghĩ theo Pascal nhlời của giáo s Writh, tác giả của Pascal chuẩn, đã viết

Một điều ràng buộc của lệnh Goto là không đợc dùng Goto để nhảy vào chơng trình con mặc dù

có thể từ trong chơng trình con nhảy ra ngoài

I := 1 ; While I <= N Do

Begin

A := A + 1/ I ;

I := I + 1 ; (* thay đổi giá trị biểu thức Boolean *) End ;

Vòng lặp While luôn luôn đi với cặp từ khoá Begin và End còn trong vòng lặp Repeat không cần

sử dụng cặp Begin và End

Trang 24

Ví dụ 2:

Chúng ta thờng làm các vòng lặp không xác định nh sau để quay vòng theo ý muốn :

Var Traloi : Char ; BEGIN

Repeat

(* thay đổi điều kiện thủ tục *) Writeln (' Co tiep tuc nua khong ? ') ; Readln ( Traloi ) ;

Until ( Traloi = 'K' ) or ( Traloi = 'k' ) ;

1 Khái niệm về ch ơng trình con:

Turbo Pascal là ngôn ngữ có cấu trúc cao Do đó, một chơng trình lớn có thể chia thành nhiều

ch-ơng trình con với hai mục đích :

a) Dễ kiểm tra, dề điều khiển từng phần của chơng trình

b) Tránh lặp đi lặp lại những đoạn chơng trình dùng nhiều lần Điều này vừa gây mất thời gian cho ngời lậptrình vừa làm cho chơng trình thêm lôi thôi, mất thẩm mĩ

3 Cấu trúc của Procedure và Function:

Procedure Ten_thu_tuc ( Khai báo các tham số hình thức ) ;(* Khai báo : Label, Const, Type, Var, hoặc các Procedure và Function *) ;Begin

(* Thân chơng trình con *)End ;

Function Ten_ham ( khai báo các tham số hình thức ) : kieu_du_lieu_cua_ham ;(* Khai báo : Label, Const, Type, Var, hoặc các Procedure và Function *) ;

Trang 25

Begin (* Thân chơng trình con *)End ;

Thân của chơng trình con đợc đặt giữa hai chữ Begin và End với End kết thúc bằng dấu chấmphẩy (;) chứ không phải dấu chấm (.) nh của chơng trình chính

4 Ví dụ về thủ tục và hàm:

Program Vidu ;Uses Crt ; (* Crt là một Unit chứa các chơng trình con về màn hình, bàn hình *) Var A, B, C, D : Integer ;

Z : Real ;(* - *)Procedure Tieu_de ;

Begin Writeln (' **************************************** ') ; Writeln (' * MINH HOA CHUONG TRINH CON * ') ; Writeln (' **************************************** ') ;End ;

(* - *)Procedure Enter (Var X, Y : Integer ) ;

Var OK : Char ;Begin

Repeat Write (' Tu so = ') ; Readln (X) ; Write (' Mau so = ') ; Readln (Y) ;

Write (' Co sua so lieu khong (c, k) ? ') ;

OK := Readkey ; Writeln ;

Until (OK = ' K ') or (OK = ' k ') ;End ;

(* - *)Function Chia (X, Y : Integer) : Real ;

Begin

If Y <> 0 Then Chia := X / Y Else

Trang 26

Begin Writeln (#7,' Khong chia duoc cho 0.') ; (* Máy sẽ báo lỗi nếu mẫu số là 0 *) Halt ; (* Thu tuc Halt dung chuong trinh lai *) End ;

End ;(* - *)BEGIN

Tieu_de ; Enter (A, B) ; Enter (C, D) ;

Z := Chia (A, B) * Chia (C, D) ; Writeln (' Ti so (A / B) * (C / D) la : ', Z) ; Writeln (' Hay an Enter de ket thuc ! ') ; Readln ;

END

Chơng trình này sẽ đọc từng cặp số nguyên A, B và C, D, sau đó đọc tỉ số của 2 số đó quaFunction Chia và cuối cùng là tính tích của 2 tỉ số đó rồi báo ra kết quả Nh vậy, nhìn vào thân chơng trìnhchính ta thấy công việc đợc hình dung ra một cách rất sáng sủa

Đầu tiên, chơng trình con (CTC) Tieu_de có nhiệm vụ in ra vài dòng tiêu đề, CTC này không cầntham số

Procedure Enter có nhiệm vụ là vào dữ liệu X, Y, là hai tham số hình thức, cũng đồng thời là kếtquả của Procedure Hai tham số này sẽ đợc thay thế bằng hai tham số thực sự đợc khai báo ở chơng trình chính

là A và B khi ta gọi Procedure bằng câu lệnh Enter (A, B), tức là A sẽ tơng ứng với X và B sẽ tơng ứng với Y.Lời gọi Enter (A, B) đợc hiểu là đọc vào hai tham số A và B Tơng tự nh vậy, lần gọi thứ hai Enter (C, D) sẽ

đọc hai giá trị của hai tham số thực sự là C và D

Trong CTC, ta cũng có thể có phần khai báo riêng của nó Trong ví dụ trên, biến OK là biến riênghay còn thờng đợc gọi là biến địa phơng của Procedure Enter để phân biệt với các biến toàn cục đợc mô tả ởchơng trình chính là A, B, Z

Function Chia có hai tham số hình thức là X và Y Ta có thể viết lời gọi Function trong biểu thức

nh việc tính Z ở ví dụ trên Lời gọi của Procedure không làm đơc nh vậy vì tên của Procedure không có giá trị.Khi khai báo Function, ta còn phải khai báo thêm kiểu dữ liệu của Function Trong ví dụ trên, Function Chia

có kiểu là Real, đó cũng là sự khác nhau giữa hai loại CTC

Giả sử, để tính giá trị của Z = (A / B) / (C / D), ta có thể viết :

Z := Chia (Chia(A, B), Chia(C, D)) ;

Trang 27

Chơng trình con có thể đợc khai báo mà không dùng tham số khi các CTC tính toán trực tiếp vớicác biến toàn cục hoặc CTC không dùng đến bất cứ biến hay hằng nào nh thủ tục Tieu_de mà ta đã xét ở bàitrớc.

Việc chuyển tham số cho CTC là một cơ cấu thay thế tơng ứng, nó cho phép một quá trình đợclặp đi lặp lại nhiều lần với các "toán hạng" khác nhau Thí dụ Enter (A, B) sẽ thay thế A vào vị trí của X, Bvào vị trí của Y Tơng tự với Enter (C, D)

Chuyển tham số bằng biến : tham số hình thức trong phần tiêu đề của CTC sẽ đợc đặt sau từ khóaVar Với tham biến, các tham số thực sự sẽ phải là biến chứ không đợc là giá trị Thí dụ lời gọi Enter (3, 7) sẽkhông đợc chấp nhận vì 3 và 7 là hai giá trị chứ không phải là biến Các tham số thực sự là các tham biến cóthể đợc thay đổi trong CTC và khi ra khỏi CTC nó vẫn giữ các giá trị đã thay đổi đó Khi khai báo các tham số

mà không có từ khóa Var trong một nhóm tham số hình thức thì các tham số của nhóm này là các tham số giátrị (tham trị) Khi đó các tham số thực sự phải là một biểu thức Tham số hình thức tơng ứng sẽ đợc coi nh mộtbiến địa phơng của CTC, nó nhận giá trị của tham số thực nh là giá trị ban đầu ở vào thời điểm thay vào CTC.Chơng trình con sau đó có thể thay đổi giá trị của các tham trị này ở bên trong CTC bằng các phép gán Songtrong mọi trờng hợp điều đó không làm thay đổi giá trị của tham số thực Do vậy, một tham trị không bao giờ

là kết quả tính toán của CTC

Sự khác nhau giữa hai loại tham số này đợc minh họa bằng ví dụ sau :

Program Tham_so ;Var A, B : Integer ;(* - *) Procedure Thidu_Thamso (X : Integer ; Var Y : Integer) ;Begin

X := X + 1 ;

Y := Y + 1 ; Writeln (X : 6, Y : 6) ;End ;

(* - *) BEGIN

A := 0 ;

B := 3 ; Thidu_Thamso (A, B) ; Writeln (A : 6, B : 6) ;END

Kết quả cho ra :

Trang 28

Trong thí dụ trên, thủ tục Thidu_Thamso có hai loại tham số : tham trị X và tham biến Y Trớckhi gọi thủ tục này với hai tham số thực sự là A và B tơng ứng thì A = 0 và B = 3 Trong thủ tục ta có hailệnh làm thay đổi giá trị của A và B bằng cách tăng thêm 1 Lệnh Writeln (X, Y) cho ra kết quả là 1 và 4 t ơngứng Tuy nhiên sau khi ra khỏi CTC, lệnh Writeln (X, Y) báo cho ta giá trị của B đã bị thay đổi trong CTC vì

B là tham biến, còn A vẫn giữ nguyên giá trị trớc khi gọi thủ tục, tức A vẫn bằng 0, vì A chỉ là tham trị

Nh vậy, khi chuyển một tham số cho CTC, nếu ta muốn bảo vệ giá trị của tham số đó khỏi bịCTC "vô tình phá" thì tham số đó phải đợc dùng nh là tham trị Còn một tham số nếu muốn dùng để lấy kếtquả do CTC đem lại thì tham số đó phải là tham biến

Chơng trình con có thể đợc khai báo mà không dùng tham số khi các CTC tính toán trực tiếp vớicác biến toàn cục hoặc CTC không dùng đến bất cứ biến hay hằng nào nh thủ tục Tieu_de mà ta đã xét ở bàitrớc

Việc chuyển tham số cho CTC là một cơ cấu thay thế tơng ứng, nó cho phép một quá trình đợclặp đi lặp lại nhiều lần với các "toán hạng" khác nhau Thí dụ Enter (A, B) sẽ thay thế A vào vị trí của X, Bvào vị trí của Y Tơng tự với Enter (C, D)

Chuyển tham số bằng biến : tham số hình thức trong phần tiêu đề của CTC sẽ đợc đặt sau từ khóaVar Với tham biến, các tham số thực sự sẽ phải là biến chứ không đợc là giá trị Thí dụ lời gọi Enter (3, 7) sẽkhông đợc chấp nhận vì 3 và 7 là hai giá trị chứ không phải là biến Các tham số thực sự là các tham biến cóthể đợc thay đổi trong CTC và khi ra khỏi CTC nó vẫn giữ các giá trị đã thay đổi đó Khi khai báo các tham số

mà không có từ khóa Var trong một nhóm tham số hình thức thì các tham số của nhóm này là các tham số giátrị (tham trị) Khi đó các tham số thực sự phải là một biểu thức Tham số hình thức tơng ứng sẽ đợc coi nh mộtbiến địa phơng của CTC, nó nhận giá trị của tham số thực nh là giá trị ban đầu ở vào thời điểm thay vào CTC.Chơng trình con sau đó có thể thay đổi giá trị của các tham trị này ở bên trong CTC bằng các phép gán Songtrong mọi trờng hợp điều đó không làm thay đổi giá trị của tham số thực Do vậy, một tham trị không bao giờ

là kết quả tính toán của CTC

Sự khác nhau giữa hai loại tham số này đợc minh họa bằng ví dụ sau :

Program Tham_so ;Var A, B : Integer ;(* - *) Procedure Thidu_Thamso (X : Integer ; Var Y : Integer) ;Begin

X := X + 1 ;

Y := Y + 1 ; Writeln (X : 6, Y : 6) ;End ;

(* - *) BEGIN

A := 0 ;

B := 3 ; Thidu_Thamso (A, B) ;

Trang 29

Writeln (A : 6, B : 6) ;END.

B là tham biến, còn A vẫn giữ nguyên giá trị trớc khi gọi thủ tục, tức A vẫn bằng 0, vì A chỉ là tham trị

Nh vậy, khi chuyển một tham số cho CTC, nếu ta muốn bảo vệ giá trị của tham số đó khỏi bịCTC "vô tình phá" thì tham số đó phải đợc dùng nh là tham trị Còn một tham số nếu muốn dùng để lấy kếtquả do CTC đem lại thì tham số đó phải là tham biến

Xét ví dụ sau đây :

PROGRAM VI_DUVAR

X : Integer ;(* - *)Procedure A ;

Var Y : Integer ; Procedure AA ; Var M,N : Integer ; Begin

… End ; Procedure AB ; Var M,N : Integer ; Begin

End ; Begin … End ; (* Procedure A *)

Trang 30

(* - *)Procedure B ;

Var X,Z : Integer ; Procedure BA ; Begin

… End ;Begin …End ; (* Procedure B *)(* - *) BEGIN

…END (* Chơng trình chính *)

Nh ta đã biết, các biến đợc khai báo trong chơng trình chính đợc gọi là biến toàn cục Các biếnnày có thể đợc dùng ở mọi nơi trong chơng trình Các biến đợc khai báo trong một CTC đợc gọi là các biến địaphơng và nó chỉ có tác dụng trong phạm vi CTC đó hay trong Bloc đó Khi CTC kết thúc thì các biến này cũngmất tác dụng theo Để diễn tả tầm tác dụng của các biến, của các khai báo, ngời ta đa ra khái niệm mức : ch-

ơng trình chính có mức 0, các chơng trình tiếp theo có mức là 1,2,… tùy theo vị trí khai báo Trong hình 2,

ch-ơng trình con A và B có mức là 1, chch-ơng trình con AA, AB, BA có mức là 2

Sau đây là một số quy tắc sử dụng :

+ Tầm tác dụng của 1 tên (biến, hằng, kiểu…) đợc xác định bằng mức Bloc trong đó tên đợc khaibáo và bằng các mức Bloc khác có mức cao hơn và nằm trong Bloc chứa khai báo

Trong ví dụ vừa rồi, biến Y đợc khai báo trong CTC A (có mức là 1) Nh vậy biến Y có thể đợc

sử dụng ở trong CTC AA và AB (là 2 CTC có mức cao hơn và nằm trong CTC A) Ngoài ra Y không thể sửdụng ở CTC B, BA, BB vì chúng không phải là CTC của A

+ Tầm quan trọng của các biến khai báo ở mức 0 (chơng trình chính)là toàn bộ chơng trình

+ ở các mức khác nhau của các CTC, ta có thể khai báo 1 biến có cùng tên với biến ở mức khác.Tên biến này không phải là một biến duy nhất mà là hai biến khác nhau với tầm quan trọng khác nhau Ví dụtrong hình 2, CTC B có biến địa phơng X và trong chơng trình chính có biến toàn cụa cũng có là X Khi đótrong CTc thì biến X địa phơng có tác dụng, còn khi CTC kết thúc thì biến toàn cục lại lấy lại tác dụng của nó.Hãy xét ví dụ cụ thể nh sau :

Program Tam_Tac_Dung) ;Var I : Integer ; (* Biến I toàn cục *)(* - *) Procedure Dia_Phuong ;

Var I : Integer ; (* Biến I địa phơng *) Begin

Trang 31

I := 7 ; Writeln (I : 6) ; End ;

(* - *)BEGIN

I :=5 ; Writeln(I : 6) ; Dia_Phuong ; Writeln(I : 6) ;END

Kết quả cho ra :

5 (* giá trị của I toàn cục *)

7 (* giá trị của I địa phơng *)

5 (* giá trị của I toàn cục *)

Tên biến I đợc dùng cho cả biến toàn cục và biến địa phơng Đầu tiên biến I toàn cục nhận giá trịbằng 5 Sau đó thủ tục Dia_Phuong đợc gọi, vì thủ tục này cũng có biến là I (biến địa phơng) nên biến I toàncục đợc xem nh tạm bị treo không dùng đến Biến địa phơng lấy giá trị bằng 7 Sau khi kết thúc chơng trìnhcon, biến I địa phơng bị mất và biến I toàn cục lại đợc khôi phục lại tác dụng Tất nhiên nó vẫn giữ giá trị bằng

5 là giá trị có đợc trớc khi gọi thủ tục Dia_phuong

Trong trờng hợp trong thủ tục Dia_phuong, ta muốn chiếu đến biến I toàn cục, ta vẫn có thể dùng

nó bằng cách chỉ rõ tên chơng trình ngoài tên biến : Tam_tac_dung.i Cách tham chiếu nh trên cũng tơng tự

nh khi ta chỉ ra đờng dẫn trực tiếp trên DOS

Trong Procedure và Function có thể có lời gọi của chính nó Tính chất này dợc gọi là tính đệ qui.Thí dụ tính giai thừa qua định nghĩa :

N! = 1 x 2 x x ( N - 1 ) x N

hoặc định nghĩa :

1 khi N = 0N! =

N x ( N - 1 )! khi N >= 1

Khi đó, hàm Giai_thua đợc định nghĩa nh sau :

Trang 32

Function Giai_thua( N : Integer ) : Integer ;Begin

If N = 0 Then Giai_thua := 1 ; Else Giai_thua := N * Giai_thua( N-1 ) ;End ;

Một điều cần lu ý là ta phải hết sức thận trọng lờng trớc việc kết thúc của quá trình đệ qui này.Trong thí dụ trên, lệnh gán :

K := Giai_thua( -1 ) ;

sẽ khởi động một quá tình đệ qui rất dài về mặt lý thuyết vì tham số âm bị xử lý sai

ở thí dụ trên, ta đã khai báo giai_thua là Integer nên sẽ bị một hạn chế : chỉ có thể tính với N < 8vì nếu N >= 8, Giai_thua sẽ mang giá trị lớn hơn 32767 là giới hạn trên của số nguyên Một trong các biệnpháp khắc phục là ta khai báo Giai_thua là Real

Function Giai_thua( N : Integer ) : Real ;

Khi sử dụng Giai_thua là Real, ta phải chú ý sử lý thêm một ít Ví dụ, để viết giá trị củaGiai_thua là số thực sang số nguyên, ta phải sử dụng cách viết có quy cách với phần thập phân bị cắt :

Writeln ( Giai_thua(12) : 0 : 0 ) ;

Thí dụ tính giai thừa ở trên về phơng diện ví dụ nó rất đơn giản và dể hiểu Song về phơng diện kĩthuật lập trình thì đấy là một thí dụ không đẹp lắm vì ngời ta có thể tính giai thừa một cách tiết kiệm hơn bằngchơng trình sau khi sử dụng lệnh lặp While :

Function Giai_thua( N : Integer ) : Integer ;Var I, K :Integer ;

Giai_thua := K ; (* Gán kết quả từ biến trung gian K vào tên hàm*)

Trang 33

End ;

Trong cách dùng sau, ta chỉ mất hai ô nhớ địa phơng tơng ứng với hai biến I và K Còn trong cáchdùng trớc, mỗi lần dùng Giai_thua(N), máy lại phải bố trí thêm một ô nhớ chứa kết quả Giai_thua trung gian

Nói chung nên tránh dùng đệ qui khi mà ta có thể dùng phép lặp để tính toán

Các CTC còn có thể đợc gọi ra trớc khi có định nghĩa chúng nếu nh trớc đó có lời khai báo kiểuForward Cách thức viết đợc thể hiện qua ví dụ dới đây Lu ý là danh sách các tham số hình thức cần liệt kê ratrong lời khai báo trớc (Forward) còn trong lời khai báo chi tiết thì không có

Program Vi_du_Forward ;Var Alpha : Integer ;(* Khai báo trớc Procedure Test2 với từ Forward *)Procedure Test2 ( Var A : Integer ) ; Forward ;(* - *) Procedure Test1 ( Var A : Integer ) ;

Begin

A := A - 1 ; (* Dùng Test2 trớc khi khai báo chi tiết *)

If A > 0 Then Test2(A) ; End ;

(* - *) Procedure Test2 ;

Begin

A := A Div 2 ;

If A > 0 Then Test1(A) ; End ;

(* - *) BEGIN

Alpha := 15 ; Test1( Alpha ) ;END

Ta thấy thủ tục Test1 dùng thủ tục Test2, còn thủ tục Test2 lại dùng thủ tục Test1 Do đó ta thấyngay trong trờng hợp này không thể định nghĩa thủ tục Test1 và Test2 một cách bình thờng đợc mà phải dùng

đến Forward

Trang 34

PRINTER là Unit chứa các CTC và dữ liệu về thủ tục in nh Writeln ( Lst, ).

DOS là Unit chứa các CTC và dữ liệu khai thác các hàm của Dos

SYSTEM là Unit chứa các CTC và dữ liệu hệ thống

( Lu ý rằng các Unit trên đợc để trong file TURBO.TPL ( TPL : Turbo Pascal Library )

GRAPH là một Unit về đồ họa, đợc để trong một file riêng có tên là GRAPH.TPU Đây làmột Unit chứa tất cả các CTC về đồ họa Vì vậy khi bạn dùng đồ họa, nhớ phảicopy file GRAPH.TPU

STRING chỉ có trong Turbo 7.0 để sử dụng kiểu xâu kí tự kệt thúc bằng kí tự có mã

Tuy nhiên, hai Unit cuối có lẽ bạn sẽ không phải dùng đến, bởi vì phiên bản Turbo 3.0 và các

ch-ơng trình viết bằng phiên bản này đã cũ và "cổ lỗ" lắm rồi, bạn có muốn tìm cũng không ra !

Việc chia nhỏ th viện này giúp cho chơng trình dịch chạy nhanh hơn vì không phải đọc lại tất cảcác CTC nếu nh không có nhu cầu Mặt khác, chơng trình dịch ra cũng gọn hơn vì không phải chứa những cáikhông dùng đến

Ngời ta có thể nhóm một số dữ liệu và các CTC liên quan lại thành các Unit ( đơn vị ch ơngtrình ) Các Unit này một khi đã đợc dịch hoàn chỉnh nếu không có sự sửa đổi thì ta có thể dùng ngay, khôngcần dịch lại và thậm chí chúng còn có thể đợc dùng chung cho nhiều chơng trình khác nhau Trong trơng hợp

có sự thay đổi trong một Unit nào đó thì chỉ có các Unit có liên quan mới bị dịch lại

đến *)Procedure Thidu1 ( Var X, Y : Real ) ;Function TenF ( I, J : Integer ) : Real ;Implementation

Trang 35

(* Khai báo các kiểu dữ liệu, các biến cùng đầy đủ các thủ tục và hàm của Unit này *)Const PP = 3.5 ;

Var X, Y : Real ; (* Khai báo các biến cho Unit này *)(* - *)Procedure Thi_du1 ( Var X, Y : Real ) ;

Begin

End ;(* - *)Function TenF ( I, J : Integer ) : Real ;

Begin

End ;END

(* Kết thúc Unit bằng END có dấu chấm Lu ý ở phía trên sẽ không có chữ BEGIN tơng ứngvới chữ END kết thúc Unit này *)

Khi dịch tệp trên bằng cách ấn Alt _ F9, Turbo Pascal sẽ tạo ra file KHOI1.TPU ( TPU : TurboPascal Unit ) Bạn nhớ rằng để dịch đúng một Unit bạn đang soạn thảo, bạn phải ấn Alt _ F9 chứ không phảiCtrl _ F9

Program SD_Unit ;Uses Crt ;

Type

BEGIN Clrscr ;END

hoặc một chơng trình khác trong đó dùng nhiều Unit khác nhau :

Program Vidu_Unit ;Uses Crt, Dos, Graph, Printer ;

Trang 36

1 Khái niệm chung về cấu trúc dữ liệu:

Chúng ta đã làm quen với các kiểu dữ liệu đơn giản là các kiểu vô hớng (Integer, Char, Boolean,Real, kiểu liệt kê) và đoạn con Trong Pascal tồn tại các kiểu dữ liệu có cấu trúc là các kiểu dữ liệu đ ợc tạo ra

từ các phần tử có kiểu dữ liệu đơn giản bằng một cách nào đó Chúng đợc đặc trng bằng kiểu dữ liệu của cácphần tử và quan trọng hơn cả là phơng pháp cấu thành kiểu dữ liệu mới (điều đó cũng có nghĩa là phơng pháptruy nhập vào kiểu dữ liệu có cấu trúc) Tính có cấu trúc của dữ liệu là một đặc trng của ngôn ngữ lập trình cócấu trúc

Pascal có tất cả 4 kiểu dữ liệu có cấu trúc mà chúng ta sẽ lần lợt ngiên cứu : mảng (Array), tập(Set), bản ghi (Record) và tệp (File)

2 Kiểu dữ liệu có cấu trúc : Mảng (Array)

Một mảng dữ liệu gồm một số hữu hạn phần tử có cùng kiểu gọi là kiểu cơ bản Số phần tử củamảng đợc xác định ngay từ khi định nghĩa ra mảng Mỗi phần tử của mảng đựoc truy nhập trực tiếp thông quatên mảng cùng với chỉ dẫn truy nhập đợc để giữa hai ngoặc vuông [ ]

Định nghĩa kiểu mảng T có kiểu các phần tử là KPT, có kiểu chỉ dẫn KCD để hớng dẫn cách tổchức mảng cũng nh cách truy nhập vào các phần tử mảng đợc viết trong Pascal nh sau :

Type Kiểu_mảng T = Array[ Kiểu_chỉ_dẫn KCD ] Of Kiểu_phần_tử KPT ;

Trang 37

AC = Array [ 1 10 ] Of Char ; Color = ( Red, Blue, Green, White, Black ) ; Var

A, B, C : AI ;

X, Y : AC ; M1, M2 : Array[ -3 5 ] Of Real ;

MC : Array[ 'A' 'Z' ] Of Integer ;

MM : Array[ Color ] Of Boolean ;

AI, AC là hai kiểu mảng gồm 10 phần tử đợc đánh số thứ tự từ 1 đến 10 thông qua kiểu chỉ dẫn làmột đoạn con các số nguyên 1 10 Các phần tử của AI có kiểu là số nguyên còn các phần tử của AC có kiểu

là các kí tự A, B, C là các biến có kiểu là AI

Còn M1, M2 là hai biến đợc định nghĩa kiểu luôn khi khai báo Đây là hai biến mảng gồm 9 phần

X : Array[ Integer ] Of Integer ;

Y : Array[ Real ] Of Integer ;

Việc truy nhập vào một phần tử nào đó của mảng đợc thực hiện qua tên biến mảng, theo sau làgiá trị chỉ dẫn để trong ngoặc vuông nh :

MM[ Red ] := True ; MC[ 'B' ] := 5 ;

Do thời gian truy nhập vào một phần tử của mảng không phụ thuộc vào giá trị của chỉ dẫn nêncấu trúc mảng thuộc kiểu cấu trúc truy nhập trực tiếp

Trang 38

Begin Write (' B[ ', I, ' ] = ') ; Readln ( B[ I ] ) ; End ;

Kết quả thể hiện ra màn hình với các con số là do ngời sử dụng gõ vào :

Vao so lieu cho mang B B[1] = 2

B[2] = 12 B[3] = 612 B[4] = 2 B[5] = 34

Nếu bạn muốn vào số liệu của cả một hàng của Array trên cùng một dòng màn hình thì bạn phảighi rõ tất cả các biến cần đọc ( là các phần tử của mảng ) trong thủ tục Readln Khi này sẽ không áp dụng vòngFor đợc nữa :

Write (' Vao so lieu hang 1 ') ; Readln ( B[1], B[2], B[3], B[4], B[5] ) ;

Kết quả hiện ra màn hình :

Vao so lieu hang 1 : 2 12 612 2 34

Giữa các số gõ là các dấu cách với số lợng tùy ý nhng ít nhất phải là 1

Ví dụ 2:

Cộng hai mảng C = A + B ( A, B, C với định nghĩa nh trên thực ra là các mảng hay ma trận một chiều ) :

For I := 1 To 10 Do C[ I ]:=A[ I ] + B[ I ] ;

Ví dụ 3:

Giả sử ta muốn đếm trong 100 lần gõ kí tự vào qua bàn phím, số lần xuất hiện các kí tự từ 'A' đến 'Z'

là bao nhiêu Biến MC đợc khai báo dới đây đóng vai trò là bộ đếm, biến kí tự Ch đợc dùng nh là biến chỉdẫn

Var

Trang 39

For I := 1 To 100 Do Begin

Readln ( Ch ) ; (* Hàm Upcase biến chữ thờng thành chữ hoa, Ví dụ 'a' thành 'A' *)

Ch := Upcase ( Ch ) ; (* Đếm số lần xuất hiện từng kí tự *) ; Inc ( MC[ Ch ] ) ;

End ; (* Chỉ in ra kết quả trên màn hình các chữ đã xuất hiện *) For Ch := 'A' To 'Z' Do

If MC[ Ch ] > 0 Then Writeln ( ' So chu ', Ch,' = ', MC [Ch ] : 4 ) ; END

Kết quả hiện ra trên màn hình có dạng :

So chu A = 2

So chu C = 68

Trang 40

Program SAP_XEP ; Const

N = 5 ; Var

MI : Array[ 1 N ] Of Integer ;

T : Integer ; (* T lµ biÕn trung gian *)

I, J : Integer ; BEGIN

(* §äc c¸c sè cÇn s¾p xÕp vµo m¶ng MI *) For I := 1 To N Do

Begin Write (' MI[ ', I ,' ] = ') ;

Readln ( MI[ I ] ) ; End ;

(* S¾p xÕp *) For I := 1 To N - 1 Do For J := I + 1 To N Do Begin

If MI[ I } > MI[ J ] Then Begin

T := MI[ I ] ; MI[ I ] := MI[ J ] ; MI[ J ] := T ; End ;

End ; (* In ra kÕt qu¶ *) Writeln ;

Writeln ( ' Sau khi sap xep ' ) ; For I := 1 To N Do Writeln ( MI[ I ] : 6 ) ; END

KÕt qu¶ ch¬ng tr×nh hiÖn ra trªn mµn h×nh :

M[ 1 ] = - 1 M[ 2 ] = 456 M[ 3 ] = 34

Ngày đăng: 21/06/2013, 01:26

HÌNH ẢNH LIÊN QUAN

Bảng sau sẽ trình bày cao độ của các nốt nhạc : - Lý thuyết  Turbo Pascal
Bảng sau sẽ trình bày cao độ của các nốt nhạc : (Trang 99)

TỪ KHÓA LIÊN QUAN

w