Похожие презентации:
ЯП тема 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. Потоковые классы
2223. Потоковые классы
Часто используемые классы потоков: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
Программирование