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 :Text; * Mở tệp để ghi dữ liệu: Để mở một tệp chuẩn bị lưu trữ dữ liệu,
Trang 1A 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
Theo phân phối chương trình, ở chương 5: Tệp và thao tác với tệp của Tin học 11 có 2 tiết lý thuyết và 2 tiết bài tập thực hành Phần lý thuyết, sách giáo khoa cung cấp đã khá đầy đủ và dễ hiểu đối với học sinh Tuy nhiên phần bài tập thực hành thì chưa có
Với lý do trên tôi mạnh dạn đề xuất "Một số bài tập thực hành về cách làm việc với tệp" cho 2 tiết 39, 40 nhằm giúp học sinh nắm vững hơn về cách
làm việc với tệp
Tuy giờ dạy đã dựa vào đối tượng học sinh, vào trọng tâm kiến thức chương trình, nhưng vẫn còn mang tính chất cá nhân đề xuất, mong được sự góp
ý của bạn đọc và đồng nghiệp để tiết học trở thành chuẩn chung trong phân phối chương trình
Trang 2II MỤC ĐÍCH CỦA ĐỀ TÀI
Sử dụng các bài toán cụ thể trước hết để học sinh nắm được cú pháp, ý
nghĩa của các thao tác xử lý tệp Và thông qua các ví dụ đó hướng dẩn học sinh
sử dụng thuần thục, linh động khi xử lý các dữ liệu trong tệp
III NHIỆM VỤ CỦA ĐỀ TÀI
Đưa ra một số bài tập về tệp để học sinh thảo luận, làm việc qua đó nắm vững câu các thao tác với tệp và cách làm việc với tệp Hình thành ở học sinh kỹ năng phân tích, xử lý các vấn đề liên quan đến kiểu dữ liệu tệp trong quá trình lập trình
IV ĐỐI TƯỢNG NGHIÊN CỨU
Học sinh khối 11 tại trường THPT ĐÔNG SƠN 1
Sử dụng máy tính để chạy các chương trình về thao tác với tệp
V PHƯƠNG PHÁP NGHIÊN CỨU
- Kết hợp thực tiễn giáo dục ở trường THPT ĐÔNG SƠN 1
- Có tham khảo các tài liệu về ngôn ngữ lập trình Pascal và tài liệu về sáng kiến kinh nghiệm
Trang 3B 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);
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);
Trang 4RESET(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’);
RESET(f);
Sau 2 thủ tục trên, để tiến hành đọc dữ liệu vào tệp ta dùng thủ tục READ(…), hoặc READLN(… ):
Cách viết:
READ(biến tệp, các giá trị cần ghi vào tệp);
READLN(biến tệp, các giá trị cần ghi vào tệp);
* Cuối cùng, ta phải đóng tệp bằng thủ tục:
CLOSE(biến tệp);
2 BÀI TẬP
Xác định bài toán:
Input: giá trị của n
Output: kết quả của n!
Giáo viên liên tưởng cho học sinh:
Trước khi học bài này:
Input: giá trị của n (dữ liệu vào) được nhập từ bàn phím
Output: kết quả (dữ liệu ra) được in ra màn hình
Đến bài này:
Bài toán 1:
Cho số nguyên dương n (n≤12)
Yêu cầu: hãy tính n!
Dữ liệu vào từ file ‘BT01.INP’ chứa giá trị của số nguyên dương n
Kết quả ghi vào file ‘BT01.OUT’ là kết quả của n!
Trang 5Input: giá trị của n (dữ liệu vào) được lấy (đọc) từ file dữ liệu
Output: kết quả (dữ liệu ra) được đưa (ghi) vào file kết quả
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
Giải thích: dữ liệu (giá trị của n) được lấy từ file ‘BT01.INP’ cho chương
trình BT01.PAS, sau khi tính được kết quả (n!) ta ghi kết quả đó vào file
‘BT01.OUT’
Mô hình quan hệ chung
Giáo viên trình bày cách đọc và ghi file
Một bài toán mà dữ liệu được đọc và ghi vào file thường có các thao tác chính như sau:
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.I
NP
120
BT01.OU
T
trình
File Output
Trang 6Khai báo biến file
Đọc dữ liệu trong file
Tính toán để có kết quả
Lấy kết quả ghi vào file
Khai báo biến file:
Var f:text;
Ý nghĩa: khai báo biến f có kiểu file văn bản
Đọc dữ liệu trong file:
{dòng 1} assign(f,'BT01.INP');reset(f);
{dòng 2} read(f,n);
{dòng 3} close(f);
Ý nghĩa:
Dòng 1: Mở file ‘BT01.INP’ để đọc nội dung
Dòng 2: Đọc 1 giá trị số nguyên trong file ‘BT01.INP’ gán 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:
Var <tên biến file>:text;
Assign(<biến file>,<tên file>);reset(<biến file>);
Read(<biến file>,<danh sách biến>);
Hoặc Readln(<biến file>,<danh sách biến>);
Close(<biến file>);
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>);
Trang 7Dò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:
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 theo
Thủ tục đọc file: Readln(<biến file>,<danh sách các biến>)
Giống như thủ tục Read, nhưng điểm khác biệt là sau khi thực hiện đọc và gán giá trị cho biến xong thì đầu đọc sẽ xuống đấu dòng tiếp theo
Thủ tục ghi 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ả>);
Trong thao tác với file giống như việc in kết quả ra màn hình (chỉ khác là thay vì ta thực hiện in kết quả ra màn hình như thế nào thì sẽ ghi mọi thứ vào file như vậy)
5 Eoln
7 3 8 6 9 Eoln
4 5 6 7 9 Eoln
Eof File văn bản
Trang 8Cũng giống như bài toán 1, nhưng 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
Bài giải tham khảo:
var n,i:byte;
gt:longint;
f,g:text; {dùng 2 biến file f và g}
begin
assign(f,'BT02.INP');reset(f); {biến file f để làm file đọc dữ liệu}
assign(g,'BT02.OUT');rewrite(g); {biến file g làm file ghi dữ liệu}
while( not Eof(f)) do {đọc trong khi chưa kết thúc file}
begin
read(f,n); {hoặc readln(f,n) đều được}
gt:=1;
for i:=2 to n do
gt:=gt*i;
writeln(g,gt);
end;
close(f);
close(g);
end
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
Trang 9Bài giải tham khảo:
var a:array[1 100] of integer;
n,i:byte;
max:integer;
f:text;
begin
assign(f,'BT03.INP');reset(f);
readln(f,n); {Đọc số lượng phần tử gán cho biến n rồi đầu đọc xuống hàng}
for i:=1 to n do
read(f,a[i]);
close(f);
max:=a[1];
for i:=2 to n do
if max<a[i] then max:=a[i];
assign(f,'BT03.OUT');
rewrite(f);
writeln(f,max);
close(f);
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
Trang 10Bài giải tham khảo:
var a:array[1 100] of integer;
n,i:byte;
max:integer;
f,g:text;
begin
assign(f,'BT04.INP'); reset(f);
assign(g,'BT04.OUT'); rewrite(g);
while (not Eof(f)) do
begin
readln(f,n);
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 4: Cho nhiều dãy số, cứ mỗi một bộ hai dòng trong file sẽ mô tả một
dãy số nguyên
Yêu cầu: Tìm giá trị lớn nhất của mỗi dãy
Dữ liệu vào từ file ‘BT04.INP’ Với mỗi bộ 2 dòng:
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 ‘BT04.OUT’ ghi giá trị tìm được Tương ứng một dãy số
sẽ có một kết quả ghi trên mỗi dòng khác nhau trong file dữ liệu ra
Trang 11Bài giải tham khảo:
var a:array[1 100] of integer;
n,m,i,j:byte;
s:longint;
f,g:text;
begin
assign(f,'BT05.INP');reset(f);
assign(g,'BT05.OUT');rewrite(g);
for i:=1 to n do {đọc lần lượt n dòng tương ứng với n dãy số}
begin
m:=0; {m là số phần tử của dãy số}
while (not Eoln(f)) do {trong khi chưa kết thúc dòng}
begin
m:=m+1;
read(f,a[m]);
end;
readln(f); {Đưa đầu đọc xuống dòng tiếp theo để đọc dãy số mới}
s:=0;
for j:=1 to m do s:=s+a[j];
writeln(g,s);
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
Trang 12Bài giải tham khảo:
var s:string;
i,dem:byte;
f:text;
begin
assign(f,'BT06.INP');reset(f);
readln(f,s); {đọc toàn bộ chuỗi thì phải dùng Readln}
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
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
Trang 13Bà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);
writeln(f,dem);
close(f);
end
Bài toán 7: Cho một chuỗi 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 ‘BT07.INP’ chứa chuỗi ký tự đã cho
Kết quả ghi vào file ‘BT07.OUT’ ghi số lượng ký tự ‘a’ tìm được
Bài toán 8:
Cho dãy số nguyên
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á 109; 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à
Trang 14Bài giải tham khảo:
var x,i:longint;
ngto:boolean;
f,g:text;
begin
assign(f,'BT08.INP');reset(f);
assign(g,'BT08.OUT');rewrite(g);
while (not Eof(f)) do
begin
while (not Eoln(f)) do
begin
read(f,x);
{đoạn chương trình kiểm tra số nguyên x có
phải là nguyên tố hay không?}
ngto:=true;
if x<2 then ngto:=false else
for i:=2 to trunc(sqrt(x)) do
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
Trang 15Bài giải tham khảo:
var a,b:longint;
f,g:text;
begin
assign(f,‘BT09.INP’);reset(f);
assign(g,‘BT09.OUT’);rewrite(g);
while (not Eof(f)) do
begin
readln(f,a,b);
{đ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 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≤109; hai số cách nhau một khoảng trắng)
Kết quả ghi vào file ‘BT09.OUT’ tương ứng với mỗi dòng trong file input là
một kết quả
Ví dụ:
2 6
7 10
2
1
Trang 16Bài toán 10:
Cho số nguyên dương n
Yêu cầu: Hãy đếm số lượng chữ số 0 tận cùng của n!
Dữ liệu vào từ file ‘BT10.INP’ gồm nhiều dòng, mỗi dòng chứa một giá trị
của n (n≤109
)
Kết quả ghi vào file ‘BT10.OUT’ tương ứng với mỗi dòng trong file input là
một kết quả
Ví dụ:
3
10
0
2
Bài giải tham khảo:
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);
end;
close(f); close(g);
end