Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на забитие гвоздя )

Автор: SKVOZNJAK 13.12.2006 5:58

Не влезло: "винченного отвёрткой"


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


for a:=b to c do begin

end;

Все приведённые переменные типа Int64. Имеющийся у вас компилятор поддеpживает операции с такими переменными, но считает недопустимым строить на них циклы. Внимание задание! Напишите заменитель цикла, наиболее изящное решение. Код должен нормально работать при любых допустимых значениях переменных a,b,c.

Автор: eXtractor 14.12.2006 5:08

И почему мое сообщение удалили?
Ладно, повторю. Это не подойдет?

a:=b;
while a<>c do begin

inc(a);
end;


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


Автор: Bokul 14.12.2006 5:48

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

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

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

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


Автор: volvo 14.12.2006 5:55

eXtractor, а подумать не забыл? Сказано же было:

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

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

{ твой цикл }

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

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

Автор: Bokul 14.12.2006 6:11

Цитата
Bokul, а ты пробовал на FPC сделать цикл FOR на параметре Int64?

Нет, но и в моем варианте нету цикла FOR.

Автор: eXtractor 14.12.2006 12:13

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

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

{ твой цикл }

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


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

Автор: Lapp 14.12.2006 13:00

volvo, ты имел в виду
b:=-1;
c:=-2;
?

Цитата(eXtractor @ 14.12.2006 9:13) *

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

Нет, цикл for не станет выполняться совсем, если конечная величина меньше начальной. Проверка выполняется перед входом и проверка эта не на равенство, а на "больше".
Интересно, что даже при начальной величине меньше конечной твой цикл не выполнит последнего шага (при а=с), а for должен выполнить.

Автор: volvo 14.12.2006 13:08

Цитата(Lapp @ 14.12.2006 8:00)
volvo, ты имел в виду
b:=-1;
c:=-2;
?
yes2.gif Именно... Опечатка вышла...

Автор: SKVOZNJAK 14.12.2006 17:05

Заметьте, не я произнёс на этот раз 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 14.12.2006 20:05

Либо я чего-то не понимаю, либо одно из двух. Объясните мне плиз, почему while не подходит?

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



Всегда считал, что for работает именно так.

Автор: SKVOZNJAK 15.12.2006 1:18

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

Автор: klem4 15.12.2006 2:23

А из-за чего вообще нельзя мутить цикл for для int64 ? Тип то "целый".

Автор: Michael_Rybak 15.12.2006 18:35

Цитата(SKVOZNJAK @ 14.12.2006 20:18) *

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


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


Автор: volvo 15.12.2006 18:57

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

yes2.gif +1 ... Причем я использую (когда уже приходится) только goto вниз - но не наверх...

Автор: SKVOZNJAK 18.12.2006 23:08

А в чём разница, если гото потом обратно в цикл возвращает, то это уже аналог процедуры.