1. Trang chủ
  2. » Công Nghệ Thông Tin

Free Pascal: Yes, Turbo Pascal: No!

28 1,7K 9
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

Định dạng
Số trang 28
Dung lượng 213,5 KB

Nội dung

Free Pascal: Yes, Turbo Pascal: No!

Trang 1

Free Pascal: Yes, Turbo Pascal: No!

Nguyễn Thanh Tùng

Các bạn đã bao giờ nghe đến cái tên Free Pascal (FP) chưa? Nếu chưa thì tôi xin giới thiệu một cách ngắn gọn: FP là một môi trường lập trình rất tuyệt vời và mạnh mẽ, hoàn toàn tương thích Turbo Pascal (TP) và điều đáng chú ý nhất là FP là được chọn làm môi trường chuẩn thay thế TP trong các kì thi IOI Vì sao vậy? Chúng ta hãy cùng tìm hiểu những điều thú vị của FP mà TP không có để thấy câu trả lời nhé!!!

Chẳng hạn, nếu dãy A là 5 3 2 1 4 và B là 3 2 5 4 1 thì C là dãy 3 2 4

Đây là một bài toán quy hoạch động kinh điển và có công thức quy hoạch động được thiết lập như sau:

Gọi L(i,j) là độ dài dãy con chung lớn nhất của dãy Ăi) gồm các phần tử a1, a2,…ai và dãy B(j) có các phần tử là là b1, b2,…bj

Thế thì:

L(0,j)=L(i,0)=0

Nếu ai</SUB>=Bj thì L(i,j)=L(i-1,j-1)+1

Nếu ai ≠bj thì L(i,j)= max(L(i-1,j), L(i,j-1))

Trường hợp 2 và 3 áp dụng với tất cả các chỉ số i từ 1 đến n và j từ 1 đến m Nếu bạn chưa tin vào tính đúng đắn của công thức thì tôi xin giải thích như sau:

Trường hợp 1 hiển nhiên

Với công thức ở trường hợp 2 và 3 ta thấy: nếu ai =bj thì ta phải chọn ngay cặp phần tử chung đó, các phần tử còn lại của 2 dãy là a1, a2,…a i−1 và b1, b2,…b j −1 có dãy con chung lớn nhất gồm độ dài L(i-1,j-1), do đó L(i,j)=L(i-1,j-1) + 1 (Tư tưởng quy hoạch động thể hiện ở chỗ L(i,j) đạt max thì L(i-1,j-1) cũng phải đạt max)

Còn nếu ai ≠bj thì ta có 2 lựa chọn: hoặc không xét phần tử ai và so dãy là a1, a2,…ai-1 với dãy b1, b2,…bj để được dãy con chung dài nhất L(i-1,j) phần tử; hoặc không xét phần tử bj và so dãy là a1, a2,…ai với dãy b1, b2,…bj-1 để được dãy con chung dài nhất L(i,j-1) phần tử (Chú ý định nghĩa của L(i-1,j) và L(i,j-1)) Vì có 2 lựa chọn nên ta chọn hướng tốt hơn, do đó L(i,j)=max(L(i-1,j) , L(i,j-1))

Các bạn có thể băn khoăn là ở trường hợp 2 cũng có thể lựa chọn cả 2 tình huống trên chứ? Thực chất không cần như vậy, vì dễ thấy L(i,j)≤ min(i,j) do đó L(i-1,j-1) + 1 chắc chắn không nhỏ hơn cả L(i-1,j) và L(i,j-1)

Sau khi tính được xong toàn bộ L(i,j) thì ta sẽ được: dãy C có L(n,m) phần tử, để xác định đó là các phần tử nào thì ta lần vết trên L theo 3 trường hợp trên để tìm các cặp ai</SUB>=Bj được chọn Các bạn xem trong chương trình cài đặt cụ thể dưới đây trên TP: {$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+}

program daycon;

const

Trang 2

inp = ’daycon.in0’;

out = ’daycon.out’;

max = 100;

type

mang1 = array[0 max] of integer;

mang2 = array[0 max] of mang1;

var

i,j : integer;

function max(a,b : integer): integer;

Trang 3

Câu trả lời là: TP là môi trường lập trình 16 bit trên HĐH DOS do đó nó có nhiều hạn

chế Han chế thứ nhât là kích thước của biến và kiểu &l; 64KB, trong đó có biến mảng

và kiểu mảng Đó là do dùng số 16 bit thì chỉ có thể chỉ số hoá được 216 = 64K giá trị thôi Khi ta khai báo max = 1000 thì mảng L của ta có kích thước 1000x1000x2 (2 là kíchthước kiểu integer)=2.106>>64K nên TP báo lỗi "structure too large" (kiểu cấu trúc quá

Trang 4

Vẫn còn giải pháp nữa: thay vì dùng mảng tĩnh thì dùng mảng động Khai báo L là mảng

1000 con trỏ, mỗi con trỏ trỏ đến một mảng 1000 phần tử (L:Array[1 max] of ^mang1).May quá, TP không báo lỗi khi dịch Nhưng khi chạy thì ôi thôi, lỗi "Heap overflow" (tràn heap) Nguyên nhân là hạn chế của DOS: toàn bộ bộ nhớ DOS có thể sử dụng ≤ 640

KB Mà các chương trình hệ thống và IDE của TP cũng chiếm mất hơn 300KB rồi Tức

là chương trình của bạn dù có tận dụng hết bộ nhó còn lại cũng chỉ được 300KB nữa thôi.(Khi bạn nhấn F9 để dịch, TP báo xxxKB free memory, đó chính là phần heap tối đa hệ thống có thể cấp phát cho các biến động đó)

Vẫn còn nhiều giải pháp có thể giải quyết: dùng 2 mảng một chiều tính lẫn nhau và đánh dấu lần vết bằng bit; ghi ra file; dùng mảng răng lược… Nhưng dù sao thì cũng chỉ là giảipháp tình thế, hơn nữa lại rất phức tạp Giải pháp tốt nhất là dùng một môi trường lập trình mạnh hơn Và IOI đã chọn FP

Tôi đem chương trình trên với khai báo max =1000 chạy trên FP và mọi chuyện đều ổn, chẳng có lỗi nào xảy ra hết Đối với FP, bộ nhớ không bị hạn chế bởi con số 64KB nữa (free mà)

Điều đó có được là nhờ những đặc tính tuyệt vời của FP:

a FP là môi trường lập trình 32 bit Dùng một số 32 bit thì có thể chỉ số hoá được 232

= 4G giá trị, vậy nên biến trong FP có thể có kích thước 4GB Các bạn chú ý:

4GB=4x1024MB Trong khi đó máy tính chúng ta thường dùng thường có chừng 128MBRAM Mảng L kích thước ≤ 2MB thì nhằm nhò gì

b FP là môi trường lập trình chạy trên nền các HĐH 32 bit (Windows, Linux, BeOS,

OS/2… và cả DOS nữa Nhưng đó là phiên bản DOS 32 bit mở rộng) Đây cũng là điều quan trọng Vì nếu cho FP chạy trên DOS 16 bit (nếu có chạy được), thì với bộ nhớ chật hẹp 640KB, FP cũng phải bó tay không phát huy được tài năng Ngược lại do TP là 16 bit, nên có cho chạy trên Windows 32 bit, thì cũng chỉ phát huy được tài năng đến mức của 16 bit mà thôi Chạy trên môi trường 32 bit, ngoài RAM (đã rất nhiều), HĐH còn có

có chế bộ nhớ ảo (virtual memory) sử dụng một phần HĐ làm bộ nhớ tạm nên FP có thể cung cấp cho bạn dung lượng nhớ có thể nói là thoải mái (free mà)

c FP là tương thích hoàn toàn với TP Đây cũng là một điều thú vị Chương trình ở

phàn trên tôi viết trong TP, đem sang FP vẫn chạy ngon lành, chẳng phải sửa đổi gì hết (thực ra thì có sửa giá trị max từ 100 thành 1000) IDE của FP thì giống hệt TP (tất nhiên

có nhiều chức năng tiên tiến hơn, nhưng những gì bạn làm được với TP đều làm được trên FP)

Tôi nghĩ vậy là quá đủ để chúng ta thay thế TP bằng FP Nếu bạn còn băn khoăn, hãy đợi các bài viết tiếp theo để tìm hiểu tiếp về những điều kì diệu mà FP có còn TP thì không Còn nếu bạn háo hức muốn dùng thử, hãy làm theo chỉ dẫn cài đặt dưới đây

2 Cài đặt và sử dụng FP

a Tải bộ cài đặt

FP có rất nhiều phiên bản, cả các phiên bản đã sử dụng chính thức và phiên bản còn đang phát triển Theo tôi thì các bạn nên sử dụng các phiên bản chính thức vì chúng ổn định

Trang 5

hơn (Tôi hiện đang dùng phiên bản 1.0.6)

Để cài đặt bạn vào website của ISM (http://www.thnt.com.vn), hoặc nếu thích có thể đến thẳng website của FP (http://www.freepascal.org), vào mục download và tải file zip chứa

bộ cài Chú ý là có nhiều phiên bản của FP cho các hệ điều hành khác nhau nên bạn phải chú ý:

- Tải bộ cài các phiên bản chính thức Các phiên bản chính thức có chữ số cuối cùng là số

chẵn (như bản của tôi là 1.0.6, có thể bây giờ có nhiều bản mới hơn rồi)

- Tải bộ cài cho HĐH Windows và DOS Bạn có thể nhận biết điều này qua tên file zip Như file của tôi là dosw32106full.zip, có nghĩa là bộ cài đầy đủ cho HĐH Windows và DOS, phiên bản 1.0.6

c Chạy và cấu hình IDE

Sau khi cài xong, toàn bộ IDE, chương trình dịch, tài liệu, ví dụ,… của FP được copy vàothư mục bạn đã chọn khi cài đặt (mặc định là C:PP) Có 2 bản cho cả Windows và DOS (32bit) Nếu chỉ dùng FP thay thế TP trong học tập thì theo tôi bạn nên sử dụng bản cho DOS Vì qua sử dụng tôi thấy IDE của FP trên DOS hoạt động ổn định hơn IDE của FP trên Windows

Để sử dụng IDE của FP trên DOS, bạn vào thư mục con bingo32v2 và chạy file fp.exe (Có thể sẽ cần nhấn Alt-Enter để chương trình chạy toàn màn hình full screen Bạn sẽ thấy ngạc nhiên, hoặc cũng chẳng ngạc nhiên lắm, vì giao diện IDE của FP giống hệt TP (Tôi thì thấy ân tượng hơn, nhất là hình ảnh nền)

Đến đây thì mọi chuyện như trên TP thôi Nhưng để thuận tiện hơn trong sử dụng, bạn nên thiết lập một số thông số cấu hình như sau:

- Vào menu CompileTarget: chọn DOS (để nhấn Ctrl-F9 là chương trình của bạn có thể chạy ngay lập tức như trong TP Vì compiler ta dùng cũng đang chạy trên DOS mà Nhưng đây là DOS 32 bit đấy, không hạn chế như DOS 16 bit đâu)

- Vào menu OptionsMode: chọn Normal (để FP sẽ hỗ trợ chúng ta debug dễ chịu nhất)

- Vào menu OptionsCompiler:

ở tab Syntax các bạn chỉ chọn các mục:

+ TP/BP compatibily: để tương thích với TP (sau này khi quen với FP rồi thì không cần nữa, còn bây giờ thì chọn chức năng này cho dễ sử dụng)

+ Stop after first error: bình thường FP dịch sẽ thông báo một loạt lỗi (giống C,

Delphi…), nhưng ta quen với việc thông báo lỗi đầu tiên gặp của TP nên chọn mục này cho thân thiện Sau này có thể không cần nữa

+ C-like operators: đây là một điều thú vị của FP (các bạn hãy đón đọc trong kì sau nhé)

ở tab Code generaion các bạn chọn

+ Toàn bộ các mục phần Run-time checks: cho an toàn các bạn ạ, tránh trường hợp ta lập trình sai như: truy cập ngoài mảng, tính toán tràn số mà máy vẫn không thông báo gì + Target processor: chọn PPro/PII Hầu hết máy của chúng ta là máy Pen III, Pen IV, thế thì nên để FP tận dụng hết tiềm năng của chúng để chương trình của chúng ta chạy hiệu quả hơn

Trang 6

- Vào menu OptionsEnviroimentEditor: đặt các thông số soạn thảo mà bạn thích Tôi thì thường chỉ đặt các mục sau:

Các mục mà TP mặc định (và FP cũng thế):

+ Insert mode: chế độ gõ chèn

+ Auto indent mode: đặt lề tự động

+ Backspace unindent

+ Tab size: 4 Indent size: 4

Những thông số này giúp chương trình dễ đọc hơn (có cấu trúc, thẳng lề, các đầu dòng thò thụt đều đặn theo khoảng cách 4 kí tự)

Syntax highlight: hiện sáng từ khoá (trong TP cũng có)

Persirtent block: khối sau khi đánh dấu sẽ hiển thị cho đến khi dùng lệnh ẩn khối

Auto closing brackets: tự động thêm kí tự đóng ngoặc Đây là điều đặc sắc không có trong TP Bình thuờng trong TP bạn gõ các kí tự mở ngoặc như (, [, { thì phải tự thêm kí

tự đóng ngoặc cho đúng Nếu không chú ý thì rất dễ lẫn Còn trong FP nếu đặt chức năng này thì khi ta gõ kí tự mở ngoặc, FP cũng thêm luôn kí tự đóng ngoặc, do đó chúng ta không sợ các lầm lẫn thừa thiếu đóng mở ngoặc nữa

Chúc các bạn sảng khoái khám phá và tận hưởng những điều thú vị của FP Hẹn gặp lại trong các bài viết sau

Free Pascal: Yes, Turbo Pascal: No!

Nguyễn Thanh Tùng

(Tiếp theo số trước)

Trong số trước chúng ta đã biết một đặc tính rất tuyệt vời của FP là hỗ trợ bộ nhớ rộng rãi Không chỉ có vậy, trong bài này chúng ta sẽ tìm hiểu tiếp về những điều thú vị khác của FP

1 Kiểu số nguyên lớn

Có rất nhiều bài toán cần chúng ta phải tính toán với những số nguyên lớn Chẳng hạn như tính giai thừa, tính số Fibonacci hay tìm các số nguyên tố lớn (chẳng hạn tìm các số nguyên tố lớn để dùng trong thuật toán mã hoá RSA) Với kiểu Integer của TP ta tìm được số nguyên tố lớn nhất có 5 chữ số Với kiểu LongInt thì được 9 chữ số Muốn tìm được các số to hơn thì phải dùng kiểu số thực (như comp hay extended) Nhưng có điều bất tiện là các kiểu số thực thì không dùng các phép toán div, mod được nên cài đặt rất khó khăn

Ngoài bài toán về tìm số nguyên tố lớn, với những bài toán khác như tính giai thừa, tính

số Fibonacci,… kiểu integer của TP rất hạn chế

Một hạn chế thứ hai với kiểu integer của TP là hay gặp các lỗi tính toán số học (Không biết bạn có đặt {$Q+} để phát hiện các lỗi như vậy chưa) Lỗi tính toán số học xảy ra khi chúng ta tính biểu thức có các hạng tử trong miền integer nhưng kết quả thì nằm ngoài miền (chẳng hạn 30000 + 30000) Những lỗi như vậy thường ít khi ta để ý, nhưng rất phiền toái Sửa chúng thì cũng không khó lắm, chỉ cần chuyển đổi kiểu (thành LongInt hay Real) là OK

Với FP thì những hạn chế đó không thành vấn đề Với lợi thế 32 bit (gấp đôi TP), FP

Trang 7

cung cấp kiểu Int64, mới nghe chắc bạn cũng đoán được đó là kiểu số nguyên 64 bit Với Int64 các bạn có thể tìm được các số nguyên tố 18 chữ số (cỡ tỉ tỉ) hay tính được giai thừacủa 20 (Nếu vẫn muốn hơn thì ta phải xây dựng riêng một kiểu BigInt, ta sẽ làm điều đó trong phần sau)

Trong trường hợp muốn tiết kiệm bộ nhớ, ta vẫn có thể sử dụng kiểu Byte (kích thước 1 byte), SmallInt (kích thức 2 byte)

Bảng sau trình bày về các kiểu nguyên của FP:

Chú ý: với kiểu Integer, mặc định FP dùng kích thước 2 byte Vì vậy khi muốn dùng kiểu

nguyên lớn, ta nên khai báo rõ ràng

2 Kiểu string lớn

Khi lập trình, chúng ta rất nhiều lần gặp vấn đề với các xâu tối đa 255 kí tự của TP (chẳng hạn bài toán xâu đối xứng, bài toán đếm từ…) Ta có thể giải quyết vấn đề bằng mảng kí tự (array of char) nhưng khi đó ta lại không thể dùng các phép toán trên xâu rất mạnh của Pascal

Không chỉ có cải tiến về kiểu nguyên, kiểu string trong FP cũng rất tuyệt vời String trong FP không còn hạn chế 255 kí tự của TP nữa mà có kích thước tối đa là 2 tỉ kí

tự Hơn nữa FP còn hỗ trợ kiểu xâu Unicode (WideString) Nếu bạn vẫn thích kiểu String

cũ của TP, bạn có thể dùng kiểu ShortString

Bây giờ bạn có thể viết chương trình giải bài xâu đối xứng, xâu con chung với kiểu stringcủa trên FP và hạn chế n cỡ 1000 một cách rất dễ dàng Chúng ta sẽ tìm hiểu kĩ hơn về xâu trong FP ở một bài báo khác

3 Viết hàm thuận lợi hơn

FP có rất nhiều cải tiến trong cách viết các hàm Để so sánh, chúng ta sẽ xem xét một số

ví dụ Trong TP, chúng ta viết hàm tính giai thừa như sau:

Trang 8

Tại sao ta lại phải thêm một biến tg để lưu trữ kết quả trung gian? Đó là do trong TP với tên hàm ta chỉ được sử dụng duy nhất lệnh gán trị Nếu đưa tên hàm vào biểu thức thì sẽ thực hiện lời gọi hàm

Điều này đã được FP làm cho free bằng cách cho phép sử dụng tên hàm như một biến

(giống như Object Pascal dùng biến Result) Khi đó tên hàm có thể xuất hiện ở trong cách biểu thức tính toán ngay trong thân hàm mà không tạo ra lời gọi đệ quy Hàm giai thừa trong FP có thể viết rất tiết kiệm biến như sau:

function Gt(n: integer): int64;

function Gt(n: integer): int64;

lợi của cách viết này khi viết các hàm dạng " phát hiện được phần tử đầu tiên rồi thoát"

Chẳng hạn hàm tìm vị trí của phần tử x trong mảng a có n phần tử Viết trong TP ta phải viết như sau:

function Find(x: integer): integer;

Hàm này viết trong FP thì ngắn ngọn hơn nhiều:

function Find(x: integer): integer;

Trang 9

Rất nhiều ngôn ngữ lập trình thông dụng như C, VB… chỉ cho phép kết quả trả lại của hàm là các kiểu cơ sở như: số nguyên, số thực, kí tự, con trỏ… Riêng TP thì có thêm kiểuxâu kí tự Nếu muốn trả lại kết quả là kiểu cấu trúc như mảng hay bản ghi thì bạn chỉ có cách dùng tham biến thôi Một số NNLT hướng đối tượng như C++, Java, Object Pascal

có cho phép kết quả trả lại là một đối tượng, nhưng như vậy vẫn không free như FP: FP cho phép kết quả của hàm có thể là kiểu cấu trúc

Để hiểu hơn chúng ta cùng làm bài toán sau (Đề thi OLP2004):

Gọi X là tập tất cả các xâu nhị phân không có 2 bit 1 liền nhau Các xâu được đánh thứ tựtheo trình tự được sinh ra (từ nhỏ đến lớn, bit 0 đứng trước bit 1) Chẳng hạn với n=5 ta

có các xâu sau:

Bài toán đặt ra: hãy xác định xâu nhị phân n bit ứng với số thứ tự m cho trước Hạn chể:

n <= 200

Bài toán này có thuật giải như sau:

Gọi L[k] là số các xâu nhị phân như vậy có k bit Nếu bit thứ k của nó là bit 0 thì k-1 bit còn lại là tự do (tức là ta có L[k-1] dãy) Nếu thứ k của nó là bit 1 thì bit k -1 phải là 0, vàk-2 bit còn lại free Vậy ta có: L[k] = L[k-1] + L[k-2] Chú ý: L[1]=2 và L[2]=3

Có công thức đó, ta tính số các xâu có n bit Để xác định xâu nhị phân n bit có thứ tự m

cho trước ta có nhận xét: nếu m > L[n-1] thì nhất định bit thứ n phải là 1 (vì thứ tự của

xâu có bit 0 đứng trước xâu có bit 1, và có đúng L[n-1] xâu có bit thứ n là bit 0) Xâu n-1

bit còn lại có sẽ thứ tự là m-L[n-1] Ngược lại thì bit thứ n là bit 0 và xâu n-1 bit còn lại

Tuy nhiên n có thể bằng 200 nên m và các giá trị L[i] có thể xấp xỉ 2200, tức là cỡ 1070 (vì

210 xấp xỉ 103 ) Ta không thể dùng các kiểu số có sẵn mà phải tự xây dựng một kiểu số lớn hơn

Có nhiều người thích dùng xâu để biểu diễn số lớn, nhưng tôi thấy dùng mảng thì thích

hợp hơn Ta dùng mảng biểu diễn số nguyên lớn, mỗi phần tử của mảng là một chữ

Trang 10

số Các chữ số lưu trữ trong mảng theo chiều từ trái sang phải: chữ số hàng đơn vị là

phần tử 1, chữ số hàng chục là phần tử 2…

Ta khai báo kiểu số lớn đó như sau:

const max = 100;

type BigInt = array[1 max] of byte;

Để cộng, trừ 2 số nguyên lớn biểu diễn bằng mảng, ta dùng thuật toán cộng kiểu thủ công(cộng các chữ số từ bậc thấp đến bậc cao, có nhớ) Các thủ tục cộng, trừ viết trong TP như sau:

procedure cong(var a,b,c : BigInt);

Ta khai báo L là mảng 200 phần tử kiểu BigInt Gán L[1] là 2, L[2] là 3 rồi tính các phần

tử khác bằng câu lệnh như sau:

for i:=3 to n do cong(L[i-1],L[i-2],L[i]);

Viết như vậy thì chương trình hoạt động tốt, nhưng không trực quan lắm Nếu có thể viết L[i]:=cong(L[i-1],L[i-2]) thì sẽ trong sáng hơn nhiều Trong TP thì không thể, nhưng trong FP hoàn toàn có thể viết được như vậy Sau đây là toàn bộ chương trình nguồn giải bài toán này viết bằng FP:

program Xau2bit1;

const

inp = ’fibo.inp’;

out = ’fibo.out’;

Trang 12

for i := max downto 1 do

if a[i] < b[i] then

for i:=n downto 2 do

if nho(m, L[i-1]) then

Trang 13

Đọc chương trình nguồn, các bạn cảm thấy thế nào? Tôi thì thấy rất thoải mái, vì bây giờ với FP có thể viết rất nhiều hàm mà trước đây trên TP phải viết bằng thủ tục một cách không rõ ràng lắm Hàm trong FP có thể trả lại kiểu cấu trúc là một điều tôi thấy cực kì thú vị, vì chưa từng thấy một ngôn ngữ lập trình thông dụng nào làm được điều đó

FP vẫn còn nhiều điều thú vị về hàm, chẳng hạn như hàm đa hình, hàm định nghĩa phép toán… Tiếc là trang báo có hạn, những vấn đề đó đành phải trình bày trong bài viết kì

sau

Free Passcal: Yes, Turbo Pascal: No!

Nguyễn Thanh Tùng

(tiếp theo số trước)

Trong số trước tôi có giới thiệu một số điều thú vị về hàm trong FP, đặc biệt là FP cho phép kết quả của hàm trả là kiểu cấu trúc Trong bài này tôi sẽ giới thiệu một số điều cũng thú vị không kém: đó là các toán tử kiểu ngôn ngữ C, tính năng định nghĩa lại hàm

và định nghĩa lại toán tử Chú ý là những điều thú vị về hàm trong FP chỉ dịch được khi

ta tắt chức năng tương thích TP7.0 của FP.

1 Toán tử kiểu ngôn ngữ C (C-like operators)

Trang 14

Ai từng lập trình ngôn ngữ C, chắc đều yêu thích sự ngắn gọn của nó Trong khi TP phải viết một câu lệnh gán rất dài dòng, chẳng hạn:

Tong:= Tong + Them;

thì C chỉ phải viết một cách rất gọn gàng

Tong += Them;

Cách viết này không chỉ làm chương trình nguồn ngắn gọn hơn mà còn tiết kiệm công sức lập trình, tạo điều kiện cho chương trình dịch dễ tối ưu mã lệnh

FP cũng có những toán tử như vậy Nếu bạn bật option C-like operators trong FP lên thì

có thể viết đoạn lệnh tính tổng n số tự nhiên đầu tiên như sau:

for i := 1 to n do s += i;

Có thể ban đầu bạn chưa quen, nhưng khi quen rồi chắc chắn bạn sẽ thích

Sau đây là các toán tử kiểu trên có thể dùng trong FP Chú ý: toán tử chia đi /= chỉ áp dụng với kiểu số thực

2 Định nghĩa lại hàm (overloading)

Trong TP mỗi định danh (identifier) chỉ được phép gán cho một đối tượng, nhất là đối vớichương trình con (thủ tục hoặc hàm, mà để đơn giản từ ngữ, ta sẽ gọi chung là hàm) Điều đó dẫn đến hai hệ quả Điều thứ nhất là khi ta định nghĩa một hàm mới trùng tên vớimột tên chuẩn thì tên chuẩn đó sẽ bị che khuất Điều thứ hai là trong một chương trình ta không được phép định nghĩa hai hàm có tên giống nhau

Chẳng hạn write là một tên chuẩn của TP Nếu trong chương trình chúng ta cũng viết mộthàm write dành cho kiểu BigInt mà ta đã xây dựng thì ta chỉ sử dụng được hàm write mà

ta xây dựng mà thôi, không thể dùng được hàm write chuẩn của TP

Mặt khác mỗi lần xây dựng một kiểu mới thì ta lại phải đặt những tên mới cho các thao tác giống nhau trên đó Chẳng hạn nếu ta xây dựng kiểu số phức (Complex) hay kiểu ma trận (Matrix) thì mỗi thao tác như cộng, nhân, so sánh… ta đều phải đặt tên khác với tên thao tác tương ứng của BigInt Đó là một điều khá bất tiện

FP đã xoá bỏ điều bất tiện đó bằng việc cho phép định nghĩa lại hàm và khai báo

những hàm trùng tên (thuật ngữ tiếng Anh là overloading, còn được dịch là hàm nạp

chồng, hàm nạp lại hoặc hàm quá tải Tôi thì dịch là hàm trùng tên cho dễ hiểu) Khi

dịch một lời gọi hàm, FP sẽ dựa vào các tham số mà xác định hàm nào được sử dụng

Như vậy, các hàm muốn khai báo trùng tên được thì phải có danh sách tham số hình

thức khác nhau.

Trong chương trình ví dụ sau khai báo 2 hàm cùng có tên là cong, thực hiện việc cộng 2

số nguyên lớn (BigInt) và 2 số phức (Complex) Chương trình dịch thành công trong FP.program OverloadingDemo;

Ngày đăng: 10/09/2012, 14:56

HÌNH ẢNH LIÊN QUAN

Bảng sau trình bày về các kiểu nguyên của FP: - Free Pascal: Yes, Turbo Pascal: No!
Bảng sau trình bày về các kiểu nguyên của FP: (Trang 7)
Từ bảng trên ta thấy một số chú ý như sau: - Free Pascal: Yes, Turbo Pascal: No!
b ảng trên ta thấy một số chú ý như sau: (Trang 17)

TỪ KHÓA LIÊN QUAN

w