Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
39
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 16. Другие средства стандартной библиотеки

379

380

Часть III. Стандартная библиотека

  • length_error — попытка создания объекта, большего, чем максимальный размер типа size_t;

  • domain_error — нарушение внутренних условий перед выполнением действия;

  • out_of_range — попытка вызова функции с параметром, не входящим в допустимые значения;

  • i nva I i d__a rgument — попытка вызова функции с неверным параметром;

  • Гдпде_еггог — неправильный результат выполнения;

  • overflow_error — арифметическое переполнение (результат слишком большой для указанного типа данных);

  • underflow_error — исчезновение порядка (результат слишком маленький для указанного типа данных).

Для использования этих классов необходимо подключить заголовочный файл

<stdexcept>.

Средства локализации включают в себя упорядоченную по категориям информацию, специфичную для разных стран, например, представление даты и времени, формат национальной валюты, представление чисел и символов. Категории представлены классами. Программист может использовать их для обеспечения универсальности программы при ее работе в различных странах. Описания средств локализации находятся в заголовочных файлах <1оса1е> и <clocale>.

Для работы с комплексными числами библиотека предоставляет шаблон класса complex, его специализации для типов float, double и long double, а также многочисленные функции. Все это богатство становится доступным при подключении заголовочного файла <complex>.

Функции библиотеки описаны в приложении 6, константы, макросы и типы — в приложении 5, заголовочные файлы — в приложении 4.

Упражнения к части III

Стандартные потоки

Выполнить задания из раздела «Циклические вычислительные процессы» (см. упражнения к первой части) с использованием стандартных потоков, манипуляторов и форматирующих методов.

Файловые потоки

Выполнить задания из раздела «Функции и файлы» (см. упражнения к первой части) с использованием файловых потоков и методов обработки ошибок.

Потоки и типы, определенные пользователем

Дополнить программы из раздела «Классы» (см. упражнения ко второй части) перегруженными операциями ввода/вывода в поток для созданных классов.

Строки

Выполнить задания из раздела «Функции библиотеки для работы со строками и символами» (см. упражнения к первой части) с использованием класса string.

Контейнерные классы

Выполнить задания из разделов «Одномерные и двумерные массивы», «Структуры» и «Динамические структуры данных» (см. упражнения к первой части) с использованием соответствующих контейнерных классов библиотеки.

Алгоритмы

Выполнить задания из раздела «Одномерные массивы» (см. упражнения к первой части) с использованием контейнерных классов и алгоритмов библиотеки.

Класс valarray

Выполнить задания из разделов «Одномерные массивы» и «Двумерные массивы» (см. упражнения к первой части) с использованием класса valarray и срезов.

Послесловие

В этой книге большое внимание уделялось описанию основ языка C++, Владение ими является базой, необходимой для написания программ. Но создать эффективную, легко читаемую и расширяемую программу невозможно без знания механизмов реализации возможностей языка и способов их взаимодействия. Кроме того, как утверждает Скотт Майерс, «работа на C++ при правильном его использовании способна доставить удовольствие». Неполное же понимание функционирования языка, напротив, приводит к созданию программ, полных ошибок и не поддающихся сопровождению.

Поведение языка определяют цели, поставленные при его разработке. Для C++ .основными целями являлись эффективность, применимость для широкого спектра реальных задач, а также совместимость с языком С, традиционными инструментами и окружением.

История создания языка и причины включения в него тех возможностей, которыми он обладает в настоящий момент, подробно описаны в книге Б. Страуструпа «Дизайн и эволюция языка C++» [18]. Изучение этой книги поможет понять, отчего средства языка реализованы именно так, а не иначе. Полезные практические советы по грамотному написанию эффективных программ содержатся в книгах [17], [13] и [9]. Для получения полной справочной информации о языке и стандартной библиотеке лучше всего пользоваться стандартом ISO/IEC 14882:1998 (его предварительные варианты, мало отличающиеся от окончательного, можно найти в Интернете).

Желаю всем читателям дальнейших успехов в освоении и использовании C++!

Литература

  1. Аммерааль Л. STL для программистов на C++. — М.: ДМК, 2000. — 240 с.

  2. Бабэ Б. Просто и ясно о Borland C++. - М.: БИНОМ, 1995. - 400 с.

  3. Бадд Т. Объектно-ориентированное программирование в действии. — СПб.: Питер, 1997. - 464 с.

  4. Баженова И. Ю. Visual C++ 6.0. Уроки программирования. — М.: Диалог-МИФИ, 1999.-416 с.

  5. Дэвис С. C++ для «чайников». — К.: Диалектика, 1996. — 304 с.

  6. Брукс Ф. Мифический человеко-месяц, или как создаются программные комплексы. — М.: «Символ-Плюс», 2000. — 304 с.

  7. Буч Г. Объектно-ориентированный анализ и проектирование с примерами на C++.- М.: БИНОМ, 1998. - 560 с.

  8. Вирт Н. Алгоритмы + структуры данных = программы. — М.: Мир, 1985. — 406 с.

  9. Голуб А. Я. С и C++. Правила программирования. — М.: БИНОМ, 1996. — 272 с.

  1. Карпов Б., Баранова Т. C++: специальный справочник. — СПб.: Питер, 2000. - 480 с.

  2. Ласло М. Вычислительная геометрия и компьютерная графика на C++. — М.: БИНОМ, 1997. - 304 с.

  3. Луис Д. С и C++. Справочник. — М.: Восточная книжная компания, 1997. — 592 с.

  4. Мейерс С Эффективное использование C++. — М.: ДМК, 2000. — 240 с.

  5. Подбельский В. В. Язык Си++: Учебное пособие. — М.: Финансы и статистика, 1996. - 560 с.

  6. Пол И. Объектно-ориентированное программирование с использованием C++. - К.: ДиаСофт, 1995. - 480 с.

  7. Романовская Л. М. и др. Программирование в среде Си для ПЭВМ ЕС. — М.: Финансы и статистика, 1992. — 352 с.

  8. Страуструп Б. Язык программирования C++. — СПб.: БИНОМ, 1999. — 991 с.

  9. Страуструп Б. Дизайн и эволюция языка C++. — М.: ДМК, 2000. — 448 с.

  10. Шилдт Г. Теория и практика C++. - СПб.: BHV, 1996. - 416 с.

  11. Неформальное введение в C++ и Turbo Vision. — Галерея «Петроиоль», 1992. — 381 с.

ПРИЛОЖЕНИЕ 1 Операции языка C++

Операции приведены в порядке убывания приоритета. Операции с разными приоритетами разделены чертой.

Операция

Краткое описание

Унарные операции

доступ к области видимости

выбор

->

выбор

[ ]

индексация

( )

вызов функции

<тип>( )

конструирование

++

постфиксный инкремент

--

постфиксный декремент

typeid

идентификация типа

dynamic_cast

преобразование типа с проверкой на этапе выполнения

static_cast

преобразование типа с проверкой на этапе компиляции

reinterpret_cast

преобразование типа без проверки

const_cast

константное преобразование типа

sizeof

размер объекта или типа

--

префиксный декремент

++

префиксный инкремент

-

поразрядное отрицание

i

логическое отрицание

Приложение 1. Операции языка C++ 385

Операция

Краткое описание

-

арифметическое отрицание (унарный минус)

+

унарный плюс

&

взятие адреса I

*

разадресация

new

выделение памяти

delete

освобождение памяти

(<тип>)

преобразование типа

.*

выбор

->*

выбор

Бинарные и

тернарные операции

*

умножение

/

деление

I %

остаток от деления

+

сложение

| -

вычитание

«

сдвиг влево

»

сдвиг вправо

<

меньше

<=

меньше или равно

>

больше

>=

больше или равно

==

равно

!=

не равно

I &

поразрядная конъюнкция (И)

А

поразрядное исключающее ИЛИ

| поразрядная дизъюнкция (ИЛИ)

&&

логическое И

11 логическое ИЛИ

? :

условная операция (тернарная)

-

присваивание

=

умножение с присваиванием

/-

деление с присваиванием

386

Приложение 1. Операции языка C++

Операция

Краткое описание

X-

остаток отделения с присваиванием

сложение с присваиванием

--

вычитание с присваиванием

«»

сдвиг влево с присваиванием

»«

сдвиг вправо с присваиванием

&-

поразрядное И с присваиванием

I-

поразрядное ИЛИ с присваиванием

А-

поразрядное исключающее ИЛИ с присваиванием

throw

исключение

последовательное вычисление

ПРИЛОЖЕНИЕ 2

Спецификации формата для функций семейства printf

Спецификация

Пояснение

1 с

аргумент рассматривается как отдельный символ ,

d.1

аргумент преобразуется к десятичному виду

I е'Е

аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]m.nnnnnneO-]xx, где длина строки из п определяется указанной точностью. Точность по умолчанию равна 6

I f

аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]mmm.nnnnn, где длина строки из л определяется указанной точностью. Точность по умолчанию равна 6

g,G

используется формат или %f, который короче; незначащие нули не печатаются

0

аргумент преобразуется в беззнаковую восьмеричную форму (без лидирующего нуля)

Р

вывод указателя в шестнадцатеричном формате (эта спецификация не входит в стандарт, но она существует практически во всех реализациях)

S

аргумент является строкой: символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности

U

аргумент преобразуется в беззнаковую десятичную форму

х, X

аргумент преобразуется в беззнаковую шестнадцатеричную форму (без лидирующих Ох)

%

выводится символ %

388

Приложение 2. Спецификации формата для функций семейства printf

Модификаторы формата

Модификаторы формата применяются для управления шириной поля, отводимого дЛ5г размещения значения. Модификаторы — это одно или два числа, первое из которых задает минимальное количество позиций, отводимых под число, а второе — сколько из этих позиций отводится под дробную часть числа (точность). Если указанного количества позиций для размещения значения недостаточно, автоматически выделяется большее количество позиций:

  • *-minC или JminC;

  • *-min.precisionC или Jmin.precisionC.

Здесь С — спецификация формата из приведенной выше таблицы, min — число, задающее минимальную ширину поля. Смысл модификатора precision, также задаваемого десятичным числом, зависит от спецификации формата, с которой он используется:

  • при выводе строки (спецификация Xs) precision указывает максимальное число символов для вывода;

  • при выводе вещественного числа (спецификации *f или *е) precision указывает количество цифр после десятичной точки;

  • при выводе целого числа (спецификации И или *i), precision указывает минимальное количество выводимых цифр. Если число представляется меньшим числом цифр, чем указано в precision, выводятся ведущие (начальные) нули.

  • при выводе вещественного числа (спецификации *d или *G) precision указывает максимальное количество значащих цифр, которые будут выводится.

Символ минус (-) указывает на то, что значение выравнивается по левому краю и, если нужно, дополняется пробелами справа. При отсутствии минуса значение выравнивается по правому краю и дополняется пробелами слева.

Перед спецификацией могут использоваться префиксы 1 и h, например, *1 f, *hu.

Префикс h с типами d, i, о, х и X указывает на то, что тип аргумента short int, а с типом ushort unsigned int.

Префикс 1 с типами d, i, о, х и X указывает на то, что тип аргумента long int, с типом и - long unsigned int, а с типами е, Е, f, g и G — что тип аргумента double, а не float.

Пример:

#include <stdio.h> int main(){

int intl = 45. int2 - 13;

float f - 3.621;

double dbl = 2.23;

char ch = *z\ *str = "ramambahari";

printf("intl = Xd| int2 - X3d| int2 = *-4d|\n". intl. int2. int2);

printfC'intl = XX| int2 = X3x| int2 = X4o|\n". intl. int2. int2);

pr1ntf("f - Xf| f - X4.2f| f = X6.1f|\n". f. f. f);

printfC'f = Xg| f - Xe| f - X+E|\n". f. f. f);

Приложение 2. Спецификации формата для функций семейства printf

389

printfC'dbl - X5.21f| dbl - Ze| dbl - X4.1G|\n". dbl, dbl. dbl); printf("ch - %c\ ch - X3c|\n\ ch. ch);

printfC'str - *14s|\nstr = X-14s|\nstr = Xs|\n\ str, str, str); return 0; } Результат работы программы:

intl = 451 int2 = 131 int2 - 13 |

intl - 2D I int2 - d| int2 = 15 |

f - 3.6210001 f - 3.62 | f = 3.6 |

f - 3.621 I f - 3.621000e+000 | f - +3.62'1000E+000|

dbl = 2.23 | dbl - 2.230000e+000 | dbl - 2 |

ch - z| ch'- z |

str - ramambahari|

str - ramambahari |

str * ramambahari |

ПРИЛОЖЕНИЕ 3

Арифметические преобразования типов

Преобразования типов выполняются, если операнды, входящие в выражения, имеют различные типы. Ниже приведена последовательность преобразований.

□ Любые операнды типа char, unsigned char или short преобразуются к типу int по правилам:

  • char расширяется нулем или знаком в зависимости от умолчания для char;

  • unsigned char расширяется нулем;

  • signed char расширяется знаком;

  • short, unsigned short и enum при преобразовании не изменяются.

  • Затем любые два операнда становятся либо int, либо float, double или long double.

□ Если один из операндов имеет тип long double, то другой преобразуется к типу

long double.

□ Если один из операндов имеет тип double, то другой преобразуется к типу

double.

□ Если один из операндов имеет тип float, то другой преобразуется к типу

float.

  • Иначе, если один из операндов имеет тип unsigned long, то другой преобразуется к типу unsigned long.

  • Иначе, если один из операндов имеет тип long, то другой преобразуется к типу

long.

  • Иначе, если один из операндов имеет тип unsigned, то другой преобразуется к типу unsigned.

  • Иначе оба операнда должны иметь тип int.

Тип результата тот же, что и тип участвующих в выражении операндов.

ПРИЛОЖЕНИЕ 4

Заголовочные файлы стандартной библиотеки

Ввод/вывод

<cstdio>

Функции ввода/вывода в стиле С

<cstdlib>

Функции для работы с символами

<cwchar>

Функции ввода/вывода в стиле С для многобайтных символов

<fstream>

Файловые потоки

<iomanip>

Манипуляторы

<ios>

Базовые классы потоков ввода/вывода

! <iosfwd>

Предварительные объявления средств ввода/вывода

<iostream>

Стандартные объекты и операции с потоками ввода/вывода

<istream>

Входные потоки

<ostream>

Выходные потоки

<sstream>

Строковые потоки

<streambuf>

Буферизация потоков

Строки

<cctype>

Функции классификации символов

<cwctype>

<cwtype>

<cstring>

Функции для работы со строками в стиле С

<cstd1ib>

Функции для работы с символами

<string>

Строковый класс

392

Приложение 4. Заголовочные файлы стандартной библиотеки

Контейнерные классы

| <bitset>

Битовое множество

<deque>

Двусторонняя очередь

<list>

Двусвязный список

<map>

Словарь, словарь с дубликатами

<queue>

Очередь, очередь с приоритетами |

<set>

Множество, множество с дубликатами |

<stack>

Стек

<vector>

Одномерный массив

Алгоритмы, итераторы, утилиты

<algorithm>

Алгоритмы

<cstdlib>

Сортировка и поиск из библиотеки С

<ctime>

Дата и время в стиле С

<functional>

Функциональные объекты

<iterator>

Итераторы

<memory>

Распределители памяти для контейнеров |

<utility>

Операторы и пары

Диагностика, поддержка языка, локализация

1 <cassert>

Макрос assert

<сеггпо>

Обработка ошибок в стиле С

1 <cfloat>

Макросы предельных значений в стиле С

1 <climits>

Макросы предельных значений в стиле С

<clocale>

Локализация в стиле С

1 <csignal>

Обработка сигналов в стиле С

| <cstdarg>

Поддержка функций с переменным числом аргументов

1 <cstddef>

Поддержка языка библиотеки С

| <cstdlib>

Завершение программы

<ctime>

Системные часы |

<exception>

Поддержка исключений |

<limits>

Числовые ограничения

<locale>

Классы локализации

<new>

Работа с динамической памятью |

<stdexcept>

Стандартные исключения

<typeinfo>

Динамическая идентификация типов |

Приложение 4. Заголовочные файлы стандартной библиотеки

393

Численные расчеты

, <cmath>

Математические функции

<complex>

Комплексные числа

<cstdlib>

Случайные числа в стиле С

<numeric>

Числовые операции

<valarray>

Классы для численных расчетов

ПРИЛОЖЕНИЕ 5

Константы, макросы и типы данных стандартной библиотеки

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

assert <assert.h>

void assertdnt expression); Макрос assert прерывает выполнение программы, если значение выражения expression является ложным (нулевым). При завершении работы выводится сообщение об ошибке вида: Assertion failed: expression, file <имя_файла>, line <но-мер_строки>.

BUFSIZ <stdio.h>

Константа BUFSIZ применяется для задания размера в байтах буфера потока данных функциями fopen(), f reopen(), setbuf (). При открытии потока данных к нему автоматически присоединяется буфер длиной BUFSIZ. Минимальный размер BUFSIZ - 255 байтов.

CHAR BIT <limits.h>

В константе CHAR_BIT хранится количество бит наиболее короткого типа данных (по стандарту — типа char). Минимальное значение CHARJHT — 8.

cin. cout. сегг. clog <iostream.h>

Объекты потоковых классов, связанные со стандартными периферийными уст ройствами.

Приложение 5. Константы, макросы и типы данных стандартной библиотеки 395

Объект

Поток данных

Класс

cin

stdin

istream

cout

stdout

ostream

сегг

stderr

ostream

clog

stderr (буферизованный)

ostream

CHAR__MAX,

CHAR_MIN

<1imits.h>

В константе CHAR_MAX содержится максимальное значение, которое может иметь тип char. Если в конкретной реализации поддерживается тип signed char, то значение CHAR_MAX идентично значению SCHAR_MAX, в противном случае — UCHAR_MAX.

В константе CHARMIN содержится минимальное значение, которое может иметь тип char. Если в конкретной реализации поддерживается тип signed char, то значение CHAR_MIN идентично значению SCHARJ1IN, в противном случае — UCHAR_MIN.

clock t <time.h>

Тип данных c"lock_t предназначен для представления времени:

typedef long clock_t; Значение этого типа возвращает функция clockO.

CLOCKS PER SEC <time.h>

В константе CLOCKS_PER_SEC содержится количество циклов процессора в секунду. Функция clockO возвращает время, выраженное в циклах процессора. Чтобы перевести его в секунды, его необходимо разделить на CLOCKS_PER_SEC.

DBL. <f 1 oat. h>

(см. FLT...)

div t <float.h>

Структура di v_t служит для определения типа возвращаемого значения функции div(). Поле структуры quot содержит частное, а поле гет — остаток от деления.

typedef struct{

int quot;

int rem; }div_t;

EDOM <errno.h>

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