LoveRead.info » Книги » Разная литература » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

290 0 18:03, 26-08-2023
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
26 август 2023

Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

    1 ... 244 245 246 247 248 249 250 251 252 ... 337
    Перейти на страницу:
    — функция regex_match() ищет полное соответствие шаблона и строки.

    Одним из примеров является поиск почтовых индексов в разделе 23.6. Рассмотрим извлечение данных из следующей таблицы.

    Эта совершенно типичная и не очень сложная таблица (количество учеников в 2007 году в средней школе, в которой учился Бьярне Страуструп) извлечена с веб страницы, на которой она выглядела именно так, как нам нужно.

    • Содержит числовые поля.

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

    • Символьные строки содержат пробелы.

    • Поля отделены друг от друга разделителем, роль которого в данном случае играет символ табуляции.

     

     Мы назвали эту таблицу совершенно типичной и не очень сложной, но следует иметь в виду, что одна тонкость в ней все же скрывается: на самом деле мы не можем различить пробелы и знаки табуляции; эту проблему читателям придется устранить самостоятельно.

    Проиллюстрируем использование регулярных выражения для решения следующих задач.

    • Убедимся, что таблица сформирована правильно (т.е. каждая строка имеет правильное количество полей).

    • Убедимся, что суммы подсчитаны правильно (в последней строке содержатся суммы чисел по столбцам).

     

     Если мы сможем это сделать, то сможем сделать почти все! Например, мы смогли бы создать новую таблицу, в которой строки, имеющие одинаковые первые цифры (например, годы: первый класс должен иметь номер 1), объединены или проверить, увеличивается или уменьшается количество студентов с годами (см. упр. 10-11).

    Для того чтобы проанализировать эту таблицу, нам нужны два шаблона: для заголовка и для остальных строк.

    regex header( "^[\w ]+( [\w ]+)*$");

    regex row( "^[\w ]+(\d+)(\d+)(\d+)$");

     

     Помните, мы хвалили синтаксис регулярных выражений за лаконичность и полезность, а не за легкость освоения новичками? На самом деле регулярные выражения имеют заслуженную репутацию языка только для письма (write-only language). Начнем с заголовка. Поскольку он не содержит никаких числовых данных, мы могли бы просто отбросить первую строку, но — исключительно для приобретения опыта — попробуем провести ее структурный анализ. Она содержит четыре словарных поля (буквенно-цифровых поля”, разделенных знаками табуляции). Эти поля могут содержать пробелы, поэтому мы не можем просто использовать управляющий символ w, чтобы задать эти символы. Вместо этого мы используем выражение [w], т.е. словообразующий символ (букву, цифру или знак подчеркивания) или пробел. Один или несколько словообразующих символов задается выражением [w]+. Мы хотим найти тот из них, который стоит в начале строки, поэтому пишем выражение ^[w ]+. “Шапочка” (^) означает “начало строки”. Каждое из оставшихся полей можно выразить как знак табуляции, за которым следуют некие слова: ([w]+). До конца строки их может быть сколько угодно: ([w]+)*$. Знак доллара ($) означает “конец строки”. Теперь напишем строковый литерал на языке C++ и получим дополнительные обратные косые черты.

    "^[\w ]+( [\w ]+)*$"

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

    Приступим к самой интересной части упражнения: к шаблону для строк, из которых мы хотим извлекать числовые данные. Первое поле вновь имеет шаблон ^[w]+. За ним следуют ровно три числовых поля, перед каждым из которых стоит знак табуляции: (d+), следовательно, получаем следующий шаблон:

    ^[w ]+( d+)(d+)(d+)$

    После его вставки в строковый литерал он превращается в такую строку:

    "^[\w ]+(\d+)(\d+)(\d+)$"

    Теперь мы сделали все, что требовалось. Сначала проверим, правильно ли сформирована таблица.

    int main()

    {

      ifstream in("table.txt");   // входной файл

      if (!in) error("Нет входного файлаn");

      string line;                // буфер ввода

      int lineno = 0;

      regex header( "^[\w ]+( [\w ]+)*$"); // строка заголовка

      regex row("^[\w]+(\d+)(\d+)(\d+)$"); // строка данных

      if (getline(in,line)) { // проверяем строку заголовка

        smatch matches;

        if (!regex_match(line,matches,header))

          error("Нет заголовка");

      }

      while (getline(in,line)) { // проверяем строку данных

        ++lineno;

        smatch matches;

        if (!regex_match(line,matches,row))

          error("неправильная строка",to_string(lineno));

      }

    }

    Для краткости мы не привели здесь директивы #include. Проверяем все символы в каждой строке, поэтому вызываем функцию regex_match(), а не regex_search(). Разница между ними заключается только в том, что функция regex_match() должна сопоставлять с шаблоном каждый символ из потока ввода, а функция regex_search() проверяет поток ввода, пытаясь найти соответствующую подстроку. Ошибочное использование функции regex_match(), когда подразумевалось использовании функции regex_search() (и наоборот), может оказаться самой трудно обнаруживаемой ошибкой. Однако обе эти функции используют свои совпадающие аргументы совершенно одинаково.

    Теперь можем перейти к верификации данных в таблице. Мы подсчитаем количество мальчиков (“drenge”) и девочек (“piger”), учащихся в школе. Для каждой строки мы проверим, действительно ли в последнем поле (“ELEVER IALT”) записана сумму первых двух полей. Последняя строка (“Alle klasser”) содержит суммы по столбцам. Для проверки этого факта модифицируем выражение row, чтобы текстовое поле содержало частичное совпадение и можно было распознать строку “Alle klasser”.

    int main()

    {

      ifstream in("table.txt");  // входной файл

      if (!in) error("Нет входного файла");

      string line;               // буфер ввода

      int lineno = 0;

      regex header( "^[\w ]+( [\w ]+)*$");

      regex row("^([\w ]+)(\d+)(\d+)( d+)$");

      if (getline(in,line)) { // проверяем строку заголовка

        boost::smatch matches;

        if (!boost::regex_match(line, matches, header)) {

          error("Нет заголовка");

      }

     }

    // суммы по столбцам:

      int boys = 0;

      int girls = 0;

      while (getline(in,line)) {

        ++lineno;

        smatch matches;

        if (!regex_match(line, matches, row))

          cerr << "Неправильная строка: " << lineno << 'n';

        if (in.eof()) cout << "Конец файлаn";

        // проверяем строку:

        int curr_boy = from_string<int>(matches[2]);

        int curr_girl = from_string<int>(matches[3]);

        int curr_total = from_string<int>(matches[4]);

        if (curr_boy+curr_girl != curr_total)

          error("Неправильная суммаn");

        if (matches[1]=="Alle klasser") { // последняя строка

          if (curr_boy

    1 ... 244 245 246 247 248 249 250 251 252 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


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

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки