Кафедра 61
Классы
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Контроль готовности обучающихся к учебному занятию
Учебный вопрос № 1
Обзор стандартной библиотеки С++
Обзор стандартной библиотеки С++
Обзор стандартной библиотеки С++
Обзор стандартной библиотеки С++
Обзор стандартной библиотеки С++
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Потоковые классы
Учебный вопрос № 2
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
Строки
1.32M
Категория: ПрограммированиеПрограммирование

ЯП тема 4 лекция 08

1. Кафедра 61

ВОЕННО-КОСМИЧЕСКАЯ АКАДЕМИЯ ИМЕНИ А.Ф. МОЖАЙСКОГО
Кафедра 61
Языки программирования
Лекция
Тема 4. Объектно-ориентированное программирование на языке
С++
преподаватель 61 кафедры
подполковник Домбровский А.Ф.

2. Классы

Лекция № 4.8. Стандартная библиотека.
Цель занятия: Ознакомиться со стандартной библиотекой языка
С++.
Учебные вопросы:
1. Потоковые классы.
2. Строки.
2

3. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 1:
Что такое класс?
3

4. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 1:
Что такое класс?
Класс является
пользователем.
типом
данных,
определяемым
В классе задаются свойства и поведение какого-либо
предмета или процесса в виде полей данных
(аналогично структуре) и функций для работы с ними.
4

5. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 2:
Что такое инкапсуляция?
5

6. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 2:
Что такое инкапсуляция?
Объединение данных с функциями их
обработки в сочетании со скрытием ненужной
для использования этих данных информации
называется инкапсуляцией (encapsulation)
6

7. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 3:
Что такое полиморфизм?
7

8. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 3:
Что такое полиморфизм?
Полиморфизм – возможность использовать в
различных классах иерархии одно имя для
обозначения сходных по смыслу действий и
гибко выбирать требуемое действие во время
выполнения программы
8

9. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 4:
Что такое наследование?
9

10. Контроль готовности обучающихся к учебному занятию

Контрольный вопрос № 4:
Что такое наследование?
Наследование – это возможность создания иерархии
классов, когда потомки наследуют все свойства своих
предков, могут их изменять и добавлять новые.
10

11. Учебный вопрос № 1

Потоковые классы
11

12. Обзор стандартной библиотеки С++

Стандартную библиотеку С++ можно условно разделить на
две части:
1. Функции, макросы, типы и константы, унаследованные
из библиотеки С
2. Классы и другие средства С++
Первая часть рассматривалась в теме 2.
12

13. Обзор стандартной библиотеки С++

Классы стандартной библиотеки можно разделить на
группы в соответствии с их назначением.
Потоковые классы предназначены для управления
потоками данных между оперативной памятью и внешними
устройствами (например, дисками и консолью), а также в
пределах оперативной памяти.
Строковый класс предназначен для удобной и защищенной
от ошибок работы с символьными строками.
13

14. Обзор стандартной библиотеки С++

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

15. Обзор стандартной библиотеки С++

Диагностические классы обеспечивают динамическую
идентификацию типов и объектно-ориентированную
обработку ошибок.
Остальные классы обеспечивают динамическое
распределение памяти, адаптацию к локальным
особенностям, обработку функциональных объектов и т. д.
Часть библиотеки, в которую входят контейнерные классы,
алгоритмы и итераторы, называют стандартной
библиотекой шаблонов (STL — Standard Template Library).
15

16. Обзор стандартной библиотеки С++

Для использования средств стандартной библиотеки в программу требуется
включить с помощью директивы #include соответствующие заголовочные
файлы.
Например, потоки описаны в <iostream>, а списки — в <list>. Элементы
заголовочных файлов без расширения .h определены в пространстве имен std, а
одноименные файлы с расширением .h — в глобальном пространстве имен.
Имена заголовочных файлов С++ для функций библиотеки С, определенные в
пространстве имен std, начинаются с буквы с, например, <cstdio>, <cstring>,
<ctime>.
Для каждого заголовочного файла вида <сХ> существует файл <X.h>,
определяющий те же имена в глобальном пространстве имен
16

17. Потоковые классы

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

18. Потоковые классы

Чтение данных из потока называется извлечением, вывод в
поток — помещением, или включением. Поток
определяется как последовательность байтов и не зависит
от конкретного устройства, с которым производится обмен
(оперативная память, файл на диске, клавиатура или
принтер). Обмен с потоком для увеличения скорости
передачи данных производится, как правило, через
специальную область оперативной памяти — буфер.
Фактическая передача данных выполняется при выводе
после заполнения буфера, а при вводе — если буфер
исчерпан.
18

