Скачать презентацию Язык программирования С продолжение Лекция 02 13 г Скачать презентацию Язык программирования С продолжение Лекция 02 13 г

Лекция-21.ppt

  • Количество слайдов: 27

Язык программирования С++ (продолжение) Лекция 02. 13 г. 1 Язык программирования С++ (продолжение) Лекция 02. 13 г. 1

Стандартная библиотека С++ Ни одна «серьезная» программа не может быть написана только с использованием Стандартная библиотека С++ Ни одна «серьезная» программа не может быть написана только с использованием «чистых» конструкций языка; программисты обязательно используют средства поддержки, которые, как правило, разрабатываются одновременно с языком, реализуются в виде библиотек поддержки и создают основу для успешной работы. Стандартная библиотека С++ является «надстройкой» над языком и существенно расширяет его базовые возможности, предоставляя разработчикам большое количество удобных и полезных конструкций, которые могут использоваться ими в качестве «строительных блоков» . Описание библиотеки и требования к ней (состав, интерфейсы, функциональность и пр. ) включены в международный стандарт языка С++: Programming languages – C++, INTERNATIONAL STANDARD ISO/IEC 14882, Second edition 2003 -10 -15 ISO/IEC 14882: 2011. Programming languages — C++, Third edition Лекция 02. 13 г. 2

Язык Средства поддержки Лекция 02. 13 г. 3 Язык Средства поддержки Лекция 02. 13 г. 3

Стандартная библиотека С++ Основные источники: Н. Джосьютис C++. Стандартная библиотека. Для профессионалов. –СПб. : Стандартная библиотека С++ Основные источники: Н. Джосьютис C++. Стандартная библиотека. Для профессионалов. –СПб. : Питер, 2004. — 730 с. Электронная документация по библиотеке расположена по адресу: http: //msdn. microsoft. com/ru-ru/library/cscc 687 y(v=vs. 100). aspx Лекция 02. 13 г. 4

Библиотека Строки Ввод/Вывод STL Прочие Контейнеры Поддержка языка Итераторы Диагностика Алгоритмы Основные утилиты Локализация Библиотека Строки Ввод/Вывод STL Прочие Контейнеры Поддержка языка Итераторы Диагностика Алгоритмы Основные утилиты Локализация Числа Лекция 02. 13 г. 5

51 файл 33 файла – С++ <algorithm> <bitset> <complex> <deque> <exception> <fstream> <functional> <iomanip> 51 файл 33 файла – С++ 18 файлов – С Лекция 02. 13 г. String I/O STL 6

Лекция 02. 13 г. 7 Лекция 02. 13 г. 7

Интернационализация и локализация (clocale) В заголовочном файле clocale определены типы и функции, поддерживающие интернационализацию Интернационализация и локализация (clocale) В заголовочном файле clocale определены типы и функции, поддерживающие интернационализацию и локализацию, которая влияет на формат отображения чисел, даты, времени, денежных сумм, порядок сортировки строк. Совокупность действующих в данный момент времени установок называется локалью. Различные установки локали сгруппированы по 6 категориям, каждая из которых имеет своё условное обозначение: LC_ALL – все категории, LC_COLLATE – порядок сортировки строк, LC_CTYPE – тип символов, LC_MONETARY – форматирование денежных единиц, LC_NUMERIC – форматирование чисел, LC_TIME – форматирование времени Лекция 02. 13 г. 8

Интернационализация и локализация (clocale) Для установки определенной категории локали или всей локали используется функция Интернационализация и локализация (clocale) Для установки определенной категории локали или всей локали используется функция char *setlocale(int category, const char *locale); //Ex 203. cpp - setlocale example #include с комментариями #include #include using namespace std; int main() { char *loc, buf[50]; //loc = setlocale(LC_ALL, "Russian_Russia. 1251"); cout << "Текущая локаль: " << loc << "n"; //loc = setlocale(LC_ALL, "Russian_Russia. 866"); cin >> buf; cout << buf << "n"; system("PAUSE"); без комментариев return 0; } Лекция 02. 13 г. 9

Интернационализация и локализация (clocale) Для хранения информации, используемой при форматировании чисел и денежных единиц Интернационализация и локализация (clocale) Для хранения информации, используемой при форматировании чисел и денежных единиц служит структура lconv, имеющая 18 полей: char *decimal_point, char *thousands_sep, char *grouping, char *int_curr_symbol, char *currency_symbol, char *mon_decimal_point, char *mon_thousands_sep, char *mon_grouping, char *positive_sign, char *negative_sign, char int_frac_digits, char p_cs_precedes, char p_sep_by_space, char n_cs_precedes, char n_sep_by_space, char p_sign_posn, char n_sign_posn Например, поле int_curr_symbol хранит четырёхсимвольную строку, в которой первые 3 символа – международное обозначение денежной единицы, а четвертый – разделитель между символом денежной единицы и числом (RUR ). Лекция 02. 13 г. 10

Интернационализация и локализация (clocale) Для получения информации о текущем состоянии данной структуры используется функция Интернационализация и локализация (clocale) Для получения информации о текущем состоянии данной структуры используется функция lconv* localeconv(); //Ex 204. cpp - setlocale example #include #include #include using namespace std; int main() { char *loc; loc=setlocale(LC_ALL, "Russian"); cout << "Текущая локаль: " << loc << "n"; lconv *pl = localeconv(); cout << "Симв. ден. ед. : " << pl->currency_symbol << "n"; cout << "Межд. симв. ден. ед. : " << pl->int_curr_symbol << "n"; cout << "Денежная дес. точка: " << pl->mon_decimal_point << "n"; system("PAUSE"); return 0; } Лекция 02. 13 г. 11

Строки (cstring) Заголовочный файл cstring содержит объявления функций для работы со строками. Все функции Строки (cstring) Заголовочный файл cstring содержит объявления функций для работы со строками. Все функции делятся на 2 категории: - mem… , которые работают с произвольными участками памяти, рассматривая их как массивы unsigned char; при их вызове должен задаваться размер участка памяти; - str… , которые работают с символьными массивами, заканчивающимися нулевым байтом. Функции для работы со строками из расширенных символов (unicode) объявлены в заголовочном файле cwchar. При работе со строками полезны функции из заголовочных файлов cctype и cwtype, предназначенные для проверки и преобразования объектов суженных или расширенных символьных типов. Существенно более мощные средства обработки строк на С++ содержатся в заголовочном файле string. Лекция 02. 13 г. 12

Строки (cstring) Следующий пример демонстрирует использование функций strlen и tolower. //Ex 207. cpp - Строки (cstring) Следующий пример демонстрирует использование функций strlen и tolower. //Ex 207. cpp - cstring example #include #include #include кодировка Windows #include #include using namespace std; int main(void) { char string[100]; cin >> string; //setlocale(LC_ALL, "Russian"); // Windows //setlocale(LC_ALL, "Russian_Russia. 866"); // DOS for(int i=0; i

Строки С++ (string) Следующий пример демонстрирует использование класса string. //Ex 208. cpp #include <iostream> Строки С++ (string) Следующий пример демонстрирует использование класса string. //Ex 208. cpp #include #include #include using namespace std; int main(void) { string ss; cin >> ss; cout << ss << "n"; cout << "dif: " << ss. find("dif") << endl; cout << "digit: " << ss. find_first_of("123") << endl; cout << "not: " << ss. find_first_not_of("abcdefg") << endl; system("PAUSE"); return 0; } a b c d i f g t r 9 8 6 5 4 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Лекция 02. 13 г. 14

Библиотека ввода-вывода (iostream) В языке С++ нет специальных операторов для ввода или вывода данных. Библиотека ввода-вывода (iostream) В языке С++ нет специальных операторов для ввода или вывода данных. Вместо этого имеется набор классов, стандартно поставляемых вместе с компилятором, которые и реализуют основные операции ввода-вывода. Библиотека классов для ввода-вывода решает две задачи. Во-первых, она обеспечивает эффективный ввод-вывод данных всех встроенных типов, а также простое и гибкое определение операций ввода-вывода для новых типов, разрабатываемых программистом. Во-вторых, сама библиотека позволяет при необходимости развивать её и модифицировать. Механизм ввода-вывода в С++ называется потоком и реализуется классами istream (поток ввода) и ostream (поток вывода), определёнными в iostream. В этом файле определены также три глобальных объекта: cout, cerr (объекты класса ostream, выполняющие вывод на терминал) и cin (объект класса istream, выполняющий ввод с терминала). cout называется стандартным выводом, cin – стандартным вводом, cerr – стандартным потоком сообщений об ошибках. Вывод осуществляется с помощью операции <<, ввод с помощью операции >>, например: cout << "Пример вывода: " << 34; int x; cin >> x; Лекция 02. 13 г. 15

Операции << и >> для потоков В классах библиотеки iostream операции >> и << Операции << и >> для потоков В классах библиотеки iostream операции >> и << определены для всех встроенных типов языка С++ и для строк (тип char*). Если мы хотим использовать такую же запись для ввода и вывода объектов других классов, то для них нужно выполнить перегрузку этих операций. Эта возможность будет рассмотрена в теме «Перегрузка операций для классов» . Лекция 02. 13 г. 16

Форматирование ввода-вывода и манипуляторы Манипуляторы – это объекты-функторы, которые могут использоваться в качестве операндов Форматирование ввода-вывода и манипуляторы Манипуляторы – это объекты-функторы, которые могут использоваться в качестве операндов операторов ввода-вывода для управления потоком. Манипуляторы могут выводить в поток дополнительные данные, считывать их из потока, устанавливать флаги и делать многое другое. Перечень некоторых стандартных манипуляторов: endl - при выводе перейти на новую строку; ends - вывести нулевой байт (признак конца строки символов); flush - немедленно вывести и опустошить все промежуточные буферы; dec - выводить числа в десятичной системе (действует по умолчанию); oct - выводить числа в восьмеричной системе; hex - выводить числа в шестнадцатеричной системе; setw (int n) - установить ширину поля вывода в n символов; setfill(int n) - установить символ-заполнитель; этим символом выводимое значение будет дополняться до необходимой ширины; setprecision(int n) - установить количество цифр после запятой при выводе вещественных чисел; setbase(int n) - установить систему счисления для вывода чисел; n может принимать значения 0, 2, 8, 10, 16, причем 0 означает систему счисления по умолчанию, т. е. 10. Специализированные манипуляторы могут создаваться программистом самостоятельно. Лекция 02. 13 г. 17

Форматирование ввода-вывода и манипуляторы Те же манипуляторы (за исключением endl и ends) могут использоваться Форматирование ввода-вывода и манипуляторы Те же манипуляторы (за исключением endl и ends) могут использоваться и при вводе. В этом случае они описывают представление вводимых чисел. Кроме того, имеется манипулятор, работающий только при вводе, это ws. Данный манипулятор переключает вводимый поток в такой режим, при котором все пробелы (включая табуляцию, переводы строки, переводы каретки и переводы страницы) будут вводиться. По умолчанию эти символы воспринимаются как разделители между атрибутами ввода. int x; // ввести шестнадцатеричное число cin >> hex >> x; Лекция 02. 13 г. 18

Примеры //Ex 100. cpp #include <iostream> using namespace std; int main( ) { double Примеры //Ex 100. cpp #include using namespace std; int main( ) { double values[] = { 1. 23, 35. 36, 653. 7, 4358. 24 }; for( int i = 0; i < 4; i++ ) { cout. width(10); cout. fill( '*' ); cout << values[i] << 'n'; } } Лекция 02. 13 г. 19

Примеры //Ex 101. cpp #include <iostream> #include <iomanip> using namespace std; int main( ) Примеры //Ex 101. cpp #include #include using namespace std; int main( ) { double values[] = { 1. 23, 35. 36, 653. 7, 4358. 24 }; char *names[] = { "Zoot", "Jimmy", "Al", "Stan" }; for( int i = 0, n = sizeof names / sizeof names[0]; i < n; i++ ) cout << setiosflags( ios: : left ) << setw( 6 ) << names[i] << resetiosflags( ios: : left ) << setw( 10 ) << values[i] << endl; } Лекция 02. 13 г. 20

Примеры //Ex 102. cpp #include <iostream> #include <iomanip> using namespace std; int main( ) Примеры //Ex 102. cpp #include #include using namespace std; int main( ) { double values[] = { 1. 23, 35. 36, 653. 7, 4358. 24 }; char *names[] = { "Zoot", "Jimmy", "Al", "Stan" }; cout << setiosflags( ios: : fixed ); //cout << setiosflags( ios: : scientific ); for( int i = 0, n = sizeof names / sizeof names[0]; i < n; i++ ) cout << setiosflags( ios: : left ) << setw( 6 ) << names[i] << resetiosflags( ios: : left ) << setw( 10 ) << setprecision( 1 ) << values[i] << endl; } Лекция 02. 13 г. 21

