Dyzzet|
C++ Data Science Алгоритмы Темы · Блог · YouTube · Telegram
13 апреля 2022
Хаос в выражениях с инкрементом указателя

Навеяно «мемом»

Задача: записать значение x в нулевой элемент массива p и сместить указатель на следующий элемент.

Самый очевидный и чистый вариант:

p[0] = x;
++p;

Поскольку указатель на массив, используемый без квадратных скобок, означает адрес нулевого элемента, то есть p ≡ &p[0], его разыменование даёт сам нулевой элемент. Это означает, что *p ≡ p[0].

*p = x;
++p;

Эти две операции можно объединить. Но мы должны использовать пост-инкремент (указатель инкрементируется, оператор возвращает старый указатель).

*p++ = x;

Читать далее →
17 января 2022
Оптимизация цикла

Скажем, нам нужно сгенерировать \(n\) объектов двух типов.

def f(n):
    zeros = 0
    ones = 0
    for i in range(n):
        value = random.randint(0, 1)
        if value == 0:
            zeros += 1
        else:
            ones += 1
    return zeros, ones

При \(n = 144 \cdot 10^6\) такая программа выполняется за 2,17 с.

1. Наивная версия на C++ выполняется за 1,47 с.

size_t zeros{}, ones{};
for (size_t i{}; i < n; ++i)
{
    ++(distribution(range) % 2 == 0 ? zeros : ones);
}

Читать далее →
27 декабря 2021
Обзоры книг по C++. Структуры данных, алгоритмы, решение прикладных задач

Книги по классическим алгоритмам и структурам данных и сборники задач с решениями. Сборники задач по самому языку C++ будут в части с обзорами профессиональной литературы.

Мариус Бансила. Решение задач на современном C++

302 страницы. ДМК, 2019

Marius Bancila. The Modern C++ Challenge. Packt, 2018

Задачи и решения на C++17.

Вот темы и некоторые задачи:

  • математические задачи (код Грея, преобразование чисел в римскую запись, вычисление \(\pi\), проверка ISBN...),
  • особенности языка (перечисление адресов в IPv4, двумерный массив с базовыми операциями, функция min() с переменным числом аргументов, литералы разных температурных шкал...),
  • строки и регулярные выражения, потоки данных и файловые системы (треугольник Паскаля, удаление пустых строк из файла, удаление файлов старше заданной даты...),
  • дата и время (время выполнения программы, число дней между датами, календарь на месяц...),
  • алгоритмы и структуры данных (очередь с приоритетом, циклический буфер, двойной буфер, самый часто встречающийся элемент в диапазоне, текстовая гистограмма, фильтрация списка телефонных номеров, преобразование списка телефонных номеров, генерация всех перестановок символов в строке, средний рейтинг фильмов, алгоритм объединения в пары, алгоритм «сшивания», алгоритм выбора, алгоритм сортировки, кратчайший путь между узлами, программа Weasel, игра «Жизнь»),
  • конкурентность, шаблоны проектирования (проверка пароля, генерация паролей...),
  • сериализация данных (XML, JSON, создание PDF из коллекции изображений),
  • архивы, изображения и базы данных (поиск в ZIP-архиве, создание PNG-файла, работа с SQLite),
  • криптография (шифры, Base64, хеш-сумма файла...), сети и службы.

Читать далее →
18 декабря 2021
using namespace std

Пространства имён появились в 1993 году. Наверное, с тех пор и идут споры о директиве using namespace std и других подобных. Посмотрим, хорошо это или плохо и как пишут в разных компаниях (Google, Epic Games, Qt Company).

Что мы обычно видим.

#include <iostream>
using namespace std;
 
int main()
{
    cout << "Hello, world!" << endl;
    return 0;
}

На первый взгляд, удобно. Но в последующем возможны конфликты имён.

Читать далее →
29 ноября 2021
Обзоры книг по C++. Стандартная библиотека шаблонов

В этой части — обзоры книг о стандартной библиотеке шаблонов C++ (STL, Standard Template Library). Эта библиотека ведёт свою историю с начала 1990-х, когда её разрабатывал Александр Степанов в компании HP.

Что-то в книгах со временем устаревает, например, встречается умный указатель auto_ptr. Тем временем в последних стандартах появилось очень много нововведений: в C++11  — многопоточность, работа с точным временем, новые генераторы случайных чисел, std::array, std::forward_list, std::unordered_map и пр., в C++17 — std::string_view, математические функции, работа с файловой системой, вариативный тип std::any, параллельные версии для алгоритмов и множество мелких улучшений, в C++20 — невладеющие указатели на массив std::span, библиотека для работы с битами, ranges, chrono, расширенная библиотека потоков и пр.

