Учебники по программированию

 

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

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

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

  • Креативность в дизайне и пользовательском опыте
    Программирование выходит за рамки решения проблем и включает в себя разработку удобных интерфейсов и увлекательный пользовательский опыт. Этот аспект объединяет художественную чувствительность с техническими знаниями. Программисты занимаются дизайном пользовательского интерфейса (UI) и взаимодействия с пользователем (UX), используя эстетику, интуитивно понятную навигацию и привлекательные визуальные элементы для создания программного обеспечения, которое восхищает и очаровывает пользователей. Искусство заключается в плавном сочетании функциональности с эстетической привлекательностью, преобразовании сложных функций в интуитивно понятный и визуально приятный дизайн. С помощью ООП программисты могут разделять задачи и создавать отдельные объекты, отвечающие за разные аспекты программного обеспечения. Этот модульный подход способствует творчеству в дизайне, позволяя программистам сосредоточиться на отдельных объектах, их взаимодействии и общем поведении системы. Используя принципы ООП, такие как наследование и полиморфизм, программисты могут разрабатывать программное обеспечение с интуитивно понятным интерфейсом, удобным пользовательским интерфейсом и визуально привлекательной эстетикой.

  • Программная инженерия как искусство
    Программная инженерия, дисциплина компьютерных наук, подчеркивает художественный аспект программирования. Он охватывает весь жизненный цикл разработки программного обеспечения, от сбора требований до развертывания и обслуживания. Инженеры-программисты подходят к программированию как архитекторы, разрабатывая системы и платформы, которые являются надежными, масштабируемыми и удобными в сопровождении. Они учитывают такие факторы, как модульность кода, возможность повторного использования и архитектурные шаблоны, создавая программные решения, сочетающие функциональность и элегантность. Искусство разработки программного обеспечения заключается в том, чтобы сбалансировать технические ограничения, потребности пользователей и цели проекта для создания программного обеспечения, которое является одновременно функциональным и эстетически привлекательным. ООП играет ключевую роль в разработке программного обеспечения, обеспечивая структурированный подход к управлению сложностью. Разделение кода на классы и объекты позволяет разработчикам программного обеспечения проектировать системы, которые являются модульными, повторно используемыми и удобными в сопровождении. Благодаря правильной абстракции и инкапсуляции разработчики программного обеспечения могут найти баланс, в результате чего программное обеспечение будет одновременно функциональным и элегантным.

  • Инновации и социальное воздействие
    Искусство программирования и информатики выходит за рамки технологического сектора, воздействуя на отрасли и общество в целом. От здравоохранения до финансов, от образования до развлечений, программирования и информатики революционизируют то, как мы работаем, общаемся и живем. Такие инновации, как искусственный интеллект, виртуальная реальность и технология блокчейн, меняют отрасли и открывают новые горизонты. Программисты и компьютерщики играют ключевую роль в этих преобразующих достижениях, раздвигая границы возможного и превращая идеи в реальность. ООП позволяет программистам создавать инновационные решения, революционизирующие различные области. Управляя сложностью с помощью модульной и расширяемой природы ООП, программисты могут разрабатывать сложные системы, такие как алгоритмы искусственного интеллекта, иммерсивные возможности виртуальной реальности и безопасные приложения блокчейна. Эти достижения меняют отрасли, повышают производительность и улучшают качество жизни людей во всем мире.

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

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

  1. Инкапсуляция.
    Инкапсуляция — это фундаментальный принцип объектно-ориентированной парадигмы, который способствует объединению данных и методов внутри объектов. Эта инкапсуляция скрывает внутренние сложности объекта, открывая только необходимые интерфейсы для взаимодействия с ним. Скрывая детали реализации, инкапсуляция снижает сложность других частей системы, позволяя разработчикам сосредоточиться на высокоуровневых абстракциях. Это способствует модульности и повышает читабельность кода, облегчая понимание и обслуживание сложных систем.

  2. Абстракция.
    Абстракция — еще одна ключевая концепция объектно-ориентированной парадигмы, помогающая управлять сложностью. Это позволяет разработчикам представлять сложные объекты реального мира в виде классов, абстрагируя ненужные детали. Создавая абстрактные классы и интерфейсы, разработчики могут определять общее поведение и атрибуты, которые могут наследоваться и реализовываться несколькими подклассами. Эта иерархическая организация классов позволяет разработчикам управлять сложностью, разбивая сложные системы на более мелкие и более управляемые компоненты. Каждый класс фокусируется на своих конкретных обязанностях, что приводит к более модульной и понятной кодовой базе.

  3. Наследование.
    Наследование — это мощный механизм, предоставляемый объектно-ориентированной парадигмой, который способствует повторному использованию кода и уменьшает избыточность. Это позволяет новым классам наследовать свойства и поведение от существующих классов, устанавливая между ними отношение «является». Наследование помогает управлять сложностью, позволяя разработчикам определять базовый класс с общими атрибутами и поведением, а затем создавать специализированные классы, которые наследуются от него. Эта иерархическая организация классов устраняет необходимость дублирования кода, снижает сложность и повышает удобство сопровождения.

  4. Полиморфизм.
    Полиморфизм является ключевой особенностью объектно-ориентированной парадигмы, которая позволяет взаимозаменяемо обрабатывать объекты разных типов на основе их общих интерфейсов. Полиморфизм упрощает управление сложностью, позволяя разработчикам писать код, работающий с абстракцией более высокого уровня, без необходимости иметь дело с конкретными деталями реализации каждого объекта. Используя полиморфизм, разработчики могут создавать более гибкие и расширяемые системы, поскольку новые классы можно добавлять, не затрагивая существующий код. Это способствует модульной и масштабируемой разработке, снижая сложность в долгосрочной перспективе.

Управление сложностью — важнейший аспект разработки программного обеспечения, и объектно-ориентированная парадигма обеспечивает мощную основу для решения этой задачи.

Благодаря таким принципам, как инкапсуляция, абстракция, наследование и полиморфизм, объектно-ориентированная парадигма позволяет разработчикам эффективно управлять сложностью и создавать удобные в сопровождении, масштабируемые и модульные системы. Инкапсулируя данные и поведение в объекты, абстрагируя ненужные детали, повторно используя код посредством наследования и используя полиморфизм, объектно-ориентированная парадигма предлагает комплексный подход к управлению сложностью. Использование объектно-ориентированной парадигмы значительно улучшает процесс разработки программного обеспечения и способствует созданию надежных и управляемых программных систем.

Искусство программирования сочетает в себе научные принципы с творчеством, решением проблем и инновациями. Это дисциплина, которая требует как технического мастерства, так и художественного видения. Управление сложностью с помощью объектно-ориентированного подхода имеет важное значение в программировании, позволяя программистам разрабатывать элегантные и эффективные решения и повышать удобство работы пользователей.

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

 

Искусство программирования



Искусство программирования

Искусство программирования выходит за рамки написания кода. Он включает в себя наш мыслительный процесс, подход к решению проблем и влияние, которое мы оказываем на мир. Программирование — это творческий язык, который воплощает идеи в жизнь и позволяет нам выражать себя с помощью технологий. Это заставляет нас мыслить новаторски, находить нестандартные решения и расширять наше понимание мира и самих себя. В этом видео рассматриваются фундаментальные концепции программирования, от базового синтаксиса и структур данных до продвинутых алгоритмов и парадигм программирования. Давай начнем.

Когда дело доходит до редактирования кода, есть два основных типа инструментов: текстовые редакторы и IDE. В то время как текстовые редакторы сосредоточены на редактировании простого текста, IDE предоставляют дополнительные функции. Однако для большинства целей различие между ними не имеет большого значения, и эти термины могут использоваться взаимозаменяемо. Популярные варианты текстовых редакторов и IDE включают Vim, Atom, Sublime Text, Eclipse, IntelliJ, PyCharm и Visual Studio Code. Visual Studio Code, в частности, легко настраивается и широко рекомендуется.

Чтобы запустить код, нам нужно скомпилировать его в машинный код, понятный компьютерам. Для этого требуется установка языкового компилятора или среды выполнения. Различные языки имеют свои собственные компиляторы или среды выполнения, такие как GCC, пакет SDK для Java, интерпретатор Python, среда выполнения Node.js и пакет SDK для .NET. Понимание деталей этих инструментов не обязательно; все, что вам нужно знать, это установить язык для запуска вашего кода.

Выполнение кода предполагает использование терминала, который обеспечивает доступ к интерфейсу командной строки. Обычно используемые терминалы включают Powershell и Bash. Терминал позволяет нам выполнять такие команды, как создание каталогов, просмотр файлов и запуск программ. Менеджеры пакетов, такие как npm для Node.js и pip для Python, можно использовать для установки программного обеспечения из репозиториев через командную строку. Git, система контроля версий, необходима для управления изменениями кода и совместной работы с другими.

Чтобы начать программировать, вам потребуется подходящий текстовый редактор или IDE, языковой компилятор и базовые знания терминальных команд. Visual Studio Code — рекомендуемый выбор для текстового редактора или IDE. Установка языка программирования и знакомство с командами терминала позволит вам писать и запускать код. Изучение языков программирования включает в себя понимание их синтаксиса, среды и соглашений. Разные языки имеют разный уровень сложности, но все они имеют сходство в структуре и концепциях.

Вывод на печать на разных языках программирования может быть выполнен с использованием функций или методов, специфичных для каждого языка. Например, в Python есть встроенная функция печати, в JavaScript есть метод console.log, а в Java и C++ есть собственный синтаксис для вывода на стандартный вывод.

Переменные используются для хранения значений различных типов данных. Переменные объявляются, определяются и инициализируются значениями. Языки программирования могут иметь статический или динамический тип, и они имеют различный синтаксис для переменных. Статическая типизация требует явного объявления типа переменной, а динамическая типизация — нет. Переменные имеют область видимости, которая определяет, где к ним можно получить доступ и использовать в программе. Область действия может быть глобальной или локальной, что позволяет лучше организовывать и предотвращать ошибки.

Типы данных представляют различные типы данных, такие как строки, логические значения, целые числа, числа с плавающей запятой, символы и массивы. Структуры данных обеспечивают способ организации данных и управления ими. К популярным структурам данных относятся массивы, стеки, кучи, деревья, связанные списки, хэш-таблицы, хэш-карты и графики. Массивы и карты — это две часто используемые структуры данных в различных приложениях.

Таким образом, программирование — это искусство, которое включает в себя мышление, решение проблем и формирование мира с помощью кода. Это включает в себя использование текстовых редакторов или IDE, запуск кода через компиляторы или среды выполнения, а также понимание команд терминала и контроля версий. Изучение языков программирования требует понимания синтаксиса, переменных, типов данных и структур данных. В видео представлен общий обзор этих концепций, который поможет вам начать свое путешествие по программированию.

The Art Of Programming
The Art Of Programming
  • 2023.05.11
  • www.youtube.com
In this video, we'll explore the basics of programming, including the different programming paradigms such as procedural, object-oriented, and functional pro...
 

Искусство написания программного обеспечения


Искусство написания программного обеспечения

Компьютеры, как и музыкальные инструменты, представляют собой тщательно продуманные машины, предназначенные для выполнения определенных задач на основе получаемых инструкций. Эти инструкции, написанные в коде, являются программным обеспечением, которое управляет их работой. Подобно тому, как нотная запись является кодом, используемым композиторами, программисты используют программный код для создания программ.

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

Внедрение языков высокого уровня, таких как Fortran и COBOL, сделало программирование более доступным. Программисты могли выражать свои инструкции, используя знакомые научные формулы или логические утверждения, которые имели для них смысл. Затем компиляторы использовались для перевода этих инструкций на двоичный язык компьютера. Этот прорыв открыл революцию в программном обеспечении, поскольку программистам больше не нужно было изучать машинный язык каждого компьютера.

За прошедшие годы были разработаны сотни языков программирования для удовлетворения различных потребностей. Разрыв между этими языками и машинным языком увеличился, что позволяет программистам сосредоточиться на том, чего они хотят достичь, а не на низкоуровневых деталях. По мере того, как вычисления становились все более личными, языки программирования становились более разнообразными и удобными для пользователя. Теперь люди регулярно общаются с компьютерами, сообщая им, что делать, например, вычислять средние значения или систематизировать данные. Программирование стало инструментом расширения прав и возможностей людей, позволяя им настраивать и адаптировать компьютерные системы к своим потребностям.

Написание программного обеспечения включает не только кодирование, но и определение способа представления и организации данных. Данные могут быть организованы в строки, списки, таблицы, деревья и т. д., в зависимости от требований. Выбор языка и структуры данных имеет решающее значение для эффективного решения задач программирования. Программисты создают пошаговые процедуры, известные как алгоритмы, для решения проблем. Эти алгоритмы определяют операции, необходимые для достижения желаемых результатов. Однако поиск наиболее эффективного алгоритма для данной задачи может оказаться сложной задачей. Это требует тщательного мышления, концентрации, а иногда и обширных знаний в специализированных областях.

Разработка программного обеспечения — это сложная и творческая задача, требующая одновременного учета множества аспектов. Программисты постоянно адаптируются к достижениям в области технологий, расширяя границы возможностей компьютеров. Они стремятся к элегантности и согласованности в своем коде, создавая программное обеспечение, которое одновременно функционально и эстетично. Благодаря своим усилиям программисты расширили наши возможности, позволив нам использовать огромное количество информации и взаимодействовать с миром способами, которые когда-то считались волшебными. Программирование — это движущая сила, которая заставляет компьютеры работать и формирует высокотехнологичный мир, в котором мы живем сегодня.

The Art of Writing Software
The Art of Writing Software
  • 2014.11.17
  • www.youtube.com
CHM Exhibition "Revolution: The First 2000 Years of Computing"Software is more than obscure computer code. It’s an art form: a meticulously-crafted literatur...
 

Учебник по C++ для начинающих — полный курс


Учебник по C++ для начинающих — полный курс

00:00:00 - 01:00:00 Это видео является учебным пособием для начинающих, которые хотят научиться программировать на C++. Он охватывает основы работы со строками, числами и переменными. В нем также представлена концепция импорта кода из других файлов.

01:00:00 - 02:00:00 В этом учебном пособии по C++ для начинающих рассказывается, как создать четырехфункциональный калькулятор. В руководстве объясняется, как вводить данные, проверять равенство операторов и выполнять код на основе этого условия.

02:00:00 - 03:00:00 В этом видео представлено базовое введение в программирование на C++ с акцентом на использование циклов for для вычисления конкретного результата. Демонстрируемая функция вычисляет результат возведения числа в определенную степень.

03:00:00 - 04:00:00 В этом учебном пособии по C++ для начинающих инструктор демонстрирует, как использовать наследование для расширения функциональности в иерархии классов. Наследование позволяет классу иметь ту же функциональность, что и другой класс, расширяя эту функциональность дополнительными функциями. Преподаватель также демонстрирует, как переопределить унаследованные функции, чтобы изменить поведение класса.

Часть 1

  • 00:00:00 Этот видеоурок учит начинающих писать базовый код на C++. Первым шагом является установка текстового редактора и компилятора C++, которые включены в пакет codeblocks. Затем в учебнике показано, как настроить простой проект в кодовых блоках.

  • 00:05:00 В этом руководстве представлено краткое введение в язык программирования C++ и инструменты, необходимые для написания и запуска программ на C++. В первой части руководства показано, как установить необходимые инструменты на Mac, а во второй части рассказывается, как создать новый проект C++ в блоках кода.

  • 00:10:00 В этом видеоруководстве ведущий знакомит с основами написания программы на C++. Он рассказывает о необходимости проекта и файла C++, объясняет функции и показывает, как создавать и запускать программу.

  • 00:15:00 В этом руководстве объясняется, как писать базовый код на C++ и как использовать операторы печати для вывода информации на консоль.

  • 00:20:00 В этом видео ведущий показывает, как переменные полезны в программировании, приводя пример программы, которая распечатывает историю. Затем докладчик демонстрирует, как создать и присвоить значение переменной с именем «имя персонажа», в которой хранится имя персонажа. Затем ведущий демонстрирует, как создать и присвоить значение переменной с именем «возраст», в которой хранится возраст персонажа. Наконец, докладчик демонстрирует, как использовать переменную для хранения нескольких фрагментов данных.

  • 00:25:00 В этом видео ведущий знакомит с понятием переменных и показывает, как их использовать для хранения данных в программе. Они демонстрируют, как получить доступ к данным, хранящимся в переменных, и управлять ими с помощью операторов печати. Наконец, они показывают, как включить переменную в оператор печати, чтобы данные печатались в отдельной строке.

  • 00:30:00 В этом видео представлена концепция переменных и типов данных в C++. Переменная — это контейнер, в котором хранятся данные, и вы можете использовать его для хранения информации любого типа. Строки являются распространенным типом переменных и представляют собой последовательность символов. Вы также можете использовать целые числа для хранения целых чисел или отрицательные целые числа для хранения отрицательных чисел. Вы также можете хранить десятичные числа в целых числах.

  • 00:35:00 В этом руководстве рассматриваются основы программирования на C++, начиная с простого текста и чисел и заканчивая более сложными типами данных, такими как строки и логические значения.

  • 00:40:00 В этом видео рассказывается, как использовать строковые функции C++ length и индексирование строк для печати строк и определения местоположения определенных символов в строке, а также как изменять определенные символы в строке.

  • 00:45:00 Видео рассказывает об основах работы со строками в C++, в том числе о том, как передавать аргументы функциям и как использовать различные математические функции для работы со строками.

  • 00:50:00 В этом руководстве по C++ рассматриваются основы чисел, сложения, вычитания, умножения и деления. Также вводится оператор модуля, который полезен для деления двух чисел и вычисления остатка. Наконец, демонстрируется хранение чисел в переменных.

  • 00:55:00 В этом учебном пособии по C++ для начинающих объясняется, как использовать математические функции для решения задач. Функции включают квадратный корень, pow и округление. Также объясняется импорт кода из других файлов.

