Процедурное программирование на языке C++ презентация

Содержание

Слайд 2

Алгоритм – последовательность действий, направленных на достижение конкретного результата

Слайд 3

Программа – последовательность команд (инструкций), выполняемых процессором и описывающих алгоритм на языке программирования

Слайд 4

Данные – информация, которая обрабатывается в процессе выполнения программы

Слайд 5

Машинный код

Слайд 6

Ассемблерный код

Слайд 7

Код на языке С

Слайд 8

Современные языки программирования

Слайд 9

Основные преимущества языков низкого уровня
Прямой доступ к аппаратным ресурсам
Малый размер исполняемого файла
Высокая скорость

выполнения

Слайд 10

Основной недостаток языков низкого уровня – сложность программирования из-за огромных размеров исходного кода

Слайд 11

Главное преимущество языков высокого уровня – быстрота разработки сложных программных продуктов

Слайд 12

Основные недостатки языков высокого уровня
Ограниченный доступ к аппаратным ресурсам
Большой размер исполняемого файла
Сравнительно невысокая

скорость выполнения

Слайд 13

Основные этапы разработки программы
Постановка задачи
Проектирование
Кодирование

Слайд 14

На этапе постановки задачи программист выясняет у заказчика требования к программе

Слайд 15

На этапе проектирования программист выбирает алгоритм для написания программы

Слайд 16

На этапе кодирования программист переводит алгоритм на какой-либо язык программирования

Слайд 17

Этапы создания исполняемого файла (.exe)

Слайд 18

Препроцессор включает в исходный текст программы заголовочные файлы, содержащие описания используемых элементов

Слайд 19

Компилятор выявляет синтаксические ошибки и, в случае их отсутствия, строит объектный модуль (.obj)

Слайд 20

Компоновщик формирует исполняемый модуль программы (.exe) из объектных модулей (.obj) и библиотечных файлов

(.lib)

Слайд 21

Литералы
Строковый
Символьный
Целочисленный
Вещественный
Логический

Слайд 22

Строковый литерал – последовательность символов, заключенная в двойные кавычки
“The C Programming Language”

Слайд 23

Символьный литерал – одиночный символ, заключенный в одинарные кавычки
‘!’ ‘A’ ‘8’

Слайд 24

Целочисленный литерал – любое положительное или отрицательное целое число
-15 100 OxFF

Слайд 25

Вещественный литерал – дробное число, представленное в форме с десятичной точкой либо в

экспоненциальной форме
-5.7 5e10 11e-3

Слайд 26

Логический литерал
true (истина)
false (ложь)

Слайд 27

Понятие переменной

Слайд 28

Переменная –
именованная область оперативной памяти, предназначенная для хранения изменяемого значения указанного типа

Слайд 29

Типы данных

Целочисленный
Символьный
Вещественный
Логический

Слайд 30

Целочисленные типы

short (2 байта) -32768 … 32767
unsigned short (2 байта) 0 … 65535
int (4

байта – зависит от разрядности платформы и компилятора) -2 147 483 648 … 2 147 483 647

Слайд 31

Целочисленные типы

unsigned int (4 байта – зависит от архитектуры платформы и компилятора) 0 …

4 294 967 295
long (4 байта) -2 147 483 648 … 2 147 483 647
unsigned long (4 байта) 0 … 4 294 967 295

Слайд 32

Целочисленные типы

long long (8 байт) -9 223 372 036 854 775 808 … 9

223 372 036 854 775 807
unsigned long long (8 байт) 0 … 18 446 744 073 709 551 615

Слайд 33

Тип данных int строго не определён стандартом языка и должен иметь «естественный» размер

с учётом архитектуры (разрядности) системы

Слайд 34

Тип данных int не должен быть меньше short (2 байта) и не должен

превышать long (4 байта)

Слайд 35

Символьные типы

char(1 байт) -128 … 127
unsigned char (1 байт) 0 … 255

Слайд 36

Тип данных char представляет один символ в кодировке ASCII

Слайд 37

ASCII (American standard code for information interchange) — название таблицы (кодировки), в которой символам сопоставлены числовые коды 

Слайд 39

Например, символу ‘D’ соответствует ASCII-код 68, а символу ‘d’ – ASCII-код 100 

Слайд 40

Вещественные типы

float (4 байта) 3.4E-38 … 3.4E+38
double (8 байт) 1.7E-308 … 1.7E+308

Слайд 41

Логический тип

bool (1 байт) true false

Слайд 42

Для того чтобы использовать в программе переменную, ее необходимо объявить

Слайд 43

Синтаксис объявления переменных:
тип_переменной имя_переменной;

Слайд 44

Имя переменной называется идентификатором

Слайд 45

Правила именования идентификаторов:

Имя переменной не может начинаться с цифры
Имя переменной может содержать буквы,

цифры и знак подчеркивания «_»
Имя переменной не может являться ключевым или служебным словом
Имя переменной должно быть уникальным
Имя переменной должно быть осмысленным

Слайд 47

Константа –
именованная область оперативной памяти, предназначенная для хранения постоянного значения указанного типа

Слайд 48

Синтаксис объявления константы:
const тип_константы имя_ константы = значение;

Слайд 49

Литералы, рассмотренные ранее, представляют собой константы, непосредственно включаемые в текст программы

Слайд 50

Литералы отличаются от констант тем, что они не имеют идентификаторов

Слайд 51

Ввод данных

Слайд 52

Синтаксис ввода данных:
cin >> имя_переменной;

Слайд 54

Понятие оператора

Слайд 55

Оператор – это конструкция языка программирования, которая выполняет определённое действие над аргументами (операндами)

Слайд 56

Операнд - это аргумент оператора, то есть то значение, над которым оператор выполняет

действие

Слайд 57

В зависимости от количества операндов операторы бывают:

Унарные
Бинарные
Тернарные

Слайд 58

Оператор присваивания

Слайд 59

Синтаксис оператора присваивания:
имя_переменной = выражение;

Слайд 60

Выражение –
конструкция, состоящая из операндов, объединенных знаками операций

Слайд 62

Множественные присваивания - присваивания одного и того же значения нескольким переменным одновременно

Слайд 63

Арифметические операторы

Оператор сложения (бинарный)
Оператор вычитания (бинарный)
Оператор умножения (бинарный)
Оператор деления (бинарный)

Слайд 64

Арифметические операторы

Оператор остаток от деления (бинарный)
Оператор минус (унарный)
Оператор инкремент (унарный)
Оператор декремент (унарный)

Слайд 65

Сокращённые формы операторов: += -= *= /= %=

Слайд 66

Приведение типов

Слайд 67

Выражение –
конструкция, состоящая из операндов, объединенных знаками операций

Слайд 68

Результат вычисления выражения характеризуется значением и типом

Слайд 69

В выражение могут входить операнды различных типов

Слайд 70

Если операнды имеют одинаковый тип, то результат операции будет иметь тот же

тип

Слайд 71

Если операнды разного типа, перед вычислениями выполняются преобразования типов по определенным правилам

Слайд 72

Эти правила обеспечивают преобразование более коротких типов в более длинные для сохранения

значимости и точности

Слайд 75

Перед вычислением выражения смешанного типа происходит неявное (автоматическое) расширяющее преобразование операндов

Слайд 76

Неявное расширяющее преобразование типа может также происходить при присваивании переменной результата выражения

Слайд 77

Неявное преобразование типа при присваивании переменной результата выражения может быть сужающим

Слайд 78

Сужающие преобразования бывают:

с потерей точности (данных)
с переполнением разрядной сетки
с изменением интерпретации внутреннего представления

данных

Слайд 79

Приведение типов может быть явным

Слайд 80

Явное приведение типов указывается программистом в коде программы

Слайд 81

Синтаксис явного приведения типа:
(тип) выражение;

Слайд 83

Структура ветвления

Слайд 84

Операторы отношения

== (равно)
!= (не равно)
> (больше)
>= (больше либо равно)
< (меньше)
<= (меньше либо

равно)

Слайд 85

Операторы отношения предназначены для составления логических выражений

Слайд 86

Результат вычисления любого логического выражения –
ИСТИНА или ЛОЖЬ

Слайд 88

Логические операторы

&& (логическое умножение, логическое И)
|| (логическое сложение, логическое ИЛИ)
! (логическое

отрицание, логическое НЕ)

Слайд 89

Логические операторы предназначены для объединения логических выражений

Слайд 91

Логическое «ИЛИ»

5 == 5 || 5 == 9
// true, потому что первое

выражение true
5 > 3 || 5 > 10
// true, потому что первое выражение true
5 > 8 || 5 < 10
// true, потому что второе выражение true
5 < 8 || 5 > 2
// true, потому что оба выражения true
5 > 8 || 5 < 2
// false, потому что оба выражения false

Слайд 92

Логическое «И»

5 == 5 && 4 == 4
// true, потому что оба

выражения true
5 == 3 && 4 == 4
// false, потому что первое выражение false
5 > 3 && 5 > 10
// false, потому что второе выражение false
5 < 8 && 5 > 2
// true, потому что оба выражения true
5 > 8 && 5 < 2
// false, потому что оба выражения false

Слайд 93

Логическое «НЕ»

!(10 != 10)
// true, потому что выражение false
!(5 > 3)
// false,

потому что выражение true

Слайд 94

Оператор ветвления «if»

if (выражение)
{
// оператор_1;
}
else
{
// оператор_2;
}

Слайд 95

Оператор ветвления «if»

if (выражение)
{
// оператор;
}

Слайд 96

Оператор ветвления «if»

