14. Напишите программу, которую, подобно программе из раздела 23.8.7, можно использовать для экспериментирования с сопоставлением шаблонов с помощью их ввода извне. Однако теперь программа должна считывать данные из файла и записывать их в память (разделение на строки производится с помощью символа перехода на новую строку '\n'
), чтобы можно было экспериментировать с шаблонами, содержащими разрывы строк. Протестируйте программу на нескольких десятках шаблонов.
15. Опишите шаблон, который нельзя представить с помощью регулярного выражения.
16. Только для экспертов: докажите, что шаблон из предыдущего упражнения действительно не является регулярным выражением.
Послесловие
Легко впасть в заблуждение, считая, что компьютеры и вычисления относятся только к числам, что вычисления являются частью математики. Очевидно, это не так. Просто посмотрите на экран компьютера; он заполнен текстом и пикселями. Может быть, ваш компьютер еще и воспроизводит музыку. Для каждого приложения важно выбрать правильный инструмент. В контексте языка С++ это значит правильно выбрать подходящую библиотеку. Для манипуляций текстом основным инструментом часто является библиотека регулярных выражений. Кроме того, не следует забывать об ассоциативных контейнерах map и стандартных алгоритмах.
Глава 24
Числа
“Любая сложная проблема имеет ясное, простое
и при этом неправильное решение”.
Г.Л. Менкен (H.L. Mencken)
Эта глава представляет собой обзор основных инструментов для численных расчетов, предоставляемых языком и его библиотекой. Мы рассмотрим фундаментальные проблемы, связанные с размером, точностью и округлением. В центре внимания этой главы — многомерные массивы в стиле языка С и библиотека
24.1. Введение
• Вопросы, связанные с встроенными типами, имеющими фиксированный размер, например точность и переполнение.
• Массивы, как в стиле языка С, так и класс из библиотека Matrix
, который лучше подходит для числовых расчетов.
• Введение в случайные числа.
• Стандартные математические функции из библиотеки.
• Комплексные числа.
Основное внимание уделено многомерным массивам в стиле языка С и библиотеке Matrix
, которая позволяет упростить работу с матрицами (многомерными массивами).
24.2. Размер, точность и переполнение
int
, long
и др.) представляют собой лишь приближение целых чисел, а числа с плавающей точкой (float
, double
и др.) являются лишь приближением действительных чисел. Отсюда следует, что с математической точки зрения некоторые вычисления являются неточными или неправильными. Рассмотрим пример.
float x = 1.0/333;
float sum = 0;
for (int i=0; i<333; ++i) sum+=x;
cout << setprecision(15) << sum << "\n";
Выполнив эту программы, мы получим не единицу, а
0.999999463558197