|
Программирование >> Инициализация объектов класса, структура
Упражнение 20.1 string sa[4] = { пух , тигра , пятачок , иа-иа }; vector< string > svec( sa, sa+4 ); string robin( кристофер робин ); const char *pc = robin.c str(); int ival = 1024; char blank = ; double dval = 3.14159; Даны следующие определения объектов: complex purei( 0, 7 ); (a) Направьте значение каждого объекта в стандартный вывод. (b) Напечатайте значение адреса pc. Вместо того чтобы явно обходить все элементы контейнера, выводя каждый по очереди, можно воспользоваться потоковым итератором ostream iterator. Так выглядит эквивалентная программа, где используется эта техника (подробное обсуждение #include <iostream> #include <algorithm> #include <vector> #include <string> string pooh pals[] = { Тигра , Пятачок , Иа-Иа , Крок int main() { vector<string> ppals( pooh pals, pooh pals+4 ); vector<string>::iterator iter = ppals.begin(); vector<string>::iterator iter end = ppals.end(); cout << Это друзья Пуха: ; копируем кажд элемент в cout ... ostream iterator< string > output( cout, copy( iter, iter end, output ); cout << endl; итератора ostream iterator см. в разделе 12.4): Программа печатает такую строку: Pyoi aaoguy looa: беаба lyoaie Ёа-Ёа Ealeee 20.2. Ввод Основное средство реализации ввода - это оператор сдвига вправо (>>). Например, в следующей программе из стандартного ввода читается последовательность значений типа #include <iostream> #include <vector> int main() { vector<int> ivec; int ival; while ( cin >> ival ) ivec.push back( ival ); ... int и помещается в вектор: Подвыражение cin >> ival; читает целое число из стандартного ввода и копирует его в переменную ival. Результатом является левый операнд - объект класса istreami, в данном случае cin. (Как мы увидим, это позволяет сцеплять операторы ввода.) Выражение while ( cin >> ival ) читает последовательность значений, пока cin не станет равно false. Значение istream может быть равно false в двух случаях: достигнут конец файла (т.е. все значения из файла прочитаны успешно) или встретилось неверное значение, скажем 3.14159 (десятичная точка недопустима в целом числе), 1e-1 (буква e недопустима) или любой строковый литерал. Если вводится неверное значение, объект istream переводится в состояние ошибки и чтение прекращается. (В разделе 20.7 mi подробнее расскажем о таких состояниях.) Есть набор предопределенных операторов ввода, принимающих аргументы любого встроенного тина, включая C-строки, а также стандартных библиотечных типов string и complex: (c) Напечатайте наименьшее из двух значений ival и dval, пользуясь оператором условного выражения: ival < dval ? ival : dval #include <iostream> #include <string> int main() int item number; string item name; double item price; cout << Пожалуйста, введите item number, item name и price: << endl; cin >> item number; cin >> item name; cin >> item price; cout << Введены значения: item# << item number << << item name << @$ << item price << endl; Вот пример выполнения этой программы: Пожалуйста, введите item nuer, item name и price: 10247 widget 19.99 Введены значения: item# 10247 widget @$19.99 Можно ввести кажд1й элемент на отдельной строке. По умолчанию оператор ввода отбрасывает все разделяющие пустые символы: пробел, символ табуляции, символ перехода на новую строку, символ перевода страницы и символ возврата каретки. (О том, как отменить это поведение, см. в разделе 20.9.) Пожалуйста, введите item number, item name и price: 10247 widget 19.99 Введены значения: item# 10247 widget @$19.99 При чтении ошибка iostream более вероятна, чем при записи. Если mi вводим такую последовательность: ошибка: item name должно быть втортм zzLightyear 10009 8.99 то инструкция cin >> item number; закончится ошибкой ввода, поскольку BuzzLightyear не принадлежит типу int. При проверке объекта istream будет возвращено false, поскольку возникло состояние ошибки. Более устойчивая к ошибкам реализация выглядит так:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |