Итак, не далее, как сейчас вечером один из моих лучших студентов - правильно обученный, но ещё с не набитой рукой, выдаёт мне в Джаббере следующее (это после стольких-то разборов относительно правильности циклов...):
[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-я. Преждевременная (или вообще бессмысленная) оптимизация в ущерб прозрачности/соответствия единой схеме.