OberonCore https://forum.oberoncore.ru/ |
|
История с несколькими моралями (в том числе анти-FOR) https://forum.oberoncore.ru/viewtopic.php?f=7&t=1443 |
Страница 1 из 7 |
Автор: | Илья Ермаков [ Пятница, 03 Апрель, 2009 22:34 ] |
Заголовок сообщения: | История с несколькими моралями (в том числе анти-FOR) |
Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...): Цитата: [22:30:00] <Seraf> FOR спасет мир)
[22:30:08] <ermakov> )) [22:31:14] <Seraf> Сидел над курсачом щас... Нужне был линейный поиск... Через WHILE такая фигня получалась и не работала) Допетрил сделать через FOR - и все заработало) [22:31:39] <ermakov> Покажи поиск. Через FOR поиск писать нельзя. [22:31:55] <Seraf> PROCEDURE Double():BOOLEAN; VAR i: INTEGER; BEGIN FOR i:=0 TO c0.outCount-1 DO IF (c0.outs[i].x = i1) & (c0.outs[i].y = j1) THEN RETURN TRUE; END; END; RETURN FALSE; END Double; [22:32:03] <Seraf> =) [22:32:14] <Seraf> Может быть это и не совсем поиск))) [22:32:58] <ermakov> Поиск. С завуалированным goto. Надо кого-то линейкой по рукам. [22:33:23] <Seraf> Я тут не причем) [22:33:29] <Seraf> Он сам) [22:33:31] <ermakov> Блин. Правильно Вирт в Обероне 07 запретил RETURN из середины. Ибо народ найдёт даже такой GOTO )) [22:33:41] <Seraf> =) [22:33:45] <ermakov> Через WHILE перепиши. [22:34:01] <ermakov> То, что ты написал - безграмотнейшая вещь. [22:34:02] <Seraf> Вот перепиши мне) Я пол часа мучался) [22:34:09] <Seraf> Да я знаю [22:34:13] <Seraf> Но она хоть работает) [22:35:14] <ermakov> i := 0; WHILE (i < c0.outCount) & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) ) DO INC(i) END [22:36:09] <ermakov> Условие окончания у поиска - это всегда, когда бегунок - за последним элементом. Т.е. = кол-ву в массиве. Тогда усл-е продолжения - < кол-ва в массиве. [22:36:15] <ermakov> Так и верно. [22:36:21] <ermakov> Ты, видать, опечатался там. [22:36:26] <Seraf> нет [22:36:28] <ermakov> Вместо i написал j или вроде того. [22:36:34] <Seraf> Неа [22:36:38] <Seraf> Я все помню [22:36:38] <ermakov> Или забыл i := 0. [22:36:40] <ermakov> В начале. [22:36:41] <Seraf> Нет [22:36:43] <Seraf> Тоже было [22:46:59] <Seraf> PROCEDURE Link* (VAR grid: Grid; i0, j0, i1, j1: INTEGER); VAR c0,c1: Cell; r1,r2: Ref; PROCEDURE Double():BOOLEAN; VAR i: INTEGER; BEGIN i := 0; WHILE (i < c0.outCount) & ((c0.outs[i].x # i1) & (c0.outs[i].y # j1)) DO INC(i); END; RETURN i<c0.outCount; END Double; [22:48:18] <Seraf> Дядь Илюш, в каком месте я промахнулся?) [23:02:11] <ermakov> Ну, друг... Я тебя без сладкого оставлю!!! [23:02:22] <ermakov> & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) ) [23:02:43] <ermakov> если ты хочешь внести ~ в скобки, то как ты это должен сделать? [23:03:06] <Seraf> # поставить [23:03:09] <ermakov> Отрицание, применённое к конъюнкиции - это дизъюнкция отрицаний членов. [23:03:30] <ermakov> т.е. <=> (c0.outs[i].x # i1) OR (c0.outs[i].y # j1) [23:03:39] <Seraf> У меня так и стояли) [23:03:44] <Seraf> Ой [23:03:53] <Seraf> Как OR? [23:03:55] <Seraf> Ты что? [23:03:57] <Seraf> нееее [23:04:14] <Seraf> Нужно чтобы и то выполнялось [23:04:17] <ermakov> Правила мат. логики неумолимы. Кроме того, можно просто порассуждать - и убедишься, что именно так ) [23:05:02] <ermakov> НЕ (А и В) - это значит, что конъюнкция ложна. Конъюнкция ложна, когда ложен один ИЛИ оба её члена. Т.е. (НЕ А) ИЛИ (НЕ Б) [23:05:24] <Seraf> ТвАя мать... [23:05:43] <ermakov> Ничего, бывает ) Учимся ещё ) [23:06:08] <ermakov> (только вот гораздо более великовозрастные дядьки вот так проколюццца, а потом орут, что без FOR жисть не мила ) [23:06:27] <ermakov> Поэтому НЕ НАДО было упрощать исходное условие. [23:06:46] <Seraf> Пошел я любить Матан... [23:06:54] <Seraf> Неудачник(( [23:06:55] <ermakov> Есть шаблон лин. поиска, где идёт ~ (условие_поиска). Нахрена вносить этот ~ в скобки? Он те мешал? )) [23:07:28] <ermakov> условие поиска имеет смысл - оно из задачи идёт. Условие, обратное к нему, уже не из задачи поиска. Его сознанию проверить сложнее. [23:07:32] <Seraf> Мешал [23:08:15] <Seraf> Хнык... [23:08:25] <Seraf> *море слез [23:12:15] <Seraf> Бей меня в следующий раз по рукам, если я FOR напишу... [23:14:01] <ermakov> А история очень поучительная. Моралей много... 1-я. Если в языке есть возможность найти GOTO, программёр его обязательно найдёт. 2-я. За "буйством FOR-а" лежат проблемы мат. навыков. 3-я. Преждевременная (или вообще бессмысленная) оптимизация в ущерб прозрачности/соответствия единой схеме. |
Автор: | Пётр Кушнир [ Пятница, 03 Апрель, 2009 22:43 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Ежели все будут логи чатов в народ показывать, то столько моралей и открытий получится, не пересчитать! |
Автор: | Илья Ермаков [ Пятница, 03 Апрель, 2009 22:46 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
(уточню, что история публикуется с одобрения её "автора") |
Автор: | Борис Рюмшин [ Пятница, 03 Апрель, 2009 22:48 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Преждевременная оптимизация - корень всех зол. (с) Кнут |
Автор: | Info21 [ Пятница, 03 Апрель, 2009 23:44 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Борис Рюмшин писал(а): Преждевременная оптимизация - корень всех зол. (с) Кнут А точно Кнут? (У меня профессиональное недоверие к такого рода атрибуциям. Вчера только опубликовал исследованьице по истории физики за 60-е гг.) |
Автор: | Vlad [ Суббота, 04 Апрель, 2009 00:16 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Илья Ермаков писал(а): Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...): Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать... |
Автор: | Пётр Кушнир [ Суббота, 04 Апрель, 2009 01:16 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Илья Ермаков писал(а): Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...): Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать... Илья, вы не тому учите детей! Надо учить каллекциям на питоне, там всё высокоуровнево и без т.н. "мяса". Ведь юзать готовые компоненты без осознания сути - это прекрасно! [сарказм mode off] |
Автор: | Илья Ермаков [ Суббота, 04 Апрель, 2009 08:09 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать... Что так смущает досточтимого сэра? Индексы и много переменных? Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ. |
Автор: | Илья Ермаков [ Суббота, 04 Апрель, 2009 08:13 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Вообще, поразительно. Кода-то как такового не было. Неужели такая реакция на нормальное логическое условие. Вспоминается наблюдение Axel-я, чтто его коллеги избегают WHILE из-за того, что любое условие с несколькими & или OR кажется им уже сложным. |
Автор: | Vlad [ Суббота, 04 Апрель, 2009 08:35 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Илья Ермаков писал(а): Vlad писал(а): Давно я такого мясного кода не видел... Хоть с FOR, хоть с WHILE - все равно переписывать... Что так смущает досточтимого сэра? Индексы и много переменных? Да, индексы непонятно по чему и шифрованные названия переменных. Илья Ермаков писал(а): Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ. Гхм... Это должно испугать и внушить уважение? Вот я давеча совсем простую штуку делал. На входе два списка (разных по смыслу), из них строится один список строк и показывается пользователю в диалоге для того, чтобы он выбрал нужный ему элемент. Ну и потом с оригинальным элементом (в одном из двух данных списков) совершаются определенные действия. Поскольку сам диалог ничего не знает о природе двух данных списков, а знает только о списке строк, то и в качестве результата он возвращает индекс выбранной строки. И по этому индексу потом находится элемент в одном из двух данных списков. Так вот, к чему я это. Я вот теперь думаю, что индекс на выходе - это была все-таки плохая идея. Проще надо Без всякой математики по вычислению оригинального элемента, даже если она и сводится к банальному добавлению смещения. Нечитабельно это. И хрупко... |
Автор: | Илья Ермаков [ Суббота, 04 Апрель, 2009 09:12 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Цитата: Илья Ермаков писал(а): Так там и задачка у студента не базданновая. А из дискр. математики и теории схем программ. Гхм... Это должно испугать и внушить уважение? Нет, это к тому, что понятия индекса и матрицы там естественные. А какое-нить понятие коллекции/набора - ни-пришей-ни-пристебай. Из названий переменных фигурируют итераторы и парные типа c0, c1, которые подчёркивают вот эту парность-сопряжённость. Что такое с0, с1 - решается подъёмом глаз к VAR и взгляду на тип, т.к. вся внешняя процедура влезает меньше, чем на экран. Для того и VAR-секция придумана. Неужели удобнее зашивать информацию о том, что это такое есть, в длинные названия локальных переменных типа cell1, cell2? Секция VAR аналогична соглашению "пусть...". Прочитали, включили контекст, далее смотрим "выкладки" ниже. |
Автор: | Info21 [ Суббота, 04 Апрель, 2009 09:20 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad в данном случае просто провокатор. Не стоит тратить силы. |
Автор: | Trurl [ Понедельник, 06 Апрель, 2009 08:51 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Вот, полюбуйтесь Код: LT = LEN(TAB)
FOR i = 1 TO LT IF i < LT IF S <= TAB[i + 1] EXIT ENDIF ENDIF NEXT IF i > LT i = LT ENDIF |
Автор: | Илья Ермаков [ Понедельник, 06 Апрель, 2009 10:08 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Ужас. А язык - какой-нибудь PL-SQL? |
Автор: | Geniepro [ Понедельник, 06 Апрель, 2009 11:42 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
PL-SQL похож на Аду. А это -- просто VB... |
Автор: | Vlad [ Понедельник, 06 Апрель, 2009 20:27 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Илья Ермаков писал(а): Нет, это к тому, что понятия индекса и матрицы там естественные. А какое-нить понятие коллекции/набора - ни-пришей-ни-пристебай. Хорошо, пусть будет индекс Рассмотрим конкретно вот эту строку: Код: WHILE (i < c0.outCount) & ~ ( (c0.outs[i].x = i1) & (c0.outs[i].y = j1) ) DO Вот мои "претензии": 1) Почему граница индекса задается одной сущностью (c0), а индексируется другая (c0.outs)? В смылсе я понимаю, что такого не всегда можно избежать, но только руки сразу чешутся - влепить туда ASSERT(c0.outCount == c0.outs.size()). 2) c0.outs[i] я бы хотел видеть в отдельной локальной переменной с говорящим названием. Глядишь и условие стало бы не таким "мясным" и ошибиться в нем было бы труднее. 3) Таки for по индексу + проверка условия внутри нагляднее вот такого трехэтажного условия. Это как раз тот случай, когда Дейкстру можно принести в жертву практике. Во всяком случае при существующем синтаксисе языка. Илья Ермаков писал(а): Из названий переменных фигурируют итераторы и парные типа c0, c1, которые подчёркивают вот эту парность-сопряжённость. Что такое с0, с1 - решается подъёмом глаз к VAR и взгляду на тип, Вот именно это меня в VAR и бесит - подъем глаз Разрыв с контекстом. Вообще я уже все сказал, что думаю по поводу этой вредной секции в соответствующей теме, не буду повторяться |
Автор: | Илья Ермаков [ Понедельник, 06 Апрель, 2009 20:46 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Vlad писал(а): 1) Почему граница индекса задается одной сущностью (c0), а индексируется другая (c0.outs)? В смылсе я понимаю, что такого не всегда можно избежать, но только руки сразу чешутся - влепить туда ASSERT(c0.outCount == c0.outs.size()). Потому что студент не заморачиваецца и использует массив статического предельного размера (динамически созданный под указанную максимальную степень графа) + его размер рядом. И правильно в данном случае делает. Цитата: 2) c0.outs[i] я бы хотел видеть в отдельной локальной переменной с говорящим названием. Глядишь и условие стало бы не таким "мясным" и ошибиться в нем было бы труднее. И будем писать лишнюю строку до цикла и в теле для выборки текущего out? Лишняя контекстность и удлиннение. Какие проблемы прочитать нормальное логическое выражение - не представляю. Непривычка - только и всего. Цитата: 3) Таки for по индексу + проверка условия внутри нагляднее вот такого трехэтажного условия. Это как раз тот случай, когда Дейкстру можно принести в жертву практике. Это тот случай, когда со студенческой скамьи надо натаскать на мат. логике и выражению мысли с помощью её предикатов. А иначе конечно - проще пытаться шаг за шагом проверять, не пора ли "спрыгнуть с поезда". Только где гарантии, что цепь таких проверок реально соответствует условию окончания итерационного процесса. Цитата: Вот именно это меня в VAR и бесит - подъем глаз Разрыв с контекстом. Вообще я уже все сказал, что думаю по поводу этой вредной секции в соответствующей теме, не буду повторяться Да не поднимайте... Сначала прочтите соглашение "пусть будем обозначать то-то и так-то...", а потом 7-8 строк кода в теле процедуры. |
Автор: | Vlad [ Понедельник, 06 Апрель, 2009 21:19 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Илья Ермаков писал(а): Потому что студент не заморачиваецца и использует массив статического предельного размера (динамически созданный под указанную максимальную степень графа) + его размер рядом. И правильно в данном случае делает. Да. Может быть и правильно в данном случае. Я говорю с точки зрения читателя без полного понимания контекста. Чем меньший контекст нужен для понимания кода - тем код читабельнее. Но конечно и этот принцип не надо превращать в догму Илья Ермаков писал(а): И будем писать лишнюю строку до цикла и в теле для выборки текущего out? Лишняя контекстность и удлиннение. Лишняя строка - это не удлинение, если она помогает понять код. Опять же - не понимаю, почему оберонщики так любят лепить кучу операторов (пусть даже связанных) в одну строку. Если нужно выделить логический блок в коде - лучше пустую строку вставить. Илья Ермаков писал(а): Какие проблемы прочитать нормальное логическое выражение - не представляю. Непривычка - только и всего. Такие обычные чисто человеческие проблемы - надо лишний раз убедиться, что x и y относятся к одной сущности - c0.outs[i]. В такой код легко вкрадываются опечатки типа c1.outs[i]. Илья Ермаков писал(а): Это тот случай, когда со студенческой скамьи надо натаскать на мат. логике и выражению мысли с помощью её предикатов. А иначе конечно - проще пытаться шаг за шагом проверять, не пора ли "спрыгнуть с поезда". Только где гарантии, что цепь таких проверок реально соответствует условию окончания итерационного процесса. А где гарантии, что человек не запутается в таком условии (что и имело место в данном случае)? Илья Ермаков писал(а): Да не поднимайте... Сначала прочтите соглашение "пусть будем обозначать то-то и так-то...", а потом 7-8 строк кода в теле процедуры. Вот больше запоминать нечего - локальные переменные процедуры (смысл которых все равно не ясен), которые может быть ни разу и не понадобятся при анализе ее кода. Понятно, что при таком подходе и не захочешь лишний раз завести локальную переменную с говорящим именем, а будешь писать вот такой мясной код |
Автор: | Евгений Темиргалеев [ Понедельник, 06 Апрель, 2009 21:41 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
У студента может код и мясной, ну куда уж ему... А у Вас, Vlad, мясные рассуждения применительно к образованию. Так что шли бы Вы лесом... |
Автор: | Info21 [ Понедельник, 06 Апрель, 2009 21:45 ] |
Заголовок сообщения: | Re: История с несколькими моралями (в том числе анти-FOR) |
Условие поиска присутствует явно, цикл имеет абсолютно стандартную структуру. Но громоздкость именований можно было бы попытаться уменьшить. С третьей стороны, это промежуточный какой-то код. К тому же учебный. Стилистические претензии предъявлять просто рано. |
Страница 1 из 7 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |