Скачать презентацию Тесты по программированию http www quizful net test Скачать презентацию Тесты по программированию http www quizful net test

Лекция-20.ppt

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

Тесты по программированию (http: //www. quizful. net/test ) Лекция 02. 13 г. 1 Тесты по программированию (http: //www. quizful. net/test ) Лекция 02. 13 г. 1

Тесты по программированию (http: //www. quizful. net/test ) Лекция 02. 13 г. 2 Тесты по программированию (http: //www. quizful. net/test ) Лекция 02. 13 г. 2

Язык программирования С++ Лекция 02. 13 г. 3 Язык программирования С++ Лекция 02. 13 г. 3

Рейтинг языков программирования (www. tiobe. com) Лекция 02. 13 г. 4 Рейтинг языков программирования (www. tiobe. com) Лекция 02. 13 г. 4

Общие сведения о языке С++ Автор языка С++ - Бьярн Страуструп (Bjarne Stroustrup, 1950, Общие сведения о языке С++ Автор языка С++ - Бьярн Страуструп (Bjarne Stroustrup, 1950, Aarhus, Denmark) - спроектировал и первым реализовал язык программирования C++ [19801983] - один из идеологов объектноориентированной парадигмы программирования Лекция 02. 13 г. 5

Основные книги Б. Страуструпа Лекция 02. 13 г. 6 Основные книги Б. Страуструпа Лекция 02. 13 г. 6

История создания языка С++ 1979 г. , май – начало работы над C with История создания языка С++ 1979 г. , май – начало работы над C with Classes. Б. Страуструп: «Я придумал C++, записал его первоначальное определение и выполнил первую реализацию. Я выбрал и сформулировал критерии проектирования C++, разработал его основные возможности и отвечал за судьбу предложений по расширению языка в комитете по стандартизации C++. Язык C++ многим обязан языку C, и язык C остается подмножеством языка C++ (но в C++ устранены несколько серьезных брешей системы типов C). Я также сохранил средства C, которые являются достаточно низкоуровневыми, чтобы справляться с самыми критическими системными задачами. Язык C, в свою очередь многим обязан своему предшественнику, BCPL; кстати, стиль комментариев // был взят в C++ из BCPL. Другим основным источником вдохновения был язык Simula 67. Концепция классов (с производными классами и виртуальными функциями) была позаимствована из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Algol 68» 1994 г. , август – в комитете ANSI/ISO зарегистрирован предварительный стандарт Лекция 02. 13 г. 7

Место языка С++ в генеалогическом дереве языков программирования Лекция 02. 13 г. 8 Место языка С++ в генеалогическом дереве языков программирования Лекция 02. 13 г. 8

Утвержден новый стандарт языка C++ Международная организация по стандартам ISO утвердила очередную версию стандарта Утвержден новый стандарт языка C++ Международная организация по стандартам ISO утвердила очередную версию стандарта языка программирования C++. Стандарт C++11 является первым крупным нововведением со времени принятого в 1998 году стандарта C++98. В C++11 включены лямбда-функции, чрезвычайно важные для реализации параллельных алгоритмов и радикально меняющие принципы использования стандартной библиотеки шаблонов STL. Средства реализации семантики переноса позволят увеличить производительность программ, а в стандартной библиотеке появились новые возможности работы с потоками. Язык C++ применяется практически повсеместно – все компиляторы и стандартные библиотеки для других языков, все основные операционные системы и веббраузеры написаны с использованием C++. Лекция 02. 13 г. 9

Назначение и общая характеристика языка С++ является одним из широко распространенных языков программирования, он Назначение и общая характеристика языка С++ является одним из широко распространенных языков программирования, он поддерживает основные концепции и методы, используемые в реальных компьютерных программах. Как и язык С, он используется для решения сложных задач в таких областях, как ядра операционных систем, драйверы устройств, встроенные системы, компиляторы, системы связи. Языки С и С++, вместе взятые, образуют крупнейшее в мире сообщество по разработке программного обеспечения. Языки C++ от С отличает разная степень внимания к типам и структурам данных. Это связанно с появлением понятий класса, наследования и виртуальных функций. Это дает в C++ более эффективные возможности для контроля типов и обеспечивает модульность программы. Главной целью создателя языка Б. Страуструпа было оснащение языка C++ конструкциями, позволяющими увеличить производительность труда программистов и облегчить процесс разработки и создания больших программных продуктов. Абстракция, реализация, наследование и полиморфизм являются необходимыми свойствами, которыми обладает язык C++, благодаря чему он не только универсален, как и язык С, но и является объектным Лекция 02. 13 г. языком. 10

Соотношение между языками С и С++ Язык C++ является производным от языка С. Программы Соотношение между языками С и С++ Язык C++ является производным от языка С. Программы на С рассматриваются как подмножество программ на C++. Язык С++ Расширение С Поддержка ООП Общие свойства Язык С Специфические свойства С Лекция 02. 13 г. 11

Язык С++ как расширение языка С q Стандартные потоки ввода cin и вывода cout, Язык С++ как расширение языка С q Стандартные потоки ввода cin и вывода cout, операции потокового ввода и вывода. q Ссылки. q Новые способы объявления переменных (объявление в произвольном месте блока и объявление внутри оператора). q Константы и свойство константности. q Логический тип bool и логические значения true и false. q Перечисления, структуры и объединения как полноценные типы. q Операторы new и delete. Концепция создания и разрушения (удаления) объектов программы. Встроенные (подставляемые) функции. q Использование аргументов по умолчанию в функциях. Перегрузка (совмещение имен) функций. Лекция 02. 13 г. 12

Стандартные потоки ввода cin и вывода cout, операции потокового ввода и вывода В языке Стандартные потоки ввода cin и вывода cout, операции потокового ввода и вывода В языке C++ и его предшественнике, языке программирования C, нет встроенной поддержки ввода-вывода, вместо этого используется библиотека функций. Для языка С это была библиотека stdio. h, которая содержала такие функции, как printf и scanf. Пользоваться этими функциями не очень удобно. В языке С++ для поддержки ввода-вывода используется iostream — заголовочный файл с классами, функциями и переменными. Он включён в стандартную библиотеку C++. Название образовано от Input/Output Stream ( «поток вводавывода» ). iostream использует объекты cin, cout, cerr и clog для передачи информации в и из стандартных потоков ввода, вывода и ошибок. Являясь частью стандартной библиотеки C++, эти объекты также являются частью стандартного пространства имён — std. Лекция 02. 13 г. 13

Использование стандартных потоков cin и cout Для того чтобы использовать стандартные потоки для ввода Использование стандартных потоков cin и cout Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл . Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её. #include using namespace std; cin >> x; // Ввод значения в переменную x из стандартного потока cin cout << x; // Вывод значения переменной x в стандартный поток cout cin >> x >> y; // Ввод двух переменных cout << "x = " << x << "ny = " << y << endl; // Функция endl осуществляет перевод строки Для управления форматом вводимого/выводимого значения используются так называемые манипуляторы. Это функции, которые вставляются между вводимыми/выводимыми значениями и изменяют состояние потока. Для использования манипуляторов необходимо включить заголовочный файл . Лекция 02. 13 г. 14

Пример использования операций ввода и вывода /* Алгоритм Евклида */ #include <stdlib. h> #include Пример использования операций ввода и вывода /* Алгоритм Евклида */ #include #include using namespace std; int main() { int m, n, r; cout << "Input m: "; cin >> m; cout << "Input n: "; cin >> n; /* Е 0. [Гарантировать, что m>n. ] Если m n */ if (m

Ссылки В языке С существует проблема передачи параметров в функцию по имени (а не Ссылки В языке С существует проблема передачи параметров в функцию по имени (а не по значению!). То же самое в С++ можно сделать с использованием ссылок //Ex 035. с – swap с указателями #include #include void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } int main() { int x = 5, y = 7; printf("x = %d, y = %dn", x, y); swap(&x, &y); printf("x = %d, y = %dn", x, y); system("PAUSE"); return 0; } //Ex 002. сpp – swap со ссылками #include #include void swap(int &a, int &b) { int c = a; a = b; b = c; } using namespace std; int main() { int x, y; cout << "Input a and b: "; cin >> x >> y; cout << "x = " << x << " y = " << y << endl; swap(x, y); cout << "x = " << x << " y = " << y << endl; system("PAUSE"); return 0; } Лекция 02. 13 г. 16

Ссылки во многом похожи на указатели; фактически ссылка – это константный указатель. Следовательно, ссылка Ссылки во многом похожи на указатели; фактически ссылка – это константный указатель. Следовательно, ссылка должна обязательно инициализироваться и ее нельзя изменить. В отличие от указателей к ссылкам не применяется операция разыменования (*) и при инициализации ссылки используется не адрес переменной (&x), а сама переменная. Можно считать, что ссылка – это альтернативное (т. е. второе) имя существующей переменной. int a = 5; int *p = &a; // указатель p int &b = a; // ссылка b *p = 7; // разыменование, a=7 b = 3; // прямое обращение к a; a=3 Основное назначение ссылок – использование их в качестве параметров (аргументов) функций. В результате этого реализуется механизм передачи параметров «по имени» , а не «по значению» . Лекция 02. 13 г. 17

Новые способы объявления переменных q объявление в произвольном месте блока q объявление внутри оператора Новые способы объявления переменных q объявление в произвольном месте блока q объявление внутри оператора //Ex 003. сpp #include #include int sum(int m[], int n) { int s = 0; for(int i=0; i

Константы и свойство константности Свойство константности задаётся описателем const и символизирует запрет на выполнение Константы и свойство константности Свойство константности задаётся описателем const и символизирует запрет на выполнение операций записи в память. Это свойство можно задать для самых разных сущностей программы: - простых переменных, - экземпляров классов и структур (т. е. объектов), - параметров функций, - возвращаемых из функций значений, - наконец, для самих функций-членов классов. Контроль за корректным использованием свойства const выполняет компилятор, поэтому ошибки обнаруживаются на ранних стадиях создания программы, что повышает ее надежность. const int a = 5; const int b; // err! нет инициализации const My. Class *mc; const int fun(const int &x) {. . . } void A: : f(void) const {. . . } Лекция 02. 13 г. 19

Использование const со ссылками По определению, ссылки эквивалентны константным указателям, поэтому описатель const имеет Использование const со ссылками По определению, ссылки эквивалентны константным указателям, поэтому описатель const имеет только один вариант применения со ссылками. int a = 5, b = 7; int &s 1 = a; s 1 = 3; // ok! a=3 (изменили область памяти) s 1 = b; // ? ? a=7 (ссылку изменить нельзя!) const int &s 1 = a; s 1 = 9; // err! (запрет на присваивание через s 1) a = 9; // ok! (a по-прежнему неконстантна!) Описатель const часто используется с параметрами функций – ссылками: void fun(const int &x) {…} Лекция 02. 13 г. 20

Логический тип bool и логические значения true и false В языке C «ложь» и Логический тип bool и логические значения true и false В языке C «ложь» и «истина» были просто нулём и не-нулём. В C++ введен тип bool, который может иметь два значения: «false» (ложь) и «true» (истина). Это ничего нового не даёт, но делает программы понятнее. Можно считать, что bool введен в язык так: enum bool {false, true}; #include #include int main(void) { int a = 5; bool b = false, c = a < 10; cout << b << " " << c << endl; // 0 1 system("PAUSE"); return 0; } Лекция 02. 13 г. 21

Перечисления, структуры и объединения как полноценные типы Ключевые слова enum, struct и union теперь Перечисления, структуры и объединения как полноценные типы Ключевые слова enum, struct и union теперь создают новые полноценные типы. Если в языке C после описания объединения enum color {red, green, blue}; нужно было всегда называть тип «enum color» , то в C++ его название - просто «color» : enum color с = green; // в языке С++ Это же относится и к типам, определяемым ключевыми словами struct и union. #include #include int main(void) { struct Point { int x, y; }; Point p[] = {{0, 1}, {1, 2}, {2, 3}}; for(int i=0; i

Операторы new и delete q Концепция создания и разрушения (удаления) объектов программы. q Различия Операторы new и delete q Концепция создания и разрушения (удаления) объектов программы. q Различия между оператором new и функцией malloc. q Динамические массивы и операторы new[] и delete[]. Проблема выделения памяти программе в ходе её выполнения существует во всех языках. В языке С для этих целей существуют библиотечные функции: calloc(), malloc() – для выделения непрерывного участка памяти, free() – для освобождения ранее выделенного участка. #include #include int main(void){ int *p; p = (int*)malloc(15*sizeof(int)); p[10] = 6; cout << p[10] << endl; free(p); system("PAUSE"); return 0; } Лекция 02. 13 г. 23

Операторы new и delete Идеология языка C++ предполагает, что каждый объект создаётся (объявляется) именно Операторы new и delete Идеология языка C++ предполагает, что каждый объект создаётся (объявляется) именно в том месте, где он нужен, и является работоспособным сразу после создания. Для этого каждый класс имеет набор конструкторов - функций, которые автоматически запускаются при создании объекта (экземпляра данного класса) и инициализируют его члены (data members). Однако функция malloc() «не умеет» автоматически запускать конструкторы, и потому непригодна для динамического создания объектов. В языке C++ для этих целей используется оператор new. Рассмотрим пример: My. Class *mc = new My. Class; Здесь создаётся экземпляр класса My. Class с помощью конструктора «по умолчанию» и адрес этого экземпляра присваивается указателю mc. Оператор new можно использовать и для простых скалярных переменных. Лекция 02. 13 г. 24

Операторы new и delete Важное отличие оператора new от функции malloc() заключается в том, Операторы new и delete Важное отличие оператора new от функции malloc() заключается в том, что он возвращает типизированный указатель (то есть My. Class*), в то время как функция malloc() - "указатель-на-что-угодно" (void*). Для каждого класса, помимо конструкторов, определён ещё и деструктор функция, отвечающая за корректное уничтожение объекта. Проблема с деструктором возникает та же, что и с конструктором: функция free() не умеет его вызывать. Поэтому в C++ введён ещё один оператор - delete. Синтаксис его очень прост: delete mc; где mc - указатель на экземпляр класса. Именно для этого экземпляра и будет вызван деструктор. Лекция 02. 13 г. 25

Динамические массивы и операторы new[] и delete[] Язык С++ позволяет выделять память сразу для Динамические массивы и операторы new[] и delete[] Язык С++ позволяет выделять память сразу для нескольких экземпляров класса: #include #include int main(void) { struct Point { int x, y; }; Point *p = new Point[3]; p[0]. x = 1; p[0]. y = 2; p[1]. x = 3; p[1]. y = 4; p[2]. x = 5; p[2]. y = 6; for(int i=0; i<3; i++) cout << p[i]. x << " " << p[i]. y << endl; delete[] p; system("PAUSE"); return 0; } Лекция 02. 13 г. 26

Встроенные (подставляемые) функции #include <stdio. h> #include <stdlib. h> inline void swap(int *a, int Встроенные (подставляемые) функции #include #include inline void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } int main() { int x = 5, y = 7; cout << "x = “ << x << “y = “ << y << “n”; swap(&x, &y); cout << "x = “ << x << “y = “ << y << “n”; system("PAUSE"); return 0; } Лекция 02. 13 г. 27

Использование аргументов по умолчанию в функциях Формальному параметру функции может быть задан аргумент по Использование аргументов по умолчанию в функциях Формальному параметру функции может быть задан аргумент по умолчанию (default argument). Обычно это константа, которая часто встречается при вызове функции. Использование аргумента по умолчанию позволяет не задавать его значение при каждом вызове. int sqr_or_power(int n, int k = 2) { //k = 2 по умолчанию if (k == 2) return (n * n) ; else return pow(n, k) ; } Здесь предполагается, что чаще всего эта функция применяется для вычисления значения квадрата целого числа n. Вызовы этой функции могут выглядеть следующим образом: sqr_or_power(i + 5); //вычислит (i + 5) * (i + 5) sqr_or_power(i + 5, 3); //вычислит (i + 5) в кубе Лекция 02. 13 г. 28

Использование аргументов по умолчанию в функциях Только несколько последних параметров функции могут иметь значения Использование аргументов по умолчанию в функциях Только несколько последних параметров функции могут иметь значения по умолчанию, т. е. аргументами по умолчанию могут быть аргументы, начиная с правого конца списка параметров функции и далее последовательно слева направо без перерывов. Значения по умолчанию можно указать и для всех аргументов функции. Использование аргументов по умолчанию, как и многих других возможностей «по умолчанию» , позволяет уменьшить труд программистов по созданию текста программы. void void foot foot (int (int i, int j = 7) ; //допустимо i, int j = 2, int k) ; //недопустимо i, int j = 3, int k = 7) ; //допустимо i = 1, int j = 2, int k = 3); //допустимо i = -3, int j); //недопустимо Лекция 02. 13 г. 29

Перегрузка (совмещение имен) функций В языке С может быть только одна функция с одним Перегрузка (совмещение имен) функций В языке С может быть только одна функция с одним именем. Пример: семейство функций, которые выводят на экран некоторое значение (число или строку). int main () { void print_int (int v); print_int (10); void print_float (float v); print_float (5. 5); void print_sz (const char *v); print_sz ("Привет!n"); } В языке С++ можно «поручить» компилятору задачу по выбору нужного варианта функции. Для этого нужно определить набор функций, каждая из которых имеет имя print, но эти функции различаются количеством или типами аргументов. Предыдущий пример тогда будет выглядеть следующим образом: void print (int v); void print (float v); void print (const char *v); int main () { print (10); print (5. 5); print ("Привет!n"); } Лекция 02. 13 г. 30

Перегрузка (совмещение имен) функций Таким образом, перегрузкой называется ситуация, когда в одном контексте (в Перегрузка (совмещение имен) функций Таким образом, перегрузкой называется ситуация, когда в одном контексте (в одной области имен) находятся несколько функций с одинаковыми именами, но различными сигнатурами. Перегрузка реализует один из видов функционального полиморфизма – статический полиморфизм, при котором реализация функции выбирается в зависимости от фактических типов параметров функции. Такой выбор происходит на этапе компиляции программы (реализуется так называемое «раннее связывание» ). Ещё бывает динамический полиморфизм, при котором реализация функции-члена класса выбирается в зависимости от фактического типа указателя на объект, через который она вызывается. Такой выбор происходит на этапе выполнения программы (т. н. «позднее связывание» ). Этот вид полиморфизма реализуется виртуальными функциями. Лекция 02. 13 г. 31

Понятие о сигнатуре функции Сигнатура функции — часть общего объявления функции, позволяющая транслятору идентифицировать Понятие о сигнатуре функции Сигнатура функции — часть общего объявления функции, позволяющая транслятору идентифицировать функцию среди других. В различных языках программирования существуют разные представления о сигнатуре функции, что также тесно связано с возможностями перегрузки функции в этих языках. В языке С++ простая функция однозначно опознаётся компилятором по её имени и последовательности типов её аргументов, что составляет сигнатуру функции в этом языке. Если функция является методом некоторого класса, то в сигнатуре будет участвовать и имя класса. Например, сигнатурой функции: std: : size_t num. Digits(int number); будет: std: : size_t(int) Иными словами, это «функция, принимающая int и возвращающая std: : size_t» . Лекция 02. 13 г. 32

Ограничения на перегрузку функций 1) Функции должны отличаться количеством или типом аргументов, т. е. Ограничения на перегрузку функций 1) Функции должны отличаться количеством или типом аргументов, т. е. должны иметь различные сигнатуры. 2) На перегрузку не влияет тип возвращаемого значения. 3) Использование параметров по умолчанию может войти в конфликт с перегрузкой. #include #include void f(int a) { cout<<"1"< #include void f(int a) { cout<<"1"<

Пространства имён Термин «пространство имён» (namespace) – один из основных в языках программирования. Он Пространства имён Термин «пространство имён» (namespace) – один из основных в языках программирования. Он связан с возможностью различения сущностей программы с одинаковыми именами. int x; // первая x void foo (char x) { // вторая x x = 12; // здесь x - это вторая x } void bar () { x = 12; // здесь x - это первая x } int main () { double x; // третья x x = 12; // здесь x -- это третья x } В этом фрагменте программы 4 пространства имён и 3 различных переменных, имеющих одинаковые имена «х» . Лекция 02. 13 г. 34

Пространства имён Каждый блок также имеет своё пространство имён. Например: int main(){ int x Пространства имён Каждый блок также имеет своё пространство имён. Например: int main(){ int x = 1, y = 321; { int x; x = 2; { int x; x = 3; y = 123; } cout << x; // 2 } cout << x; // 1 cout << y; // 123 } Здесь в одной функции объявлено три разных переменных «х» . Когда внутри блока определяется очередной «x» , он скрывает (маскирует) все предыдущие переменные с таким же именем. Но как только блок заканчивается, его локальный «х» исчезает, и вновь становится доступным «х» из родительского (объемлющего) блока. Лекция 02. 13 г. 35

Пространства имён структур Каждая структура также имеет своё пространство имён. Для доступа к таким Пространства имён структур Каждая структура также имеет своё пространство имён. Для доступа к таким именам используется операция разрешения контекста (разрешения области видимости) – двойное двоеточие. #include #include struct Foo { typedef unsigned int uint; enum color {white, black}; uint data [16]; }; int main(void) { Foo: : uint x; x = 17; Foo: : color y = Foo: : black; cout << x << " " << y << endl; // 17 1 system("PAUSE"); return 0; } Лекция 02. 13 г. 36

Пространства имён структур могут быть вложенными: #include <stdlib. h> #include <iostream. h> struct A Пространства имён структур могут быть вложенными: #include #include struct A { struct B { struct C { int x, y; }; }; }; int main(void) { A: : B: : C a; a. x = 17; a. y = 23; cout << a. x << " " << a. y << endl; // 17 23 system("PAUSE"); return 0; } Лекция 02. 13 г. 37

Определяемые пользователем пространства имён В предыдущих примерах пространства имён были «бесплатным приложением» к чему-то Определяемые пользователем пространства имён В предыдущих примерах пространства имён были «бесплатным приложением» к чему-то другому — к блоку, к функции, к структуре. . . Однако в С++ есть конструкция, которая позволяет создавать пространство имён «в чистом виде» : namespace N { typedef unsigned int uint; } int main(void) { N: : uint data [16]; … } Лекция 02. 13 г. 38

Определяемые пользователем пространства имён Пространство имён можно дополнять новыми именами любое количество раз, в Определяемые пользователем пространства имён Пространство имён можно дополнять новыми именами любое количество раз, в разных частях программы, в т. ч. и в разных файлах: namespace NS { struct A { int x, y; }; } namespace NS { typedef long int lint; } int main(void) { NS: : A a; a. x = 17; a. y = 23; NS: : lint z = 3456; . . . return 0; } Лекция 02. 13 г. 39

Определяемые пользователем пространства имён Пространства имён могут быть вложенными: namespace NS 1 { namespace Определяемые пользователем пространства имён Пространства имён могут быть вложенными: namespace NS 1 { namespace NS 2 { namespace NS 3 { struct A { int x, y; }; } } } int main(void) { NS 1: : NS 2: : NS 3: : A a; . . . return 0; } Лекция 02. 13 г. 40

Ключевые слова using namespace и using С помощью ключевого слова using namespace можно «разрешить» Ключевые слова using namespace и using С помощью ключевого слова using namespace можно «разрешить» обращаться ко всем именам из указанного пространства имён «напрямую» , без операции разрешения контекста: namespace NS { struct A { int x, y; }; } namespace NS { typedef long int lint; } int main(void) { using namespace NS; A a; a. x = 17; a. y = 23; lint z = 3456; . . . return 0; } Лекция 02. 13 г. 41

Ключевые слова using namespace и using Ключевое слово using «даёт разрешение» обращаться к конкретному Ключевые слова using namespace и using Ключевое слово using «даёт разрешение» обращаться к конкретному имени из указанного пространства имён «напрямую» , без операции разрешения контекста: namespace NS { struct A { int x, y; }; } namespace NS { typedef long int lint; } int main(void) { using NS: : lint; NS: : A a; a. x = 17; a. y = 23; lint z = 3456; . . . return 0; } Лекция 02. 13 г. 42