Как не надо программировать на С++

Авторы: 
Анна Дегтярева
Это название книжки, увиденной мной в "Новом книжном". Я читала много книг о том, как надо программировать на том или ином языке программирования, в той или иной среде, но о том как не надо - никогда! Я просто не могла не купить ее, из простого женского любопытства. И как оказалось, любопытство меня не подвело.
 

С.Уэллин, " Как не надо программировать на С++" СПб: Питер, 2004. - 240 с.

Очень легкая в чтении книжка с загадками и анекдотами (это не шутка!) В то время как остальные книги по С++ методично описывают методы и приемы, которые надо использовать, чтобы избежать ошибок, автор приводит примеры неработающих программ. Все программы компилируются, многие - компилируются без ошибок. И все же все 111 приведенных автором программ не работают - либо работают, но не так, как хотел автор. Читателям предлагается угадать почему (наверное, "угадать" - это не самое правильное слово применительно к ошибке в тексте программы, но оно является наиболее подходящим для описания этих действий читателя). Чтобы читатели не сходили с ума в попытках объяснить порой необъяснимое или во всяком случае труднообъяснимое, в конце книги даны ответы ко всем программам. А чтобы читатели не мучались после того как узнают ответ: "Ах, как же я сразу не догадался!" - в конце книги перед ответами даны подсказки. Ко многим подсказкам тоже даны подсказки. Решение задачки превращается в увлекательный поиск ключей к разгадке!

Чтобы не быть голословными, приведем пример - ну например:

Программа 29. "Элементарно, дорогой читатель"

0   /*************************
1   *  print_element - вывод
2   *  элемента матрицы
3   *************************/
4   #include <iostream>
5
6   // простая матрица
7   int matrix[3][3] = {
8     {11,12,13},
9     {21,22,23},
10    {31,32,33}
11  };
12
13  int main ()
14  {
15    std::cout << "Element [1,2] is " << 
16      matrix[1,2] << std::endl;
17
18    return (0);
19  }
(Подсказка 89, ответ 86)

Заинтриговались? Идем за подсказками!

Подсказка 89. Это абсолютно законный, стандартный код С++, хотя некоторым может показаться иначе. (Подсказка 211, ответ 86)

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

Подсказка 211. Результат зависит от системы. (Подсказка 123, ответ 86)

Листаем в другую сторону:

Подсказка 123. Программа выводит не целое число, а нечто иное. (Подсказка 149, ответ 86)

И снова листаем...

Подсказка 149. Выведенное значение представляет собой указатель. (Подсказка 347, ответ 86)

Подсказка 347. Компилятор g++ выдает следующее предупреждение:
array2.cpp: In function 'int main()':
array2.cpp: 17: warning: left-hand operand of comma-expression has no effect

(Подсказка 17, ответ 86)

Я догадалась две подсказки назад, а вы?

Подсказка 17. Оператор "," возвращает результат второго выражения. Следовательно, значение выражения 5,9 равно 9. (Подсказка 348, ответ 86)

Подсказка 348. Выражение matrix[2] представляет собой указатель. (Ответ 86)

Ну и наконец...

Ответ 86. Ошибка кроется в конструкции matrix[1,2]. Оператор "," в С++ просто возвращает результат второго операнда. Таким образом, выражение 1,2 означает, что компилятор должен отбросить первую часть (1) и вернуть значение 2. Из этого следует, что значение matrix[1,2] в действительности эквивалентно matrix[2]. Но его значение представляет собой указатель на целочисленный массив, поэтому С++ интерпретирует команду как вывод указателя. Этим и объясняется странный вид результата. На самом деле программисту следовало использовать запись matrix[1][2].

Это был простой пример. А есть и более замороченные задачки! Задачки, которые так или иначе вставали и будут вставать перед программистами ежедневно.

Задачки перемежаются с програмистскими анекдотами и забавными байками о том, кто как когда и где нашел удивительную ошибку и как несколько месяцев над ней бились все светлые головы предприятия, но лишь одному скромному работнику софтверной индустрии удалось ее одолеть. Когда сил решать задачки уже не остается, короткая забавная история в конце страницы весьма стимулирует - "решу еще одну, задачку, прочитаю байку - и все!"

Из недостатков книжки можно выделить разве что программы с листингом на 4 страницы :). Это немного тяжело для такой развлекательной книжки. Впрочем, таких не очень много.

Вывод: очень увлекательное чтиво для любителей попрограммировать. Специфический аналог сканвордов из современных журналов, только более захватывающий и... интеллектуальный что ли. Чувствуешь, что не просто убиваешь время, а работаешь мозгами - и в то же получаешь удовольствие. Жаль только - всего 220 страниц! :)



Дополнительная информация
Ссылка: 
Анна Дегтярева. Как не надо программировать на С++. Компьютерная графика и мультимедиа. Выпуск №3(1)/2005. http://cgm.computergraphics.ru/content/view/70
Выпуск: 
Выпуск №3(1)/2005

Комментарии

Вот такие и нужны учебники...

Вот такие и нужны учебники... когда в них не тупое нудилово, а практические советы в игровой форме. Даже ученые доказывали что такая форма позволяет запомнить гораздо больше материала, да и не потерять интерес пока читаешь.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Тест предназначен для отсеивания спама
Fill in the blank