Slide 1

Slide 1 text

17 сентября 2021 Абрамов Максим Викторович, Анастасия Олеговна Хлобыстова, Анастасия Андреевна Корепанова, Валерий Дмитриевич Олисеенко, Фёдор Витальевич Бушмелёв Введение в С++

Slide 2

Slide 2 text

Правила получения зачёта 100 баллов • 46 за практические • 54 за домашние A — 90 B — 80 C — 70 D — 65 E — 60 • Проверочная работа — обязательное условия для получения зачёта • Посещение 22 балла • Доклад 8 баллов • Первый сдавший +2 балла за сложную +1 балл за среднюю • 2 балла • 4 балла • 6 баллов

Slide 3

Slide 3 text

План • 06.09 — Вводное занятие. Введение в C++ • 17.09 — Введение в C++ • 24.09 — Выражения и операторы. Функции. Github, контроль версий • 01.10 — Удалённое практическое занятие • 08.10 — Массивы, сортировки, поиск. Сложность алгоритмов • 15.10 — Указатели • 22.10 — Библиотека ввода и вывода • 29.10 — Проверочная работа • 12.11 — Структуры на указателях • 19.11 — Деревья • 26.11 — Хеш-таблицы, хеш-функции • 03.12 — Графы • 10.12 — Приём задач • 17.12 — Приём задач

Slide 4

Slide 4 text

17 сентября 2021 [email protected] Анастасия Олеговна Хлобыстова Общая структура программы

Slide 5

Slide 5 text

История языка Bjarne Stroustrup: Why I Created C++

Slide 6

Slide 6 text

История языка НАДЁЖНОСТЬ

Slide 7

Slide 7 text

История языка Стандарт языка программирования — это предмет документации, который определяет язык программирования, чтобы пользователи и разработчики языка могли согласовывать, что означают программы на данном языке.

Slide 8

Slide 8 text

Философия языка C++ • Максимальная обратная совместимость с С, но не полная • Множество стилей − процедурное программирование − ООП − обобщенное программирование (STL алгоритмы) − метапрограммирование (boost.spirit) • Не платить за то, что не используешь • Избегать платформозависимых особенностей

Slide 9

Slide 9 text

Применимость Программы с высокими требованиями к ресурсам компьютера: процессору и памяти • OS и сопутствующие программы (Windows, KDE) • драйверы/встроенные системы • научные программы • игры/симуляторы • сервера с высокой нагрузкой (google search) Возможно, не лучший выбор для: • клиентских частей web-приложений • программ-сценариев (лучше скрипты) • приложений нетребовательных к ресурсам Универсальность порождает сложность • более высокий порог вхождения чем Java, С#, Python

Slide 10

Slide 10 text

Структура программы Каждая программа на языке С++ должна иметь как минимум одну функцию — функцию main(). С main() начинается выполнение программы. Функция — блок кода, поэтому ее тело обрамляется фигурными скобками, между которыми определяется набор инструкций. Определение функции main начинается с возвращаемого типа — число. Поэтому ее определение начинается с ключевого слова int. Тело функции состоит из набора инструкций. Каждая инструкция (statement) выполняет определенное действие. точка входа в программу

Slide 11

Slide 11 text

Заголовочные файлы — основной способ подключить к программе типы данных, структуры, прототипы функций, перечисляемые типы и макросы, используемые в другом модуле. Заголовочные файлы iostream — заголовочный файл с классами, функциями и переменными для организации ввода- вывода в языке программирования C++. Библиотека iostream определяет три стандартных потока: • cin стандартный входной поток (stdin в С) • cout стандартный выходной поток (stdout в С) • cerr стандартный поток вывода сообщений об ошибках (stderr в С) string — класс с методами и переменными для организации работы со строками в языке программирования C++. cstdlib — определяет несколько функций общего назначения, включая динамическое управление памятью, генерацию случайных чисел, связь с окружающей средой, целочисленную арифметику, поиск, сортировку и преобразование.

Slide 12

Slide 12 text

Пространство имён Пространство имен — это декларативная область, в рамках которой определяются различные идентификаторы (имена типов, функций, переменных, и т. д.). Используется для организации кода в виде логических групп и с целью избежания конфликтов имен, которые могут возникнуть, особенно в таких случаях, когда база кода включает несколько библиотек.

Slide 13

Slide 13 text

