Một số ưu điểm của ngôn ngữ Free Pascal so với Turbo Pascal - Pdf 25

Đề tài :
“MỘT SỐ ƯU ĐIỂM CỦA NGÔN NGỮ LẬP TRÌNH FREE PASCAL SO VỚI
TURBO PASCAL”
A. PHẦN MỞ ĐẦU
I. LÝ DO CHỌN ĐỀ TÀI
Ngày nay, cùng với sự phát triển của tin học ở Việt Nam nói chung và trên thế
giới đang diễn ra quá trình tin học hoá nói riêng đặc biệt trên nhiều lĩnh vực hoạt
động của xã hội loài người và đem lại nhiều hiệu quả to lớn.
Sự phát triển mạnh mẽ như “ vũ bão ” của tin học đã làm cho xã hội có nhiều
nhận thức mới về cách tổ chức các hoạt động. Nhiều quốc gia trên thế giới ý thức
được rất rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc
biệt trong giáo dục nâng cao dân trí về tin học và đào tạo nguồn nhân lực có chất
lượng cao. Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì
thế chúng ta hi vọng có thể sớm hoà nhập với khu vực và trên thế giới.
Nước ta đã nhận thấy được tầm quan trọng của ngành Tin học và đã đưa môn
học này vào nhà trường phổ thông như những môn khoa học khác bắt đầu từ năm học
2006-2007. Và tổ chức các cuộc thi học sinh giỏi môn Tin học cấp tỉnh, cấp quốc gia.
Hiện nay tại tỉnh Thanh Hóa các kỳ thi học sinh giỏi cấp tỉnh thường cho học
sinh lập trình trên 2 ngôn ngữ lập trình là Turbo Pascal và Free Pascal. Trong quá
trình ôn luyện đội tuyển học sinh giỏi của môn Tin học của trường tôi nhận thấy một
số ưu điểm của ngôn ngữ lập trình Free Pascal so với ngôn ngữ lập trình Turbo
Pascal.
Từ lí do trên, tôi xin trình bày sáng kiến kinh nghiệm “MỘT SỐ ƯU ĐIỂM
CỦA NGÔN NGỮ LẬP TRÌNH FREE PASCAL SO VỚI TURBO PASCAL”
II. MỤC ĐÍCH CỦA ĐỀ TÀI
Trong chương trình tin học THPT do số lượng tiết học han chế (52 tiết) về
kiến thức lập trình vì vậy khi giải quyết các bài toán có kiểu dữ lớn thường rất khó
khăn. Với ưu điểm là ngôn ngữ lập trình trên môi trường 32 bít (64 bít) ngôn ngữ lập
trình Free pascal cố thể giải quyết một số bài toán theo cách lập trình thông thường
của học sinh mà Turbo Pascal không giải quyết được.
1

Khi gặp bài toán này thông thường học sinh THPT thường khai báo dữ liệu
kiểu mảng để lưu trữ dãy A gồm N số nguyên đọc từ tệp. sau đó các em sẽ dùng 2
vòng lặp: 1 vòng cho chạy từ i:=1 đến n-1 và một vòng cho chạy từ j:=i+1 tới n để
kiểm tra có tồn tại hay không 1 cặp số mà trung bình cộng của chúng bằng K.
Program BAI1;
Const Input= 'Bai1.Inp';
3
Output='Bai1.out';
MaxN=50000;
Var A:Array[1 MaxN]of integer;
N:longint;
K:integer;
{=====================================================}
Procedure Khoi_Tao_Va_Doc_Du_Lieu;
Var f:text;
i,so:integer;
Begin
{Doc du lieu}
Assign(f,input);reset(f);
Readln(f,n,k);
for i:=1 to n do
Begin
Read(f,so);
A[i]:= so;
End;
close(f);
End;
{=====================================================}
Procedure Process;
Var f:text;

