OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 07:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 81 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 12:12 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Geniepro писал(а):
Александр Ильин писал(а):
Код:
i := 0;
c := Count;
WHILE i < c DO
   ...
   INC (i)
END
Но объясните же, чем этот "закат Солнца вручную" лучше простенького:
Код:
FOR i:=0 TO Count DO
  ...
END

Попробую я еще раз объяснить. Лучше сконцентрироваться и до автоматизма выучить, вызубрить, отработать один , но универсальный шаблон, чем разбрасывать свое внимание на необязательное пусть даже простенькое


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Осторожно
СообщениеДобавлено: Пятница, 06 Март, 2009 16:25 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Александр Ильин писал(а):
Код:
i := 0;
c := Count;
WHILE i < c DO
   ...
   INC (i)
END

Такой код цикла WHILE травмирует детскую психику.
Посмотрит, задумается и свихнется, т.к., значение "i" используется выше места присвоения значения переменной. Т.е. логика перевернута с ног на голову.
Пример безопасного построения алгоритма дан здесь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Осторожно
СообщениеДобавлено: Пятница, 06 Март, 2009 18:16 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Геннадий Тышов писал(а):
Александр Ильин писал(а):
Код:
i := 0;
c := Count;
WHILE i < c DO
   ...
   INC (i)
END

Такой код цикла WHILE травмирует детскую психику.
Вы из школьного компьютерного класса это говорите, или ... "академически"?

Впрочем, действительно, инициализировать i (и т.п. "бегунки") нужно прямо перед охраной цикла. Инициализация -- перед, переход к следующему -- перед END. Ничего не разделяя.

Геннадий Тышов писал(а):
Посмотрит, задумается и свихнется, т.к., значение "i" используется выше места присвоения значения переменной. Т.е. логика перевернута с ног на голову.
Это где это она перевернута. Где что используется. Инициализируется цикл, инварианты и т.п. А потом крутится. Всё правильно.

Геннадий Тышов писал(а):
Пример безопасного построения алгоритма дан здесь.

Это серьезно??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Осторожно
СообщениеДобавлено: Пятница, 06 Март, 2009 19:04 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Геннадий Тышов писал(а):
Такой код цикла WHILE травмирует детскую психику.
При чём здесь детская психика? Я говорю о своей работе и о том, нужен ли мне лично цикл FOR. Я не делаю попыток продвигать это в образование.
Геннадий Тышов писал(а):
значение "i" используется выше места присвоения значения переменной. Т.е. логика перевернута с ног на голову.
Не понял. Сначала присваивание (первая строка: "i := 0"), затем использование (ниже по тексту). Что вы имеете в виду, любезнейший?
Геннадий Тышов писал(а):
Пример безопасного построения алгоритма дан здесь.
Присваивать невозможное значение индексу (-1) и затем следующей же инструкцией его увеличивать? Воздержусь от комментариев : ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 19:25 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Александр Ильин писал(а):
Геннадий Тышов писал(а):
значение "i" используется выше места присвоения значения переменной. Т.е. логика перевернута с ног на голову.
Не понял. Сначала присваивание (первая строка: "i := 0"), затем использование (ниже по тексту). Что вы имеете в виду, любезнейший?

Код:
1) i := 0;
2) c := Count;
3) WHILE i < c DO
4)    ...
5)    INC (i)
6) END
В строке 5 присваивается очередное значение переменной "i", и это значение используется в строках выше 3, 4.
Детская психика по определению наименованию раздела "Образование".


Последний раз редактировалось ==== Пятница, 06 Март, 2009 19:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 19:30 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Геннадий Тышов писал(а):
В строке 5 присваивается очередное значение переменной "i", и это значение используется в строках выше 3, 4.
НЕТ! Строчки 3 и 4 это на самом деле строчки 5+i, 5+i+1... я так это понимаю, и так меня научили это понимать в той же школе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 19:36 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
При отображении нумерация: 3,4,5. Не знаю как при выполнении. Я говорил - посмотрит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 20:38 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Геннадий Тышов писал(а):
При отображении нумерация: 3,4,5. Не знаю как при выполнении. Я говорил - посмотрит.
Во всяком случае пока не замечено травмирования. Ведь i:=0 стоит в приготовлении цикла.

А вся схема воспроизводится и в других ситуациях.

Подозреваю, что о "травмировании психики" можно говорить, если просто абстрактно дать формальное определение WHILE (по мануалам, не по Дейкстре) и попросить кида построить какой-нить цикл. Да, этого они сделать не в состоянии.

Но отсюда можно и такой простой вывод сделать, что нужно говорить нечто большее, чем формальное определение. Вот и всё. Остается подумать, как именно это сделать. Пока мой опыт говорит, что это возможно.

А цель (которую кратко суммировал Axcel) -- чрезвычайно привлекательна: очень неслабая экономия времени и усилий: хорошо выучить одну главную, универсальную вещь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Пятница, 06 Март, 2009 20:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Кстати, замечание (для всех, считающих цикл Дейкстры заумной игрушкой, не зная, что это такое).

То необходимое для хорошего обучения более подробное объяснение WHILE, о котором я только что написал в предыдущем посте, т.е. объяснение сверх формального минимального объяснения -- это "тень" теории Дейкстры для данного частного случая -- одноветочного цикла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Суббота, 07 Март, 2009 22:27 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Иван Кузьмицкий писал(а):
Такое определение FOREACH имеет смысл только при существовании понятия "НАБОР" (Массив? Коллекция?), что само по себе уже выпадает из рамок принципа минималистичности.

А просто наличие в языке конструкции ARRAY OF не даёт основания для предположения о потенциальной возможности существования (конструирования) таких наборов? :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Суббота, 07 Март, 2009 22:33 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Пётр Кушнир писал(а):
Vlad писал(а):
foreach - базовый паттерн. И find - базовый паттерн. В отличие от "эмуляции через WHILE" эти паттерны лучше видны, когда названы своими именами.

"кагбэ базовые" паттерны основаны на "более базовом" паттерне WHILE (f(x0; .. xn;) = TRUE) DO END :)

Нет. Базовые паттерны - суть нечто наиболее абстрактное (по-возможности мышления, конечно). А WHILE ( впрочем, как и FOR ) - вынуждает вас прописывать природу организации и взаимосвязи элементов. FOREACH этого делать НЕ заставляет. Более того - СКРЫВАЕТ. Что даёт возможность менять реализацию как самой структуры хранения, так и итеративных (навигационных) алгоритмов над таким набором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Суббота, 07 Март, 2009 23:15 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Пётр Кушнир писал(а):
Владимир Лось писал(а):
FOREACH этого делать НЕ заставляет. Более того - СКРЫВАЕТ. Что даёт возможность менять реализацию как самой структуры хранения, так и итеративных (навигационных) алгоритмов над таким набором.
Ну, получается что из вспомогательной компоненты сделали часть языка. ну и что, опять за меня что-то решили.

Ничего себе - "вспомогательная компонента"! Вы извините, но система, насколько память не изменяет, - "элементы и СВЯЗИ между ними". Вам предлагают максимально защитить один из краеугольных камней организации таких связей при проектировании и построении Ваших систем, а Вы ножками сучите и брыкаетесь! :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Воскресенье, 08 Март, 2009 11:39 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Так. Тут злостный флуд пошел с разборками. Прошу сделать ответвление... вот сюда: viewtopic.php?f=27&t=1389


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Вторник, 10 Март, 2009 20:04 

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
Разрешите поделиться своими наблюдениями (конкретно по теме FOR в образовании).
Преподаю в провинциальном пед. вузе, год от года уровень школьников приходяших в вуз падает, мотивации - ни какой. Особенно сильно видна пропасть в сравнении с редко встречающимися "нормальными" или сильными студентами.
Это я к тому говорю, что мой опыт имеет особенности, и возможно, его нельзя обобщать сильно.
Студенты (думающие) тяготеют к FOR, причём подгоняют под него задачу.
Например, поиск в массиве оформляют так:
Код:
k:= 0;
for i:= 1 to N do
    if a[i] = val then k:= i;

если попросишь первое вхождение искомого, помучившись, выдадут нечто типа:
Код:
k:= 0;
for i:= 1 to N do
    if a[i] = val then
        if k = 0 then k:= i;

особо умные про break вспомнят.
К такому решению склонности нет:
Код:
i:= 1;
while (i <= N) and (a[i] <> val) do inc(i);
if i = N then k:= 0 else k:= i;

Какие выводы я отсюда делаю:
1. Мозг действительно не хочет думать. В место того, чтобы пересмотреть подход к решению, дорабатывается напильником уже полученный вариант решения.
(не америка, конечно)
2. Цикл FOR воспринимается, именно воспринимается более простым. Из за этого подсознательно приходят к мысли, что FOR = цикл. И из за этого же начинают творить ужасные вещи типа изменения счётчика внутри FOR.
3. (и теперь уже более вольно и менее уверенно) Цикл WHILE выглядит действительно сложнее FOR, но там всё "на виду". ИМХО, старшеклассников и студентов надо ориентировать на WHILE. WHILE, WHILE, WHILE затем вводим FOR, описывая его через WHILE. И задалбливаем, что он нужен в опред. частных случаях. Для младших классов - тут я пас, опыта нет.
Может как в ШАЯ, нужен цикл без счётчика, "повторять N раз"? У Кушниренко, на сколько я помню, к переменным подходят после описания управляющих конструкций.
И такой подход достаточно обоснован. После перехода к переменным, сразу ударить WHILE-лом, и задачи, некоторое время решать со строгим требованием "Только WHILE!".
А потом FOR.
После чего, уже хорошо разобравшиеся школьники разделятся на группировки: 1) зачем нужен FOR? 2) FOR нужен там где нужен! и будут спорить как и профессионалы в сиём форуме :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Вторник, 10 Март, 2009 22:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Algo писал(а):
1. Мозг действительно не хочет думать. В место того, чтобы пересмотреть подход к решению, дорабатывается напильником уже полученный вариант решения. (не америка, конечно)
Да уж, фундаментальный факт природы, прямо по С.В.Савельеву. Должен быть краеугольной точкой отсчета в любых педагогических рассуждениях.

Под влиянием обсуждения все больше склоняюсь к тому, чтобы забыть про FOR, пока не будет достигнута полная уверенность с циклами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Воскресенье, 12 Апрель, 2009 00:22 

Зарегистрирован: Среда, 01 Август, 2007 00:13
Сообщения: 162
Info21 писал(а):
Под влиянием обсуждения все больше склоняюсь к тому, чтобы забыть про FOR, пока не будет достигнута полная уверенность с циклами.

При этом повышается риск другой ошибки: например, декремент переменной вместо инкремента "завесит" программу и может даже привести к обращению к несуществующей памяти (или просто "вылету" за массив). Даже сишный for будет нагляднее while, его заменяющего - там по крайней мере, всё в первой строке видно (отдельно - инициализация, условие и инкремент).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Воскресенье, 12 Апрель, 2009 12:18 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
ScrollLock писал(а):
Info21 писал(а):
Под влиянием обсуждения все больше склоняюсь к тому, чтобы забыть про FOR, пока не будет достигнута полная уверенность с циклами.
При этом повышается риск другой ошибки: например, декремент переменной вместо инкремента "завесит" программу ...
Угу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Воскресенье, 12 Апрель, 2009 16:17 

Зарегистрирован: Воскресенье, 08 Март, 2009 17:54
Сообщения: 372
ScrollLock писал(а):
Даже сишный for будет нагляднее while, его заменяющего - там по крайней мере, всё в первой строке видно (отдельно - инициализация, условие и инкремент).

Нет, не будет. Привожу реальный пример.
Прошу студента объяснить порядок действий на примере конкретного
Код:
for(int i = 0; i < count; i++) DoSomething();

Не знает куда поставить инкремент, предполагает, но не то. Ставит в начало тела цикла. А как же, по порядку идёт, логично ведь!
Конечно, это пример дибилизма. Но даже он показывает, что на запоминание этих "псевдо" упрощений тратится дополнительная энергия. Очевидно, что тратится она и у гениев, только для них это практически незаметно. А ведь можно эту энергию потратить на более важные вещи...

Хочу добавить ещё 2 распространённые ошибки с FOR (с паскалевским, не с сишным).
1. Искусственная фиксация количества итераций, в задаче, где число итераций заранее не известно.
2. Частный случай ошибки 1. Упущение из вида, что конечное значение параметра в цикле for фиксированно, тогда как по задаче - должно "плавать".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Понедельник, 13 Апрель, 2009 10:12 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
ИМХО, сишный for нужно объяснять с помощью while - тогда порядок явно прописывается.
Это и говорит о том, что начинать нужно с while, а к for переходить после полного освоения while


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Долой цикл FOR (?)
СообщениеДобавлено: Понедельник, 13 Апрель, 2009 14:39 

Зарегистрирован: Пятница, 02 Декабрь, 2005 14:35
Сообщения: 210
Откуда: Россия, Томск
Algo писал(а):
Хочу добавить ещё 2 распространённые ошибки с FOR (с паскалевским, не с сишным).
1. Искусственная фиксация количества итераций, в задаче, где число итераций заранее не известно.
2. Частный случай ошибки 1. Упущение из вида, что конечное значение параметра в цикле for фиксированно, тогда как по задаче - должно "плавать".

Сдуру да по незнанию можно еще и похлеще нагородить - сужу по решениям участников наших турниров юных программистов.
Лично я сразу пресекаю попытки подобного изврата. А если подопечный настаивает на своем, даю возможность помучиться с зацикливанием и прочими "прелестями" бездумного применения "не того инструмента". Грубо: FOR - для статики, он нагляднее, с ним новичку труднее ошибиться, WHILE/REPEAT - для любой динамики и тонкой оптимизации. Это важно дать понять в первый год обучения (школьников). На втором году и далее должно прийти глубокое понимание, когда какой цикл следует применять, и выработаться высокая техника учета всех нюансов того или иного применения без трюкачества. "Каторжная интеллектуальная тренировка" ((С) Ершов А.П.) на сотне-другой задач с циклами такие понимание и навык обеспечат! Но наставник не должен пускать это дело на самотек, чтобы дурные привычки не успели намертво закрепиться.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 81 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB