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.
А вот тестовый файл
- Код: Выделить всё
 20 30 40
Если убрать звездный комментарий, то получится 3, а если примитивно, то 4. Книжные примеры я упрощал, конечно, но в боевых программах надо учитывать такие вещи, как пустые строки и прочие несуразности. Программку в книге я подправлю, конечно.
Paster Fob писал(а):4-ый вариант я вот так решил:
Немножко не дотягивает до правильного. Сделайте пароль длиннее
- Код: Выделить всё
 while length(s)<40 do begin
и увидите, что некоторые соседи не на месте. Тут в каждой ветке надо цикл подбора символа закрутить.
tema писал(а):Я бы решил так:
Пара замечаний.
1. Решение уместно после 44-й главы, где уже рассмотрены массивы и операции со строками.
2. В строке
- Код: Выделить всё
 v:= ((v+Random(2)) mod 3)+1;
маленькая ошибка, надо
- Код: Выделить всё
 v:= ((v+1+Random(2)) mod 3)+1;
Кстати, в других задачах можно применить обобщение этой формулы для случайного выбора из N ветвей:
- Код: Выделить всё
 v:= ((v+1+Random(N-1)) mod N)+1;
 Благодарю всех за активное обсуждение!