Tải bản đầy đủ (.doc) (14 trang)

tu dien2

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 (94.98 KB, 14 trang )

PHẦN IV: TỪ ĐIỂN
Yêu cầu:
Cho tệp văn bản trong đó chứa các từ, các dấu phân cách từ: dấu
cách, dấu phẩy, dấu chấm, dấu chấm phẩy, dấu hai chấm, dấu than, dấu
hỏi. Mọi từ bắt đầu bằng chữ cái ‘A’..’Z’ (không phân biệt chữ hoa và chữ
thường).
1. Viết thủ tục đọc các từ trong tệp văn bản và lưu trữ vào mảng các
danh sách liên kết:
Var
TuDien: array[‘A’..‘Z’] of DanhSach;
Type
DanhSach=^PhanTu;
PhanTu=Record
Tu:String[15];
Tiep:DanhSach;
End;
Mỗi danh sách liên kết trong từ điển xếp theo thứ tự tăng và các từ
khoá là khác nhau.
2.

Viết thủ tục hiển thị các từ ra màn hình theo thứ tự tăng.

3.

Viết thủ tục bổ sung từ mới bằng cách đọc từ bàn phím và tìm nó

trong từ điển.
-

Nếu thấy, thì hiển thị thơng báo ‘Đã có’.


-

Nếu khơng, chèn vào vị trí thích hợp.

4.

Viết Menu chương trình để:

-

Nhập thêm từ bằng cách đọc nội dung các tệp văn bản bổ sung

vào danh sách.
-

Hiển thị các từ ra màn hình.

-

Tìm kiếm từ nhập vào từ bàn phím có trong danh sách hay khơng?

-

Ghi dữ liệu từ danh sách vào tệp văn bản.


*****************
IV.1. Mét sè kh¸i niƯm:
IV.1. 1. Kh¸i niƯm vỊ con trá (Pointer)
1. Định nghĩa:

Con trỏ là một kiểu dữ liệu (dành 4 bytes trong bộ nhớ) mà các giá
trị của nó là địa chỉ của các phần tử của kiểu dữ liệu mà nó trỏ đến.
Các giá trị của biến thuộc kiểu T được phát sinh bất cứ lúc nào khi
biến đó được cấp phát bằng lệnh New.
2.Khai báo:
Gián tiếp :
Type Tên kiểu = ^ Kiểu dữ liệu;
Var

Tên biến: Tên kiểu;

Khai báo trực tiếp :
Var
Ví dụ 1:

Tên biến : ^ Kiểu dữ liệu;

Type Ref = ^ Nhansu;
Nhansu = Record
Data : DataType;
Next : Ref;
End;
Var

Ví dụ 2:

Var

p: ^Nhansu;
N : ^ Integer;


{N là con trỏ chỉ đến số nguyên}

Ta xét một khai báo có dạng :
Type

P = ^T;



P là biến kiểu con trỏ.



T là kiểu dữ liệu mà con trỏ trỏ tới.



P^ : Cho kết quả là giá trị kiểu T mà nó đang trỏ tới.



@ Chỉ địa chỉ của giá trị mà nó đang trỏ tới.
Vậy muốn truy xuất nội dung tại vị trí mà p đang trỏ tới ta dùng P^


Ngồi ra, cịn có một con trỏ tổng qt, nó không chỉ đến một kiểu dữ
liệu xác định nào cả.
Var


p : Pointer;

Kiểu dữ liệu con trỏ chiếm 4 bytes trong bộ nhớ, 4 bytes này sẽ
chứa địa chỉ của kiểu dữ liệu mà nó trỏ tới cịn bản thân biến mà nó trỏ tới
thì chưa có trong bộ nhớ.
Ví dụ :

Var

p : ^ Integer;
i : Integer;
Begin
i : = 5;
p : = @ i; {Hàm lấy địa chỉ của i và gán cho p}
Writeln ('Nội dung mà p đang trỏ tới :', p^);
Writeln ('Giá trị của biến i : ', i);
End.

3. Một số hàm thường dùng ở biến con trỏ:
a.

Cấp phát vùng nhớ :

New (p)

Thủ tục này sẽ cấp phát vùng nhớ động do con trỏ p quản lý và
đồng thời gán cho p địa chỉ đầu của vùng nhớ này.
b.

Thu hồi vùng nhớ đã cấp phát :


Dispose (p)

Thủ tục này sẽ hủy bỏ (giải phóng) vùng nhớ do p trỏ tới (quản lý).
c.

Đánh dấu / giải phóng hàng loạt vùng nhớ :
Mark (HeapTop)

Release (HeapTop)

