Шаг для цикла For

Наверняка справку взломали ))

Наезд кульных хацкеров?

Может быть разберётесь, что у меня с учёткой?

о это еще кто то читает, здрово…))) по моему те кто делает цикл через жопу у того руки кривые… а кто усложняет примитивные вещи тот вообще не достоин жить. Выложили бы исходник компилятора, былоб здорова, а то из за одного For придутся ломать…

1 лайк

На GitHub есть полный исходник Паскаля.

убожество %D0%A8%D0%90%D0%93 Если цикл For построен на while, то кто мешает менять счетчик, в место n++, сделать n+=step; ??? видимо упрямство… что то мне это напоминает… не совсем адекватное…

Перенёс сюда, тема то о PascalABC.NET.

С одной стороны - да, будет смесь. Но с другой - язык будет более универсален, но это с учётом того, что эти конструкции будут полезны в этом языке и будут применяться на практике. С циклом for двоякая ситуация - если добавим его вариант с указанием шага, то да - это расширит функционал языка. Но будет ли этот функционал использоваться большинством пользователей? Надо ориентироваться все же на то, какое мнение имеет об этом сообщество и нужно ли ему это, а не на мнение одного человека. Поэтому предлагаю сделать ТС опрос.

Лично мое мнение - я не против введения нового варианта для for. Если не введут - не велики потери, без этого уже сколько прожили, и дальше проживут.

1 лайк

Когда я впервые увидел синтаксис оператора цикла в языке Паскаль и узнал, что автор языка Н.Вирт, принимавший участие в создании языков Algol-60, Algol-68 и входивший в комитет, разработавший язык PL/1, я сильно жалел, что не могу ему сказать фразу из фильма “Республика Шкид”: - Ну и гад же ты, Костя Федотов!.

В языке Алгол-60 можно было писать

for k:=1 step 1 until r, p step 2 until n do 

да и сам цикл мог использовать также вещественные переменные.

В PL/1 можно было написать

DO I=1 TO 5 BY 2, 6 TO 8 BY 1 WHILE (S<0), N-1, N;
   S=S*A(I);

и тоже можно было работать с вещественными и даже комплексными (!) числами.

Но в PascalABC.NET есть последовательности и это решает все. Ни к чему ставить на уши разработчиков разговорами о ломке синтаксиса, когда легко можно сгенерировать нужную последовательность.

foreach var k in Range(1,r)+Range(p,n) do ...

foreach var x in Seq(2,4, -5.9, 132.16, 0.353, -2.4e-5) do ...

Это легко закрывает проблему.

1 лайк

Особенно если учесть, что они работают медленнее.

Медленнее чего и насколько медленнее? Или это так, абстрактное рассуждение? Тестовый и пример и результаты замера, пожалуйста.

Действительно, смысл приколупываться к циклу с параметрами for, когда есть более гибкие repeat и while, а то набегут любители дробных параметров-функций и устроят холивар сколько раз должен “правильно” выполняться цикл вида

for i:=0 to 9 step 2.1
// или
for i:=1 to 9 step ((9-i)/2)
, не говоря о скучающих поклонниках рекурсий и **goto**-шниках)

Да, если известно ОТ, ДО и ШАГ, то проще сразу поделить ДО на ШАГ и не выделываться зря.

Для этой цели есть Rаnge с вещественными параметрами, “железно” нарезающий интервал на требуемое количество участков. Никаких холиваров))

Применяем функциональную парадигму, формируем последовательность нужных индексов или значений с помощью генераторов, а затем перебираем иx в foreach.

Просто пишем Range(От, До, Шаг)

5 сообщений перенесены в тему Болталка PascalABC.NET

Зачем выносить ОБЫКНОВЕННЫЙ счетчик в какую то там последовательность (они у вас что комбинации что ли???- это же не комбинаторика, да у вас и алгоритмов таких нет, максимум ваша последовательность может быть randomidze)… я думаю, вы просто не можете реализовать for как в с++, ведь там можно делать не только шаг но и много чего еще, а через последовательность For становится тяжелым по времени выполнения. Так что не нужно свою ограниченность выдавать за вашу мудрость…)))))))))))))) полазил я по вашим исходникам выложенным на GitHub и заметил в них даже Visual Basic, а в некоторых местах имитацию шага через while. Короче, я даже промолчу про коменты в мою сторону про грязный код…)))))))))))))))

Вам все же стоит внимательнее познакомиться с организацией PasacalABC.NET. Хотя бы для того, чтобы не смешить присутствующих своими безапелляционными рассказами о том, как хранится последовательность, занимая память. В PascalABC.NET последовательность не хранится! И памяти она занимает ровно столько, сколько занимает один ее элемент. Это первое.

И второе. Вам уже писали, что если Вы хотите, чтобы Ваши сообщения читали - проявляйте уважение к другим участникам форума и разбивайте свой “поток сознания” на отдельные предложения.

14 сообщений перенесены в тему Болталка PascalABC.NET

О да, “ленивые” расчёты значения только по требованию в этом смысле на пользу. Хотя даже странно, но после Бейсика довольно легко научился пользоваться конструкциями вида for i:=1 to 5 do x[i]:=i*2; {2,4,6,8,10}, удивляясь гибкости DOS с for %f in (1,2,7,8,1,5,am,dd,zz) do echo %f

Ну нет STEP, значит можно перефразировать задачу, а в циклы с пред- и постусловием можно хоть функции от функций загонять, лишь бы желание.

ИМО, проблема скорее надумана, так как не смог придумать ни единого примера обязательно и только через STEP

Я тут зашел на Википедию первого Оберона и там в его синтаксисе цикл FOR вообще отсутствует. А вот во втором Обероне они его восстановили взад, как там пишут в версии Модулы-2, с шагом, ключевое слово, которого, кстати, BY.

1 лайк

Range работает только с целыми числами. А есть такое же, но чтоб для вещественных с вещественным же шагом? Partition не очень удобно, т.к. нужно высчитывать количество равных частей. Можно, конечно, и Range приспособить, делить на десять, сто и т.д. Но вот так чтоб сразу взял и задал любую границу(ы) и любой шаг?