17 сентября 2021 [email protected] Анастасия Андреевна Корепанова Процесс компиляции программы на C++

Slide 14

Slide 14 text

Как человек пишет программу на языке высокого уровня: Как в компьютере представлены данные: Введение

Slide 15

Slide 15 text

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Основные подходы к трансляции программы: • компиляция • в машинный код • в байт-код • интерпретация Трансляция программы

Slide 16

Slide 16 text

• Компилятор — это компьютерная программа, которая переводит компьютерный код, написанный на одном языке программирования, на другой язык. • В основном используется для программ, которые переводят исходный код с языка программирования высокого уровня на язык более низкого уровня (например, язык ассемблера, объектный код или машинный код) для создания исполняемой программы. • После компиляции программе не нужно дополнительное программное обеспечение для запуска. • Программа компилируется под конкретную платформу. • Статическая типизация Компиляция в машинный код (1) Примеры языков: Asm, C++, C, Haskell, Pascal, Rust

Slide 17

Slide 17 text

Компиляция в машинный код (2) Источник: https://stepik.org/course/7/info

Slide 18

Slide 18 text

• Интерпретатор сам выполняет программу построчно • Интерпретатор реализует виртуальную машину, «машинным языком» которой является высокоуровневый язык (на котором написана интерпретируемая программа) • Программа может работать на любой платформе, на которой есть интерпретатор • Работает медленнее, чем скомпилированная программа, потому что интерпретатору необходимо анализировать программу в процессе исполнения, так же у компилятора больше времени на оптимизацию кода • Динамическая типизация Интерпретация (1) Примеры языков: Perl, JavaScript, Python, PHP

Slide 19

Slide 19 text

Интерпретация (2) Источник: https://stepik.org/course/7/info

Slide 20

Slide 20 text

Компиляция vs Интерпретация Выполняется один раз Выполняется каждый раз при запуске программы Скомпилированная программа работает быстро Интерпретируемая программа работает медленно Скомпилированная программа работает только на той платформе, для которой скомпилирована Интерпретируемая программа работает на любой платформе, на которой есть интерпретатор При внесении правок в код требуется перекомпиляция При внесении правок в код программу можно сразу перезапускать Статическая типизация Динамическая типизация Компиляция Интерпретация

Slide 21

Slide 21 text

• Объединяет компиляцию и интерпретацию: сначала программа компилируется в байт-код, дальше передаётся интерпретатору, который её исполняет • Байт-код компактнее, чем исходный код и быстрее интерпретируется • Название байт-код было выбрано потому, что для кодирования каждой операции используется ровно один байт. Компиляция в байт-код Примеры языков: ?

Slide 22

Slide 22 text

Компиляция в байт-код Источник: https://stepik.org/course/7/info

Slide 23

Slide 23 text

• Компиляция: Asm, C++, C, Haskell, Pascal, Rust, Kotlin • Интерпретация: Perl, JavaScript, Python, PHP • Компиляция в байт-код: C#, Java, Kotlin Трансляция разных языков программирования

Slide 24

Slide 24 text

Плюсы: 1. Эффективность: программа компилируется для конкретной платформы 2. Нет необходимости устанавливать стороннее ПО для запуска итогового приложения 3. Во время компиляции можно оптимизировать код Минусы: 1. Компиляция может занять много времени 2. При любом изменении в коде программы ещё надо перекомпилировать заново 3. Для каждой платформы программу нужно компилировать отдельно Плюсы и минусы компиляции

Slide 25

Slide 25 text

Файлы с кодом Файлы программы Расширения .C , .cc , .cpp , .CPP , .c++ , .cp , или .cxx Заголовочные файлы Расширения .h , .hpp main.cpp foofile.cpp foofile.hpp

Slide 26

Slide 26 text

1. Препроцессор работает с файлами программы как с текстовыми файлами. Выполняет некоторые замены в тексте программы, добавляет служебную информацию Процесс компиляции C++ (1)

Slide 27

Slide 27 text

2. Компилятор преобразует полученные файлы в машинный код. Каждый файл отдельно. Процесс компиляции C++ (2)

Slide 28

Slide 28 text

3. Компоновщик собирает получившиеся объектные файлы в программу Процесс компиляции C++ (3)

Slide 29

Slide 29 text

Процесс компиляции C++ (4) Источник: https://teccxx.neocities.org/mx1/program_translation.html

Slide 30

Slide 30 text

• Microsoft Visual C++ • G++ • Borland C++ • Open watcom • Intel C++ compiler • …. Компиляторы Существует множество различных компиляторов C++, они имеют различия в реализованных оптимизациях кода, реализации стандарта, возможных ошибках и т.д. Мы будем использовать Сравнение компиляторов: http://citforum.ru/programming/C_comp/

Slide 31

Slide 31 text

17 сентября 2021 [email protected] Валерий Дмитриевич Олисеенко ассистент кафедры информатики Среда разработки Visual Studio. Отладка программ.

Slide 32

Slide 32 text

Почему Visual Studio? ● Высокая популярность¹ ● Мультиплатформенность (Windows, MacOS, Linux²) ● Легкая к освоению ● Мощная система подсказок и поиска ошибок ● Бесплатная версия (Visual Studio Community Edition) ● Широкая возможность настройки «под себя» ● Наличие множества языков программирования ¹ Источник: https://itvdn.com/ru/blog/article/cplspls-top7 ² В версии Visual Studio Code

Slide 33

Slide 33 text

Установка среды visualstudio.microsoft.com

Slide 34

Slide 34 text

Настройка среды

Slide 35

Slide 35 text

Создание проекта Проект содержит все файлы, которые будут скомпилированы в исполняемую программу, библиотеку. Решение — контейнер для одного и более проекта в Visual Studio. Создание проекта Выбор шаблона Настройка проекта

Slide 36

Slide 36 text

Ориентация в проекте Обозреватель решений Действия для создания исходного файла: Исходные файлы (ПКМ) —> Добавить —> Создать элемент. Добавление нового элемента

Slide 37

Slide 37 text

Запуск программы Первая программа Результат выполнения Отладка — F5

Slide 38

Slide 38 text

Отладка Отладка — процесс обнаружения и устранения ошибок в коде. Типы ошибок в коде: ● Синтаксическая (warning, ошибка компиляции) ● Логическая Для поиска ошибки во время отладки необходимо ответить на два вопроса: ● Что именно должен был выполнить код? ● Что произошло вместо этого?

Slide 39

Slide 39 text

Отладчик и точка остановы Пример логической ошибки Точка остановы — инструмент для приостановки выполнения кода

Slide 40

Slide 40 text

Точка остановы Установка точки остановы

Slide 41

Slide 41 text

Точка остановы. Анализ переменных. Анализ переменных

Slide 42

Slide 42 text

Точка остановы. Задание переменных. Контекстное меню Окно «Видимые»

Slide 43

Slide 43 text

Работа с точкой остановы Шаг с заходом, шаг с обходом, шаг с выходом

Slide 44

Slide 44 text

Шаг с заходом Шаг с заходом (F11)

Slide 45

Slide 45 text

Шаг с обходом Шаг с обходом (F10)

Slide 46

Slide 46 text

Шаг с выходом Шаг с выходом (SHIFT+F11)

Slide 47

Slide 47 text

Переменные и базовые операторы. Стайлгайд сентябрь 2021 Фёдор Витальевич Бушмелёв [email protected]

Slide 48

Slide 48 text

17 сентября 2021 [email protected] Федор Витальевич Бушмелев Переменные и базовые операторы. Стайлгайд

Slide 49

Slide 49 text

Переменные • Переменная – это поименованная область памяти, либо адресуемая иным способом область памяти, по адресу которой можно хранить данные. Например, промежуточные результаты вычислений или введенные в программу извне значения. • Каждая переменная имеет тип, имя и значение. • Имя переменной: латинские буквы; цифры; знак подчеркивания. Без пробелов; не ключевые слова; регистр имеет значение! • В С++ существует 6 стандартных типов данных: пустой; логический; символьный; целочисленный; с плавающей точкой; и перечисление. • Объявление переменной: тип_переменной имя_переменной_1, …, имя_переменной_N; или varType varName1, varName2, varName3, …, varNameN; Не обижайте «точку с запятой», не забывайте ее ставить в конце выражения!

Slide 50

Slide 50 text

Типы переменных Название Тип Количество байт Диапазон значений Пример enum целочисленный / варьируется не определено / соизмеримо с int не определено enum Alphabet{a, b, c}; void пустой не определено пусто не определено bool логический 1 true (1)/false (0) bool bValue = true (1); char символьный / целочисленный 1 (обычно) от -128 до 127 в ASCII char chValue = ‘a’; signed char 1 от -128 до 127 в ASCII unsigned char 1 от 0 до 255 в ASCII wchar_t 2 от 0 до 65 535 в ASCII short (short int, signed short int) целочисленный 2 от -32 768 до 32 767 int nValue = 2; unsigned short (unsigned short int) 2 от 0 до 65 535 int (signed, long, long int, signed long int) 4 от -2 147 483 648 до 2 147 483 647 unsigned int (unsigned, unsigned long, unsigned long int) 4 от 0 до 4 294 967 295 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 float вещественный (с плавающей точкой) 4 3.4E +/- 38 (1 знак, 8 экспонента, 23 мантисса) double dValue = 1.5; double (long double) 8 1.7E +/- 308 (1 знак, 11 экспонента, 52 мантисса)

Slide 51

Slide 51 text

Ошибки при объявлении переменных Правило: избегайте объявления нескольких переменных в одной строке, если не собираетесь инициализировать каждую из них. Ошибка №1: указывать одинаковый тип у каждой переменной в рамках утверждения. НЕПРАВИЛЬНО ПРАВИЛЬНО Ошибка №2: использовать разные типы данных в одном утверждении. Ошибка №3: инициализировать две и более переменные с помощью одной операции. НЕПРАВИЛЬНО ПРАВИЛЬНО НЕПРАВИЛЬНО ПРАВИЛЬНО

Slide 52

Slide 52 text

Инициализация переменных 1/3 Способ №0: Инициализация по умолчанию. Способ №1: Копирующая инициализация. Способ №2: Прямая инициализация.

Slide 53

Slide 53 text

Инициализация переменных 2/3 Способ №3: Uniform-инициализация. Способ №4: Агрегатная инициализация. Способ №5: Назначенная инициализация. (ТОЛЬКО в С++20) Способ №6: Прямая инициализация агрегатных типов. (ТОЛЬКО в С++20)

Slide 54

Slide 54 text

Инициализация переменных 3/3 Кратко: Итоги: Тип Объявление Комментарий Инициализация копированием = value; для простых типов Агрегатная инициализация = {args}; и = {}; для агрегатной инициализации и инициализации списком Uniform-инициализация {args}; и {}; для передачи и возврата врéменных объектов Прямая инициализация (args); для вызова конструкторов (нельзя использовать для инициализации списком) Используйте прямую инициализацию или Uniform-инициализацию.

Slide 55

Slide 55 text

Ввод / вывод переменных 1/2 Библиотека «iostream»: 1. объект std::cout – выводит данных на экран (в консоль); 2. объект std::cin – получает данные от пользователя; 3. объект std::endl – вставляет символ новой строки. Оператор ввода: >> (используется в паре с std::cin) Оператор вывода: << (используется в паре с std::cout)

Slide 56

Slide 56 text

Базовые операторы: арифметические 1/2 Бинарные (двуместные) операторы: Операция Обозначение Сложение a + b Вычитание a – b Умножение a * b Деление a / b Остаток целочисленного деления a % b

Slide 57

Slide 57 text

Базовые операторы: арифметические 2/2 Унарные (одноместные) операторы: Операция Обозначение Унарный плюс +a Унарный минус –a Префиксный инкримент ++a Постфиксный (суффиксный) инкримент a++ Префиксный декримент --a Постфиксный (суффиксный) декримент a--

Slide 58

Slide 58 text

Базовые операторы: сравнение Оператор Обозначение Результат Больше a > b true (1), если a больше b, в противном случае — false (0) Меньше a < b true (1), если a меньше b, в противном случае — false (0) Больше или равно a >= b true (1), если a больше/равно b, в противном случае — false (0) Меньше или равно a <= b true (1), если a меньше/равно b, в противном случае — false (0) Равно a == b true (1), если a равно b, в противном случае — false (0) Не равно a != b true (1), если a НЕ равно b, в противном случае — false (0)

Slide 59

Slide 59 text

Базовые операторы: условные операторы ЕСЛИ (условие) ТО выражение1; ИНАЧЕ выражение2; If (условие) { выражение1; } else { выражение2; } Обозначение оператора условного ветвления:

Slide 60

Slide 60 text

Базовые операторы: логические операторы Значения Логическое НЕ Логическое ИЛИ Логическое И a b !a a || b a && b true (1) true (1) false (0) true (1) true (1) true (1) false (0) false (0) true (1) false (0) false (0) true (1) true (1) true (1) false (0) false (0) false (0) true (1) false (0) false (0) Оператор Обозначение Тип Логическое НЕ !a Унарный Логическое И a && b Двуместный Логическое ИЛИ a || b Двуместный

Slide 61

Slide 61 text

Базовые операторы: условные операторы Тернарный условный оператор If (условие) выражение1; else выражение2; Вместо (условие) ? выражение1 : выражение2; Существует Совет: • Всегда заключайте в скобки условную часть тернарного оператора, а лучше весь тернарный оператор. • Используйте условный тернарный оператор только в тривиальных случаях.

Slide 62

Slide 62 text

Базовые операторы: битовые Оператор Обозначение Результат Пример Побитовый сдвиг влево a << b Все биты в a сдвигаются влево на b количество бит влево 3 10 = 00112 310 << 2 = 11002 = 1210 310 << 3 = 10002 = 810 Побитовый сдвиг вправо a >> b Все биты в a сдвигаются влево на b количество бит вправо 12 10 = 11002 12 >> 1 = 01102 = 610 12 >> 3 = 00012 = 110 Побитовое НЕ ~a Все биты в a меняются на противоположные ~410 = ~01002 = 10112 = 1110 Побитовое И a & b Каждый бит в a И каждый соответствующий ему бит в b 5 10 & 610 = 01012 & 01102 = 01002 = 410 Побитовое ИЛИ a | b Каждый бит в a ИЛИ каждый соответствующий ему бит в b 5 10 | 610 = 01012 | 01102 = 01112 = 710 Побитовое исключающее ИЛИ (XOR) a ^ b Каждый бит в a XOR каждый соответствующий ему бит в b 5 10 ^ 610 = 01012 ^ 01102 = 00112 = 310

Slide 63

Slide 63 text

Базовые операторы: присваивание 1/2 Простое присваивание: «=» • Операторы присваивания возвращают значение объекта, указанного левым операндом после присваивания. • Результирующий тип — это тип левого операнда. • В отличие от инициализации существует только присваивание копированием.

Slide 64

Slide 64 text

Базовые операторы: присваивание 2/2 Оператор Обозначение Результат Оператор Обозначение Результат Присваивание с умножением a *= b a = a * b Присваивание с побитовым сдвигом влево a <<= b a = a << b Присваивание с делением a /= b a = a / b Присваивание с побитовым сдвигом вправо a >>= b a = a >> b Присваивание с остатком целочисленного деления a %= b a = a % b Присваивание с побитовым И a &= b a = a & b Присваивание со сложением a += b a = a + b Присваивание с побитовым сдвигом влево a ^= b a = a ^ b Присваивание с вычитанием a –= b a = a – b Присваивание с побитовым ИЛИ a |= b a = a | b

Slide 65

Slide 65 text

