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

12 2,477 3
  • Loading ...
    Loading ...
    Loading ...

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

Tài liệu liên quan

Thông tin tài liệu

Ngày đăng: 21/03/2015, 10:02

Đề 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 III. NHIỆM VỤ VÀ PHƯƠNG PHÁP NGHIÊN CỨU Viết sáng kiến kinh nghiệm thường xuyên liên tục cũng là nhiệm vụ chính trị của mỗi giáo viên, nhưng cần phải lựa chọn phương pháp nghiên cứu thích hợp với nhà trường trung học phổ thông. Sáng kiến kinh nghiệm đang trình bày của tôi dựa theo các luận cứ khoa học hướng đối tượng, cụ thể: thuyết trình, quan sát, điều tra cơ bản, phân tích kết quả thực nghiệm sư phạm,v.v… phù hợp với bài học và môn học . 2 B. PHẦN NỘI DUNG I. Cơ sở lí luận: Khi học sinh học chương trình Tin học lớp 11. Các em được tiếp cận các khái niệm về lập trình và ngôn ngữ lập trình. Và có thể sử dụng một ngôn ngữ lập trình cụ thể để giải quyết các bài toán. Nhưng do mục đích, ưu cầu của chương trình tin học 11 không yêu các em giải quyết các bài toán phức tạp như các toán trong chương trình thi học sinh giỏi vì vậy khi gặp các bài toán cần phải xử lý số lớn các em thường không xử lý được hết các Test mà đề bài yêu cầu ví dụ như trong một số bài toán sau: II. Nội dung và giải pháp thực hiện: Trong SKKN tôi đưa ra một số bài toán với kiểu dữ liệu lớn mà khi học sinh THPT giải quyết trên ngôn ngữ lập trình Turbo Pascal đường gặp những khó khăn nhưng khi giải quyết trên Free Pascal thì vấn đề được giải quyết khá đơn giản. Bài toán 1: Trung bình cộng (đề thi học sinh giỏi năm 2008-2009) Cho dãy gồm N số nguyên a1, a2, , aN và số nguyên K. Yêu cầu: Cho biết trong dãy số đã cho có tồn tại hay không một cặp số mà trung bình cộng của chúng là K. Dữ liệu: Vào file văn bản BAI2.INP: - Dòng đầu ghi 2 số N và K. - Dòng tiếp theo lần lượt ghi N số a1, a2, , aN. Kêtq quả: Ra file văn bản BAI2.OUT: - Số 1 nếu tồn tại một cặp số thoả mãn yêu cầu bài toán. - Số 0 nếu không tồn tại cặp số nào thoả mãn yêu cầu bài toán. Giới hạn: 0<N<50000; |K|,|ai|<1000 với mọi i=1 n. 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; i,j:integer; kt:boolean; Begin kt:=false; i:= 1 ; while (not kt)and(i<=n-1) do Begin 4 j:= i+1; while (not kt)and(j <= n) do Begin If (A[i]+A[j])/2=K then kt:=true; j:=j+1; End; i:=i+1; End; {Xuat ket qua} Assign(f,output);Rewrite(f); if kt then Writeln(f,1) else writeln(f,0); Close(f); End; {=====================================================} Begin Khoi_Tao_Va_Doc_Du_Lieu; Process; End. Nhưng khi giải quyết bài toán này trên ngôn ngữ lập trình Turbo Pascal sẽ gặp phải vấn đề như sau: Vấn đề thường mắc với học sinh THPT là đọc dãy ai vào một mảng nhưng số lượng phần tử ai quá lớn (N lớn) do đó không thể lưu trữ bằng một mảng 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 32 = 4G giá trị, vậy nên biến trong FP có thể có kích thước 4GB. Ta thấy: 4GB=4x1024MB. Trong khi đó máy tính chúng ta thường dùng thường có chừng 2GB RAM. Mảng A kích thước ≤ 2MB là quá nhỏ. 2. 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. 6 3. 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 ở trên ta viết trong TP, đem sang FP vẫn chạy bình thường, không cần phải sửa đổi gì hết. 4. 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. 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 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 1 =SB, F k+1 =F k-1 +F k ; k=1,2, ,n-1; 1 < n ≤ 35. Yêu cầu: Xác định số lần xuất hiện của SR trong F N . Dữ liệu: Vào từ file văn bản BAI3.INP: • Dòng đầu tiên chứa số nguyên dương n. • Ba dòng tiếp theo chứa các xâu SA, SB, SR, mỗi xâu trên một dòng. Kết quả: Đưa ra file văn bản BAI3.OUT chứa số lần xuất hiện tìm được. Ví dụ: BAI3.INP BAI3.OUT 6 A B BAB 4 Khi giải quyết bài toán nay trong Turbo pascal thì đối với học sinh THPT sẽ gặp rất nhiều khó khăn vì kiểu dữ liệu xâu trong Turbo Pascal chỉ có tối đa 255 kí tự với yêu cầu của bài toán trên thì xâu F n sẽ có độ dài rất lớn. Nhưng khi đem bài toán này giải quyết trên Free Pascal thì có thể giải quyết khá đơn giản với kiểu dữ liệu Ansistring (kiểu dữ liệu xâu lớn). uses crt; 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 tam:=''; if kq[i]=sr[1] then begin 9 tam:=copy(kq,i,length(sr)) ; if tam=sr then dem:=dem+1; end; end; ghidl(dem); end; begin docdl; xuly; end. 6. 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: function gt(n:integer):integer; var i,tg:integer; begin tg:=1; for i:=1 to n do tg:=tg*i; gt:=tg; end; 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; 10 [...]... mang tính thực tiển cụ thể là:Trong các kỳ thi học sinh giỏi việc học sinh hiểu rỏ các ưu điểm của các ngôn ngữ lập trình giúp các em giải quyết tốt hơn các bài toán Thanh Hóa, Ngày 10 tháng 05 năm 2013 XÁC NHẬN Tôi xin cam đoan đây là sáng kiến kinh nghiệm CỦA THỦ TRƯỞNG ĐƠN VỊ của mình viết, không sao chép nội dung của người khác Nguyễn Ngọc Huân 12 ... () 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... end; 11 III PHẦN KẾT LUẬN Tin học nói chung đóng vai trò hết sức quan trọng trong xã hội hiện đại, tin học đã làm thay đổi nhận thức của con người và ứng dụng trong hầu hết các hoạt động của xã hội loài người Trong đó, đại diện là máy tính điện tử và khoa học xử lí dữ liệu của máy tính điện tử Để tin học ngày càng phát triển mạnh thì việc tạo ra các phần mềm máy tính tốt để xử lý công việc giúp con ngườ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 . 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 ĐỀ. 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. Đề 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
- Xem thêm -

Xem thêm: Một số ưu điểm của ngôn ngữ Free Pascal so với Turbo Pascal, Một số ưu điểm của ngôn ngữ Free Pascal so với Turbo Pascal, Một số ưu điểm của ngôn ngữ Free Pascal so với Turbo Pascal