Строковые потоки Специальным случаем потоков являются строковые потоки, определенные в заголовочных файлах sstream и Строковые потоки Специальным случаем потоков являются строковые потоки, определенные в заголовочных файлах sstream и strstream. Все операции для этих потоков происходят в памяти. Фактически такие потоки формируют форматированную строку символов, заканчивающуюся нулевым байтом. Строковые потоки применяются для облегчения форматирования данных в памяти. Лекция 02. 13 г. 22

Пример //Ex 110. cpp #include <iostream> #include <sstream> #include <bitset> using namespace std; int Пример //Ex 110. cpp #include #include #include using namespace std; int main() { ostringstream os; // Десятичное и шестнадцатеричное значение os << "dec: " << 15 << hex << " hex: " << 15 << endl; cout << os. str() << endl; // Присоединение вещественного числа и битового поля bitset<15> b(1023); os << "float: " << 4. 67 << " bitset: " << b << endl; // Перезапись восьмеричным числом os. seekp(0); os << "oct: " << oct << 15; cout << os. str() << endl; } Сначала в os выводятся два числа – десятичное и шестнадцатеричное. Затем к ним присоединяется вещественное число и битовое поле (в двоичном виде). Функция seekp(0) перемещает позицию записи в начало потока данных, поэтому при следующем вызове оператора << данные записываются в начало строки с перезаписью существующего строкового потока данных. При этом символы, которые не были перезаписаны, остаются действительными. Лекция 02. 13 г. 23

Пример //Ex 111. cpp #include <iostream> #include <strstream> using namespace std; int main() { Пример //Ex 111. cpp #include #include using namespace std; int main() { double x = 13. 57; ostrstream buffer; // Динамический поток char* // Заполнение потока char* buffer << "float x: " << x << ends; cout << buffer. str() << endl; // Снятие фиксации с потока char* buffer. freeze(false); // Установка позиции записи в начало buffer. seekp (0, ios: : beg); // Повторное заполнение потока char* buffer << "once more float x: " << x << ends; cout << buffer. str() << endl; // Возвращение памяти в буфер buffer. freeze(false); } Лекция 02. 13 г. 24

Ввод-вывод файлов может выполняться как с помощью низкоуровневых, безо всякого контроля типов, стандартных функций Ввод-вывод файлов может выполняться как с помощью низкоуровневых, безо всякого контроля типов, стандартных функций библиотеки С, так и с помощью потоков ввода-вывода. Файл рассматривается как последовательность байтов. Чтение или запись выполняются последовательно. При операциях чтения-записи говорят, что существует текущая позиция, начиная с которой будет производиться следующая операция. Большинство файлов обладают возможностью прямого доступа. Это означает, что можно производить операции ввода-вывода не последовательно, а в произвольном порядке. В библиотеке fstream для ввода-вывода файлов определены классы ofstream (вывод) и ifstream (ввод). Сами операции ввода-вывода выполняются так же, как и для других потоков: >> "ввести" и << "вывести". Различия заключаются в том, как создаются объекты и как они привязываются к нужным файлам. Лекция 02. 13 г. 25

Примеры //Ex 103. cpp #include <fstream> using namespace std; int iarray[2] = { 99, Примеры //Ex 103. cpp #include using namespace std; int iarray[2] = { 99, 10 }; int main( ) { ofstream os( "test. dat" ); // текстовый вывод ofstream ofs ( "test 1. dat", ios_base: : binary ); // двоичный вывод os. write( (char*)iarray, sizeof(iarray) ); ofs. write( (char*)iarray, sizeof(iarray) ); } 00 00 00 0 A 0 D 00 00 00 63 10 99 00 00 00 0 A 00 00 00 63 10 Лекция 02. 13 г. 99 26

//Ex 105. cpp #include <fstream> #include <iostream> using namespace std; /* Для всех файлов, //Ex 105. cpp #include #include using namespace std; /* Для всех файлов, имена которых переданы в аргументах командной строки, - открыть, вывести содержимое и закрыть файл */ int main (int argc, char* argv[]) { ifstream file; // Перебор аргументов командной строки for (int i=1; i