Часть 2

  • 01:00:00 В этом руководстве по C++ для начинающих пользователю предлагается ввести свой возраст и имя. Затем программа сохраняет информацию в переменной с именем age и печатает имя и возраст пользователя.

  • 01:05:00 В этом видеоуроке показано, как создать простой калькулятор на C++ и как создать игру Mad Libs.

  • 01:10:00 В этом видео объясняется, как создавать и использовать массивы в C++. Массивы похожи на переменные, но могут содержать несколько значений.

  • 01:15:00 В этом видеоуроке объясняются основы работы с массивами в C++. Массив — это контейнер, который может хранить несколько фрагментов данных, и вы можете получить доступ к отдельным элементам по индексу или путем присвоения значения свойству «размер» массива.

  • 01:20:00 В этом уроке автор демонстрирует, как создать функцию на C++. Функция — это блок кода, который выполняет определенную задачу и может повторно использоваться в программе. Тип возвращаемого значения функции может быть либо void, либо целым числом. Автор также демонстрирует, как вызвать функцию.

  • 01:25:00 В этом видео автор объясняет, как работают функции и как их можно использовать повторно. Он также показывает, как создать сигнатуру функции и как вызвать функцию, используя ее сигнатуру. Наконец, он обсуждает возвраты в C++, когда функция возвращает информацию вызывающей стороне.

  • 01:30:00 В видео обсуждается, как создавать функции на C++ и как использовать ключевое слово return, чтобы указать, что функция завершена. Видео также демонстрирует, как использовать функцию куба для возврата результата кубирования числа.

  • 01:35:00 В этом руководстве автор рассказывает новичкам об операторе if в C++. Оператор if — это структура программирования, которая позволяет программе реагировать на различные ситуации. Автор демонстрирует, как использовать оператор if для проверки условий и как создавать более сложные операторы if.

  • 01:40:00 В этом видеоуроке объясняется, как использовать операторы и и или в C++ для проверки двух условий. Если одно из условий ложно, весь блок if будет ложным, и код не будет выполнен.

  • 01:45:00 В этом руководстве автор обучает новичков операторам if, объясняя, как использовать сравнения для создания истинных или ложных значений. Функция примет на вход два числа и вернет наибольшее из них.

  • 01:50:00 В этом видео объясняется, как работают сравнения в C++ и как использовать больше, меньше и равно, чтобы проверить, равны ли два числа или больше или равны.

  • 01:55:00 В этом учебном пособии по C++ для начинающих показано, как создать четырехфункциональный калькулятор, в том числе как вводить данные, проверять равенство операторов и выполнять код на основе этого условия.

Часть 3

  • 02:00:00 В этом видеоуроке демонстрируется функция преобразования целого числа в день недели. Создается функция, и оператор if используется для определения того, является ли заданный номер дня единицей или больше. Если он один, функция возвращает «воскресенье»; если он не один, функция возвращает «понедельник».

  • 02:05:00 В этом видео объясняется, как можно использовать оператор switch, чтобы сделать код в операторе if более эффективным. Далее в видео объясняется, как создать оператор switch для каждого дня недели, и демонстрируется функция путем печати дня недели для числа, переданного в качестве входных данных.

  • 02:10:00 В этом видеоролике представлен обзор видеоролика «Учебное пособие по C++ для начинающих — полный курс». Видео демонстрирует, как использовать цикл while для итерации по блоку кода, пока выполняется условие.

  • 02:15:00 В этом учебном пособии по C++ для начинающих рассматриваются основы циклов, в том числе создание цикла while и цикла do while. В видео также обсуждается бесконечный цикл и как его избежать. Наконец, демонстрируется цикл for.

  • 02:20:00 В этом руководстве показано, как создать игру-угадайку с помощью цикла while и цикла do while. Игра изначально нечестна в том смысле, что пользователь получает неограниченное количество догадок, но в руководстве показано, как сделать игру более честной, установив ограничение на догадки.

  • 02:25:00 В этом видео автор объясняет, как работают циклы for и как их можно использовать в C++. Он также показывает пример того, как можно использовать циклы for для решения проблемы.

  • 02:30:00 В этом видео автор объясняет цикл while, циклическую конструкцию, в которой переменная изменяется при каждом выполнении. Цикл for является аналогичной конструкцией, но включает в себя объявление переменной, инициализацию и условие цикла.

  • 02:35:00 В этом видеоруководстве показано, как использовать циклы for для перебора содержимого массивов, а также как создать функцию, которая возводит число в определенную степень.

  • 02:40:00 Этот видеоурок представляет собой базовое введение в программирование на C++ с акцентом на использование циклов for для вычисления определенного результата. Демонстрируемая функция вычисляет результат возведения числа в определенную степень.

  • 02:45:00 В этом руководстве автор показывает, как создать и использовать двумерный массив, и обсуждает, как получить доступ к его элементам.

  • 02:50:00 В этом видеоруководстве вы знакомитесь с языком C++ и демонстрируете, как использовать итераторы for и int для циклического перебора массивов данных. Вложенные циклы for позволяют легко перебирать данные в массивах.

  • 02:55:00 В этом видео объясняется, что такое указатель, чем он полезен и как его создать в C++.

Часть 4

  • 03:00:00 В этом видео представлено введение в программирование на C++ для начинающих с примерами использования переменных и констант для хранения информации. Видео также демонстрирует, как получить доступ к адресам памяти для извлечения хранящейся в них информации.

  • 03:05:00 В этом видеоролике представлен обзор видеоролика «Учебник по C++ для начинающих — полный курс». В ролике ведущий демонстрирует, как получить доступ к адресам памяти переменных с помощью указателей. Указатель — это просто адрес памяти, который является просто типом данных, и вы можете использовать его для хранения указателя на другую переменную.

  • 03:10:00 В этом руководстве объясняется, как использовать указатели в программировании, и демонстрируется, как разыменовывать их для доступа к значению, хранящемуся по определенному адресу памяти. Кроме того, в руководстве обсуждаются классы и объекты в C++, а также демонстрируется создание и использование класса.

  • 03:15:00 В этом видео, учебнике C++ для начинающих, автор создает класс для представления книг. У класса есть два атрибута: название и автор. Затем автор создает объект книги и устанавливает название и автора.

  • 03:20:00 Это видео учит новичков создавать объекты и работать с ними в C++. Объект — это фактический экземпляр класса, а класс — это шаблон для типа данных. Объекты можно распечатать и изменить их значения.

  • 03:25:00 В этом видео объясняется, как работают конструкторы в C++ и как их можно использовать для инициализации объектов значениями по умолчанию.

  • 03:30:00 В этом видеоруководстве объясняется, как создать конструктор C++, который принимает заголовок, автора и страницы в качестве входных значений. После инициализации конструктор можно использовать для создания нового объекта без необходимости каждый раз передавать значения.

  • 03:35:00 В этом видео объясняется, как использовать функции в C++, чтобы определить, имеет ли студент отличие. Функции — это шаблоны, которые каждый объект может использовать для возврата true или false в зависимости от собственного GPA объекта.

  • 03:40:00 Это видео научит новичков использовать геттеры и сеттеры в классах C++. Геттеры и сеттеры позволяют вам контролировать доступ к атрибутам и элементам в ваших классах. В этом примере показано, как принудительно установить допустимую оценку для фильма с помощью методов получения и установки.

  • 03:45:00 В этом руководстве по C++ для начинающих автор демонстрирует, как использовать геттеры и сеттеры для ограничения оценок, которые могут быть назначены объекту фильма. Если переданный рейтинг не является одним из допустимых рейтингов, выдается ошибка или рейтинг не устанавливается.

  • 03:50:00 В этом видео автор объясняет, как устанавливать рейтинги видео с помощью C++. Во-первых, они объясняют, как рейтинги представлены в C++, где рейтинг равен положительному значению, например 13, или отрицательному значению, например -3. Затем они демонстрируют, как установить рейтинг для видео с помощью функции с именем set rating. Эта функция принимает один параметр — строку, представляющую рейтинг. Если введенный рейтинг недействителен, функция вернет строку, представляющую рейтинг без рейтинга. Наконец, автор демонстрирует, как распечатать рейтинг видео с помощью функции под названием «получить рейтинг». Эта функция не принимает никаких параметров и просто возвращает рейтинг видео.

  • 03:55:00 В этом учебном пособии по C++ для начинающих инструктор демонстрирует, как наследовать функции и как переопределять их в иерархии классов. Это позволяет классу иметь ту же функциональность, что и другой класс, расширяя эту функциональность дополнительными функциями.
C++ Tutorial for Beginners - Full Course
C++ Tutorial for Beginners - Full Course
  • 2018.08.24
  • www.youtube.com
This course will give you a full introduction into all of the core concepts in C++. Want more from Mike? He's starting a coding RPG/Bootcamp - https://simula...
 

Введение в программирование и информатику — полный курс



Введение в программирование и информатику — полный курс

Это видео представляет собой руководство для начинающих по программированию и информатике для тех, кто практически не имеет опыта программирования. Он охватывает основные концепции и методы, применимые к любому языку программирования. Видео объясняет основы написания кода в интегрированной среде разработки (IDE) и подчеркивает важность грамматики программирования.

Темы, затронутые в видео, включают в себя:

  1. Введение в программирование и информатику, включая синтаксис и правила программирования.
  2. Использование консоли для вывода текста из программы.
  3. Основные математические операции и оператор модуля в программировании.
  4. Вывод строк в консоль.
  5. Понимание переменных, типов данных и соглашений об именах.
  6. Как переменные определяются, ссылаются и управляются в программах.
  7. Изучение операторов if, операторов elsif и операторов else для условного выполнения.
  8. Представляем массивы как способ хранения связанных переменных.
  9. Основы циклов, включая циклы for, циклы while и циклы do-while.
  10. Понимание различных типов ошибок программирования: синтаксические ошибки, ошибки времени выполнения и логические ошибки.
  11. Методы отладки, такие как использование операторов печати, точек останова и комментариев.
  12. Стратегии предотвращения ошибок в программировании.
  13. Работа с функциями для организации кода и сокращения повторений.
  14. Импорт функций из библиотек и соглашения об именах для функций.
  15. Различные типы функций и их назначение.
  16. Знакомство со словарями как гибким вариантом хранения данных.
  17. Обзор алгоритмов поиска, включая линейный поиск и бинарный поиск.
  18. Рекурсивное программирование и варианты его использования, включая концепцию базового случая.
  19. Мягкие навыки для информатики, такие как решение проблем и планирование.
  20. Использование псевдокода в качестве инструмента планирования для написания кода.
  21. Различные методы планирования и написания кода, включая блок-схемы и хронологическое планирование.
  22. Обзор языков программирования и доступных ресурсов для обучения.

Видео представляет собой всестороннее введение в программирование и информатику, предлагая зрителям необходимую основу для начала их пути к программированию. Он также предлагает дополнительные ресурсы и веб-сайты для дальнейшего изучения темы.

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

  • 00:05:00 В этом видео обсуждаются основы программирования, как писать код в интегрированной среде разработки (IDE) и важность грамматики программирования.

  • 00:10:00 Это видео знакомит с программированием и информатикой, а также охватывает основы синтаксиса и правил программирования. Основное использование консоли — вывод текста из программы.

  • 00:15:00 В этом видео рассказывается об основах математики, включая арифметику, сложение, вычитание, умножение и деление, а также модуль — базовый оператор во многих языках программирования. Он также охватывает вывод строк на консоль.

  • 00:20:00 Это видео знакомит с понятиями программирования и информатики, включая переменные, типы и имена. Примитивные переменные включают целые числа, логические значения, числа с плавающей запятой и двойные числа. Строковые переменные хранят строки символов. Переменные типа Char содержат один символ. Переменные необходимы для хранения информации в формате, на который можно легко ссылаться.

  • 00:25:00 В этом видео обсуждается, что происходит, когда мы определяем или создаем переменные, как ссылаться на них и как манипулировать ими в наших программах. Главное, что нужно усвоить, это то, что переменные — это просто пробелы в памяти, в которых хранится определенное значение, и что мы можем обновлять числа, и их место останется постоянным во всем коде.

  • 00:30:00 Переменная — это место, где вы можете хранить информацию во время программирования. Соглашения об именах переменных важны для удобочитаемости. Если условие в операторе if истинно, будет выполнен код в фигурных скобках. Есть два дополнительных оператора, elsif и eltons, которые работают аналогично операторам if. Если условие в elsif истинно, будет выполнен код, следующий за elsif. В противном случае код, следующий за elsif
    будет пропущен. Если условие в elsif неверно, код, следующий за elsif, будет пропущен, и будет выполнен код, следующий за оператором if.

  • 00:35:00 Массив — это список переменных, связанных друг с другом. Они полезны, когда программист хочет хранить множество переменных, содержащих информацию, связанную друг с другом.

  • 00:40:00 Курс «Введение в программирование и информатику» охватывает массивы, индексы, размер и массивы внутри массивов. Петли также закрыты.

  • 00:45:00 В этом видео рассматриваются различные типы циклов for, while и do while. В нем объясняется, как настроить условие для цикла и как избежать бесконечного цикла.

  • 00:50:00 В этом видео рассматриваются три типа ошибок, которые могут возникнуть при программировании: синтаксические ошибки, ошибки времени выполнения и логические ошибки. Синтаксические ошибки исправить проще всего, поскольку обычно их можно исправить за считанные секунды. Ошибки выполнения вызваны операторами в вашем коде, которые кажутся логически обоснованными, но компьютер физически не может выполнить задачу за разумное время. Логические ошибки являются наиболее раздражающими и трудными для отладки, поскольку они часто могут привести к тому, что программы не будут работать должным образом. Чтобы отладить свой код, вы должны постепенно тестировать его и искать синтаксические ошибки и ошибки времени выполнения.

  • 00:55:00 Если вы столкнулись с ошибкой в своем коде, вы можете использовать операторы печати и консоль, чтобы определить, где код работает неправильно, использовать точки останова, чтобы отследить причину ошибки, и использовать комментарии, чтобы отметить код, предназначенный для вас, а не для компьютера. Наконец, обсуждаются стратегии предотвращения ошибок.

  • 01:00:00 В этом видео инструктор рассказывает об основах программирования и информатики, включая ошибки и функции. Далее он объясняет, как аргументы работают в функции и как использовать функции, чтобы уменьшить количество повторений в коде.

  • 01:05:00 В этом видео-введении в программирование и информатику обсуждаются четыре различных типа функций, их назначение и способы их использования в коде. Функции могут быть полезны для организации кода, экономии времени и внесения больших изменений в код без необходимости просмотра всей программы.

  • 01:10:00 В этом видео представлены основы программирования и информатики. Объясняется импорт функций из библиотек и обсуждаются правила именования функций. Также вводятся правила создания функций на основе типа и количества аргументов.

  • 01:15:00 В этом видео инструктор объясняет основы программирования и информатики, включая функции, область действия и передачу аргументов. Он также рассказывает, как создавать функции, которые не возвращают никаких значений.

  • 01:20:00 В этом видео ведущий рассматривает массивы, функции и словари. Массивы похожи на списки значений, которые хранятся вместе, а функции возвращают переменную в зависимости от выбранного пути. Следует отметить одну небольшую деталь: вы не можете возвращать переменную одного типа, если вы уже определили функцию для возврата другого типа. Списки массивов сами увеличиваются, когда размер списка превышает 10 элементов, а словари хранят несколько значений.

  • 01:25:00 Компьютер хранит данные по-разному, что может быть сложно понять. Словарь — это тип хранилища данных, который является более гибким и простым в организации, чем традиционные массивы. Алгоритмы поиска используются для быстрого поиска определенной части данных в списке значений.

  • 01:30:00 Это видео знакомит с концепцией поисковых алгоритмов и их эффективностью. Линейный поиск — хороший базовый алгоритм для несортированных списков, но он неэффективен в худшем случае. Двоичный поиск — это эффективный алгоритм поиска для отсортированных списков, использующий тот факт, что список отсортирован.

  • 01:35:00 Алгоритм бинарного поиска быстрее и эффективнее, чем линейный поиск элемента в отсортированном списке. Рекурсивная функция является примером оператора рекурсивного программирования. Базовым случаем рекурсивного оператора является определенное значение, которому должны удовлетворять все рекурсивные операторы. Если n не меньше или равно единице, рекурсивный оператор вернет сумму n, а затем возвращаемое значение метода рекурсивной суммы минус единица.

  • 01:40:00 Это видео знакомит с программированием и компьютерными науками и объясняет, почему рекурсия — полезный метод. Мягкие навыки, необходимые для компьютерных наук, включают решение проблем и планирование. Псевдокод — это упрощенная форма программирования, которая может помочь в этом планировании.

  • 01:45:00 Псевдокод — это визуальный способ планирования компьютерного кода, аналогичный плану статьи. Блок-схемы и запись того, что вы хотите, чтобы программа делала в хронологическом порядке, являются двумя распространенными методами.

  • 01:50:00 В этом видео представлены концепции программирования и информатики, в том числе различные методы планирования и написания кода, а также важность псевдокода. Он также охватывает различные языки программирования и их использование.

  • 01:55:00 В этой серии автор рассказывает об основах программирования, включая синтаксис и правила, и учит, как выучить конкретный язык. Он также предоставляет веб-сайты и ресурсы, которые помогут вам начать работу.
Introduction to Programming and Computer Science - Full Course
Introduction to Programming and Computer Science - Full Course
  • 2020.04.21
  • www.youtube.com
In this course, you will learn basics of computer programming and computer science. The concepts you learn apply to any and all programming languages and wil...
 

Курс программирования на C++ — от начального до продвинутого


Курс программирования на C++ — от начального до продвинутого

Курс охватывает различные аспекты программирования на C++.

Были затронуты темы:

  1. Настройка среды разработки C++. В видеороликах представлен обзор того, как настроить среду разработки C++ на различных платформах. Сюда входит установка различных компиляторов и настройка Visual Studio Code для использования компиляторов и стандартной библиотеки C++. Инструкции охватывают такие платформы, как Windows, Mac и Linux.

  2. Основы программирования на C++: видеоролики охватывают основные понятия, такие как переменные, типы данных, функции и операторы управления потоком. Они объясняют, как объявлять переменные, определять функции и использовать структуры управления, такие как циклы и условные операторы. В видеороликах также представлены такие понятия, как комментарии и функция main в C++.

  3. Манипуляции со строками. Отдельные видеоролики посвящены работе со строками в C++. Они объясняют, как сравнивать и объединять строки с помощью таких функций, как strcmp и strcat. Видео также демонстрирует, как копировать строки с помощью функции strcpy.

  4. Массивы: видеоролики знакомят с концепцией массивов в C++. Они охватывают такие темы, как объявление и инициализация массивов, доступ к элементам с помощью указателей и печать массивов символов.

  5. Динамическое выделение памяти и указатели. Эти видеоролики объясняют, как осуществляется управление памятью в C++ и как использовать методы динамического выделения памяти для выделения дополнительной памяти для программы. Они охватывают понятия указателей, карт памяти и единиц управления памятью. В видеороликах также рассказывается, как безопасно использовать указатели, избегать сбоев и обрабатывать несколько указателей, указывающих на одно и то же место в памяти.

  6. Шаблоны функций и лямбда-функции. В видеороликах объясняется, как создавать универсальные функции с помощью шаблонов функций в C++. Они демонстрируют, как компилятор может генерировать определения функций на основе переданных типов параметров. Кроме того, видеоролики охватывают лямбда-функции, которые являются анонимными функциями, которые можно вызывать без указания имени. Они объясняют синтаксис и спецификацию типа возвращаемого значения для лямбда-функций.

  7. Классы и наследование. Эти видеоролики знакомят с концепцией классов в C++ и объясняют, как определять переменные-члены и функции внутри класса. Они охватывают такие темы, как конструкторы, деструкторы, спецификаторы доступа (защищенные и закрытые) и использование статического и динамического связывания для достижения полиморфизма. В видеороликах также показано, как создавать и использовать производные классы на основе уже существующих классов с использованием наследования.

  8. Отладка и обработка ошибок: видеоролики содержат рекомендации по отладке программ на C++. Они объясняют, как устанавливать точки останова, проверять переменные в локальной области видимости и обрабатывать ошибки, связанные с неинициализированными указателями и утечками памяти. В видеороликах также рассматриваются такие понятия, как нарезка объектов и переопределение конструкторов базовых классов.

  9. Интерфейсы и полиморфизм. Некоторые видеоролики посвящены интерфейсам и полиморфизму в C++. Они объясняют, как использовать динамическое связывание, ссылки и ключевое слово override для достижения полиморфного поведения в программах. В видео также обсуждается спецификатор final, который можно использовать, чтобы пометить виртуальный метод как final и предотвратить его переопределение в производных классах.

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