if (выражение_1)
{ // оператор_1; }
else if (выражение_2)
{

// оператор_2; }
else
{ // оператор_3; }

Слайд 97

Таблица приоритетов операций

Слайд 98

Структура повторения

Слайд 99

Структура повторения позволяет программисту определить действие, которое должно повторяться, пока некоторое условие остается

истинным 

Слайд 100

В языке программирования С++ структура повторения  реализуется с помощью оператора цикла

Слайд 101

Виды циклов

Цикл с предусловием (while)
Цикл с постусловием (do while)
Параметрический цикл (for)

Слайд 102

Цикл с предусловием while

while (выражение)
{
// оператор
// или группа
// операторов
}

Слайд 103

Цикл с постусловием do while

do
{
// оператор
// или группа
// операторов
}
while (выражение);

Слайд 104

Параметрический цикл for

Слайд 105

Массивы

Слайд 106

Массив –
это совокупность переменных, объединенных под общим именем и имеющих один и

тот же тип данных

Слайд 107

Каждая переменная в массиве является самостоятельной единицей и называется элементом массива

Слайд 108

Все элементы массива располагаются в памяти последовательно друг за другом и имеют свой

индекс – смещение относительно начала массива

Слайд 109

Объявление массива

Синтаксис объявления массива:
тип_данных имя_массива[количество_элементов];
int numbers[4];
const int nSize = 6;
double arr[nSize];

Слайд 110

Инициализация массива

тип_данных имя_массива[количество элементов] = {значение1, значение2, ... значение n};

Слайд 111

Количество элементов массива можно не указывать. Размер массива определяется исходя из числа элементов

в списке инициализации.

int arrayInit[] = { 2, 33, 4 }; // массив из трех элементов

Слайд 112

Если значений в списке инициализации меньше чем количество элементов массива, то оставшиеся значения

автоматически заполняются нулями

int arr[6] = { 1, 2, 3 };
// такая запись эквивалентна записи:
int arr[6] = { 1, 2, 3, 0, 0, 0 };

Слайд 113

Если значений в списке инициализации больше чем количество элементов массива, то происходит ошибка

на этапе компиляции

// int arr[2] = {1, 2, 3}; // Ошибка на этапе компиляции

Слайд 114

Расположение массива в памяти

Формула, согласно которой производится позиционирование по массиву:
базовый адрес

+ размер базового типа * индекс;

Слайд 115

Операция индексирования массива

Запись значения в массив:
имя_массива[индекс_элемента] = значение;
Получение значения из массива:
cout << имя_массива[индекс_элемента];
const

int nArraySize = 3;
int ar[nArraySize];
ar[1] = 7;
cout << ar[1] << endl;

Слайд 116

Большинство операций с массивами разумно проводить с помощью циклов, по очереди перебирая элементы

Слайд 117

Циклическая обработка массива

Слайд 118

Линейный поиск элемента в массиве

Слайд 119

Бинарный поиск элемента в массиве

Слайд 120

Сортировка массива прямым обменом (метод «пузырька»)

Слайд 121

Сортировка массива прямыми вставками

Слайд 122

Двумерный массив, как частный случай многомерного массива

Слайд 123

Двумерный массив представляет собой совокупность строк и столбцов, на пересечении которых находится конкретное

значение

Слайд 124

Двумерный массив располагается в памяти построчно: сначала нулевая строка, затем первая и т.д.

Слайд 125

Объявление двумерного массива

Синтаксис объявления двумерного массива:
тип_данных имя_массива [число_строк][число_столбцов];

const int

ROW = 3; // строки
const int COL = 4; // столбцы
int arr[ROW][COL]; // массив размером 3х4

Слайд 126

Инициализация массива

Каждая строка заключается в отдельные фигурные скобки
int arr[2][2] = { {

1, 2 }, { 7, 8 } };
Если значение пропущено, оно будет инициализировано нулем
int arr[3][3] = { { 7, 8 }, { 10, 3, 5 } };
Значения указываются подряд и построчно вписываются в массив
int arr[2][2] = { 7, 8, 10, 3 };

Слайд 127

Циклическая обработка массива

Слайд 128

Функции в процедурном программировании

Слайд 129

Один и тот же код может встречаться в программе несколько раз

Слайд 130

Например, применение алгоритмов суммирования, сортировки, определения максимального значения массива в практической задаче могут

встречаться очень часто

Слайд 131

Как следствие, увеличивается количество и затрудняется чтение программного кода

Слайд 132

С увеличением объема программы становится невозможным хранить в человеческой памяти все ее детали

Слайд 133

Одним из естественных вариантов борьбы со сложностью является алгоритмическая декомпозиция -разбиение задачи на

подзадачи

Слайд 134

Процедурное программирование –
подход, при котором исходная задача разбивается на подзадачи, каждая из

которых оформляется в виде функции

Слайд 135

Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие

Слайд 136

Функция может принимать параметры и возвращать значение

Слайд 137

Определение функции

Синтаксис определения функции:
<тип> <имя_функции> ([список параметров])
{
тело функции
}

Слайд 138

Определение функции

Слайд 139

Область видимости переменной–
это некоторая область программы, внутри которой возможно обратиться к переменной

Слайд 140

Начало области видимости переменной совпадает с ее объявлением

Слайд 141

В зависимости от места объявления различают два типа переменных: локальные и глобальные

Слайд 142

Локальная переменная –
переменная, объявленная внутри функции или блока

Слайд 143

Блок - область программного кода от открывающей до соответствующей закрывающей фигурной скобки

Слайд 144

Локальная переменная

Слайд 145

Конец области видимости локальной переменной совпадает с закрывающей фигурной скобкой, соответствующей открывающей фигурной

скобке, после которой была объявлена переменная

Слайд 146

Локальные переменные создаются в специальной области оперативной памяти, которая называется стеком

Слайд 147

Стек функционирует по правилу LIFO (Last In First Out)

Слайд 148

Локальные переменные создаются при каждом вызове функции

Слайд 149

После завершения работы функции соответствующий участок стека освобождается и локальные переменные функции уничтожаются

Слайд 150

Поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются

Слайд 151

Глобальная переменная –
переменная, объявленная вне функции

Слайд 152

Глобальная переменная

Слайд 153

Конец области видимости глобальной переменной в текущем файле совпадает с концом этого файла

Слайд 154

Глобальные переменные создаются в специальной области оперативной памяти, которая называется сегментом данных

Слайд 155

Глобальные переменные создаются до вызова функции main и по умолчанию инициализируются нулем

Слайд 156

Глобальные переменные уничтожаются после окончания работы функции main

Слайд 157

Значения глобальных переменных сохраняются между вызовами одной и той же функции

Слайд 158

Глобальные переменные видны во всех функциях, где не объявлены локальные переменные с теми

же именами

Слайд 159

Поэтому очень легко их использовать для передачи данных между функциями

Слайд 160

Однако использование глобальных переменных не рекомендуется, поскольку это препятствует помещению функций в библиотеки

общего пользования

Слайд 161

Необходимо стремится к тому, чтобы функции были максимально независимы, а их интерфейс полностью

определялся прототипом функции

Слайд 162

Глобальная переменная может быть перекрыта локальной переменной с таким же именем

Слайд 163

Статическая локальная переменная –
переменная, объявленная внутри функции или блока

Слайд 164

Статическая локальная переменная

Слайд 165

Статические локальные переменные имеют такую же область видимости, что и обычные локальные переменные

Слайд 166

Статические локальные переменные создаются в сегменте данных при первом вызове функции и по

умолчанию инициализируются нулем

Слайд 167

Статические локальные переменные уничтожаются после окончания работы функции main

Слайд 168

Значения локальных статических переменных сохраняются между вызовами одной и той же функции

Слайд 169

Перегрузка функций

Слайд 170

Перегруженные функции –
это функции, которые имеют одинаковые имена, но отличаются сигнатурой

Слайд 171

Сигнатура –
это тип, количество и порядок следования формальных параметров функции

Слайд 172

Компилятор определяет, какую именно функцию требуется вызвать, по типу фактических параметров

Слайд 173

Этот процесс называется разрешением перегрузки

Слайд 174

Тип возвращаемого функцией значения в разрешении не участвует

Слайд 175

Пример перегрузки функций

Слайд 176

В процессе разрешения перегрузки компилятор выбирает функцию с наиболее подходящими параметрами

Слайд 177

Пример перегрузки функций

Слайд 178

Критерий разрешения перегрузки - однозначность вызова функции

Слайд 179

Пример перегрузки функций

Слайд 180

Пример перегрузки функций

Слайд 181

Перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично одинаковым

именам переменных во вложенных блоках

Слайд 182

Пример перегрузки функций

Слайд 183

Встраивание (Inline – функции)

Слайд 184

Как известно, при вызове функции происходит:

Помещение аргументов в стек
Передача управления функции
Возврат из функции
Освобождение

стека

Слайд 185

Все это вносит издержки, которые немного влияют на скорость

Слайд 186

Механизм встраивания предназначен для увеличения производительности кода

Слайд 187

Встраивание (inline) - это техника, благодаря которой компилятор имеет возможность встроить (скопировать) код

функции напрямую в место её вызова

Слайд 188

Для того, чтобы сделать функцию встраиваемой, необходимо при определении функции указать ключевое слово

inline

Слайд 189

В этом случае компилятору рекомендуется не использовать привычный вызов функции, а встроить её

код напрямую в место использования

Слайд 190

Однако встраивание является рекомендацией для компилятора и срабатывает не всегда

Слайд 191

Встраивание проходит для очень простых функций, состоящих из нескольких инструкций, которые не содержат

сложных конструкций

Слайд 192

Если функция содержит сложные конструкции (циклы, if/else, switch и т.д.), то компилятор может

проигнорировать встраивание

Слайд 193

В таком случае, inline-функция ничем не будет отличаться от обычной

Слайд 194

Шаблоны функций

Слайд 195

Шаблоны используются, когда необходимо создать функции, которые применяют один и тот же алгоритм

к различным типам данных

Слайд 196

Шаблон функции – это обобщенное описание функции

Слайд 197

У такой функции хотя бы один формальный параметр имеет обобщенный тип

Слайд 198

Определение шаблона функции

Слайд 199

Использование шаблона функции

Слайд 200

В момент вызова функции компилятор автоматически создает специализированную версию функции, где вместо параметра

типа подставляется конкретный тип данных

Слайд 201

Этот процесс называется инстанцированием шаблона или созданием экземпляра шаблона

Слайд 202

Повторный вызов функции с теми же типами параметров не спровоцирует генерацию дополнительной копии

функции, а вызовет уже существующую

Слайд 203

Использование шаблона функции

Слайд 204

Определение шаблона функции не вызывает самостоятельную генерацию кода компилятором

Слайд 205

По этой причине реализацию шаблонов функций следует размещать в заголовочном файле

Слайд 206

Компилятор создает код функции только в момент ее вызова, и генерирует при этом

соответствующую версию функции

Слайд 207

Перегруженные шаблоны

Слайд 208

Важно понимать, что использование шаблонов функций не приводит к уменьшению результирующего объектного кода

Слайд 209

Однако экономит время разработки программы

Слайд 210

Рекурсия

Слайд 211

Рекурсивная функция–
функция, которая вызывает сама себя

Слайд 212

Если функция производит собственный вызов напрямую, то такая рекурсия называется прямой

Слайд 213

Существует также косвенная рекурсия, когда две функции вызывают друг друга

Слайд 214

Итерационный метод решения задач

Слайд 215

Рекурсивный метод решения задач

Слайд 216

Процесс рекурсивных вызовов

Слайд 217

Для завершения вычислений каждая рекурсивная функция должна содержать хотя бы одну нерекурсивную ветвь

алгоритма, которая заканчивается оператором возврата

Слайд 218

Достоинством рекурсии является компактная запись

Слайд 219

Недостатки рекурсии – расход времени и памяти на повторные вызовы функции и передачу

ей копий параметров

Слайд 220

Главный недостаток рекурсии - опасность переполнения стека

Слайд 221

Рекурсивные функции обычно применяют для работы с древовидными структурами данных

Слайд 222

Адреса и указатели

Слайд 223

В языке С++ используется плоская модель памяти (Flat model)

Слайд 225

В плоской модели код и данные используют одно и то же адресное пространство

Слайд 226

Каждый байт памяти имеет свой адрес

Слайд 227

У каждой переменной есть свой адрес в памяти

Слайд 228

Адрес переменной –
это целочисленное значение, индекс первого байта области памяти, которую занимает

переменная

Слайд 229

Адрес переменной – это целое число, которое обозначает смещение переменной от начала памяти

Слайд 230

Операция получения адреса – взятие адреса &

Слайд 231

Указатель –
это переменная, значением которой является адрес другой переменной

Слайд 232

Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом

Слайд 233

Базовый тип указателя определяется типом переменной, на которую он может ссылаться

Слайд 234

Инициализация указателя

Слайд 235

void * - это указатель без привязки к типу, т.е. обобщенный указатель

Слайд 236

Операция разыменования указателя * – косвенная адресация

Слайд 237

Разыменование указателя (косвенная адресация) – получение доступа к переменной, на которую ссылается указатель

Слайд 238

Изменение значения указателя

Слайд 241

Приоритет операций & и * выше, чем приоритет всех арифметических операторов, за исключением

унарного минуса

Слайд 242

Различная интерпретация оператора *

Слайд 243

Указатель на переменную и указатель на константу

Слайд 244

Указатель-константа на переменную и указатель-константа на константу

Слайд 245

Размер указателя

Слайд 246

В соответствии со стандартом C++, размер указателя зависит от конкретной реализации компилятора и

не связан напрямую с разрядностью используемой платформы

Слайд 247

Однако на большинстве современных операционных систем размер указателя соответствует разрядности адресной шины у

архитектуры этих платформ

Слайд 248

Ширина шины адреса определяет объём адресуемой памяти

Слайд 249

Например, если ширина адресной шины составляет 32 бита, то объём памяти, который можно

адресовать, составляет 2^32 байт или 4 Гбайт

Слайд 250

Связь массивов и указателей

Слайд 251

Имя массива без указания индексации - это адрес начала массива в оперативной памяти,

т.е. адрес нулевого элемента массива

Слайд 252

Использование операции индексирования для обращения к элементам массива

Слайд 253

Расположение массива в памяти

Слайд 254

Расположение массива в памяти

Формула, согласно которой производится позиционирование по массиву:
базовый адрес

+ размер базового типа * индекс;

Слайд 255

Использование операции разыменования для обращения к элементам массива

Слайд 256

Результат действия выражения * (intarray + j) — тот же, что и выражения

intarray[j]

Слайд 257

Использование арифметики указателей

Слайд 258

Использование арифметики указателей

Имя файла: Процедурное-программирование-на-языке-C++.pptx
Количество просмотров: 65
Количество скачиваний: 0