Шрифт:
Интервал:
Закладка:
// а также удаляя дубликаты из полученного результата
{
Punct_stream ps(cin);
ps.whitespace(";:,.?!()"{}<>/&$@#%^*|~"); // " в строке
// означает "
ps.case_sensitive(false);
cout << "Пожалуйста, введите слова n";
vector<string> vs;
string word;
while (ps>>word) vs.push_back(word); // ввод слов
sort(vs.begin(),vs.end()); // сортировка в лексикографическом
// порядке
for (int i=0; i<vs.size(); ++i) // запись в словарь
if (i==0 || vs[i]!=vs[i–1]) cout << vs[i] << endl;
}
Этот код создает упорядоченный список введенных слов. Инструкция
if (i==0 || vs[i]!=vs[i–1])
удаляет дубликаты. Если в программу ввести слова
There are only two kinds of languages: languages that people complain
about, and languages that people don’t use.
то результат ее работы будет выглядеть следующим образом:
about
and
are
complain
don’t
kind
languages
of
only
people
that
there
two
use
Почему мы получили на выходе don’t, а не dont? Потому что оставили апостроф за пределами списка разделителей whitespace().


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

Этот пример можно сравнить с уроком, на котором учитель английского языка для иностранцев произносит выражения на сленге, чтобы показать его колорит и живость.
11.8. И еще много чего

Другим источником сложностей является буферизация; стандартные библиотечные потоки 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. Какие шестнадцатеричные числа используются в компьютерных