Леен Аммерааль. STL для программистов на C++

240 страниц. ДМК, 1999

Leen Ammeraal. STL for C++ Programmers. John Wiley, 1997

Книга начинается с короткого введения в шаблоны, экскурса в историю (как разработка HP вошла в стандарт).

Читать далее →
5 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть IV (П—Я)

Татьяна Александровна Павловская. C/C++. Программирование на языке высокого уровня

464 страницы. Питер, 2021

В соавторстве с Юрием Абрамовичем Щупаком Татьяна Александровна выпустила практикумы по структурному (239 с.) и объектно-ориентированному программированию (265 с.). Разделы озаглавлены как «семинары», то есть это методическая поддержка для преподавателя, а не что-то полезное для студента.

Книга по несуществующему языку C/C++. Структурное программирование, ООП и библиотека.

В начале: алфавит, лексема... ну сколько можно. Форматирование, конечно, будет плохим, порой — «стеночкой». С транслитом (sort_vybor).

Терминология местами вольная: то «помеченный оператор» (совсем не оператор), то «метка».

Читать далее →
4 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть III (Л—О)

Валерий Викторович Лаптев. C++. Экспресс-курс

512 страниц. БХВ-Петербург, 2004

Обычный учебник. Немного устаревший. Знакомит с языком, библиотекой, отдельная часть — о программировании под Windows.

Возмущает только название раздела «Тяжёлое наследие C».

Приложения: системы фирмы Borland, Visual C++, ссылки по теме.

Валерий Викторович Лаптев, Александр Васильевич Морозов, Анастасия Валерьевна Бокова. C++. Объектно-ориентированное программирование. Задачи и упражнения

288 страниц. Питер, 2007

Как методичку такое дать студентам, наверное, нормально. А больше некому посоветовать.

Приложения: функции для работы с символьными массивами, обобщённые алгоритмы, рекомендуемые системы программирования.

Валерий Викторович Лаптев. C++. Объектно-ориентированное программирование

464 страницы. Питер, 2008

Ещё один обычный учебник.

Приложение: строки в C++.

Валерий Викторович Лаптев. C++. 20 уроков для начинающих

368 страниц. BHV, 2025

Дополнение от 10 июля 2025.

Содержание:

I. Знакомство с C++

  1. Начало
  2. Здравствуй, C++
  3. Погружаемся в C++
  4. Встроенные типы данных
  5. Выбор есть всегда (ветвеления — Прим. DZ)
  6. Повторение — мать учения (циклы — Прим. DZ)
  7. Функции
  8. С пользой для дела

II. Работа с данными в C++

  1. Массивы
  2. Создаём новые типы
  3. Знакомство с указателями
  4. Массивы и функции
  5. Строки, строки, строки
  6. Снова о функциях
  7. Печальная действительность

III. Вглубь C++

  1. Как всё устроено
  2. Опять функции
  3. Снова указатели
  4. Учимся писать и читать
  5. Большие программы

Первый вопрос к книге — кто целевая аудитория? С первой страницы, с предисловия, здесь и школьники с их ЕГЭ, и будущие олимпиадники, и просто первокурсники или новички. В конце книги есть глава «ЕГЭ и файлы». (Как вообще судить о книге про C++, если в ней упоминается бесчеловечный термин «контрольно-измерительные материалы» (КИМ)?)

Если честно, текстовая часть, а особенно врезки с «историями из жизни» — это бесполезная графомания. Даже названия половины «уроков» (глав) — какие-то бессодержательные. В первой врезке — история о том, что получилось же у автора научить своего первого дипломника Паскалю с нуля, дипломник написал транслятор с языка Java на C++, это был один из лучших у них дипломных проектов в 1999. И всё благодаря совету: сначала составлять «план» на русском языке.

«Hello, world!» вполне обычный. А дальше автор предугадывает вопросы от студентов: а как писать русскими буквами в консоль? Вот так писать.

#include <iostream>
#include <cstdlib> //                     // стандартная библиотека C
using namespace std;
int main(){ system("chcp 1251>nul");      // установка кодировки cp-1251
    cout << "Привет, мир!" << endl;
    return 0;
}

А как считать строку с пробелами? Вот вам тоже ответ. Такие мелочи обычно в хорошей литературе не обсуждаются.

Автор путается в терминологии. Например, объявление переменной int k; он называет оператором, а заголовочные файлы — библиотеками. Проскакивает редкий термин реализованные указатели (вместо умных указателей или интеллектуальных указателей).

