Free Pascal: Yes, Turbo Pascal: No!

28 1.7K 9
Free Pascal: Yes, Turbo Pascal: No!

Đ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

Free Pascal: Yes, Turbo Pascal: No!

Free Pascal: Yes, Turbo Pascal: No! Nguyễn Thanh Tùng Các bạn nghe đến tên Free Pascal (FP) chưa? Nếu chưa tơi xin giới thiệu cách ngắn gọn: FP mơi trường lập trình tuyệt vời mạnh mẽ, hồn tồn tương thích Turbo Pascal (TP) điều đáng ý FP chọn làm môi trường chuẩn thay TP kì thi IOI Vì vậy? Chúng ta tìm hiểu điều thú vị FP mà TP khơng có để thấy câu trả lời nhé!!! Bộ nhớ rộng rãi Trong chúng ta, có nhiều người biết tốn tìm dãy chung dài Bài toán phát biểu ngắn gọn sau: Cho dãy A B Dãy A có phần tử a1, a2,…an, dãy B có phần tử là b1, b2,…bn Hãy tìm dãy C dãy A B có nhiều phần tử Chẳng hạn, dãy A B C dãy Đây toán quy hoạch động kinh điển có cơng thức quy hoạch động thiết lập sau: Gọi L(i,j) độ dài dãy chung lớn dãy Ăi) gồm phần tử a1, a2,…ai dãy B(j) có phần tử là b1, b2,…bj Thế thì: L(0,j)=L(i,0)=0 Nếu ai=Bj L(i,j)=L(i-1,j-1)+1 Nếu ≠bj L(i,j)= max(L(i-1,j), L(i,j-1)) Trường hợp áp dụng với tất số i từ đến n j từ đến m Nếu bạn chưa tin vào tính đắn cơng thức tơi xin giải thích sau: Trường hợp hiển nhiên Với công thức trường hợp ta thấy: =bj ta phải chọn cặp phần tử chung đó, phần tử lại dãy a1, a2,…a i−1 b1, b2,…b j −1 có dãy chung lớn gồm độ dài L(i-1,j-1), L(i,j)=L(i-1,j-1) + (Tư tưởng quy hoạch động thể chỗ L(i,j) đạt max L(i-1,j-1) phải đạt max) Cịn ≠bj ta có lựa chọn: khơng xét phần tử so dãy a1, a2,…ai-1 với dãy b1, b2,…bj để dãy chung dài L(i-1,j) phần tử; không xét phần tử bj so dãy a1, a2,…ai với dãy b1, b2,…bj-1 để dãy chung dài L(i,j-1) phần tử (Chú ý định nghĩa L(i-1,j) L(i,j-1)) Vì có lựa chọn nên ta chọn hướng tốt hơn, L(i,j)=max(L(i-1,j) , L(i,j-1)) Các bạn băn khoăn trường hợp lựa chọn tình chứ? Thực chất khơng cần vậy, dễ thấy L(i,j)≤ min(i,j) L(i-1,j-1) + chắn không nhỏ L(i-1,j) L(i,j-1) Sau tính xong tồn L(i,j) ta được: dãy C có L(n,m) phần tử, để xác định phần tử ta lần vết L theo trường hợp để tìm cặp ai=Bj chọn Các bạn xem chương trình cài đặt cụ thể TP: {$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q+,R+,S+,T-,V+,X+} program daycon; const inp = ’daycon.in0’; out = ’daycon.out’; max = 100; type mang1 = array[0 max] of integer; mang2 = array[0 max] of mang1; var n,m,z : integer; a,b,d : mang1; L : mang2; (*****************************************) procedure nhap; var i : integer; f : text; begin assign(f, inp); reset(f); readln(f, n, m); for i := to n read(f,a[i]); readln(f); for i := to m read(f,b[i]); close(f); end; (*****************************************) procedure trace; var i,j : integer; begin i := n; j := m; z := L[n,m]; repeat if L[i,j] = L[i-1,j-1] + then begin d[i] := 1; i := i - 1; j := j - 1; end else if L[i,j] = L[i-1,j] then i := i - else j := j - 1; until (i=0) or (j=0) end; (*****************************************) procedure qhd; var i,j : integer; function max(a,b : integer): integer; begin if a > b then max := a else max := b; end; begin for i := to n begin for j := to m if a[i] = b[j] then L[i,j] := L[i-1,j-1] + else L[i,j] := max(L[i-1,j],L[i,j-1]); end; end; (*****************************************) procedure xuly; begin qhd; trace; end; (*****************************************) procedure inkq; var f : text; i : integer; begin assign(f, out); rewrite(f); writeln(f, z); for i := to n if d[i] = then write(f,’ ’,a[i]); close(f); end; (*****************************************) begin nhap; xuly; inkq; end Thuật toán có thời gian thực thi cỡ O(n2) Với n,m =100 chương trình chạy chớp mắt Vậy không thử giải với n=1000 (ai mà không muốn chương trình mạnh hơn) Vậy ta sửa số max chương trình thành 1000 Và, TP báo lỗi "structure too large"!!! Tại lại thế??? Câu trả lời là: TP mơi trường lập trình 16 bit HĐH DOS có nhiều hạn chế Han chế thứ nhât kích thước biến kiểu &l; 64KB, có biến mảng kiểu mảng Đó dùng số 16 bit số hố 216 = 64K giá trị thơi Khi ta khai báo max = 1000 mảng L ta có kích thước 1000x1000x2 (2 kích thước kiểu integer)=2.106>>64K nên TP báo lỗi "structure too large" (kiểu cấu trúc lớn) Vậy thay khai báo mảng L mảng chiều, ta khai báo L thành nhiều mảng nhỏ Bạn thử mà xem Nếu TP khơng báo lỗi "structure too large" báo lỗi "too many varibles" Đó hạn chế thứ TP: tổng kích thước biến tồn cục (global) ≤ 64KB Bạn có chia L thành mảng TP bắt tổng kích thước chúng ≤ 64KB Vẫn cịn giải pháp nữa: thay dùng mảng tĩnh dùng mảng động Khai báo L mảng 1000 trỏ, trỏ trỏ đến mảng 1000 phần tử (L:Array[1 max] of ^mang1) May quá, TP không báo lỗi dịch Nhưng chạy thơi, lỗi "Heap overflow" (tràn heap) Nguyên nhân hạn chế DOS: toàn bộ nhớ DOS sử dụng ≤ 640 KB Mà chương trình hệ thống IDE TP chiếm 300KB Tức chương trình bạn dù có tận dụng hết nhó cịn lại 300KB (Khi bạn nhấn F9 để dịch, TP báo xxxKB free memory, phần heap tối đa hệ thống cấp phát cho biến động đó) Vẫn cịn nhiều giải pháp giải quyết: dùng mảng chiều tính lẫn đánh dấu lần vết bit; ghi file; dùng mảng lược… Nhưng dù giải pháp tình thế, lại phức tạp Giải pháp tốt dùng mơi trường lập trình mạnh Và IOI chọn FP Tơi đem chương trình với khai báo max =1000 chạy FP chuyện ổn, chẳng có lỗi xảy hết Đối với FP, nhớ không bị hạn chế số 64KB (free mà) Điều có nhờ đặc tính tuyệt vời FP: a FP mơi trường lập trình 32 bit Dùng số 32 bit số hố 232 = 4G giá trị, nên biến FP có kích thước 4GB Các bạn ý: 4GB=4x1024MB Trong máy tính thường dùng thường có chừng 128MB RAM Mảng L kích thước ≤ 2MB nhằm nhị b FP mơi trường lập trình chạy HĐH 32 bit (Windows, Linux, BeOS, OS/2… DOS Nhưng phiên DOS 32 bit mở rộng) Đây điều quan trọng Vì cho FP chạy DOS 16 bit (nếu có chạy được), với nhớ chật hẹp 640KB, FP phải bó tay khơng phát huy tài Ngược lại TP 16 bit, nên có cho chạy Windows 32 bit, phát huy tài đến mức 16 bit mà thơi Chạy mơi trường 32 bit, ngồi RAM (đã nhiều), HĐH cịn có có chế nhớ ảo (virtual memory) sử dụng phần HĐ làm nhớ tạm nên FP cung cấp cho bạn dung lượng nhớ nói thoải mái (free mà) c FP tương thích hồn tồn với TP Đây điều thú vị Chương trình phàn viết TP, đem sang FP chạy ngon lành, sửa đổi hết (thực có sửa giá trị max từ 100 thành 1000) IDE FP giống hệt TP (tất nhiên có nhiều chức tiên tiến hơn, bạn làm với TP làm FP) Tôi nghĩ đủ để thay TP FP Nếu bạn băn khoăn, đợi viết để tìm hiểu tiếp điều kì diệu mà FP có cịn TP khơng Cịn bạn háo hức muốn dùng thử, làm theo dẫn cài đặt Cài đặt sử dụng FP a Tải cài đặt FP có nhiều phiên bản, phiên sử dụng thức phiên cịn phát triển Theo tơi bạn nên sử dụng phiên thức chúng ổn định (Tôi dùng phiên 1.0.6) Để cài đặt bạn vào website ISM (http://www.thnt.com.vn), thích đến thẳng website FP (http://www.freepascal.org), vào mục download tải file zip chứa cài Chú ý có nhiều phiên FP cho hệ điều hành khác nên bạn phải ý: - Tải cài phiên thức Các phiên thức có chữ số cuối số chẵn (như tơi 1.0.6, có nhiều rồi) - Tải cài cho HĐH Windows DOS Bạn nhận biết điều qua tên file zip Như file dosw32106full.zip, có nghĩa cài đầy đủ cho HĐH Windows DOS, phiên 1.0.6 b Unzip Install Sau tải cài (tất file zip), bạn unzip file folder chạy file Install.exe Giao diện cài đặt ra, yêu cầu bạn lựa chọn thư mục cài đặt cho FP (mặc định C:PP) Và bảng lựa chọn cấu hình cài đặt Theo tơi bạn nên chọn cấu hình mặc định, đơn giản nhấn Enter để cài tự làm việc c Chạy cấu hình IDE Sau cài xong, tồn IDE, chương trình dịch, tài liệu, ví dụ,… FP copy vào thư mục bạn chọn cài đặt (mặc định C:PP) Có cho Windows DOS (32bit) Nếu dùng FP thay TP học tập theo tơi bạn nên sử dụng cho DOS Vì qua sử dụng tơi thấy IDE FP DOS hoạt động ổn định IDE FP Windows Để sử dụng IDE FP DOS, bạn vào thư mục bingo32v2 chạy file fp.exe (Có thể cần nhấn Alt-Enter để chương trình chạy tồn hình full screen Bạn thấy ngạc nhiên, chẳng ngạc nhiên lắm, giao diện IDE FP giống hệt TP (Tơi thấy ân tượng hơn, hình ảnh nền) Đến chuyện TP Nhưng để thuận tiện sử dụng, bạn nên thiết lập số thông số cấu sau: - Vào menu CompileTarget: chọn DOS (để nhấn Ctrl-F9 chương trình bạn chạy TP Vì compiler ta dùng chạy DOS mà Nhưng DOS 32 bit đấy, không hạn chế DOS 16 bit đâu) - Vào menu OptionsMode: chọn Normal (để FP hỗ trợ debug dễ chịu nhất) - Vào menu OptionsCompiler: tab Syntax bạn chọn mục: + TP/BP compatibily: để tương thích với TP (sau quen với FP khơng cần nữa, cịn chọn chức cho dễ sử dụng) + Stop after first error: bình thường FP dịch thông báo loạt lỗi (giống C, Delphi…), ta quen với việc thông báo lỗi gặp TP nên chọn mục cho thân thiện Sau khơng cần + C-like operators: điều thú vị FP (các bạn đón đọc kì sau nhé) tab Code generaion bạn chọn + Toàn mục phần Run-time checks: cho an toàn bạn ạ, tránh trường hợp ta lập trình sai như: truy cập ngồi mảng, tính tốn tràn số mà máy khơng thơng báo + Target processor: chọn PPro/PII Hầu hết máy máy Pen III, Pen IV, nên để FP tận dụng hết tiềm chúng để chương trình chạy hiệu - Vào menu OptionsEnviroimentEditor: đặt thông số soạn thảo mà bạn thích Tơi thường đặt mục sau: Các mục mà TP mặc định (và FP thế): + Insert mode: chế độ gõ chèn + Auto indent mode: đặt lề tự động + Backspace unindent + Tab size: Indent size: Những thơng số giúp chương trình dễ đọc (có cấu trúc, thẳng lề, đầu dòng thò thụt đặn theo khoảng cách kí tự) Syntax highlight: sáng từ khố (trong TP có) Persirtent block: khối sau đánh dấu hiển thị dùng lệnh ẩn khối Auto closing brackets: tự động thêm kí tự đóng ngoặc Đây điều đặc sắc khơng có TP Bình thuờng TP bạn gõ kí tự mở ngoặc (, [, { phải tự thêm kí tự đóng ngoặc cho Nếu khơng ý dễ lẫn Cịn FP đặt chức ta gõ kí tự mở ngoặc, FP thêm ln kí tự đóng ngoặc, khơng sợ lầm lẫn thừa thiếu đóng mở ngoặc Chúc bạn sảng khối khám phá tận hưởng điều thú vị FP Hẹn gặp lạ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 biết đặc tính tuyệt vời FP hỗ trợ nhớ rộng rãi Khơng có vậy, tìm hiểu tiếp điều thú vị khác FP Kiểu số nguyên lớn Có nhiều tốn cần phải tính tốn với số ngun lớn Chẳng hạn tính giai thừa, tính số Fibonacci hay tìm số ngun tố lớn (chẳng hạn tìm số nguyên tố lớn để dùng thuật toán mã hoá RSA) Với kiểu Integer TP ta tìm số nguyên tố lớn có chữ số Với kiểu LongInt chữ số Muốn tìm số to phải dùng kiểu số thực (như comp hay extended) Nhưng có điều bất tiện kiểu số thực khơng dùng phép tốn div, mod nên cài đặt khó khăn Ngồi tốn tìm số nguyên tố lớn, với toán khác tính giai thừa, tính số Fibonacci,… kiểu integer TP hạn chế Một hạn chế thứ hai với kiểu integer TP hay gặp lỗi tính tốn số học (Khơng biết bạn có đặt {$Q+} để phát lỗi chưa) Lỗi tính tốn số học xảy tính biểu thức có hạng tử miền integer kết nằm miền (chẳng hạn 30000 + 30000) Những lỗi thường ta để ý, phiền tối Sửa chúng khơng khó lắm, cần chuyển đổi kiểu (thành LongInt hay Real) OK Với FP hạn chế khơng thành vấn đề Với lợi 32 bit (gấp đôi TP), FP cung cấp kiểu Int64, nghe bạn đoán kiểu số nguyên 64 bit Với Int64 bạn tìm số ngun tố 18 chữ số (cỡ tỉ tỉ) hay tính giai thừa 20 (Nếu muốn ta phải xây dựng riêng kiểu BigInt, ta làm điều phần sau) Trong trường hợp muốn tiết kiệm nhớ, ta sử dụng kiểu Byte (kích thước byte), SmallInt (kích thức byte) Bảng sau trình bày kiểu nguyên FP: Chú ý: với kiểu Integer, mặc định FP dùng kích thước byte Vì muốn dùng kiểu nguyên lớn, ta nên khai báo rõ ràng Kiểu string lớn Khi lập trình, nhiều lần gặp vấn đề với xâu tối đa 255 kí tự TP (chẳng hạn toán xâu đối xứng, toán đếm từ…) Ta giải vấn đề mảng kí tự (array of char) ta lại khơng thể dùng phép tốn xâu mạnh Pascal Khơng có cải tiến kiểu nguyên, kiểu string FP tuyệt vời String FP khơng cịn hạn chế 255 kí tự TP mà có kích thước tối đa tỉ kí tự Hơn FP cịn hỗ trợ kiểu xâu Unicode (WideString) Nếu bạn thích kiểu String cũ TP, bạn dùng kiểu ShortString Bây bạn viết chương trình giải xâu đối xứng, xâu chung với kiểu string FP hạn chế n cỡ 1000 cách dễ dàng Chúng ta tìm hiểu kĩ xâu FP báo khác Viết hàm thuận lợi FP có nhiều cải tiến cách viết hàm Để so sánh, xem xét số ví dụ Trong TP, viết hàm tính giai thừa sau: function gt(n:integer):integer; var i,tg:integer; begin tg:=1; for i:=1 to n tg:=tg*i; gt:=tg; end; Tại ta lại phải thêm biến tg để lưu trữ kết trung gian? Đó TP với tên hàm ta sử dụng lệnh gán trị Nếu đưa tên hàm vào biểu thức thực lời gọi hàm Điều FP làm cho free cách cho phép sử dụng tên hàm biến (giống Object Pascal dùng biến Result) Khi tên hàm xuất cách biểu thức tính tốn thân hàm mà không tạo lời gọi đệ quy Hàm giai thừa FP viết tiết kiệm biến sau: function Gt(n: integer): int64; begin gt := 1; for n := n downto gt := gt * n; end; Vậy ta muốn gọi đệ quy sao? Thì việc thêm cặp dấu () truyền tham số cần thiết FP biết ta muốn gọi đệ quy ta có thêm cặp () Hàm giai thừa viết kiểu đệ quy sau: function Gt(n: integer): int64; begin if n=0 then exit(1) else exit(n*gt(n-1)); end; Trong cách viết ta thấy điều tiện lợi FP: dùng lệnh exit để trả lại kết cho hàm (giống C Object Pascal sử dụng lệnh return) Bạn thấy tiện lợi cách viết viết hàm dạng " phát phần tử thốt" Chẳng hạn hàm tìm vị trí phần tử x mảng a có n phần tử Viết TP ta phải viết sau: function Find(x: integer): integer; Var i : integer; begin for i := to n if a[i] = x then begin Find := i; exit; end; Find := 0; end; Hàm viết FP ngắn nhiều: function Find(x: integer): integer; Var i : integer; begin for i := to n if a[i]=x then exit(i); exit(0); end; Kết trả lại hàm kiểu cấu trúc Rất nhiều ngơn ngữ lập trình thơng dụng C, VB… cho phép kết trả lại hàm kiểu sở như: số ngun, số thực, kí tự, trỏ… Riêng TP có thêm kiểu xâu kí tự Nếu muốn trả lại kết kiểu cấu trúc mảng hay ghi bạn có cách dùng tham biến thơi Một số NNLT hướng đối tượng C++, Java, Object Pascal có cho phép kết trả lại đối tượng, không free FP: FP cho phép kết hàm kiểu cấu trúc Để hiểu làm toán sau (Đề thi OLP2004): Gọi X tập tất xâu nhị phân khơng có bit liền Các xâu đánh thứ tự theo trình tự sinh (từ nhỏ đến lớn, bit đứng trước bit 1) Chẳng hạn với n=5 ta có xâu sau: Bài tốn đặt ra: xác định xâu nhị phân n bit ứng với số thứ tự m cho trước Hạn chể: n L[n-1] định bit thứ n phải (vì thứ tự xâu có bit đứng trước xâu có bit 1, có L[n-1] xâu có bit thứ n bit 0) Xâu n-1 bit lại có thứ tự m-L[n-1] Ngược lại bit thứ n bit xâu n-1 bit cịn lại có thứ tự m Do ta làm sau: for i:=n downto if m

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: Xem tại trang 7 của tài liệu.
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: Xem tại trang 17 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan