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;
Благодарю всех за активное обсуждение!