Основы программирования на
C++
Максименкова Ольга Вениаминовна
Старший преподаватель Департамента программной инженерии
Факультета компьютерных наук
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 1
Ответы на уже заданные вопросы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 2
• Как же программа работает со всеми этими ошибками?
(http://habrahabr.ru/company/pvs-studio/blog/261279/)
• О библиотеках C++
• A list of open source C++ libraries (http://ru.cppreference.com/w/cpp/links/libs)
• Category:C++ libraries
(https://en.wikipedia.org/wiki/Category:C%2B%2B_libraries)
• News, Status & Discussion about Standard C++
(https://isocpp.org)
Цели лекции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 3
Рассмотреть
• Основные типы данных
• Базовые конструкции языка
• Производные типы данных
• Функции и их параметры
Выявить
• Способы повышения быстродействия кода
• Особенности языка C++
Соглашения о терминологии
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 4
Идентификатор – последовательность из букв латинского алфавита, десятичных
цифр и символов подчёркивания, начинающаяся не с цифры.
Ключевые (служебные) слова – это идентификаторы, зарезервированные в
языке для специального использования.
Выражение – это последовательность операндов, разделителей и знаков операций,
задающая вычисления, то есть это правила для получения значения
Знаки операций обеспечивают формирование и последующее вычисление
выражений.
Директива (команда) препроцессора
Определение [declaration]
Описание [specification]
Подбельский В.В. Язык Си++. - М.: Финансы и статистика, 2003. – 560 с.
Учебные материалы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 5
1. Ахметсафина Р.З. Построение и анализ алгоритмов (ДПИ, ФКН, НИУ ВШЭ, 2 курс
бакалавриата) (http://www.hse.ru/edu/courses/126217828.html)
2. Eunsuk Kang, and Jean Yang. 6.088 Introduction to C Memory Management and C++
Object-Oriented Programming, January IAP 2010. (Massachusetts Institute of
Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 21 Jun, 2015).
License: Creative Commons BY-NC-SA
3. Jesse Dunietz, Geza Kovacs, and John Marrero. 6.096 Introduction to C++, January IAP
2011. (Massachusetts Institute of Technology: MIT
OpenCourseWare),http://ocw.mit.edu (Accessed 21 Jun, 2015). License: Creative
Commons BY-NC-SA
4. Tom Lieber, Kyle Murray, and Frank Li. 6.S096 Introduction to C and C++, January IAP
2013. (Massachusetts Institute of Technology: MIT
OpenCourseWare),http://ocw.mit.edu (Accessed 21 Jun, 2015). License: Creative
Commons BY-NC-SA
5. Andre Kessler. 6.S096 Effective Programming in C and C++, January IAP 2014.
(Massachusetts Institute of Technology: MIT
OpenCourseWare), http://ocw.mit.edu(Accessed 21 Jun, 2015). License: Creative
Commons BY-NC-SA
Первая программа на C++
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 6
// Task_01.cpp : Defines the entry point for the console
application.
//
#include "iostream"
int main()
{
std::cout << "Hello, World!";
return 0;
}
• Ключевые слова
• Идентификаторы
• Литералы
• Операции
• Разделители
• Пробельные символы
Типы данных и
переменные
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 7
Основные типы данных
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 8
Тип Размер (байты)
char 1
unsigned char 1
int 4
unsigned int 4
bool 1
double 8
Переменные
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 9
C++ tutorial. Variables and types (http://www.cplusplus.com/doc/tutorial/variables/)
• Декларация (описание) [declaration]
• Инициализация [initialization]
#include "iostream"
using namespace std;
int main()
{
int x; // декларация
x = 5 * 12; // инициализация
cout << "x: " << x;
return 0;
}
int x = 5 * 12; // декларация c инициализацией
Ввод значения переменной
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 10
#include "iostream"
using namespace std;
int main()
{
int x; // декларация
cout << "Enter integer value:n";
cin >> x; // получения значения переменной
cout << "nnx: " << x;
return 0;
}
Условия
Логические и условные операции
Условный оператор
Переключатель
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 11
Условные операции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 12
Операция Название
> Больше
>= Больше или равно
< Меньше
<= Меньше или равно
== Равно
!= Не равно
Логические операции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 13
Операция Название
&& И
|| ИЛИ
! НЕ
^ Исключающее ИЛИ (XOR)
Побитовые логические операции в рамках знакомства с C++ мы рассматривать не
будем, но они есть…
Операторы в C и C++ (https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B)
Tutorial. Operators (http://www.cplusplus.com/doc/tutorial/operators/)
Tutorial. Operators in C++ (http://www.tutorialspoint.com/cplusplus/cpp_operators.htm)
Тернарный оператор
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 14
<операнд_1>?<операнд_2>:<операнд_3>
true
false
Условный оператор
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 15
if (условие)
ThenStat_1
if (условие)
{
ThenStat_1
ThenStat_2
...
}
if (условие)
{
ThenStat_1
ThenStat_2
...
}
else
{
ElseStat_1
ElseStat_2
...
}
if (условие)
ThenStat_1
else
ElseStat_2
Краткая форма
Tutorial. C++ decision making statements (http://www.tutorialspoint.com/cplusplus/cpp_decision_making.htm)
Tutorial Statements and flow control (http://www.cplusplus.com/doc/tutorial/control/)
Пример использования условия
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 16
#include "iostream"
using namespace std;
int main()
{
double x;
cout << "Enter x: ";
cin >> x;
if (x > 0)
cout << "nAbsolute value is: " << x;
else
cout << "nAbsolute value is: " << -x;
return 0;
}
Получение значения модуля вещественного числа. Используем
математическое определение
Переключатель
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 17
switch (выражение)
{
case constant1:
statement_A1
statement_A2
...
break;
case constant2:
statement_B1
statement_B2
...
break;
...
default:
statement_Z1
statement_Z2
...
}
Пример использования переключателя
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 18
int x;
cout << "Enter your mark: ";
cin >> x;
switch (x) {
case 1:
case 2:
case 3: cout << "Your mark is 2"; break;
case 4:
case 5: cout << "Your mark is 3"; break;
case 6:
case 7: cout << "Your mark is 4" ;break;
case 8:
case 9:
case 10: cout << "Your mark is 5"; break;
}
Получение четырёх балльного эквивалента для десятибалльной оценки
На практических занятиях мы дополним код этой программы, чтобы при вводе
чисел меньше единицы и больше 10 выводилось сообщение.
Циклы
Цикл с постусловием
Цикл с предусловием
Цикл с параметром
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 19
while
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 20
while (условие)
{
statement1
statement2
...
}
#include "iostream"
using namespace std;
const int N = 10;
int main()
{
int i = 0;
while (i < N)
cout << ++i << " ";
return 0;
}
Если команда в теле цикла
одна, операторные скобки
также могут быть опущены.
Вывод первых десяти чисел
натурального ряда
Tutorial. Constants (http://www.cplusplus.com/doc/tutorial/constants/)
do-while
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 21
do
{
statement1
statement2
...
} while (условие); Вывод количества чисел делящихся на 10 и не
делящихся на 10 из диапазона [1;99]
#include "iostream"
#define N 100
using namespace std;
int main()
{
int i = 1, decs=0, other=0;
do (i++ % 10 == 0) ? decs++ : other++;
while (i < N);
cout << decs << " " << other;
}
for
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 22
for(инициализации; условие; список выражений)
{
statement1
statement2
...
}
for (int i = 0; i < 5; cout << i++);
int i = 0;
for (; i < 5; cout << i++);
int i = 0;
for (; i < 5; i++)
cout << i;
Функции
Повторное использование кода
Перегрузка функций
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 23
Студенты могут не знать, что
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 24
Алгоритмическая декомпозиция [algorithmic decomposition] - процесс
разделения системы на части, каждая из которых отражает этап общего
процесса
Структурное проектирование по методу сверху вниз
основной базовой единицей является подпрограмма, и программа в
целом принимает форму дерева, в котором одни подпрограммы в
процессе работы вызывают другие подпрограммы
Процедурная инкапсуляция используется в процедурной парадигме в
виде подпрограмм, которые скрывают детали реализации части алгоритма.
SADT (Structured Analysis and Design Technique)
методология структурного анализа и проектирования, интегрирующая
процесс моделирования, управление конфигурацией проекта,
использование дополнительных языковых средств и руководство
проектом со своим графическим языком
Описание функций
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 25
#include <iostream>
using namespace std;
int main() {
int x;
cout << "Enter integer value: ";
cin >> x;
cout << sqrt(x);
return 0;
}
Описание
функции main()
Возвращение
значения
Вызов функции
Тип возвращаемого
значения
Tutorial. Functions (http://www.cplusplus.com/doc/tutorial/functions/)
Tutorial. Функции в C++ — урок 6 (https://code-live.ru/post/cpp-functions/#more)
Оформление кода в виде функции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 26
#include <iostream>
using namespace std;
int getValue(); // определение функции
int main() {
int x = getValue(); // вызов функции
cout << sqrt(x);
return 0;
}
int getValue() { // описание функции
int x;
cout << "Enter integer value: ";
cin >> x;
return x;
}
Прототип
В С++ при помощи ключевого слова inline можно описывать инлайн-функции.
Небольшие инлайн-функции позволяют сделать программу быстрее. Но не все
компиляторы об этом знают 
Inline functions(http://www.learncpp.com/cpp-tutorial/75-inline-functions/)
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 27
#include <iostream>
using namespace std;
double getValue();
double geom(double x, double y) {
return sqrt(x*y);
}
int main() {
double x = getValue();
double y = getValue();
cout << geom(x,y);
return 0;
}
double getValue() {
int x;
cout << "Enter integer value: ";
cin >> x;
return x;
}
параметры
Как сделать так, чтобы в getValue()
передавать имя переменной и сохранять в
неё значение?
аргументы
Вариант?
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 28
#include <iostream>
using namespace std;
double getValue();
double geom(double x, double y) {
return sqrt(x*y);
}
int main() {
double x; getValue(x);
double y; getValue(y);
cout << geom(x,y);
return 0;
}
void getValue(double x) {
cout << "Enter double value: ";
cin >> x;
}
Функция не
возвращает
значения
К сожалению, не вариант.
Код не будет компилироваться…
Почему?
Используем ссылку
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 29
#include <iostream>
using namespace std;
void getValue(double&); // изменяем объявление
double geom(double x, double y) {
return sqrt(x*y);
}
int main() {
double x; getValue(x); // параметр передаётся по ссылке
double y; getValue(y); // и здесь
cout << geom(x,y);
return 0;
}
void getValue(double& x) { // параметр - ссылка
cout << "Enter double value: ";
cin >> x;
}
ссылка
Tutorial. Passing arguments by reference (http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/)
Как работает быстрее? При передаче
по ссылке или при передаче по
значению?
Перегрузка функций
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 30
#include <iostream>
using namespace std;
void getValue(double&);
void getValue(int&); // объявляем одноимённую
double geom(double x, double y) {
return sqrt(x*y);
}
int main() {
double x; getValue(x); // параметр передаётся по ссылке
int y; getValue(y); // и здесь, но другого типа
cout << geom(x, y); // тип приведён неявно!!!
return 0;
}
void getValue(double &x) { // параметр - ссылка
cout << "Enter double value: ";
cin >> x;
}
void getValue(int &x) { // параметр - ссылка
cout << "Enter integer value: ";
cin >> x;
}
Умалчиваемые значения параметров
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 31
#include <iostream>
using namespace std;
void print(char* str1, char *str2 = "Default string") {
cout << str1 << " " << str2 << "n";
}
int main() {
char *text = new char[256];
cout << "Enter your string: ";
cin >> text;
// умаливаемое значение заменится
print(text, "My string");
// у второго параметра есть умалчиваемое
// значение, его можно опускать при вызове
print(text);
return 0;
}
Умалчиваемое
значение
Выделение памяти
под 256 символов
А ничего ли мы не забыли?delete text;
Функции с переменным количеством
параметров
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 32
тип имя (спецификация_явных_параметров, ...)
К сожалению, в программировании волшебство мало
распространено, и поэтому каждая функция с переменным
списком параметров должна иметь механизм определения
их количества и их типов. (с) В.В. Подбельский
Дальше без указателей нам не обойтись
Производные типы
данных
Указатели
Массивы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 33
Указатели
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 34
тип *имя_указателя int *ptr1;
double *ptr2;
Операция
разыменовывания
тип *имя_указателя = инициализирующее_выражение;
тип *имя_указателя (инициализирующее_выражение);
Описание переменной с типом указателя
Формы записи инициализатора
double x = 3;
int *ptr1(NULL);
double *ptr2;
ptr2 = &x; // указатель связан с адресом x
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 35
double x = 3;
int *ptr1(NULL);
double *ptr2;
ptr2 = &x; // указатель связан с адресом x
cout << *ptr2; // получение значение по адресу
double x = 3;
int *ptr1(NULL);
double *ptr2;
*ptr2 = 44; // Не компилируется. Почему?
cout << *ptr2;
double x = 3;
int *ptr1(NULL);
double *ptr2;
*ptr1 = 44; // Так компилируется, но тоже не работает
Операции над указателями. Арифметика
указателей
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 36
int x;
int *ptr = &x;
cout << ptr << " " << ptr++ << "n";
cout << ptr - 2 << "n";
cout << ptr + sizeof(int) * 4 << "n";
0076FDD8 0076FDD4
0076FDD0
0076FE18
• операция разыменования (*)
• приведение типов
• присваивание
• получение адреса (&)
• аддитивные операции
• инкремент/декремент
• операции сравнения
Массивы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 37
int arr[]; // нельзя определить массив без размера
тип имя_массива[константое_выражение]
int arr[10]; // определён массив из 10 элементов
int arr[10]; // определён массив из 10 элементов
for (int i = 0;i < 10;i++)
cout << arr[i] << " ";
return 0;
-858993460 -858993460 -858993460 -858993460 -858993460
-858993460 -858993460 -858993460 -858993460 -858993460
for (int i = 0;i < 10;i++) {
arr[i] = 0;
cout << arr[i] << " ";
}
Как изменится вывод?
Массивы и указатели
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 38
for (int i = 0;i < 10;i++) {
arr[i] = i;
cout << arr[i] << " ";
}
cout << "nExperiments!!!n";
for (int i = 0;i < 10;i++) {
*(arr + i) = 9 - i;
cout << arr[i] << " ";
}
0 1 2 3 4 5 6 7 8 9
Experiments!!!
9 8 7 6 5 4 3 2 1 0
char *str = "ABCDEFGH";
int i = 0;
while (*(str + i)) { // <=> *(x+i)!='0'
cout << str[i++] << "n";
}
Строки – это массивы символов
char *str = "ABCDEFGH";
int i = 0;
cout << ++str;
char *str = "ABCDEFGH";
cout << strlen(str);
Небольшой пример со строчками
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 39
#include <iostream>
using namespace std;
int main() {
char a[][10] = { "foo", "bar", "baz", "quux" };
char *b[] = { "foo","bar", "baz","quux" };
cout << strlen(a[0])<< "n";
cout << strlen(*b);
for (int i = 0; i < 10; i++) {
cout << a[0][i] << " ";
}
for (int i = 0; i < 10; i++) {
cout << *b[i] << " ";
}
return 0;
}
Ошибка при
выполнении
Многомерные массивы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 40
тип имя_массива[К1][K2]...[KN];
массив, элементами которого служат массивы
#include <iostream>
using namespace std;
const int N = 3;
const int M = 5;
const int K = 7;
int main() {
int multiArr[N][M][K]; // трёхмерный массив
return 0;
}
К всему прочему, мы можем описать массив указателей
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 41
#include <iostream>
using namespace std;
const int N = 3;
const int M = 5;
const int K = 7;
int main() {
int multiArr[N][M][K] = {1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
for (int k = 0; k < K; k++)
cout << multiArr[i][j][k] << " ";
return 0;
}
int multiArr[N][M][K] = { {1,2,3},{4,5},{6,7,8} };
Что изменится?
Многомерные массивы и указатели
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 42
const int N = 2;
const int M = 2;
const int K = 2;
int multiArr[N][M][K] = { {1,2},{3,4},{5,6}};
int multiArr[N][M][K] = { {1,2},{3,4} };
#include <iostream>
using namespace std;
const int N = 2;
const int M = 2;
int main() {
int multiArr[N][M] = { {1,2},{3,4} };
cout << *multiArr << "n";
cout << **multiArr << "n";
return 0;
}
*(*(multiArr + 1)) + 1 **multiArr + 1
Массивы и функции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 43
#include <iostream>
using namespace std;
void changeArray(int[]);
int main() {
int ar[] = { 1,2,3,4 };
cout << *ar << *ar + 1 << *ar + 2 << *ar + 3;
cout << "n";
changeArray(ar);
cout << ar[0] << ar[1] << ar[2] << ar[3];
cout << "n";
cout << *ar << *ar + 1 << *ar + 2 << *ar + 3;
return 0;
}
void changeArray(int ar[]) {
ar[0] = ar[3];
}
Передача массива в функцию и немного подозрительного кода
Модификация с указателем
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 44
#include <iostream>
using namespace std;
void changeArray(int*);
int main() {
int ar[] = { 1,2,3,4 };
cout << *ar << *(ar + 1) << *(ar + 2) << *(ar + 3);
cout << "n";
changeArray(ar);
cout << *ar << *(ar + 1) << *(ar + 2) << *(ar + 3);
return 0;
}
void changeArray(int* ar) {
ar[0] = ar[3];
}
Указатели на функции
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 45
тип_функции (*имя_указателя) (спецификация_параметров);
Дети, этого нельзя понять – это нужно запомнить…
Так ли это?
int(*operation)(int, int);
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 46
#include <iostream>
using namespace std;
int op1(int a, int b) { // сложение целых
return a + b;
}
int op2(int a, int b) { // вычитание целых
return a - b;
}
int calculation(int(*op)(int, int), int op1,int op2) {
return (*op)(op1, op2); // вызов функции
}
int main() {
int x = 5, y = 3;
int(*operation)(int, int); // указатель на функцию
operation = op1; // связь указателя с функцией
// передаём в качестве аргумента
cout << calculation(operation,x,y);
return 0;
}
Это уже почти целочисленный калькулятор. Допишем его на практических занятиях.
Ни слова о драконах
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 47
тип_функции (*имя_указателя(спец_пар1)) (спецификация_параметров);
Здесь действует тоже мнемоническое правило!
int(*whatTheOperation()) (int, int);
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 48
#include <iostream>
using namespace std;
int op1(int a, int b) { // сложение целых
return a + b;
}
int op2(int a, int b) { // вычитание целых
return a - b;
}
int calculation(int(*op)(int, int), int op1,int op2) {
return (*op)(op1, op2); // вызов функции
}
int(*whatTheOperation()) (int, int) {
int(*operation)(int, int); // указатель на функцию
operation = op2;
return operation;
}
int main() {
int x = 5, y = 3;
// передаём в качестве аргумента функцию
cout << calculation(whatTheOperation(),x,y);
return 0;
}
Ссылки
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 49
тип &имя_ссылки int &a;
double &b;
тип &имя_ссылки = инициализирующее_выражение;
тип &имя_ссылки (инициализирующее_выражение);
Описание переменной с типом ссылки
Формы записи инициализатора
int myVar = 123;
int &myVarLink = myVar; // сохранили адрес
int &myVarLink2(myVar);
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 50
#include <iostream>
using namespace std;
int main() {
int myVar = 123;
int &myVarLink = myVar; // сохранили адрес
int &myVarLink2(myVar);
cout << &myVarLink << " " << myVarLink << "n";
myVarLink++;
cout << myVar << " " << myVarLink << " " << myVarLink2;
return 0;
}
Структуры
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 51
struct имя_структурного_типа {
тип1 поле_структуры1;
тип2 поле_структуры2;
.
.
.
} имена_объектов;
Структуры сегодня потребуются нам на практических занятиях.
Tutorial. DataStructures (http://www.cplusplus.com/doc/tutorial/structures/)
Доступ к полям структуры
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 52
По имени объекта
По указателю
имя_структуры.имя_элемента_структуры
имя_указателя -> имя_элемента_структуры
(*имя_указателя).имя_элемента_структуры
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 53
Спасибо за внимание!
Максименкова Ольга Вениаминовна
Старший преподаватель Департамента программной инженерии, ФКН
E-mail: omaksimenkova@hse.ru
Blog: Stop To Scale (http://stoptoscale.blogspot.ru)

Основы программирования на C++

  • 1.
    Основы программирования на C++ МаксименковаОльга Вениаминовна Старший преподаватель Департамента программной инженерии Факультета компьютерных наук (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 1
  • 2.
    Ответы на ужезаданные вопросы (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 2 • Как же программа работает со всеми этими ошибками? (http://habrahabr.ru/company/pvs-studio/blog/261279/) • О библиотеках C++ • A list of open source C++ libraries (http://ru.cppreference.com/w/cpp/links/libs) • Category:C++ libraries (https://en.wikipedia.org/wiki/Category:C%2B%2B_libraries) • News, Status & Discussion about Standard C++ (https://isocpp.org)
  • 3.
    Цели лекции (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 3 Рассмотреть • Основные типы данных • Базовые конструкции языка • Производные типы данных • Функции и их параметры Выявить • Способы повышения быстродействия кода • Особенности языка C++
  • 4.
    Соглашения о терминологии (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 4 Идентификатор – последовательность из букв латинского алфавита, десятичных цифр и символов подчёркивания, начинающаяся не с цифры. Ключевые (служебные) слова – это идентификаторы, зарезервированные в языке для специального использования. Выражение – это последовательность операндов, разделителей и знаков операций, задающая вычисления, то есть это правила для получения значения Знаки операций обеспечивают формирование и последующее вычисление выражений. Директива (команда) препроцессора Определение [declaration] Описание [specification] Подбельский В.В. Язык Си++. - М.: Финансы и статистика, 2003. – 560 с.
  • 5.
    Учебные материалы (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 5 1. Ахметсафина Р.З. Построение и анализ алгоритмов (ДПИ, ФКН, НИУ ВШЭ, 2 курс бакалавриата) (http://www.hse.ru/edu/courses/126217828.html) 2. Eunsuk Kang, and Jean Yang. 6.088 Introduction to C Memory Management and C++ Object-Oriented Programming, January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 21 Jun, 2015). License: Creative Commons BY-NC-SA 3. Jesse Dunietz, Geza Kovacs, and John Marrero. 6.096 Introduction to C++, January IAP 2011. (Massachusetts Institute of Technology: MIT OpenCourseWare),http://ocw.mit.edu (Accessed 21 Jun, 2015). License: Creative Commons BY-NC-SA 4. Tom Lieber, Kyle Murray, and Frank Li. 6.S096 Introduction to C and C++, January IAP 2013. (Massachusetts Institute of Technology: MIT OpenCourseWare),http://ocw.mit.edu (Accessed 21 Jun, 2015). License: Creative Commons BY-NC-SA 5. Andre Kessler. 6.S096 Effective Programming in C and C++, January IAP 2014. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu(Accessed 21 Jun, 2015). License: Creative Commons BY-NC-SA
  • 6.
    Первая программа наC++ (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 6 // Task_01.cpp : Defines the entry point for the console application. // #include "iostream" int main() { std::cout << "Hello, World!"; return 0; } • Ключевые слова • Идентификаторы • Литералы • Операции • Разделители • Пробельные символы
  • 7.
    Типы данных и переменные (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 7
  • 8.
    Основные типы данных (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 8 Тип Размер (байты) char 1 unsigned char 1 int 4 unsigned int 4 bool 1 double 8
  • 9.
    Переменные (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 9 C++ tutorial. Variables and types (http://www.cplusplus.com/doc/tutorial/variables/) • Декларация (описание) [declaration] • Инициализация [initialization] #include "iostream" using namespace std; int main() { int x; // декларация x = 5 * 12; // инициализация cout << "x: " << x; return 0; } int x = 5 * 12; // декларация c инициализацией
  • 10.
    Ввод значения переменной (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 10 #include "iostream" using namespace std; int main() { int x; // декларация cout << "Enter integer value:n"; cin >> x; // получения значения переменной cout << "nnx: " << x; return 0; }
  • 11.
    Условия Логические и условныеоперации Условный оператор Переключатель (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 11
  • 12.
    Условные операции (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 12 Операция Название > Больше >= Больше или равно < Меньше <= Меньше или равно == Равно != Не равно
  • 13.
    Логические операции (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 13 Операция Название && И || ИЛИ ! НЕ ^ Исключающее ИЛИ (XOR) Побитовые логические операции в рамках знакомства с C++ мы рассматривать не будем, но они есть… Операторы в C и C++ (https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B) Tutorial. Operators (http://www.cplusplus.com/doc/tutorial/operators/) Tutorial. Operators in C++ (http://www.tutorialspoint.com/cplusplus/cpp_operators.htm)
  • 14.
    Тернарный оператор (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 14 <операнд_1>?<операнд_2>:<операнд_3> true false
  • 15.
    Условный оператор (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 15 if (условие) ThenStat_1 if (условие) { ThenStat_1 ThenStat_2 ... } if (условие) { ThenStat_1 ThenStat_2 ... } else { ElseStat_1 ElseStat_2 ... } if (условие) ThenStat_1 else ElseStat_2 Краткая форма Tutorial. C++ decision making statements (http://www.tutorialspoint.com/cplusplus/cpp_decision_making.htm) Tutorial Statements and flow control (http://www.cplusplus.com/doc/tutorial/control/)
  • 16.
    Пример использования условия (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 16 #include "iostream" using namespace std; int main() { double x; cout << "Enter x: "; cin >> x; if (x > 0) cout << "nAbsolute value is: " << x; else cout << "nAbsolute value is: " << -x; return 0; } Получение значения модуля вещественного числа. Используем математическое определение
  • 17.
    Переключатель (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 17 switch (выражение) { case constant1: statement_A1 statement_A2 ... break; case constant2: statement_B1 statement_B2 ... break; ... default: statement_Z1 statement_Z2 ... }
  • 18.
    Пример использования переключателя (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 18 int x; cout << "Enter your mark: "; cin >> x; switch (x) { case 1: case 2: case 3: cout << "Your mark is 2"; break; case 4: case 5: cout << "Your mark is 3"; break; case 6: case 7: cout << "Your mark is 4" ;break; case 8: case 9: case 10: cout << "Your mark is 5"; break; } Получение четырёх балльного эквивалента для десятибалльной оценки На практических занятиях мы дополним код этой программы, чтобы при вводе чисел меньше единицы и больше 10 выводилось сообщение.
  • 19.
    Циклы Цикл с постусловием Циклс предусловием Цикл с параметром (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 19
  • 20.
    while (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 20 while (условие) { statement1 statement2 ... } #include "iostream" using namespace std; const int N = 10; int main() { int i = 0; while (i < N) cout << ++i << " "; return 0; } Если команда в теле цикла одна, операторные скобки также могут быть опущены. Вывод первых десяти чисел натурального ряда Tutorial. Constants (http://www.cplusplus.com/doc/tutorial/constants/)
  • 21.
    do-while (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 21 do { statement1 statement2 ... } while (условие); Вывод количества чисел делящихся на 10 и не делящихся на 10 из диапазона [1;99] #include "iostream" #define N 100 using namespace std; int main() { int i = 1, decs=0, other=0; do (i++ % 10 == 0) ? decs++ : other++; while (i < N); cout << decs << " " << other; }
  • 22.
    for (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 22 for(инициализации; условие; список выражений) { statement1 statement2 ... } for (int i = 0; i < 5; cout << i++); int i = 0; for (; i < 5; cout << i++); int i = 0; for (; i < 5; i++) cout << i;
  • 23.
    Функции Повторное использование кода Перегрузкафункций (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 23
  • 24.
    Студенты могут незнать, что (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 24 Алгоритмическая декомпозиция [algorithmic decomposition] - процесс разделения системы на части, каждая из которых отражает этап общего процесса Структурное проектирование по методу сверху вниз основной базовой единицей является подпрограмма, и программа в целом принимает форму дерева, в котором одни подпрограммы в процессе работы вызывают другие подпрограммы Процедурная инкапсуляция используется в процедурной парадигме в виде подпрограмм, которые скрывают детали реализации части алгоритма. SADT (Structured Analysis and Design Technique) методология структурного анализа и проектирования, интегрирующая процесс моделирования, управление конфигурацией проекта, использование дополнительных языковых средств и руководство проектом со своим графическим языком
  • 25.
    Описание функций (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 25 #include <iostream> using namespace std; int main() { int x; cout << "Enter integer value: "; cin >> x; cout << sqrt(x); return 0; } Описание функции main() Возвращение значения Вызов функции Тип возвращаемого значения Tutorial. Functions (http://www.cplusplus.com/doc/tutorial/functions/) Tutorial. Функции в C++ — урок 6 (https://code-live.ru/post/cpp-functions/#more)
  • 26.
    Оформление кода ввиде функции (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 26 #include <iostream> using namespace std; int getValue(); // определение функции int main() { int x = getValue(); // вызов функции cout << sqrt(x); return 0; } int getValue() { // описание функции int x; cout << "Enter integer value: "; cin >> x; return x; } Прототип В С++ при помощи ключевого слова inline можно описывать инлайн-функции. Небольшие инлайн-функции позволяют сделать программу быстрее. Но не все компиляторы об этом знают  Inline functions(http://www.learncpp.com/cpp-tutorial/75-inline-functions/)
  • 27.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 27 #include <iostream> using namespace std; double getValue(); double geom(double x, double y) { return sqrt(x*y); } int main() { double x = getValue(); double y = getValue(); cout << geom(x,y); return 0; } double getValue() { int x; cout << "Enter integer value: "; cin >> x; return x; } параметры Как сделать так, чтобы в getValue() передавать имя переменной и сохранять в неё значение? аргументы
  • 28.
    Вариант? (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 28 #include <iostream> using namespace std; double getValue(); double geom(double x, double y) { return sqrt(x*y); } int main() { double x; getValue(x); double y; getValue(y); cout << geom(x,y); return 0; } void getValue(double x) { cout << "Enter double value: "; cin >> x; } Функция не возвращает значения К сожалению, не вариант. Код не будет компилироваться… Почему?
  • 29.
    Используем ссылку (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 29 #include <iostream> using namespace std; void getValue(double&); // изменяем объявление double geom(double x, double y) { return sqrt(x*y); } int main() { double x; getValue(x); // параметр передаётся по ссылке double y; getValue(y); // и здесь cout << geom(x,y); return 0; } void getValue(double& x) { // параметр - ссылка cout << "Enter double value: "; cin >> x; } ссылка Tutorial. Passing arguments by reference (http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/) Как работает быстрее? При передаче по ссылке или при передаче по значению?
  • 30.
    Перегрузка функций (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 30 #include <iostream> using namespace std; void getValue(double&); void getValue(int&); // объявляем одноимённую double geom(double x, double y) { return sqrt(x*y); } int main() { double x; getValue(x); // параметр передаётся по ссылке int y; getValue(y); // и здесь, но другого типа cout << geom(x, y); // тип приведён неявно!!! return 0; } void getValue(double &x) { // параметр - ссылка cout << "Enter double value: "; cin >> x; } void getValue(int &x) { // параметр - ссылка cout << "Enter integer value: "; cin >> x; }
  • 31.
    Умалчиваемые значения параметров (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 31 #include <iostream> using namespace std; void print(char* str1, char *str2 = "Default string") { cout << str1 << " " << str2 << "n"; } int main() { char *text = new char[256]; cout << "Enter your string: "; cin >> text; // умаливаемое значение заменится print(text, "My string"); // у второго параметра есть умалчиваемое // значение, его можно опускать при вызове print(text); return 0; } Умалчиваемое значение Выделение памяти под 256 символов А ничего ли мы не забыли?delete text;
  • 32.
    Функции с переменнымколичеством параметров (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 32 тип имя (спецификация_явных_параметров, ...) К сожалению, в программировании волшебство мало распространено, и поэтому каждая функция с переменным списком параметров должна иметь механизм определения их количества и их типов. (с) В.В. Подбельский Дальше без указателей нам не обойтись
  • 33.
  • 34.
    Указатели (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 34 тип *имя_указателя int *ptr1; double *ptr2; Операция разыменовывания тип *имя_указателя = инициализирующее_выражение; тип *имя_указателя (инициализирующее_выражение); Описание переменной с типом указателя Формы записи инициализатора double x = 3; int *ptr1(NULL); double *ptr2; ptr2 = &x; // указатель связан с адресом x
  • 35.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 35 double x = 3; int *ptr1(NULL); double *ptr2; ptr2 = &x; // указатель связан с адресом x cout << *ptr2; // получение значение по адресу double x = 3; int *ptr1(NULL); double *ptr2; *ptr2 = 44; // Не компилируется. Почему? cout << *ptr2; double x = 3; int *ptr1(NULL); double *ptr2; *ptr1 = 44; // Так компилируется, но тоже не работает
  • 36.
    Операции над указателями.Арифметика указателей (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 36 int x; int *ptr = &x; cout << ptr << " " << ptr++ << "n"; cout << ptr - 2 << "n"; cout << ptr + sizeof(int) * 4 << "n"; 0076FDD8 0076FDD4 0076FDD0 0076FE18 • операция разыменования (*) • приведение типов • присваивание • получение адреса (&) • аддитивные операции • инкремент/декремент • операции сравнения
  • 37.
    Массивы (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 37 int arr[]; // нельзя определить массив без размера тип имя_массива[константое_выражение] int arr[10]; // определён массив из 10 элементов int arr[10]; // определён массив из 10 элементов for (int i = 0;i < 10;i++) cout << arr[i] << " "; return 0; -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 for (int i = 0;i < 10;i++) { arr[i] = 0; cout << arr[i] << " "; } Как изменится вывод?
  • 38.
    Массивы и указатели (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 38 for (int i = 0;i < 10;i++) { arr[i] = i; cout << arr[i] << " "; } cout << "nExperiments!!!n"; for (int i = 0;i < 10;i++) { *(arr + i) = 9 - i; cout << arr[i] << " "; } 0 1 2 3 4 5 6 7 8 9 Experiments!!! 9 8 7 6 5 4 3 2 1 0 char *str = "ABCDEFGH"; int i = 0; while (*(str + i)) { // <=> *(x+i)!='0' cout << str[i++] << "n"; } Строки – это массивы символов char *str = "ABCDEFGH"; int i = 0; cout << ++str; char *str = "ABCDEFGH"; cout << strlen(str);
  • 39.
    Небольшой пример сострочками (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 39 #include <iostream> using namespace std; int main() { char a[][10] = { "foo", "bar", "baz", "quux" }; char *b[] = { "foo","bar", "baz","quux" }; cout << strlen(a[0])<< "n"; cout << strlen(*b); for (int i = 0; i < 10; i++) { cout << a[0][i] << " "; } for (int i = 0; i < 10; i++) { cout << *b[i] << " "; } return 0; } Ошибка при выполнении
  • 40.
    Многомерные массивы (с) МаксименковаО.В., НИУ ВШЭ, ФКН, ДПИ 40 тип имя_массива[К1][K2]...[KN]; массив, элементами которого служат массивы #include <iostream> using namespace std; const int N = 3; const int M = 5; const int K = 7; int main() { int multiArr[N][M][K]; // трёхмерный массив return 0; } К всему прочему, мы можем описать массив указателей
  • 41.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 41 #include <iostream> using namespace std; const int N = 3; const int M = 5; const int K = 7; int main() { int multiArr[N][M][K] = {1, 2, 3, 4, 5, 6, 7, 8}; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) for (int k = 0; k < K; k++) cout << multiArr[i][j][k] << " "; return 0; } int multiArr[N][M][K] = { {1,2,3},{4,5},{6,7,8} }; Что изменится?
  • 42.
    Многомерные массивы иуказатели (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 42 const int N = 2; const int M = 2; const int K = 2; int multiArr[N][M][K] = { {1,2},{3,4},{5,6}}; int multiArr[N][M][K] = { {1,2},{3,4} }; #include <iostream> using namespace std; const int N = 2; const int M = 2; int main() { int multiArr[N][M] = { {1,2},{3,4} }; cout << *multiArr << "n"; cout << **multiArr << "n"; return 0; } *(*(multiArr + 1)) + 1 **multiArr + 1
  • 43.
    Массивы и функции (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 43 #include <iostream> using namespace std; void changeArray(int[]); int main() { int ar[] = { 1,2,3,4 }; cout << *ar << *ar + 1 << *ar + 2 << *ar + 3; cout << "n"; changeArray(ar); cout << ar[0] << ar[1] << ar[2] << ar[3]; cout << "n"; cout << *ar << *ar + 1 << *ar + 2 << *ar + 3; return 0; } void changeArray(int ar[]) { ar[0] = ar[3]; } Передача массива в функцию и немного подозрительного кода
  • 44.
    Модификация с указателем (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 44 #include <iostream> using namespace std; void changeArray(int*); int main() { int ar[] = { 1,2,3,4 }; cout << *ar << *(ar + 1) << *(ar + 2) << *(ar + 3); cout << "n"; changeArray(ar); cout << *ar << *(ar + 1) << *(ar + 2) << *(ar + 3); return 0; } void changeArray(int* ar) { ar[0] = ar[3]; }
  • 45.
    Указатели на функции (с)Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 45 тип_функции (*имя_указателя) (спецификация_параметров); Дети, этого нельзя понять – это нужно запомнить… Так ли это? int(*operation)(int, int);
  • 46.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 46 #include <iostream> using namespace std; int op1(int a, int b) { // сложение целых return a + b; } int op2(int a, int b) { // вычитание целых return a - b; } int calculation(int(*op)(int, int), int op1,int op2) { return (*op)(op1, op2); // вызов функции } int main() { int x = 5, y = 3; int(*operation)(int, int); // указатель на функцию operation = op1; // связь указателя с функцией // передаём в качестве аргумента cout << calculation(operation,x,y); return 0; } Это уже почти целочисленный калькулятор. Допишем его на практических занятиях.
  • 47.
    Ни слова одраконах (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 47 тип_функции (*имя_указателя(спец_пар1)) (спецификация_параметров); Здесь действует тоже мнемоническое правило! int(*whatTheOperation()) (int, int);
  • 48.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 48 #include <iostream> using namespace std; int op1(int a, int b) { // сложение целых return a + b; } int op2(int a, int b) { // вычитание целых return a - b; } int calculation(int(*op)(int, int), int op1,int op2) { return (*op)(op1, op2); // вызов функции } int(*whatTheOperation()) (int, int) { int(*operation)(int, int); // указатель на функцию operation = op2; return operation; } int main() { int x = 5, y = 3; // передаём в качестве аргумента функцию cout << calculation(whatTheOperation(),x,y); return 0; }
  • 49.
    Ссылки (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 49 тип &имя_ссылки int &a; double &b; тип &имя_ссылки = инициализирующее_выражение; тип &имя_ссылки (инициализирующее_выражение); Описание переменной с типом ссылки Формы записи инициализатора int myVar = 123; int &myVarLink = myVar; // сохранили адрес int &myVarLink2(myVar);
  • 50.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 50 #include <iostream> using namespace std; int main() { int myVar = 123; int &myVarLink = myVar; // сохранили адрес int &myVarLink2(myVar); cout << &myVarLink << " " << myVarLink << "n"; myVarLink++; cout << myVar << " " << myVarLink << " " << myVarLink2; return 0; }
  • 51.
    Структуры (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 51 struct имя_структурного_типа { тип1 поле_структуры1; тип2 поле_структуры2; . . . } имена_объектов; Структуры сегодня потребуются нам на практических занятиях. Tutorial. DataStructures (http://www.cplusplus.com/doc/tutorial/structures/)
  • 52.
    Доступ к полямструктуры (с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 52 По имени объекта По указателю имя_структуры.имя_элемента_структуры имя_указателя -> имя_элемента_структуры (*имя_указателя).имя_элемента_структуры
  • 53.
    (с) Максименкова О.В.,НИУ ВШЭ, ФКН, ДПИ 53 Спасибо за внимание! Максименкова Ольга Вениаминовна Старший преподаватель Департамента программной инженерии, ФКН E-mail: omaksimenkova@hse.ru Blog: Stop To Scale (http://stoptoscale.blogspot.ru)