AVC писал(а):
Код:
struct def *search(const char *name)
{
struct def *p;
for (p = root; p != NULL; p = p->next)
if (strcmp(name, p->name) == 0)
return p;
return NULL;
}
И тут, конечно, Вы меня начинаете критиковать за "нестрогость" и несоответствие образцу линейного поиска.
Ну хорошо, а если не отдельный поиск, а конкретный поиск с выполнением в случае, если найден, конкретного действия?
Будем писать
Цитата:
for (p = root; p != NULL; p = p->next)
if (strcmp(name, p->name) == 0)
{
делаем что-то с p;
break;
}
А я - безо всякого даже знания о "грамотных циклах", просто исходя из житейской логики - спрошу: позвольте, в цикле пишутся те действия, которые повторяются много раз. Почему же у нас львиную долю тела цикла занимают действия, которые выполняются один раз, ПОСЛЕ цикла?
Ну да, очень хочется с помощью break-ов выразить несколько возможных исходов блока кода. Хочется - но в операторном (текстовом) программировании это всё равно не получается нормально, т.к. break-и схлопываются в конце в одной точке. А путаницы уйма - пропадает ясность свойств кода (для меня ясность - это возможность тыкнуть пальцем в любую точку-срез, определить утверждения и видеть все возможные маршруты входа-выхода). Потому что в линейном операторном программировании мы пытаемся прорваться во второе измерение - и не прорываемся, и ясность рушим.
Вот на Драконе линейный поиск:
Вложение:
linsearchdrakon.jpg [ 20.09 КБ | Просмотров: 11131 ]
- тут в двумерном представлении вообще все противоречия исчезают и между структурированностью, и между возможностью иметь несколько выходов.
Если я начну на Драконе записывать обычный линейный поиск - я получу как раз эту же схему!! Потому что конъюнкция условий будет выражена графически как раз этой "ступенькой развилок". А потом я увижу, что после схлопывания выходов я опять анализирую то же самое и "сокращу" проверку, навесив две ситуации прямо на линии выходов.