19. Потоковые классы

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

20. Потоковые классы

Стандартные потоки предназначены для передачи данных
от клавиатуры и на экран дисплея, файловые потоки — для
обмена информацией с файлами на внешних носителях
данных (например, на магнитном диске), а строковые
потоки – для работы с массивами символов в оперативной
памяти.
20

21. Потоковые классы

Для поддержки потоков библиотека С++ содержит
иерархию классов, построенную на основе двух базовых
классов – ios и streambuf. Класс ios содержит общие для
ввода и вывода поля и методы, класс streambuf
обеспечивает буферизацию потоков и их взаимодействие
с физическими устройствами. От этих классов
наследуется класс istream для входных потоков и ostream
– для выходных. Два последних класса являются
базовыми для класса iostream, реализующего
двунаправленные потоки. Ниже в иерархии классов
располагаются файловые и строковые потоки.
21

22. Потоковые классы

22

23. Потоковые классы

Часто используемые классы потоков:
ios – базовый класс потоков;
istream – класс входных потоков;
ostream – класс выходных потоков;
iostream – класс двунаправленных потоков;
istringstream – класс входных строковых потоков;
ostringrstream – класс выходных строковых потоков;
stringstream – класс двунаправленных строковых потоков;
ifstream – класс входных файловых потоков;
ofstream – класс выходных файловых потоков;
fstream – класс двунаправленных файловых потоков.
23

24. Потоковые классы

Описания классов находятся в заголовочных файлах:
<ios> – базовый класс потоков ввода/вывода;
<iosfwd> – предварительные объявления средств
ввода/вывода;
<istream> – шаблон потока ввода;
<ostream> – шаблон потока вывода;
<iostream> – стандартные объекты и операции с потоками
ввода/вывода;
<fstream> – потоки ввода/вывода в файлы;
<sstream> – потоки ввода/вывода в строки;
<streambuf> – буферизация потоков ввода/вывода;
<iomanip> – манипуляторы (о них рассказывается далее).
24

25. Потоковые классы

Подключение к программе файлов <fstream> и <sstream>
автоматически подключает и файл <iostream>, так как он является для
них базовым.
Основным преимуществом потоков по сравнению с функциями
ввода/вывода, унаследованными из библиотеки С, является контроль
типов, а также расширяемость, то есть возможность работать с типами,
определенными пользователем.
Для этого требуется переопределить операции потоков.
К недостаткам потоков можно отнести снижение быстродействия
программы, которое в зависимости от реализации компилятора может
быть весьма значительным.
25

26. Потоковые классы

26
Стандартные потоки
Заголовочный файл <iostream> содержит, кроме описания классов для
ввода/вывода, четыре предопределенных объекта.
Объе
Класс
Описание
cin
istream
Связывается с клавиатурой (стандартным буферизованным вводом)
cout
ostream
Связывается с экраном (стандартным буферизованным выводом)
cerr
ostream
Связывается с экраном (стандартным небуферизованным выводом),
кт
куда направляются сообщения об ошибках
clog
ostream
Связывается с экраном (стандартным буферизованным выводом),
куда направляются сообщения об ошибках

27. Потоковые классы

В классах istream и ostream операции извлечения из потока >> и помещения в
поток << определены путем перегрузки операций сдвига. Пример:
#include<iostream.h>
int main(){
int i;
cin >> i;
cout << "Вывели " << i;
return 0;
}
Особенности операций >> << рассмотреть самостоятельно по тексту
лекции !!
27

28. Потоковые классы

Форматирование данных
В потоковых классах форматирование выполняется с
помощью:
• флагов
• манипуляторов
• форматирующих методов.
28

29. Потоковые классы

Флаги и форматирующие методы
Флаги представляют собой отдельные биты, объединенные в поле x_flags типа
long класса ios.
Для управления флагами в классе ios есть методы flags, setf и unsetf:
long ios::flags(); — возвращает текущие флаги потока;
long ios::flags(long); — присваивает флагам значение параметра;
long ios::setf(long, long); — присваивает флагам, биты которых
установлены в первом параметре, значение соответствующих битов
второго параметра;
long ios::setf(long); — устанавливает флаги, биты которых установлены
в параметре;
long ios::unsetf(long); — сбрасывает флаги, биты которых установлены в
параметре.
Все функции возвращают прежние флаги потока.
29

30. Потоковые классы

