Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Второй путь связан с использованием так называемых манипуляторов. ( Звучит страшновато, не так ли? ) Манипуляторы — это объекты, определённые в заголовочном файле iomanip.h , которые приводят к тому же эффекту, что и описанные выше функции-члены ( чтобы иметь возможность пользоваться манипуляторами, вы должны не забыть включить iomanip.h в программу ). Единственное преимущество манипуляторов в том, что программа может включать их прямо в поток, не прибегая к вызову отдельной функции.
Если вы перепишете предыдущий пример так, чтобы в нём использовались манипуляторы, программа будет иметь следующий вид:
#include
#include
void fn( float interest , float dollarAmount )
{
cout << "Сумма в долларах = " ;
<< setprecision( 2 )<< dollarAmount
<< setprecision( 4 )<< interest
<< "\n" ;
}
Наиболее распространённые манипуляторы и их назначение приведены в табл. 24.4.
Таблица 24.4. Основные манипуляторы и функции управления форматом потока
_________________
Манипулятор — Функция-член — Описание
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
dec — flags( 10 )— Перейти в десятичную систему счисления
hex — flags( 16 )— Перейти в шестнадцатеричную систему счисления
oct — flags( 8 )— Перейти в восьмеричную систему счисления
setfill( с ) — fill( c )Установить символ заполнения с
setprecision( с ) — precision( с )— Установить количество отображаемых знаков после запятой в с
setw( n ) — width( n )— Установить ширину поля равной n символов*
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
_________________
*Примечание: это значение воздействует на вывод одного поля, после чего происходит возврат к значению по умолчанию.
«Внимательно следите за параметром ширины поля ( функцияwidth( n ) либо манипуляторsetw( n ) ). Большинство параметров сохраняют своё значение до тех пор, пока оно не будет изменено новым вызовом, однако для параметра ширины поля это не так. Этот параметр возвращается к значению по умолчанию, как только будет выполнен следующий вывод в поток. Например, приведённый ниже фрагмент кода не выведет два целочисленных значения длиной в 8 символов.»
[ Атас! ]
_________________
288 стр. Часть 5. Полезные особенности
#include
#include
void fn( )
{
cout << setw( 8 )/* ширина поля равна 8... */
<< 10 /* ...для 10 , но... */
<< 20 /* для 20 равна значению по умолчанию */
<< "\n" ;
}
В результате выполнения этого кода сначала будет выведено восьмисимвольное целое число, а за ним — двухсимвольное. Для вывода двух восьмисимвольных значений нужно сделать так:
#include
#include
void fn( )
{
cout << setw( 8 )/* установить ширину... */
<< 10
<< setw( 8 )
<< 20 /* ...обновить её */
<< "\n" ;
}
Таким образом, если вам нужно вывести несколько значений, но вас не устраивает длина поля по умолчанию, для каждого значения необходимо включать в вывод манипулятор setw( ) .
Какой же метод лучше — с использованием манипуляторов или функций? Функции-члены предоставляют больше контроля над свойствами потока — хотя бы потому, что их больше. Кроме того, функции-члены обязательно возвращают предыдущее значение изменяемого параметра, так что у вас всегда есть возможность восстановить прежнее значение параметра. И наконец, существуют версии этих функций, позволяющие узнать текущее значение параметра, не изменяя его. Использование этой возможности показано в приведённом ниже примере.
#include
void fn( float value )
{
int previousPrecision ;
/* Вы можете узнать текущую точность так: */
previousPrecision = cout.precision( ) ;
/* Можно также сохранить старое значение, одновременно изменяя его на новое */
previousPrecision = cout.precision( 2 ) ;
cout << value ;
/* Восстановим предыдущее значение */
cout.precision( previousPrecision ) ;
}
Несмотря на все преимущества "функционального" подхода, манипуляторы более распространены; возможно, это просто потому, что они "круче" выглядят. Используйте то, что вам больше нравится, но в чужом коде будьте готовы увидеть оба варианта.
_________________
289 стр. Глава 24. Использование потоков ввода-вывода
ОГЛАВЛЕНИЕ
В этой главе...
►Зачем нужен новый механизм обработки ошибок 291
►Механизм исключительных ситуаций 293
►Так что же мы будем бросать? 295
Трудно с этим смириться, но факт остаётся фактом: иногда функции работают неправильно. Традиционно вызывающей программе сообщается об ошибке посредством возвращаемого функцией значения. Однако язык С++ предоставляет новый, улучшенный механизм выявления и обработки ошибок с помощью исключительных ситуаций, или просто исключений ( exceptions). Исключение — это отступление от общего правила, т.е. случай, когда то или иное правило либо принцип неприменимы. Можно дать и такое определение: исключение — это неожиданное ( и, надо полагать, нежелательное ) состояние, которое возникает во время выполнения программы.
Механизм исключительных ситуаций базируется на ключевых словах try ( попытаться, пробовать, попытка — [ trai ] — [трай] ), throw ( бросить, бросание, бросок — [ θrou ] — [сроу] ) и catch ( поймать, схватить, ловить — [ kætʃ ] — [кэчь] ). В общих чертах этот механизм работает так: функция пытается ( пробует — try ) выполнить фрагмент кода. Если в коде содержится ошибка, функция бросает ( генерирует — throw ) сообщение об ошибке, которое должна поймать ( перехватить — catch ) вызывающая функция. Это продемонстрировано в приведённой ниже программе.
//
/* FactorialException — демонстрация исключений */
/* при использовании факториала */
//
#include
#include
#include
#include
using namespace std ;
/* factorial — вычисление факториала */
int factorial( int n )
{
/* Функция не обрабатывает отрицательные значения аргумента */
if ( n < 0 )
{
throw string( "Аргумент отрицателен" ) ;
}
/* Вычисляем факториал */
int accum = 1 ;
while ( n > 0 )
{
accum *= n ;
_________________
290 стр. Часть 5. Полезные особенности
n-- ;
}
return accum ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */
Читать дальшеИнтервал:
Закладка: