Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 149
Текст из файла (страница 149)
1. (*2) Напишите функпию, принимаюв~ую две строки з(г1пй и возвращающую строку, которая является конкатенацией этих двух строк с точкой между ними. Например, если даноЯ1е и шн1е, функция должна возвратиться(е.шг11е. Сделайте тоже самое с С-строками, используя только возможности С, такие как ша((ос Ц и з(г1еп Ц. Сравните две функции. Что будет подходящим критерием сравнения? 2. (*2) Перечислите различия между вес(ог и Ьаз(с з(г1пв'.
Какие различия сушественны? 3. ("2) Средства для работы со строками не слишком регулярны. Например, вы можете присвоить строке значение типа сйаг, но не можете инициализировать з(ггпу;значением сЬпг. Составьте список таких нерегулярностей. Какие из них можно устранить, не усложняя использование строк? Какие другие нерегулярности это вызовет? 4. ("1.5) В классе Ьаз1с з(г?пд множество членов. Какие из них моглн бы быть нечленами без потери эффективности н удобства записи? 5. (*1.5) Напишите версию Ьасй (пзег1ег 11 (9 19.2А), работающую с Ьаз(с з(г(пй.
6. (*2) Завершите тип Впз7с зибз1гтд иэ 6 20.3.13 и интегрируйте его с типом Яг1пп, чтобы перегрузить оператор 0 для обозначения «подстрока из>, а в остальном получившийся тип должен действовать как зЫпд. 7. (*2.5) Напишите функциюЯпс((), которая находит первое вхождение простого регулярного выражения в строку. Используйте з для обозначения «любой символ», * — для обозначения любого числа символов, не совпадающих со следующей частью регулярного выражения, и [абс1 — для обозначения любого символа из тех, что стоят между квадратными скобками (здесь а, Ь н с).
Другие символы должны совпадать сами с собой. Например, ЯпЫ(з, 'пате: "~ возвращает указатель на первое вхождение пате: в строку з ЯпП ~з, '(пМ]ате: ') возвращает указатель на первое вхождение в строку и либо пате: либо Мате:; афпг((з, "1пМ1ате (*~') возвращает указатель на первое вхождение в строку з Мате и пи пате с послелующими (возможно, пустыми) символьными последовательностями в скобках.
8. (*2.5) Каких операций, вы считаете, не хватает среди функций, работающих с простыми регулярнзями выражениями из 9 20.6(71? Определите их н добавьте. Сравните выразительность ваших функций для поиска регулярных выражений с широко распространенными. Сравните скорость работы ваших средств с распространеннымн. 9. ('2.5) Воспользуйтесь библиотекой регулярных выражений для реализации операций поиска по образцу над классом 8Ьтпп; имеющим ассоцинрованньш класс ЯибзЫпй. 10. (*2.5) Подумайте, как написать «идеальный» класс для универсальной обработки текстов.
Назовите его Техй Какими возможностями он должен обладать? Какие ограничения на реализацию и какие затраты вызовут ваши «ндеальные» срелства? 670 Глава 20, Строки 11. ("1.5) Определи~с набор перегруженных версий для п1рйа 0, Ьс(1дЫ () и т. и., так чтобы эти функции правильно работали с сйаг, ипзщлес(сйаг н юдпег1 ела г.
12. (*2.5) Напишите класс ЯПпд, оптимизированный для строк не более чем из восьми символов. Сравните его быстродействие со ИНпд из в 11.12 и вашей версии, реализующей стандартную библиотечную з1ппд. Можно ли создать строку, сочетающую преимущества строк, оптимизированных для очень малой длины, с преимуществами совершенно универсальных строк? 13. (*2) Оцените скорость копирования строк з1пщ Значительно ли оптимизирует копирование ваша реализация строк? 14. (*2.5) Сравните бзястродействие трех функций сотр1еГе пате 0 из в 20.3.9 н в 20.3.10. Попытайтесь написать версию сотр1е1е лате (), работающую с максимальной скоростью.
Ведите запись ошибок, выявленных во время реализации и проверки. 15. (*2.5) Представьте себе, что считывание строк средней длины (в большинстве своем от 5 до 25 символов) из потока с(п — самое узкое нес~о в вашей системе. Напишите функцию ввода, читающую такие строки с максимальнои скоростью (насколько сумеете придумать).
Вы можете выбрать интерфейс к атой функции, чтобы оптимизировать быстродействие, а не удобство. Сравните результат с вашей реализацией для строк е1гтй. 1б. ("1.5) Напишите функцию Иоз ((п1), которая возвращала бы строковое представление своего целочисленного аргумента. Потоки 'То, что вы видите, — это вге, что вы получите.. — Брайан Керниган Ввод и вывод — потоки ов1геат — вывод встроенных типов — вывод типов, определяемых пользователем — виртуальные функции вывода — потоки ге1геат — ввод встроенных типов — неформатированный ввод — состояние потока — ввод типов, определяемых пользователем — исключения ввода/вывода — связывание потоков — часовые — форматированный вывод целых и чисел с плавающей точкой — поля и выравнивания — манипуляторы— стандартные манипуляторы — манипуляторы, определяемые пользователем— файловые потоки — закрытие потоков — строковые потоки — строковые буферы — буферы потоков — национальные особенности — функции обратного вызова для потоков — рггу ~) — советы — упражнения.
21.1. Введение Проектирование и реализация средств универсального ввода/вывода для языка программирования представляет значительную трудность. Традиционно средства ввода/вывода проектировались исключительно для работы с несколькими встроенными типами ланных. Однако нетривиальные программы на С++ пользуются множеством типов. определяемых пользователем, и для этих типов нужно осуществлять ввод, вывод. Средства ввода/вывода должны быть просты, удобны н безопасны в использовании, эффективны и гибки, и, самое главное, полны.
Никто еще не нашел решения, которое понравилось бы всем. Поэтому должна быть воэлеожность обеспечить альтерпативныс средства ввода/вывода и расширить стандартный ввод/вывод в соответствии с требованиями прикладных программ. С++ разрабатывался для того, чтобы дать пользователю воэможность определять новые типы, такие же эффективные н удобные в использования, как и встроенные.
И гштому имеет смысл потребовать, чтобы средства ввода/вывола для С++ реалиэовывалпсь на С++ с использованием только тех возможностей, которые доступны каждому программисту. Представленные здесь средства для работы с потоками ввода/вывода являются следствием попытки справиться с этой задачей: 5 21.2 Вывод: То, что разработчик прикладных программ считает выводом, на самом деле является преобразованием объектов некоторого типа, такого как шб спаг" и Етр1оуее гесогд, в последовательность символов. Здесь 672 Глава 21.
Потоки описывается воэможность записи на вывод встроенных типов и типов, определяемых пользователем. э 21.3 Ввод: Здесь представлены средства для запроса на ввод символов, строк и значений других встроенных типов и типов, определяемых пользователем. Э 21.4 Форматирование: На расположение выводимой информации часто накладываются специальные требования.
Например, может возникнуть необходимость вывести число 1л1 в десятичном виде, а указатель в шестнадцатеричном, или числа с плавающей точкой должны быть записаны со строго определеьгной степенью точности. Здесь обсуждается управление форматированием и соответствующие приемы программирования. э 21.5 Файлы и потоки: По умолчанию каждая программа на С ь ь может пользоваться стандартными потоками, такими как стандартный вывод (еои1), стандартный ввод (с1л) и вывод ошибок (сепг).
Чтобы пользоваться другими устройствами и файлами, потоки должны создаваться и прикрепляться к этим устройствам и файлам. Здесь описываются механизмы открытия и закрытия файлов, а также прикрепления потоков к файлам и строкам Мгтлй. Э 21.6 Буферизация: Чтобы сделать ввод/вывод эффективным, мы должны воспользоваться стратегией буферизации, удобной как для записываемых (считываемых) данных, так и для приемника, куда они пишутся (или откуда читаются). Здесь представлены основные методы буферизации потоков. 4 21,7 Национальные особенности: Объект 1оеа1е описывает, как печатаются числа, какие символы считаются буквами и т. п.
Он инкапсулирует многие различия в культурных традициях. Национальные особенности используются системой ввода/вывода в неявном виде и описаны только вкратце. б 21.8 Ввод/вывод в плиле С: Рассматриваются функции рг(ля"'йиз библиотеки С <в1йо.й> и связи этой библиотеки с библиотекой С- ь к(ов1геат>. Для использования библиотеки це нужно знать методы, примененные при реализации библиотеки потоков. К тому же эти приемы в разных реализациях различаготся.