NỘI DUNG
Cơ sở lí luận
Pascal, được phát triển bởi Niklaus Wirth dựa trên ngôn ngữ Algol vào năm 1970, mang tên nhà toán học và triết gia Pháp Blaise Pascal Ngôn ngữ này vẫn được sử dụng rộng rãi trong giảng dạy lập trình tại nhiều trường trung học và đại học trên toàn thế giới, nhờ vào khả năng mô tả thuật toán một cách thuận tiện.
Trong chương trình tin học lớp 11, học sinh sẽ được làm quen với ngôn ngữ lập trình Pascal, trong đó kiểu tệp văn bản là một nội dung quan trọng Tệp văn bản chứa dữ liệu dưới dạng các ký tự mã ASCII, với mỗi dòng kết thúc bằng ký tự xuống dòng hoặc ký tự kết thúc tệp Dữ liệu thuộc các kiểu đã học được lưu trữ trong bộ nhớ RAM, do đó sẽ bị mất khi tắt máy Đối với những bài toán có khối lượng dữ liệu lớn cần lưu trữ để xử lý nhiều lần, việc sử dụng kiểu tệp là cần thiết Sử dụng thành thạo kiểu tệp trong lập trình không chỉ mang lại lợi ích lớn mà còn là kỹ năng quan trọng cho học sinh.
Qua quá trình tìm hiểu từ sách giáo khoa tin học 11, sách giáo viên tin học
Trong quyển "Phương pháp giải các bài toán trong tin học" của thạc sĩ Trần Đức Huyên, tôi sẽ trình bày những kiến thức cơ bản về kiểu tệp văn bản Những kiến thức này nhằm hỗ trợ học sinh trong quá trình thực hành giải các bài toán đơn giản liên quan đến kiểu dữ liệu này.
2.1.2.1 Khai báo kiểu tệp văn bản
Khai báo biến tệp để sau đó có thể thực hiện các thao tác với tệp thông qua biến tệp
Cú pháp khai báo: var : text;
Trong lập trình, việc thao tác với tệp dữ liệu trên đĩa không diễn ra trực tiếp mà thông qua biến tệp Gắn tên tệp với biến tệp thực chất tạo ra một tham chiếu giữa tệp trên đĩa và biến tệp trong chương trình, giúp biến tệp trở thành đại diện cho tệp đó.
Cú pháp: assign(, );
Giáo viên cần nhấn mạnh tầm quan trọng của việc gắn tên tệp cho học sinh Tên tệp là một chuỗi ký tự hoặc giá trị của biểu thức kiểu chuỗi, giúp hệ điều hành xác định tệp Tất cả các phép toán trên biến tệp đều ảnh hưởng đến tệp đó Sau khi gọi thủ tục asign, liên kết giữa biến tệp và tệp sẽ chỉ kết thúc khi có một lệnh asign khác gán biến tệp này cho một tên tệp mới Tên tệp có thể bao gồm đường dẫn đến ổ đĩa, danh sách thư mục được phân cách bởi dấu "\" và kết thúc bằng tên tệp.
Tên tệp trong hệ thống có độ dài tối đa là 79 kí tự Khi tên tệp là xâu rỗng (độ dài bằng 0), biến tệp sẽ được gán cho tên tệp vào/ra chuẩn Các tệp vào ra chuẩn được xác định dựa vào sự mở rộng của từng chương trình dịch Pascal, thường thì tệp input chuẩn là bàn phím và tệp output chuẩn là màn hình.
Trước khi ghi dữ liệu vào tệp, cần sử dụng thủ tục mở tệp để thực hiện việc ghi Thủ tục này được gọi sau khi đã chỉ định tên tệp Cú pháp thực hiện là: rewrite();
Khi thực hiện thủ tục rewrite (), nếu tệp cần ghi dữ liệu chưa tồn tại trong thư mục gốc của ổ đĩa, tệp mới sẽ được tạo với nội dung rỗng theo tên đã xác định Ngược lại, nếu tệp đã có, nội dung cũ sẽ bị xóa để chuẩn bị cho việc ghi dữ liệu mới.
Ví dụ: assign(f,‟e:\tong2so.doc‟); rewrite(f);
2.1.2.4 Ghi dữ liệu vào tệp
Việc ghi dữ liệu vào tệp giống như ghi dữ liệu ra màn hình Câu lệnh dùng thủ tục ghi có dạng:
Write(,); hoặc
Writeln(,);
Danh sách kết quả trong thủ tục write bao gồm một hoặc nhiều phần tử, với phần tử có thể là biến đơn, biểu thức số học, quan hệ, lôgic hoặc hằng xâu Nếu có nhiều phần tử, chúng được ngăn cách bằng dấu phẩy Khi hai kết quả số liền nhau, cần chèn một hằng ký tự dấu cách giữa chúng, ví dụ: write(f, x, „ „, y) Trước khi thực hiện thủ tục này, tệp tương ứng với biến tệp f phải được mở Thủ tục write sẽ ghi các kết quả vào tệp bắt đầu từ vị trí hiện tại của con trỏ tệp.
2.1.2.5 Ghi thêm dữ liệu vào tệp đã có nội dung Đây là một nội dung mới không được đề cập trong chương trình sách giáo khoa nhưng tôi nghĩ nó thật sự cần thiết trong nhiều tình huống cụ thể Để ghi thêm dữ liệu vào tệp đã có nội dung ta dùng thủ tục append có cú pháp: append();
Sau khi gọi thủ tục append thì tệp sẽ sẵn sàng để ghi dữ liệu mới vào
Lưu ý rằng trong một chương trình, khi muốn ghi thêm dữ liệu, không thể sử dụng đồng thời thủ tục rewrite và append Việc sử dụng thủ tục rewrite sẽ dẫn đến việc xóa nội dung tệp đã có, do đó mục đích ghi thêm dữ liệu mới sẽ không đạt được như mong muốn.
Câu lệnh sử dụng thủ tục reset mở tệp văn bản đã tồn tại để đọc dữ liệu
Cú pháp: reset();
Trong cú pháp, biến tệp cần phải được gán với một tên tệp thông qua lệnh asign Nếu tệp không tồn tại, việc thực hiện reset sẽ gây ra lỗi Nếu tệp đã được mở, nó sẽ được đóng lại và sau đó mở lại Sau khi gọi lệnh reset, vị trí con trỏ tệp sẽ trở về đầu tệp.
2.1.2.7 Đọc dữ liệu từ tệp
Cú pháp đọc tệp văn bản:
Read(, );
Readln(, );
Ví dụ: read(f, x, y); hoặc readln(f, x, y);
Thủ tục read ghi xong con trỏ tệp không xuống dòng tiếp theo, thủ tục readln ghi xong con trỏ tệp xuống đầu dòng tiếp theo
Danh sách biến bao gồm một hoặc nhiều tên biến đơn, được phân cách bởi dấu phẩy Dữ liệu đọc từ tệp phải tương ứng với kiểu của các biến trong danh sách; nếu không, chương trình sẽ gặp lỗi Lỗi thường xảy ra khi biến có kiểu số nhưng dữ liệu đọc được lại là kiểu xâu.
Ví dụ: tệp docdulieu.txt chỉ có một dòng là tin hoc 11 Xét chương trình
Var f: text; s: string[6]; x: longint; begin assign(f, ‘doc.txt’); reset(f); read(f, s, x); writeln(s); writeln(x); readln end
Chương trình gặp lỗi "Invalid numeric format" khi đọc dữ liệu, cụ thể là khi biến s nhận giá trị "tin ho" Lỗi xảy ra khi cố gắng đọc giá trị cho x, vì ký tự 'c' không phải là dạng số Để khắc phục, nếu thay đổi khai báo của s thành string[7] hoặc string[8], chương trình sẽ không gặp lỗi khi đọc tệp và kết quả hiển thị trên màn hình sẽ chính xác.
Khi sử dụng biến kiểu xâu, thủ tục read sẽ tiếp nhận các ký tự trên một dòng và lưu trữ vào biến, loại trừ các ký tự đánh dấu kết thúc dòng hoặc tệp Số ký tự được đọc vào biến xâu sẽ tương ứng với độ dài đã được khai báo của biến đó.
Thực trạng vấn đề nghiên cứu
Trường THPT Ngã Năm, nằm ở vùng nông thôn tỉnh Sóc Trăng, đối mặt với thách thức khi hầu hết học sinh không có máy tính cá nhân, dẫn đến việc học tin học chủ yếu diễn ra tại phòng máy của trường Điều này ảnh hưởng đến khả năng tự rèn luyện và kiến thức tin học của các em Đặc biệt, học sinh lớp 11 gặp khó khăn trong việc học Pascal, với chỉ một số ít học sinh yêu thích và thành thạo môn học này qua các năm giảng dạy.
Qua khảo sát các lớp học, phần lớn học sinh chưa biết cách viết chương trình đơn giản để ghi và đọc dữ liệu từ tệp Các em chỉ nắm được cú pháp khai báo, cách gắn tên tệp và các thao tác với tệp, nhưng không thể hệ thống hóa thành một chương trình hoàn chỉnh.
- Thời lượng phân phối chương trình không đủ để vừa cho học sinh học lý thuyết và thực hành ngay sau đó;
Nội dung sách giáo khoa thiếu bài tập thực hành cho chương trình này và không đề cập đến các yếu tố cần thiết để một chương trình có thể sử dụng kiểu tệp chạy trên máy.
Phần mở rộng của các tệp ghi trong sách giáo khoa có thể gây khó khăn cho học sinh, khiến họ không biết cách kiểm tra kết quả ngay cả khi chương trình đã chạy thành công.
- Thiếu kiến thức căn bản để viết một chương trình đơn giản;
- Không có niềm đam mê dành cho môn học.
Biện pháp tiến hành
Giáo viên cung cấp kiến thức cơ bản về kiểu tệp văn bản trong Pascal, như đã trình bày trong phần cơ sở lý luận Do bài học có nhiều nội dung mới, học sinh có thể gặp khó khăn trong việc theo kịp Vì vậy, giáo viên đã chuẩn bị một bản sao tài liệu cho mỗi học sinh.
Sau khi hoàn thành phần lý thuyết, giáo viên phát phiếu bài tập thực hành kiểu tệp văn bản cho học sinh Do học sinh chưa có kinh nghiệm với kiểu dữ liệu này, giáo viên nhắc lại kiến thức và khuyến khích học sinh xem lại lý thuyết Giáo viên đặt ra các câu hỏi gợi mở và yêu cầu học sinh so sánh những vấn đề dễ gây nhầm lẫn Trong quá trình thực hành, học sinh cần ghi lại kết quả vào phiếu bài tập sau mỗi bài hoàn thành Biện pháp hướng dẫn thực hành được triển khai một cách cụ thể để hỗ trợ học sinh.
2.3.1 Ghi dữ liệu vào tệp 2.3.1.1 S o sánh thủ tục ghi dữ liệu ra màn hình và thủ tục ghi tệp
Học sinh có thể dễ dàng phân biệt hai thủ tục này bằng cách so sánh cú pháp Cả hai thủ tục đều sử dụng tên gọi là write hoặc writeln và có các phần tử trong danh sách kết quả giống nhau Tuy nhiên, thủ tục ghi tệp có thêm biến tệp, điều này tạo ra sự khác biệt giữa chúng.
Giáo viên cần nhấn mạnh rằng để ghi dữ liệu vào tệp trên nhiều hàng, cần sử dụng thủ tục writeln, giúp xuống dòng sau khi ghi xong Việc này tương tự như cách ghi dữ liệu ra màn hình Để làm rõ hơn về việc gắn tên tệp và so sánh giữa ghi dữ liệu ra màn hình và ghi vào tệp, tôi đã đưa ra một số ví dụ cụ thể.
Hãy viết một chương trình bằng ngôn ngữ Pascal để tính tổng của hai số Chương trình này sẽ hiển thị kết quả trên màn hình và đồng thời ghi lại hai số nhập từ bàn phím cùng với tổng của chúng vào một tệp tin.
Giáo viên hướng dẫn học sinh viết chương trình nhập hai số từ bàn phím, tính tổng và hiển thị kết quả Sau đó, học sinh sẽ bổ sung các câu lệnh để lưu trữ giá trị của hai biến đã nhập và kết quả tổng.
Giáo viên cần kiểm tra tệp đã ghi, cụ thể là tệp tong2so.doc, để xác nhận nội dung đã được lưu trữ đúng cách Đồng thời, giáo viên yêu cầu học sinh so sánh nội dung trong tệp với thông tin hiển thị trên màn hình.
The Pascal program named "tong2so" prompts the user to enter two integers, a and b, then calculates their sum, x It displays the result on the screen and also saves the input values along with the sum to a text file named "tong2so.doc" located in the E: drive The program uses the CRT unit for screen manipulation and ensures proper file handling by assigning, rewriting, and closing the file after writing the data.
Kết quả sau khi thực hiện chương trình
Nội dung được ghi vào tệp „e:\tong2so.doc‟
Như vậy, nếu muốn ghi nhiều dòng dữ liệu vào tệp thì cứ thêm thủ tục Writeln(,);
2.3.1.2 Ghi vào tệp tất cả dữ liệu của các lần thực hiện chương trình
GV đặt ra cho các em các vấn đề sau:
- Nội dung cần ghi của các lần thực hiện chương trình có lần lượt được ghi vào tệp không? Tại sao?
Để ghi lại tất cả dữ liệu từ các lần thực hiện chương trình, cần tìm ra giải pháp cho học sinh, điều này không được đề cập trong sách giáo khoa Việc giải thích rõ ràng về cách ghi tệp sẽ giúp học sinh hiểu sâu hơn về quy trình này.
Do đó tôi nhận thấy giải quyết vấn đề này là thực sự cần thiết
Tệp chỉ lưu trữ kết quả của lần thực hiện chương trình cuối cùng, vì sau mỗi lần chạy, thủ tục rewrite(f) được gọi, dẫn đến việc nội dung cũ trên tệp bị xóa để chuẩn bị cho việc ghi dữ liệu mới.
Câu hỏi thứ hai cần được làm rõ là việc sử dụng kiểu tệp để lưu nội dung các lần thực hiện chương trình nhằm sử dụng sau này Tuy nhiên, kiến thức từ sách giáo khoa không đủ để giải quyết vấn đề này, vì vậy cần sự trợ giúp của giáo viên Để ghi thêm nội dung vào tệp, ta sử dụng thủ tục append(), thay thế cho thủ tục rewrite() Lưu ý rằng thủ tục append() chỉ có thể thay thế thủ tục rewrite() sau khi chương trình đã thực hiện ít nhất một lần với rewrite() để máy tính khởi tạo tệp cần ghi.
The program "tong2sonhapthem" records all data from its executions into a file It prompts the user to input two integers, calculates their sum, and displays the result The program then assigns a text file located at 'e:\tong2so.doc' and appends the input values along with their sum to this file Finally, it closes the file before terminating.
Kết quả thực hiện chương trình ở lần muốn ghi thêm dữ liệu:
Kết quả ghi tệp (sau 2 lần thực hiện chương trình):
Từ nay, để ghi thêm dữ liệu, bạn chỉ cần thực hiện chương trình một lần nữa Với kiến thức đã học, chúng ta có thể ghi lại input và output của các bài tập trước, chẳng hạn như bài toán giải phương trình bậc nhất và bậc hai.
2.3.1.3 Ghi thêm dữ liệu vào tệp đã được khởi tạo trước đó
Khi đã tạo một tệp trên đĩa và nhập nội dung từ chương trình ứng dụng hoặc khởi tạo tệp rỗng, việc ghi thêm dữ liệu vào tệp sẽ được thực hiện thông qua các lệnh ghi trong ngôn ngữ lập trình.
Để ghi dữ liệu vào tệp, bạn chỉ cần sử dụng thủ tục append sau khi thực hiện thủ tục assign, sau đó áp dụng thủ tục write(, ).
Ví dụ 3 Ghi thêm dữ liệu vào tệp, dữ liệu này độc lập với dữ liệu đã khởi tạo trước đó
Nội dung tệp đã được khởi tạo trước đó bằng cách nhập trực tiếp trên Notepad (hoặc khởi tạo một tệp rỗng):
Chương trình sử dụng thủ tục ghi thêm append():
Assign(f,’e:\gv.txt’); append(f); writeln(f); writeln(f,’to Toan - Tin’); close(f); readln end
Nội dung tệp đã được ghi thêm:
2.3.2 Đọc dữ liệu từ tệp 2.3.2.1 Đọc dữ liệu kiểu xâu trên một dòng vào một biến
Thực nghiệm và kết quả thực hiện
Tôi đã áp dụng SKKN này cho lớp 11T, nơi đa số học sinh có năng lực khá giỏi Sau khi thực hiện, tôi nhận thấy kiến thức của các em về kiểu tệp văn bản đã được cải thiện rõ rệt Từ việc chưa hiểu bài tập ban đầu, các em đã dần hoàn thành tốt các bài tập tiếp theo Do năm học này tôi chỉ giảng dạy kiểu dữ liệu tệp ở lớp 11T, nên tất cả kết quả đối chứng và thực nghiệm đều được thực hiện trên lớp này.
Trước khi áp dụng phương pháp giảng dạy theo đề tài, tôi đã giảng dạy theo cấu trúc bài học truyền thống như trong sách giáo khoa, bao gồm các bài 14, 15 và 16 Trong đó, bài 14 và 15 được chú trọng để xây dựng nền tảng kiến thức cho học sinh.
Bài 15 yêu cầu học sinh nắm vững cú pháp khai báo và thao tác với tệp, trong khi bài 16 giúp học sinh hiểu cách đọc dữ liệu số từ tệp và ghi output (kiểu mảng) vào một tệp khác Nhiều học sinh gặp khó khăn trong việc chạy chương trình và kiểm tra kết quả do không biết mở tệp RESIT.DAT và RESIT.EQU bằng phần mềm nào Dù giáo viên đã giải thích và trình diễn chương trình, học sinh vẫn không thể hoàn thành bài tập kiểm tra vì dữ liệu output là xâu kí tự và thao tác ghi là ghi thêm Học sinh cũng thắc mắc về khả năng đọc toàn bộ dữ liệu của một tệp và ghi ra màn hình, cũng như cách máy tính xử lý dữ liệu kiểu xâu Để giải quyết những thắc mắc này, tôi đã dành thêm 3 tiết để áp dụng đề tài này.
Giáo viên cung cấp kiến thức cơ bản về kiểu tệp văn bản trong Pascal, như đã trình bày trong phần cơ sở lý luận Do bài học chứa nhiều nội dung mới, học sinh có thể gặp khó khăn trong việc theo kịp, vì vậy giáo viên đã phô tô một bản tài liệu cho mỗi học sinh.
Sau khi trình bày lý thuyết, giáo viên phát phiếu bài tập thực hành kiểu tệp văn bản cho học sinh Đặc biệt, trong các ví dụ 3, 6 và 7, giáo viên cần nhắc nhở học sinh khởi tạo tệp trực tiếp trên phần mềm Notepad với đuôi “.txt” Do học sinh chưa có kinh nghiệm với kiểu dữ liệu này, giáo viên sẽ ôn lại kiến thức và đặt câu hỏi gợi mở để giúp học sinh so sánh các vấn đề dễ nhầm lẫn Trong quá trình thực hành, học sinh cần ghi vào phiếu bài tập mỗi khi hoàn thành một bài.
Sau khi hoàn tất quá trình thực hành, giáo viên sẽ phát bài tập kiểm tra đánh giá (Phụ lục 2) Học sinh cần thực hiện thao tác trên máy và ghi lại kết quả vào giấy khi đã hoàn thành.
Sau khi học sinh hoàn thành phiếu kiểm tra đánh giá theo thời gian quy định, giáo viên sẽ thu bài và cả phiếu bài tập để tiến hành thống kê và đánh giá kết quả đạt được.
Bảng thống kê kết quả đạt được PHIẾU BÀI TẬP THỰC HÀNH KIỂU TỆP VĂN BẢN (Thực hiện trên cùng lớp 11T, năm học 2016-2017)
Trước khi áp dụng Sau khi áp dụng
Số bài KT Đạt yêu cầu
Không đạt y.c Số bài KT Đạt yêu cầu
KẾT QUẢ PHIẾU KIỂM TRA ĐÁNH GIÁ
Số bài KT Đạt yêu cầu Không đạt y.c
Kết quả cho thấy 100% học sinh đạt yêu cầu, nhờ vào việc làm bài trực tiếp trên máy, giúp các em phát hiện và sửa lỗi kịp thời Trong quá trình thực hành, các em học được tính đoàn kết, hợp tác và hỗ trợ lẫn nhau Học sinh đã tiếp thu kiến thức cơ bản và biết vận dụng kiểu tệp văn bản để lưu lại kết quả từ các bài tập Pascal trước đó Mặc dù còn lúng túng với kiểu dữ liệu mới, nhưng các em rất hứng thú với kết quả thực hành, nhờ vào việc ghi dữ liệu vào tệp và đọc dữ liệu từ tệp bằng Pascal.