Базовые операторы: циклы • Цикл for: • Цикл while: • Цикл do-while: • Ключевые слова break и continue. for (переменные; условие; шаг_цикла) { // тело_цикла; } while (условие) {тело_цикла;} do {тело_цикла;} while (условие);

Slide 66

Slide 66 text

Область видимости

Slide 67

Slide 67 text

Типы переменных: пустой тип (void) Тип void — тип данных, который означает «отсутствие любого типа данных». Варианты использования типа «void»:

Slide 68

Slide 68 text

Типы переменных: перечисление (enum) 1/2 Перечисление (или «перечисляемый тип») — это тип данных, где любое значение (или «перечислитель») определяется как символьная константа. • Объявление перечисления: enum varName { перечислитель1, перечислитель2, …, перечислительN }; • Для перечислителей следует указывать уникальные префиксы, поскольку перечислители вместе с перечислением находятся в едином пространстве имен. • Каждому перечислителю автоматически присваивается целочисленное значение по возрастанию в зависимости от его позиции в списке перечисления (по умолчанию начиная с 0). • Объявление перечислений не требует выделения памяти. Память выделяется только при определении.

Slide 69

Slide 69 text

Типы переменных: перечисление (enum) 2/2 Правило: Не присваивайте одинаковые значения перечислителям в одном перечислении, без веской причины.

Slide 70

Slide 70 text

Базовые операторы: ветвление switch (varValue) { case значение1: /* блок выражений1 */; break; case значение2: /* блок выражений2 */; break; // … default: /* блок по молчанию */; break; }

Slide 71

Slide 71 text

Структуры

Slide 72

Slide 72 text

Константы Правило: Любая переменная, которая не должна изменять свое значение после инициализации, должна быть объявлена с помощью спецификатора const (или constexpr).

Slide 73

Slide 73 text

Базовые операторы: goto Оператор goto — это оператор управления потоком выполнения программ, который заставляет центральный процессор выполнить переход из одного участка кода в другой (осуществить прыжок к метке). Другой участок кода идентифицируется с помощью метки/лейбла. Правило: НЕ используйте оператор goto!

Slide 74

Slide 74 text

Стайлгайд: введение Стайлгайд (др.: руководство по стилю кода, стандарт оформления кода) — это документ, содержащий свод правил, стандартов и лучших практик, на основе которых будет строиться конкретный проект. Основные правила стайлгайда: !!! ВСЕГДА СЛЕДОВАТЬ !!! !!! СТАЙЛГАЙДУ ПРОЕКТА !!! Программы пишутся для людей, а не для компьютера!

Slide 75

Slide 75 text

Стайлгайд: пробелы и отступы • Бинарные (двуместные) операторы и ключевые слова выделяются пробелами. • Фигурные скобки выделяются пробелами. • Делим длинные строки (более 100 символов) после оператора при помощи переноса строки. • Оставляем пустые строки между группами выражений.

Slide 76

Slide 76 text

Стайлгайд: названия и переменные • Названия имеют конкретный смысл. • Переменные – сamelCase, константы – UPPER_SNAKE_CASE, типы – с заглавной, классы – PascalCase • Старайтесь избегать однобуквенных и односложных названий (например x, a1 и т.д.) • Всегда инициализируем переменные! • Избавляемся от переменных, ищем константы. • Для названий функций используйте конкретные активные глаголы, без банальностей; возможно указание возвращаемых значений;

Slide 77

Slide 77 text

Стайлгайд: область видимости • По возможности сужаем область видимости переменных. • Глобальные переменные – очень плохо; глобальными бывают только константы. • По возможности использовать максимально узкие типы из подходящих (пихать int в double плохо!)

Slide 78

Slide 78 text

Стайлгайд: базовые выражения • Один оператор на одной строке. • Старайтесь ставить побольше фигурных скобок (особенно при if/else, for, while). • Старайтесь избегать использования выражений break или continue. • for – чёткий; while – нечеткий. • Оператор go to проклят и вышел из чата – в общем, табу! • Нет текстовым строкам из char*, любим string.

Slide 79

Slide 79 text

Стайлгайд: чрезмерность и понятность • Нет копипасту! Если что-то можно сократить – сокращаем. • Открывающая фигурная скобка находится на строке с оператором/функцией и т.д. • Одна функция – одно действие; одна переменная – одна конкретная характеристика. • Старайтесь избегать лишних тестов if. • Не проверяйте значения логического типа, используя == или != с true или false. • При многоповторном использовании результата создавайте для него отдельную переменную. • Не стоит хранить в функции возвращаемом значении, а просто верните его. • Всегда используем class, а struct только для маленького и простого типа данных.

Slide 80

Slide 80 text

Стайлгайд: комментарии • Многострочные – /* тут комментарий во много строк */. • Однострочный – // тут комментарий всего в одну. • При сдаче кода //TODO быть не должно, либо удаляем, либо закрываем. • Заглавный комментарий – описывает назначение файла, вверху каждого файла; • Заголовок функции / конструктора – заголовочный комментарий должен быть на каждом конструкторе и функции вашего файла и описывает поведение и / или цель функции. • Параметры / возврат – кратко описываем цель и смысл принимаемых параметров и возвращаемых значений. • Исключения – добавить описания для ошибочных сценариев. • Комментарии на одной строке – если секция кода длинна, сложна или непонятна, то кратко описываем её назначение.

Slide 81

Slide 81 text

17 сентября 2021 Абрамов Максим Викторович, Анастасия Олеговна Хлобыстова, Анастасия Андреевна Корепанова, Валерий Дмитриевич Олисеенко, Фёдор Витальевич Бушмелёв Введение в С++