Начать изучение C++ рекомендуется с классической книги Б. Керниган, Д. Ритчи, "Язык программирования C". Понимание языка C, который лёг в основу C++, поможет вам лучше разобраться с особенностями C++.
Дальше можно перейти к вводным курсам по С++.
Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му "Язык программирования C++. Вводный курс".
Стивен Прата. "Язык программирования C++. Лекции и упражнения".
Было у султана N=12 визирей. Узнал он как-то, что у некоторых визирей неверные жены. Решил он им наказание устроить. Сделал так: каждого визиря с его женой посадили в полностью изолированные комнаты, и было им сказано, что сидеть им взаперти, пока все неверные жены не будут убиты своими супругами. Каждое утро все комнаты обходит слуга, проверяя выполнение этого условия. Как только выясняется, что все неверные жены мертвы, всех выпускают. На K=3-ий день всех выпустили, причем все верные жены остались живы. Как визири догадались? Уточнение. Все визири очень умны, и сплетней во дворце предостаточно, так что каждый визирь знает, верная или неверная жена у каждого другого визиря, но ничего не знает про свою. Никакого обмена информацией, пока они взаперти, нет.
Каждый визирь может полагаться на то, что если другой визирь поймет, что у него неверная жена, то он непременно убьет ее.
После прочтения книги Мартина Фаулера Patterns of Enterprise Application Architecture у меня остались весьма двойственные впечатления. С одной стороны авторитет и опыт автора заставляет с уважением относиться к его произведению, тем более что в книги действительно можно найти не мало полезной информации по различным паттернам проектирования. Однако, многие паттерны уже давно встроены в стандартные библиотеки .Net framework и воспринимаются программистами как очевидная данность, в частности, паттерны для работы с данными. Кроме того некоторые вещи сейчас потеряли актуальность, например, паттерны, предлагающие варианты инкапсуляции создания объектов. Видимо, на момент написания книги подход Inversion of Control еще не был популярен.
Из паттернов Фаулера, которые мне понравились, и которые я хотел бы отметить, можно выделить следующие:
Ниже приведена задача про заключенных и лампочку (одна из самых простых вариаций).
В тюрьме находится 100 заключенных. Начальник тюрьмы сказал им:
«Я дам вам шанс выбраться на свободу. Сначала вы поговорите друг с другом, а потом я рассажу вас по отдельным камерам, и общаться вы больше не сможете. Иногда я буду одного из вас отводить в комнату, в которой есть лампа (вначале она выключена). Уходя из комнаты, вы можете оставить лампу как включенной, так и выключенной.
Если в какой-то момент кто-то из вас скажет мне, что вы все уже побывали в комнате, и будет прав, то все вы отправитесь на свободу, а если неправ, то останетесь здесь навечно.
Какую стратегию следует разработать заключенным, чтобы гарантированно выбраться на свободу?
Точнее, это даже не подсказки, а просто разжевывание условий:
Нигде в условии не сказано, что каждый заключенный побывает в камере только один раз
Нигде также не сказано, как часто начальник тюрьмы будет отводить заключенных в заветную комнату. Если он, к примеру будет делать это раз в 10 сек, то число потенциальных опытов может быть внушительным.
Вы находитесь в первом вагоне некоторого зацикленного поезда, в котором последний вагон соединен с первым. Вы можете свободно перемещаться между вагонами, а также включать или выключать свет в вагонах. Изначально в некоторых вагонах свет уже горит, а в некоторых нет.
Ваша задача определить количество вагонов в поезде.
Следует обратить внимание на следующий нюанс: если вы начинаете переходить из вагона в вагон планомерно перемещаясь по поезду в одном направлении, то в некоторый момент вы дойдете до последнего вагона, затем перейдете в первый, и будет продолжать движение уже по второму кругу, т.е. вы не сможете понять, что в этом вагоне вы уже были, так как все вагоны одинаковые, в окнах ничего не видно, оставлять какие-то пометки на стенах и т.д. запрещено.