Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на забитие гвоздя )
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SKVOZNJAK
Не влезло: "винченного отвёрткой"


Садисткая задача. Имеется цикл :

for a:=b to c do begin

end;

Все приведённые переменные типа Int64. Имеющийся у вас компилятор поддеpживает операции с такими переменными, но считает недопустимым строить на них циклы. Внимание задание! Напишите заменитель цикла, наиболее изящное решение. Код должен нормально работать при любых допустимых значениях переменных a,b,c.
eXtractor
И почему мое сообщение удалили?
Ладно, повторю. Это не подойдет?
a:=b;
while a<>c do begin

inc(a);
end;


М
Не удалили. Было временно скрыто по известным тебе причинам. Сейчас действительно удаляю, раз уж сдублировано.. Lapp

Bokul
Цитата
Имеющийся у вас компилятор поддеpживает операции с такими переменными, но считает недопустимым строить на них циклы .

eXtractor, как думаешь while это цикл?

Ну можно построить конструкцию с меткой и if.
Типа:

a:=b;
метка
inc(a);
if a<=c then goto метка

volvo
eXtractor, а подумать не забыл? Сказано же было:
Цитата
Код должен нормально работать при любых допустимых значениях переменных a,b,c.
Делаем:

a := -1;
b := -2;

{ твой цикл }

и наслаждаемся smile.gif ...

Bokul, а ты пробовал на FPC сделать цикл FOR на параметре Int64? Не делается, а While - проходит... Так что, While скорее можно использовать, чем нельзя...
Bokul
Цитата
Bokul, а ты пробовал на FPC сделать цикл FOR на параметре Int64?

Нет, но и в моем варианте нету цикла FOR.
eXtractor
Цитата(volvo @ 14.12.2006 1:55) *
eXtractor, а подумать не забыл? Сказано же было:
Делаем:

a := -1;
b := -2;

{ твой цикл }

и наслаждаемся smile.gif ...


В задаче использован именно to — так его тоже зациклит при таких числах.
Lapp
volvo, ты имел в виду
b:=-1;
c:=-2;
?
Цитата(eXtractor @ 14.12.2006 9:13) *

В задаче использован именно to — так его тоже зациклит при таких числах.

Нет, цикл for не станет выполняться совсем, если конечная величина меньше начальной. Проверка выполняется перед входом и проверка эта не на равенство, а на "больше".
Интересно, что даже при начальной величине меньше конечной твой цикл не выполнит последнего шага (при а=с), а for должен выполнить.
volvo
Цитата(Lapp @ 14.12.2006 8:00)
volvo, ты имел в виду
b:=-1;
c:=-2;
?
yes2.gif Именно... Опечатка вышла...
SKVOZNJAK
Заметьте, не я произнёс на этот раз goto smile.gif Хотя именно его и пришлось использовать для поиска фразы в длинных файлах вместо for. Просто интересно было посмотреть как вы будете выкручиваться чтобы не произнести это слово. Вообще-то под переменной C я понимал конец файла - 0 или величину положительную, про другой вариант не подумал. С такими условиями вроде так.

a:=b;
if c<a then goto 2;
1:

if a=c then goto 2;
inc(a);
goto 1;
2:

Под линуксом как-то удавалось накормить for конечной величиной меньше начальной. При выполнении начальная величина многократно возрастала. Баг конкретной версии компилятора.
Michael_Rybak
Либо я чего-то не понимаю, либо одно из двух. Объясните мне плиз, почему while не подходит?

a := b;
while a <= c do begin
...
Inc(a);
end;



Всегда считал, что for работает именно так.
SKVOZNJAK
Как оказалось подходит, компилятор не ругается. Прикол сорвался( Но всё равно, в сложных циклах со множеством условий и необходимостью выйти строго в определённой точке просто цикл подходит слабо. Нужно задачу дробить на множество подзадач. В СИ как то умудряются обходиться без меток, наверно меньше узких мест или ещё что то.
klem4
А из-за чего вообще нельзя мутить цикл for для int64 ? Тип то "целый".
Michael_Rybak
Цитата(SKVOZNJAK @ 14.12.2006 20:18) *

Как оказалось подходит, компилятор не ругается. Прикол сорвался( Но всё равно, в сложных циклах со множеством условий и необходимостью выйти строго в определённой точке просто цикл подходит слабо. Нужно задачу дробить на множество подзадач. В СИ как то умудряются обходиться без меток, наверно меньше узких мест или ещё что то.


В моей практике встречаются довольно сложные циклы (пишу на с++), и goto пользуюсь крайне редко; может раза два за последний год. Обычно break и continue с головой хватает, а если в цикле сильно много кода, то возникает вопрос, а не разбить ли это дело на процедуры в целях читабельности. Тогда и goto обычно сам собой уходит за ненадобностью.

volvo
Цитата
В моей практике встречаются довольно сложные циклы <...>, и goto пользуюсь крайне редко;

yes2.gif +1 ... Причем я использую (когда уже приходится) только goto вниз - но не наверх...
SKVOZNJAK
А в чём разница, если гото потом обратно в цикл возвращает, то это уже аналог процедуры.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.