Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

    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(matches[2]);

    int curr_girl = from_string(matches[3]);

    int curr_total = from_string(matches[4]);

    if (curr_boy+curr_girl != curr_total)

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

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

      if (curr_boy != boys)

        error("Количество мальчиков не сходится\n");

      if (curr_girl != girls)

        error("Количество девочек не сходится\n");

      if (!(in>>ws).eof)

        error("Символы после итоговой строки");

      return 0;

    }

    // обновляем суммы:

    boys += curr_boy;

    girls += curr_girl;

  }

    error("Итоговой строки нет");

}

Последняя строка по смыслу отличается от остальных: в ней содержатся суммы. Мы распознаем ее по метке (“Alle klasser”). Мы решили, что после последнего символа не должны стоять символы, не являющиеся разделителями (для распознавания этого факта используется функция lexical_cast (см. раздел 23.2)), и выдаем сообщение об ошибке в случае их обнаружения.

Для того чтобы извлечь числа из полей данных, мы использовали функцию from_string из раздела 23.2. Мы уже проверили, что эти поля содержат только цифры, поэтому проверять правильность преобразования объекта класса string в переменную типа int не обязательно.

<p id="AutBody_Root459"><strong>23.10. Ссылки</strong></p>

Регулярные выражения — популярный и полезный инструмент, доступный во многих языках программирования и во многих форматах. Они поддерживаются элегантной теорией, основанной на формальных языках, и эффективной технологией реализации, основанной на конечных автоматах. Описание регулярных выражений, их теории, реализации и использования конечных автоматов выходит за рамки рассмотрения настоящей книги. Однако поскольку эта тема в компьютерных науках является довольно стандартной, а регулярные выражения настолько популярны, найти больше информации при необходимости не составляет труда.

Перечислим некоторые из этих источников.

Aho, Alfred V., Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools, Second Edition (обычно называемая “The Dragon Book”). Addison-Wesley, 2007. ISBN 0321547985.

Austern, Matt, ed. “Draft Technical Report on C++ Library Extensions”. ISO/IEC DTR 19768, 2005. www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n2336.pdf.

Boost.org. Хранилище библиотек, согласованных со стандартной библиотекой языка С++. www.boost.org.

Cox, Russ. “Regular Expression Matching Can Be Simple and Fast (but Is Slow in Java, Perl, PHP, Python, Ruby, ...)”. http://swtch.com/~rsc/regexp/regexp1.html.

Maddoc, J. boost::regex documentation. www.boost.org/libs/regex/doc/index.html.

Schwartz, Randal L., Tom Phoenix, and Brian D. Foy. Learning Perl, Fourth Edition.

O’Reilly, 2005. ISBN 0596101058.

Задание

1. Выясните, является ли библиотека regex частью вашей стандартной библиотеки. Подсказка: ищите std::regex и tr1::regex.

2. Запустите небольшую программу из раздела 23.7; для этого может понадобиться инсталлировать библиотеку boost::regex на вашем компьютере (если вы этого еще не сделали) и настроить опции проекта или командной строки для установления связи с библиотекой regex, а затем использовать заголовки regex.

3. Используйте программу из задания 2 для проверки шаблонов из раздела 23.7.

Контрольные вопросы

1. Где мы находим “text”?

2. Какие возможности стандартной библиотеки чаще всего используются для анализа текста?

3. Куда вставляет элемент функция insert — перед или после указанной позиции (или итератора)?

4. Что такое Unicode?

5. Как конвертировать тип в класс string и наоборот?

6. В чем заключается разница между инструкцией cin>>s и вызовом функции getline(cin,s), если s — это объект класса string?

7. Перечислите стандартные потоки.

8. Что собой представляет ключ ассоциативного массива map? Приведите примеры полезных типов для ключей.

9. Как перемещаться по элементам контейнера класса map?

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

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

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT