Из группы файлов найти тот, в котором наибольшее количество строк - Free Pascal
Формулировка задачи:
Из группы файлов найти тот, в котором наибольшее кол-во строк. Очень хочу разобраться. Заранее спасибо
Решение задачи: «Из группы файлов найти тот, в котором наибольшее количество строк»
textual
Листинг программы
uses dos;
const
path = 'd:\test\';
function getSum(n : longint) : Integer;
begin
GetSum := 0;
while n > 0 do
begin
Inc(GetSum, n mod 10);
n := n div 10;
end;
end;
var
MaxLines : integer;
MaxName : string;
procedure CheckFile(fn : string);
var
t : text;
s : string;
value : longint;
code, lines : integer;
has_27 : boolean;
begin
{$i-}
assign(t, fn);
reset(t);
{$i+}
if ioresult <> 0 then
begin
writeln('Ошибка при открытии файла ', fn);
exit;
end;
lines := 0; has_27 := false;
while not eof(t) do
begin
readln(t, s); inc(lines);
val(s, value, code);
if code = 0 then { <--- Все в порядке, целое число }
begin
has_27 := has_27 or (GetSum(value) = 27);
end;
end;
if (MaxLines < lines) and has_27 then
begin
MaxLines := lines;
MaxName := fn;
end;
end;
var
Info : SearchRec;
begin
MaxLines := 0;
MaxName := '';
FindFirst(path + '*.txt', AnyFile, Info);
while DosError = 0 do
begin
CheckFile(path + Info.name);
FindNext(info)
end;
FindClose(Info);
if MaxLines > 0 then
Writeln ('Поиск окончен. ', MaxName, ' содержит ', MaxLines,' строк')
else
Writeln ('Либо нет txt-файлов, либо ни один из них не содержит числа с суммой цифр = 27');
end.
Объяснение кода листинга программы
- Объявлены константы и переменные:
- path = 'd:\test\';
- MaxLines = 0;
- MaxName = '';
- функции getSum и CheckFile;
- переменные t, s, value, code, lines, has_27;
- переменная Info для работы с файлами.
- В функции getSum вычисляется сумма цифр числа.
- В процедуре CheckFile проверяется содержимое файла на наличие чисел с суммой цифр равной 27.
- Открывается файл с помощью функции assign.
- Если файл не удалось открыть, выводится сообщение об ошибке и процедура завершается.
- Считывается каждая строка файла до тех пор, пока не будет достигнут конец файла.
- Если строка содержит число, проверяется его сумма цифр с помощью функции getSum.
- Если сумма цифр равна 27, увеличивается счетчик линий и устанавливается флаг has_27.
- Если (MaxLines < lines) и has_27, то значения MaxLines и MaxName обновляются.
- В основной части программы открывается поиск файлов с помощью функции FindFirst.
- Поиск продолжается до тех пор, пока не будет достигнут конец списка файлов.
- Для каждого найденного файла вызывается процедура CheckFile.
- Если MaxLines больше 0, выводится сообщение о завершении поиска и имя файла с количеством строк.
- Если ни один файл не удовлетворяет условиям, выводится соответствующее сообщение.