«В C++11 макрос [NULL] был переопределён как nullptr».

Если понимать текст буквально, nullptr автор считает макросом. Это, конечно, не так.

С операторами он учит обращаться чересчур вольно (в какой момент такое уже не распутать?):

(a != 0)
?(x = -b/a, cout << x)
:((b == 0)
  ?(cout << "x любое")
  :(cout << "нет решения")
)
;

Хотя заявляется, что будут учить современному C++, какие-то любимые приёмчики автор продолжает использовать. Например, сейчас, чтобы воспользоваться числом π, можно написать std::numbers::pi для типа double и std::numbers::pi_v<float> для типа float. Вместо этого автор считает арккосинус от −1 (double const pi {acos(-1.0)};).

Глава «Никогда так не делайте» кажется весьма показательной. В программировании вообще и в программировании на C++ в частности есть много «никогда так не делайте», про это написаны десятки хороших книг за много десятилетий. Но в этой книге автор предупреждает, что не надо обменивать значения двух переменных с помощью сложения и вычитания (и других «олимпиадных» техник):

int a = 10, b = 3;
a = a + b;                // a = 13, b = 3
b = a - b;                // a = 13, b = 10
a = a - b;                // a = 3, b = 10

В последней трети книги начинается попытка показать, как писать код с помощью STL. Это контейнеры, итераторы, строки (в стиле C и std::string). И тут же — передача массива в функцию по ссылке (не по указателю), что, во-первых, довольно экзотично, во-вторых, всё равно требует задавать размер массива, к тому же его никак нельзя поменять.

Из хорошего — отладочные проверки assert, современные генераторы случайных чисел (но в примерах кода смешивается старая и новая инициализация), initializer_list, функции времени компиляции (constexpr), объяснение UB (неопределённого поведения), лямбда-функции.

Структура книги в целом выглядит последовательной, но на деле, например, место битовых операций или new кажется сомнительным.

Книга завязана на среду Code::Blocks (два приложения из четырёх тоже отведены ей). Что нажимать, что где искать. Автор пишет в одну строчку несколько выражений (statements), жалеет лишний пробел или перенос, путает базовые термины, отвечает на вопросы, которые можно отдать на самостоятельный поиск. От современного C++ здесь очень мало, а то, что есть, довольно бессистемно. Даже C++98 освещён однобоко. Что автор знал, то изложил.

Приложения: список литературы, ресурсы интернета (курс на «Степике», где нет даже указателей; стригущий рекламные деньги за безликие статьи «Метанит»; Википедия, русский Stackoverflow и другие), установка Code::Blocks в разных операционных системах (включая «Альт Образование»), среда Code::Blocks.

Николай Аркадьевич Литвиненко. Технология программирования на C++. Начальный курс

288 страниц. БХВ-Петербург, 2005

Основы, классы, потоки, STL, оконный интерфейс (в Windows). Плохо то, что классам учат на примере Visual C++ («мастер» с окошками).

Приложение: приоритеты операций.

Антон Леонардович Марченко. C++. Бархатный путь

399 страниц. Горячая линия-Телеком, 2005

Путь начинается со сравнения грамматик русского языка и формальных языков, идентификаторов и разных правил. Продраться через эти схемы трудно.

Оператор ::= ОператорОбъявления
         ::= *****
 
ОператорОбъявления ::= Объявление
Объявление ::= ОбъявлениеПеременной
           ::= *****
 
ОбъявлениеПеременной ::= ОбъявлениеПеременнойОсновногоТипа
                     ::= *****
...

Новичок вряд ли даже поймёт, где начинается первая программа. Каких-то более-менее цельных фрагментов в книге не будет очень долго.

Грамматика языка нужна разработчикам компиляторов, а не новичкам (или даже продолжающим). А разработчики компиляторов возьмут стандарт на языке оригинала.

Приложения: «грамматическая сводка», «контроль типов», «прочие характеристики языков программирования», «алгоритмы преобразования», дополнительный код, преобразования дробной части вещественного числа, элементы теории комплексных чисел (в книге есть класс для представления комплексного числа).

Марина Валентиновна Огнёва, Елена Вячеславовна Кудрина. Программирование на языке C++. Практический курс

335 страниц. Юрайт, 2021 (2017)

Переработка двух стостраничных методичек 2008 года «Основы программирования на языке C++». К основным главам добавили: классы и объекты, наследование, объектно-ориентированную реализацию списков и реализацию списков с помощью «бибилотеки» стандартных шаблонов. Код по сравнению с прошлым изданием немного причесали, но проблем по-прежнему много.

