Để làm việc với dữ liệu kiểu tệp ta phải khai báo biến tệp. Trong lập trình thao tác với dữ liệu của tệp thông qua biến tệp, có thể hiểu biến tệp được ngôn ngữ lập trình sử dụng như đại [r]
(1)Chuyên đề : KIỂU DỮ LIỆU TỆP
VỚI BÀI TỐN TÌM KIẾM VÀ SẮP XẾP TRONG NGƠN NGỮ LẬP TRÌNH PASCAL I/ MỘT SỐ THAO TÁC TRÊN TỆP VĂN BẢN:
1/ Khai baùo:
Để làm việc với liệu kiểu tệp ta phải khai báo biến tệp VAR <tên biến tệp> : Text;
Ví dụ: Khai báo hai biến tệp văn f1, f2 có dạng: Var f1, f2 : Text;
2/ Thao tác với tệp:
a/ Gắn tên tệp:
Mỗi tệp liệu có tên tệp để tham chiếu Trong lập trình thao tác với liệu tệp thơng qua biến tệp, hiểu biến tệp ngơn ngữ lập trình sử dụng đại diện cho tệp Do đó, muốn thao tác với tệp trước hết phải gắn tên tệp cho biến tệp
Assign (<biến tệp>, <tên tệp>); Trong đó: Tên tệp xâu biến xâu.
Ví dụ: Gắn tệp DATA.INP DATA.OUT thư mục gốc đĩa C cho biến tệp f1, f2 Cách Trực tiếp.
Assign(f1,’C:\DATA.INP’); Assign(f2,’C:\DATA.OUT’); Cách Gián tiếp.
+ Trường hợp tên tệp xâu.
Const fi = ’C:\DATA.INP’; fo = ’C:\DATA.OUT’; …
Assign(f1,fi); Assign(f2,fo); + Trường hợp tên tệp biến xâu.
Var fi,fo: String[20]; …
fi := ’C:\DATA.INP’; fo := ’C:\DATA.OUT’; Assign(f1,fi);
Assign(f2,fo);
b/ Mở tệp:
Mở tệp để đọc liệu:
Gắn tên tệp
Reset(<biến tệp>);
(2)Gắn tên tệp
Rewrite(<biến tệp>);
Ví dụ: Assign(f2,’C:\DATA.OUT); Rewrite(f2);
c/ Đọc - ghi liệu từ tệp:
Đọc liệu từ tệp:
Read(<biến tệp>,<Danh sách biến vào>); Readln(<biến tệp>,<Danh sách biến vào>); Readln(<biến tệp>);
Ví dụ: Read (f1,a,b,c); readln(f1); Readln(f1,a,b,c);
Ghi liệu vào tệp:
write(<biến tệp>,<Danh sách kết quả>); writeln(<biến tệp>,<Danh sách kết quả>); writeln(<biến tệp>);
Ví dụ: write(f2,‘PTVN’); writeln(f2); writeln(f2,‘PTVN’);
d/ Đóng tệp:
Close(<biến tệp>); Ví dụ: Close(f1); Close(f2);
II/ VẬN DỤNG KIỂU DỮ LIỆU TỆP ĐỂ GIẢI BÀI TỐN TÌM KIẾM VÀ SẮP XẾP:
1/ Bài tốn tìm kiếm:
Cho dãy A gồm N số nguyên khác nhau: a1, a2, , aN và số nguyên k (khúa tỡm kiếm). Cần biết có hay khơng số i (1 i N) mà = k Nếu có cho biết số
a/ Thuật tốn tìm kiếm (Sequential Search):
Input: D·y A gåm N sè nguyên khác a1, a2, , aN số nguyên k;
Output: ChØ sè i mµ ai = k thông báo số hạng dÃy A có giá trị k + Trng hp 1: Tìm thấy, đưa ra: Chỉ số i mà = k;
SEARCH.INP SEARCH.OUT
6 10
4 11 10 -6 Chi so :
+ Trường hợp 2: Khơng tìm thấy, đưa thơng báo: Dãy A khơng có số hạng có giá trị k;
SEARCH.INP SEARCH.OUT
8 12
5 11 10 -6 -1 Day A khong co so hang nao co gia tri bang k Program Tim_kiem_tuan_tu_Cach1;
Const max = 100;
(3)i,k,N :integer; f1,f2 :text;
Procedure NHAP; Begin
Assign(f1, 'C:\SEARCH.INP');Reset(f1); readln(f1,N,K);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure XULI; Var tt:Boolean; Begin
Assign(f2, ‘C:\SEARCH.OUT');Rewrite(f2); tt := false;
for i:=1 to N do
if a[i] = k then tt := true; if tt then write(f2,'Chi so:',i)
else writeln(f2,'Day A khong co so hang nao co gia tri bang k'); close(f2);
End;
BEGIN {main program} NHAP;
XULI; END.
Program Tim_kiem_tuan_tu_Cach2; Const max = 100;
Var a : array[1 max] of integer; i,k,N :integer;
f1,f2 :text;
Procedure NHAP; Begin
Assign(f1, 'C:\SEARCH.INP');Reset(f1); readln(f1,N,K);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure XULI; Begin
Assign(f2, ‘C:\SEARCH.OUT');Rewrite(f2); while (a[i] <> k) and (i <= N) i:=i+1; if a[i] = k then write(f2,'Chi so:',i)
else writeln(f2,'Day A khong co so hang nao co gia tri bang k'); close(f2);
End;
BEGIN {main program}
NHAP;XULI;
END.
Program Tim_kiem_tuan_tu_Cach3; Const max = 100;
(4)f1,f2 :text;
Procedure NHAP; Begin
Assign(f1, 'C:\SEARCH.INP');Reset(f1); readln(f1,N,K);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure XULI; Var t:integer; Begin
Assign(f2, ‘C:\SEARCH.OUT');Rewrite(f2); for i:=1 to N do
if a[i] = k then begin
t := i; break; end;
if t > then write(f2,'Chi so:',i)
else writeln(f2,'Day A khong co so hang nao co gia tri bang k'); close(f2);
End;
BEGIN {main program} NHAP;
XULI; END.
b/ Thuật tốn tìm kiếm nhị phân (Binary Search):
Input: Dãy A dãy tăng gồm N số nguyên khác nhau: a1, a2, , aN số nguyên k;
Output: ChØ sè i mà ai = k thông báo số hạng dÃy A có giá trị k + Trường hợp 1: Tìm thấy, đưa ra: Chỉ số i mà = k;
SEARCH.INP SEARCH.OUT
8 15
2 15 18 30 35 42 Chi so :
+ Trường hợp 2: Khơng tìm thấy, đưa thơng báo: Dãy A khơng có số hạng có giá trị k;
SEARCH.INP SEARCH.OUT
8 28
5 11 15 26 37 41 59 Day A khong co so hang nao co gia tri bang k Program Tim_kiem_nhi_phan_Cach1;
Const max = 100;
Var a : array[1 max] of integer; n,i,k,d,c,g: integer;
Procedure NHAP; Begin
Assign(f1, 'C:\SEARCH.INP');Reset(f1); readln(f1,N,K);
(5)close(f1);
End;
Procedure XULI; Begin
Assign(f2, ‘C:\SEARCH.OUT');Rewrite(f2); d := 1;
c := n;
g := (d + c) div 2;
while (a[g] <> k) and (d <= c) Begin
if a[g] > k then c := g - 1 else d := g + 1;
g := (d + c) div 2; End;
if d > c then
writeln(f2,'Day A khong co so hang nao co gia tri bang k') else writeln(f2,'Chi so:',g );
close(f2);
End;
BEGIN {main program} NHAP;
XULI; END.
Program Tim_kiem_nhi_phan_Cach2; Const max = 100;
Var a : array[1 max] of integer; i,k,N,d,c,g: integer;
Procedure NHAP; Begin
Assign(f1, 'C:\SEARCH.INP');Reset(f1); readln(f1,N,K);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure XULI; Var tt :Boolean; Begin
Assign(f2, ‘C:\SEARCH.OUT');Rewrite(f2); d := 1;
c := n;
tt := false;
while (d <= c) and (not(tt)) Begin
g := (d +c ) div 2;
if a[g] = k then tt := true
else if a[g] > k then c := g - 1 else d := g + 1;
end;
if tt then writeln(f2,'Chi so:',g )
(6)End;
BEGIN {main program} NHAP;
XULI; END.
2/ Bài toán xếp:
Cho dãy A gồm N số nguyên a1, a2, …, aN Cần xếp số hạng để dãy A trở thành dãy không giảm (tức số hạng trước không lớn số hạng sau : ai ai+1)
Input: Số nguyên dương N dãy số nguyên a1, a2, , aN Output: Dãy A xếp thành dãy không giảm.
SORT.INP SORT.OUT
8
37 11 26 59 11 41
5 11 11 26 37 41 59
a/ Thuật toán xếp tráo đổi (Exchange Sort):
+ Cách So sánh hai phần tử kề nhau, số hạng trước lớn số hạng sau đổi chỗ cho nhau, giá trị lớn dãy A chuyển dần cuối dãy sau lượt thứ giá trị lớn xếp vị trí cuối dãy Tương tự, sau lượt thứ hai, giá trị lớn thứ hai xếp vị trí sát cuối , … dãy phần tử nhỏ cuối xếp
Program Sap_xep_bang_trao_doi_Cach1; Const fi = 'C:\SORT.INP';
fo = 'C:\SORT.OUT'; max = 100;
Var a : array[1 max] of integer; i,j,N : integer;
f1,f2: text;
Procedure NHAP; Begin
Assign(f1,fi);Reset(f1); readln(f1,N);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure HOANDOI(var x,y:integer);
Var tg : integer;
Begin
tg := x; x := y; y := tg;
End;
Procedure SAPXEP; Begin
for j := N downto for i := to j -
if a[i] > a[i+1] then HOANDOI(a[i],a[i+1]);
End;
(7)Assign(f2,fo); Rewrite(f2);
for i:=1 to N write(f2,a[i]:4); close(f2);
End;
BEGIN {main program} NHAP;
SAPXEP; XUAT; END.
+ Cách So sánh hai phần tử không kề nhau, số hạng trước (ai : I = N-1) lớn số hạng sau (aj: J = I +1 N) đổi chỗ cho nhau, giá trị nhỏ dãy A chuyển dần đầu dãy sau lượt thứ giá trị nhỏ xếp vị trí đầu dãy Tương tự, sau lượt thứ hai, giá trị nhỏ thứ hai xếp vị trí thứ hai dãy, … dãy phần tử lớn cuối xếp
Program Sap_xep_bang_trao_doi_Cach2; Const fi = 'C:\SORT.INP';
fo = 'C:\SORT.OUT'; max = 100;
Var a : array[1 max] of integer; i,j,N : integer;
f1,f2: text;
Procedure NHAP; Begin
Assign(f1,fi);Reset(f1); readln(f1,N);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure HOANDOI(var x,y:integer);
Var tg : integer;
Begin
tg := x; x := y; y := tg;
End;
Procedure SAPXEP; Begin
for i:= to N -1 do for j := i + to N do
if a[i] > a[j] then HOANDOI(a[i],a[j]);
End;
Procedure XUAT; Begin
Assign(f2,fo); Rewrite(f2);
for i:=1 to N write(f2,a[i]:4); close(f2);
End;
BEGIN {main program} NHAP;
(8)
b/ Thuật toán xếp nhanh (Quick Sort):
Nội dung phương pháp chọn phần tử x dãy làm chuẩn so sánh Sau phân
hoạch dãy cho thành ba dãy liên tiếp nhau: + Dãy thứ gồm phần tử nhỏ x; + Dãy thứ hai gồm phần tử x; + Dãy thứ ba gồm phần tử lớn x
SORT.INP SORT.OUT
10
37 11 26 59 11 41
1 11 11 26 37 41 59
Program Sap_xep_nhanh; Const fi = 'C:\SORT.INP'; fo = 'C:\SORT.OUT'; max = 100;
Var a : array[1 max] of integer; i,j,N : integer;
f1,f2: text;
Procedure NHAP; Begin
Assign(f1,fi);Reset(f1); readln(f1,N);
for i:=1 to N read(f1,a[i]); close(f1);
End;
Procedure HOANDOI(var x,y:integer);
Var tg : integer;
Begin
tg := x; x := y; y := tg;
End;
Procedure XUAT; Begin
Assign(f2,fo); Rewrite(f2);
for i:=1 to N write(f2,a[i]:4); close(f2);
End;
Procedure XULI;
Procedure SORT(l,r : integer); Var x : integer;
Begin
x := a[(l + r) div 2]; i := l;
j := r; Repeat
(9)if i <= j then Begin
HOANDOI(a[i],a[j]); i := i + 1;
j := j - 1; End;
Until i > j;
if l < j then SORT(l,j); if i < r then SORT(i,r);
End; Begin
SORT(1,N);
End;
BEGIN {main program} NHAP;
XULI; XUAT; END.