thông thường được khi chạy trên Ngôn ngữ lập trình Turbo Pascal sẽ báo lỗi: Error
22: Structure too large. Tại sao lại thế? 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 dữ liệ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 2
16
= 64K giá trị thôi. Khi ta khai báo max =
50000 thì mảng A của ta có kích thước 50000x2 (2 là kích thước kiểu integer) =10
5
>
64K nên TP báo lỗi "structure too large" (kiểu cấu trúc quá lớn) là đúng rồi. Vậy bây
giờ thay vì khai báo mảng A là 1 mảng, ta sẽ khai báo A thành rất nhiều mảng nhỏ
5
hơn. Khi đó nếu TP không báo lỗi "structure too large" thì cũng báo lỗi là "too many
varibles". Đó là do hạn chế thứ 2 của TP: tổng kích thước các biến toàn cục
(global) cũng ≤ 64KB . Ta có chia A thành bao nhiêu mảng con thì TP vẫn bắt tổng
kích thước của chúng ≤ 64KB. (Tuy nhiên để giải quyết bài toán 1 trên ngôn ngữ lập
trùng Turbo Pascal ta có nhiều cách để xử lý. Ví dụ như: Vì 0<ai<5000 nên ta khai
báo một mảng các bj gồm 4999 phần tử, mỗi phần tử là một số nguyên dương (kiểu
word). Phần tử bj=0 nếu không tồn tại i sao cho j=ai với mọi i=1 N, bj=k nếu tồn
tại k số i sao cho j=ai.
Với cách làm này ta có thể dùng một mảng kích thước 4999x2=9998 byte để
lưu một mảng có kích thước tối đa 50000x2=100000 byte. Như vậy ta đã giải quyết
được vấn đề vượt qua giới hạn bộ nhớ 64KB tối đa dành cho các chương trình chạy
trên MS-DOS).
Khi đem chương trình trên với khai báo max =500000 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. Điều đó có được là nhờ những đặc tính tuyệt vời của FP:
1. FP là môi trường lập trình 32 bit(64 bít). Dùng một số 32 bit thì có thể chỉ số
hoá được 2

những hạn chế đó không thành vấn đề. Với lợi thế 32 bit (gấp đôi TP), FP 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ừa
của 20.
5. 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 string củ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ề lợi thế kiểu xâu trong Free Pascal bài toán sau.
7
Bài toán 2: Xâu FIBONACI (Bài 3 đề thi chọn đội tuyển HSG quốc gia năm học
2008 - 2009).
Cho 3 xâu khác rỗng SA, SB, SR, trong đó độ dài của các xâu SA và SB không
vượt quá 10, độ dài xâu SR không vượt quá 15. Dãy xâu F
0
,F
1
, F
2
, , F
n
được xây
dựng theo qui tắc sau: F
0
=SA, F

var sa,sb,sr,tam: string;
fi,fo:text;
st: array[0 35] of ansistring;
kq:ansistring;
i,n:longint;
8
dem:int64;
procedure docdl;
begin
assign(fi,'bai3.in6'); reset(fi);
readln(fi,n);
readln(fi,SA);
readln(fi,SB);
readln(fi,SR);
close(fi);
end;
procedure ghidl(kqd:int64);
Begin
assign(fo,'Bai3.ou6');
rewrite(fo);
writeln(fo, kqd);
close(fo);
end;
procedure xuly;
begin
st[0]:=sa; st[1]:=sb;
for i:=2 to n do st[i]:=st[i-1]+st[i-2];
kq:=st[n];
for i:=1 to length(st[n])-length(sr) do
begin

như sau:
function Gt(n: integer): int64;
10
begin
gt := 1;
for n := n downto 2 do gt := gt * n;
end;
Vậy khi ta muốn gọi đệ quy thì sao? Thì chỉ việc thêm cặp dấu () và truyền tham số
cần thiết. FP sẽ biết ta muốn gọi đệ quy khi ta có thêm cặp (). Hàm giai thừa viết kiểu
đệ quy như 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 này ta còn thấy một điều tiện lợi của FP: dùng
lệnh exit để trả lại kết quả cho hàm (giống như C và Object Pascal sử dụng lệnh
return). Bạn sẽ thấy sự tiện 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;
Var i : integer;
begin
for i := 1 to n do
if a[i] = x then
begin
Find := i; exit;
end; Find := 0;
end;
Hàm này viết trong FP thì ngắn ngọn hơn nhiều:
Function Find(x: integer): integer;
Var i : integer;
begin
for i := 1 to n do
if a[i]=x then exit(i);


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status