Видео содержит пошаговые инструкции, демонстрации и пояснения, которые помогут новичкам изучить программирование на C++ от установки и настройки до более сложных концепций, таких как объектно-ориентированное программирование, управление памятью и полиморфизм. Содержание подходит как для новичков, которые хотят изучить основы программирования на C++, так и для опытных программистов, которые хотят освежить свои навыки или глубже изучить определенные темы.

Код: https://github.com/rutura/The-C-20-Masterclass-Source-Code


Глава 1: Настройка инструментов

  • 00:04:32 Инструменты разработчика C++
  • 00:11:06 Установка компиляторов C++ в Windows
  • 00:24:27 Установка VS Code в Windows
  • 00:28:00 Настройка кода Visual Studio для C++ в Windows
  • 00:57:27 Установка компиляторов C++ в Linux
  • 01:04:02 Установка кода Visual Studio в Linux
  • 01:07:40 Настройка кода Visual Studio для C++ в Linux
  • 01:22:45 Установка компиляторов C++ на MacOS
  • 01:28:07 Установка кода Visual Studio на MacOS
  • 01:30:16 Настройка кода Visual Studio для C++ в MacOS
  • 01:35:37 Онлайн компиляторы


Глава 2: Погружение

  • 01:43:01 Ваша первая программа на C++
  • 01:55:56 Комментарии
  • 02:01:56 Ошибки и предупреждения
  • 02:13:12 Операторы и функции
  • 02:31:34 Вход Выход
  • 02:49:57 Модель выполнения программы C++ и модель памяти
  • 02:56:42 Базовый язык C++ VS Стандартная библиотека VS STL


Глава 3: Переменные и типы данных

  • 03:00:47 Введение в переменные и типы данных
  • 03:05:05 Системы счисления
  • 03:21:52 Целые числа
  • 03:40:44 Целочисленные модификаторы
  • 03:54:00 Дробные числа
  • 04:16:39 Булевы значения
  • 04:24:49 Символы и текст
  • 04:32:05 Авто
  • 04:38:06 Задания
  • 04:45:42 Сводка по переменным и типам данных


Глава 4: Операции с данными

  • 04:46:45 Операции с данными Введение
  • 04:47:31 Основные операции
  • 04:58:01 Приоритет и ассоциативность
  • 05:12:06 Префикс и постфикс + & -
  • 05:23:22 Составные операторы
  • 05:31:43 Реляционные операторы: сравнение вещей
  • 05:40:51 Логические операторы
  • 05:56:09 Форматирование вывода
  • 06:33:26 Числовые ограничения
  • 06:41:10 Математические функции
  • 06:54:23 Странные интегральные типы
  • 06:59:41 Сводка операций с данными


Глава 5: Управление потоком

  • 07:01:58 Управление потоком: введение в условное программирование
  • 07:03:30 Если Заявление
  • 07:20:49 Иначе Если
  • 07:28:46 Переключение
  • 07:42:44 Тернарный оператор
  • 07:52:20 Управление потоком: резюме условного программирования Глава 6: Циклы
  • 07:53:49 Циклы Введение
  • 07:55:20 Для цикла
  • 08:25:20 Пока Цикл
  • 08:36:54 Делать пока цикл


Глава 7: Массивы

  • 08:47:08 Введение в массивы
  • 08:48:45 Объявление и использование массивов
  • 09:15:53 Размер массива
  • 09:26:44 Массивы символов
  • 09:46:46 Границы массива


Глава 8: Указатели

  • 09:53:23 Указатели Введение
  • 09:56:03 Объявление и использование указателей
  • 10:14:48 Указатель на Char
  • 10:27:26 Карта памяти программы
  • 10:36:30 Динамическое выделение памяти
  • 11:05:45 Висячие указатели
  • 11:24:15 Когда новое терпит неудачу
  • 11:38:00 Безопасность нулевого указателя
  • 11:45:18 Утечки памяти
  • 11:55:44 Динамические массивы


Глава 9: Ссылки

  • 12:11:04 Ссылки Введение
  • 12:11:58 Объявление и использование ссылок
  • 12:22:28 Сравнение ссылок с указателями
  • 12:37:25 Ссылки и Константа


Глава 10: Управление символами и строки

  • 12:44:29 Управление символами и ввод строк
  • 12:46:24 Манипуляции с персонажами
  • 13:09:28 Манипуляция C-String
  • 13:41:42 Конкатенация и копирование C-String
  • 14:01:19 Представляем std::string
  • 14:03:38 Объявление и использование std::string


Глава 11: Функции

  • 14:12:47 Одно правило определения
  • 14:28:25 Функции из первых рук
  • 15:00:50 Декларация и определение функции
  • 15:15:30 Функции в нескольких файлах — новый взгляд на модель компиляции
  • 15:42:30 Передача по значению
  • 15:50:30 Пройти мимо указателя
  • 15:57:46 Передача по ссылке


Глава 12: Выведение вещей из функций

  • 16:03:20 Извлечение вещей из функций Введение
  • 16:03:58 Входные и выходные параметры
  • 16:17:54 Возвращение с функций


Глава 13: Перегрузка функций

  • 16:32:35 Перегрузка функций Введение
  • 16:34:17 Перегрузка с разными параметрами


Глава 14: Лямбда-функции

  • 16:49:00 Введение в лямбда-функции
  • 16:49:38 Объявление и использование лямбда-функций
  • 17:20:25 Списки захвата
  • 17:34:24 Захватите все в контексте


Глава 15: Шаблоны функций

  • 17:40:08 Введение в шаблоны функций
  • 17:41:45 Тестирование шаблонов функций
  • 18:19:52 Вывод типа шаблона и явные аргументы
  • 18:35:47 Параметры типа шаблона по ссылке
  • 18:48:55 Специализация шаблона


Глава 16: Концепции

  • 19:04:31 Введение в концепции
  • 19:06:47 Концепты
  • 19:25:32 Концепции: создание собственного
  • 19:42:45 Требуется пункт: Увеличение
  • 19:59:53 Логические комбинации понятий
  • 20:09:39 Концепты и авто


Глава 17: Классы

  • 20:15:40 Введение в занятия
  • 20:16:33 Ваш первый курс C++
  • 20:38:03 Конструкторы
  • 20:53:35 Конструкторы по умолчанию
  • 20:59:42 Сеттеры и геттеры
  • 21:10:06 Класс в нескольких файлах
  • 21:30:49 Управление объектами класса с помощью указателей
  • 21:42:48 Деструкторы
  • 22:05:44 Порядок вызова конструктора и деструктора
  • 22:11:03 Этот указатель
  • 22:33:33 Структура
  • 22:42:37 Размер объектов класса


Глава 18: Наследование

  • 22:52:43 Введение в наследование
  • 22:55:59 твоя первая попытка получить наследство
  • 23:21:10 Защищенные члены
  • 23:32:06 Спецификаторы доступа к базовому классу: увеличение
  • 23:36:49 Спецификаторы доступа к базовому классу: демонстрация
  • 24:07:42 приближается к частному наследству
  • 24:26:36 Воскрешение участников снова в области видимости
  • 24:46:59 Конструкторы Arg по умолчанию с наследованием
  • 24:57:37 Пользовательские конструкторы с наследованием
  • 25:26:56 Конструкторы копирования с наследованием
  • 25:51:53 Наследование базовых конструкторов
  • 26:06:00 Наследование с деструкторами
  • 26:12:20 Повторно используемые символы в наследовании


Глава 19: Полиморфизм

  • 26:21:03 Введение в полиморфизм
  • 26:26:54 Статическая привязка с наследованием
  • 26:55:24 Полиморфизм (динамическое связывание) с виртуальными функциями
  • 27:14:31 Размер полиморфных объектов и нарезка
  • 27:26:37 Полиморфные объекты, хранящиеся в коллекциях
  • 27:45:42 Переопределить
  • 27:52:45 Перегрузка, переопределение и сокрытие
  • 28:07:35 Наследование и полиморфизм на разных уровнях
  • 28:33:03 Наследование и полиморфизм со статическими членами
  • 28:49:13 Финал
  • 29:07:42 Виртуальные функции с аргументами по умолчанию
  • 29:23:18 Виртуальные деструкторы
  • 29:35:38 Dynamic_cast<>()
  • 30:08:17 Не вызывайте виртуальные (полиморфные) функции из конструкторов и деструкторов
  • 30:24:45 Чисто виртуальные функции и абстрактные классы
  • 30:43:37 Абстрактные классы как интерфейсы
C++ Programming Course - Beginner to Advanced
C++ Programming Course - Beginner to Advanced
  • 2022.02.17
  • www.youtube.com
Learn modern C++ 20 programming in this comprehensive course.💻 Source code: https://github.com/rutura/The-C-20-Masterclass-Source-Code✏️ Course developed by...
 

Курс «Структуры данных от простого к продвинутому» — полное руководство от инженера Google (части 1–4)


Курс «Структуры данных от простого к продвинутому» — полное руководство от инженера Google

Краткое содержание:

00:00:00
- 01:00:00 Преподаватель объясняет структуры данных и их важность для создания более быстрых и мощных алгоритмов. В учебнике рассматривается нотация Big O и то, как она используется для стандартизации того, сколько времени и места требуется алгоритму, а также приведены конкретные примеры для различных временных сложностей. В учебнике также рассматривается реализация статических и динамических массивов, включая их преимущества и недостатки, а также подробно рассматривается создание и вставка узлов в одно- и двусвязные списки. Наконец, учебник представляет собой введение в структуру данных стека и кратко объясняет его основные операции.

01:00:00
- 02:00:00 В этом разделе учебного курса «Структуры данных от простого к продвинутому» представлен всесторонний обзор различных структур данных и их функций. Учебное пособие знакомит аудиторию с принципами работы стеков и очередей, их реализациями с использованием массивов и связанных списков, а также их важностью в различных приложениях, включая обход графа и управление запросами к серверу. В учебнике также рассматриваются очереди с приоритетом и их реализация с использованием куч, разъясняется разница между очередями с приоритетом и кучами, а также типы куч. Учебник заканчивается пошаговой демонстрацией того, как добавлять и удалять элементы из двоичной кучи.

02:00:00 - 03:00:00 Инженер Google представляет полное руководство по структурам данных, объясняя, как удалять узлы из структуры данных двоичной кучи, как поддерживать инвариантность кучи в очереди с приоритетом и как плавать и узлы-приемники в структуре данных двоичной кучи. В видео также рассматривается структура данных union find, которая используется для отслеживания элементов, разделенных на непересекающиеся наборы, и для объединения двух групп вместе, с примером о магнитах, чтобы проиллюстрировать, как работает структура данных. Кроме того, объясняется алгоритм Крускала для нахождения минимального остовного дерева в графе и вводится концепция сжатия пути, чтобы сделать структуру данных поиска объединения более эффективной.

03:00:00 - 04:00:00 В этом руководстве рассматриваются различные структуры данных, начиная со структуры данных union-find и ее методов, включая поиск, соединение, родитель, размер и унификацию. Затем учебник переходит к деревьям, включая определения деревьев, корневых деревьев, двоичных деревьев и двоичных деревьев поиска. В видео представлены примеры вставки и удаления узлов из двоичных деревьев поиска, а также различные алгоритмы обхода, включая предварительный порядок, порядок, пост-порядок и порядок уровней, а также объясняется, как реализовать эти конструкции в Python и Java. Кроме того, в видео представлены хэш-таблицы и обсуждается важность хеш-функций и популярных методов разрешения конфликтов.

04:00:00
- 05:00:00 Раздел посвящен различным аспектам хеш-таблиц и их реализации. В нем обсуждается важность хеш-функций, которые сопоставляют ключи со значениями, и как обрабатывать коллизии хэшей с помощью таких методов, как раздельное связывание и открытая адресация. В учебнике также рассматриваются методы вставки, удаления и поиска записей в хэш-таблицах, а также изменения размеров и управления коэффициентами загрузки. Докладчик подчеркивает важность выбора подходящей функции проверки и размера таблицы, чтобы избежать бесконечных циклов и проблем с производительностью. Практические примеры используются на протяжении всего руководства для иллюстрации концепций.

05:00:00
- 06:00:00 В этом разделе представлен всесторонний обзор хэш-таблиц, двойного хеширования и квадратичного зондирования при разрешении коллизий. В видео рассматриваются концепции изменения размера и увеличения хэш-таблицы, обработки коллизий и удаления, а также реализации хэш-таблиц с использованием квадратичного зондирования. Видео также знакомит с деревом Фенвика, структурой данных, которая поддерживает запросы диапазона и обновления точек в логарифмическом времени с линейным временем построения. Видео содержит пошаговое объяснение того, как выполнять запросы сумм префиксов и диапазонов с помощью дерева Фенвика.

06:00:00 - 07:00:00 Видеоруководство охватывает различные темы, в том числе концепцию дерева Фенвика для быстрых запросов диапазона и обновления точек, использование массивов суффиксов и массива LCP для поиска уникальных подстрок и самых длинных общих подстрок, а также решение самая длинная общая проблема подстроки с использованием метода скользящего окна. В учебнике также объясняется, как эффективно находить самую длинную повторяющуюся подстроку с использованием массива LCP, и рассматриваются свойства и важность сбалансированных двоичных деревьев поиска, в частности деревьев AVL, и то, как их можно поддерживать сбалансированными с помощью вращения деревьев. Видео содержит подробные пояснения, примеры и исходный код на Java, доступный на GitHub.

07:00:00 - 08:00:00 В этом разделе подробно рассматривается ряд структур данных и их реализации. В видео обсуждаются деревья AVL, объясняются методы вставки и удаления, а также способы расширения метода удаления двоичного дерева поиска для деревьев AVL. Инструктор также предоставляет исходный код для реализации рекурсивного дерева AVL на Java, объясняя метод частной вставки, а также методы обновления и балансировки. Позже в видео подробно рассказывается об очередях с индексированными приоритетами, объясняется, как присваивать значения индекса ключам, и предоставляется псевдокод для полезных операций, таких как вставка, обновление и удаление. В видео также подробно рассказывается, как улучшить удаление узлов с линейной временной сложности до логарифмической временной сложности с помощью поиска положения узла.

Часть 1

  • 00:00:00 Докладчик представляет концепцию структур данных как способ эффективной организации данных и то, как они необходимы для создания более быстрых и мощных алгоритмов. Докладчик говорит о важности понимания того, как и когда использовать подходящую структуру данных для поставленной задачи, и о том, как структуры данных могут сделать код чище и проще для понимания. Также объясняется концепция абстрактного типа данных вместе с примерами того, как абстрактный тип данных предоставляет только интерфейс, а не конкретные детали того, как должна быть реализована структура данных. Кроме того, видео кратко затрагивает вычислительную сложность, чтобы понять производительность структур данных.

  • 00:05:00 Представлена концепция нотации Big O как способ стандартизации того, сколько времени и места требуется для запуска алгоритма на основе наихудшего возможного расположения входных данных. Big O заботится только о том, что происходит, когда входные данные становятся действительно большими, и удаляет постоянные значения, добавленные к нотации большого O. Также вводится понятие функции f, и утверждается, что большое значение O от f от n равно просто n в кубе, что является самым большим и доминирующим членом этой функции.

  • 00:10:00 Google Engineer приводит конкретные примеры использования нотации Big O. Примеры классифицируются в зависимости от их временной сложности: постоянное время, линейное время, квадратичное время, логарифмическое время. Он также предоставляет пошаговое описание того, как достигается логарифмическая временная сложность на примере бинарного поиска. Кроме того, он демонстрирует, как вычислить временную сложность более сложного алгоритма, и объясняет правило определения сложности алгоритма.

  • 00:15:00 Докладчик обсуждает анализ сложности вложенного цикла с внешним циклом и внутренним циклом. Внутренний цикл имеет постоянный объем работы, а внешний цикл имеет переменный объем работы. Большой O функции равен O (n ^ 4), поскольку n ^ 3 является доминирующим членом. Затем докладчик представляет статические массивы, представляющие собой контейнеры фиксированной длины, содержащие индексируемые элементы, представляющие собой непрерывные фрагменты памяти. Статические массивы используются везде, от временного хранения объектов до хранения информации из входного или выходного потока. Докладчик описывает базовую структуру массива, общие операции, которые можно с ним выполнять, и анализ их сложности.

  • 00:20:00 Преподаватель обсуждает использование массивов в программировании, в том числе в качестве обходного пути для языков, допускающих только одно возвращаемое значение, и в динамическом программировании. Он объясняет, что массивы имеют постоянное время доступа из-за их свойства индексируемости, но поиск может занимать линейное время в худшем случае. Вставка, добавление и удаление из статического массива невозможны, но с динамическим массивом изменение размера внутреннего массива для добавления приводит к редкой, но постоянной операции времени. Наконец, он отмечает, что элементы можно перебирать, используя цикл for-each, и что индексация массива в информатике начинается с нуля, что может сбить с толку некоторых новичков.

  • 00:25:00 В видео обсуждается концепция индексирования в массивах, где квадратная скобка обозначает индексирование, и то, как динамические массивы могут увеличиваться и уменьшаться по мере необходимости, что позволяет выполнять операции получения набора, аналогичные статическим массивам. Для реализации динамического массива используется статический массив, а при превышении емкости размер массива удваивается, а все элементы копируются в новый статический массив. В видео также показан исходный код класса массива, который поддерживает дженерики типа T и имеет переменные экземпляра для внутреннего статического массива, длины и емкости.

  • 00:30:00 Преподаватель рассказывает о реализации нескольких методов для динамического массива, включая размер, вставку, очистку, добавление, удаление, индекс, содержит и toString. Метод add включает изменение размера массива путем удвоения его размера при достижении емкости, а метод remove использует два индекса для копирования всех элементов массива, кроме индекса удаления. Преподаватель также демонстрирует, как создать итератор для динамического массива, и рассказывает о преимуществах использования итератора для перебора элементов массива. В целом, учебник представляет собой простое, но всестороннее введение в реализацию динамических массивов.

  • 00:35:00 Преподаватель представляет введение в одно- и двусвязные списки, объясняя, что они представляют собой последовательный список узлов, которые содержат данные и указывают на другие узлы, содержащие данные. Связанные списки используются при реализации списков, стеков и очередей, а также циклических списков, отдельных цепочек хеш-таблиц, а также для списков смежности и графов. Преподаватель также описывает некоторые полезные термины для создания связанных списков. Кроме того, обсуждаются преимущества и недостатки односвязных и двусвязных списков, при этом односвязные списки более эффективны с точки зрения использования памяти, но не имеют возможности доступа к предыдущим элементам, в то время как двусвязные списки можно просматривать в обратном направлении и позволяют легко удалить узел.

  • 00:40:00 Преподаватель объясняет детали реализации создания и вставки узлов в односвязный и двусвязный список. Чтобы вставить узел в односвязный список, создается новый указатель, а указатель обхода перемещается в желаемую позицию, после чего создается новый узел и связывается с другими узлами. С другой стороны, двусвязный список имеет как следующий, так и предыдущий указатели, и при вставке нового узла необходимо обновить как указатели соседних узлов, так и новый узел. Удаление узла из односвязного списка включает использование двух указателей для перехода к нужному узлу и его удаления, а затем освобождение его памяти позже.

  • 00:45:00 Докладчик рассказывает, как удалять узлы из двусвязного списка, что проще, чем удаление узлов из односвязного списка, поскольку нам не нужно вручную поддерживать ссылки на последний узел. Докладчик показывает реализацию на Java и обсуждает сложность различных операций в связанных списках, таких как поиск и удаление элементов из головы или хвоста. В то время как поиск в связанном списке является линейным в худшем случае, вставка в начало или удаление заголовка выполняется за постоянное время. Удаление из хвоста занимает линейное время в односвязном списке, но не в двусвязном списке, поскольку он имеет ссылку на предыдущий узел.

  • 00:50:00 В этом разделе видео ведущий объясняет реализацию двусвязного списка с методами очистки списка, получения размера и проверки на пустое состояние, а также добавления узлов в начало и конец списка. Он также объясняет, как просмотреть первый или последний элемент списка, удалить первый или последний элемент и удалить произвольный узел в середине списка. Докладчик подчеркивает важность правильного освобождения памяти и устанавливает класс узла как закрытый, чтобы пользователи не могли получить к нему прямой доступ.

  • 00:55:00 В этом разделе видео преподаватель объясняет, как удалить узел определенного индекса из связанного списка, даже если узлы не проиндексированы явно. Метод Remove поддерживает удаление произвольного значения из связанного списка и поиск пустых значений. Преподаватель также объясняет индекс метода для получения индекса объекта в связанном списке и метод итератора. Наконец, преподаватель знакомит со структурой данных стека и кратко дает обзор ее основных операций: push и pop. Преподаватель также подчеркивает, что следующие видеоролики этой серии будут посвящены реализации стека, проблемам, решаемым с использованием стеков, и временной сложности, связанной с операциями со стеком.

Часть 2

  • 01:00:00 В видео обсуждается, как функционирует стековая структура данных и как она используется в программировании. Видео предоставляет подробный пример того, как операции добавляются и удаляются из стека, и объясняет, как стеки используются в текстовых редакторах, компиляторах и поддерживают рекурсию. Кроме того, в видео показано, как можно использовать стек для выполнения поиска в глубину на графе, и представлен классный пример задачи о том, как определить, является ли последовательность скобок допустимой или нет с использованием стека. Наконец, видео включает в себя анализ сложности стеков и того, как они функционируют как связанный список.

  • 01:05:00 Инженер Google демонстрирует, как проверить правильность последовательности скобок, используя структуру данных стека. Он выполняет алгоритм шаг за шагом, помещая левые скобки в стек и извлекая их при встрече с правыми скобками, и проверяет, совпадают ли они. Он также объясняет, как игра «Ханойская башня» может быть связана со стопками, поскольку каждый стержень представляет собой стопку, а диски представляют собой элементы, которые можно перемещать только при определенных условиях. Наконец, он обсуждает, как можно реализовать стеки с помощью массивов или связанных списков.

  • 01:10:00 Мы узнаем о создании стека с использованием односвязного списка и извлечении элементов из стека в простой реализации структуры данных стека на языке программирования Java. Стек создается путем указания головы на нулевой узел, что означает, что стек пуст. Новые элементы вставляются перед головкой, а извлечение элементов выполняется путем перемещения указателя головки к следующему узлу и освобождения последнего узла. Утечки памяти в структурах данных могут вызывать проблемы, поэтому важно следить за ними во всех структурах данных и при необходимости исправлять их.

  • 01:15:00 Преподаватель обсуждает очереди, линейную структуру данных, используемую для моделирования реальной очереди с двумя основными операциями: постановкой в очередь и удалением из очереди. Передняя и задняя части очереди используются для вставки и удаления элементов соответственно. Преподаватель также объясняет различные термины, связанные с очередями, при этом постановку в очередь иногда называют добавлением, а удаление из очереди — опросом или удалением из начала очереди. Классическим примером очереди является очередь в кинотеатре или ресторане, и очереди могут быть полезны для отслеживания x самых последних элементов в последовательности.

  • 01:20:00 В видео объясняется, как очереди используются для управления запросами к серверу и выполнения поиска в ширину на графе. Вводится концепция постановки запросов в очередь, когда бездействующий сервер может обрабатывать только определенное количество запросов за раз, а любые избыточные запросы помещаются в очередь. В видео также рассматриваются основы поиска в ширину, при котором узлы графа посещаются в порядке их удаления от начального узла. Видео завершается объяснением реализации n-очередей и исключений из очереди элементов с использованием структуры данных очереди.

  • 01:25:00 В руководстве рассматриваются очереди и объясняется, как можно реализовать абстрактный тип данных очереди с использованием либо массивов, либо различных типов связанных списков — односвязных списков и двусвязных списков. В учебнике приводится пример того, как может работать реализация очереди с односвязным списком, а также обсуждается реализация различных методов очереди, таких как пик, опрос и предложение, с использованием языка программирования Java. В учебнике также есть ссылка на исходный код реализации очереди на github.com.

  • 01:30:00 В этом разделе руководства инженер Google объясняет концепцию и реализацию структур данных, в частности очередей и очередей с приоритетом. Он обсуждает, как очередь с приоритетом работает аналогично обычной очереди с той лишь разницей, что каждый элемент имеет определенный приоритет, а элементы с более высоким приоритетом выходят из очереди первыми. Он также подчеркивает, что очереди с приоритетом поддерживают только сопоставимые элементы, а это означает, что данные, которые мы вставляем в очередь с приоритетом, должны быть упорядочены. Кроме того, он приводит пример, объясняющий операции опроса и добавления элементов в приоритетную очередь. В следующих разделах руководства он более подробно расскажет об общих операциях, выполняемых с очередями с приоритетом, превращении очередей с минимальным приоритетом в очереди с максимальным приоритетом, анализе сложности и способах реализации очередей с приоритетом.

  • 01:35:00 Инженер Google объясняет, как приоритетные очереди реализуются с использованием кучи. Куча — это древовидная структура данных, которая удовлетворяет инварианту кучи, что означает, что значение родительского узла всегда больше или равно значению дочернего узла для всех узлов, что приводит к двум типам кучи: Макс. и мин кучи. Кучи важны, поскольку они формируют каноническую базовую структуру данных для приоритетных очередей. Затем инженер Google показывает примеры структур и спрашивает аудиторию, являются ли они кучами или нет, демонстрируя, что все кучи должны быть деревьями и удовлетворять инварианту кучи.

  • 01:40:00 Обсуждается важность приоритетных очередей в таких алгоритмах, как алгоритм поиска кратчайшего пути Дейкстры и кодирование Хаффмана. Очереди с приоритетом полезны в ситуациях, когда необходимо динамически выбирать следующий лучший или худший элемент. Основное внимание уделяется очередям с приоритетом, реализованным в виде двоичных куч, и операциям, включая добавление элемента, удаление элемента, проверку содержания и изменение очередей с минимальным приоритетом на очереди с максимальным приоритетом. Хэш-таблицы можно использовать для улучшения удаления временной сложности до логарифмической, в то время как линейное сканирование выполняется для всех элементов для наивного метода. Раздел завершается хаком для преобразования очередей с минимальным приоритетом в очереди с максимальным приоритетом.

  • 01:45:00 Инженер Google объясняет, как использовать отрицание как простой способ реализовать обратные кучи в очередях с приоритетом. Он приводит примеры как числовых, так и строковых манипуляций с использованием очереди с минимальным приоритетом со стандартным лексикографическим компаратором, а также инвертированным компаратором. Инженер также представляет концепцию двоичных куч и способы добавления в них элементов.

  • 01:50:00 Преподаватель объясняет важную терминологию и понятия, необходимые для понимания того, как эффективно добавлять элементы в приоритетную очередь с помощью двоичной кучи. Он поясняет, что приоритетная очередь — это не куча, а абстрактный тип данных, определяющий поведение приоритетной очереди, и что кучи — это всего лишь структура данных, которая позволяет реализовать это поведение. Он также обсуждает типы куч, включая двоичные кучи, и объясняет свойство полного двоичного дерева и то, как представлять двоичную кучу с помощью конструкции массива.

  • 01:55:00 Инженер Google объясняет, как добавлять узлы в двоичную кучу и поддерживать инвариантность кучи, используя технику простого доступа к дочерним и родительским узлам узла. Они иллюстрируют пример вставки значений в мини-кучу и демонстрируют, как всплывать узлы, чтобы удовлетворить инварианту кучи. В следующем разделе инженер описывает удаление элементов из двоичной кучи и подчеркивает важность удаления корневого значения, представляющего интересующий узел с наивысшим приоритетом.

Часть 3

  • 02:00:00 Инженер Google объясняет процесс удаления узлов из структуры данных двоичной кучи с помощью метода pull. Вытягивание производится в двух случаях, при удалении корневого узла и при удалении конкретного узла. При удалении корневого узла узел заменяется последним узлом в массиве, а инвариантность кучи обеспечивается за счет всплытия вниз. При удалении определенного узла узел ищется линейно, заменяется последним узлом в куче, а затем обеспечивается инвариантность кучи посредством всплытия вверх или вниз в зависимости от значения замененного узла. Инженер заключает, что вытягивание занимает логарифмическое время для корневого узла и линейное время для конкретного узла.

  • 02:05:00 В этом разделе руководства инженер Google объясняет, как удалять узлы в куче с улучшенной временной сложностью, используя хеш-таблицу. Вместо линейного сканирования для поиска индекса удаляемого узла каждый узел сопоставляется с индексом, в котором он находится. Когда мы хотим удалить конкретный узел, мы просто просматриваем его индекс, чтобы начать это делать. В видео также рассказывается, как решить проблему множественных значений в куче и как отслеживать позиции значений в дереве. Инженер объясняет, что пока мы удовлетворяем инвариант кучи, не имеет значения, какой узел мы удаляем. Учебное пособие включает примеры добавления, извлечения и удаления элементов с помощью предложенной новой схемы.

  • 02:10:00 Докладчик объясняет, как вставлять, удалять и поддерживать инвариант кучи в приоритетной очереди, используя структуру данных кучи. Затем он погружается в исходный код и выделяет некоторые важные переменные экземпляра и конструкторы, необходимые для реализации приоритетной очереди. Он объясняет, что элементы, разрешенные в очереди с приоритетом, должны реализовывать сопоставимый интерфейс и что регистрацию и удаление можно отслеживать с помощью карты, которая сопоставляет элемент с набором целых чисел, представляющих позиции элемента в куче.

  • 02:15:00 В этом разделе руководства инженер Google обсуждает различные способы создания очереди с приоритетом, в том числе создание изначально пустой очереди с заданной емкостью, создание очереди с заданной начальной емкостью и построение очереди в линейном порядке. время с помощью операции heapify. Инженер также рассматривает некоторые простые методы очереди с приоритетами, включая пустую, очистку, размер, просмотр, опрос и содержание. Также обсуждается метод добавления с подробностями о том, как добавлять элементы в очередь, и о важности отслеживания элементов на карте. Функция плавания также выделена как необходимый шаг после добавления элемента в конец списка.

  • 02:20:00 В этом разделе видео инженер Google объясняет методы плавания и опускания узлов в структуре данных двоичной кучи. Метод плавания включает в себя перестановку узлов с его родителем и перемещение вверх, пока узел не окажется в правильном положении в зависимости от его значения. Метод погружения аналогичен, но включает в себя сравнение узла с его дочерними узлами и замену на меньший, пока он не достигнет правильной позиции. Инженер также объясняет методы swap, remove и remove add, реализованные в двоичной куче. Метод удаления и добавления включает в себя замену удаленного узла на последний элемент в куче и опускание или перемещение нового узла в соответствующую позицию.

  • 02:25:00 В этом разделе руководства инструктор объясняет, как удалить узел из структуры данных кучи и обеспечить поддержание минимальной целостности кучи с помощью метода погружения или плавания узлов в зависимости от того, влияет ли своп на структуру кучи. заказ. В этом разделе также представлена структура данных union find и две ее основные операции, find и union, которые используются для отслеживания элементов, разделенных на непересекающиеся множества, и для объединения двух групп соответственно.

  • 02:30:00 Спикер на примере магнитов объясняет, как работает структура данных union find. Объединение find эффективно объединяет элементы или группы элементов, присваивая им произвольный цвет. Структура данных union find используется в различных алгоритмах, таких как алгоритм минимального остовного дерева и перколяция сетки. Объединение find имеет превосходную сложность, и его построение линейно по времени, в то время как его функция подсчета компонентов может определить количество компонентов за постоянное время, что делает его отличной структурой данных.

  • 02:35:00 В этом разделе руководства инженер Google объясняет алгоритм Крускала для поиска минимального остовного дерева в графе. Алгоритм включает в себя сортировку ребер по возрастанию веса ребра, а затем объединение узлов, не принадлежащих к одной группе, до тех пор, пока все вершины не будут объединены в одну группу. Структура данных union find используется для эффективного объединения групп и предотвращения циклов. Инженер предоставляет пример графика и проходит по шагам алгоритма, чтобы проиллюстрировать, как он работает.

  • 02:40:00 В учебнике объясняется структура данных union find и то, как она работает внутри. Первый шаг — создать сопоставление между объектами и целыми числами в диапазоне от нуля до N включительно, где N — количество элементов. Затем строится массив, и каждый индекс имеет связанный с ним объект, что выполняется посредством сопоставления. Значение в позиции массива изначально является индексом, в котором он находится, и каждый узел является корневым узлом, отображающим сам себя. По мере выполнения инструкций по объединению объектов в группы значения в массиве изменились, чтобы сопоставиться с другими объектами. Меньшие компоненты объединяются в более крупные, а корневые узлы используются для объединения групп.

  • 02:45:00 Спикер рассказывает о том, как объединить элементы в разные группы с помощью структуры данных union find. Находя и отслеживая родительские узлы корневого узла каждого компонента, мы можем определить, какому компоненту принадлежит элемент. Чтобы объединить два компонента, мы делаем так, чтобы один из корневых узлов указывал на родительский узел другого корня. Количество компонентов равно количеству оставшихся корневых узлов, и количество корневых узлов только уменьшается по мере объединения компонентов. Спикер также отмечает, что реализация этой структуры в настоящее время не имеет амортизированной временной сложности без использования сжатия пути, оптимизация которого будет рассмотрена в следующем видео.

  • 02:50:00 Представлена концепция сжатия пути, чтобы показать, как она делает структуру данных поиска объединения более эффективной. Сжатие пути включает в себя сжатие всех узлов на пути к корневому узлу, что позволяет постоянно искать корневой узел для любого заданного компонента. Приведен пример объединения групп со сжатием пути и без него, чтобы сравнить и противопоставить два метода, демонстрируя эффективность, полученную за счет сжатия пути.

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

