Основы программирования на c++
Post on 18-Aug-2015
67 Views
Preview:
TRANSCRIPT
Основы программирования на 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 << "\n\nx: " << 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_1ThenStat_2...
}
if (условие) {
ThenStat_1ThenStat_2...
}else{
ElseStat_1ElseStat_2...
}
if (условие) ThenStat_1
elseElseStat_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_A1statement_A2...break;
case constant2:statement_B1statement_B2...break;
...default:
statement_Z1statement_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 (условие){
statement1statement2...
}
#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{
statement1statement2...
} while (условие); Вывод количества чисел делящихся на 10 и не
делящихся на 10 из диапазона [1;99]
#include "iostream"#define N 100using 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(инициализации; условие; список выражений){
statement1statement2...
}
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; // указатель связан с адресом xcout << *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 0076FDD40076FDD00076FE18
• операция разыменования (*)
• приведение типов
• присваивание
• получение адреса (&)
• аддитивные операции
• инкремент/декремент
• операции сравнения
Массивы
(с) Максименкова О.В., НИУ ВШЭ, ФКН, ДПИ 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)
top related