Tải bản đầy đủ (.pdf) (44 trang)

HƯỚNG dẫn THỰC HÀNH KIỂU tệp TRÊN PASCAL DÀNH CHO học SINH lớp 11

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.74 MB, 44 trang )

SỞ GIÁO DỤC – ĐÀO TẠO SÓC TRĂNG
TRƯỜNG THPT NGÃ NĂM

SÁNG KIẾN KINH NGHIỆM

HƯỚNG DẪN THỰC HÀNH KIỂU TỆP
TRÊN PASCAL DÀNH CHO HỌC SINH
LỚP 11

HUỲNH THỊ HẢO
`

Tháng 3 năm 2017


2

MỤC LỤC
Phần 1. MỞ ĐẦU..........................................................................................................3
1.1. Lí do chọn đề tài ..................................................................................................3
1.2. Mục đích và nhiệm vụ nghiên cứu .....................................................................4
1.3. Đối tượng và phạm vi nghiên cứu ......................................................................4
1.4. Phương pháp nghiên cứu.....................................................................................4
1.5. Tính mới của đề tài ..............................................................................................5
Phần 2: NỘI DUNG .....................................................................................................7
2.1. Cơ sở lí luận .........................................................................................................7
2.1.1. Pascal và kiểu tệp văn bản............................................................................7
2.1.2. Thao tác với tệp.............................................................................................7
2.2. Thực trạng vấn đề nghiên cứu ..........................................................................12
2.3. Biện pháp tiến hành ...........................................................................................13
2.3.1. Ghi dữ liệu vào tệp......................................................................................13


2.3.2. Đọc dữ liệu từ tệp........................................................................................18
2.3.3. Bài tập vận dụng: ........................................................................................24
2.4. Thực nghiệm và kết quả thực hiện ...................................................................27
Phần 3: KẾT LUẬN ...................................................................................................31
3.1. Kết luận chung ...................................................................................................31
3.2. Đề xuất, kiến nghị..............................................................................................31
TÀI LIỆU THAM KHẢO .........................................................................................33
PHỤ LỤC 1. BÀI TẬP THỰC HÀNH ....................................................................34
PHỤ LỤC 2. BÀI KIỂM TRA ĐÁNH GIÁ ...........................................................42


3

Phần 1. MỞ ĐẦU
1.1. Lí do chọn đề tài
Pascal là một môn học không hề dễ đối với tất cả mọi người, không nhiều
học sinh yêu thích môn học này. Tuy nhiên với học sinh, việc học ngôn ngữ lập
trình Turbo Pascal là khởi đầu cho việc tiếp cận ngôn ngữ lập trình bậc cao, qua đó
giúp các em hình dung được sự ra đời, cấu tạo, hoạt đông cũng như ích lợi của các
chương trình hoạt động trong máy tính, các máy tự động… Qua đó các em có thêm
một định hướng, một niềm đam mê về tin học, về nghề nghiệp mà các em chọn sau
này.
Trong quá trình giảng dạy môn tin học 11 tôi đã rút ra nhiều bài học kinh
nghiệm cho bản thân qua từng tiết dạy và luôn mong muốn học sinh có thể vận
dụng hiệu quả máy tính để phục vụ cho việc tiếp thu kiến thức cho bản thân. Vì vậy
với điều kiện phòng máy nhà trường hiện có tôi đã luôn tạo điều kiện cho các em
học tập trực quan trên máy tính không chỉ các tiết thực hành mà còn cả đa số các
tiết lí thuyết. Tuy nhiên ở chương V. Tệp và thao tác với tệp, sẽ rất khó cho học
sinh trong việc tự mình thực hành được một bài tập về kiểu tệp nếu không có sự
hướng dẫn của giáo viên bởi sách giáo khoa chưa làm rõ nhiều vấn đề và cũng

không hướng dẫn học sinh thực hành. Bởi việc chạy được một chương trình có sử
dụng kiểu tệp phải đảm bảo nhiều yếu tố đi kèm. Không như các chương trình
không sử dụng kiểu tệp mà học sinh đã học trước đó thì chỉ cần gõ đầy đủ nội dung
một chương trình sách giáo khoa viết thì nó sẽ chạy được và thế là có thể xem kết
quả còn với kiểu tệp thì không. Để cho học sinh có thể hiểu được sâu sắc một số
vấn đề cơ bản khi làm việc với kiểu tệp và tạo hứng thú cho các em ở nội dung này
tôi đã tìm hiểu, xây dựng và áp dụng sáng kiến kinh nghiệm “Hướng dẫn thực hành
kiểu tệp trên Pascal dành cho học sinh lớp 11”.


4

1.2. Mục đích và nhiệm vụ nghiên cứu
Mục đích của đề tài tôi muốn hướng đến là giúp học sinh có thể thực thực
hành một cách hiệu quả các bài tập cơ bản về kiểu tệp văn bản mà cụ thể là có thể
viết chương trình trên máy tính để ghi dữ liệu vào tệp, đọc dữ liệu từ tệp .
Nhiệm vụ của đề tài là hướng dẫn người học giải quyết được các vấn đề
xung quanh việc dùng Pascal để: Khởi tạo một tệp, ghi dữ liệu của các lần thực
hiện chương trình vào tệp, ghi thêm dữ liệu vào tệp đã có nội dung, đọc dữ liệu
kiểu xâu trên một dòng, đọc dữ liệu kiểu xâu của cả tệp, đọc dữ liệu kiểu số, đọc dữ
liệu từ tệp có nội dung là kiểu xâu và kiểu số,…
1.3. Đối tượng và phạm vi nghiên cứu
Đề tài nghiên cứu về các thao tác đọc/ghi kiểu tệp văn bản trong Pascal của
chương trình tin học 11. Bên cạnh tệp có cấu trúc thì việc giới thiệu cho các em
kiến thức về kiểu tệp văn bản đã làm cho việc dạy và học trở nên nhẹ nhàng hơn.
Cần nhấn mạnh là sách giáo khoa không hướng dẫn thực hành bài tập về
kiểu tệp nên gây rất nhiều khó khăn cho việc dạy và học về kiểu dữ liệu này. Vì thế
nhiệm vụ trọng tâm của đề tài là hướng dẫn các em đọc dữ liệu từ tệp đã có nội
dung và ghi dữ liệu vào tệp đồng thời hướng dẫn các em khởi tạo một tệp văn bản
bàng cách ghi trực tiếp trên phần mềm soạn thảo văn bản hay ghi bằng pascal.

1.4. Phương pháp nghiên cứu
- Phương pháp quan sát: là phương pháp thu thập thông tin về quá trình giáo
dục trên cơ sở tri giác trực tiếp các hoạt động sư phạm cho ta những tài liệu sống về
thực tiễn giáo dục để có thể khái quát nên những qui luật nhằm chỉ đạo tổ chức quá
trình giáo dục được tốt hơn. Phương tiện để quan sát chủ yếu là tri giác trực tiếp.
- Phương pháp điều tra: thể hiện qua việc tác động trực tiếp của người
nghiên cứu vào đối tượng nghiên cứu thông qua câu hỏi để có những thông tin cần
thiết cho công việc của mình.
- Phương pháp thực nghiệm sư phạm: là phương pháp thu nhận thông tin về
sự thay đổi số lượng, chất lượng trong nhận thức và hành vi của các đối tượng giáo


5

dục do giáo viên tác động đến bằng một số câu hỏi và bài tập kiểm tra. Thực
nghiệm sư phạm là so sánh kết quả tác động của giáo viên lên một nhóm lớp - gọi
là nhóm thực nghiệm - với một nhóm lớp tương đương không được tác động
(dạy, giáo dục theo cách bình thường vẫn được giáo viên phổ thông sử dụng) - gọi
là nhóm đối chứng. Tuy nhiên vì trong năm học này tôi chỉ dạy Tin học 11 ở lớp
11T nên đây là nhóm đối chứng (khi chưa tác động) và vừa là nhóm thực nghiệm
(sau khi đã tác động).
- Phương pháp thống kê: sau khi thực nghiệm kết quả cần được xử lí bằng
toán học thống kê. Qua bảng thống kê sẽ phản ánh được một cách chi tiết kết quả
đạt được qua quá trình thực nghiệm. Từ đó người nghiên cứu có thể đánh được vấn
đề mình đang nghiên cứu và đưa ra phương pháp dạy học tốt hơn.
- Phương pháp so sánh: dùng để đối chiếu giữa các vấn đề nghiên cứu nhằm
làm bật lên tác dụng của cách thực hiện đối với từng vấn đề. Qua đó giúp người
học hiểu rõ hơn nội dung được lĩnh hội. Khi nghiên cứu đề tài này tôi đã trình bày
theo hình thức: chương trình trên Pascal, kết quả trên màn hình, nội dung trên tệp
được ghi hoặc đọc (tất cả đều được chụp từ màn hình nhằm mục đích giúp người

đọc dễ phân biệt và so sánh).
- Phương pháp phân tích: ở mỗi vấn đề được nghiên cứu tôi đã sử dụng
phương pháp phân tích để làm rõ nội dung. Phương pháp phân tích là đặc biệt quan
trọng và đó chính là chìa khóa để mở ra những kiến thức mới nhưng dễ tiếp thu
hơn.
1.5. Tính mới của đề tài
Đề tài nhằm hướng dẫn học sinh lớp thực hành các bài tập đơn giản về kiểu
tệp văn bản trên Pascal, giúp các em giải quyết được 2 thao tác cơ bản đối với tệp
là đọc và ghi tệp. Những điều này sách giáo khoa chỉ nói chung chung, chưa cụ thể
rõ ràng và cũng không hướng dẫn học sinh thực hành bài tập về kiểu tệp (cách khởi
tạo một tệp để đọc, ghi thêm dữ liệu vào tệp, ghi tất cả input và output của các lần


6

thực hiện chương trình vào tệp, cách để kiểm tra kết quả đọc được từ tệp hay kiểm
tra kết quả ghi tệp,…). Những vấn đề trên sẽ được trình bày trong đề tài này.


7

Phần 2: NỘI DUNG
2.1. Cơ sở lí luận
2.1.1. Pascal và kiểu tệp văn bản
Pascal do Niklaus Wirth phát triển dựa trên Algol năm 1970. Pascal là tên
nhà toán học và triết học người Pháp Blaise Pascal. Cho đến nay Pascal vẫn được
dùng để giảng dạy về lập trình trong nhiều trường trung học và đại học trên thế
giới. Đó là ngôn ngữ cho phép mô tả thuật toán thuận tiện.
Trong chương trình tin học 11 học sinh được làm quen với Pascal. Trong đó
kiểu tệp văn bản là một trong những nội dung được đề cập đến. Tệp văn bản là tệp

mà dữ liệu được ghi dưới dạng các kí tự theo mã ASCII. Trong tệp văn bản, dãy kí
tự được kết thúc bởi kí tự xuống dòng hay kí tự kết thúc tệp tạo thành một dòng.
Tất cả các dữ liệu thuộc các kiểu dữ liệu mà học sinh đã được học đều được lưu trữ
trên bộ nhớ trong (RAM) và do đó dữ liệu sẽ bị mất khi tắt máy. Với một số bài
toán có khối lượng dữ liệu lớn, có yêu cầu lưu trữ để xử lí nhiều lần, cần có kiểu dữ
liệu tệp (file). Với lợi ích của kiểu tệp được đề cập ở trên thì việc sử dụng được
kiểu tệp một cách thành thạo trong quá trình lập trình là một điểu thật sự quan trọng
và cần thiết.
2.1.2. Thao tác với tệp
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
11, 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 xin trình bày những kiến thức cơ bản về kiểu tệp văn bản để hỗ trợ cho
học sinh trong quá trình giải (thực hành) các bài toán đơn giản về 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 <biến tệp>: text;
Ví dụ: var f: text;


8

2.1.2.2. Gắn tên tệp
Trong lập trình ta không thao tác trực tiếp với tệp dữ liệu trên đĩa mà thông
qua biến tệp. Gắn tên tệp với biến tệp thực chất là tạo một tham chiếu giữa tệp trên
đĩa và biến tệp trong chương trình, làm cho biến tệp trở thành đại diện cho tệp.
Cú pháp: assign(<biến tệp>, <tên tệp>);
VD: assign(f, „E:\kieutep.doc‟);
Giáo viên cần phân tích cho học sinh thấy rõ sự cần thiết phải gắn tên tệp.
Trong cú pháp, tên tệp là hằng xâu kí tự hoặc giá trị của một biểu thức kiểu xâu kí

tự (để hệ điều hành có thể xác định được tệp). Tất cả các phép toán trên biến tệp sẽ
tác động tới tệp. Sau khi gọi thủ tục asign, sự liên kết giữa biến tệp và tệp chỉ kết
thúc khi có lời gọi asign khác thực hiện cũng trên biến tệp này (nghĩa là lúc đó biến
tệp được chuyển sang gắn cho một tên tệp khác). Tên tệp có thể là đường dẫn chứa
ổ đĩa, danh sách các thư mục liên tiếp cách nhau bởi dấu đường dẫn (\), cuối cùng
là tên tệp:
<ổ đĩa>:\<tên thư mục>\<tên thư mục>\...\<tên thư mục>\<tên tệp>
Độ dài lớn nhất của tên tệp là 79 kí tự. Đặc biệt khi tên tệp là xâu rỗng (độ
dài xâu bằng 0) thì biến tệp được gắn cho tên tệp vào/ra chuẩn. Các tệp vào ra
chuẩn được quy định tương ứng với thiết bị nào là tùy thuộc vào sự mở rộng của
mỗi chương trình dịch Pascal, nhưng thường quy định tệp input chuẩn là bàn phím,
tệp output chuẩn là màn hình.
2.1.2.3. Mở tệp để ghi
Trước khi ghi dữ liệu vào tệp ta phải dùng thủ tục mở tệp để ghi. Thủ tục này
được gọi sau khi đã gắn tên tệp. Cú pháp như sau:
rewrite(<biến tệp>);
Khi thực hiện thủ tục rewrite(<biến tệp>), nếu trên thư mục gốc của ổ đĩa
chưa có tệp cần ghi dữ liệu thì tệp sẽ được tạo với nội dung rỗng (tên tệp đã được
xác định trong thủ tục gắn tên tệp. Nếu đã có, thì nội dung cũ sẽ bị xóa để chuẩn bị
ghi dữ liệu mới vào.


9

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(<biến tệp>,<danh sách kết quả>);

hoặc
Writeln(<biến tệp>,<danh sách kết quả>);
Trong đó, danh sách kết quả gồm một hoặc nhiều phần tử. Phần tử là biến
đơn hoặc biểu thức (số học, quan hệ hoặc lôgic) hoặc hằng xâu. Trường hợp có
nhiều phần tử thì các phần tử được ngăn cách bởi dấu phẩy. Khi hai kết quả liền
nhau cùng là kiểu số thì thì cần xen vào giữa hai kết quả này một kết quả trung gian
là hằng kí tự dấu cách. Ví dụ, write(f, x,„ „,y). Trong đó f là biến tệp, x và y là hai
biểu thức số. Trước khi gọi thủ tục này, tệp tương ứng với biến tệp phải là đang
mở. Thủ tục write sẽ ghi lần lượt các kết quả theo danh sách kết quả vào tệp kể từ
vị trí hiện thờ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(<biến tệp>);
Ví dụ: append(f);
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 ý: Trong cùng một chương trình nếu muốn ghi thêm dữ liệu thì không
thể đồng thời sử dụng thủ tục rewrite và append vì khi dùng rewite nội dung tệp sẽ
bị xóa (nếu tệp đã có nội dung). Vì vậy mục đích ghi thêm dữ liệu mới vào sẽ
không được thực hiện như ý muốn.


10

2.1.2.6. Mở tệp để đọc
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(<biến tệp>);
Ví dụ: reset(f);

Trong cú pháp, biến tệp phải đã được gắn với một tên tệp (dùng asign). Nếu
tệp này không tồn tại thì thực hiện reset sẽ gặp lỗi. Nếu tệp đã mở thì nó sẽ đóng lại
rồi sau đó mở lại. Vị trí con trỏ tệp sau lời gọi reset là đầ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(<biến tệp>, <danh sách biến>);
Hoặc
Readln(<biến tệp>, <danh sách biến>);
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 là một hoặc nhiều tên biến đơn. Trong trường hợp nhiều biến
thì các biến cách nhau bằng dấu phẩy.Các dữ liệu cần đọc trong tệp gán vào danh
sách biến phải lần lượt có kiểu tương ứng với kiểu của biến trong danh sách biến.
Nếu sai kiểu thì chương trình mắc lỗi. Lỗi này thường gặp khi biến có kiểu số, 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);


11

read(f, s, x);
writeln(s);

writeln(x);
readln
end.
Chương trình mắc lỗi “Invalid numberic format” vì sau khi đọc được s = „tin
ho‟ , tiếp theo đọc dữ liệu cho x thì mắc lỗi thì mắc lỗi vì „c‟ không là dạng số. Nếu
thay lại khai báo s:string[7] hoặc string[8] thì chương trình không mắc lỗi khi thực
hiện đọc tệp, kết quả trên màn hình là

Với biến kiểu xâu, thủ tục read sẽ đọc các kí tự trên một dòng vào biến (loại
trừ các kí tự đánh dấu hết dòng hoặc hết tệp). Số kí tự đọc vào biến xâu bằng độ dài
đã khai báo của xâu.
Với biến kiểu nguyên hoặc thực, thủ tục read sẽ không đọc dấu cách, dấu tab
hoặc dấu xuống dòng đứng trước xâu chữ số. Nếu xâu chữ số không phù hợp với
kiểu của biến tương ứng thì xuất hiện lỗi vào/ra (I/O). Trong trường hợp ngược lại,
giá trị kiểu số tương ứng của xâu chữ số sẽ được gán cho biến. Lệnh read tiếp theo
sẽ sẽ được bắt đầu bằng dấu cách, dấu tab, hoặc kí tự hết dòng và chúng cũng lại
được bỏ qua. Những dấu này vạch định cho các xâu chữ số.
2.1.2.8. Đóng tệp
Cú pháp: close(<biến tệp>);
Trong cú pháp, biến tệp đã được gắn với một tệp đang mở bằng reset, rewrite
hoặc append ở thời điểm trước đó để mở tệp. Sau lệnh close, tệp gắn với biến tệp
được hoàn thành cập nhật và sau đó được đóng lại. Chương trình trả lại quyền quản
lí tệp cho hệ điều hành. Nếu thực hiện ghi dữ liệu vào tệp mà không đóng tệp thì
không có dữ liệu nào được ghi hoặc chỉ ghi được một phần vào tệp, nguyên nhân


12

do các dữ liệu chứa trong bộ nhớ đệm chưa chuyển kịp vào đĩa thì chương trình đã
bị ngắt.

2.1.2.9. Một số hàm và thủ tục chuẩn thường dùng trong thao tác tệp
Hàm EOF: trả lại giá trị true nếu con trỏ tệp ở vị trí cuối tệp, ngược lại trả giá
trị false.
Hàm EOL: nếu con trỏ tệp ở vị trí cuối dòng thì trả về giá trị true, ngược lại
trả giá trị false.
Vì vậy nếu muốn đọc dữ liệu của cả một dòng hay của cả tệp ta sẽ cần dùng
đến một trong hai hàm này. Việc áp dụng sẽ được trình bày trong phần đọc dữ liệu
từ tệp trong đề tài này.
2.2. Thực trạng vấn đề nghiên cứu
Trường THPT Ngã Năm là một ngôi trường thuộc vùng nông thôn của tỉnh
Sóc Trăng, đa phần học sinh không có máy tính cá nhân để hỗ trợ cho việc học nên
học sinh chủ yếu thực hành tin học tại phòng máy của nhà trường. Điều này ít
nhiều ảnh hưởng đến khả năng tự rèn luyện cũng như kiến thức về tin học của các
em. Bên cạnh đó đối với học sinh 11 việc học Pascal là một nỗi “nhọc nhằn” với đa
số học sinh của trường. Trong quá trình giảng dạy tại trường qua các năm tôi nhận
thấy chỉ có rất ít học sinh thích và học được Pascal.
Qua khảo sát các lớp tôi đã từng dạy qua nội dung mà đề tài đang nghiên cứu
thì có đa số học sinh không biết viết một chương trình đơn giản để ghi dữ liệu vào
một tệp và đọc dữ liệu từ tệp đó rồi ghi kết quả đọc được ra màn hình. Các em chỉ
biết cú pháp khai báo, gắn tên tệp, các thao tác với tệp cùng các ví dụ riêng lẻ mà
không hệ thống lại được thành một chương trình hoàn chỉnh được.
Nguyên nhân là do:
- 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 đó;


13

- Nội dung sách giáo khoa không có bài tập thực hành cho nội dung này
đồng thời cũng không nêu ra các yếu tố để một chương trình có sử dụng kiểu tệp

chạy được trên máy;
- Phần mở rộng của các tệp ghi trong sách giáo khoa xa lạ với học sinh. Do
đó, nếu chạy được chương trình thì không biết cách để kiểm tra kết quả;
- 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.
2.3. Biện pháp tiến hành
Giáo viên giới thiệu các kiến thức cơ bản về kiểu tệp văn bản trong Pascal
(đã được trình bày ở phần cơ sở lí luận). Vì đây là bài học có nhiều nội dung mới
nên khó tránh khỏi việc học sinh không theo kịp bài do đó giáo viên phô tô cho mỗi
học sinh một bản.
Sau khi trình bày xong phần lý thuyết, giáo viên phát cho mỗi học sinh một
phiếu bài tập thực hành kiểu tệp văn bản (phụ lục 1). Vì học sinh chưa từng thực
hành một bài tập nào về kiểu dữ liệu này nên với từng ví dụ giáo viên nhắc lại kiến
thức và yêu cầu học sinh xem lại lý thuyết đồng thời đặt các câu hỏi gợi mở, các
câu hỏi yêu cầu học sinh so sánh các vấn đề mà dễ gây nhầm lẫn cho các em. Trong
quá trình thực hành giáo viên yêu cầu học sinh ghi vào phiếu bài tập mỗi khi hoàn
thành xong một bài. Cụ thể biện pháp tiến hành hướng dẫn thực hành các bài tập
như sau:
2.3.1. Ghi dữ liệu vào tệp
2.3.1.1. So 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 trả lời thông qua việc so sánh cú pháp giữa 2 thủ
tục này. Giống nhau: đều dùng tên thủ tục là write hoặc writeln, các phần tử của
danh sách kết quả; khác nhau: thủ tục ghi tệp có thêm biến tệp.
Tuy nhiên giáo viên cần nhấn mạnh cho học sinh nội dung sau: nếu muốn
ghi dữ liệu vào tệp trên nhiều hàng thì cần dùng thủ tục writeln (ghi xong xuống


14

dòng để chuẩn bị ghi tiếp dòng sau). Điều này tương tự như ghi dữ liệu ra màn

hình.
Để làm rõ những nội dung về gắn tên tệp, so sánh việc ghi dữ liệu ra màn
hình và ghi tệp tôi đã đưa ra vài tập ví dụ 1 như sau:
Ví dụ 1. Hãy viết chương trình trên Pascal tính tổng của 2 số (ghi kết quả
ra màn hình đồng thời ghi 2 số nhập từ bàn phím và tổng của chúng vào tệp
“e:\tong2so.doc”).
Giáo viên yêu cầu học sinh viết một chương trình nhập 2 số từ bàn phím,
tính tổng của chúng và xuất kết quả ra màn hình. Sau đó mới bổ sung vào các câu
lệnh để ghi giá trị của 2 biến đã nhập, kết quả tổng của chúng.
Sau đó, giáo viên cần mở tệp đã ghi xem nội dung cần ghi vào tệp có thực
sự được ghi vào tệp chưa (tệp ở đây là tong2so.doc) đồng thời yêu cầu các em so
sánh nội dung đã được ghi trên tệp này và nội dung được ghi ra màn hình.
Chương trình trên Pascal:
program tong2so;
uses crt;
var f:text;
x, a, b:integer;
begin
clrscr;
write('nhap 2 so: ');
readln(a, b);
x:=a+b;
writeln('tong cua 2 so da nhap: ',x);
assign(f,'e:\tong2so.doc');
rewrite(f);
writeln(f,'a= ',a,' b= ',b);
writeln(f,'tong cua 2 so da nhap: ',x);


15


close(f);
readln
end.
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(<biến tệp>,<danh sách kết quả>);
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?
- Làm thế nào để có thể ghi được tất cả các dữ liệu (kết quả thực hiện
chương trình) của các lần thực hiện chương trình?
Điều này trong sách giáo khoa hoàn toàn không đề cập tới nhưng nếu không
tìm ra lời giải đáp cho HS thì không thể làm cho học sinh hiểu rõ về ghi tệp được.
Do đó tôi nhận thấy giải quyết vấn đề này là thực sự cần thiết.
Câu hỏi thứ nhất học sinh có thể trả lời được như sau: tệp chỉ ghi kết quả
của lần thực hiện chương trình sau cùng. Vì sau mỗi lần thực hiện chương trình thủ
tục rewrite(f) lại được gọi, điều đó có nghĩa là nội dung đã ghi trên tệp sẽ được xóa
để sẵn sàng cho việc ghi dữ liệu mới.


16

Câu hỏi thứ hai mới là một vấn đề quan trọng cần được làm rõ bởi ta dùng
kiểu tệp để lưu lại nội dung của các lần thực hiện chương trình để có thể sử dụng về
sau nhưng với kiến thức mà sác giáo khoa cung cấp không đủ để giải quyết vấn đề

này nên sẽ cần sự trợ giúp của giáo viên. Để có thể ghi thêm nội dung vào tệp ta sử
dụng thủ tục append(<biến tệp>). Thủ tục này sẽ thay thế cho thủ tục rewrite(tệp>) trong chương trình. Chú ý rằng thủ tục append(<biến tệp>) chỉ thay thế thủ
tục rewrite(<biến tệp>) khi ta đã thực hiện chương trình có rewrite(<biến tệp>) ít
nhất một lần để máy tính khởi tạo tệp cần ghi.
Ví dụ 2. Ghi tất cả dữ liệu của các lần thực hiện chương trình ở ví dụ 1 vào
tệp.
program tong2sonhapthem;
uses crt;
var f:text;
x, a, b:integer;
begin
clrscr;
write('nhap 2 so: ');
readln(a, b);
x:=a+b;
writeln('tong cua 2 so da nhap: ',x);
assign(f,'e:\tong2so.doc');
append(f);
writeln(f,'a= ',a,' b= ',b);
writeln;
writeln(f,'tong cua 2 so da nhap: ',x);
close(f);
readln
end.


17

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):

Kể từ đây nếu muốn ghi thêm thì chỉ cần thực hiện chương trình thêm
một lần nữa. Với kiến thức vừa nêu chúng ta có thể ghi được input, outut của các
bài tập trước đây vào tập. Ví dụ như bài toán giải phương trình bậc nhất, bậc hai,…
2.3.1.3. Ghi thêm dữ liệu vào tệp đã được khởi tạo trước đó
Nếu ta đã khởi tạo một tệp trên đĩa và nhập nội dung trực tiếp từ chương
trình ứng dụng tạo tệp hoặc khởi tạo một tệp rỗng thì việc ghi thêm dữ liệu vào nó
sẽ được thực hiện như thế nào?
Câu trả lời là chỉ cần dùng thủ tục append sau thủ tục assign rồi dùng thủ
tục write(<biến tệp>, <danh sách kết quả>) để ghi dữ liệu vào tệp.
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):


18

Chương trình sử dụng thủ tục ghi thêm append(<biến tệp>):
Program nhap_them;
Uses crt;
Begin
Clrscr;
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
Với biến xâu thủ tục read sẽ đọc các kí tự trên một dòng vào biến (loại trừ
các kí tự đánh dấu hết dòng hoặc hết tệp). Số kí tự đọc vào biến xâu tối đa bằng độ
dài đã khai báo của biến xâu.


19

Ví dụ 4: Đọc dữ liệu từ tệp “e:\gv.txt” ở ví dụ 3.
Chương trình trên Pascal:
Program vd4;
Uses crt;
Var f:text;
str:string;
Begin
clrscr;
assign(f, ‘e:\gv.txt’);
reset(f);
readln(f,str);
writeln(str);
close(f);
readln

end.
Kết quả đọc được ghi ra màn hình:

Từ kết quả đọc được này ta nhận thấy chỉ đọc được dòng đầu tiên của tệp.
2.3.2.2. Đọc dữ liệu kiểu xâu của cả tệp
Ví dụ 5. Đọc toàn bộ dữ liệu của tệp “e:\gv.txt” ở ví dụ 3.
Chương trình trên Pascal:
program vd5;
uses crt;
var f:text;

{khai bao bien tep f}

str:string; {khai bao bien xau str co do dai toi da 255 ki tu}
begin


20

clrscr;
assign(f,'e:\gv.txt'); {gan ten tep}
reset(f);

{mo tep de doc}

while not eof(f) do
begin
readln(f,str); {doc du lieu vao bien str}
writeln(str);


{ghi ket qua doc duoc ra man hinh}

end;
close(f);

{dong tep}

readln
end.
Kết quả đọc được và được xuất ra màn hình:

Ta so sánh kết quả này và nội dung đã ghi vào tệp ở ví dụ 3 là hoàn toàn phù
hợp. Về tác dụng của câu lệnh while – do được sử dụng ở chương trình trên: trong
khi con trỏ tệp chưa đến cuối tệp thì lần lượt từng hàng dữ liệu sẽ được đọc vào
biến str bằng câu lệnh readln(f, str) và kết quả đọc được lần lượt được ghi ra màn
hình từng hàng bằng câu lệnh write(str).
Nếu chương trình sau thay đổi theo 2 trường hợp này thì điều gì xảy ra?
Trường hợp 1.
Read(f, str);
Writeln(str);

{doc du lieu vao bien str}
{ghi ket qua ra man hinh}

Trường hợp 2.
Read(f,str); {doc du lieu vao bien str}


21


Write(str); {ghi ket qua doc duoc ra man hinh}
GV cần yêu cầu học sinh lưu lại chương trình và sau đó thử sửa chương trình
theo 2 trường hợp trên, quan sát kết thực hiện và cho nhận xét.
Ở trường hợp 1. Máy đọc được dữ liệu nhưng không ghi được kết quả ra màn
hình. Ở trường hợp 2. Máy đọc được dữ liệu và ghi kết quả đọc được trên cùng một
hàng. Vì vậy để kết quả đọc được xuất hiện trên màn hình giống như hình thức
được ghi trong tệp thì cần viết câu lệnh như chương trình đã viết ban đầu (tức có
thêm kí tự ln).
2.3.2.3. Đọc dữ liệu kiểu số
Với biến kiểu nguyên hoặc thực, thủ tục read sẽ không đọc dấu cách, dấu tab
hoặc dấu xuống dòng đứng trước xâu chữ số. Nếu xâu chữ số không phù hợp với
kiểu của biến thì sẽ xuất hiện lỗi vào/ra (I/O). Trong trường hợp ngược lại, giá trị
kiểu số tương ứng của xâu chữ số sẽ được gán cho biến. Lệnh read tiếp theo sẽ
được bắt đầu bằng dấu cách, dấu tab hoặc kí tự hết dòng và chúng cũng lại được bỏ
qua. Những dấu này vạch định cho các xâu chữ số. Ví dụ sau sẽ làm rõ vấn đề này.
Ví dụ 6. Đọc xâu chữ số từ tệp vd6.txt có nội dung sau và ghi kết quả đọc
được ra màn hình:

Những cách có thể thực hiện:
Cách 1.
program vd6_1;
uses crt;
var f:text;

{khai bao bien tep f}

x,y,z,t,v:integer;


22


begin
clrscr;
assign(f,'e:\vd6.txt'); {gan ten tep}
reset(f);

{mo tep de doc}

read(f, x,y,z,t,v); {lan luot doc du lieu vao cac bien}
write(x,y,z,t,v);

{xuat ket qua doc duoc ra man hinh}

close(f);

{dong tep}

readln
end.
Cách 2.
program vd6_2;
uses crt;
var f:text;
x:integer;

{khai bao bien tep f}
{khai bao bien x co kieu nguyen}

begin
clrscr;

assign(f,'e:\vd6.txt'); {gan ten tep}
reset(f);

{mo tep de doc}

while not eof(f) do {trong khi con tro tep chua tro toi
cuoi tep thi lam cong viec sau}

begin
read(f,x);
write(x);

{doc du lieu vao bien x}
{ghi ket qua doc duoc ra man hinh}

end;
close(f);
readln
end.
Cách 3.

{dong tep}


23

program vd6_3;
uses crt;
var f:text;


{khai bao bien tep f}

A:array[1..10] of integer;{khai bao bien A co kieu mang}
begin
clrscr;
assign(f,'e:\vd6.txt'); {gan ten tep}
reset(f);

{mo tep de doc}

while not eof(f) do {trong khi con tro tep chua tro toi
cuoi tep thi lam cong viec sau}

begin
read(f,A[i]);

{doc du lieu vao phan tu A[i]}

write(A[i]); {ghi ket qua doc duoc ra man hinh}
end;
close(f);

{dong tep}

readln
end.
Cả 3 cách đều cho kết quả sau:

- So sánh tính khả thi của từng cách?
- Làm thế nào để xuất ra màn hình các chữ số cách nhau khoảng 1 kí tự?

Giải quyết vấn đề:
- So sánh:
+ Cách 1: Đơn giản, dễ hiểu nhưng nếu muốn đọc nhiều giá trị thì phải khai
báo nhiều biến.


24

+ Cách 2: phức tạp hơn nếu chưa hiểu về hoạt động của câu lệnh while –
do. Tuy nhiên cách viết này giúp ta tránh được việc dùng và khai báo nhiều biến.
Ngoài ra còn có thể tránh được việc xác định số lượng biến cần đọc dữ liệu vào.
+ Cách 3: tương tự cách 2 chỉ khác là sử dụng giá trị đọc được ghi vào
mảng một chiều A.
- Muốn các chữ số khi xuất ra màn hình cách nhau một khoảng (một kí tự
dấu cách) ta thực hiện như sau:
+ Ở cách 1: write(x, „ „, y, „ „,z, „ „, t, „ „,v);
+ Ở cách 2: write(x, ‟ ‟); hoặc write(x,#32);
* Chú ý:
- Có thể dùng for – do thay cho while – do nếu biết số lượng các số cần
đọc. Tức thay vì ta dùng như ở cách 1 và 2 thì ta có thể dùng câu lệnh for – do và
kiểu mảng một chiều như sau:
for i:=1 to 5 do
begin
Read(f, A[i]);
Write(A[i],’ ‘);
end;
- Nếu muốn đọc dữ liệu từ một tệp và ghi dữ liệu vào tệp thứ hai thì ta
phải khai báo 2 biến tệp, dùng 2 thủ tục gắn tên tệp, một thủ tục mở tệp để ghi, một
thủ tục mở tệp để đọc, đóng 2 tệp sau khi đã làm việc xong.
- Thủ thục ghi dữ liệu ra màn hình chỉ khác thủ tục ghi tệp là thủ tục ghi

tệp có thêm biến tệp.
2.3.3. Bài tập vận dụng:
Sau đây là một số bài tập vận dụng các kiến thức về đọc và ghi dữ liệu để
giải quyết các bài toán đơn giản mà các em đã từng gặp qua chỉ khác là ở đây sử
dụng kiểu tệp văn bản. Các bài tập này sẽ giúp các em hiểu rõ hơn tác dụng của


25

kiểu tệp trong Pascal và giúp các em rèn luyện kỹ năng để viết chương trình có sử
dụng cả việc đọc và ghi tệp.
Bài 1. Cho tệp mang.txt có nội dung là 4 số nguyên như sau:
1321
Hãy viết chương trình đọc dữ liệu từ tệp này.
Tính tổng các giá trị đọc được.
Ghi giá trị đọc được từ tệp mang.txt và tổng này vào tệp tong.txt.
Chương trình giải bài toán trên Pascal như sau:
program vd6_3;
uses crt;
var f1,f2:text;
A:array[1..10] of integer;
Tong:integer; i:byte;
begin
clrscr;
assign(f1,'e:\mang.txt');
assign(f2,'e:\tong.txt');
reset(f1);
rewrite(f2);
tong:=0;
for i:=1 to 4 do

begin
read(f1,A[i]);
write(f2,A[i]);
tong:=tong+A[i];
end;
writeln(f2);
write(f2,tong);


×