Почему нельзя учить детей языку Си/Си++
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.10.04 11:38
Оценка: -5 :)))
Почему нельзя учить детей языку Си/Си++

Один очень-переочень можно даже сказать самый известный на RSDN человек, не будем показывать на него пальцем, привел вот такой образец кода:

Заметьте, цикл for — с выделенными предикатом проверки и выражением итерирования. А не while, где это итерирование засунуто бог весть куда (что, кстати, не только читаемость ухудшает, но и даёт возможность для ошибок)
// сравните

for(init(); cond(); next())
{
  work1();
  if(x()) continue;
  if(y()) continue;
  work2();
}

// с неправильным
init();
while(cond())
{
  work1();
  if(x()) continue;
  if(y()) continue;
  work2();
  next();
}

// и правильным, но громоздким (лишний код)
init();
while(cond())
{
  work1();
  if(x()) { next(); continue; }
  if(y()) { next(); continue; }
  work2();
  next();
}

// или ещё более громозким (лишняя переменная, лишний текст)
init();
bool secondary=false;
while(true)
{
  if(secondary) next(); else secondary=true;
  if(!cond()) break;

  work1();
  if(x()) continue;
  if(y()) continue;
  work2();
}


На паскале специально не написал — синтаксис более громоздкий. Но идея и так видна.



Вот такие дела.
Сначала небольшой разбор полетов. Вспомним что есть такое конструкция WHILE:
WHILE b DO S END

Что у нас есть в данном случае "b"? Элементарно b — это: " cond() ", значит наша программа принимает следующий вид
init()
WHILE cond() DO S END

Теперь задумаемся, что в нашем случае есть S? Опять элементарно S — это: " WORK(); next() " так и запишем нашу программу:
init()
WHILE cond() DO 
  WORK();
  next()
END

И, наконец, третий и последний шаг. Задумаемся, что в нашем случае есть WORK()? Опять, же, элементарно, WORK() в нашем случае есть: " work1(); IF ~x() & ~y() THEN work2() END " (логическое выражение вычисляется слева на право, если ~x() ложно, то значение y() не вычисляется). Так и пишем:
init();
WHILE cond() DO
  work1(); IF ~x() & ~y() THEN work2() END;
  next()
END

То что я только что тут по шагам проделал называется структурное программирование. Этому надо обучать в школе. Это азбука программирования! После того как уважаемые люди пишут такую программу через continue я считаю, что у меня развязаны руки. Я теперь могу показывая пальцем на этот код аргументированно утверждать что увлечение языком Си/Си++ до добра не доводит, вот пожалуйста — человек в трех соснах заблудился, написал два continue и еще утверждает, что так и надо!

26.10.04 16:23: Перенесено из 'Философия программирования'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.