Часть 4

  • 03:00:00 Преподаватель знакомит со структурой данных union-find и ее методами, включая find, connect, parent, size и unify. Он демонстрирует, как корневые узлы структуры содержат размер каждого подключенного компонента, а метод unify объединяет меньшие группы в более крупные. Переходя к деревьям, инструктор дает краткий обзор деревьев как неориентированных графов и знакомит с бинарными деревьями и бинарными деревьями поиска. Он обещает рассказать, как вставлять и удалять узлы в бинарных деревьях поиска, обходы деревьев и как их можно применять к общим деревьям в последующих руководствах.

  • 03:05:00 Представлено понятие деревьев с несколькими определениями. Дерево можно определить как неориентированный связный и ациклический граф, как граф с n узлами и n-1 ребрами или как граф, в котором между любыми двумя вершинами существует только один путь. Также вводится корневое дерево, где любой узел может стать корнем, а также определены дочерние и родительские узлы. Родителем корневого узла является он сам, а конечные узлы определяются как узлы без дочерних элементов. Также вводится понятие поддерева, обозначаемого треугольниками внутри дерева. Кроме того, определение бинарного дерева объясняется как дерево, в котором каждый узел имеет не более двух дочерних элементов.

  • 03:10:00 Видео рассказывает о бинарных деревьях поиска, то есть бинарных деревьях, удовлетворяющих инварианту бинарного дерева поиска. Это означает, что левое поддерево всегда имеет значения меньше, чем текущий узел, а правое поддерево имеет большие значения. Видео представляет различные примеры бинарных деревьев поиска и предлагает зрителям определить, удовлетворяют ли они инварианту. Двоичные деревья поиска полезны во многих реализациях абстрактных типов данных и используются в сбалансированных двоичных деревьях поиска и синтаксических деревьях. Они также имеют логарифмическую временную сложность в среднем для таких операций, как вставка и поиск случайных данных.

  • 03:15:00 В этом разделе руководства инженер Google обсуждает двоичные деревья поиска и способы вставки в них элементов. Двоичные деревья поиска в среднем имеют логарифмическое поведение, что делает их простыми в реализации и эффективными в большинстве случаев. Однако в худшем случае бинарное дерево может стать линейной структурой данных, что не является идеальным. Чтобы вставить элемент в двоичное дерево поиска, элемент должен быть сопоставим, и может произойти один из четырех случаев: рекурсия вниз по левому поддереву, рекурсия вниз по правому поддереву, обработка повторяющихся значений или вставка нового узла. Наконец, инженер демонстрирует вставку значений в двоичное дерево поиска с помощью анимации.

  • 03:20:00 Инженер Google объясняет наихудший сценарий при вставке значений в бинарное дерево поиска, что приводит к тому, что оно становится линейной структурой. Такое поведение нежелательно, поскольку оно замедляет такие операции, как поиск узлов или удаление значений. Затем инженер объясняет, как удалять элементы из бинарного дерева поиска в два этапа: сначала найти удаляемый узел, а затем заменить его его преемником, чтобы сохранить инвариантность бинарного дерева поиска. В видео показан пример поиска значений в двоичном дереве поиска, чтобы помочь понять процесс.

  • 03:25:00 Инженер Google объясняет четыре случая этапа удаления при работе с бинарным деревом поиска. В первом случае удаляемый узел является конечным узлом, во втором и третьем случае имеется только одно поддерево либо слева, либо справа. Четвертый случай возникает, когда узел имеет как левое, так и правое поддерево, и возникает вопрос, в каком поддереве будет преемник узла? Ответ заключается в том, что преемник может быть либо наибольшим значением в левом поддереве, либо наименьшим значением в правом поддереве, и может быть два возможных преемника.

  • 03:30:00 В этом разделе курса инструктор объясняет, как удалять узлы из бинарных деревьев поиска, используя концепцию узла-последователя. Преемником является либо наименьший узел в правом поддереве, либо самый большой узел в левом поддереве. Преподаватель демонстрирует удаление узлов на нескольких примерах, подчеркивая важность повторной балансировки дерева после удаления. Раздел завершается обзором различных обходов дерева, включая предварительный заказ, порядок, пост-заказ и порядок уровней.

  • 03:35:00 Преподаватель объясняет концепции обхода в прямом, последовательном и обратном порядке в двоичных деревьях. Он объясняет, что предварительный порядок выводит значение текущего узла, за которым следуют его левое и правое поддеревья, а затем приводит пример того, как обход в предварительном порядке работает в двоичном дереве, поддерживая стек вызовов для отслеживания посещенных узлов. Точно так же он объясняет, как работает обход по порядку, который включает в себя обход левого поддерева, вывод значения и затем обход правого поддерева. Преподаватель использует двоичное дерево поиска в качестве примера и выделяет порядок, в котором узлы посещаются и печатаются во время обхода.

  • 03:40:00 В туториале обсуждаются различные алгоритмы обхода бинарных деревьев. Во-первых, неупорядоченный обход, который печатает значения узлов в возрастающем порядке. Затем выполняется обход по порядку, который проходит через левое поддерево, затем правое поддерево, и только после того, как оба они пройдены, печатает значение узла. Далее в учебнике объясняется поиск в ширину и то, как его можно использовать для обхода порядка уровней, который печатает узлы по одному слою за раз. Очередь используется для отслеживания узлов, подлежащих исследованию, и узлы добавляются в очередь по мере посещения их родительских узлов.

  • 03:45:00 В этом разделе видео инструктор объясняет, как выполнять поиск в ширину с использованием структуры данных очереди. Он демонстрирует процесс исследования узлов и добавления их потомков в очередь в соответствии с их порядком. Он подчеркивает важность использования очереди вместо стека при выполнении обхода по уровням. Затем в видео основное внимание уделяется реализации двоичного дерева поиска в Java, где инструктор объясняет структуру класса, переменные экземпляра и методы, используемые для добавления элементов в дерево. Он также подчеркивает важность выбора сопоставимого типа при работе с бинарными деревьями поиска.

  • 03:50:00 Инструктор объясняет процесс удаления узлов из бинарного дерева поиска. Они начинают с обсуждения общедоступного метода удаления узлов и объясняют, что удалят узел только в том случае, если он существует в дереве, которое проверяется в первую очередь. Затем они углубляются в рекурсивный метод, используемый для удаления узла, который включает в себя поиск удаляемого узла и его фактическое удаление в зависимости от того, есть ли у него левое и/или правое поддеревья. Преподаватель объясняет три разных случая удаления, которые включают либо левое, либо правое поддерево, либо и левое, и правое поддерево. Они также предоставляют вспомогательные методы для обхода дерева для поиска следующего узла.

  • 03:55:00 Инженер Google объясняет, как реализовать бинарное дерево поиска в Python, включая вставку нового узла, поиск определенного элемента и вычисление высоты дерева. Он также показывает, как итеративно реализовать обход бинарного дерева с помощью пользовательского метода под названием «обход», который принимает порядок обхода дерева в качестве входных данных и возвращает итератор для этого порядка. Затем он представляет хэш-таблицы и обсуждает важность хэш-функций, а также популярные методы разрешения конфликтов, такие как раздельное связывание и открытая адресация.
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
  • 2019.09.19
  • www.youtube.com
Learn and master the most common data structures in this full course from Google engineer William Fiset. This course teaches data structures to beginners usi...
 

Курс «Структуры данных от простого к продвинутому» — полное руководство от инженера Google (части 5–8)


Курс «Структуры данных от простого к продвинутому» — полное руководство от инженера Google

Часть 5

  • 04:00:00 Преподаватель знакомит с концепцией хеш-таблиц и их реализацией с использованием методов хеширования. Хэш-таблицы используются для построения сопоставления ключей со значениями, где каждый ключ уникален и связан со значением. Для сопоставления ключей со значениями используется хэш-функция, которая сопоставляет ключи с целым числом в некотором фиксированном диапазоне. Преподаватель покажет, как определить хеш-функции для произвольных объектов, таких как строки, используя значения ASCII символов в строке. Хэш-таблицы часто используются для отслеживания частоты значений и построения сопоставлений между парами ключ-значение при условии, что ключи можно хэшировать. Раздел заканчивается мини-задачей по определению хеш-функции для базы данных людей с тремя полями.

  • 04:05:00 Преподаватель обсуждает хеш-функции и их свойства. Хеш-функция определяется произвольно и может иметь бесконечное количество возможностей. Преподаватель подчеркивает, что хеш-функции должны быть детерминированными, чтобы не испортить хеш-таблицу. Единообразие хеш-функций также важно для минимизации коллизий хэшей, которые происходят, когда два объекта хэшируют одно и то же значение. Преподаватель также показывает, как хеш-значения могут ускорить сравнение объектов, и продолжает объяснять, что сложные хеш-функции, такие как криптографические хэш-функции и контрольные суммы, используются для файлов вместо хэш-функций, используемых для хэш-таблиц.

  • 04:10:00 В этом руководстве объясняется, что делает ключ типа 't' хешируемым и как работает хэш-таблица, используя унифицированную хеш-функцию для ее индексирования. В нем упоминается, что хеш-функции должны быть детерминированными и применять неизменяемые ключи, которые являются фиксированными и постоянными, например неизменяемые строки и целые числа. Используя хеш-функцию как способ индексирования хеш-таблицы, мы можем добиться быстрой вставки, поиска и удаления за постоянное время. В руководстве также приводится пример вставки пар ключ-значение в таблицу, что в конечном итоге приводит к конфликту хэшей, и объясняется, как обрабатывать конфликты.

  • 04:15:00 Докладчик обсуждает методы разрешения конфликтов хэшей, в частности раздельное связывание. Раздельное связывание — это способ справиться с коллизиями хэшей путем поддержки вспомогательной структуры данных, обычно связанного списка, для хранения всех различных пар ключ-значение, которые хэшируют до определенного значения. Временная сложность хэш-таблицы может обеспечить постоянное время вставки, удаления и поиска в среднем, но с ужасной хеш-функцией, которая не является единообразной, это может быть линейное время. Докладчик также приводит пример того, как работает раздельная цепочка и как мы можем использовать ее для обработки коллизий в нашей хеш-таблице, поддерживая структуру данных связанного списка для каждого индекса в массиве.

  • 04:20:00 Спикер объясняет, как работает поиск в хеш-таблице с отдельной цепочкой, которая использует связанные списки для обработки коллизий. С заданным ключом спикер демонстрирует, как найти соответствующее значение, хэшируя ключ и выполняя поиск в связанном списке в соответствующем сегменте хеш-таблицы. Докладчик также затронет некоторые распространенные вопросы о сохранении постоянной временной сложности, удалении пар ключ-значение и использовании различных структур данных для обработки сегментов в хеш-таблице. Наконец, спикер делится исходным кодом реализации хеш-таблицы с использованием отдельной цепочки.

  • 04:25:00 Видео знакомит с хеш-таблицами и их реализацией в Java. Сначала обсуждается класс входа с упором на обобщения, хэш-коды и метод equals. Затем объясняется сама хеш-таблица, включая переменные экземпляра, такие как максимальный коэффициент загрузки, емкость, пороговое значение и сама таблица, которая представляет собой массив связанных списков. Различные методы, такие как size, empty, clear, contains key и hash, также обсуждаются вместе с деталями их реализации. Наконец, объясняется метод нормализованного индекса, который используется для преобразования хэш-значения в индекс для поиска в хэш-таблице.

  • 04:30:00 В этом разделе видео спикер объясняет методы реализации хеш-таблицы, такие как вставка, получение, удаление, поиск записи и изменение размера таблицы. Метод вставки добавляет новую запись в хеш-таблицу или обновляет существующую, а метод get извлекает значение, связанное с определенным ключом. Remove удаляет пару ключ-значение из хэш-таблицы, а метод поиска записи помогает найти запись по заданному индексу корзины. Наконец, resize table изменяет размер таблицы, удваивая ее емкость, а затем создает новую таблицу с новой емкостью, перемещает данные из старой таблицы в новую и удаляет старые данные.

  • 04:35:00 Преподаватель обсуждает метод открытой адресации для разрешения коллизий в хеш-таблицах. Этот метод сохраняет пары ключ-значение в самой таблице вместо вспомогательной структуры данных. Поэтому крайне важно управлять размером хеш-таблицы и количеством элементов в ней. Коэффициент загрузки, который представляет собой отношение элементов к размеру таблицы, должен поддерживаться ниже определенного порога, чтобы предотвратить его экспоненциальное ухудшение. При вставке нового ключа хэш-функция дает исходное положение ключа, но в случае коллизии используется последовательность проверки для поиска следующего открытого места. Линейная последовательность зондирования является одной из многих на выбор.

  • 04:40:00 Преподаватель обсуждает открытую адресацию, метод обработки коллизий в хеш-таблицах, когда элемент помещается в другое место, когда исходный хэш-индекс уже занят. Введены различные функции зондирования, такие как линейное зондирование, квадратичное зондирование, двойное хеширование и функция зондирования генератора псевдослучайных чисел, каждая из которых использует другую математическую формулу для поиска следующего слота. Однако главная трудность открытой адресации заключается в возможности создания циклов короче размера хеш-таблицы, что может привести к бесконечному циклу. Приведен практический пример, иллюстрирующий эту проблему.

  • 04:45:00 Спикер обсуждает проблему циклов в функциях зондирования, используемых в хеш-таблицах, и как с этим бороться. Докладчик объясняет, что такие методы, как линейное зондирование, квадратичное зондирование и двойное хеширование, подвержены этой проблеме циклов, но могут быть переопределены для создания цикла длины, чтобы избежать застревания в бесконечном цикле при вставке элемента. Константа «b» в линейном зондировании считается устаревшей, и докладчик упоминает, что некоторые линейные функции могут быть неспособны произвести полный цикл порядка «n». Решение этой проблемы состоит в том, чтобы выбрать функции зондирования, которые производят цикл ровно «n», убедившись, что константа «a» и размер таблицы «n» взаимно просты друг другу.

  • 04:50:00 Преподаватель обсуждает хэш-таблицы и то, как они работают, включая функции проверки, размер таблицы, коэффициент загрузки и изменение размера. Он использует пример с линейным зондированием, чтобы продемонстрировать, как вставлять пары ключ-значение в хэш-таблицу и избегать бесконечных циклов, вызванных коллизиями хэшей. Однако он отмечает, что выбор функции проверки и размера таблицы может значительно повлиять на производительность, а выбор функции, у которой наибольший общий знаменатель с размером таблицы не равен единице, может привести к зацикливанию и проблемам.

  • 04:55:00 Мы видим пример использования зондирующей функции для вставки пар ключ-значение в хеш-таблицу без каких-либо коллизий. Если столкновение все же произойдет, функция зондирования будет продолжать зондирование до тех пор, пока не будет найдено пустое место, чтобы избежать возникновения цикла. Как только количество элементов превышает пороговое значение таблицы, размер таблицы удваивается при сохранении НОД, равного N. Затем старые элементы помещаются в новую таблицу, используя новый размер таблицы, сохраняя при этом ту же функцию проверки. Наконец, вставляется новая пара ключ-значение, и если место свободно, проблем не возникает.

Часть 6

  • 05:00:00 Преподаватель обсуждает квадратичное зондирование в хеш-таблицах, которое используется для устранения коллизий при открытой адресации. Это включает зондирование по квадратичной формуле с использованием случайного выбора функции зондирования. Преподаватель объясняет, что не все квадратичные функции жизнеспособны, потому что они не создают цикл порядка, что приводит к застреванию в бесконечном цикле, но большинство случайно выбранных квадратичных функций в конечном итоге создают цикл. Преподаватель предлагает три наиболее популярных способа выбора функции зондирования и фокусируется на втором, где p of x равно x в квадрате плюс x, деленное на два, а размер таблицы равен степени двойки.

  • 05:05:00 Докладчик обсуждает процесс вставки элементов в хеш-таблицы с использованием метода двойного хеширования и разрешения коллизий открытой адресации. Они объясняют важность того, чтобы размер таблицы был степенью двойки, и как обрабатывать коллизии с помощью зондирования. Спикер также демонстрирует процесс изменения размера таблицы, когда коэффициент загрузки превышает определенный порог. Далее они обсуждают, как обновить существующие элементы и как вставить в таблицу новые.

  • 05:10:00 Преподаватель объясняет концепцию двойного хэширования — метода проверки, используемого для обработки коллизий в хеш-таблицах. Схема двойного хеширования включает зондирование в соответствии с постоянным множителем другой хеш-функции, называемой вторичной хеш-функцией. Преподаватель предупреждает о проблеме бесконечных циклов, которая может возникнуть в случае двойного хэширования, и предлагает стратегию ее устранения, которая включает в себя выбор простого числа для размера таблицы и построение значения, называемого дельта. Он также обсуждает систематический способ создания новых хеш-функций для разных типов данных с использованием одного и того же фундаментального строительного блока.

  • 05:15:00 Спикер объясняет концепцию хеш-функций и то, как их можно комбинировать для создания новой хеш-функции. В них упоминается использование универсальных хэш-функций и приводится пример использования двойного хеширования. Они обсуждают процесс вставки пар ключ-значение в хэш-таблицу, а также обработку коллизий и обновлений хэшей. В примере используется размер таблицы семь и максимальный коэффициент загрузки 0,75, а функция хэширования использует целые и действительные числа в качестве строительных блоков.

  • 05:20:00 В учебном пособии объясняется процесс изменения размера и увеличения хеш-таблицы с помощью двойного хеширования, который включает в себя удвоение размера таблицы, поиск следующего простого числа выше этого значения, выделение новой таблицы и вставку старых элементов в новую. стол. В учебном пособии приведен пример, когда исходная таблица достигла своего максимального порога после вставки пяти элементов, а размер таблицы был изменен до нового размера 17. В учебном пособии также рассматриваются проблемы, возникающие при удалении элементов из хеш-таблицы с использованием открытой адресации. схему, а также важность предотвращения коллизий во время операций вставки и удаления.

  • 05:25:00 В видео объясняется, как обрабатывать коллизии хэшей и удаление в хеш-таблице. Наивный метод удаления, который просто очищает содержимое корзины, оказался ошибочным, поскольку он влияет на возможность правильного поиска элементов в хеш-таблице. Вместо этого видео рекомендует размещать уникальный маркер, называемый надгробием, вместо удаленного элемента. Позже этот маркер можно заменить новой парой ключ-значение или удалить при изменении размера хеш-таблицы. В видео представлен пример использования квадратичного зондирования, чтобы показать, как надгробные камни используются во время поиска в хэш-таблице.

  • 05:30:00 Инженер Google представляет обзор хэш-таблиц, которые используют открытые два адреса в качестве схемы разрешения коллизий. Инженер обсуждает ленивое удаление или ленивое перемещение, которое включает в себя перемещение пар ключ-значение, чтобы не столкнуться с кучей надгробий при проверке. Инженер также предоставляет пошаговое руководство по коду для хеш-таблицы, использующей квадратичное зондирование, которое включает в себя хранение пар ключ-значение непосредственно внутри массива, а не наличие одного массива с классом-оболочкой для записи. Инженер исследует конструктор и константы по умолчанию для хеш-таблицы, что позволяет пользователям инициализировать ее без каких-либо параметров.

  • 05:35:00 В этом разделе курса инструктор объясняет реализацию хеш-таблицы с помощью квадратичного зондирования. Метод включает в себя вычисление порога, нормализацию индекса и инициализацию таблиц. Информация о методе вставки предоставляется там, где пары ключ-значение вставляются в хеш-таблицу или обновляются, если ключ уже существует. Преподаватель также обсуждает количество ключей, пустую проверку хеш-таблицы и добавление, прежде чем перейти к методу вставки. Подробно объясняется цикл do-while для вставки ключа.

  • 05:40:00 Преподаватель объясняет методы contains key, has key, get и remove реализации хеш-таблицы. Методы contains key и has key проверяют, существует ли ключ в хеш-таблице, вызывая метод get, который возвращает истинное или ложное значение для флага contains. Метод get находит хэш-индекс и ищет ключ. Если ключ существует, для флага содержимого устанавливается значение true, и возвращается значение. Метод удаления проще, при этом ключ сначала находится в хеш-таблице, затем декрементируется, а на его место выгружается захоронение. Метод таблицы изменения размера вызывается, когда вставляются новые элементы для увеличения размера таблицы, когда выделяется новая таблица, а текущая таблица заменяется новой таблицей для вызова метода вставки.

  • 05:45:00 Дерево Фенвика, также известное как дерево двоичных индексов, представлено как структура данных для эффективного вычисления запросов диапазона в массиве и выполнения обновлений точек. Мотивация дерева Фенвика — неэффективность линейных запросов при вычислении диапазонов в массиве. Вычисляя все суммы префиксов для массива, запросы диапазона можно вычислять за постоянное время. Однако обновления массива требуют пересчета всех сумм префиксов, что делает процесс неэффективным. Дерево Фенвика было создано, чтобы решить эту проблему, поддерживая запросы диапазона и обновления точек в логарифмическом времени с линейным временем построения. Дерево Фенвика работает так, что каждая ячейка отвечает за диапазон других ячеек на основе значения ее младшего значащего бита.

  • 05:50:00 В этом разделе видео инструктор обсуждает деревья Фенвика и то, как они работают для запросов диапазона. Он показывает диаграмму с массивом, основанным на единице, и двоичным представлением каждого числа. На диаграмме показаны младшие значащие биты, отвечающие за себя, и все остальные ячейки, отвечающие за диапазон из 2, 4, 8 или 16 ячеек. Чтобы выполнить запрос диапазона, инструктор объясняет, как вычислить сумму префиксов до определенного индекса путем каскадирования вниз до достижения нуля. Он демонстрирует, как найти сумму префиксов для определенного индекса и как вычислить сумму интервалов между двумя заданными индексами.

  • 05:55:00 Мы узнаем о вычислении сумм префиксов с использованием каскадного эффекта вниз и о том, как выполнить алгоритм запроса диапазона с использованием деревьев Фенвика. Вычисление суммы префикса включает в себя начало с заданного индекса и вычитание младшего значащего бита из значения до тех пор, пока оно не достигнет нуля, а затем добавление всех значений во время каждого вычитания. Алгоритм запроса диапазона использует деревья Фенвика, где мы берем разницу между суммами префиксов для запросов диапазона. Алгоритм требует манипулирования битами и предоставляет аккуратный небольшой алгоритм для более быстрых вычислений. Автор видео рекомендует просмотреть предыдущее видео с запросом диапазона дерева Фенвика, чтобы узнать больше о том, как настраивается дерево и как над ним выполняются операции.