Thủ tục Mark (HeapTop) sẽ gán giá trị của địa chỉ của vùng Heap
cho một con trỏ p nào đó. Con trỏ p này được dùng như để đánh dấu vị
trí đầu của vùng ơ nhớ sẽ được giải phóng sau này. Sau thủ tục Mark ta
có thể dùng hàng loạt thủ tục New để tạo các biến động khác nhau và
chúng sẽ chiếm ô nhớ bắt đầu từ vị trí đã được đánh dấu. Nếu muốn lấy
lại toàn bộ vùng nhớ đã cấp phát ta chỉ cần dùng thủ tục Release
(HeapTop). Tất nhiên là sau lệnh Release ta khơng cịn có thể sử dụng


các biến động được tạo ra bằng thủ tục New nằm trong vùng ơ nhớ vừa
được giải phóng.
d.

Thủ tục

GetMem (p, k)

Thủ tục này sẽ cấp phát k bytes vùng nhớ do con trỏ p quản lý.
e.


Thủ tục

FreeMem (p, k)

Thủ tục này sẽ thu hồi vùng nhớ đã được cấp phát bởi thủ tục
GetMem.
f.

Các hàm cho biết tình trạng của vùng nhớ :
Hàm MaxAvail: Longint: Hàm cho biết vùng nhớ lớn nhất còn trống

trong Heap.
Hàm MemAvail : Longint : Hàm cho biết tổng số bytes còn lại trên
Heap.
Hàm SizeOf (Biến): Longint: Cho biết số bytes được cấp phát / thu
hồi bởi biến.
Ví dụ : P là con trỏ trỏ đến kiểu RecordType nào đó.
If MaxAvail >= SizeOf (RecType) then New(p)
Else Writeln('Khơng đủ vùng nhớ cấp phát');
g.

Các hàm cho biết địa chỉ của một đối tượng trong bộ nhớ :
Hàm Add (x): Pointer: Cho biết địa chỉ tổng quát của biến x.
Hàm Seg (x): Word: Cho biết địa chỉ segment của biến x.
Hàm Ofs (x): Word: Cho biết địa chỉ Offset của biến x.
Hàm Ptr (Seg, Ofs): Pointer: Trỏ tới địa chỉ seg : Ofs.

IV.1.2. Danh sách liên kết:
énh ngha: Danh sỏch liên kết là danh sách mà các phần tử của

nó được nối kết với nhau nhờ vào vùng liên kết của chúng. Với danh
sách này, khi cài đặt ta không cần dùng bộ nhớ liên tục và không cần di
chuyển các phần tử khi xen hoặc xóa.
Mơ tả danh sách liên kết:


Ðể cài đặt danh sách liên kết, ta dùng con trỏ để liên kết các phần
tử của danh sách theo phương thức a i chỉ đến ai+1. Ðể một phần tử có
thể chỉ đến một phần tử khác ta xem mỗi ơ là một Record gồm có 2
trường :
Trường Elements để giữ nội dung của phần tử trong danh sách.
Trường Next là một con trỏ giữ địa chỉ của ô kế tiếp.
Phần tử cuối cùng của danh sách ta cho trỏ đến một giá trị đặc biệt
Nil.
Ðể quản lý danh sách ta cần một biến chỉ đến phần tử dấu danh
sách. Biến này được gọi là chỉ điểm đầu danh sách Header.
Header là một ơ có cùng kiểu với kiểu phần tử trong danh sách.
Nhưng trường Elementss của ô header là rỗng, cịn trường Next của ơ
Header thì giữ địa chỉ của phần tử đầu danh sách.
IV.2. CHƯƠNG TRÌNH:
Các modul thực hiện bài toán:
uses crt;
type
danhsach= ^phantu;
phantu = record
tu: string[15];
tiep: danhsach;
end;
result = -1..1;
var



tudien: array['A'..'Z'] of danhsach; ptr: pointer;
{ Thủ tục khởi tạo khoá từ A .. Z của từ điển }
procedure CreatTD;
var
p: danhsach; ch: char;
begin
for ch:='A' to 'Z' do
begin
new(p);
p^.tu[0] := chr(1);
p^.tu := ch; p^.tiep := NIL;
tudien[ch] := p;
end;
end;
{ Hàm so sánh 2 từ }
function Cmp(tu1, tu2: string): result;
var
i: byte;
begin
for i:=1 to length(tu1) do tu1[i] := upcase(tu1[i]);
for i:=1 to length(tu2) do tu2[i] := upcase(tu2[i]);
if tu1 > tu2 then cmp := 1
else
if tu1 = tu2 then cmp := 0
else cmp := -1;
end;



{ Thủ tục bổ sung từ vào danh sách theo khố của nó }
procedure InputTD(tu: string; key: char);
var
p, q, r: danhsach;
begin
p := tudien[key]; r := p;
new(q); q^.tu := tu; q^.tiep := NIL;
while (p <> NIL) and (cmp(tu,p^.tu) = 1) do
begin
r := p; p := p^.tiep;
end;
if p = nil then r^.tiep := q
else
if cmp(tu,p^.tu) = -1 then
begin
q^.tiep := r^.tiep; r^.tiep := q;
end;
end;

