SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ
TRƯỜNG THPT ĐÔNG SƠN I
SÁNG KIẾN KINH NGHIỆM
MỘT SỐ BÀI TẬP THỰC HÀNH VỀ CÁCH LÀM VIỆC VỚI TỆP
Người thực hiện: Nguyễn Thị Ngọc Lan
Chức vụ: Giáo viên
SKKN môn: Tin học.
1
THANH HOÁ NĂM 2013
2
A .PHẦN MỞ ĐẦU
I. LÝ DO CHỌN ĐỀ TÀI
- Hiện nay trong phân phối chương trình Tin học THPT có sự
thay đổi giảm tải đối với việc học môn Tin học. Có những bài được
lược bớt đi 1 phần, một mục hoặc có bài học sinh không phải học mà
chỉ đọc tham khảo thêm. Bên cạnh đó để đảm bảo đủ số tiết học nên
có những tiết được bổ sung như tiết bài tập hoặc bài tập thực hành,
nhằm đảm bảo cho học sinh nắm rõ hơn, vững hơn những phần lý
thuyết đã được học. Tuy nhiên với những tiết bài tập hoặc bài tập thực
hành này sách giáo khoa, cũng như sách giáo viên chưa có những
hướng dẫn cụ thể để đạt được một cái chuẩn chung như những bài lý
thuyết. Thông thường giáo viên sẽ linh động dựa vào điều kiện cơ sở
vật chất của nhà trường, đặc biệt là tuỳ vào đối tượng học sinh của
mình để cung cấp cho học sinh những bài tập nhằm củng cố cho học
sinh những kiến thức ở phần lý thuyết đã học.
- Tin học 11 là một modul chương trình tương đối khó trong hệ
thống modul kiến thức Tin học khối THPT. Ở đây học sinh được làm
việc với ngôn ngữ lập trình và một ngôn ngữ lập trình cụ thể, với thực
tiễn cơ sở vật chất của trường THPT Đông Sơn 1 chúng tôi sử dụng
ngôn ngữ lập trình Pascal để cùng làm việc với học sinh trong học
phần này.
B. NỘI DUNG
I .CƠ SỞ LÝ LUẬN .
Khi học sinh học bài học Bài 14 - 15: Kiểu dữ liệu tệp - Thao tác
với tệp. Học sinh đã có rất nhiều khó khăn, nhầm lẫn trong việc xác
định các thao tác xử lý tệp.
II. NỘI DUNG VÀ GIẢI PHÁP THỰC HIỆN
1. CÁC THAO TÁC VỚI TỆP
* Khai báo tệp văn bản:
Tệp văn bản được khai báo trực tiếp trong phần khai báo biến:
Var <Bientep>:Text;
* Mở tệp để ghi dữ liệu:
Để mở một tệp chuẩn bị lưu trữ dữ liệu, ta sử dụng 2 thủ tục chuẩn
sau đây:
ASSIGN(biến tệp, tên tệp);
REWRITE(biến tệp);
Trong đó:
Biến tệp: là tên biến tệp đã khai báo sau từ khóa VAR
Tên tệp: Là tên do ta chọn để ghi dữ liệu vào đĩa.
Ví dụ : ASSIGN(f, ‘a:\baitap.txt’);
REWRITE(f); {khởi tạo tệp rỗng}
Sau 2 thủ tục trên, để tiến hành ghi dữ liệu vào tệp ta dùng thủ
tục WRITE(…), hoặc WRITELN(… ):
Cách viết:
WRITE(biến tệp, các giá trị cần ghi vào tệp);
5
WRITELN(biến tệp, các giá trị cần ghi vào tệp);
* Mở tệp để đọc dữ liệu:
Để mở một tệp chuẩn bị lưu trữ dữ liệu, ta sử dụng 2 thủ tục chuẩn
sau đây:
ASSIGN(biến tệp, tên tệp);
Khi đó để giải 1 bài toán, người viết chương trình phải tương tác với
3 file:
File chương trình (nếu dùng Pascal thì có phần mở rộng là PAS)
File chứa dữ liệu vào (thường người ta để phần mở rộng là INP)
File chứa dữ liệu ra – ghi kết quả (thường người ta để phần mở rộng
là OUT)
Quan hệ 3 file trong bài toán 1
7
var n,i:byte;
gt:longint;
f:text;
begin
assign(f,'BT01.INP');
reset(f);
read(f,n);
close(f);
gt:=1;
for i:=2 to n do
gt:=gt*i;
assign(f,'BT01.OUT');
rewrite(f);
writeln(f,gt);
close(f);
end.
BT01.PAS
5
BT01.INP
120
BT01.OUT
Giải thích: dữ liệu (giá trị của n) được lấy từ file ‘BT01.INP’ cho
biến n.
Dòng 3: Đóng file ‘BT01.INP’ để an toàn dữ liệu
Ghi kết quả vào file:
{dòng 1} assign(f,'BT01.OUT');rewrite(f);
{dòng 2} writeln(f,gt);
{dòng 3} close(f);
Ý nghĩa:
Dòng 1: Mở file ‘BT01.OUT’ để ghi nội dung
Dòng 2: Ghi giá trị của gt vào file ‘BT01.OUT’.
Dòng 3: Đóng file ‘BT01.OUT’ để an toàn dữ liệu.
• Một vài điều cơ bản cần quan tâm:
Cấu trúc của file văn bản:
9
Assign(<biến file>,<tên file>);rewrite(<biến file>);
write(<biến file>,<danh sách biến hay kết quả>);
Hoặc writeln(<biến file>,<danh sách biến hay kết
quả>);
Close(<biến file>);
Dữ liệu trong file văn bản là các ký tự (bảng mã ASCII). Có một
số hàm chuẩn thường dùng trong khi đọc/ghi tệp văn bản là:
* Hàm EoLn(<biến file>) : Trả về giá trị True nếu con trỏ tệp
đang chỉ tới cuối dòng.
* Hàm Eof(<biến file>): Trả về giá trị True nếu con trỏ tệp đang
chỉ tới cuối tệp.
Ví dụ về hình ảnh mô tả cấu trúc 1 file văn bản (chữ in đậm trong
file sẽ không được thể hiện)
Thủ tục đọc file: Read(<biến file>,<danh sách các biến>)
Với thủ tục này, ta có thể hiểu như sau: đầu đọc sẽ đọc lần lượt
các giá trị trong file gán tuần tự cho các biến có trong danh sách biến
của thủ tục, sau đó đầu đọc không thực hiện việc xuống đầu dòng tiếp
begin
read(f,n); {hoặc readln(f,n) đều được}
gt:=1;
for i:=2 to n do
gt:=gt*i;
11
Bài toán 2: Cho một số số nguyên dương n (n≤12).
Yêu cầu: hãy tính n! của mỗi số.
Dữ liệu vào từ file ‘BT02.INP’ chứa giá trị của một số số nguyên dương n.
Kết quả ghi vào file ‘BT02.OUT’ là kết quả của n!. Mỗi dòng trong file dữ liệu
vào chứa một giá trị của n và tương ứng với mỗi giá trị của n sẽ có một kết quả
trong file dữ liệu ra.
writeln(g,gt);
end;
close(f);
close(g);
end.
Bài toán 3:
Cho một dãy số nguyên gồm n phần tử.
Yêu cầu: Tìm giá trị lớn nhất
Dữ liệu vào từ file ‘BT03.INP’
Dòng đầu là giá trị của n (n≤100).
Dòng thứ hai ghi n phần tử của dãy (mỗi phần tử có giá trị tuyệt đối không vượt
quá 30000, hai phần tử kế nhau cách ít nhất một khoảng trắng)
Kết quả ghi vào file ‘BT03.OUT’ ghi giá trị tìm được.
Bài giải tham khảo:
var a:array[1 100] of integer;
n,i:byte;
max:integer;
f:text;
begin
assign(f,'BT04.INP'); reset(f);
assign(g,'BT04.OUT'); rewrite(g);
while (not Eof(f)) do
begin
readln(f,n);
13
for i:=1 to n do
read(f,a[i]);
readln(f); {Đưa đầu đọc xuống dòng tiếp theo để đọc dãy số
mới}
max:=a[1];
for i:=2 to n do
if max<a[i] then max:=a[i];
writeln(g,max);
end;
close(f); close(g);
end.
Bài toán 5:
Cho n dãy số nguyên.
Yêu cầu: tìm tổng của các phần tử của từng dãy
Dữ liệu vào từ file ‘BT05.INP’ gồm n dòng, mỗi dòng là một dãy số (mỗi dãy
có tối đa 100 phần tử và mỗi phần tử có giá trị tuyệt đối không quá 30000; hai
phần tử đứng kế nhau cách nhau ít nhất một khoảng trắng).
Kết quả ghi vào file ‘BT05.OUT’ gồm n dòng mỗi dòng là một kết quả tìm
được tương ứng với dữ liệu trong file input.
Bài giải tham khảo:
var a:array[1 100] of integer;
n,m,i,j:byte;
s:longint;
Bài toán 6:
Cho một chuỗi ký tự có tối đa 255 ký tự.
Yêu cầu: hãy cho biết có bao nhiêu ký tự ‘a’.
Dữ liệu vào từ file ‘BT06.INP’ chứa chuỗi ký tự đã cho.
Kết quả ghi vào file ‘BT06.OUT’ ghi số lượng ký tự ‘a’ tìm được
close(f);
dem:=0;
for i:=1 to length(s) do
if s[i]=’a’ then
dem:=dem+1;
assign(f,'BT06.OUT');rewrite(f);
writeln(f,dem);
close(f);
end.
16
Bài giải tham khảo:
var ch:char;
i:byte;
dem:longint;
f:text;
begin
assign(f,'BT07.INP');reset(f);
dem:=0;
while (not Eoln(f)) do
begin
read(f,ch); {đọc từng ký tự thì dùng read}
if ch=’a’ then dem:=dem+1;
end;
close(f);
assign(f,'BT07.OUT');rewrite(f);
Yêu cầu: Hãy cho biết dãy số đó có số nguyên tố nào hay không?
Dữ liệu vào từ file ‘BT08.INP’ mỗi dòng là một dãy số (có tối đa 100 phần
tử; mỗi phần tử có giá trị tuyệt đối không quá 10
9
; hai phần tử cách nhau
một khoảng trắng).
Kết quả ghi vào file ‘BT08.OUT’ tương ứng một dãy số trong file input là
một dòng ghi số 1 nếu dãy đó có số nguyên tố, ngược lại ghi 0.
if (x mod i=0) then
begin
ngto:=false;
break; {thoát khỏi lặp
for}
end;
if (ngto=true) then break; {thoát khỏi lặp
while not Eoln(f) trong tr. hợp có số
nguyên tố}
end;
if (ngto=true) then writeln(g,1)
else writeln(g,0);
readln(f); {đưa đầu đọc xuống hàng tiếp theo}
end;
close(f); close(g);
end.
19
Bài toán 9:
Cho hai số nguyên dương a và b.
Yêu cầu: Hãy tìm ước chung lớn nhất của hai số đó!
Dữ liệu vào từ file ‘BT09.INP’ gồm nhiều dòng, mỗi dòng chứa một cặp
giá trị của a và b (a, b≤10
{đoạn chương trình tìm ước chung lớn nhất của
2 số
nguyên dương a và b}
repeat
if (a>b) then a:=a-b;
if (a<b) then b:=b-a;
until (a=b);
writeln(g,a);
end;
close(f); close(g);
end.
Bài giải tham khảo:
20
var n,dem:longint;
f,g:text;
begin
assign(f,‘BT10.INP’);reset(f);
assign(g,‘BT10.OUT’);rewrite(g);
while (not Eof(f)) do
begin
readln(f,n);
{đoạn chương trình đếm số lượng chữ số 0 tận cùng của
n!}
dem:=0;
while (n>=5) do
begin
dem:=dem+(n div 5);
n:=n div 5;
end;
writeln(g,dem);
đã ứng dụng được tin học để giải quyết công viêc nhanh, hiệu quả và
chính xác hơn.
Hiện nay, ngôn ngữ lập trình Pascal đã trở thành ngôn ngữ lập
trình phổ biến nhất trên thế giới sử dụng trong lĩnh vực giảng dạy.
Đề tài này mang tính thực tiễn rất cao cụ thể là: trong tiết học bài
tập các em học sinh đã chủ động để tìm, nắm vững cách làm việc với
tệp qua đó tiếp tục giải quyết được các bài toán lập trình tiếp theo. Các
em đã khá rõ ràng về sự độc lập dữ liệu, độc lập chương trình (Code),
độc lập kết quả.
Kết quả là có rất nhiều em đã dễ dàng vận dụng các thao tác với
tệp để làm việc với tệp để giải các bài toán tệp tiếp theo.
II. ĐỀ XUẤT
1. VỚI SỞ
Phổ biến rộng rãi các SKKN có giải để các giáo viên trong tỉnh
tham khảo và học tập.
2. VỚI TRƯỜNG
Tổ chức các lớp ôn tập theo chuyên đề, ôn luyện, kiểm tra, đánh
giá việc ôn tập của học sinh.
Sáng kiến kinh nghiệm của tôi chắc hẳn không thể tránh khỏi
thiếu sót. Rất mong được sự giúp đỡ đóng góp của ban giám khảo,
các đồng nghiệp để SKKN của tôi được hoàn thiện hơn và công việc
dạy học của tôi đạt kết quả cao hơn.
23
24
D. TÀI LIỆU THAM KHẢO
1.Sách giáo khoa tin học 11 Hồ Sĩ Đàm chủ biên
2. Sách giáo viên tin học 11 Hồ Sĩ Đàm chủ biên
3. Lý thuyết và Bài tập lập trình Pascal 5.5-6.0 Nguyễn Thị Kiều
Duyên
4. Một số sáng kiến kinh nghiệm và ý kiến của đồng nghiệp .