Я тоже мало понимаю в языке Delphi. Но есть возможность пригрузить на это дело нейросеть, например Монику. По началу она выдала вопросы:
Конечно, я могу помочь в написании кода на Delphi. Для начала, мне нужно понять формат файла KAT. Он должен быть в текстовом формате, разделенный определенным символом, например запятой или точкой с запятой. Кроме того, мне нужно уточнить, какие именно данные находятся в файле - это только те четыре поля, что вы указали или есть еще какие-то?
Также, мне нужно знать, в каком формате вы хотите получить результаты - в текстовом файле или на экране?
Я её предложил написать в текстовом файле.
И вот шо она наваяла:
Задание состоит в написании программы на языке Delphi для работы с файлом KAT, содержащим информацию о книгах. Программа должна уметь выводить записи с заданным годом издания, сортировать их по алфавиту и выводить сообщение, если записей с таким годом издания нет. Также программа должна уметь сортировать записи по возрастанию цены книги.
Предположим, что формат файла KAT выглядит так:
Автор1, Название1, 2001, 100
Автор2, Название2, 2003, 150
Автор3, Название3, 2002, 120
Для решения задачи
а) нам нужно открыть файл KAT, прочитать его содержимое и вывести записи с заданным годом издания в алфавитном порядке. Если записей с заданным годом нет, нужно выдать соответствующее сообщение. Вот код, который решает эту задачу:
procedure FindBooksByYear(year: Integer);
var
input, output: TextFile;
line: string;
books: TStringList;
i: Integer;
begin
AssignFile(input, 'KAT.txt');
Reset(input);
books := TStringList.Create;
try
// Читаем файл и сохраняем записи в список
while not Eof(input) do
begin
ReadLn(input, line);
books.Add(line);
end;
// Сортируем список по алфавиту
books.Sort;
// Ищем записи с заданным годом и записываем их в выходной файл
AssignFile(output, 'result.txt');
Rewrite(output);
for i := 0 to books.Count - 1 do
begin
if Pos(IntToStr(year), books) > 0 then
WriteLn(output, books);
end;
if FileSize(output) = 0 then
WriteLn(output, 'Записей с заданным годом не найдено.');
finally
CloseFile(input);
CloseFile(output);
books.Free;
end;
end;
Для решения задачи б) нам нужно открыть файл KAT, прочитать его содержимое и отсортировать записи в порядке возрастания цены книги. Затем мы записываем отсортированные записи в выходной файл. Вот код, который решает эту задачу:
Копировать
procedure SortBooksByPrice;
var
input, output: TextFile;
line: string;
books: TStringList;
begin
AssignFile(input, 'KAT.txt');
Reset(input);
books := TStringList.Create;
try
// Читаем файл и сохраняем записи в список
while not Eof(input) do
begin
ReadLn(input, line);
books.Add(line);
end;
// Сортируем список по цене книги
books.CustomSort(@CompareBooksByPrice);
// Записываем отсортированные записи в выходной файл
AssignFile(output, 'result.txt');
Rewrite(output);
for line in books do
WriteLn(output, line);
finally
CloseFile(input);
CloseFile(output);
books.Free;
end;
end;
function CompareBooksByPrice(list: TStringList; index1, index2: Integer): Integer;
var
price1, price2: Currency;
begin
price1 := StrToCurr(ExtractWord(4, list[index1], [',']));
price2 := StrToCurr(ExtractWord(4, list[index2], [',']));
if price1 < price2 then
Result := -1
else if price1 > price2 then
Result := 1
else
Result := 0;
end;
Обратить внимание, что мы используется функция ExtractWord из модуля StrUtils, чтобы извлечь цену книги из каждой записи. Также определяется функция CompareBooksByPrice, которая используется для сортировки списка книг по цене.