Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс осень 2021 – 2 занятие

ТиМПИ
September 17, 2021

Программирование – 1 курс осень 2021 – 2 занятие

ТиМПИ

September 17, 2021
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 17 сентября 2021 Абрамов Максим Викторович, Анастасия Олеговна Хлобыстова, Анастасия

    Андреевна Корепанова, Валерий Дмитриевич Олисеенко, Фёдор Витальевич Бушмелёв Введение в С++
  2. Правила получения зачёта 100 баллов • 46 за практические •

    54 за домашние A — 90 B — 80 C — 70 D — 65 E — 60 • Проверочная работа — обязательное условия для получения зачёта • Посещение 22 балла • Доклад 8 баллов • Первый сдавший +2 балла за сложную +1 балл за среднюю • 2 балла • 4 балла • 6 баллов
  3. План • 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 — Приём задач
  4. История языка Стандарт языка программирования — это предмет документации, который

    определяет язык программирования, чтобы пользователи и разработчики языка могли согласовывать, что означают программы на данном языке.
  5. Философия языка C++ • Максимальная обратная совместимость с С, но

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

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

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

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

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

    компьютере представлены данные: Введение
  11. Трансляция программы — преобразование программы, представленной на одном из языков

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

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

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

    запуске программы Скомпилированная программа работает быстро Интерпретируемая программа работает медленно Скомпилированная программа работает только на той платформе, для которой скомпилирована Интерпретируемая программа работает на любой платформе, на которой есть интерпретатор При внесении правок в код требуется перекомпиляция При внесении правок в код программу можно сразу перезапускать Статическая типизация Динамическая типизация Компиляция Интерпретация
  15. • Объединяет компиляцию и интерпретацию: сначала программа компилируется в байт-код,

    дальше передаётся интерпретатору, который её исполняет • Байт-код компактнее, чем исходный код и быстрее интерпретируется • Название байт-код было выбрано потому, что для кодирования каждой операции используется ровно один байт. Компиляция в байт-код Примеры языков: ?
  16. • Компиляция: Asm, C++, C, Haskell, Pascal, Rust, Kotlin •

    Интерпретация: Perl, JavaScript, Python, PHP • Компиляция в байт-код: C#, Java, Kotlin Трансляция разных языков программирования
  17. Плюсы: 1. Эффективность: программа компилируется для конкретной платформы 2. Нет

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

    .cpp , .CPP , .c++ , .cp , или .cxx Заголовочные файлы Расширения .h , .hpp main.cpp foofile.cpp foofile.hpp
  19. 1. Препроцессор работает с файлами программы как с текстовыми файлами.

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

    Open watcom • Intel C++ compiler • …. Компиляторы Существует множество различных компиляторов C++, они имеют различия в реализованных оптимизациях кода, реализации стандарта, возможных ошибках и т.д. Мы будем использовать Сравнение компиляторов: http://citforum.ru/programming/C_comp/
  21. Почему Visual Studio? • Высокая популярность¹ • Мультиплатформенность (Windows, MacOS,

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

    исполняемую программу, библиотеку. Решение — контейнер для одного и более проекта в Visual Studio. Создание проекта Выбор шаблона Настройка проекта
  23. Ориентация в проекте Обозреватель решений Действия для создания исходного файла:

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

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

    инструмент для приостановки выполнения кода
  26. Переменные • Переменная – это поименованная область памяти, либо адресуемая

    иным способом область памяти, по адресу которой можно хранить данные. Например, промежуточные результаты вычислений или введенные в программу извне значения. • Каждая переменная имеет тип, имя и значение. • Имя переменной: латинские буквы; цифры; знак подчеркивания. Без пробелов; не ключевые слова; регистр имеет значение! • В С++ существует 6 стандартных типов данных: пустой; логический; символьный; целочисленный; с плавающей точкой; и перечисление. • Объявление переменной: тип_переменной имя_переменной_1, …, имя_переменной_N; или varType varName1, varName2, varName3, …, varNameN; Не обижайте «точку с запятой», не забывайте ее ставить в конце выражения!
  27. Типы переменных Название Тип Количество байт Диапазон значений Пример 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 мантисса)
  28. Ошибки при объявлении переменных Правило: избегайте объявления нескольких переменных в

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

    Копирующая инициализация. Способ №2: Прямая инициализация.
  30. Инициализация переменных 2/3 Способ №3: Uniform-инициализация. Способ №4: Агрегатная инициализация.

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

    = value; для простых типов Агрегатная инициализация = {args}; и = {}; для агрегатной инициализации и инициализации списком Uniform-инициализация {args}; и {}; для передачи и возврата врéменных объектов Прямая инициализация (args); для вызова конструкторов (нельзя использовать для инициализации списком) Используйте прямую инициализацию или Uniform-инициализацию.
  32. Ввод / вывод переменных 1/2 Библиотека «iostream»: 1. объект std::cout

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

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

    плюс +a Унарный минус –a Префиксный инкримент ++a Постфиксный (суффиксный) инкримент a++ Префиксный декримент --a Постфиксный (суффиксный) декримент a--
  35. Базовые операторы: сравнение Оператор Обозначение Результат Больше 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)
  36. Базовые операторы: условные операторы ЕСЛИ (условие) ТО выражение1; ИНАЧЕ выражение2;

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

    И 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 Двуместный
  38. Базовые операторы: условные операторы Тернарный условный оператор If (условие) выражение1;

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

    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
  40. Базовые операторы: присваивание 1/2 Простое присваивание: «=» • Операторы присваивания

    возвращают значение объекта, указанного левым операндом после присваивания. • Результирующий тип — это тип левого операнда. • В отличие от инициализации существует только присваивание копированием.
  41. Базовые операторы: присваивание 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
  42. Базовые операторы: циклы • Цикл for: • Цикл while: •

    Цикл do-while: • Ключевые слова break и continue. for (переменные; условие; шаг_цикла) { // тело_цикла; } while (условие) {тело_цикла;} do {тело_цикла;} while (условие);
  43. Типы переменных: пустой тип (void) Тип void — тип данных,

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

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

    перечислителям в одном перечислении, без веской причины.
  46. Базовые операторы: ветвление switch (varValue) { case значение1: /* блок

    выражений1 */; break; case значение2: /* блок выражений2 */; break; // … default: /* блок по молчанию */; break; }
  47. Константы Правило: Любая переменная, которая не должна изменять свое значение

    после инициализации, должна быть объявлена с помощью спецификатора const (или constexpr).
  48. Базовые операторы: goto Оператор goto — это оператор управления потоком

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

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

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

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

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

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

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

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

    Андреевна Корепанова, Валерий Дмитриевич Олисеенко, Фёдор Витальевич Бушмелёв Введение в С++