Книга формальная. С ошибками, скажем, не везде освобождается память (пример перекочевал полностью из старой версии, среди прочего — транслит и строка вместо символа).

#include <iostream>
using namespace std;
/* в функцию в качестве параметров передаются динамический массив mas
и его размерность n */

void print (int *mas, int n)
{
  for (int i = 0; i < n; i++)
    cout << mas[i] << "\t";
  print(a, 10);
  return 0;
}

Где-то насыпали новых ошибок. К примеру, директивы препроцессора не являются выражениями (statements), они не требуют точки с запятой, что бы там ни писали авторы.

#include < имя_заголовочного_файла >;

Приложения: Visual Studio, ошибки, возникающие при разработке программ, операции, математические функции.

Павел Алексеевич Орленко, Пётр Валентинович Евдокимов. C++ на примерах. Практика, практика и только практика

288 страниц. Наука и Техника, 2019

Среда Dev C++, int polovnik; и скриншоты консоли. Если код отформатировать, то получится нормальное введение для первокурсников.

После знакомства с классами сразу пишут небольшое клиент-серверное приложение на сокетах. Затем идут бинарный поиск и некоторые алгоритмы сортировки (на примере линейных списков).

Приложения: заголовочные файлы стандартной библиотеки (контейнеры, алгоритмы, строки, математика, исключения, границы диапазонов, <new> и RTTI).

3 ноября 2021
Обзоры книг по C++. Русскоязычная литература. Часть II (Д—К)

Владимир Григорьевич Давыдов. Программирование и основы алгоритмизации

447 страниц. Высшая школа, 2003

Эта книга не обещает научить языку C++, к тому же автор упорно пишет Си/C++. В основном будет часть, совместимая с C (в том числе константы не const, а #define). Форматирование будет не идеальное, где-то — транслит (kaf_name — «название кафедры»).

Сперва идут системы счисления, история языков программирования, блок-схемы. Автор немного знакомит с грамматиками и тем, как их представляют.

Читать далее →
3 мая 2021
Обзоры книг по C++. Русскоязычная литература. Часть I (А—Г)

Здесь перечислена базовая литература по языку C++ русскоязычных авторов, кроме книг, опубликованных издательствами университетов, и книг по конкретным технологиям (C++ Builder, Visual C++, Qt). Русскоязычная литература для профессионалов, специальная литература и книги по STL — в соответствующих разделах.

Аверкин В. П., Бобровский А. И., Веснич В. В., Радушинский В. Ф., Хомоненко Анатолий Дмитриевич. Программирование на C++

256 страниц. Корона-Принт, 1999

Книгу сопровождает комментарий «Под редакцией профессора А. Д. Хомоненко», ему же принадлежит и предисловие. Этот автор написал и другие книги — по языку Delphi и базам данных.

Введение очень формальное, многое вываливается безо всякого объяснения. Книга совершенно устаревшая, оформление кода ужасное, практически хаотичное. Некоторые вещи не выдерживают никакой критики (неправильная типографика и странный абсолютный путь).

#include “f:\POS_C\PRIMER\point.cpp“

А некоторые — просто ошибочны. Здесь вместо delete[] авторы написали delete (к тому же используется транслит и неоправданное сокращение).

int *mas=new int[n];
 . . .
delete mas;

Хотя в этой части нет книг, полностью посвящённых конкретным технологиям, последняя глава этой книги с кучей скриншотов показывает работу с Borland C++ Builder.

Читать далее →
13 марта 2021
Обзоры книг по C++. Учебная литература. Часть IV

Виктор Штерн. Основы C++: методы программной инженерии

880 страниц. Лори, 2003

Victor Shtern. Core C++. A Software Engineering Approach. Prentice Hall, 2000

Название «Core C++» правильнее было бы перевести не как «Основы C++», а как «ядро языка», то есть язык без стандартной библиотеки: отдельной такой главы действительно нет.

Книга с претензией. Первая тема первой главы «Объектно-ориентированный подход» — «Истоки кризиса программного обеспечения». То есть читателя ждут эссе о методах управления разработкой.

Дальше идёт типичное описание C++98, но с парой оговорок. Автор демонстрирует связный список. Но проблема в том, что функции появляются лишь в следующей главе. То есть вся работа со «связным списком» была прямо в функции main().

Читать далее →
5 4
3
2 1
© MMXI—MMXXV. RSS
 Boosty
Светлая тема / тёмная тема