Часть 7

  • 06:00:00 Инженер Google объясняет концепцию обновления точек и построения дерева Фенвика. Обновления точек включают добавление значений в дерево по определенному индексу и поиск ячеек, отвечающих за этот диапазон ответственности. Между тем, линейная конструкция дерева Фенвика включает обновление непосредственной ячейки, отвечающей за значение, путем распространения значений по всему дереву на месте, в результате чего получается полностью функциональное дерево Фенвика. Процесс распространения основан на каскадной идее обновления родителя, ответственного за конкретное значение.

  • 06:05:00 В этом разделе руководства подробно объясняется концепция дерева Фенвика. Дерево Фенвика — это структура данных, которая используется для быстрого выполнения запросов диапазона и обновления точек в массиве значений. Структура данных использует тип двоичного индексирования, в котором каждая ячейка отвечает за передачу своего значения родительскому элементу и так далее. Также обсуждается алгоритм построения дерева Фенвика, который включает преобразование массива значений в дерево Фенвика путем клонирования исходного массива и вычисления родительской ячейки для каждого элемента в новой древовидной структуре. Показан исходный код реализации дерева Фенвика на Java, который доступен в репозитории GitHub.

  • 06:10:00 Преподаватель объясняет, как создать класс дерева Фенвика и его различные конструкторы. Он также объясняет суммы префиксов, что позволяет вычислить сумму префиксов от одного до i включительно. В видео также показано, как добавить из точки обновление и дополнительный метод установки индекса, равного k. Преподаватель подчеркивает важность использования бинарных манипуляций и структуры данных массива суффиксов, которые очень полезны при обработке строк.

  • 06:15:00 Вводится понятие суффиксов и массивов суффиксов, с примером построения массива суффиксов для слова "верблюд". Массив суффиксов представляет собой массив отсортированных индексов, который позволяет сжатое представление отсортированных суффиксов без сохранения самих суффиксов, что делает его эффективной альтернативой суффиксному дереву. Массив самого длинного общего префикса (LCP), в котором хранится, сколько символов имеют друг с другом два отсортированных суффикса, также представлен как важная часть информации, связанная с массивом суффиксов, с примером построения массива LCP для данного нить.

  • 06:20:00 В видео обсуждается применение массивов суффиксов и массивов LCP для поиска и подсчета уникальных подстрок более эффективным способом, чем наивный алгоритм, требующий много места. Используя информацию, хранящуюся внутри массива LCP, он обеспечивает не только быстрое, но и эффективное решение. Массив LCP представляет общее количество символов между двумя соседними суффиксами исходной строки. Изучая значения LCP, можно определить, какие подстроки повторяются, и исключить их, чтобы эффективно подсчитать все уникальные подстроки.

  • 06:25:00 Докладчик обсуждает задачу нахождения самой длинной общей подстроки, разделяемой не менее чем k из n заданных строк. Одним из подходов к решению этой проблемы является динамическое программирование, но оно может быстро стать громоздким. Лучшим подходом является использование массива суффиксов, который может найти решение за линейное время. Чтобы сделать это, спикер объясняет, что мы сначала объединяем все строки в большую строку, добавляя уникальные контрольные значения между каждой строкой, чтобы избежать смешения суффиксов. Затем мы создаем массив суффиксов для этой объединенной строки, что позволяет нам найти самую длинную общую подстроку из K строк путем поиска K строк с разными цветами, которые имеют наибольшее значение LCP.

  • 06:30:00 В видеоруководстве обсуждается, как найти самую длинную общую подстроку из k разных цветов в строке с помощью метода скользящего окна. Подход состоит в том, чтобы отрегулировать размер окна, чтобы он содержал k суффиксов разных цветов, и запросить минимальное значение LCP в этом диапазоне. Запрос минимального диапазона может быть решен с использованием линейного решения или структуры данных запроса минимального диапазона, такой как дерево сегментов. В учебнике также рекомендуется использовать хеш-таблицу для отслеживания цветов в окне. Скользящее окно расширяется вниз, чтобы захватить отсутствующие цвета, и сжимается, когда критерии соблюдены.

  • 06:35:00 В этом разделе видео инструктор демонстрирует пример решения задачи на самую длинную общую подстроку с помощью массива суффиксов. Значения LCP окна и LCS окна помогают отслеживать самый длинный общий префикс и самые длинные общие значения подстроки для текущего окна, в то время как длина LCS и набор LCS отслеживают наилучшие значения на данный момент. В примере используются четыре строки и как минимум две строки из пула из четырех для совместного использования самой длинной общей подстроки. Преподаватель демонстрирует, как расширять и сжимать окно при поиске самой длинной общей подстроки, и намекает на задачу, которую зрители могут проверить на веб-сайте трансляции, и дает ссылку на реализацию алгоритма на GitHub.

  • 06:40:00 Видео объясняет процесс решения задачи на самую длинную общую подстроку с использованием метода скользящего окна. Расширяя и уменьшая размер окна и используя массив самых длинных общих префиксов для идентификации общих подстрок, алгоритм находит решение с линейной временной сложностью. Затем видео знакомит с проблемой самой длинной повторяющейся подстроки и объясняет, как использовать самый длинный общий массив префиксов для эффективного поиска самой длинной повторяющейся подстроки в заданной строке по сравнению с наивным подходом, который требует времени N в квадрате и большого количества памяти.

  • 06:45:00 Инженер Google учит, как использовать массив суффиксов и массив LCP для поиска самой длинной повторяющейся подстроки. Значение LCP в индексе дает длину самого длинного общего префикса между двумя соседними суффиксами. Максимальное значение в массиве LCP дает длину самой длинной повторяющейся подстроки. В случае равенства должны быть найдены все возможные самые длинные значения. Затем инженер объясняет важность сбалансированных бинарных деревьев поиска и то, чем они отличаются от традиционных бинарных деревьев поиска с точки зрения самонастраиваемости для поддержания логарифмической высоты относительно количества узлов, которые они содержат, что делает вставку и удаление чрезвычайно быстрыми. Ключевой концепцией для достижения этого является вращение дерева, и они будут обсуждаться далее в видео.

  • 06:50:00 Объясняется концепция инварианта дерева и вращения дерева в сбалансированных бинарных деревьях поиска. Инвариант дерева — это правило, накладываемое на дерево, которое должно выполняться в конце каждой операции, что обеспечивается применением серии поворотов дерева. Вращения дерева — это законные преобразования, которые перемещают узлы в дереве, не нарушая инвариант бинарного дерева поиска, если порядок и размещение узлов сохраняются. Подробно объясняется процесс поворота вправо и обсуждаются шаги, связанные с обновлением указателей, когда узлы имеют ссылки как на дочерние, так и на родительские узлы.

  • 06:55:00 В этом видеоруководстве основное внимание уделяется демонстрации того, как вставлять узлы в дерево AVL с помощью метода вращения дерева, а также объясняются свойства, обеспечивающие сбалансированность деревьев AVL. Во-первых, видео объясняет, что такое дерево AVL, и его значение как первого типа сбалансированного двоичного дерева поиска. Затем видео вводит коэффициент баланса, который представляет собой разницу между высотой правого поддерева и левого поддерева. В видео подчеркивается, что коэффициент баланса каждого узла должен быть минус один, ноль или плюс один для поддержания баланса дерева AVL. Затем учебник переходит к обсуждению того, как обрабатывать случаи, когда это не так, что можно решить с помощью поворота дерева.

Часть 8

  • 07:00:00 Инструктор объясняет четыре различных случая поворотов, необходимых для балансировки левого тяжелого дерева в дереве AVL. Инструктор также предоставляет псевдокод для вставки узла в дерево AVL и объясняет методы обновления и балансировки. Метод обновления вычисляет высоту и коэффициент баланса узла, а метод баланса проверяет, не нарушает ли коэффициент баланса узла свойство дерева AVL, и определяет соответствующий поворот для повторной балансировки дерева. Случаи лево-право и право-лево также объясняются, поскольку они сводятся к случаям лево-лево и право-право после первого поворота.

  • 07:05:00 В видео объясняется, как удалять элементы из дерева avielle, что очень похоже на удаление элементов из обычного бинарного дерева поиска. Процесс удаления можно разбить на два этапа: найти элемент и заменить его узлом-преемником, чтобы сохранить инвариантность бинарного дерева поиска. Поиск узла включает в себя сравнение целевого элемента с узлами в дереве до тех пор, пока не будет найдено совпадение или поиск не достигнет конца дерева. Процесс замены зависит от того, является ли удаляемый узел конечным узлом или имеет только левое или правое поддерево, при этом узел-преемник является непосредственным дочерним элементом в последних двух случаях.

  • 07:10:00 Преподаватель объясняет, как удалить узел из бинарного дерева поиска, и приводит примеры для трех случаев удаления. Первый случай — когда удаляемый узел не имеет дочерних элементов, второй — когда у него есть один дочерний узел, а последний — когда у него два дочерних элемента. Инструктор также объясняет, как расширить метод удаления двоичного дерева поиска для деревьев AVL, просто добавив две строки кода, чтобы гарантировать, что дерево остается сбалансированным, а значения коэффициента балансировки и высоты остаются актуальными. Наконец, инструктор предоставляет ссылку на свой репозиторий GitHub, где зрители могут найти исходный код дерева AVL и живую демонстрацию дерева AVL в действии.

  • 07:15:00 Преподаватель объясняет исходный код реализации рекурсивного дерева AVL на Java. Дерево AVL принимает аргумент универсального типа и сохраняет значение внутри узла, которое должно быть сопоставимым. Подкласс узла хранит левый и правый дочерние указатели, а также высоту и коэффициент баланса узла. Дерево можно отобразить на терминале с помощью интерфейса принтера дерева, а общедоступные методы, такие как size, is empty и set contains, предусмотрены в коде. Метод вставки также объясняется с использованием базовых случаев и сравнительных значений, чтобы определить, была ли вставка успешной или нет.

  • 07:20:00 Объясняется закрытый метод вставки в дерево AVL, который вставляет новые узлы либо в левое, либо в правое поддерево, при этом соответственно обновляя коэффициент баланса и высоту узлов. Метод update обновляет высоту и коэффициент баланса узла, а метод balance вызывает необходимые методы вращения для поддержания баланса дерева. Объясняются случаи лево-лево, лево-право, право-право и право-лево, а порядок методов обновления после поворота подчеркивается как критически важный для дерева AVL для поддержания его баланса.

  • 07:25:00 Преподаватель обсуждает метод удаления структуры данных двоичного дерева поиска. Он объясняет, что для удаления элемента метод сначала проверяет, существует ли этот элемент в дереве, а затем вызывает закрытый метод удаления. Преподаватель описывает четыре случая, которые могут возникнуть при удалении, и предлагает эвристику для определения, из какого поддерева следует удалить при попытке удалить узел с обоими поддеревьями. Наконец, он напоминает зрителям вызывать метод обновления и перебалансировки при обратном вызове метода удаления, чтобы гарантировать, что дерево остается сбалансированным, несмотря на удаление узлов.

  • 07:30:00 Инженер Google представляет индексированную приоритетную очередь, структуру данных, которая поддерживает быстрое обновление и удаление пар ключ-значение. Это решает проблему возможности быстрого поиска и динамического изменения значений в очереди приоритетов, что может быть полезно в различных ситуациях, например в приемной больницы, где пациенты должны обслуживаться в первую очередь с наивысшим приоритетом. Инженер приводит пример пациентов с разными приоритетами и показывает, как очередь с индексированными приоритетами может помочь в обновлении приоритетов на лету.

  • 07:35:00 В видео обсуждаются очереди с приоритетом индекса, которые позволяют эффективно динамически обновлять приоритеты для определенных элементов. Первым шагом в использовании очереди с приоритетом индекса является присвоение значений индекса всем ключам, создавая двунаправленное сопоставление. Это сопоставление должно быть двунаправленным, и его можно облегчить с помощью двунаправленной хеш-таблицы. Причина использования значений индекса в ключах состоит в том, чтобы включить индексирование в массивы, что часто является тем, как реализуются приоритетные очереди.

  • 07:40:00 Докладчик знакомит с концепцией очереди с приоритетом индекса и объясняет операции, которые она должна поддерживать, включая удаление ключей, получение значения, связанного с ключом, проверку наличия ключа в очереди с приоритетом, получение индекса ключа с помощью наименьшее значение, получение наименьшего значения в индексе, возможность вставки и обновления пар ключ-значение, а также специализированные операции обновления увеличивают и уменьшают ключ. Временная сложность всех этих операций либо постоянная, либо логарифмическая. Докладчик также знакомит с традиционной структурой данных приоритетной очереди, в том числе о том, как работает двоичная куча, как вставить новое значение в приоритетную очередь и как удалить из нее элементы.

  • 07:45:00 Как реализовать индексированную приоритетную очередь с бинарной кучей? Первый шаг — присвоить каждому элементу уникальное значение индекса и начальное значение для очереди приоритетов индекса. Затем мы используем очередь с минимальным индексированным приоритетом, чтобы сначала отсортировать по наименьшему значению, и мы поддерживаем карту позиций, чтобы сообщить нам индекс узла в куче для любого заданного ключевого индекса. Кроме того, мы поддерживаем таблицу обратного поиска, чтобы найти ключ для данного узла. Эта информация позволяет нам эффективно получать доступ к очереди приоритетов и управлять ею для различных приложений, таких как определение приоритетов пациентов в больнице или клиентов в ресторане.

  • 07:50:00 В видео обсуждается, как выполнять полезные операции, такие как вставка, обновление и удаление пар ключ-значение в очереди с приоритетом индекса. Процесс вставки похож на обычную очередь с приоритетом, но с добавленным шагом обновления положения и обратных карт. Видео содержит псевдокод для процесса вставки, показывающий, как узел перемещается вверх по куче, пока не будет удовлетворен инвариант кучи. Процесс подкачки включает в себя обновление позиции и обратных карт, но не массива значений, который остается индексированным по ключевому индексу, а не по индексу узла. Видео также кратко касается опроса и удаления пар ключ-значение, которые включают в себя шаги, аналогичные вставке, но в обратном порядке.

  • 07:55:00 Видео объясняет, как удаление элементов из очереди с индексированным приоритетом улучшается с линейной временной сложности до логарифмической временной сложности, используя поиск позиции узла, который теперь является постоянным временем. В видео показан пошаговый пример удаления узлов, включая замену узлов, сохранение пар ключ-значение перед удалением, очистку удаленных узлов и восстановление инварианта кучи путем перемещения замененного узла вверх или вниз. Кроме того, предоставляется псевдокод для удаления пар ключ-значение, демонстрирующий короткую пятистрочную реализацию и трехстрочный процесс очистки. Наконец, в видео описывается метод синхронизации и принцип его работы, а также обновления пар ключ-значение, которые аналогичны удалению, но также занимают логарифмическое время.
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
  • 2019.09.19
  • www.youtube.com
Learn and master the most common data structures in this full course from Google engineer William Fiset. This course teaches data structures to beginners usi...
 

Полный курс программирования на C бесплатно


Полный курс программирования на C бесплатно

00:00:00 - 01:00:00 Видео "Бесплатный полный курс программирования на C" рассказывает зрителям, как установить компилятор gcc, настроить IDE и написать код на C. Видео охватывает основы программирования на C, в том числе то, как использовать операторы printf, комментарии, escape-последовательности и спецификаторы формата для отображения различных типов данных. Инструктор объясняет, как создавать и инициализировать переменные, а также как использовать арифметические операции и операторы увеличения/уменьшения. Кроме того, видео охватывает прием пользовательского ввода с помощью scanf и форматирование вывода с помощью printf. Преподаватель также обсуждает полезные математические функции в C и способы их использования для вычисления длины окружности и площади круга на основе введенного пользователем значения радиуса. В видео подчеркивается, что хотя C — сложный язык, любой может выучить его, если настойчиво и приложить усилия.

01:00:00 - 02:00:00 Видео "Бесплатный полный курс программирования на C" на YouTube обучает основам программирования на языке C. В этом разделе видео инструктор охватывает такие темы, как операторы if/else, операторы switch, логические операторы, функции и циклы. Преподаватель объясняет условные операторы, позволяя программе делать выбор в зависимости от условий, и поясняет, почему оператор switch является более эффективной версией оператора else if. Кроме того, инструктор подробно показывает, как преобразовывать единицы измерения температуры, создавать простую программу-калькулятор, использовать логические операторы для повышения эффективности программы и как использовать функции для минимизации избыточности кода. Наконец, инструктор объясняет тернарный оператор и то, как строковые функции могут помочь в создании программ.

02:00:00 - 03:00:00 Этот полный курс программирования на C охватывает широкий круг тем, начиная с объяснения разницы между циклами while и do-while и использования вложенных циклов для создания фигур. Затем в видео рассказывается об основах массивов и о том, как перебирать и отображать элементы в одномерном массиве, прежде чем перейти к двумерным массивам и тому, как создать двумерную сетку или таблицу данных. Затем инструктор знакомит с концепцией замены переменных, алгоритмов сортировки, таких как пузырьковая сортировка, и рассказывает о структурах и определениях типов в C, а также о генерации случайных чисел и игре в угадывание чисел. В целом, этот курс обеспечивает всестороннее и глубокое понимание концепций программирования на C.

03:00:00 - 04:00:00 Это видео на YouTube под названием «Бесплатный полный курс программирования на C» охватывает широкий спектр тем по программированию на C, включая создание игр, таких как угадывание чисел и викторины, а также охватывает такие понятия, как память, указатели, побитовые операторы и файловый ввод-вывод. Кроме того, в видео объясняется, как создать игру «Крестики-нолики», в которой используются вложенные циклы for и операторы if для проверки победителя и создания случайных ходов для компьютерного игрока. Преподаватель дает четкие объяснения и демонстрации на протяжении всего видео, что делает его ценным ресурсом для всех, кто интересуется изучением программирования на C.

04:00:00 - 04:00:00 Инструктор продолжает создавать игру «Крестики-нолики» на C, добавляя проверку, чтобы убедиться, что выбранное место пусто, прежде чем делать ход, и создавая функцию для вывода победителя. Затем они добавляют опцию «воспроизвести снова», используя цикл do while и сбрасывают переменные в начале каждого цикла. Код будет опубликован в разделе комментариев для использования пользователями.

Часть 1

  • 00:00:00 Автор объясняет важность изучения C, языка среднего уровня, выступающего в качестве моста между высокоуровневым программным обеспечением и низкоуровневым оборудованием. C возник в 1970-х годах и широко используется для различных целей, включая написание компиляторов, операционных систем и баз данных. YouTuber также предоставляет инструкции о том, как настроить IDE и установить необходимые расширения и компилятор, чтобы начать писать код C. Тем не менее, ютубер предупреждает, что C — сложный язык для начинающих, но при настойчивости и усилиях любой может его выучить.

  • 00:05:00 В видео объясняется, как установить gcc в системе Mac или Linux и как добавить путь к компилятору gcc под переменными среды. После установки gcc видео продолжает объяснять, как настроить задачу сборки по умолчанию, чтобы VS Code знал, как компилировать программу. Видео рекомендует увеличить размер шрифта и включить автосохранение, чтобы избежать головной боли в будущем. В видео также рассматриваются основы программирования на C и включаются важные функции, такие как хэштег include, std для стандартного ввода/вывода ввода-вывода и print f скобок. Наконец, в видео подчеркивается необходимость добавления оператора return 0 в конце функции main для проверки на наличие ошибок.

  • 00:10:00 В этом разделе учебника по программированию на C инструктор показывает, как использовать операторы printf для вывода текста и как добавить новый символ строки с помощью управляющей последовательности. Он также демонстрирует, как компилировать и запускать файл C с помощью командной строки, и объясняет назначение комментариев в программировании на C. Видео охватывает основы программирования на C и дает полезные советы для начинающих.

  • 00:15:00 В этом разделе видеоруководства по программированию на C инструктор объясняет, как использовать комментарии и управляющие последовательности в коде. Комментарии используются для объяснения, описания или примечаний для тех, кто читает код. Однострочные комментарии делаются с использованием двух косых черт, а многострочные комментарии — с использованием косой черты, за которой следует звездочка, и заканчиваются звездочкой, за которой следует косая черта. Управляющие последовательности, с другой стороны, представляют собой комбинации символов, которые определяют действия в строке текста или строки. Наиболее часто используемые управляющие последовательности предназначены для создания новых строк и вкладок в текстовых строках. Преподаватель также демонстрирует, как отображать кавычки, одинарные кавычки и обратную косую черту с помощью управляющих последовательностей.

  • 00:20:00 в видео обсуждается, как создавать переменные в программировании на C. Во-первых, вы должны объявить переменную и присвоить ей имя и тип данных. Далее вы должны инициализировать эту переменную, установив ее равной некоторому значению. В видео приведены примеры различных типов данных, включая целые числа, числа с плавающей запятой, символы и массивы. В видео также объясняется, как отобразить значение, хранящееся в переменной, с помощью оператора printf и спецификатора формата.

  • 00:25:00 В этом разделе видео инструктор объясняет, как использовать спецификаторы формата для отображения различных типов данных в программировании на C. Например, чтобы отобразить массив символов, используйте знак процента, за которым следует "s" для строки. Чтобы отобразить символьную переменную, используйте процент c, а для отображения числа с плавающей запятой используйте процент f. Преподаватель также обсуждает такие типы данных, как символы, числа с плавающей запятой, целые числа и двойные числа, при этом двойные числа имеют точность 64 бита и сохраняют более значащие цифры, чем числа с плавающей запятой. Также введены логические значения, хранящие истину или ложь и использующие один байт памяти. Различные спецификаторы формата и способы их настройки будут рассмотрены в следующем видео.

  • 00:30:00 Мы узнаем, что логические значения можно отображать с помощью процента d, где единица соответствует истине, а ноль — ложному. Символы могут хранить целые числа в диапазоне от отрицательных 128 до положительных 127, при этом их представления отображаются с использованием описателей формата процентов d или процентов c. Переменные без знака удваивают наш диапазон положительных чисел как для символов, так и для коротких чисел, поэтому char может хранить числа от 0 до 255, а короткие могут хранить цифры от отрицательных 32 768 до положительных 32 767, если они со знаком, и от 0 до 65 535, если они без знака. Мы узнали, что вы можете использовать в качестве сокращенной записи short вместо short int. Целые числа могут хранить целые числа, которые могут быть как положительными, так и отрицательными значениями.

  • 00:35:00 Важно отметить, что для разных типов данных существуют разные спецификаторы формата, и использование неправильного может привести к ошибкам или неожиданному выводу. Хотя в программировании на C доступно много типов данных, в этом курсе мы в основном сосредоточимся на символах, массивах символов, двойных, логических и целых числах.

  • 00:40:00 Преподаватель объясняет спецификаторы формата, которые определяют и форматируют типы данных, которые должны отображаться определенным образом. Чтобы установить минимальную ширину поля для отображения вывода, после знака процента добавляется число для выделения определенных пробелов. Использование отрицательного знака после знака процента слева выравнивает данные. Видео также охватывает константы, которые являются фиксированными значениями, которые не могут быть изменены программой во время ее выполнения. Чтобы преобразовать переменную в константу, перед типом данных ставится ключевое слово 'const', а для именования константы соблюдается соглашение в верхнем регистре. Также рассматриваются арифметические операторы, такие как сложение, вычитание, умножение и деление, где деление на целые числа может усекать десятичные части, требуя использования числа с плавающей запятой или двойного числа для сохранения результата, а оператор модуля используется для получения остатка от любого деления.

  • 00:45:00 Преподаватель объясняет арифметические операторы в программировании на C, включая модуль, который можно использовать для быстрого определения четности числа или нечетности путем нахождения остатка при делении на 2. В видео также рассматриваются операторы приращения и декремента, которые могут использоваться для увеличения или уменьшения переменной на 1, а также расширенные операторы присваивания, которые позволяют пользователям выполнять арифметическую операцию над переменной и присваивать результат той же переменной с помощью ярлыка. Наконец, инструктор дает обзор приема пользовательского ввода с помощью функции scanf и подсказок в программировании на C.

  • 00:50:00 Преподаватель объясняет, как принимать вводимые пользователем данные в программировании на C, используя функцию scanf с соответствующим спецификатором формата для типа используемой переменной. В этом разделе рассматривается прием целых чисел и строк с оговоркой, что для приема строк с пробелами требуется функция fgets вместо scanf из-за наличия пробелов. Инструктор также объясняет, как отформатировать строку после использования fgets, чтобы избавиться от символов новой строки. Раздел заканчивается обзором форматирования оператора printf для улучшения удобочитаемости.

  • 00:55:00 В этом разделе видео инструктор обсуждает полезные математические функции в C при включении файла заголовка math. Функции квадратного корня, степени, округления (с использованием потолка и пола), абсолютного значения, логарифмов и тригонометрии объясняются примерами их использования в коде. Позже инструктор демонстрирует, как написать программу, которая вычисляет длину окружности на основе введенных пользователем данных о радиусе, и идет дальше, чтобы вычислить и отобразить площадь круга, используя формулу «пи», умноженную на квадрат радиуса.

Часть 2

  • 01:00:00 В этом разделе видео инструктор демонстрирует, как вычислить длину окружности и площадь круга с помощью языка программирования C, а также как найти гипотенузу прямоугольного треугольника, что требует использования функции извлечения квадратного корня. из заголовочного файла math.h. Преподаватель также знакомит с операторами if и тем, как они используются для добавления вариантов выбора в программу путем проверки условий и соответствующего выполнения кода. Он демонстрирует, как использовать условие «больше или равно» и оператор сравнения с двойным знаком равенства, а также как использовать операторы else для предоставления другого вывода, когда условие ложно.

  • 01:05:00 в видео обсуждаются операторы if и операторы else if в программировании на C. Эти операторы позволяют программе проверить, верно ли условие, и выполнить определенный подмножество кода, если это так, а если нет, программа перейдет к следующему блоку, чтобы проверить другое условие. Если все условия оцениваются как ложные, программа выполнит код, находящийся в блоке else. Кроме того, в видео показано использование оператора switch как более эффективной альтернативы использованию нескольких операторов else if. Оператор switch позволяет проверить значение на равенство во многих случаях, используя ключевое слово case. Наконец, в видео подчеркивается важность добавления оператора break после каждого case в операторе switch для выхода из switch после того, как будет найден соответствующий case.

  • 01:10:00 В этом разделе видео инструктор учит, как создать программу, которая переводит температуру из градусов Цельсия в градусы Фаренгейта или наоборот. Программа принимает введенные пользователем единицы измерения (по Цельсию или Фаренгейту) и текущую температуру, а затем использует операторы if/else и соответствующие формулы для выполнения преобразования. Преподаватель также демонстрирует, как использовать функцию to_upper для учета регистра и как использовать scanf для приема чисел с плавающей запятой. Программа запрашивает у пользователя ввод и отображает преобразованную температуру.

  • 01:15:00 В этом разделе курса инструктор демонстрирует, как создать программу на C, которая преобразует единицы измерения температуры (градусы Цельсия в градусы Фаренгейта и наоборот) на основе ввода пользователя. Программа предлагает пользователю ввести температуру и единицу измерения, принимает ввод с помощью scanf, а затем использует ряд условных операторов для преобразования единиц измерения температуры по мере необходимости. Преподаватель объясняет использование спецификаторов формата, формулу преобразования градусов Цельсия в градусы Фаренгейта и оператор switch для обработки различных типов операций в потоке программы. Окончательная программа размещена в разделе комментариев для скачивания и ознакомления.

  • 01:20:00 В этом разделе видео инструктор демонстрирует, как создать простую программу-калькулятор на C, которая может выполнять сложение, вычитание, умножение и деление. Программа использует оператор switch, чтобы определить, какую операцию выполнять на основе ввода пользователя. Кроме того, объясняется использование логических операторов, в частности оператора «и», который проверяет, выполняется ли набор условий. Преподаватель приводит примеры того, как использовать логические операторы для проверки того, попадает ли температура в определенный диапазон, и как включать логические переменные в проверки условий.

  • 01:25:00 Обсуждаются логический оператор or и логический оператор not. Логический оператор or проверяет, верно ли хотя бы одно условие, а логический оператор not изменяет состояние условия на противоположное. Оператор or можно использовать для проверки нескольких условий путем добавления дополнительных вертикальных полос. С другой стороны, оператор not может предложить больше вариантов написания программы. Эти логические операторы могут помочь создать более сложные условия и повысить эффективность программы.

  • 01:30:00 Преподаватель учит использовать функции в программировании на C, чтобы избежать повторения одного и того же кода. Создавая новую функцию, код можно написать один раз, а затем повторно использовать несколько раз, просто вызвав функцию. Затем инструктор переходит к обсуждению аргументов и параметров с примером передачи массивов символов и целых чисел в качестве аргументов функции. Параметры должны быть объявлены в объявлении функции, чтобы функция знала о передаваемых ей переменных. Без соответствующего набора параметров функция не может быть вызвана.

  • 01:35:00 В этом разделе стенограммы спикер объясняет концепцию оператора return и то, как он может возвращать значение вызывающей функции. Они демонстрируют пример функции под названием «квадрат», которая принимает один аргумент, возводит этот аргумент в квадрат, а затем возвращает результат вызывающей функции. Они также обсуждают синтаксис тройного оператора, сокращенный вариант использования оператора if-else при присвоении или возврате значения и показывают пример того, как его можно использовать для нахождения максимума из двух целых чисел. Спикер также подчеркивает важность соответствия типа данных при использовании ключевого слова return в объявлении функции.

  • 01:40:00 Мы узнаем о тернарном операторе, который служит ярлыком для использования оператора if-else при присвоении или возврате значения. Оператор состоит из условия, за которым следует вопросительный знак, возвращаемое значение, если условие истинно, двоеточие и возвращаемое значение, если условие ложно. Мы также обсудим прототипы функций, которые гарантируют, что вызовы функции будут выполняться с правильным количеством и типом аргументов. Добавляя прототип функции перед основной функцией, мы можем избежать неожиданного поведения и получения ошибок при использовании неправильных аргументов.

  • 01:45:00 В этом разделе видео инструктор объясняет прототипы функций на C и их преимущества, а также знакомит с некоторыми полезными строковыми функциями, которые уже написаны на C, такими как длина строки, сравнение строк, строка ниже, строка верхний и струнный кот. Преподаватель приводит примеры работы каждой из этих функций и демонстрирует их результаты. Функция сравнения строк возвращает ноль, если две сравниваемые строки совпадают, и другие числа, если они не совпадают. Преподаватель заканчивает раздел, добавляя фрагмент кода, в котором используются эти строковые функции.

  • 01:50:00 Преподаватель закрывает циклы, которые повторяют часть кода ограниченное количество раз. Он приводит пример подсчета от 1 до 10 с использованием цикла for и объясняет три оператора, необходимых для цикла for: объявление индекса, определение условия, как долго повторять код, и способ увеличения или уменьшения индекса. Он также демонстрирует различные способы увеличения и уменьшения индекса. Затем инструктор переходит к объяснению циклов while, которые повторяют часть кода, возможно, неограниченное количество раз, пока определенное условие остается верным, и дает пример запроса имени пользователя до тех пор, пока пользователь не введет допустимый ответ.

  • 01:55:00 В этом разделе видео инструктор демонстрирует, как использовать fgets вместо scanf для пользовательского ввода в программировании на C. Затем они используют цикл while, чтобы предложить пользователю ввести свое имя и кричать на него, если он не ввел свое имя правильно. Затем инструктор переходит к обсуждению цикла do-while и демонстрирует программу, которая просит пользователя ввести столько чисел, сколько он хочет, при условии, что они больше нуля, и вычисляет сумму этих чисел.

Часть 3

  • 02:00:00 В этом разделе полного курса программирования на C инструктор объясняет разницу между циклом while и циклом do-while в C. Цикл while сначала проверяет условие, а затем выполняет код, если условие выполняется. true, цикл do-while выполняет код один раз, а затем проверяет условие, чтобы убедиться, что оно истинно, прежде чем продолжить. Преподаватель демонстрирует это на примере кода и объясняет, как преобразовать цикл while в цикл do-while. В этом разделе также рассматриваются вложенные циклы, которые представляют собой цикл внутри другого цикла, и демонстрируется пример использования вложенных циклов для печати прямоугольника символов на основе введенных пользователем значений для строк, столбцов и символов.

  • 02:05:00 В этом разделе видео инструктор демонстрирует, как создавать прямоугольники с помощью вложенных циклов в C. Он позволяет пользователю ввести символ и количество строк и столбцов для прямоугольника, но также показывает, как чтобы очистить буфер ввода, чтобы обеспечить правильный ввод данных пользователем. Преподаватель также объясняет разницу между операторами continue и break в контексте циклов C, где continue пропускает остальную часть кода и запускает следующую итерацию цикла, а break полностью выходит из цикла. Наконец, инструктор определяет концепцию массивов как структуры данных, которая может хранить множество значений одного и того же типа данных, и показывает, как преобразовать переменную в массив.

  • 02:10:00 Видео рассказывает о концепции массивов в языке программирования Си. Массивы — это способ хранения нескольких значений одного типа данных в структуре данных фиксированного размера. Видео демонстрирует, как инициализировать массив и получить доступ к определенным элементам, используя порядковые номера. Существуют различные способы инициализации массива, такие как присвоение значений немедленно или присвоение значений позже в программе. В видео также объясняется, как перебирать и печатать все элементы массива с помощью цикла for.

  • 02:15:00 В этом видео рассказывается, как перебирать и отображать элементы массива в программировании на C. Преподаватель демонстрирует использование цикла for и инструкции printf, при этом индекс цикла for используется для доступа к элементам массива. Они также показывают, как рассчитать количество итераций цикла, используя оператор size, который будет автоматически обновляться при добавлении или удалении элементов из массива. Затем инструктор переходит к созданию двумерного массива, в котором каждый элемент сам является массивом. Они демонстрируют, как инициализировать и организовать двумерный массив на примере простой сетки или таблицы данных.

  • 02:20:00 Преподаватель рассказывает, как объявить и присвоить значения двумерному массиву в программировании на C. Они также объясняют, как отображать элементы двумерного массива, используя вложенные циклы и спецификатор формата "d". Затем инструктор показывает, как вычислить количество строк и столбцов двумерного массива, используя размер оператора и размер одной из строк, а также размер одного из элементов, найденных в первой строке. Раздел завершается примером того, как протестировать код с новой строкой, добавленной в двумерный массив.

  • 02:25:00 В этом разделе видео инструктор объясняет, как создать двумерный массив на C, который представляет собой массив массивов, где каждый элемент представляет собой целый массив. Для доступа к одному из элементов используются два индекса — один для строки и один для столбца. Преподаватель также покажет, как создать массив строк, представляющий собой двухмерный массив отдельных символов, за исключением того, что каждый элемент является строкой. Для отображения массива строк можно использовать цикл for. Наконец, инструктор объясняет, как можно поменять местами переменные в C, введя третью переменную в качестве временного хранилища для значения. Замена переменных важна в алгоритмах сортировки, которые будут рассмотрены в следующем разделе.

  • 02:30:00 Инструктор учит, как поменять местами значения двух переменных в C, как для целочисленных, так и для символьных массивов. Используя временные переменные и функцию копирования строки, инструктор показывает, как поменять местами значения и избежать неожиданного поведения с символьными массивами, если длина второго аргумента меньше первого. Преподаватель также предлагает представить переменные в виде стаканов с жидкостью, чтобы лучше понять значения замены, и предоставляет пример кода в разделе комментариев. После этого инструктор объясняет, как написать программу для сортировки элементов в массиве, сначала с массивом целых чисел, а затем с массивом символов. Преподаватель объявляет отдельную функцию для сортировки и использует вложенные циклы for для перебора массива и сравнения значений для сортировки.

  • 02:35:00 Докладчик рассказывает о том, как сортировать элементы массива на C с помощью алгоритма пузырьковой сортировки. Они объясняют использование временных переменных и операторов if, а также то, как размер сортируемого числа влияет на его конечное положение в массиве. Докладчик также демонстрирует, как отсортировать массив символов, изменив тип данных и функцию печати. Затем они вводят концепцию структур как способ организации связанных элементов в одном блоке памяти с возможностью имитации объектов реального мира. Структура определяется с помощью ключевого слова struct, за которым следует имя тега и набор фигурных скобок для представления ее элементов.

  • 02:40:00 В этом разделе видео инструктор рассказывает о структурах и typedef на языке программирования C. Структуры позволяют программисту группировать связанные значения под одним именем в блоке памяти, и их можно использовать для присвоения значений членам с разными типами данных. Ключевое слово typedef дает псевдоним существующему типу данных, что упрощает использование этого типа данных в коде. Преподаватель также показывает пример создания структуры с тремя элементами и присвоения им значений. Видео предоставляет пример кода для пользователей, которые хотели бы его использовать.

  • 02:45:00 Структура создается вне основной функции и получает имя тега "студент" и содержит массив символов для имени и переменную с плавающей запятой для GPA. Массив из четырех студентов инициализируется, а затем помещается в массив под названием «студенты». Используя цикл for, программа перебирает массив и выводит имя и средний балл каждого учащегося, используя оператор доступа к элементу точка. Наконец, видео объясняет, что если мы используем ключевое слово «typedef» со структурой, нам больше не нужно использовать ключевое слово struct для создания структуры, и вместо этого мы можем использовать присвоенный ей псевдоним.

  • 02:50:00 Преподаватель учит создавать массивы структур в C, где каждый элемент массива представляет собой структуру, содержащую данные для каждого учащегося, такие как имя и средний балл. Преподаватель также рассказывает об использовании перечислений, которые представляют собой определяемые пользователем типы именованных целочисленных идентификаторов, которые могут сделать программу более читабельной за счет замены целочисленных значений соответствующими именами, что упрощает понимание кода для программиста и любого, кто просматривает код. Описывается структура перечислений, и инструктор демонстрирует, как использовать перечисления в операторах if-else для вывода различных выходных данных в зависимости от значения переменной перечисления.

  • 02:55:00 В этом разделе видео инструктор демонстрирует, как генерировать случайные числа в программировании на C. Текущее время используется для генерации начального числа для функции rand, которая генерирует случайное число от 0 до 32767. Чтобы получить случайное число в заданном диапазоне, можно использовать оператор модуля. Инструктор приводит пример генерации случайного числа от 1 до 6 (для броска кубика) и для броска трех кубиков. Также представлена игра на угадывание чисел, использующая знания о генерации случайных чисел. Устанавливаются константы для минимального и максимального диапазона, и пользователю предлагается угадать число. Программа использует функцию rand для генерации случайного числа в заданном диапазоне, и пользователь получает обратную связь, чтобы корректировать свое предположение до тех пор, пока не будет введено правильное число.