Флаг
Полож
ение
skipws
0x0001
Left
0x0002
Right
0x0004
internal
0x0008
Умолч
30
Описание действия при установленном бите
ание
+
При извлечении пробельные символы игнорируются
Выравнивание по левому краю поля
+
Выравнивание по правому краю поля
Знак числа выводится по левому краю, число — по правому. Промежуток заполняется символами x_fill(см. ниже), по
умолчанию пробелами
Dec
0x0010
Oct
0x0020
Восьмеричная система счисления
Hex
0x0040
Шестнадцатеричная система счисления
showbase
0x0080
Выводится основание системы счисления (0x для шестнадцатеричных чисел и 0 для восьмеричных)
showpoint
0x0100
При выводе вещественных чисел печатать десятичную точку и дробную часть
uppercase
0x0200
При выводе использовать символы верхнего регистра
showpos
0x0400
Печатать знак при выводе положительных чисел
scientific
0x0800
Печатать вещественные числа в форме мантиссы с порядком
Fixed
0x1000
Печатать вещественные числа в форме с фиксированной точкой (точность определяется полем x_precision, см. ниже)
unitbuf
0x2000
Выгружать буферы всех потоков после каждого вывода
Stdio
0x4000
Выгружать буферы потоков stdout и stderr после каждого вывода
+
Десятичная система счисления

31. Потоковые классы

Кроме флагов, для форматирования используются следующие поля класса ios:
int x_width — минимальная ширина поля вывода;
int x_precision — количество цифр в дробной части при выводе вещественных чисел;
int x_fil l— символ заполнения поля вывода.
Для управления этими полями используются методы width, precision и fill:
int ios::width() — возвращает значение ширины поля вывода;
int ios::width(int) — устанавливает ширину поля вывода в соответствии со значением
параметра;
int ios::precision() — возвращает значение точности представления при выводе
вещественных чисел;
int ios::precision(int) — устанавливает значение точности представления при выводе
вещественных чисел, возвращает старое значение точности;
char fill() — возвращает текущий символ заполнения;
char fill(char) — устанавливает значение текущего символа заполнения, возвращает старое
значение символа.
31

32. Потоковые классы

#include <iostream.h>
int main(){
long a = 1000, b = 077;
cout.width(7);
cout.setf(ios::hex | ios::showbase | ios::uppercase);
cout<< a;
cout.width(7);
cout<< b <<endl;
double d = 0.12, c = 1.3e-4;
cout.setf(ios::left);
cout<< d <<endl;
cout<< c;
return 0;
}
32

33. Потоковые классы

В результате работы программы в первой строке будут прописными
буквами выведены переменные a и b в шестнадцатеричном
представлении, под каждую из них отводится по 7 позиций (функция
width действует только на одно выводимое значение, поэтому ее вызов
требуется повторить дважды). Значения переменных c и d прижаты к
левому краю поля:
0X3E8 0X3F
0.12
0.00013
Особенности проработать по тексту лекции!
33

34. Потоковые классы

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

35. Потоковые классы

Простые манипуляторы
Ниже перечислены манипуляторы, не требующие указания аргументов.
dec — устанавливает при вводе и выводе флаг десятичной системы
счисления;
oct — устанавливает при вводе и выводе флаг восьмеричной системы
счисления;
hex — устанавливает при вводе и выводе флаг шестнадцатеричной
системы счисления;
ws — устанавливает при вводе извлечение пробельных символов;
endl — при выводе включает в поток символ новой строки и выгружает
буфер;
ends — при выводе включает в поток нулевой символ;
flush — при выводе выгружает буфер.
35

36. Потоковые классы

Пример:
cout<< 13 << hex << ' ' << 13 <<oct<< ' '
<< 13 <<endl;
Если другие значения флагов установлены по умолчанию,
будет выведено:
13 d 15
36

37. Потоковые классы

Параметризованные манипуляторы
Ниже перечислены манипуляторы, требующие указания аргумента. Для их использования
требуется подключить к программе заголовочный файл <iomanip>.
setbase(int n) — задает основание системы счисления (n = 8, 16, 10 или 0). 0 является
основанием по умолчанию (десятичное, кроме случаев, когда вводятся 8- или 16-ричные
числа);
resetiosflags(long) — сбрасывает флаги состояния потока, биты которых установлены в
параметре;
setiosflags(long) — устанавливает флаги состояния потока, биты которых в параметре
равны 1;
setfill(int) — устанавливает символ-заполнитель с кодом, равным значению параметра;
setprecision(int) — устанавливает максимальное количество цифр в дробной части для
вещественных чисел;
setw(int) — устанавливает максимальную ширину поля вывода.
37

38. Потоковые классы

#include<iostream.h>
#include <iomanip.h>
int main(){
double d[] = {1.234, -12.34567, 123.456789, -1.234, 0.00001};
cout<<setfill('.') <<setprecision(4)
<<setiosflags(ios::showpoint | ios::fixed);
for (inti = 0; i< 5; i++)
cout<<setw(12) << d[i] <<endl;
return 0;
}
Результат работы программы:
......1.2340
....–12.3457
....123.4568
.....–1.2340
......0.0000
38

39. Учебный вопрос № 2

Строки
Стандартные классы просто так
в состав С++ не добавляются.
Г. Шилдт
39

40. Строки

Язык С не содержит стандартного типа данных «строка».
Вместо этого он поддерживает массивы символов,
завершаемые нуль-символом. Библиотека содержит
функции для работы с такими массивами, унаследованные
от С и описанные в заголовочном файле <string.h>
(<cstring>). Об этих функциях рассказывалось в лекции
«Функции работы со строками и символами». Они
позволяют достичь высокой эффективности, но весьма
неудобны и небезопасны в использовании, поскольку выход
за границы строки не проверяется.
40

41. Строки

Класс string стандартной библиотеки лишен этих
недостатков, но может проигрывать массивам символов в
эффективности. Основные действия со строками
выполняются в нем с помощью операций и методов, а
длина строки изменяется динамически в соответствии с
потребностями. Для использования класса необходимо
подключить к программе заголовочный файл <string>. В
старых версиях компиляторов заголовочный файл для
подключения класса string может иметь имя cstring.h или
bstring.h, а заголовочный файл для строк старого стиля —
string.h.
41

42. Строки

Пример и сравнение с строками С
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
int main (){
char c1[80], c2[80], c3[80]; // Строки с завершающим нулем
string s1, s2, s3;
// Присваивание строк
strcpy(c1, "old string one");
strcpy(c2, c1);
s1 = "new string one";
s2 = s1;
// Конкатенация строк
strcpy(c3, c1);
strcpy(c3, c2);
s3 = s1 + s2;
// Сравнение строк
if (strcmp(c2, c3) < 0 ) cout << c2;
else cout << c3;
if (s2 < s3) cout << s2;
else cout << s3;
}
42

43. Строки

Как видно из примера, выполнение любых действий со строками
старого стиля требует использования функций и менее наглядно. Кроме
того, необходимо проверять, достаточно ли места в строке-приемнике
при копировании, то есть фактически код работы со строками старого
стиля должен быть еще более длинным.
Строки типа string защищены от выхода информации за их границы и с
ними можно работать так же, как с любым встроенным типом данных,
то есть с помощью операций. Рассмотрим основные особенности и
приемы работы со строками.
43

44. Строки

Конструкторы и присваивание строк
В классе string определено несколько конструкторов. Ниже в
упрощенном виде приведены заголовки наиболее употребительных:
string();
string(const char *);
string(const char *, int n);
string(string &);
Первый конструктор создает пустой объект типа string. Второй создает
объект типа string на основе строки старого стиля, третий создает
объект типа string и записывает туда n символов из строки, указанной
первым параметром. Последний конструктор является конструктором
копирования, который создает новый объект как копию объекта,
переданного ему в качестве параметра.
44

45. Строки

В классе string определены три операции присваивания:
string& operator=(const string& str);
string& operator=(const char* s);
string& operator=(char c);
Как видно из заголовков, строке можно присваивать другую строку типа
string, строку старого стиля или отдельный символ, например:
string s1;
string s2("Вася");
string s3(s2);
s1 = 'X';
s1 = "Вася";
s2 = s3;
45

46. Строки

46
Операции
Ниже приведены допустимые для объектов класса string операции:
Операция
Действие
Операци
Действие
я
=
присваивание
>
больше
+
конкатенация
>=
больше или равно
==
равенство
[]
индексация
!=
неравенство
<<
вывод
<
меньше
<<
ввод
<=
меньше или равно
+=
добавление

47. Строки

Синтаксис операций и их действие очевидны. Размеры строк
устанавливаются автоматически так, чтобы объект мог содержать
присваиваемое ему значение.
Надо отметить, что для строк типа string не соблюдается соответствие
между адресом первого элемента строки и именем, как это было в
случае строк старого стиля, то есть &s[0] не равно s.
Кроме операции индексации, для доступа к элементу строки определена
функция at:
string s("Вася");
cout << s.at(1); // Будет выведен символ а
Если индекс превышает длину строки, порождается исключение
out_of_range.
47

48. Строки

Для работы со строками целиком этих операций
достаточно, а для обработки частей строк (например,
поиска подстроки, вставки в строку, удаления символов) в
классе string определено множество разнообразных
методов (функций), наиболее употребительные из которых
рассматриваются дальше.
48

49. Строки

Функции
Функции класса string для удобства рассмотрения можно
разбить на несколько категорий:
• присваивание и добавление частей строк,
• преобразования строк,
• поиск подстрок,
• сравнение и получение характеристик строк.
49

50. Строки

Присваивание и добавление частей строк
Для присваивания части одной строки другой служит функция assign:
assign(const string& str);
assign(const string& str, size_type pos, size_type n);
assign(const char* s, size_type n);
Для добавления части одной строки к другой служит функция append:
append(const string& str);
append(const string& str, size_type pos, size_type n);
append(const char* s, size_type n);
size_type представляет собой без знаковый целый тип, достаточный для
хранения размера самого большого объекта для данной модели.
50

51. Строки

Преобразования строк
Для вставки в одну строку части другой строки служит функция
insert:
insert(size_type pos, const string& str);
insert(size_type pos, const string& str, size_type pos2,
size_type n);
insert(size_type pos, const char* s, size_type n);
Для удаления части строки служит функция erase:
erase(size_type pos = 0, size_type n = npos);
Очистку всей строки можно выполнить с помощью функции clear:
void clear();
Для замены части строки служит функция replace:
replace(size_type pos, size_type n, const string& str);
replace(size_type pos, size_type n, const string& str, size_type
pos2, size_type n2);
51

52. Строки

Для обмена содержимого двух строк служит функция swap:
swap(string& s);
Для выделения части строки служит функция substr:
string substr(size_type pos = 0, size_type n = npos) const;
Иногда требуется преобразовывать объекты типа string в строки старого стиля. Для этого
предназначена функция c_str:
const char* c_str() const;
Аналогично работает функция data, за тем исключением, что не добавляет в конец строки нульсимвол:
const char* data() const;
Функция copy копирует в массив s n элементов вызывающей строки, начиная с позиции pos. Нульсимвол в результирующий массив не заносится. Функция возвращает количество скопированных
элементов:
size_type copy(char* s, size_type n, size_type pos = 0) const;
52

53. Строки

Пример разобрать по тексту лекции!
53

54. Строки

Поиск подстрок
Для поиска в классе string предусмотрено большое разнообразие функций.
Ниже приведены основные.
size_type find(const string& str, size_type pos = 0) const;
size_type find(char c, size_type pos = 0) const;
size_type rfind(const string& str, size_type pos = npos) const;
size_type rfind(char c, size_type pos = npos) const;
size_type find_first_of(const string& str, size_type pos = 0) const;
size_type find_first_of(char c, size_type pos = 0) const;
size_type find_last_of(const string& str, size_type pos = npos) const;
size_type find_last_of(char c, size_type pos = npos) const;
size_type find_first_not_of(const string& str, size_type pos = 0) const;
И другие! Рассмотреть по тексту лекции вместе с примером.
54

55. Строки

Сравнение частей строк
Для сравнения строк целиком применяются перегруженные
операции отношения, а если требуется сравнивать части
строк, используется функция compare:
int compare(const string& str) const;
int compare(size_type pos, size_type n, const string& str) const;
int compare(size_type pos, size_type n,
const string& str, size_type pos2, size_type n2) const;
55

56. Строки

#include <string>
#include <iostream>
using namespace std;
int main (){
string s1("лесная королева"), s2("ле"), s3("корова");
cout << "s1= " << s1 << endl;
cout << "s2= " << s2 << endl;
cout << "s3= " << s3 << endl;
if (s2.compare(s3) > 0)
cout << "s2 > s3 " << endl;
if (s1.compare(7, 4, s3) < 0)
cout << "s1[7-10] < s3 " << endl;
if (s1.compare(7, 4, s3, 0,4 ) == 0)
cout << "s1[7-10] == s3[0-3] " << endl;
}
56

57. Строки

Получение характеристик строк
В классе string определено несколько функций-членов, позволяющих получить
длину строки и объем памяти, занимаемый объектом:
size_type size() const; // Количество элементов строки
size_type length() const; // Количество элементов строки
size_type max_size() const; // Максимальная длина строки
size_type capacity() const; // Объем памяти, занимаемый
строкой
bool empty() const; // Истина, если строка пустая
57
English     Русский Правила