Valeriy писал(а):Для чего в программе применена инструкция - if EoLn(aFile) then Readln(aFile);
Еще раз благодарю "Valeriy" за этот вопрос и хочу вернуться к нему. Я вспомнил, в чем там дело было. Когда последняя строка НЕ завершается возвратом каретки, то количество чисел считается правильно, а иначе считается на 1 больше и считывается еще одно несуществующее число как ноль. Дело в том, что EOLN=TRUE и в конце файла тоже. Вот тестовая программка.
Код: Выделить всё
function ReadNumbers(var aFile: text): integer;
var cnt,n: integer;
begin
cnt:=0;
while not Eof(aFile) do begin
{ Пропуск пустых строк }
(*
while Eoln(aFile) do
if Eof(aFile) then Break else Readln(aFile);
if Eof(aFile) then Break;
*)
Read(aFile, n);
Inc(cnt);
end;
ReadNumbers:= cnt;
end;
var F: Text;
begin
Assign(F, 'Test.txt'); Reset(F);
Writeln(ReadNumbers(F));
Close(F);
Readln;
end.
А вот тестовый файл
Если убрать звездный комментарий, то получится 3, а если примитивно, то 4. Книжные примеры я упрощал, конечно, но в боевых программах надо учитывать такие вещи, как пустые строки и прочие несуразности. Программку в книге я подправлю, конечно.
Paster Fob писал(а):4-ый вариант я вот так решил:
Немножко не дотягивает до правильного. Сделайте пароль длиннее
и увидите, что некоторые соседи не на месте. Тут в каждой ветке надо цикл подбора символа закрутить.
tema писал(а):Я бы решил так:
Пара замечаний.
1. Решение уместно после 44-й главы, где уже рассмотрены массивы и операции со строками.
2. В строке
маленькая ошибка, надо
Кстати, в других задачах можно применить обобщение этой формулы для случайного выбора из N ветвей:
Благодарю всех за активное обсуждение!