• продемонстрировать разницу между интерфейсом и реализацией.
Для того чтобы стать программистом, вы должны читать программы, причем не только учебные. Приведенный пример относится как раз к таким задачам. Через несколько дней или недель вы разберетесь в нем без труда и сможете улучшить это решение.
Этот пример можно сравнить с уроком, на котором учитель английского языка для иностранцев произносит выражения
на сленге, чтобы показать его колорит и живость.
11.8. И еще много чего
Подробности ввода-вывода можно описывать бесконечно. Этот процесс ограничен лишь терпением слушателей. Например, мы не рассмотрели сложности, связанные с естественными языками. То, что в английском языке записывается как
12.35
, в большинстве европейских языков означает
12,35
. Естественно, стандартная библиотека С++ предоставляет возможности для устранения этих и многих других проблем. А как записать китайские иероглифы? Как сравнивать строки, записанные символами малайского языка? Ответы на эти вопросы существуют, но они выходят далеко за рамки нашей книги. Если вам потребуется более детальная информация, можете обратиться к более специализированным книгам (например, Langer, Standard C++ IOStreams and Locales и Stroustrup, The C++ Programming Language), а также к библиотечной и системной документации. Ищите ключевое слово locale (местная специфика); этот термин обычно применяется к функциональным возможностям для обработки различий между естественными языками.
Другим источником сложностей является буферизация; стандартные библиотечные потоки
iostream
основаны на концепции под названием
streambuf
. Для сложных задач, связанных с потоками
iostream
, при решении которых важна производительность или функциональность, без объектов класса
streambuf
обойтись нельзя. Если хотите определить свой собственный класс
iostream
или настроить объекты класса
iostream
на новые источники данных, см. главу 21 книги The C++ Programming Language Страуструпа или системную документацию.
При программировании на языке С++ вы можете обнаружить семейство стандартных функций ввода-вывода
printf
/
scanf
, определенных в языке С. В этом случае прочитайте разделы 27.6, B.10.2, или прекрасный учебник Кернигана и Ритчи Язык программирования С (Kernighan and Ritchie, The C Programming Language), или же любой из многочисленных источников информации в веб. Каждый язык имеет свои собственные средства ввода-вывода; все они изменяются, иногда неправильно, но в большинстве случаев правильно (совершенно по-разному) отражая основные понятия, изложенные в главах 10 и 11.
Стандартная библиотека ввода-вывода описана в приложении Б, а связанные с ней графические пользовательские интерфейсы — в главах 12–16.
Задание
1. Напишите программу с именем
Test_output.cpp
.
Объявите целочисленную переменную
birth_year
и присвойте ей год своего рождения.
2. Выведите переменную
birth_year
в десятичном, шестнадцатеричном и восьмеричном виде.
3. Выведите основание системы счисления для каждого числа.
4. Выровняли ли вы результаты по столбцам с помощью символа табуляции? Если нет, то сделайте это.
5. Теперь выведите год вашего рождения.
6. Были ли какие-то проблемы? Что произошло? Замените ваш вывод на десятичный.
7. Вернитесь к упр. 2 и выведите основание системы счисления для каждого числа.
8. Попытайтесь прочитать данные как восьмеричные, шестнадцатеричные и т.д.
cin >> a >>oct >> b >> hex >> c >> d;
cout << a << '\t'<< b << '\t'<< c << '\t'<< d << '\n' ;
Запустите программу со следующими входными данными:
1234 1234 1234 1234
Объясните результаты.
9. Напишите программу, три раза выводящую на печать число
1234567.89:
сначала в формате
general
, затем — в
fixed
и в
scientific
. Какой способ представления обеспечивает наибольшую точность? Почему?
10. Создайте простую таблицу, содержащую фамилию, имя, телефонный номер и адрес электронной почты хотя бы пяти ваших друзей. Поэкспериментируйте с разной шириной полей, пока не найдете приемлемый.
Контрольные вопросы
1. Почему ввод-вывод является сложной задачей для программиста?
2. Что означает выражение
<< hex
?
3. Какие шестнадцатеричные числа используются в компьютерных науках? Почему?
4. Перечислите несколько возможностей, которые вы хотели бы реализовать при форматировании вывода целых чисел.
5. Что такое манипулятор?
6. Назовите префикс десятичного, восьмеричного и шестнадцатеричного числа.
7. Какой формат по умолчанию применяется при выводе чисел с плавающей точкой?
8. Что такое поле вывода?
9. Объясните, что делают функции
setprecision
и
setw
.
10. Для чего нужны разные режимы при открытии файлов?
11. Какие из перечисленных далее манипуляторов не являются инертными:
hex
,
scientific
,
setprecision
,
showbase
,
setw
?
12. Укажите разницу между символьным и двоичным вводом.
13. Приведите пример, демонстрирующий преимущество использования двоичного файла вместо текстового.
14. Приведите два примера, в которых может оказаться полезным класс
stringstream
.
15. Что такое позиция в файле?
16. Что произойдет, если позиция в файле будет установлена за его пределами?
17. Когда ввод строк предпочтительнее, чем ввод, ориентированный на тип?