我正在创建一个程序,显示包含标题,作者和ISBN的10本书的列表。该程序可以显示记录并对它们进行排序,但我很难找到他。我不知道在哪里将FindArray标识符实现到代码中,我不知道如何让程序搜索本书。记录存储在.dat文件中。任何帮助,将不胜感激。这是代码:
uses SysUtils;
type TBook = Record
Number : integer;
Title : String[50];
Author : String[50];
ISBN : String[13];
end;
var Book : TBook;
CurrentFile : File Of TBook;
index : integer;
FindArray : array[1..10] of TBook;
Procedure Add_Book;
var Title, Author, ISBN : String;
index : integer;
begin
Assign (CurrentFile, 'C:\Books.dat');
reset (CurrentFile);
Seek (CurrentFile, filesize(CurrentFile));
Book.Number := (filepos(CurrentFile)+1);
writeln ('Type in book title');
readln (Title);
For index := 1 to Length(Title) do
Title[index] := Upcase(Title[index]);
Book.Title := Title;
writeln ('Type in author');
readln (Author);
For index := 1 to Length(Author) do
Author[index] := Upcase(Author[index]);
Book.Author := Author;
writeln ('Type in ISBN');
readln (ISBN);
For index := 1 to Length(ISBN) do
ISBN[index] := Upcase(ISBN[index]);
Book.ISBN := ISBN;
write (CurrentFile, Book);
Close (CurrentFile);
end;
Procedure Show_All;
begin
Assign (CurrentFile, 'C:\Books.dat');
reset (CurrentFile);
while filepos(CurrentFile) <> filesize(CurrentFile) do
begin
read (CurrentFile, Book);
writeln ('File: ', Book.Number);
writeln ('Title: ', Book.Title);
writeln ('Author: ', Book.Author);
writeln ('ISBN: ', Book.ISBN);
writeln;
end;
writeln;
write ('END OF FILE!');
readln;
Close (CurrentFile);
end;
Procedure Delete_All;
begin
Assign (CurrentFile, 'C:\Books.dat');
reset (CurrentFile);
seek (CurrentFile,0);
Truncate (CurrentFile);
Close (CurrentFile);
end;
Procedure Menu;
var option :integer;
begin
writeln ('Press appropriate number');
writeln;
writeln ('1. Search book');
writeln ('2. Quit');
readln (option);
CASE option of
1: show_all;
2: delete_all
else;menu
end; {End Case}
end;
begin
Assign (CurrentFile, 'C:\Books.dat');
reset (CurrentFile);
index := 0;
while not eof(CurrentFile) do
begin
index := index+1;
read (CurrentFile, Book);
end;
index := Book.Number;
repeat
menu
until eof(CurrentFile);
close (CurrentFile)
end.
到目前为止,这是我的代码。我该怎么做才能搜索书名或作者?
答案 0 :(得分:1)
如果我有一个所有使用相同基本结构的记录列表,并且我希望能够搜索它们并找到与某个过滤器模式匹配的记录,那么我要做的第一件事就是将它放入SQL数据库中而不是file of [record type]
。然后我可以简单地运行一个查询:select * from BOOKS where TITLE = :title
并让DBMS处理细节。
如果你不能这样做,有两种基本的方法来运行你自己的过滤:通过线性搜索和键查找。
它们都以相同的方式启动:将整个文件读入内存,转换为TBook数组。你接下来要做什么取决于你的策略。
线性搜索非常简单:
function FindBookIndex(const searchTitle: string): integer;
begin
for i := 0 to high(bookArray) do
if bookArray[i].Title = searchTitle then
exit(i);
result := -1; //not found
end;
索引搜索需要更多的工作,但实际运行搜索要快得多。您为整数(数组索引)设置了TDictionary
映射字符串(标题)。然后运行查找,在字典上调用TryGetValue
,如果没有结果则返回-1。请注意,这仅适用于完全匹配;如果你想进行部分匹配(例如,标题中包含单词“Wind”的书籍),你需要线性搜索或多更复杂的索引方案。
但同样,最简单的方法是将其放入数据库中。