10.7 Упражнения.
- 1. (*1.5) Читая файл вещественных чисел, составлять из пар прочитанных
чисел комплексные числа, записать комплексные числа.
- 2. (*1.5) Определить тип name_and_address (тип_и_адрес). Определить для
него << и >>. Написать программу копирования объектов потока
name_and_address.
- 3. (*2) Разработать несколько функций для запроса и чтения данных
разных типов. Предложения: целое, вещественное число, имя файла,
почтовый адрес, дата, личная информация, и т.п. Попытайтесь сделать
их устойчивыми к ошибкам.
- 4. (*1.5) Напишите программу, которая печатает: (1) строчные буквы,
(2) все буквы, (3) все буквы и цифры, (4) все символы, входящие в
идентификатор в вашей версии С++, (5) все знаки пунктуации,
(6) целые значения всех управляющих символов, (7) все обобщенные
пробелы, (8) целые значения всех обобщенных пробелов, и, наконец,
(9) все изображаемые символы.
- 5. (*4) Реализуйте стандартную библиотеку ввода-вывода С (<stdio.h>)
с помощью стандартной библиотеки ввода-вывода С++ (<iostream.h>).
- 6. (*4) Реализуйте стандартную библиотеку ввода-вывода С++
(<iostream.h>) с помощью стандартной библиотеки ввода-вывода С
(<stdio.h>).
- 7. (*4) Реализуйте библиотеки С и С++ так, чтобы их можно было
использовать одновременно.
- 8. (*2) Реализуйте класс, для которого операция [] перегружена так,
чтобы обеспечить произвольное чтение символов из файла.
- 9. (*3) Повторите упражнение 8, но добейтесь, чтобы операция [] была
применима для чтения и для записи. Подсказка: пусть [] возвращает
объект "дескриптор типа", для которого присваивание означает:
присвоить через дескриптор файлу, а неявное приведение к типу char
означает чтение файла по дескриптору.
- 10.(*2) Повторите упражнение 9, позволяя операции [] индексировать
объекты произвольных типов, а не только символы.
- 11.(*3.5) Продумайте и реализуйте операцию форматного ввода.
Используйте для задания формата строку спецификаций как в printf().
Должна быть возможность попыток применения нескольких спецификаций для
одного ввода, чтобы найти требуемый формат. Класс форматного ввода
должен быть производным класса istream.
- 12.(*4) Придумайте (и реализуйте) лучшие форматы ввода.
- 13.(**2) Определите для вывода манипулятор based с двумя параметрами:
система счисления и целое значение, и печатайте целое в
представлении, определяемом системой счисления. Например, based(2,9)
напечатает 1001.
- 14.(**2) Напишите "миниатюрную" систему ввода-вывода, которая реализует
классы istream, ostream, ifstream, ofstream и предоставляет функции,
такие как operator<<() и operator>>() для целых, и операции, такие
как open() и close() для файлов. Используйте исключительные
ситуации, а не переменные состояния, для сообщения об ошибках.
- 15.(**2) Напишите манипулятор, который включает и отключает эхо
символа.