{ Thủ tục nhập thêm từ bằng cách đọc nội dung các tệp văn bản bổ sung
vào danh sách }
procedure AddListTD;
var
f: text; xau: string[255]; tu: string[15]; i, j: byte;
begin
write('Nhap tep van ban de bo sung vao tu dien: '); readln(xau);
assign(f,xau); reset(f);
while (not eof(f)) do



begin
i := 1; readln(f,xau);
while i<=length(xau) do
begin
j := 1;
while (xau[i]<>' ') and (xau[i]<>',') and (xau[i]<>'.') and
(xau[i]<>';') and (xau[i]<>':') and (xau[i]<>'!') and (xau[i]<>'?') and
(i<=length(xau)) do
begin
tu[j] := xau[i]; i := i+1; j := j+1;
end;
if j > 1 then
begin
tu[0] := chr(j-1);
InputTD(tu,upcase(tu[1]));
end;
i := i+1;
end;
end;
close(f);
end;
{ Thủ tục tìm kiếm từ. Nếu có thì thơng báo “Đã có trong từ điển”, nếu
khơng thì chèn vào vị trí theo đúng vị trí của nó trong từ điển }
procedure FindWord;
var
p, q, r: danhsach; tu: string[15]; ans: char;
begin
write('Nhap tu can tim: '); readln(tu);



p := tudien[upcase(tu[1])]; r := p;
new(q); q^.tu := tu; q^.tiep := NIL;
while (p<>NIL) and (cmp(tu,p^.tu) = 1) do
begin
r := p; p := p^.tiep
end;
if (p<>NIL) and (cmp(tu,p^.tu) = 0) then
begin
writeln('Da co trong tu dien'); readln;
end
else
begin
writeln('Tu vua nhap chua co trong tu dien');
repeat
write('Ban muon them vao (C\K): '); readln(ans);
until ((upcase(ans) = 'C') or (upcase(ans) = 'K'));
if upcase(ans)='C' then
begin
if p = nil then r^.tiep := q
else
if cmp(tu,p^.tu) = -1 then
begin
q^.tiep := r^.tiep; r^.tiep := q;
end;
end;
end;
end;
{ Thủ tục hiển thị các từ ra màn hình theo thứ tự tăng theo khố }



procedure ViewTD;
var
p: danhsach; ch: char; num: integer;count:integer;
begin
num := 0;count:=0;
for ch := 'A' to 'Z' do
begin
p := tudien[ch];
writeln(p^.tu); p := p^.tiep;
while p <> Nil do
begin
write(' ',p^.tu); p := p^.tiep;
count := count+1;
end;
num:=num+1;
if num=4 then
begin
writeln;writeln;
write('******* An phim Enter de tiep tuc...');
readln;
num:=0;
clrscr;
end;
writeln;
end;
write(' ********** Tu dien co ',count,' tu **********');
readln;
end;



{ Thủ tục ghi dữ liệu từ danh sách vào tệp văn bản }
procedure WriteTD;
var
ch: char; p: danhsach; f: text;Tentep:string[100];
begin
write('Nhap ten tep:');readln(Tentep);
assign(f,Tentep); rewrite(f);
for ch:='A' to 'Z' do
begin
p := tudien[ch];
writeln(f,p^.tu); p := p^.tiep;
while p<>NIL do
begin
write(f,' ',p^.tu); p := p^.tiep;
end;
writeln(f);
end;
close(f);
end;
{ Thủ tục tạo menu chương trình }
procedure Menu;
var
ans: byte;
begin
repeat
repeat
clrscr;
writeln(' +*+*+*+*+* MENNU +*+*+*+*+*');



writeln;
writeln('

1 : Xem tu dien');

writeln('

2 : Tim tu trong tu dien');

writeln('

3 : Bo sung tu vao tu dien tu tep van ban');

writeln('

4 : Ghi tu dien ra tep van ban');

writeln('

5 : Ket thuc chuong trinh');

writeln;
writeln(' +*+*+*+*+*+*+*+*+*+*+*+*+*+');
writeln;
write(' Lua chon (1..5): '); readln(ans);
clrscr;
until ((0 < ans) and (ans < 6));
case ans of
1: ViewTD;
2: FindWord;

3: AddListTD;
4: WriteTD;
end;
until ans = 5;
end;
{ Thân chương trình }
BEGIN
mark(ptr);
CreatTD;
Menu;
release(ptr);
END.


Giao diện chương trình:

Hiển thị từ điển ra màn hình:




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×