Слайды использовались на краткосрочных курсах повышения квалификации учителей информатики, 2 лекции по 1 час 20 минут.
Изложен опорный (предельно ужатый) материал по основами C++.
[Maksimenkova_Neznanov] Peer Assessment to Programmers & Peer Assessment Syst...
Основы программирования на 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;
}
• Ключевые слова
• Идентификаторы
• Литералы
• Операции
• Разделители
• Пробельные символы
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)
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 выводилось сообщение.
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;
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
тип имя (спецификация_явных_параметров, ...)
К сожалению, в программировании волшебство мало
распространено, и поэтому каждая функция с переменным
списком параметров должна иметь механизм определения
их количества и их типов. (с) В.В. Подбельский
Дальше без указателей нам не обойтись
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] << " ";
}
Как изменится вывод?
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
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)