Similar presentations:
Основы программирования на c/c++. Лекция
1. Основы программирования на c/c++ Лекция 1: Введение.
Автор курса:Разумовский Алексей Игоревич
oopCpp@yandex.ru
2. Книги и ссылки
1. Страуструп Б. Язык программирования C++. Москва: Вильямс, 20112. Мейерс С. - Эффективный и современный C++. 42 рекомендации по
использованию C++11 и C++14, 2016
3. Д. Элджер - Библиотека программиста С++ - Гарвард: World Group, 2004.
4. Стив Макконнелл Совершенный код
5. https://cppreference.com
// стандарты C++
2
3. Ключевые слова
Программа. Программирование. Алгоритм. Абстракция. Кодировщик.Архитектор. Язык программирования. Язык программирования
высокого уровня. Синтаксис, семантика. Трансляция. Компиляция.
Компилятор. Компоновка (линковка). Интегрированная среда
разработки (IDE). Отладка. Сборка программы. Проектирование
программы. Этапы жизненного цикла программы. Знаковая система,
алфавит.
3
4. Основные термины
Множество — совокупность определенных элементовМощность множества — размер множества (количество его элементов)
Символ (character) — это базовая единица текстовой информации,
представляющая собой абстрактное понятие для: буквы (A, б, 字, α), цифры
(1, , …), прочие, например знаки препинания, символы валют, пробелы
Алфавит — непустое конечное множество символов, в котором каждому
символу соответствует код (натуральное число), а таблица, задающая
такое соответствие, называется кодировкой
Автомат — абстрактное устройство, реализующее отображение X -> У, где X
— алфавит ввода, а У — алфавит вывода
Данное — любое множество символов, задействованное в выполнении какойлибо операции
Алгоритм — точная, конечная последовательность четко определенных
шагов (инструкций), предназначенная для решения конкретной задачи или
достижения определенной цели за конечное время.
4
5. Основные термины 2
Компьютер — это физическая платформа, на которой выполняются всепрограммы, написанные на языках программирования
Язык программирования — формальный искусственный язык, состоящий из
набора правил (синтаксиса и семантики), предназначенный для записи
алгоритмов, которые будут выполняться компьютером
Программирование — составление программы, решающей целевую задачу
Файл — совокупность данных, существующая в контексте некоторой
файловой системы
Библиотека — набор программ, предназначенный для использования их как
части других программ
Компилятор — это программа, которая переводит весь исходный код в
машинный код (или в промежуточный код) до запуска программы
Время компиляции — это момент, когда компилятор обрабатывает исходный
код, и все ошибки/действия, происходящие в этот период
Компоновщик — программа, формирующая исполняемый файл из набора
объектных файлов (результатов компиляции) и статически связываемых
библиотек.
5
6. Основные термины 3
Отладчик (debugger) — приложение, используемое для отладки — поискаошибок в программе в процессе ее исполнения
Среда разработки — программный комплекс, включающий в себя редактор
файлов исходного кода, компилятор, компоновщик и отладчик
Интегрированная среда разработки (IDE) — это специализированное
программное обеспечение, которое объединяет в одном интерфейсе все
основные инструменты, необходимые разработчику для создания,
тестирования и отладки программного кода
Заголовочный файл (header) это текстовый файл в C/C++, который содержит
объявления (иногда и реализацию) для использования в других частях
программы. Он служит "оглавлением" для компилятора.
6
7. Методология познания
Метод проб и ошибокЧем больше сделаете ошибок, исправите их, тем быстрее
научитесь
7
8. Интегрированная Среда Разработки (IDE) для С++: Microsoft Visual Studio vv. 2019-2022
89. Исследования, проведенные в 1970-х годах в Массачусетском технологическом институте и исследовательском центре Xerox Palo Alto
Research Center, привели кразработке философии объектноориентированного программирования и
созданию языков реализации, включая
Smalltalk, Java, C++.
9
10. Файлы
3 способа доступа к файлам данных:• Windows API: CreateFile (и другие функции для работы с
файлами)
• C: fopen (и прочие функции для работы с файлами из stdio.h)
• C++: fstream (ifstream, ofstream ) (из stl)
10
11. Потоки данных
• С: printf и scanf (#include<stdio.h>)• C++: cin и cout (#include<iostream>)
Файловые потоки:
(#include<fstream>)
11
12.
Пример#include <iostream>
#include <fstream>
#include <locale>
// Для работы с локалями
using namespace std;
void error( const char* s, const char* s2 = " ") {
cerr << s << ' ' << s2 << '\n';
exit(1);
}
int main(int argc, char* argv[ ]) {
setlocale(LC_ALL, "");
ifstream from("file1.txt");
ofstream to("file2.txt");
char ch;
while (from.get(ch)) to.put(ch);
if (!from.eof() || to.bad())
error("произошло что - то странное");
return 0;
}
12
13. Стандартная библиотека шаблонов STL
Включает, основанную на методологии обобщенного программированиябиблиотеку классов, содержащую:
-
Контейнеры (для хранения данных произвольного типа)
-
Итераторы (для осуществления доступа к данным контейнеров)
-
Алгоритмы
-
Адаптеры контейнеров, итераторов и функционалов.
-
Стримы (streams) для выполнения потоковых операций с данными
-
Потоки исполнения (threads) и элементы синхронизации в потоках
-
Прочие элементы, например, умные указатели, лямбда, диапазоны
13
14. Пример stl-алгоритма: сортировка
#include<vector>#include<algorithm>
using namespace std;
vector <int> v;
for ( int i=10; i< 0; i--)
v.push_back(i);
// заполняем вектор: 10,9,8,7,6,5,4,3,2,1
vector <int>::iterator it= v.begin();
sort (v.begin(),v.end());
// сортируем данные вектора 1,2,3,4,5,6,7,8,9,10
14
15. Отладчик MS Visual Studio
Клавиши отладки (основные):F9 – поставить или снять точку останова программы
F10 – совершить одно отладочное действие: выполнить одну
результирующую операцию.
F11 – войти внутрь функции
SHIFT + F11 – выйти из функции
Окна отладки:
В процессе отладки программы можно открывать большинство окон
отладчика. Чтобы просмотреть список окон отладчика, установите точку
останова (F9) и начните отладку. Когда точка останова будет достигнута и
выполнение остановится, выберите пункт: Отладка / Окна.
15
16.
1617.
1718. Тип данных
Тип данных (Data Type) в программировании — это фундаментальное понятие,определяющее:
- Что представляют данные (число, символ, логическое значение и т.д.).
- Как они хранятся в памяти (размер, формат).
- Какие операции допустимы (сложение, сравнение, вывод на экран).
Примеры:
int count = 10;
// Тип: int (навсегда)
count = "текст";
// Ошибка компиляции!
double dollars = 100.50;
int rubles = dollars; // Дробная часть (.50) теряется!
cout << rubles; // Выведет 100 (а не 100.50)
18
19. Переменные и Значения в C++
Значение (Value)— Это конкретные данные, с которыми работает программа.
— Имеют тип (например, int, float, char, bool) и содержимое.
Примеры:
42
// целочисленное значение (int)
3.14
// значение с плавающей точкой (double)
'A'
// символьное значение (char)
"Hello"
// строковое значение (const char[6])
Переменная (Variable)
— Это именованная область памяти, хранящая значение определённого типа.
Служит для:
Хранения данных (например, результатов вычислений).
Чтения и изменения значений в процессе выполнения программы.
19
20. Функции
Функция в программировании — это именованный блок кода, которыйвыполняет конкретную задачу и может быть многократно вызван из других
частей программы. Это фундаментальная конструкция для структурирования
кода, избегания дублирования и упрощения отладки.
// 1. Возвращаемый тип | 2. Имя | 3. Параметры
int
sum
(int a, int b)
{ // Начало области видимости функции
// 4. Тело функции
int result = a + b;
// 5. Возврат результата
return result;
} // Конец области видимости функции
20
21. Три аспекта функции в коде
Объявление (сигнатура):Указывает что делает функция, без реализации.
int sum(int a, int b); // Заголовок функции
Определение:
Содержит реализацию (тело функции).
int sum(int a, int b) { return a + b; }
Вызов:
Выполнение кода функции с конкретными значениями.
int x = sum(3, 5); // x = 8
21
22. Особенности
- Перегрузка функцийНесколько функций с одним именем, но разными параметрами:
int sum (int a, int b) { ... }
double sum (double a, double b) { ... }
- Рекурсия
Функция может вызывать саму себя:
int factorial (int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
- Параметры по умолчанию
void greet (string name = "Гость") {
cout << "Привет, " << name << "!";
}
greet(); // вывод: Привет, Гость!
22
23. Условные операторы (ветвления)
Условные операторы служат для того, чтобы выполнять разные инструкции(или блоки – составные инструкции) кода в зависимости от условий.
Конструкци
я
Синтаксис
Пример
If
if (условие) {
... }
if (age >= 18) { cout << "Взрослый"; }
if-else
if (условие) {
... } else { ... }
if (temp > 0) { cout << "Лёд тает"; } else { cout <<
"Лёд"; }
else if
Каскад
условий
if (score >= 90) grade = 'A';
else if (score >= 80) grade = 'B';
Выбор из
вариантов
switch (color) {
case 'R': cout << "Красный"; break;
case 'G': cout << "Зелёный"; break;
}
switch
23
24. Формирование условий
Формирование условий — это создание логических выражений, которыевозвращают true (истина) или false (ложь).
Операторы сравнения:
Оператор
Пример
Что проверяет
==
a == b
Равенство
!=
a != b
Неравенство
>
a>b
Больше
<
a<b
Меньше
>=
a >= b
Больше или равно
<=
a <= b
Меньше или равно
24
25.
Логические операторы:Комбинируют условия, работают с bool-значениями (true/false):
Оператор
Название
Что возвращает?
Пример
&&
Логическое И
true, только если оба операнда true
a && b
||
Логическое ИЛИ
true, если хотя бы один операнд true
a || b
!
Логическое НЕ
true, если операнд false (и наоборот)
!a
25
26.
Сложные условия:int x = 10, y = 20;
// x между 5 и 15 И y не равно 20
if ((x > 5 && x < 15) && y != 20) {
// ...
}
Приоритеты:
! (НЕ)
> >= < <=
== !=
&& (И)
|| (ИЛИ)
Скобки меняют порядок:
!a || b ≠ !(a || b)
26
27.
Особые случаиПроверка диапазонов:
// Число в интервале [0; 100]
if (num >= 0 && num <= 100) { ... }
Проверка на равенство с плавающей точкой:
double a = 0.1 + 0.2;
double b = 0.3; // Неправильно: if (a == b) → false из-за погрешности!
if (abs(a - b) < 0.0001) { ... } // Правильно
Короткие условия (short-circuit evaluation):
// Если ptr == nullptr, вторая проверка не выполнится:
if (ptr != nullptr && ptr->isValid()) { ... }
27
28. Циклы
Цикл – это обработка множеств. Если существует множество однотипныхэлементов, то при помощи цикла, можно единообразно и последовательно
осуществить обработку целевого подмножества элементов исходного
множества.
Цик
л
Синтаксис
Когда использовать
Пример
while
while
(условие)
{ ... }
Когда число итераций
неизвестно
while (battery > 0) {
robot.move(); battery--;
}
dowhile
do { ... } while
(условие);
Гарантированное
выполнение хотя бы 1 раз
do {
askPassword();
} while (!isValid);
for
for (иниц-ия;
условие; шаг)
{ ... }
Когда известно число
итераций
for ( int i = 0; i < 5; i++) {
cout << i;
} // вывод: 0 1 2 3 4
28
29. Управление памятью
Управление памятью в C++ — это ручное или автоматическоераспределение и освобождение оперативной памяти. От этого зависит
быстродействие и стабильность программы.
Типы памяти в C++:
Тип
Характеристики
Примеры
Стек
Автоматическое управление.
Быстрый доступ. Ограниченный
размер.
Локальные
переменные, аргументы
функций
Куча
(динамическая
память)
Ручное управление (new/delete).
Большой размер. Медленнее стека.
Объекты с длительным
временем жизни
Статическая
память
Глобальные переменные, static.
Существует всю жизнь программы.
static int counter;
29
30.
Как выделять память:int* num = new int(10);
// Выделили память под int (значение 10)
double* arr = new double[100]; // Массив из 100 double
Как освобождать память:
int* num = new int(10);
delete num; // Освободили 1 переменную
double* arr = new double[100];
delete[ ] arr; // Освободили массив ( [ ] обязательны!)
30
31.
Опасности ручного управленияПроблема
Последствия
Пример кода
Утечка
памяти
Память не освобождена →
программа "съедает" всю ОЗУ
int* p = new int; (нет delete)
Висячие
указатели
Указатель на уже удалённую
область
int* q = p; delete p;
*q = 5; // Crash!
Двойное
удаление
delete дважды → крах программы
delete p; delete p;
31
32.
Автоматическое управление (современный C++)Используйте умные указатели и контейнеры STL, чтобы избежать ручного delete:
▪ std::unique_ptr (эксклюзивное владение)
#include <memory>
// Память освободится автоматически при выходе из области видимости
std::unique_ptr<Book> book = std::make_unique<Book>("1984");
// это пример из ООП, в этом году НЕ изучается!
32
33. Указатели
Указатель – это переменная, хранящая адрес памяти другой переменной.Операции:
Операция
Синтаксис
Пример
Взятие адреса
&
int* ptr = &x;
Разыменование
*
int y = *ptr;
Арифметика
+, -, ++
ptr++;
int x = 10;
// Переменная
int* ptr = &x; // ptr хранит адрес x
cout << *ptr; // 10 (читаем значение через указатель)
*ptr = 20;
// Меняем x на 20 через указатель
33
34. Ссылки (References)
Ссылки – это «псевдоним» существующей переменной (альтернативное имя)Свойства:
Свойство
Пример
Обязательная
инициализация
int& ref = x;
Нельзя перенаправить
ref = y; // Присваивает значение, а не меняет
привязку
Связь с указателем
int*p=&ref;
Int& ref2=*p;
int x = 10;
int& ref = x; // ref — псевдоним для x
ref = 30;
cout << x;
// Теперь x = 30
// 30
34
35. Сравнение указателей и ссылок
КритерийУказатели
Ссылки
Инициализация Могут быть nullptr
Обязательна при
создании
Перепривязка
Можно менять адрес
Фиксированы навсегда
Синтаксис
Требуют * и ->
Работают как
переменные
Безопасность
Риск висячих
указателей
Безопаснее
Арифметика
Поддерживается
Нет
Версия C++
C/C++
Только C++
35
36. Константы
Константы — это именованные значения, которые нельзя изменить послеинициализации. Они гарантируют, что данные останутся неизменными на
протяжении всей программы.
Основные способы объявления:
Синтаксис
Особенности
Пример
const
Классический способ
const float PI =
3.14159;
constexpr (C++11)
Значение вычисляется на этапе
компиляции
constexpr int SIZE =
100;
Магические
числа
Не именованные, не
рекомендуется!
if (status == 3 ) ...
36
37. Магические числа
Магические числаМагические числа (Magic Numbers) — это числовые или строковые
литералы, встречающиеся прямо в коде без пояснений. Они получили
название "магические", потому что их значение и назначение неочевидно —
будто они появились по волшебству.
Почему они проблематичны:
Проблема
Пример кода
Последствия
Непонятное
назначение
if (status == 3)
{...}
Что означает 3? Ошибка? Успех?
Сложность
изменений
delay(30000);
Чтобы изменить задержку, нужно
искать все 30000 в коде
Ошибки
if (role == 1)
deleteUser();
Легко перепутать: 1 — это админ?
модератор?
Снижение
читаемости
tax = price * 0.2;
Что за 0.2? Ставка НДС? Налог с
продаж?
37
38.
Способы исправления:Заменить магические числа именованными константами с пояснительными
названиями.
До (плохо):
void process() {
if (user.getStatus() == 3) { // Что такое 3?
// ...
}
wait(5000); // 5 секунд? Почему именно столько?
double total = price * 1.2; // 1.2 — это что, налог?
}
После (лучше):
// Объявляем константы с понятными именами
constexpr int STATUS_BANNED = 3;
constexpr int DELAY_MS = 5000;
constexpr double TAX_RATE = 0.2;
void process() {
if (user.getStatus() == STATUS_BANNED) { // Сразу ясно!
// ...
}
wait(DELAY_MS);
38
double total = price * (1.0 + TAX_RATE);
}
39. Массивы (Arrays)
Массив — это контейнер фиксированного размера для элементов одноготипа, хранящихся в непрерывной памяти.
Ключевые свойства:
Характеристика
Описание
Фиксированный
размер
Размер определяется при создании и не
меняется
Индексация с 0
Первый элемент → arr [0]
Не проверяет границы
Выход за пределы → неопределённое
поведение (UB)
39
40.
Способы создания:1. Статический массив (на стеке):
int numbers[5]; // Неинициализированный
float temps[3] = {36.6, 0.5}; // Частичная инициализация (третий элемент = 0.0)
char word[ ] = "Hello"; // Автоматический размер (6 элементов, включая '\0')
2. Динамический массив (в куче):
int size = 10;
int* arr = new int[size]; // Выделение памяти
arr[0] = 42; // Работа как с обычным массивом
delete[ ] arr; // Обязательное освобождение памяти!
Доступ к элементам:
int nums[3] = {10, 20, 30};
cout << nums[1]; // 20 (индекс 1)
nums[2] = 50; // Изменение элемента - значения 30 на 50
40
41. Многомерные массивы
int matrix[2][3] = {{1, 2, 3},
{4, 5, 6}
};
cout << matrix[1][2]; // 6
41
42. Пример многомерного массива в куче (динамическая память)
int main() {const int ROWS = 3; // Константы вместо магических чисел!
const int COLS = 4;
// Выделяем память под массив указателей на строки
int** matrix = new int*[ROWS]; // Тип: указатель на указатель на int
// Выделяем память для каждой строки
for (int i = 0; i < ROWS; ++i) {
matrix[i] = new int [ COLS]; // Каждая строка — массив из COLS элементов
}
// Заполняем данными (формула: i*10 + j)
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
matrix[i][j] = i * 10 + j;
}
}
42
43.
// Выводим матрицуstd::cout << "Matrix:\n";
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
std::cout << matrix[i][j] << " ";
}
std::cout << "\n";
}
// Освобождаем память в обратном порядке
// Сначала удаляем каждую строку
for (int i = 0; i < ROWS; ++i) {
delete[ ] matrix[i]; // Ключевое: [ ] для массива
}
delete[ ] matrix; // Затем удаляем массив указателей
// Обнуляем указатель (защита от висячих ссылок)
matrix = nullptr;
return 0;
}
43
44. Общение с пользователем через консоль
#include<iostream>const int x=24;
float y = 3.14;
#define z “test”
std::cout<< x <<std::endl; // вывод на консоль значения x // 24
std::cin>>y; // ввод значения в y
std::cout<<y <<std::endl; // вывод y
std::cout<< z <<std::endl; // вывод “test”
44
45. Для желающих быстро научиться - проекты
Для желающих быстро научиться проектыНа следующих слайдах домашнее задание – 5 проектов! Кто желает,
можете их сделать и прислать мне на почту до следующей лекции.
На каждой лекции я буду давать по домашнему заданию.
Кто станет выполнять задания и присылать их результаты регулярно мне –
получит на экзамене автоматом отличную оценку.
Кроме того, можете приходить ко мне заниматься индивидуально, только
предварительно надо договориться – шлите письмо (заявку).
Также можете присылать любые вопросы в любое время на почту (адрес
на 1-ом слайде).
45
46. Домашнее задание. Создаем проект 1
4647. Сразу как задали имя проекта выбираем кнопку Finish
4748. Ничего не делаем, сразу выбираем Build Solution
4849. В свойствах проекта меняем Unicode на Multi Byte
4950. Запускаем исполнение программы (клавиша F5 или через меню) – если ошибок при создании программы нет, то:
5051. Создаем проект 2 – pr2
5152. Добавляем заголовочные файлы:
#include<iostream>#include<cmath>
// Задание:
// Объявите переменные:
int a = 10
double b = 3.1415
char c = 'Z'
/* Выполните преобразования:
Преобразуйте a в double
Преобразуйте b в int (с потерей дробной части)
Преобразуйте c в int (получите ASCII-код)
Выведите результаты в формате:
int -> double: 10.0 double -> int: 3 char -> int: 90 */
52
53. Создаем проект 3 – pr3, в котором добавляем заголовочные файлы, как в проекте 2.
Задание.Объявите переменную типа char с именем symbol и значением
'C'.
Используя арифметику символов, получите из 'C' символ 'F'
(подсказка: в ASCII между C и F разница 3 позиции).
Выведите на консоль оба символа и их числовые коды
53
54. Создаем проект 4
Объявите две переменные:double price = 15.99 (цена товара)
int quantity = 5 (количество товара)
Вычислите общую стоимость (totalCost) и выведите результат.
Объявите константу DISCOUNT = 0.1 (скидка 10%).
Пересчитайте стоимость с учетом скидки.
Выведите оба результата с пояснениями.
Пример вывода:
Общая стоимость: 79.95
Со скидкой: 71.955
54
55. Создаем проект 5 – pr5
Объявите переменные следующих типов и присвойте им значения:Целое число (int) с именем age и значением 25
Дробное число (double) с именем temperature и значением 36.6
Символ (char) с именем grade и значением 'A'
Логическое значение (bool) с именем isSunny и значением true
Выведите все переменные на экран в формате:
Возраст: 25 Температура: 36.6 Оценка: A Солнечно: да
55
56. Активно используем отладчик: клавиша F9 устанавливает точку остановки – в этот момент можно посмотреть, что внутри переменных
5657. В современных версиях следует удалить перед архивированием эти папки:
5758. Контрольная работа 1
Напишите программу на C++, которая вычисляет стоимость покупки сучётом скидки.
Эта программа должна совершать намеренную ошибку, а также её пояснение.
Задание:
Объявите константы для:
Цены одного товара (PRICE_PER_ITEM = 150.0)
Размера скидки (DISCOUNT = 15%)
Минимального количества для скидки (MIN_QUANTITY = 3)
Запросите у пользователя (std::cin ):
Количество товаров (quantity)
Вычислите:
Общую стоимость без скидки
Стоимость со скидкой (если quantity >= MIN_QUANTITY)
(Скидка применяется только при quantity >= MIN_QUANTITY)
Выведите результат в формате:
Стоимость без скидки: 300 руб.
Скидка: 15% (применена) Итоговая стоимость: 255 руб.
Если скидка не применяется:
Скидка: 0% (недостаточно товаров)
Итоговая стоимость: 300 руб.
58
programming