Часть 4

  • 03:00:00 Инструктор учит, как создать игру на угадывание чисел на C, где программа генерирует случайное число между двумя указанными значениями, предлагает пользователю угадать число и предоставляет обратную связь, если угадывание слишком велико или слишком мало. , или правильно. Программа использует цикл do-while, чтобы убедиться, что сделано хотя бы одно предположение, и подсчитывает количество предположений, сделанных пользователем. Преподаватель также добавляет некоторые элементы оформления текста, чтобы сделать вывод более привлекательным. Этот пример демонстрирует использование условных выражений, циклов, пользовательского ввода и генерации случайных чисел в C.

  • 03:05:00 Преподаватель показывает, как создать викторину на C. В игре используется двумерный массив символов для хранения вопросов и отдельный двумерный массив символов для хранения вариантов. Правильные ответы хранятся в одномерном массиве символов. Игра подсчитывает количество вопросов, которые у нее есть, и использует цикл for, чтобы перебирать их один за другим, отображая их вместе с их возможными вариантами. Для этого инструктор использует вложенный цикл for, который начинается с каждой четвертой строки в массиве параметров. Цикл for повторяется четыре раза, отображая четыре возможных варианта ответа на каждый вопрос.

  • 03:10:00 Преподаватель рассказывает, как создать простую игру-викторину на C, которая задает пользователю вопросы и проверяет их ответы. Код использует вложенный цикл for для отображения вопросов и параметров, принимает пользовательский ввод с помощью scanf и преобразует символы нижнего регистра в верхний с помощью функции «toupper». Затем программа проверяет, соответствует ли догадка пользователя правильному ответу, и соответствующим образом увеличивает счет. После того, как на все вопросы будут даны ответы, программа отобразит окончательный результат. Преподаватель также кратко объясняет побитовые операторы и демонстрирует, как использовать пять различных побитовых операторов в C.

  • 03:15:00 Изучаем побитовые операции в программировании на C. Начнем с оператора И, который при применении к двум двоичным числам присваивает нашему результату единицу только в том случае, если оба соответствующих бита равны единице. Затем мы переходим к оператору ИЛИ, который присваивает нашему результату единицу, если любой из соответствующих битов равен единице. Оператор исключающее ИЛИ присваивает результату единицу, если только один соответствующий бит равен единице. Мы также узнаем об операторах сдвига влево и вправо, которые сдвигают биты в двоичном числе влево или вправо. Сдвиг битов влево эффективно удваивает число, а сдвиг вправо имеет противоположный эффект.

  • 03:20:00 Видео объясняет память в программировании на C, которая представляет собой массив байтов в ОЗУ, где каждая единица представляет собой блок памяти, который может содержать значение. Адрес памяти указывает на то, где в ОЗУ находится блок памяти, и он подобен уличному адресу. При объявлении переменной она выделяет несколько блоков памяти для хранения значения, связанного с адресом памяти. Каждая переменная использует блок памяти размером в один байт, а в видео в качестве примера показаны адреса памяти и размеры различных символов. Видео также кратко объясняет шестнадцатеричные значения, в которых используются числа от 0 до 9 и буквы от a до f для создания 16 возможных значений для каждой цифры. Наконец, видео охватывает короткие типы данных, которые используют два байта памяти.

  • 03:25:00 Преподаватель объясняет основы памяти в программировании на C, в том числе то, как переменные используют блоки памяти и как массивы используют несколько блоков памяти в зависимости от их размера и типа данных. Он также вводит концепцию указателей, которые хранят адрес памяти как значение другой переменной, и объясняет, как их можно использовать для более простого выполнения определенных задач. Преподаватель демонстрирует, как отобразить значение и адрес переменной и как создать указатель того же типа данных, что и переменная, на которую он указывает.

  • 03:30:00 Изучаем указатели в программировании на C. Указатели объявляются с использованием звездочки в качестве оператора косвенности, а обычное соглашение об именах заключается в использовании строчной буквы «p», за которой следует имя переменной с заглавной первой буквой. Значением указателя является адрес, и мы можем получить доступ к значению, хранящемуся по этому адресу, с помощью оператора косвенного обращения. Важно убедиться, что типы данных указателя и переменной, на которую он указывает, согласованы. Указатели также могут передаваться в качестве аргументов функций, что позволяет функции получать доступ и изменять значение, хранящееся в переменной, на которую указывает указатель. Кроме того, указатели могут быть объявлены и инициализированы в два этапа, но присваивание значения сразу является хорошей практикой.

  • 03:35:00 Инструктор объясняет указатели в программировании на C. Указатель — это переменная, которая содержит адрес памяти для другой переменной, массива и т. д. Чтобы объявить указатель, вы используете оператор косвенности. Чтобы присвоить значение указателю, вы используете тот же оператор. Инструктор покажет, как писать в файл на языке C, используя указатели, fopen, fwrite и fclose. Чтобы записать в файл, вам нужно создать указатель на файл и использовать `fprintf` для записи в файл. Преподаватель также демонстрирует файловый ввод-вывод, удаляя файл и записывая его в файл в определенном месте в каталоге компьютера.

  • 03:40:00 Преподаватель показывает, как читать содержимое файла в программировании на C, создавая указатель с типом данных «файл» и используя функцию fopen для открытия файла. Преподаватель демонстрирует, как использовать буфер, чтобы содержать массив символов для хранения одной строки текстового документа за раз, и как читать одну строку из файла с помощью функции fgets. В этом разделе также рассказывается, как отобразить все строки из файла с помощью цикла while и как добавить обнаружение файла, чтобы проверить, существует ли файл, прежде чем пытаться его прочитать.

  • 03:45:00 В этом разделе видео инструктор рассказывает о прототипах функций, которые будут использоваться в программе, включая функции сброса доски, печати доски, проверки свободных мест, перемещения игрока, перемещения компьютера, проверки победителя. , и победитель печати. После объявления этих функций инструктор обсуждает некоторые глобальные переменные, которые будут использоваться, включая двумерный массив символов с именем board, а также константы для персонажей игрока и компьютера. Далее обсуждается основная функция, где она объявляет локальную переменную для победителя, устанавливает ее в пустое место, сбрасывает доску и печатает ее. Видео также включает подробности о вложенных циклах for, используемых в функции сброса платы, и операторе printf, используемом в доске печати.

  • 03:50:00 В этом разделе полного курса программирования на C инструктор объясняет, как создать цикл while в основной функции, который будет окружать функцию печатной платы. Условие цикла while заключается в том, что если победителем является пустое пространство, а возвращаемое значение от вызова функции проверки свободных пространств не равно нулю, цикл будет продолжаться. Функция проверки свободных пробелов также создается с использованием двух вложенных циклов for для перебора двумерного массива символов и уменьшения локальной переменной свободных пробелов, если какое-либо место занято. Объясняется функция перемещения игрока, которая предлагает пользователю ввести номера строки и столбца, чтобы сделать ход, и проверяет, занято ли место или нет. Функция проверки победителя также создана для проверки каждой строки на наличие условия выигрыша и проверки каждого столбца на наличие условия выигрыша.

  • 03:55:00 Инструктор просматривает код для проверки строк, столбцов и диагоналей для победителя в игре крестики-нолики. Они объясняют использование циклов for и операторов if для перебора элементов на игровом поле и проверки совпадений. Если есть победитель, функция возвращает символьное значение элемента-победителя. Если нет, возвращается пустой символ. Затем инструктор предоставляет код для перемещения компьютера, который включает в себя генерацию случайных координат для размещения его символа на доске. Перед генерацией случайных чисел программа проверяет, есть ли свободные места на доске.

  • 04:00:00 Инструктор продолжает создавать игру «Крестики-нолики» на C. Они добавляют проверку, чтобы убедиться, что созданное место является пустым, прежде чем делать ход. Если свободных мест больше нет, то функция «распечатать победителя» вызывается с пустым местом, что означает ничью. Они объясняют, что эта функция довольно проста, поскольку она печатает «Вы выиграли», если победителем является игрок, «Вы проиграли», если победителем является компьютер, и «Ничья», если победителя нет. Инструктор реализует опцию «воспроизвести снова», используя цикл do while и сбрасывает переменные победителя и ответа в начале каждого цикла. Игра запускается и тестируется несколько раз, а инструктор объясняет каждый шаг. Наконец, они упоминают, что код будет размещен в разделе комментариев для использования пользователями.
C Programming Full Course for free 🕹️
C Programming Full Course for free 🕹️
  • 2021.10.07
  • www.youtube.com
C tutorial for beginners full course#C #tutorial #beginners⭐️Time Stamps⭐️#1 (00:00:00) C tutorial for beginners 🕹️#2 (00:12:36) compile and run a C pro...
 

Основные концепции объектно-ориентированного программирования


Основные концепции объектно-ориентированного программирования

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

В контексте объектно-ориентированного программирования объект относится ко всему, что представляет интерес для разрабатываемого программного приложения, где данные должны храниться и обрабатываться. Объекты также известны как сущности.

Абстракция — первая фундаментальная концепция, которая предполагает упрощение реальности за счет сосредоточения внимания только на релевантных данных и задачах, связанных с объектом. Например, при разработке приложения для обработки данных о человеке учитываются только необходимые данные и операции.

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

Инкапсуляция является второй фундаментальной концепцией и включает в себя сокрытие сложности внутренней работы объекта от других программ и программистов. Его часто называют сокрытием информации, потому что данные и функции внутри объекта связаны друг с другом и защищены от внешнего вмешательства. Опытные программисты часто создают классы, которые используются младшими программистами, а скомпилированные библиотеки классов защищают интеллектуальную собственность.

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

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

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

Fundamental Concepts of Object Oriented Programming
Fundamental Concepts of Object Oriented Programming
  • 2020.11.01
  • www.youtube.com
This video reviews the fundamental concepts of Object Oriented Programming (OOP), namely: Abstraction, which means to simplify reality and focus only on the ...
 

Курс объектно-ориентированного программирования (ООП) на C++


Курс объектно-ориентированного программирования (ООП) на C++

В этом видео представлен обзор объектно-ориентированного программирования (ООП) на C++. Он объясняет основные концепции ООП, такие как классы, объекты и методы. Преподаватель демонстрирует создание класса C++ и его членов, подчеркивая важность объявления переменных как определяемых пользователем типов данных. Модификаторы доступа, такие как private, public и protected, объясняются в связи с доступом к членам объекта.

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

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

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

В целом, это видео направлено на то, чтобы дать всестороннее представление об ООП в C++, охватив основные концепции, принципы и практические реализации. Инструктор призывает зрителей следить за ее каналом Code Beauty и приветствует отзывы о видео.

  • 00:00:00 В этом видео объясняются основы объектно-ориентированного программирования и то, как это работает на практике. Классы являются ключевой концепцией объектно-ориентированного программирования, и переменные должны быть объявлены как определяемые пользователем типы данных, чтобы их можно было использовать.

  • 00:05:00 В этом видео создается класс C++ и добавляются члены. У класса есть три атрибута: имя, компания и возраст. Создается экземпляр класса и ему присваивается номер переменной.

  • 00:10:00 В этом видео инструктор объясняет, как получить доступ к членам объекта в C++. Модификаторы доступа, такие как private, public и protected, определяют, как доступны члены объекта. Метод класса можно использовать для описания поведения объекта.

  • 00:15:00 В этом видео объясняется, как работает объектно-ориентированное программирование (ООП) в C++. Функция создается с возвращаемым типом void, и функция вызывается с использованием того же синтаксиса, что и введенная функция. Затем функция вызывается пять раз, каждый раз с другим именем сотрудника и компанией. Затем имена сотрудников и значения компании копируются в новый объект сотрудника, а атрибутам объекта сотрудника присваиваются значения вновь скопированных значений.

  • 00:20:00 В этом видео инструктор рассказывает о трех правилах создания конструкторов в C++. Первое правило заключается в том, что имя конструктора совпадает с именем класса, которому он принадлежит, второе правило заключается в том, что конструктор должен быть общедоступным, а третье правило заключается в том, что конструктор должен быть доступным. При создании конструктора важно помнить правила, изложенные в этом видео. Если конструктор не следует одному из этих правил, будет сгенерирована ошибка.

  • 00:25:00 В этом видео инструктор объясняет основы объектно-ориентированного программирования, включая концепции классов, объектов и методов. Затем он переходит к описанию четырех ключевых принципов объектно-ориентированного программирования: инкапсуляция, абстракция, наследование и полиморфизм. Наконец, он объясняет, как реализовать эти концепции в примере кода.

  • 00:30:00 Это видео знакомит с объектно-ориентированным программированием (ООП) на C++. Класс — это структура, которая инкапсулирует данные и общедоступные методы, которые другие классы могут вызывать для доступа и изменения данных. Для обеспечения инкапсуляции поля класса являются закрытыми, а геттеры и сеттеры общедоступными.

  • 00:35:00 В этом видео преподаватель курса C++ обсуждает принципы объектно-ориентированного программирования (ООП). Преподаватель обсуждает, как инкапсуляция и абстракция помогают скрыть сложные данные за упрощенным интерфейсом. Преподаватель также обсуждает, как правила проверки могут применяться к методам установки частных свойств.

  • 00:40:00 В этом видео ведущий объясняет, как объектно-ориентированное программирование (ООП) может упростить разработку программного обеспечения, скрывая сложность от пользователей. Они используют пример смартфона, чтобы проиллюстрировать, как ООП может сделать сложный процесс простым. Затем они демонстрируют, как создать контракт, который делает одну сторону системы простой, но скрывает сложность системы от пользователя.

  • 00:45:00 В этом видео объясняется концепция объектно-ориентированного программирования (ООП) в C++. В видео обсуждается, как создать абстрактный класс, требующий реализации для виртуальной функции, и как протестировать функцию, чтобы узнать, может ли конкретный сотрудник получить повышение.

  • 00:50:00 В этом видео автор получает повышение, а затем, если этому человеку меньше 30 лет, его не собираются продвигать. Это позволяет нам реализовать контракт, который на самом деле является абстрактным классом, и этот абстрактный класс или этот контракт имеют только одно правило, и это правило представляет собой чистую виртуальную функцию, которая здесь называется запросом на повышение. Таким образом, какой бы класс ни подписал этот контракт, какой бы класс ни наследовал от этого абстрактного сотрудника, который является этим классом здесь, должен будет обеспечить реализацию этого метода здесь. Мы протестировали его, и, как вы могли видеть, я не получил повышения, а Джон — такова идея абстракции. И этот метод запроса продвижения — это как раз та кнопка, о которой мы упоминали кнопку на вашем смартфоне в начале этой главы. Третий принцип объектно-ориентированного программирования, о котором я хочу рассказать, называется наследованием. Идея наследования заключается в следующем: есть этот базовый класс, также известный как суперкласс или родительский класс, а затем есть производный класс, также известный как дочерний класс или подкласс.

  • 00:55:00 В этом видео преподаватель курса C++ демонстрирует, как работает объектно-ориентированное программирование, создавая производный класс из существующего базового класса. Затем свойства базового класса наследуются производным классом, который также получает свои собственные свойства, специфичные для класса разработчика.

  • 01:00:00 В этом видео инструктор обсуждает, как работает объектно-ориентированное программирование на C++. Он объясняет, как класс разработчика наследуется от класса служащего и как можно использовать конструктор класса служащего для инициализации определенных свойств класса разработчика. Затем инструктор показывает, как можно создать метод в классе разработчиков для проверки правильности установки свойств. Наконец, он демонстрирует, как закрыть класс разработчика.

  • 01:05:00 В этом видео инструктор обсуждает концепции объектно-ориентированного программирования (ООП) наследования и полиморфизма. Он демонстрирует, как использовать эти концепции для решения проблемы на примере кода. Наконец, инструктор демонстрирует, как создать класс, наследуемый от другого класса.

  • 01:10:00 В этом видео представлен краткий обзор объектно-ориентированного программирования (ООП) на C++. В видео объясняется, как создать класс учителя, который наследуется от класса сотрудника и реализует функцию подготовки урока. В видео также обсуждаются некоторые проблемы, которые могут возникнуть при создании и использовании классов ООП, и способы их решения.

  • 01:15:00 В этом видео инструктор объясняет концепцию объектно-ориентированного программирования (ООП) на C++. Полиморфизм относится к способности объекта или метода иметь множество форм. Одно из распространенных применений полиморфизма в программировании — это когда ссылка на родительский класс используется для ссылки на объект дочернего класса. Этот пример демонстрирует, как работает полиморфизм, возвращаясь к основной функции и вызывая новый метод работы в классах разработчика и учителя, которые оба наследуются от класса сотрудников.

  • 01:20:00 В этом видео рассказывается об основах объектно-ориентированного программирования на C++. Первая часть видео посвящена истории объектно-ориентированного программирования и его отличиям от других парадигм программирования. Во второй части видео объясняется, как создать указатель на базовый класс и как сделать рабочий метод виртуальным в классе сотрудников. Наконец, видео демонстрирует, как работает указатель и как в результате работает программа.

  • 01:25:00 В этом видео инструктор обсуждает концепцию виртуальных функций и полиморфизма в C++. Он объясняет, что при вызове виртуальной функции выполняется наиболее производная версия функции. Это означает, что если функция не реализована в производных классах класса, вместо этого будет вызываться класс разработчика класса. Он также отмечает, что при полиморфизме различные типы сотрудников можно рассматривать как один большой объект, что позволяет ссылаться на них с помощью указателя базового класса.

  • 01:30:00 Это видео знакомит с объектно-ориентированным программированием (ООП) на C++. В нем обсуждается, как ООП делает программирование более организованным и понятным. Также ведущая рекомендует зрителям следить за ее каналом, кодировать красоту и подписываться там. Наконец, ведущая призывает зрителей оставлять отзывы о ее роликах.
Object Oriented Programming (OOP) in C++ Course
Object Oriented Programming (OOP) in C++ Course
  • 2021.02.02
  • www.youtube.com
Object Oriented Programming (OOP) is commonly used when writing code with C++. In this crash course, you will learn what OOP is and how to implement it using...