Tutoriales de programación

 

En nuestro mundo tecnológicamente avanzado, la programación y la informática se han convertido en disciplinas transformadoras que impulsan la innovación y dan forma a la sociedad.

La programación, como forma de arte, combina creatividad, lógica y resolución de problemas para crear soluciones elegantes y eficientes.

  • Fusión de ciencia y creatividad.
    La informática sirve como base científica para la programación, cubriendo teorías, algoritmos y metodologías para el desarrollo e implementación de programas informáticos. Sin embargo, la programación en sí requiere imaginación e ingenio. Como un artista de lienzo en blanco, un programador entreteje líneas de código en algoritmos complejos, creando obras maestras digitales que revolucionan industrias, simplifican tareas y mejoran la experiencia del usuario. La programación orientada a objetos (POO) es un paradigma clave en informática que permite a los programadores gestionar la complejidad organizando el código en objetos reutilizables y modulares. Al encapsular los datos y el comportamiento en los objetos, los programadores pueden diseñar creativamente soluciones que sean más fáciles de comprender, mantener y ampliar.

  • Creatividad en diseño y experiencia de usuario
    La programación va más allá de la resolución de problemas e incluye el diseño de interfaces fáciles de usar y experiencias de usuario atractivas. Este aspecto combina la sensibilidad artística con el conocimiento técnico. Los programadores diseñan la interfaz de usuario (UI) y la experiencia del usuario (UX) utilizando la estética, la navegación intuitiva y las imágenes llamativas para crear software que deleite y cautive a los usuarios. El arte radica en combinar a la perfección la funcionalidad con el atractivo estético, traduciendo características complejas en diseños intuitivos y visualmente agradables. Con OOP, los programadores pueden separar tareas y crear objetos separados que son responsables de diferentes aspectos del software. Este enfoque modular promueve la creatividad en el diseño al permitir que los programadores se centren en objetos individuales, sus interacciones y el comportamiento general del sistema. Utilizando los principios de OOP, como la herencia y el polimorfismo, los programadores pueden desarrollar software con una interfaz intuitiva, una interfaz fácil de usar y una estética visualmente atractiva.

  • Ingeniería de software como un arte
    La ingeniería de software, una disciplina de la informática, enfatiza el aspecto artístico de la programación. Cubre todo el ciclo de vida del desarrollo de software, desde la recopilación de requisitos hasta la implementación y el mantenimiento. Los ingenieros de software abordan la programación como arquitectos, diseñando sistemas y plataformas que sean confiables, escalables y fáciles de mantener. Consideran factores como la modularidad del código, la reutilización y los patrones arquitectónicos para crear soluciones de software que combinan funcionalidad y elegancia. El arte del desarrollo de software consiste en equilibrar las limitaciones técnicas, las necesidades del usuario y los objetivos de diseño para crear un software que sea tanto funcional como estéticamente agradable. OOP juega un papel clave en el desarrollo de software al proporcionar un enfoque estructurado para administrar la complejidad. La separación del código en clases y objetos permite a los desarrolladores de software diseñar sistemas modulares, reutilizables y mantenibles. Con la abstracción y la encapsulación correctas, los desarrolladores de software pueden lograr un equilibrio que resulte en un software funcional y elegante.

  • Innovación e impacto social
    El arte de la programación y la informática va más allá del sector tecnológico, afectando a las industrias y a la sociedad en su conjunto. Desde la atención médica hasta las finanzas, la educación y el entretenimiento, la programación y la informática están revolucionando la forma en que trabajamos, nos comunicamos y vivimos. Innovaciones como la inteligencia artificial, la realidad virtual y la tecnología blockchain están cambiando las industrias y abriendo nuevos horizontes. Los programadores y los informáticos están desempeñando un papel clave en estos avances transformadores, empujando los límites de lo que es posible y convirtiendo las ideas en realidad. OOP permite a los programadores crear soluciones innovadoras que revolucionan varias áreas. Al administrar la complejidad con la naturaleza modular y extensible de OOP, los programadores pueden desarrollar sistemas complejos como algoritmos de inteligencia artificial, experiencias de realidad virtual inmersiva y aplicaciones seguras de blockchain. Estos avances están cambiando las industrias, aumentando la productividad y mejorando la calidad de vida de las personas en todo el mundo.

La gestión de la complejidad es un aspecto clave del desarrollo de software. A medida que los sistemas se vuelven más complejos, se vuelve necesario utilizar enfoques efectivos para administrar la complejidad y garantizar la capacidad de mantenimiento y la escalabilidad.

El paradigma orientado a objetos es un enfoque poderoso que ofrece ventajas significativas en la gestión de la complejidad. Al encapsular datos y comportamiento en objetos y usar conceptos como encapsulación, herencia y polimorfismo, el paradigma orientado a objetos proporciona una base sólida para administrar la complejidad.

  1. Encapsulación.
    La encapsulación es un principio fundamental del paradigma orientado a objetos que promueve la asociación de datos y métodos dentro de los objetos. Esta encapsulación oculta las complejidades internas de un objeto, exponiendo solo las interfaces necesarias para interactuar con él. Al ocultar los detalles de implementación, la encapsulación reduce la complejidad de otras partes del sistema, lo que permite a los desarrolladores concentrarse en abstracciones de mayor nivel. Esto promueve la modularidad y mejora la legibilidad del código, lo que hace que los sistemas complejos sean más fáciles de entender y mantener.

  2. Abstracción.
    La abstracción es otro concepto clave en el paradigma orientado a objetos para ayudar a gestionar la complejidad. Esto permite a los desarrolladores representar objetos complejos del mundo real como clases, abstrayendo detalles innecesarios. Mediante la creación de clases e interfaces abstractas, los desarrolladores pueden definir comportamientos y atributos comunes que varias subclases pueden heredar e implementar. Esta organización jerárquica de clases permite a los desarrolladores administrar la complejidad al dividir los sistemas complejos en componentes más pequeños y manejables. Cada clase se centra en sus responsabilidades específicas, lo que da como resultado una base de código más modular y comprensible.

  3. Herencia.
    La herencia es un mecanismo poderoso proporcionado por el paradigma orientado a objetos que promueve la reutilización del código y reduce la redundancia. Esto permite que las nuevas clases hereden las propiedades y el comportamiento de las clases existentes al establecer una relación "es" entre ellas. La herencia ayuda a administrar la complejidad al permitir que los desarrolladores definan una clase base con atributos y comportamientos comunes y luego creen clases especializadas que hereden de ella. Esta organización jerárquica de clases elimina la duplicación de código, reduce la complejidad y mejora la capacidad de mantenimiento.

  4. Polimorfismo.
    El polimorfismo es una característica clave del paradigma orientado a objetos que permite que los objetos de diferentes tipos se traten de manera intercambiable en función de sus interfaces comunes. El polimorfismo simplifica la gestión de la complejidad al permitir que los desarrolladores escriban código que funciona con una abstracción de alto nivel sin tener que lidiar con los detalles de implementación específicos de cada objeto. Usando el polimorfismo, los desarrolladores pueden crear sistemas más flexibles y extensibles porque se pueden agregar nuevas clases sin afectar el código existente. Esto promueve el desarrollo modular y escalable, reduciendo la complejidad a largo plazo.

La gestión de la complejidad es un aspecto crítico del desarrollo de software y el paradigma orientado a objetos proporciona un marco poderoso para esta tarea.

A través de principios como la encapsulación, la abstracción, la herencia y el polimorfismo, el paradigma orientado a objetos permite a los desarrolladores administrar de manera eficaz la complejidad y crear sistemas modulares, escalables y fáciles de mantener. Al encapsular datos y comportamiento en objetos, abstraer detalles innecesarios, reutilizar código a través de la herencia y usar polimorfismo, el paradigma orientado a objetos ofrece un enfoque integral para administrar la complejidad. El uso del paradigma orientado a objetos mejora enormemente el proceso de desarrollo de software y contribuye a la creación de sistemas de software confiables y manejables.

El arte de la programación combina principios científicos con creatividad, resolución de problemas e innovación. Es una disciplina que requiere destreza técnica y visión artística. La gestión de la complejidad con un enfoque orientado a objetos es esencial en la programación, lo que permite a los programadores desarrollar soluciones elegantes y eficientes, mejorar la experiencia del usuario y tener un impacto duradero en la sociedad.

A medida que avanza la tecnología, el software seguirá dando forma a nuestro mundo digital e impulsará la innovación futura.

 

El arte de la programación



El arte de la programación

El arte de la programación va más allá de escribir código. Se trata de nuestro proceso de pensamiento, enfoque de resolución de problemas y el impacto que hacemos en el mundo. La programación es un lenguaje creativo que da vida a las ideas y nos permite expresarnos a través de la tecnología. Nos desafía a pensar de manera innovadora, encontrar soluciones no convencionales y expandir nuestra comprensión del mundo y de nosotros mismos. Este video explora conceptos fundamentales de programación, desde sintaxis básica y estructuras de datos hasta algoritmos avanzados y paradigmas de programación. Vamos a empezar.

Cuando se trata de editar código, hay dos tipos principales de herramientas: editores de texto e IDE. Mientras que los editores de texto se enfocan en editar texto sin formato, los IDE brindan funciones adicionales. Sin embargo, para la mayoría de los propósitos, la distinción entre los dos no importa mucho y los términos se pueden usar indistintamente. Las opciones populares para editores de texto e IDE incluyen Vim, Atom, Sublime Text, Eclipse, IntelliJ, PyCharm y Visual Studio Code. Visual Studio Code, en particular, es altamente personalizable y ampliamente recomendado.

Para ejecutar el código, necesitamos compilarlo en un código de máquina, que las computadoras entienden. Esto requiere instalar un compilador de lenguaje o tiempo de ejecución. Los diferentes lenguajes tienen sus propios compiladores o tiempos de ejecución, como GCC, Java SDK, Python interpreter, Node.js runtime y .NET SDK. No es necesario comprender los detalles de estas herramientas; todo lo que necesita saber es instalar un idioma para ejecutar su código.

La ejecución del código implica el uso de la terminal, que proporciona acceso a la interfaz de línea de comandos. Los terminales de uso común incluyen Powershell y Bash. La terminal nos permite ejecutar comandos como crear directorios, listar archivos y ejecutar programas. Los administradores de paquetes, como npm para Node.js y pip para Python, se pueden usar para instalar software desde repositorios a través de la línea de comandos. Git, un sistema de control de versiones, es esencial para administrar cambios de código y colaborar con otros.

Para comenzar a codificar, necesita un editor de texto o IDE adecuado, un compilador de lenguaje y conocimientos básicos de comandos de terminal. Visual Studio Code es una opción recomendada para un editor de texto o IDE. Instalar un lenguaje de programación y familiarizarse con los comandos de la terminal le permitirá escribir y ejecutar código. Aprender lenguajes de programación implica comprender su sintaxis, entorno y convenciones. Los diferentes idiomas tienen diferentes niveles de complejidad, pero todos comparten similitudes en estructura y conceptos.

La impresión de resultados en diferentes lenguajes de programación se puede realizar mediante funciones o métodos específicos de cada lenguaje. Por ejemplo, Python tiene la función de impresión incorporada, JavaScript tiene el método console.log y Java y C++ tienen su propia sintaxis para imprimir en la salida estándar.

Las variables se utilizan para almacenar valores de diferentes tipos de datos. Las variables se declaran, definen e inicializan con valores. Los lenguajes de programación pueden ser de tipo estático o dinámico, y tienen una sintaxis diferente para las variables. La tipificación estática requiere una declaración explícita del tipo de variable, mientras que la tipificación dinámica no. Las variables tienen alcance, lo que determina dónde se puede acceder a ellas y usarlas en un programa. El alcance puede ser global o local y permite una mejor organización y prevención de errores.

Los tipos de datos representan diferentes tipos de datos, como cadenas, valores booleanos, enteros, números de coma flotante, caracteres y matrices. Las estructuras de datos proporcionan una manera de organizar y manipular datos. Las estructuras de datos populares incluyen matrices, pilas, montones, árboles, listas vinculadas, tablas hash, mapas hash y gráficos. Las matrices y los mapas son dos estructuras de datos de uso común con diversas aplicaciones.

En resumen, la programación es un arte que abarca el pensamiento, la resolución de problemas y la configuración del mundo a través del código. Implica el uso de editores de texto o IDE, ejecutar código a través de compiladores o tiempos de ejecución y comprender los comandos de terminal y el control de versiones. Aprender lenguajes de programación requiere comprender la sintaxis, las variables, los tipos de datos y las estructuras de datos. El video proporciona una descripción general de alto nivel de estos conceptos para que pueda comenzar su viaje de programación.

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...
 

El arte de escribir software


El arte de escribir software

Las computadoras, como los instrumentos musicales, son máquinas meticulosamente diseñadas para realizar tareas específicas según las instrucciones que reciben. Estas instrucciones, escritas en código, son el software que guía sus operaciones. Así como la notación musical es el código usado por los compositores, los programadores de computadoras usan código de software para crear programas.

La programación puede ser una fuente de alegría y satisfacción, similar a los sentimientos que experimentan los poetas o los músicos. Las primeras computadoras eran fascinantes y empoderadoras para quienes disfrutaban de la resolución de problemas y la complejidad. Operaban a velocidades asombrosas, capaces de resolver una amplia gama de problemas siempre y cuando se expresaran usando los comandos nativos de la computadora. Sin embargo, las computadoras son intrínsecamente tontas y requieren instrucciones precisas para entender qué hacer. Los primeros programadores tenían que escribir en lenguaje de máquina usando números que representaban comandos binarios. Este proceso fue tedioso y propenso a errores, lo que condujo al desarrollo de lenguajes de programación más amigables para los humanos.

La introducción de lenguajes de alto nivel, como Fortran y COBOL, hizo que la programación fuera más accesible. Los programadores podían expresar sus instrucciones usando fórmulas científicas familiares o declaraciones lógicas que tuvieran sentido para ellos. Luego se usaron compiladores para traducir estas instrucciones al lenguaje binario de la computadora. Este avance desbloqueó la revolución del software, ya que los programadores ya no necesitaban aprender el lenguaje de máquina específico de cada computadora.

A lo largo de los años, se han desarrollado cientos de lenguajes de programación para satisfacer diferentes necesidades. La brecha entre estos lenguajes y el lenguaje de máquina se ha ampliado, lo que permite a los programadores concentrarse en lo que quieren lograr en lugar de los detalles de bajo nivel. A medida que la informática se volvió más personal, los lenguajes de programación se volvieron más diversos y fáciles de usar. Las personas ahora se comunican rutinariamente con las computadoras diciéndoles qué hacer, como calcular promedios u organizar datos. La programación se ha convertido en una herramienta para empoderar a las personas, permitiéndoles personalizar y adaptar los sistemas informáticos a sus necesidades.

Escribir software implica no solo codificar, sino también definir cómo se representan y organizan los datos. Los datos se pueden organizar en cadenas, listas, tablas, árboles y más, según los requisitos. La elección del lenguaje y la estructura de datos es crucial para resolver problemas de programación de manera efectiva. Los programadores crean procedimientos paso a paso conocidos como algoritmos para resolver problemas. Estos algoritmos especifican las operaciones necesarias para lograr los resultados deseados. Sin embargo, encontrar el algoritmo más eficiente para un problema dado puede ser una tarea compleja. Requiere un pensamiento cuidadoso, concentración y, a veces, un amplio conocimiento en campos especializados.

El desarrollo de software es un esfuerzo desafiante y creativo que requiere tener en cuenta numerosos aspectos simultáneamente. Los programadores se adaptan constantemente a los avances tecnológicos, superando los límites de lo que pueden lograr las computadoras. Se esfuerzan por lograr la elegancia y la coherencia en su código, creando software que sea tanto funcional como estéticamente agradable. A través de sus esfuerzos, los programadores de software han ampliado nuestras capacidades, permitiéndonos aprovechar la gran cantidad de información e interactuar con el mundo de formas que antes se consideraban mágicas. La programación es la fuerza impulsora detrás de hacer que las computadoras funcionen y dar forma al mundo de alta tecnología en el que vivimos hoy.

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...
 

Tutorial de C++ para principiantes - Curso completo


Tutorial de C++ para principiantes - Curso completo

00:00:00 - 01:00:00 Este video es un tutorial para principiantes que quieren aprender a codificar en C++. Cubre los conceptos básicos de trabajar con cadenas, números y variables. También introduce el concepto de importar código de otros archivos.

01:00:00 - 02:00:00 Este tutorial de C++ para principiantes cubre cómo construir una calculadora de cuatro funciones. El tutorial explica cómo ingresar datos, verificar la igualdad de operadores y ejecutar código en función de esa condición.

02:00:00 - 03:00:00 Este video brinda una introducción básica a la programación en C++, con un enfoque en el uso de bucles for para calcular un resultado específico. La función que se está demostrando calcula el resultado de un número elevado a una potencia específica.

03:00:00 - 04:00:00 En este tutorial de C++ para principiantes, el instructor demuestra cómo usar la herencia para extender la funcionalidad en una jerarquía de clases. La herencia permite que una clase tenga la misma funcionalidad que otra clase, al tiempo que amplía esa funcionalidad con funciones adicionales. El instructor también demuestra cómo anular funciones heredadas para cambiar el comportamiento de una clase.

Parte 1

  • 00:00:00 Este video tutorial enseña a los principiantes a escribir código básico en C++. El primer paso es instalar un editor de texto y un compilador de C++, ambos incluidos en el paquete Codeblocks. Luego, el tutorial muestra cómo configurar un proyecto simple en bloques de código.

  • 00:05:00 Este tutorial proporciona una breve introducción al lenguaje de programación C++ y las herramientas necesarias para escribir y ejecutar programas C++. La primera parte del tutorial muestra cómo instalar las herramientas necesarias en una Mac y la segunda parte cubre cómo crear un nuevo proyecto de C++ en bloques de código.

  • 00:10:00 En este video tutorial, el presentador recorre los conceptos básicos para escribir un programa C++. Cubre la necesidad de un proyecto y archivo c++, explica las funciones y muestra cómo construir y ejecutar un programa.

  • 00:15:00 Este tutorial explica cómo escribir código básico en C++ y cómo usar declaraciones de impresión para enviar información a la consola.

  • 00:20:00 En este video, el presentador muestra cómo las variables son útiles en la programación, proporcionando un ejemplo de un programa que imprime una historia. Luego, el presentador demuestra cómo crear y asignar un valor a una variable llamada "nombre del personaje" que almacena el nombre del personaje. A continuación, el presentador demuestra cómo crear y asignar un valor a una variable llamada "edad" que almacena la edad del personaje. Finalmente, el presentador demuestra cómo usar una variable para almacenar múltiples datos.

  • 00:25:00 En este video, el presentador introduce el concepto de variables y muestra cómo usarlas para almacenar datos en un programa. Demuestran cómo acceder y manipular los datos almacenados en variables utilizando instrucciones de impresión. Finalmente, muestran cómo incluir una variable dentro de una declaración de impresión para que los datos se impriman en una cadena separada.

  • 00:30:00 Este video introduce el concepto de variables y tipos de datos en C++. Una variable es un contenedor que almacena datos y puede usarlo para almacenar cualquier tipo de información. Las cadenas son un tipo común de variable y son una secuencia de caracteres. También puede usar enteros para almacenar números enteros o enteros negativos para almacenar números negativos. También puede almacenar números decimales en enteros.

  • 00:35:00 Este tutorial cubre los conceptos básicos de programación con C++, comenzando con texto y números simples, y pasando a tipos de datos más complejos como cadenas y booleanos.

  • 00:40:00 Este video cubre cómo usar las funciones de cadena de C++, longitud e indexación de cadenas para imprimir cadenas y determinar la ubicación de caracteres específicos en una cadena, y cómo modificar caracteres específicos en una cadena.

  • 00:45:00 El video cubre los conceptos básicos de trabajar con cadenas en C++, incluido cómo pasar argumentos a funciones y cómo usar diferentes funciones matemáticas para manipular cadenas.

  • 00:50:00 En este tutorial de C++, se cubren los conceptos básicos de números, sumas, restas, multiplicaciones y divisiones. También se introduce el operador de módulo, que es útil para dividir dos números y calcular el resto. Finalmente, se demuestra el almacenamiento de números en variables.

  • 00:55:00 Este tutorial de C++ para principiantes explica cómo usar funciones matemáticas para resolver problemas. Las funciones incluyen raíz cuadrada, potencia y ronda. También se explica la importación de código de otros archivos.

Parte 2

  • 01:00:00 En este tutorial de C++ para principiantes, se solicita al usuario que ingrese su edad y nombre. Luego, el programa almacena la información en una variable llamada edad e imprime el nombre y la edad del usuario.

  • 01:05:00 Este video tutorial muestra cómo crear una calculadora básica en C++ y cómo construir un juego de Mad Libs.

  • 01:10:00 Este video explica cómo crear y usar arreglos en C++. Las matrices son similares a las variables, pero pueden contener múltiples valores.

  • 01:15:00 Este video tutorial explica los conceptos básicos de las matrices en C++. Una matriz es un contenedor que puede almacenar varios datos y puede acceder a elementos individuales por índice o asignando un valor a la propiedad de "tamaño" de la matriz.

  • 01:20:00 En este tutorial, el autor demuestra cómo crear una función en C++. Una función es un bloque de código que realiza una tarea específica y se puede reutilizar en un programa. El tipo de retorno de la función puede ser nulo o un número entero. El autor también demuestra cómo llamar a una función.

  • 01:25:00 En este video, el autor explica cómo funcionan las funciones y cómo se pueden reutilizar. También muestra cómo crear una firma de función y cómo llamar a una función usando su firma. Finalmente, analiza las devoluciones en C++, que es cuando una función devuelve información a la persona que llama.

  • 01:30:00 El video explica cómo crear funciones en C++ y cómo usar la palabra clave de retorno para indicar que la función ha terminado de ejecutarse. El video también muestra cómo usar la función de cubo para devolver el resultado de elevar un número al cubo.

  • 01:35:00 En este tutorial, el autor enseña a los principiantes sobre la instrucción if en C++. Una declaración if es una estructura de programación que permite que un programa responda a diferentes situaciones. El autor demuestra cómo usar una declaración if para verificar condiciones y cómo crear declaraciones if más complejas.

  • 01:40:00 Este video tutorial explica cómo usar los operadores and y or en C++ para verificar dos condiciones. Si cualquiera de las condiciones es falsa, todo el bloque if será falso y el código no se ejecutará.

  • 01:45:00 En este tutorial, el autor enseña a los principiantes acerca de las declaraciones if, explicando cómo usar comparaciones para crear valores verdaderos o falsos. La función tomará dos números como entrada y devolverá el mayor.

  • 01:50:00 Este video explica cómo funcionan las comparaciones en C++ y cómo usar mayor que, menor que e igual para comprobar si dos números son iguales, mayores o iguales.

  • 01:55:00 Este tutorial de C++ para principiantes enseña cómo construir una calculadora de cuatro funciones, incluyendo cómo ingresar datos, verificar la igualdad de operadores y ejecutar código basado en esa condición.

parte 3

  • 02:00:00 En este video tutorial, se demuestra una función para convertir un número entero en un día de la semana. Se crea la función y se usa una declaración if para determinar si el número de día dado es uno o más. Si es uno, la función devuelve "Domingo"; si no es uno, la función devuelve "Lunes".

  • 02:05:00 Este video explica cómo se puede usar una sentencia switch para hacer que el código de una sentencia if sea más eficiente. El video continúa explicando cómo crear una declaración de cambio para cada día de la semana y demuestra la función imprimiendo el día de la semana para un número pasado como entrada.

  • 02:10:00 Este video proporciona una descripción general del video "Tutorial de C++ para principiantes - Curso completo". El video demuestra cómo usar un ciclo while para iterar a través de un bloque de código, mientras se cumple una condición.

  • 02:15:00 Este tutorial de C++ para principiantes cubre los conceptos básicos de los bucles, incluido cómo crear un bucle while y un bucle do while. El video también analiza un bucle infinito y cómo evitarlo. Finalmente, se demuestra un bucle for.

  • 02:20:00 Este tutorial muestra cómo crear un juego de adivinanzas usando un bucle while y un bucle do while. El juego inicialmente es injusto en el sentido de que el usuario obtiene conjeturas ilimitadas, pero el tutorial muestra cómo hacer que el juego sea más justo imponiendo un límite de conjeturas.

  • 02:25:00 En este video, el autor explica cómo funcionan los bucles for y cómo se pueden usar en C++. También muestra un ejemplo de cómo se pueden usar bucles for para resolver un problema.

  • 02:30:00 En este video, el autor explica el bucle while, una construcción de bucle en la que una variable cambia cada vez que se ejecuta. El bucle for es una construcción similar, pero incluye una condición de declaración, inicialización y bucle de variables.

  • 02:35:00 Este video tutorial demuestra cómo usar los bucles for para iterar a través del contenido de los arreglos, así como también cómo construir una función que lleve un número a una potencia específica.

  • 02:40:00 Este video tutorial brinda una introducción básica a la programación en C++, con un enfoque en el uso de bucles for para calcular un resultado específico. La función que se está demostrando calcula el resultado de un número elevado a una potencia específica.

  • 02:45:00 En este tutorial, el autor muestra cómo crear y usar una matriz bidimensional y analiza cómo acceder a los elementos dentro de ella.

  • 02:50:00 Este tutorial en video presenta el lenguaje C++ y demuestra cómo usar los iteradores for e int para recorrer matrices de datos. Los bucles for anidados permiten iterar fácilmente los datos dentro de las matrices.

  • 02:55:00 Este video explica qué es un puntero, cómo son útiles y cómo crearlos en C++.

parte 4

  • 03:00:00 Este video proporciona una introducción a la programación en C++ para principiantes, con ejemplos de cómo usar variables y constantes para almacenar información. El video también demuestra cómo acceder a las direcciones de memoria para recuperar la información almacenada en ellas.

  • 03:05:00 Este video proporciona una descripción general del video "Tutorial de C++ para principiantes - Curso completo". En el video, el presentador demuestra cómo acceder a las direcciones de memoria de las variables mediante punteros. Un puntero es solo una dirección de memoria que es solo un tipo de datos, y puede usarlo para almacenar un puntero a una variable diferente.

  • 03:10:00 Este tutorial explica cómo usar punteros en la programación y demuestra cómo desreferenciarlos para acceder al valor almacenado en una dirección de memoria particular. Además, el tutorial analiza las clases y los objetos en C++ y demuestra cómo crear y usar una clase.

  • 03:15:00 En este video, un tutorial de C++ para principiantes, el autor crea una clase para representar libros. La clase tiene dos atributos, el título y el autor. A continuación, el autor crea un objeto de libro y establece el título y el autor.

  • 03:20:00 Este video enseña a los principiantes cómo crear y trabajar con objetos en C++. Un objeto es una instancia real de una clase y una clase es la plantilla para un tipo de datos. Los objetos se pueden imprimir y cambiar sus valores.

  • 03:25:00 Este video explica cómo funcionan los constructores en C++ y cómo se pueden usar para inicializar objetos con valores predeterminados.

  • 03:30:00 Este video tutorial explica cómo crear un constructor de C++ que acepte título, autor y páginas como valores de entrada. Una vez inicializado, el constructor se puede usar para crear un nuevo objeto sin tener que pasar los valores cada vez.

  • 03:35:00 Este video explica cómo usar funciones en C++ para determinar si un estudiante tiene honores o no. Las funciones son plantillas que cada objeto puede usar para devolver verdadero o falso según el propio GPA del objeto.

  • 03:40:00 Este video enseñará a los principiantes cómo usar getters y setters en las clases de C++. Getters y setters le permiten controlar el acceso a atributos y elementos en sus clases. Este ejemplo muestra cómo aplicar una clasificación válida para una película mediante getters y setters.

  • 03:45:00 En este tutorial de C++ para principiantes, el autor demuestra cómo usar getters y setters para restringir las clasificaciones que se pueden asignar a un objeto de película. Si la calificación pasada no es una de las calificaciones válidas, se genera un error o la calificación no se establece.

  • 03:50:00 En este video, el autor explica cómo establecer calificaciones para videos usando C++. En primer lugar, explican cómo se representan las calificaciones en C++, siendo una calificación igual a un valor positivo como 13 o un valor negativo como -3. A continuación, demuestran cómo establecer una calificación para un video usando una función llamada establecer calificación. Esta función toma un parámetro, que es una cadena que representa la calificación. Si la calificación ingresada no es válida, la función devolverá una cadena que representa la calificación no calificada. Por último, el autor demuestra cómo imprimir la calificación de un video usando una función llamada obtener calificación. Esta función no toma parámetros y simplemente devuelve la calificación del video.

  • 03:55:00 En este tutorial de C++ para principiantes, el instructor demuestra cómo heredar funciones y cómo anularlas en una jerarquía de clases. Esto permite que una clase tenga la misma funcionalidad que otra clase, al tiempo que amplía esa funcionalidad con características adicionales.
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...
 

Introducción a la Programación y Ciencias de la Computación - Curso completo



Introducción a la Programación y Ciencias de la Computación - Curso completo

Este video es una guía para principiantes de programación e informática para aquellos con poca o ninguna experiencia en codificación. Cubre conceptos y técnicas fundamentales que se aplican a cualquier lenguaje de programación. El video explica los conceptos básicos de la escritura de código en un entorno de desarrollo integrado (IDE) y enfatiza la importancia de la gramática de programación.

Los temas tratados en el video incluyen:

  1. Introducción a la programación y la informática, incluidas la sintaxis y las reglas de programación.
  2. Uso de la consola para generar texto desde un programa.
  3. Operaciones matemáticas básicas y el operador módulo en programación.
  4. Imprimiendo cadenas a la consola.
  5. Comprensión de variables, tipos de datos y convenciones de nomenclatura.
  6. Cómo se definen, referencian y manipulan las variables en los programas.
  7. Exploración de declaraciones if, declaraciones elsif y declaraciones else para ejecución condicional.
  8. Introducción de matrices como una forma de almacenar variables relacionadas.
  9. Conceptos básicos de los bucles, incluidos los bucles for, while y do-while.
  10. Comprender los diferentes tipos de errores de programación: errores de sintaxis, errores de tiempo de ejecución y errores lógicos.
  11. Técnicas de depuración, como el uso de sentencias de impresión, puntos de interrupción y comentarios.
  12. Estrategias para evitar errores en la programación.
  13. Trabajar con funciones para organizar el código y reducir la repetición.
  14. Importación de funciones desde bibliotecas y convenciones de nomenclatura para funciones.
  15. Diferentes tipos de funciones y sus propósitos.
  16. Introducción a los diccionarios como opción flexible de almacenamiento de datos.
  17. Descripción general de los algoritmos de búsqueda, incluida la búsqueda lineal y la búsqueda binaria.
  18. Programación recursiva y sus casos de uso, incluido el concepto de caso base.
  19. Habilidades blandas para la informática, como la resolución de problemas y la planificación.
  20. Uso de pseudocódigo como herramienta de planificación para escribir código.
  21. Diferentes métodos para planificar y escribir código, incluidos diagramas de flujo y planificación cronológica.
  22. Descripción general de los lenguajes de programación y los recursos disponibles para el aprendizaje.

El video proporciona una introducción completa a la programación y la informática, ofreciendo a los espectadores la base necesaria para comenzar su viaje de codificación. También sugiere recursos adicionales y sitios web para explorar más a fondo el tema.

  • 00:00:00 Este video cubre los puntos principales del video, que está destinado a aquellos que están interesados en la informática y la programación, pero no tienen idea de por dónde empezar y tienen poca o ninguna información previa sobre codificación. El video cubre los conceptos básicos de la programación de computadoras, que se pueden aplicar a todos y cada uno de los lenguajes de programación que desee aprender.

  • 00:05:00 Este video analiza los conceptos básicos de la programación, cómo escribir código en un entorno de desarrollo integrado (IDE) y la importancia de la gramática de programación.

  • 00:10:00 Este video presenta la programación y la informática, y cubre los conceptos básicos de sintaxis y reglas de programación. El uso principal de la consola es generar texto desde el programa.

  • 00:15:00 Este video cubre las matemáticas básicas, incluidas la aritmética, la suma, la resta, la multiplicación y la división, así como el módulo, un operador básico en muchos lenguajes de programación. También cubre la impresión de cadenas en la consola.

  • 00:20:00 Este video presenta conceptos de programación e informática, incluidas variables, tipos y nombres. Las variables primitivas incluyen enteros, booleanos, flotantes y dobles. Las variables de cadena almacenan cadenas de caracteres. Las variables Char contienen un carácter. Las variables son esenciales para almacenar información en un formato al que se pueda hacer referencia fácilmente.

  • 00:25:00 Este video analiza lo que sucede cuando definimos o creamos variables, cómo hacer referencia a ellas y cómo manipularlas para nuestros programas. Los puntos principales a tener en cuenta son que las variables son simplemente espacios en la memoria que almacenan un cierto valor, y que podemos actualizar los números y su lugar permanecerá constante a lo largo del código.

  • 00:30:00 Una variable es un lugar donde puede almacenar información mientras programa. Las convenciones de nomenclatura de las variables son importantes para la legibilidad. Si una condición en una instrucción if es verdadera, se ejecutará el código entre llaves. Hay dos sentencias adicionales, elsif y eltons, que funcionan de manera similar a las sentencias if. Si la condición en elsif es verdadera, se ejecutará el código siguiente a elsif. De lo contrario, el código que sigue a elsif
    será salteado. Si la condición en elsif no es verdadera, se omitirá el código que sigue a elsif y se ejecutará el código que sigue a la instrucción if.

  • 00:35:00 Una matriz es una lista de variables que están relacionadas entre sí. Son útiles cuando un programador quiere almacenar muchas variables que contienen información que está relacionada entre sí.

  • 00:40:00 Un curso de introducción a la programación y la informática cubre matrices, índices, tamaño y matrices dentro de matrices. Los bucles también están cubiertos.

  • 00:45:00 Este video cubre los diferentes tipos de bucles, bucles for, while y do while. Explica cómo configurar una condición para un bucle y cómo evitar un bucle infinito.

  • 00:50:00 Este video cubre los tres tipos de errores que pueden ocurrir durante la programación: errores de sintaxis, errores de tiempo de ejecución y errores lógicos. Los errores de sintaxis son los más fáciles de solucionar, ya que suelen ser algo que se puede solucionar en cuestión de segundos. Los errores de tiempo de ejecución son causados por declaraciones en su código que parecen lógicamente sólidas, pero la computadora físicamente no tiene forma de completar la tarea en una cantidad de tiempo razonable. Los errores lógicos son los más irritantes y difíciles de depurar, ya que a menudo pueden hacer que los programas no funcionen como se espera. Para depurar su código, debe probarlo de forma incremental y buscar errores de sintaxis y tiempo de ejecución.

  • 00:55:00 Si encuentra un error en su código, puede usar declaraciones de impresión y la consola para determinar dónde falla el código, usar puntos de interrupción para rastrear la causa del error y usar comentarios para marcar código que está destinado a usted y no a la computadora. Finalmente, se discuten las estrategias para evitar errores.

  • 01:00:00 En este video, el instructor cubre los conceptos básicos de programación e informática, incluidos errores y funciones. Continúa explicando cómo funcionan los argumentos en una función y cómo usar funciones para reducir la repetición en el código.

  • 01:05:00 Este video de introducción a la programación y la informática analiza los cuatro tipos diferentes de funciones, sus propósitos y cómo usarlas en su código. Las funciones pueden ser útiles para organizar el código, ahorrar tiempo y realizar grandes cambios en el código sin tener que pasar por todo el programa.

  • 01:10:00 En este video, se introducen los conceptos básicos de programación e informática. Se explica la importación de funciones desde bibliotecas y se analizan las reglas para nombrar funciones. También se introducen reglas para crear funciones basadas en el tipo y número de argumentos.

  • 01:15:00 En este video, el instructor explica los conceptos básicos de la programación y la informática, incluidas las funciones, el alcance y el paso de argumentos. También cubre cómo crear funciones que no devuelven ningún valor.

  • 01:20:00 En este video, el presentador revisa arreglos, funciones y diccionarios. Los arreglos son como listas de valores que se almacenan juntos, y las funciones devuelven una variable dependiendo de la ruta tomada. Un pequeño detalle a tener en cuenta es que no puede devolver un tipo de variable si ya ha definido la función para devolver otro tipo. Las listas de matrices crecen cuando el tamaño de la lista supera los 10 elementos y los diccionarios almacenan varios valores.

  • 01:25:00 Una computadora almacena datos de diferentes maneras, lo que puede ser difícil de entender. Un diccionario es un tipo de almacenamiento de datos, que es más fluido y más fácil de organizar que las matrices tradicionales. Los algoritmos de búsqueda se utilizan para encontrar rápidamente un dato específico en una lista de valores.

  • 01:30:00 Este video presenta el concepto de algoritmos de búsqueda y su eficiencia. La búsqueda lineal es un buen algoritmo básico para listas desordenadas, pero es ineficaz en el peor de los casos. La búsqueda binaria es un algoritmo de búsqueda eficiente para listas ordenadas, aprovechando el hecho de que la lista está ordenada.

  • 01:35:00 El algoritmo de búsqueda binaria es más rápido y eficiente que una búsqueda lineal para encontrar un elemento en una lista ordenada. La función recursiva es un ejemplo de una declaración de programación recursiva. El caso base para una sentencia recursiva es un valor definido que todas las sentencias recursivas deben cumplir. Si n no es menor o igual a uno, la declaración recursiva devolverá la suma de n y luego el valor de retorno del método de suma recursiva menos uno.

  • 01:40:00 Este video presenta la programación y la informática y explica por qué la recursividad es una técnica útil. Las habilidades blandas necesarias para la informática incluyen la resolución de problemas y la planificación. El pseudocódigo es una forma simplificada de programación que puede ayudar con esta planificación.

  • 01:45:00 El pseudocódigo es una forma visual de planificar un código de computadora, similar a construir un esquema para un artículo. Los diagramas de flujo y escribir lo que desea que haga el programa cronológicamente son dos métodos comunes.

  • 01:50:00 Este video presenta conceptos de programación e informática, incluidos los diferentes métodos para planificar y escribir código, y la importancia del pseudocódigo. También cubre diferentes lenguajes de programación y sus usos.

  • 01:55:00 En esta serie, el autor cubre los conceptos básicos de programación, que incluyen sintaxis y reglas, y enseña cómo aprender un lenguaje específico. También proporciona sitios web y recursos para ayudarlo a comenzar.
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...
 

Curso de Programación C++ - Principiante a Avanzado


Curso de Programación C++ - Principiante a Avanzado

El curso cubre diferentes aspectos de la programación en C++.

Los temas tratados:

  1. Configuración de un entorno de desarrollo de C++: los videos brindan una descripción general de cómo configurar un entorno de desarrollo de C++ en varias plataformas. Esto incluye instalar diferentes compiladores y configurar Visual Studio Code para usar los compiladores y la biblioteca estándar de C++. Las instrucciones cubren plataformas como Windows, Mac y Linux.

  2. Conceptos básicos de programación en C++: los videos cubren conceptos fundamentales como variables, tipos de datos, funciones y declaraciones de control de flujo. Explican cómo declarar variables, definir funciones y usar estructuras de control como bucles y sentencias condicionales. Los videos también introducen conceptos como comentarios y la función principal en C++.

  3. Manipulación de cadenas: videos específicos se enfocan en trabajar con cadenas en C++. Explican cómo comparar y concatenar cadenas usando funciones como strcmp y strcat. Los videos también muestran cómo copiar cadenas usando la función strcpy.

  4. Matrices: Los videos introducen el concepto de matrices en C++. Cubren temas como la declaración e inicialización de matrices, el acceso a elementos mediante punteros y la impresión de matrices de caracteres.

  5. Punteros y asignación de memoria dinámica: estos videos explican cómo se administra la memoria en C++ y cómo usar técnicas de asignación de memoria dinámica para asignar memoria adicional para un programa. Cubren los conceptos de punteros, mapas de memoria y unidades de gestión de memoria. Los videos también analizan cómo usar punteros de manera segura, evitar bloqueos y manejar múltiples punteros que apuntan a la misma ubicación de memoria.

  6. Plantillas de funciones y funciones lambda: los videos explican cómo crear funciones genéricas usando plantillas de funciones en C++. Demuestran cómo el compilador puede generar definiciones de funciones basadas en los tipos de parámetros pasados. Además, los videos cubren las funciones lambda, que son funciones anónimas a las que se puede llamar sin darles un nombre. Explican la sintaxis y la especificación del tipo de retorno para las funciones lambda.

  7. Clases y herencia: estos videos introducen el concepto de clases en C++ y explican cómo definir funciones y variables miembro dentro de una clase. Cubren temas como constructores, destructores, especificadores de acceso (protegidos y privados) y el uso de enlaces estáticos y dinámicos para lograr el polimorfismo. Los videos también muestran cómo crear y usar clases derivadas basadas en clases preexistentes mediante la herencia.

  8. Depuración y manejo de errores: los videos brindan orientación sobre la depuración de programas C++. Explican cómo establecer puntos de interrupción, examinar variables en el ámbito local y manejar errores relacionados con punteros no inicializados y pérdidas de memoria. Los videos también cubren conceptos como el corte de objetos y la anulación de constructores de clases base.

  9. Interfaces y polimorfismo: algunos videos se centran en las interfaces y el polimorfismo en C++. Explican cómo usar el enlace dinámico, las referencias y la palabra clave anular para lograr un comportamiento polimórfico en los programas. Los videos también analizan el especificador final, que se puede usar para marcar un método virtual como final y evitar que se anule en las clases derivadas.

  10. Otros temas: Los temas adicionales cubiertos incluyen parámetros predeterminados, interfaz insertable de flujo para la impresión automática de flujo de salida y el uso de interfaces para crear un código más legible.

El video brinda instrucciones paso a paso, demostraciones y explicaciones para ayudar a los principiantes a aprender programación en C++ desde la instalación y configuración hasta conceptos más avanzados como programación orientada a objetos, administración de memoria y polimorfismo. El contenido es adecuado tanto para principiantes que desean aprender los conceptos básicos de la programación en C++ como para programadores experimentados que desean actualizar sus habilidades o explorar temas específicos en profundidad.

Código: https://github.com/rutura/The-C-20-Masterclass-Source-Code


Capítulo 1: Configuración de las herramientas

  • 00:04:32 Herramientas de desarrollo de C++
  • 00:11:06 Instalación de compiladores de C++ en Windows
  • 00:24:27 Instalación de código VS en Windows
  • 00:28:00 Configuración de Visual Studio Code para C++ en Windows
  • 00:57:27 Instalación de compiladores de C++ en Linux
  • 01:04:02 Instalación de Visual Studio Code en Linux
  • 01:07:40 Configuración de Visual Studio Code para C++ en Linux
  • 01:22:45 Instalación de compiladores de C++ en MacOS
  • 01:28:07 Instalación de Visual Studio Code en MacOS
  • 01:30:16 Configuración de Visual Studio Code para C++ en MacOS
  • 01:35:37 Compiladores en línea


Capítulo 2: Buceando


Capítulo 3: Variables y tipos de datos


Capítulo 4: Operaciones con datos


Capítulo 5: Control de flujo


Capítulo 7: Matrices


Capítulo 8: Punteros


Capítulo 9: Referencias


Capítulo 10: Manipulación de personajes y cadenas

  • 12:44:29 Manipulación de personajes e introducción de cadenas
  • 12:46:24 Manipulación de personajes
  • 13:09:28 Manipulación del hilo C
  • 13:41:42 Concatenación y copia de cadenas C
  • 14:01:19 Presentamos std::string
  • 14:03:38 Declaración y uso de std::string


Capítulo 11: Funciones


Capítulo 12: Sacar cosas de las funciones

  • 16:03:20 Cómo sacar cosas de las funciones Introducción
  • 16:03:58 Parámetros de entrada y salida
  • 16:17:54 Regreso de Funciones


Capítulo 13: Sobrecarga de funciones

  • 16:32:35 Introducción a la sobrecarga de funciones
  • 16:34:17 Sobrecarga con diferentes parámetros


Capítulo 14: Funciones Lambda


Capítulo 15: Plantillas de funciones

  • 17:40:08 Plantillas de funciones Introducción
  • 17:41:45 Probar plantillas de funciones
  • 18:19:52 Tipo de plantilla Deducción y argumentos explícitos
  • 18:35:47 Parámetros de tipo de plantilla por referencia
  • 18:48:55 Plantilla de especialización


Capítulo 16: Conceptos


Capítulo 17: Clases


Capítulo 18: Herencia

  • 22:52:43 Herencia Introducción
  • 22:55:59 tu primer intento de herencia
  • 23:21:10 Miembros protegidos
  • 23:32:06 Especificadores de acceso de clase base: acercamiento
  • 23:36:49 Especificadores de acceso de clase base: una demostración
  • 24:07:42 Acercándose a la herencia privada
  • 24:26:36 Resurrección de miembros de nuevo en el ámbito
  • 24:46:59 Constructores de argumento predeterminados con herencia
  • 24:57:37 Constructores personalizados con herencia
  • 25:26:56 Copiar constructores con herencia
  • 25:51:53 Herencia de constructores base
  • 26:06:00 Herencia Con Destructores
  • 26:12:20 Símbolos reutilizados en herencia


Capítulo 19: Polimorfismo

  • 26:21:03 Polimorfismo Introducción
  • 26:26:54 Enlace estático con herencia
  • 26:55:24 Polimorfismo (enlace dinámico) con funciones virtuales
  • 27:14:31 Tamaño de objetos polimórficos y corte
  • 27:26:37 Objetos polimórficos almacenados en colecciones
  • 27:45:42 anular
  • 27:52:45 sobrecargar, anular y ocultar
  • 28:07:35 Herencia y polimorfismo a diferentes niveles
  • 28:33:03 Herencia y polimorfismo con miembros estáticos
  • 28:49:13 final
  • 29:07:42 Funciones virtuales con argumentos predeterminados
  • 29:23:18 Destructores virtuales
  • 29:35:38 Transmisión_dinámica<>()
  • 30:08:17 No llamar funciones virtuales (polimórficas) de constructores y destructores
  • 30:24:45 Funciones virtuales puras y clases abstractas
  • 30:43:37 Clases abstractas como interfaces
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...
 

Curso de estructura de datos de fácil a avanzado: tutorial completo de un ingeniero de Google (partes 1 a 4)


Estructuras de datos Curso fácil a avanzado - Tutorial completo de un ingeniero de Google

Breve resumen:

00:00:00
- 01:00:00 El instructor explica las estructuras de datos y su importancia para crear algoritmos más rápidos y potentes. El tutorial cubre la notación Big O y cómo se usa para estandarizar cuánto tiempo y espacio requiere un algoritmo, y se proporcionan ejemplos concretos para diferentes complejidades de tiempo. El tutorial también cubre la implementación de matrices estáticas y dinámicas, incluidas sus ventajas y desventajas, y profundiza en la creación e inserción de nodos en listas con enlaces simples y dobles. Finalmente, el tutorial proporciona una introducción a la estructura de datos de la pila y explica brevemente sus operaciones principales.

01:00:00
- 02:00:00 Esta sección del tutorial "Curso fácil a avanzado de estructuras de datos" proporciona una cobertura completa de varias estructuras de datos y sus funcionalidades. El tutorial guía a la audiencia sobre los principios de funcionamiento de las pilas y las colas, sus implementaciones mediante matrices y listas vinculadas, y su importancia en diferentes aplicaciones, incluido el recorrido de gráficos y la gestión de solicitudes del servidor. El tutorial también explora las colas de prioridad y su implementación mediante montones, aclarando la diferencia entre las colas de prioridad y los montones, así como los tipos de montones. El tutorial finaliza con una demostración paso a paso de cómo agregar y eliminar elementos de un montón binario.

02:00:00 - 03:00:00 El ingeniero de Google presenta un tutorial completo sobre estructuras de datos, que explica cómo eliminar nodos de una estructura de datos de almacenamiento dinámico binario, cómo mantener el almacenamiento dinámico invariable en una cola de prioridad y cómo nadar y sumidero de nodos en una estructura de datos de montón binario. El video también cubre la estructura de datos de búsqueda de unión, que se usa para rastrear elementos divididos en conjuntos disjuntos y fusionar dos grupos, con un ejemplo sobre imanes para ilustrar cómo funciona la estructura de datos. Además, se explica el algoritmo de Kruskal para encontrar un árbol de expansión mínimo en un gráfico y se introduce el concepto de compresión de ruta para hacer que la estructura de datos de búsqueda de unión sea más eficiente.

03:00:00 - 04:00:00 Este tutorial cubre varias estructuras de datos, comenzando con la estructura de datos union-find y sus métodos, incluidos find, connected, parent, size y unify. Luego, el tutorial pasa a los árboles, incluidas las definiciones de árboles, árboles enraizados, árboles binarios y árboles de búsqueda binarios. El video proporciona ejemplos de cómo insertar y quitar nodos de los árboles de búsqueda binarios, así como diferentes algoritmos transversales, incluidos el pedido previo, el pedido posterior y el orden de nivel, y explica cómo implementar estas construcciones en Python y Java. Además, el video presenta tablas hash y analiza la importancia de las funciones hash y los métodos populares de resolución de colisiones.

04:00:00
- 05:00:00 La sección cubre varios aspectos de las tablas hash y su implementación. Analiza la importancia de las funciones hash, que asignan claves a valores y cómo manejar las colisiones hash utilizando técnicas como el encadenamiento separado y el direccionamiento abierto. El tutorial también cubre métodos para insertar, eliminar y buscar entradas en tablas hash, así como cambiar el tamaño y administrar los factores de carga. El orador enfatiza la importancia de elegir una función de sondeo y un tamaño de mesa adecuados para evitar bucles infinitos y problemas de rendimiento. Se utilizan ejemplos prácticos a lo largo del tutorial para ilustrar los conceptos.

05:00:00
- 06:00:00 Esta sección proporciona una descripción completa de las tablas hash, hash doble y sondeo cuadrático en la resolución de colisiones. El video cubre los conceptos de cambio de tamaño y crecimiento de una tabla hash, manejo de colisiones y eliminación, e implementación de tablas hash mediante sondeo cuadrático. El video también presenta el árbol de Fenwick, una estructura de datos que admite consultas de rango y actualizaciones de puntos en tiempo logarítmico con tiempo de construcción lineal. El video proporciona una explicación paso a paso de cómo realizar sumas de prefijos y consultas de rango utilizando el árbol de Fenwick.

06:00:00 - 07:00:00 El video tutorial cubre varios temas, incluido el concepto de un árbol de Fenwick para consultas de rango rápido y actualizaciones de puntos, el uso de matrices de sufijos y la matriz LCP para encontrar subcadenas únicas y subcadenas comunes más largas, y resolver el problema de subcadena común más largo utilizando una técnica de ventana deslizante. El tutorial también explica cómo encontrar la subcadena repetida más larga de manera eficiente utilizando la matriz LCP y explora las propiedades y la importancia de los árboles de búsqueda binarios equilibrados, específicamente los árboles AVL, y cómo se pueden mantener equilibrados mediante el uso de rotaciones de árboles. El video proporciona explicaciones detalladas, ejemplos y código fuente en Java disponible en GitHub.

07:00:00 - 08:00:00 La sección cubre una variedad de estructuras de datos y sus implementaciones en detalle. El video analiza los árboles AVL, explica los métodos de inserción y eliminación, así como también cómo aumentar el método de eliminación del árbol de búsqueda binaria para los árboles AVL. El instructor también proporciona el código fuente para la implementación de un árbol AVL recursivo en Java, explicando el método de inserción privada y los métodos de actualización y equilibrio. Más adelante, el video cubre en detalle las colas de prioridad indexadas, explica cómo asignar valores de índice a las claves y proporciona pseudocódigo para operaciones útiles como inserción, actualización y eliminación. El video también detalla cómo mejorar la eliminación de nodos de complejidad de tiempo lineal a complejidad de tiempo logarítmico mediante búsquedas de posición de nodo.

Parte 1

  • 00:00:00 El ponente introduce el concepto de estructuras de datos como una forma de organizar los datos de manera eficiente y cómo son esenciales para crear algoritmos más rápidos y potentes. El orador habla sobre la importancia de comprender cómo y cuándo usar la estructura de datos adecuada para la tarea en cuestión y cómo las estructuras de datos pueden hacer que el código sea más limpio y fácil de entender. El concepto de tipo de datos abstracto también se explica junto con ejemplos de cómo un tipo de datos abstracto proporciona solo la interfaz y no los detalles específicos sobre cómo se debe implementar la estructura de datos. Además, el video aborda brevemente la complejidad computacional para comprender el rendimiento de las estructuras de datos.

  • 00:05:00 El concepto de notación Big O se introduce como una forma de estandarizar cuánto tiempo y espacio se requiere para que un algoritmo se ejecute en función de la peor disposición posible de entrada. Big O solo se preocupa por lo que sucede cuando las entradas se vuelven realmente grandes y elimina los valores constantes agregados a la notación de Big O. También se introduce el concepto de una función f, y se afirma que Gran O de f de n es simplemente n al cubo, que es el término más grande y dominante en esa función.

  • 00:10:00 Google Engineer proporciona ejemplos concretos de cómo se usa la notación Big O. Los ejemplos se clasifican en función de sus complejidades de tiempo: tiempo constante, tiempo lineal, tiempo cuadrático, tiempo logarítmico. También proporciona un desglose paso a paso de cómo se logra una complejidad de tiempo logarítmica utilizando el ejemplo de la búsqueda binaria. Además, demuestra cómo calcular la complejidad temporal de un algoritmo más complicado y explica la regla para determinar la complejidad de un algoritmo.

  • 00:15:00 El orador discute el análisis de complejidad de un bucle anidado con un bucle exterior y un bucle interior. El bucle interior tiene una cantidad constante de trabajo y el bucle exterior tiene una cantidad variable de trabajo. La gran O de la función es O(n^4) ya que n^3 es el término dominante. Luego, el hablante presenta matrices estáticas, que son un contenedor de longitud fija que contiene elementos indexables que son fragmentos de memoria contiguos. Las matrices estáticas se utilizan en todas partes, desde el almacenamiento temporal de objetos hasta el almacenamiento de información de un flujo de entrada o salida. El disertante describe la estructura básica de una matriz, las operaciones comunes que se pueden realizar en ellas y su análisis de complejidad.

  • 00:20:00 El instructor analiza el uso de matrices en la programación, incluso como una solución alternativa para los lenguajes que solo permiten un valor de retorno y en la programación dinámica. Explica que las matrices tienen un tiempo de acceso constante debido a su propiedad indexable, pero la búsqueda puede llevar hasta un tiempo lineal en el peor de los casos. La inserción, la adición y la eliminación de una matriz estática no son factibles, pero con una matriz dinámica, cambiar el tamaño de la matriz interna para agregar resultados en una operación de tiempo raro pero constante. Finalmente, señala que los elementos se pueden iterar mediante un ciclo for-each y que la indexación de matrices en informática comienza en cero, lo que puede resultar confuso para algunos principiantes.

  • 00:25:00 El video analiza el concepto de indexación en arreglos, donde un corchete indica indexación, y cómo los arreglos dinámicos pueden crecer y reducirse según sea necesario, lo que permite operaciones de configuración similares a las de los arreglos estáticos. Para implementar una matriz dinámica, se utiliza una matriz estática y, cuando se supera la capacidad, el tamaño de la matriz se duplica y todos los elementos se copian en la nueva matriz estática. El video también muestra el código fuente de la clase de matriz, que admite genéricos de tipo T y tiene variables de instancia para la matriz estática interna, la longitud y la capacidad.

  • 00:30:00 El instructor pasa por la implementación de varios métodos para una matriz dinámica, incluidos tamaño, inserción, borrar, agregar, eliminar, indexar, contiene y toString. El método add implica cambiar el tamaño de la matriz duplicando su tamaño cuando se alcanza la capacidad, y el método remove usa dos índices para copiar todos los elementos de la matriz excepto el índice de eliminación. El instructor también demuestra cómo crear un iterador para la matriz dinámica y habla sobre los beneficios de usar un iterador para iterar sobre los elementos de una matriz. En general, el tutorial proporciona una introducción simple pero completa a la implementación de arreglos dinámicos.

  • 00:35:00 El instructor proporciona una introducción a las listas de enlace simple y doble, explicando que son una lista secuencial de nodos que contienen datos y apuntan a otros nodos que contienen datos. Las listas enlazadas se utilizan en la implementación de listas, pilas y colas, así como listas circulares, encadenamiento separado de tablas hash y para listas y gráficos de adyacencia. El instructor también cubre alguna terminología útil para crear listas enlazadas. Además, se analizan las ventajas y desventajas de las listas con enlaces simples y dobles, ya que las listas con enlaces simples son más eficientes en términos de memoria pero carecen de la capacidad de acceder a elementos anteriores, mientras que las listas con enlaces dobles se pueden recorrer hacia atrás y permiten una fácil eliminación de un nodo.

  • 00:40:00 El instructor explica los detalles de implementación de la creación e inserción de nodos en una lista de enlace simple y en una lista de enlace doble. Para insertar un nodo en una lista vinculada individualmente, se crea un nuevo puntero y el puntero del recorrido se avanza a la posición deseada, después de lo cual se crea el nuevo nodo y se vincula a los otros nodos. Por otro lado, una lista doblemente enlazada tiene punteros anteriores y siguientes, y al insertar un nuevo nodo, tanto los punteros de los nodos adyacentes como los del nuevo nodo deben actualizarse. Eliminar un nodo de una lista enlazada individualmente implica usar dos punteros para avanzar y eliminar el nodo deseado, y luego desasignar su memoria más adelante.

  • 00:45:00 El orador cubre cómo eliminar nodos de una lista doblemente enlazada, lo cual es más fácil que eliminar nodos de una lista enlazada individualmente ya que no tenemos que mantener manualmente las referencias al último nodo. El disertante muestra una implementación en Java y discute la complejidad de varias operaciones en listas enlazadas, como buscar y eliminar elementos de la cabeza o la cola. Mientras que buscar en una lista enlazada es lineal en el peor de los casos, insertar o quitar la cabeza es un tiempo constante. La eliminación de la cola lleva un tiempo lineal en una lista con enlace único, pero no en una lista con enlace doble porque tiene una referencia al nodo anterior.

  • 00:50:00 En esta sección del video, el presentador explica la implementación de una lista doblemente enlazada con métodos para borrar la lista, obtener el tamaño y verificar si está vacío, y agregar nodos al principio y al final de la lista. También explica cómo echar un vistazo al primer o último elemento de la lista, eliminar el primer o último elemento y eliminar un nodo arbitrario en el medio de la lista. El presentador enfatiza la importancia de desasignar la memoria correctamente y establece la clase de nodo como privada para evitar que los usuarios accedan a ella directamente.

  • 00:55:00 En esta sección del video, el tutor explica cómo eliminar un nodo de un índice particular de una lista vinculada, aunque los nodos no estén indexados explícitamente. El método Remove admite la eliminación de un valor arbitrario de la lista vinculada y la búsqueda de valores nulos. El tutor también explica el índice del método para obtener el índice de un objeto dentro de una lista enlazada y el método iterador. Por último, el tutor presenta la estructura de datos de la pila y proporciona brevemente una descripción general de sus operaciones principales, empujar y sacar. El tutor también destaca que los próximos videos de la serie cubrirán la implementación de pilas, los problemas resueltos usando pilas y la complejidad del tiempo asociada con las operaciones de pila.

Parte 2

  • 01:00:00 El video analiza cómo funciona una estructura de datos de pila y sus diversos usos en la programación. El video proporciona un ejemplo detallado de cómo se agregan y eliminan operaciones de una pila y explica cómo se usan las pilas en editores de texto, compiladores y recursión compatible. Además, el video destaca cómo se puede usar una pila para realizar una búsqueda en profundidad en un gráfico y presenta un problema de ejemplo interesante sobre cómo determinar si una secuencia de paréntesis es válida o no usando una pila. Por último, el video incluye un análisis de la complejidad de las pilas y cómo funcionan como una lista enlazada.

  • 01:05:00 El ingeniero de Google demuestra cómo verificar si una secuencia de paréntesis es válida usando una estructura de datos de pila. Repasa el algoritmo paso a paso, colocando los corchetes izquierdos en la pila y sacándolos cuando encuentra corchetes derechos, y comprueba si coinciden. También explica cómo el juego de la Torre de Hanoi se puede relacionar con las pilas, ya que cada clavija representa una pila y los discos representan elementos que solo se pueden mover bajo ciertas condiciones. Finalmente, analiza cómo se pueden implementar pilas utilizando matrices o listas enlazadas.

  • 01:10:00 Aprendemos a crear una pila usando una lista enlazada individualmente y extrayendo elementos de la pila en una implementación simple de una estructura de datos de pila en el lenguaje de programación Java. La pila se crea apuntando la cabeza a un nodo nulo, lo que significa que la pila está vacía. Los nuevos elementos se insertan antes del encabezado y los elementos emergentes se realizan moviendo el puntero del encabezado al siguiente nodo y desasignando el último nodo. Las fugas de memoria en las estructuras de datos pueden causar problemas, por lo que es importante estar atento a ellas en todas las estructuras de datos y corregirlas cuando sea necesario.

  • 01:15:00 El instructor analiza las colas, una estructura de datos lineales que se utiliza para modelar una cola del mundo real con dos operaciones principales: poner y quitar cola. La parte delantera y trasera de la cola se utilizan para insertar y eliminar elementos, respectivamente. El instructor también explica las diversas terminologías relacionadas con las colas, a veces se hace referencia a la puesta en cola como agregar y a la eliminación de la cola como sondeo o eliminación del principio de la cola. Un ejemplo clásico de cola es una fila en un cine o restaurante, y las colas pueden ser útiles para realizar un seguimiento de los elementos más recientes de una secuencia.

  • 01:20:00 El video explica cómo se usan las colas para administrar las solicitudes del servidor y realizar un recorrido de búsqueda en amplitud en un gráfico. Se introduce el concepto de solicitudes en cola, donde un servidor inactivo solo puede manejar una cierta cantidad de solicitudes a la vez y cualquier exceso de solicitudes se coloca en una cola. El video también cubre los conceptos básicos de la búsqueda en amplitud, en la que los nodos de un gráfico se visitan en orden de distancia desde un nodo inicial. El video concluye explicando la implementación de elementos n-queuing y dequeuing utilizando una estructura de datos de cola.

  • 01:25:00 El tutorial profundiza en las colas y explica cómo se puede implementar el tipo de datos abstractos de la cola utilizando matrices o diferentes tipos de listas enlazadas: listas enlazadas individualmente y listas enlazadas doblemente. El tutorial proporciona un ejemplo de cómo puede funcionar la implementación de una lista de enlaces individuales de una cola y también analiza la implementación de varios métodos de cola como pico, encuesta y oferta utilizando el lenguaje de programación Java. El tutorial también comparte un enlace al código fuente de la implementación de la cola en github.com.

  • 01:30:00 En esta sección del tutorial, el ingeniero de Google explica el concepto y la implementación de estructuras de datos, específicamente colas y colas prioritarias. Describe cómo una cola de prioridad funciona de manera similar a una cola normal, con la única diferencia de que cada elemento tiene una cierta prioridad y los elementos con una prioridad más alta salen primero de la cola. También enfatiza que las colas de prioridad solo admiten elementos comparables, lo que significa que los datos que insertamos en la cola de prioridad deben estar ordenados. Además, proporciona un ejemplo para explicar las operaciones de sondeo y adición de elementos a una cola de prioridad. En las siguientes secciones del tutorial, entrará en más detalles sobre las operaciones comunes realizadas en las colas de prioridad, convirtiendo colas de prioridad mínima en colas de prioridad máxima, análisis de complejidad y formas de implementar colas de prioridad.

  • 01:35:00 El ingeniero de Google explica cómo se implementan las colas de prioridad mediante montones. Un montón es una estructura de datos basada en árboles que satisface la invariante del montón, lo que significa que el valor del nodo principal siempre es mayor o igual que el valor del nodo secundario para todos los nodos, lo que da como resultado dos tipos de montones: Montones máximos y min montones. Los montones son importantes ya que forman la estructura de datos subyacente canónica para las colas de prioridad. Luego, el ingeniero de Google muestra ejemplos de estructuras y pregunta a la audiencia si son montones o no, demostrando que todos los montones deben ser árboles y satisfacer la invariante del montón.

  • 01:40:00 Se discute la importancia de las colas de prioridad en algoritmos como el algoritmo de ruta más corta de Dijkstra y la codificación de Huffman. Las colas de prioridad son útiles en situaciones en las que es necesario obtener dinámicamente el siguiente elemento mejor o peor. El enfoque principal está en las colas de prioridad implementadas como montones binarios y las operaciones, incluida la adición de un elemento, la eliminación de un elemento, la verificación de la contención y el cambio de colas de prioridad mínima a colas de prioridad máxima. Las tablas hash se pueden usar para mejorar la complejidad del tiempo de eliminación para que sea logarítmica, mientras que se realiza un escaneo lineal para todos los elementos para el método ingenuo. La sección concluye con un truco para convertir las colas de prioridad mínima en colas de prioridad máxima.

  • 01:45:00 El ingeniero de Google explica cómo usar la negación como una forma simple de implementar montones inversos en las colas de prioridad. Proporciona ejemplos de manipulación numérica y de cadenas utilizando una cola de prioridad mínima con el comparador lexicográfico estándar, así como un comparador negado. El ingeniero también presenta el concepto de montones binarios y cómo agregarles elementos.

  • 01:50:00 El instructor explica la terminología y los conceptos importantes necesarios para comprender cómo agregar elementos de manera efectiva a una cola de prioridad mediante un montón binario. Aclara que una cola de prioridad no es un montón sino un tipo de datos abstracto que define el comportamiento que debe tener una cola de prioridad, y que los montones son solo la estructura de datos que nos permite implementar ese comportamiento. También analiza los tipos de montones, incluidos los montones binarios, y explica la propiedad completa del árbol binario y cómo representar un montón binario mediante una construcción de matriz.

  • 01:55:00 El ingeniero de Google explica cómo agregar nodos a un montón binario y mantener el montón invariable usando una técnica para acceder fácilmente a los nodos primarios y secundarios de un nodo. Lo ilustran con el ejemplo de la inserción de valores en un montón mínimo y demuestran cómo aumentar los nodos para satisfacer la invariante del montón. En la siguiente sección, el ingeniero cubre la eliminación de elementos de un montón binario y enfatiza la importancia de eliminar el valor raíz, que es el nodo de interés con la prioridad más alta.

parte 3

  • 02:00:00 El ingeniero de Google explica el proceso de eliminación de nodos de una estructura de datos de montón binario mediante el método de extracción. La extracción se realiza en dos casos, al eliminar el nodo raíz y al eliminar un nodo específico. Al eliminar el nodo raíz, el nodo se intercambia con el último nodo de la matriz, y la invariancia del montón se garantiza mediante el burbujeo. Al eliminar un nodo específico, el nodo se busca de forma lineal, se intercambia con el último nodo del montón y, a continuación, se garantiza la invariancia del montón aumentando o disminuyendo según el valor del nodo intercambiado. El ingeniero concluye que extraer toma un tiempo logarítmico para el nodo raíz y un tiempo lineal para un nodo específico.

  • 02:05:00 En esta sección del tutorial, el ingeniero de Google explica cómo eliminar nodos en un montón con una complejidad de tiempo mejorada mediante el uso de una tabla hash. En lugar de hacer un escaneo lineal para encontrar el índice del nodo a eliminar, cada nodo se asigna al índice en el que se encuentra. Cuando queremos eliminar un nodo en particular, simplemente buscamos su índice para comenzar a hacerlo. El video también cubre cómo lidiar con el problema de múltiples valores en el montón y cómo realizar un seguimiento de las posiciones de los valores en el árbol. El ingeniero explica que siempre que satisfagamos la invariante del montón, no importa qué nodo eliminemos. El tutorial incluye ejemplos de agregar, extraer y eliminar elementos con el nuevo esquema propuesto.

  • 02:10:00 El orador explica cómo insertar, eliminar y mantener el montón invariable en una cola de prioridad usando una estructura de datos de montón. Luego se sumerge en el código fuente y destaca algunas variables de instancia importantes y constructores necesarios para implementar la cola de prioridad. Explica que los elementos permitidos en la cola de prioridad deben implementar la interfaz comparable y que el registro y las eliminaciones se pueden rastrear mediante un mapa que asigna un elemento a un conjunto de números enteros que representan las posiciones del elemento en el montón.

  • 02:15:00 En esta sección del tutorial, el ingeniero de Google analiza diferentes formas de crear una cola prioritaria, incluida la creación de una cola inicialmente vacía con una capacidad establecida, la creación de una cola con una capacidad inicial definida y la construcción de una cola lineal tiempo usando la operación heapify. El ingeniero también repasa algunos métodos simples de una cola de prioridad, incluidos vacío, claro, tamaño, vistazo, sondeo y contenido. También se analiza el método de agregar, con detalles sobre cómo agregar elementos a la cola y la importancia de realizar un seguimiento de los elementos en un mapa. La función de natación también se destaca como un paso necesario después de agregar un elemento al final de la lista.

  • 02:20:00 En esta sección del video, el ingeniero de Google explica los métodos para nadar y hundir nodos en una estructura de datos de montón binario. El método de natación implica intercambiar nodos con su padre y moverse hacia arriba hasta que el nodo esté en la posición correcta según su valor. El método de hundimiento es similar pero implica comparar el nodo con sus nodos secundarios e intercambiar con el más pequeño hasta que alcance la posición correcta. El ingeniero también explica los métodos swap, remove y remove add implementados en el montón binario. El método remove add implica intercambiar el nodo eliminado con el último elemento en el montón y hundir o nadar el nuevo nodo a la posición adecuada.

  • 02:25:00 En esta sección del tutorial, el instructor explica cómo eliminar un nodo de una estructura de datos de almacenamiento dinámico y garantizar que se mantenga la integridad mínima del almacenamiento dinámico utilizando un método para hundir o nadar nodos dependiendo de si el intercambio afecta el almacenamiento dinámico. orden. La sección también presenta la estructura de datos union find y sus dos operaciones principales, find y union, que se utilizan para rastrear elementos divididos en conjuntos disjuntos y fusionar dos grupos, respectivamente.

  • 02:30:00 El orador usa el ejemplo de los imanes para explicar cómo funciona la estructura de datos de búsqueda de unión. La búsqueda de unión fusiona eficientemente elementos o grupos de elementos, asignándoles un color arbitrario. La estructura de datos de búsqueda de unión se utiliza en varios algoritmos, como el algoritmo de árbol de expansión mínimo y la percolación de cuadrícula. El hallazgo de unión tiene una complejidad excelente y su construcción es lineal en el tiempo, mientras que su función de recuento de componentes puede determinar el número de componentes en tiempo constante, lo que la convierte en una excelente estructura de datos para tener a mano.

  • 02:35:00 En esta sección del tutorial, el ingeniero de Google explica el algoritmo de Kruskal para encontrar un árbol de expansión mínimo en un gráfico. El algoritmo implica clasificar los bordes por peso de borde ascendente y luego unificar los nodos que no pertenecen al mismo grupo, hasta que todos los vértices se unifican en un grupo. La estructura de datos de búsqueda de unión se utiliza para fusionar grupos de manera eficiente y evitar ciclos. El ingeniero proporciona un gráfico de ejemplo y recorre los pasos del algoritmo para ilustrar cómo funciona.

  • 02:40:00 El tutorial explica la estructura de datos de búsqueda de unión y cómo funciona internamente. El primer paso es crear un mapeo entre los objetos y los números enteros en el rango de cero a N no inclusivos, donde N es el número de elementos. Luego se construye un arreglo, y cada índice tiene un objeto asociado, lo cual se hace a través del mapeo. El valor en la posición de la matriz es inicialmente el índice en el que se encuentra, y cada nodo es un nodo raíz que se asigna a sí mismo. A medida que se ejecutan las instrucciones para unificar objetos en grupos, los valores de la matriz han cambiado para asignarse a otros objetos. Los componentes más pequeños se fusionan en otros más grandes y los nodos raíz se utilizan para unificar grupos.

  • 02:45:00 El orador habla sobre cómo fusionar elementos en diferentes grupos utilizando la estructura de datos de búsqueda de unión. Al encontrar y seguir los nodos principales del nodo raíz de cada componente, podemos determinar a qué componente pertenece un elemento. Para unificar dos componentes, hacemos que uno de los nodos raíz apunte a convertirse en el padre de la otra raíz. La cantidad de componentes es igual a la cantidad de nodos raíz restantes, y la cantidad de nodos raíz solo disminuye a medida que unificamos los componentes. El orador también señala que la implementación de esta estructura actualmente no tiene una complejidad de tiempo amortizada sin el uso de la compresión de ruta, una optimización que se discutirá en el próximo video.

  • 02:50:00 Se introduce el concepto de compresión de ruta para mostrar cómo hace que la estructura de datos de búsqueda de unión sea más eficiente. La compresión de ruta implica comprimir todos los nodos a lo largo de la ruta al nodo raíz, lo que permite una búsqueda en tiempo constante del nodo raíz para cualquier componente dado. Se proporciona el ejemplo de unificación de grupos con y sin compresión de ruta para comparar y contrastar los dos métodos, lo que demuestra la eficiencia obtenida a través de la compresión de ruta.

  • 02:55:00 El instructor analiza cómo la compresión de rutas y la unión trabajan juntas para crear una estructura de datos eficiente. Demuestra cómo la compresión de rutas comprime dinámicamente las rutas a lo largo del camino hasta alcanzar un estado final. El código de búsqueda de unión se presenta en el video, con explicaciones sobre el uso de matrices para indexar y rastrear las relaciones padre-hijo. Además, el código incluye métodos para verificar el nodo raíz y comprimir la ruta hacia él. El instructor enfatiza la importancia de ver otros videos sobre Union Find para obtener una comprensión completa del tema.

parte 4

  • 03:00:00 El instructor presenta una estructura de datos union-find y sus métodos, incluidos find, connected, parent, size y unify. Demuestra cómo los nodos raíz de la estructura contienen el tamaño de cada componente conectado, y el método de unificación fusiona grupos más pequeños en otros más grandes. Pasando a los árboles, el instructor brinda una breve descripción general de los árboles como gráficos no dirigidos e introduce árboles binarios y árboles de búsqueda binaria. Promete cubrir cómo insertar y eliminar nodos en árboles de búsqueda binarios, recorridos de árboles y cómo se pueden aplicar a árboles generales en tutoriales posteriores.

  • 03:05:00 Se introduce el concepto de árboles, con múltiples definiciones proporcionadas. Un árbol se puede definir como un grafo no dirigido que es conexo y acíclico, como un grafo con n nodos y n-1 aristas, o como un grafo donde solo hay un camino entre dos vértices cualesquiera. También se introduce un árbol enraizado, donde cualquier nodo puede convertirse en la raíz y se definen los nodos padre e hijo. El padre del nodo raíz es él mismo, y los nodos hoja se definen como nodos sin hijos. También se introduce el concepto de un subárbol, denotado por triángulos dentro de un árbol. Además, la definición de un árbol binario se explica como un árbol en el que cada nodo tiene como máximo dos hijos.

  • 03:10:00 El video cubre los árboles de búsqueda binaria, que son árboles binarios que satisfacen la invariante del árbol de búsqueda binaria. Esto significa que el subárbol izquierdo siempre tiene valores más pequeños que el nodo actual y el subárbol derecho tiene valores más grandes. El video presenta varios ejemplos de árboles de búsqueda binarios y desafía a los espectadores a determinar si satisfacen el invariante. Los árboles de búsqueda binarios son útiles en muchas implementaciones de tipos de datos abstractos y se utilizan en árboles de búsqueda binarios equilibrados y árboles de sintaxis. También tienen una complejidad de tiempo logarítmica en el caso promedio para operaciones como inserción y búsqueda de datos aleatorios.

  • 03:15:00 En esta sección del tutorial, el ingeniero de Google analiza los árboles de búsqueda binarios y cómo insertar elementos en ellos. Los árboles de búsqueda binarios tienen un comportamiento logarítmico en promedio, lo que los hace fáciles de implementar y eficientes en la mayoría de los casos. Sin embargo, en el peor de los casos, un árbol binario puede convertirse en una estructura de datos lineal, lo que no es lo ideal. Para insertar un elemento en un árbol de búsqueda binaria, el elemento debe ser comparable y puede ocurrir uno de cuatro casos: recursividad hacia abajo en el subárbol izquierdo, recursividad hacia abajo en el subárbol derecho, manejar valores duplicados o insertar un nuevo nodo. Finalmente, el ingeniero demuestra la inserción de valores en un árbol de búsqueda binario mediante animaciones.

  • 03:20:00 El ingeniero de Google explica el peor de los casos al insertar valores en un árbol de búsqueda binario, lo que hace que se convierta en una estructura lineal. Este comportamiento no es deseable porque ralentiza operaciones como la búsqueda de nodos o la eliminación de valores. Luego, el ingeniero explica cómo eliminar elementos de un árbol de búsqueda binaria en dos pasos: primero encontrar el nodo que se eliminará y luego reemplazarlo con su sucesor para mantener invariable el árbol de búsqueda binaria. El video proporciona un ejemplo de cómo buscar valores en un árbol de búsqueda binaria para ayudar a comprender el proceso.

  • 03:25:00 El ingeniero de Google explica los cuatro casos de la fase Eliminar cuando se trata de un árbol de búsqueda binario. El primer caso es cuando el nodo a eliminar es un nodo hoja, el segundo y el tercer caso ocurren cuando solo hay un subárbol a la izquierda o a la derecha. El cuarto caso ocurre cuando el nodo tiene un subárbol derecho e izquierdo, y la pregunta es ¿en qué subárbol estará el sucesor del nodo? La respuesta es que el sucesor puede ser el valor más grande del subárbol izquierdo o el valor más pequeño del subárbol derecho, y puede haber dos posibles sucesores.

  • 03:30:00 En esta sección del curso, el instructor explica cómo eliminar nodos de los árboles de búsqueda binarios utilizando el concepto de un nodo sucesor. El sucesor es el nodo más pequeño del subárbol derecho o el nodo más grande del subárbol izquierdo. El instructor demuestra la eliminación de nodos a través de varios ejemplos, enfatizando la importancia de reequilibrar el árbol después de la eliminación. La sección concluye con una descripción general de los diferentes recorridos del árbol, incluidos el pedido previo, el pedido en orden, el pedido posterior y el orden de niveles.

  • 03:35:00 El instructor explica los conceptos de recorridos previos, en orden y posteriores al pedido en árboles binarios. Explica que el pedido anticipado imprime el valor del nodo actual seguido de sus subárboles izquierdo y derecho, y luego proporciona un ejemplo de cómo funciona el recorrido del pedido anticipado en un árbol binario, manteniendo una pila de llamadas para realizar un seguimiento de los nodos visitados. De manera similar, explica cómo funciona el recorrido en orden, que implica recorrer el subárbol izquierdo, imprimir el valor y luego recorrer el subárbol derecho. El instructor usa un árbol de búsqueda binaria como ejemplo y resalta el orden en que se visitan e imprimen los nodos durante el recorrido.

  • 03:40:00 El tutorial analiza diferentes algoritmos transversales para árboles binarios. Primero, el recorrido en orden, que imprime los valores de los nodos en orden creciente. A continuación, el recorrido posterior a la orden, que atraviesa el subárbol izquierdo, luego el subárbol derecho, y solo después de atravesar ambos, imprime el valor del nodo. El tutorial continúa explicando la búsqueda primero en amplitud y cómo se puede usar para el recorrido de orden de nivel, que imprime los nodos una capa a la vez. Se utiliza una cola para realizar un seguimiento de los nodos que se explorarán, y los nodos se agregan a la cola a medida que se visitan sus nodos principales.

  • 03:45:00 En esta sección del video, el instructor explica cómo realizar una búsqueda en amplitud utilizando una estructura de datos de cola. Demuestra el proceso de explorar nodos y agregar sus hijos a la cola según su orden. Él enfatiza la importancia de usar una cola en lugar de una pila cuando se realiza un recorrido por orden de nivel. Luego, el video cambia el enfoque a la implementación de un árbol de búsqueda binaria en Java, con el instructor explicando la estructura de la clase, las variables de instancia y los métodos utilizados para agregar elementos al árbol. También destaca la importancia de elegir un tipo comparable cuando se trabaja con árboles de búsqueda binarios.

  • 03:50:00 El instructor explica el proceso de eliminación de nodos de un árbol de búsqueda binaria. Comienzan discutiendo el método público para eliminar nodos y explicando que solo eliminarán el nodo si existe dentro del árbol, lo cual se verifica primero. Luego, profundizan en el método recursivo utilizado para eliminar el nodo, que implica encontrar el nodo que se eliminará y luego eliminarlo en función de si tiene subárboles izquierdos o derechos. El instructor explica tres casos diferentes para la eliminación, que involucran un subárbol izquierdo o derecho, o un subárbol izquierdo y derecho. También proporcionan métodos auxiliares para atravesar el árbol y encontrar el nodo sucesor.

  • 03:55:00 El ingeniero de Google explica cómo implementar un árbol de búsqueda binario en Python, incluida la inserción de un nuevo nodo, la búsqueda de un elemento específico y el cálculo de la altura del árbol. También muestra cómo implementar recorridos de árboles binarios de forma iterativa mediante un método personalizado llamado "recorrido", que toma un orden de recorrido de árboles como entrada y devuelve un iterador para ese orden. A continuación, presenta las tablas hash y analiza la importancia de las funciones hash, así como los métodos populares de resolución de colisiones, como el encadenamiento separado y el direccionamiento abierto.
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...
 

Curso de estructura de datos de fácil a avanzado: tutorial completo de un ingeniero de Google (partes 5 a 8)


Estructuras de datos Curso fácil a avanzado - Tutorial completo de un ingeniero de Google

Parte 5

  • 04:00:00 El instructor introduce el concepto de tablas hash y su implementación utilizando técnicas hash. Las tablas hash se utilizan para construir un mapeo de claves a valores, donde cada clave es única y está asociada con un valor. Para asignar las claves a los valores, se utiliza una función hash, que asigna las claves a un número entero en un rango fijo. El instructor muestra cómo definir funciones hash para objetos arbitrarios, como cadenas, utilizando los valores ASCII de los caracteres de la cadena. Las tablas hash se utilizan a menudo para realizar un seguimiento de las frecuencias de los valores y construir asignaciones entre pares clave-valor, siempre que las claves se puedan modificar. La sección termina con un mini desafío para definir una función hash para una base de datos de personas con tres campos.

  • 04:05:00 El instructor analiza las funciones hash y sus propiedades. La función hash se define arbitrariamente y puede tener un número infinito de posibilidades. El instructor enfatiza que las funciones hash deben ser deterministas para evitar estropear la tabla hash. La uniformidad de las funciones hash también es importante para minimizar las colisiones hash que ocurren cuando dos objetos tienen el mismo valor. El instructor también ilustra cómo los valores hash pueden acelerar las comparaciones de objetos y continúa explicando que las funciones hash sofisticadas, como las funciones hash criptográficas y las sumas de comprobación, se utilizan para los archivos en lugar de las funciones hash utilizadas para las tablas hash.

  • 04:10:00 El tutorial explica qué hace que una clave de tipo 't' sea hashable y cómo funciona una tabla hash usando una función hash uniforme para indexarla. Menciona que las funciones hash deben ser deterministas y aplicar claves inmutables que sean fijas y constantes, como cadenas inmutables y números enteros. Al usar la función hash como una forma de indexar en una tabla hash, podemos lograr tiempos rápidos de inserción, búsqueda y eliminación en tiempo constante. El tutorial también proporciona un ejemplo de inserción de pares clave-valor en una tabla que eventualmente conduce a una colisión hash y explica cómo manejar las colisiones.

  • 04:15:00 El orador analiza las técnicas de resolución de colisiones hash, específicamente el encadenamiento separado. El encadenamiento separado es una forma de lidiar con las colisiones de hash al mantener una estructura de datos auxiliar, generalmente una lista enlazada, para contener todos los diferentes pares clave-valor que generan un valor específico. La complejidad de tiempo de una tabla hash puede lograr una inserción, eliminación y búsqueda de tiempo constante en promedio, pero con una función hash terrible que no es uniforme, podría ser un tiempo lineal. El orador también brinda un ejemplo de cómo funciona el encadenamiento separado y cómo podemos usarlo para manejar las colisiones dentro de nuestra tabla hash al mantener una estructura de datos de lista vinculada para cada índice en la matriz.

  • 04:20:00 El orador explica cómo funcionan las búsquedas en una tabla hash con encadenamiento separado, que usa listas enlazadas para manejar las colisiones. Con una clave dada, el orador demuestra cómo encontrar el valor correspondiente al codificar la clave y buscar en la lista vinculada en el cubo correspondiente de la tabla hash. El orador también aborda algunas preguntas comunes sobre el mantenimiento de una complejidad de tiempo constante, la eliminación de pares clave-valor y el uso de diferentes estructuras de datos para manejar cubos en la tabla hash. Finalmente, el orador comparte un código fuente para la implementación de una tabla hash usando un encadenamiento separado.

  • 04:25:00 El video presenta las tablas hash y cómo se implementan en Java. Primero se analiza la clase de entrada, centrándose en los genéricos, los códigos hash y el método equals. Luego se explica la tabla hash en sí, incluidas las variables de instancia como el factor de carga máximo, la capacidad, el umbral y la tabla en sí, que es una matriz de listas vinculadas. También se analizan varios métodos, como tamaño, vacío, claro, contiene clave y hash, junto con sus detalles de implementación. Finalmente, se explica el método de índice normalizado, que se utiliza para convertir un valor hash en un índice para buscar en la tabla hash.

  • 04:30:00 En esta sección del video, el orador explica los métodos involucrados en la implementación de una tabla hash, como insertar, obtener, eliminar, buscar entrada y cambiar el tamaño de la tabla. El método insert agrega una nueva entrada a la tabla hash o actualiza una existente, mientras que get recupera el valor asociado con una clave específica. Remove elimina el par de valores clave de la tabla hash, y el método de entrada de búsqueda ayuda a encontrar la entrada en un índice de depósito determinado. Por último, cambiar el tamaño de la tabla cambia el tamaño de la tabla duplicando su capacidad y luego crea una nueva tabla con la nueva capacidad, mueve los datos de la tabla anterior a la nueva tabla y elimina los datos antiguos.

  • 04:35:00 El instructor analiza la técnica de direccionamiento abierto para resolver colisiones en tablas hash. Este método almacena los pares clave-valor en la propia tabla en lugar de una estructura de datos auxiliar. Por lo tanto, es crucial administrar el tamaño de la tabla hash y la cantidad de elementos que contiene. El factor de carga, que es la relación entre los elementos y el tamaño de la tabla, debe mantenerse por debajo de un cierto umbral para evitar que se vuelva exponencialmente malo. Al insertar una nueva clave, la función hash proporciona una posición original para la clave, pero si hay una colisión, se usa una secuencia de sondeo para encontrar el siguiente lugar abierto. La secuencia de sondeo lineal es una de las muchas para elegir.

  • 04:40:00 El instructor analiza el direccionamiento abierto, un método de manejo de colisiones en tablas hash donde el elemento se coloca en una ubicación diferente cuando el índice hash original ya está ocupado. Se introducen varias funciones de sondeo, como el sondeo lineal, el sondeo cuadrático, el hash doble y la función de sondeo del generador de números pseudoaleatorios, cada uno de los cuales utiliza una fórmula matemática diferente para encontrar la siguiente ranura. Sin embargo, la principal dificultad con el direccionamiento abierto es la posibilidad de producir ciclos más cortos que el tamaño de la tabla hash, lo que puede conducir a un bucle infinito. Se da un ejemplo práctico para ilustrar este problema.

  • 04:45:00 El orador analiza el tema de los ciclos en las funciones de sondeo utilizadas en las tablas hash y cómo manejarlo. El orador explica que técnicas como el sondeo lineal, el sondeo cuadrático y el hash doble están sujetos a este problema de los ciclos, pero se pueden redefinir para producir un ciclo de longitud para evitar quedar atrapado en un bucle infinito al insertar un elemento. La constante "b" en el sondeo lineal se considera obsoleta, y el orador menciona que algunas funciones lineales pueden no ser capaces de producir un ciclo completo de orden "n". La solución a este problema es elegir funciones de sondeo que produzcan un ciclo de exactamente "n" asegurándose de que la constante "a" y el tamaño de la tabla "n" sean primos entre sí.

  • 04:50:00 El instructor analiza las tablas hash y cómo funcionan, incluidas las funciones de sondeo, el tamaño de la tabla, el factor de carga y el cambio de tamaño. Utiliza un ejemplo con sondeo lineal para demostrar cómo insertar pares de valores clave en una tabla hash y evitar bucles infinitos causados por colisiones de hash. Sin embargo, señala que la elección de la función de sondeo y el tamaño de la tabla pueden afectar significativamente el rendimiento, y seleccionar una función cuyo máximo común denominador con el tamaño de la tabla no sea uno puede generar ciclos y causar problemas.

  • 04:55:00 Vemos un ejemplo del uso de una función de sondeo para insertar pares clave-valor en una tabla hash sin colisiones. Si ocurre una colisión, la función de sondeo seguirá sondeando hasta que se encuentre un lugar vacío para evitar que ocurra cualquier ciclo. Una vez que el número de elementos excede el umbral de la tabla, el tamaño de la tabla se duplica mientras se mantiene el GCD de N. Los elementos antiguos se colocan en la nueva tabla usando el nuevo tamaño de la tabla mientras se mantiene la misma función de sondeo. Finalmente, se inserta un nuevo par clave-valor y, si el lugar está libre, no hay problemas.

parte 6

  • 05:00:00 El instructor analiza el sondeo cuadrático en tablas hash, que se utiliza para abordar las colisiones en el direccionamiento abierto. Esto implica probar de acuerdo con una fórmula cuadrática utilizando una función de prueba aleatoria. El instructor explica que no todas las funciones cuadráticas son viables porque no producen un ciclo de orden que resulte en un bucle infinito, pero la mayoría de las funciones cuadráticas seleccionadas al azar terminarán produciendo un ciclo. El instructor proporciona las tres formas más populares de seleccionar una función de sondeo y se centra en la segunda, donde p de x es igual a x al cuadrado más x dividido por dos y el tamaño de la tabla es una potencia de dos.

  • 05:05:00 El orador analiza el proceso de inserción de elementos en tablas hash utilizando la técnica de resolución de colisión de doble hash y direccionamiento abierto. Explican la importancia de que el tamaño de la tabla sea una potencia de dos y cómo manejar las colisiones mediante el sondeo. El orador también demuestra el proceso de cambiar el tamaño de la tabla cuando el factor de carga supera un cierto umbral. Continúan discutiendo cómo actualizar los elementos existentes y cómo insertar otros nuevos en la tabla.

  • 05:10:00 El instructor explica el concepto de hash doble, que es un método de sondeo utilizado para manejar colisiones en tablas hash. El esquema de hash doble implica probar de acuerdo con un múltiplo constante de otra función hash, llamada función hash secundaria. El instructor advierte sobre el problema de los ciclos infinitos que pueden ocurrir en el caso del hash doble y brinda una estrategia para solucionarlo, que implica elegir un número primo para el tamaño de la tabla y construir un valor llamado delta. También analiza la forma sistemática de generar nuevas funciones hash para diferentes tipos de datos utilizando el mismo bloque de construcción fundamental.

  • 05:15:00 El orador explica el concepto de funciones hash y cómo se pueden combinar para crear una nueva función hash. Mencionan el uso de funciones hash universales y brindan un ejemplo usando hash doble. Discuten el proceso de insertar pares clave-valor en una tabla hash mientras también manejan colisiones hash y actualizaciones. El ejemplo usa un tamaño de tabla de siete y un factor de carga máximo de 0,75, y la función hash usa números enteros y reales como bloques de construcción.

  • 05:20:00 El tutorial explica el proceso de cambiar el tamaño y hacer crecer una tabla hash con hash doble, lo que implica duplicar el tamaño de la tabla, encontrar el siguiente número primo por encima de ese valor, asignar una nueva tabla e insertar los elementos antiguos en la nueva mesa. El tutorial proporciona un ejemplo en el que la tabla original ha alcanzado su umbral máximo después de insertar cinco elementos, y la tabla se redimensiona a un nuevo tamaño de 17. El tutorial también explora los problemas que surgen al eliminar elementos de una tabla hash utilizando el direccionamiento abierto. esquema, y la importancia de evitar colisiones durante las operaciones de inserción y eliminación.

  • 05:25:00 El video explica cómo manejar las colisiones hash y la eliminación en una tabla hash. Se muestra que el método ingenuo de eliminación, que simplemente borra el contenido del cubo, es defectuoso porque afecta la capacidad de encontrar elementos en la tabla hash correctamente. En cambio, el video recomienda colocar un marcador único llamado lápida en lugar del elemento eliminado. Este marcador se puede reemplazar más tarde con un nuevo par clave-valor o eliminarse durante el cambio de tamaño de la tabla hash. El video proporciona un ejemplo que usa el sondeo cuadrático para mostrar cómo se usan las lápidas durante la búsqueda de tablas hash.

  • 05:30:00 El ingeniero de Google brinda una descripción general de las tablas hash que usan dos direcciones abiertas como esquema de resolución de colisiones. El ingeniero analiza la eliminación diferida o la reubicación diferida, que implica la reubicación de pares de valores clave para evitar chocar con un montón de lápidas al sondear. El ingeniero también proporciona un recorrido por el código de una tabla hash que usa sondeo cuadrático, lo que implica almacenar pares de valores clave directamente dentro de una matriz en lugar de tener una matriz con una clase contenedora para una entrada. El ingeniero explora el constructor y las constantes predeterminadas para la tabla hash, lo que permite a los usuarios inicializarla sin ningún parámetro.

  • 05:35:00 En esta sección del curso, el instructor explica la implementación de la tabla hash usando sondeo cuadrático. El método implica calcular el umbral, normalizar el índice e inicializar las tablas. La información del método de inserción se proporciona cuando los pares clave-valor se insertan en la tabla hash o se actualizan si la clave ya existe. El instructor también analiza el conteo de claves, el cheque vacío de la tabla hash y la adición antes de pasar al método de inserción. El bucle do-while para la inserción de una clave se explica en detalle.

  • 05:40:00 El instructor explica los métodos contiene clave, tiene clave, obtiene y elimina de la implementación de una tabla hash. Los métodos contiene clave y tiene clave verifican si existe una clave en la tabla hash llamando al método get, que devuelve un valor verdadero o falso para el indicador contiene. El método get encuentra el índice hash y busca la clave. Si la clave existe, el indicador contiene se establece en verdadero y se devuelve el valor. El método de eliminación es más simple, donde primero se encuentra una clave en la tabla hash, luego se decrementa y se arroja una lápida en su lugar. El método de cambio de tamaño de la tabla se llama cuando se insertan nuevos elementos para aumentar el tamaño de la tabla, donde se asigna una nueva tabla y la tabla actual se intercambia con la nueva tabla para llamar al método de inserción.

  • 05:45:00 El árbol de Fenwick, también conocido como árbol de índice binario, se presenta como una estructura de datos para calcular consultas de rango de manera eficiente en una matriz y realizar actualizaciones de puntos. La motivación detrás del árbol de Fenwick es la ineficiencia de las consultas lineales cuando se calculan rangos en una matriz. Al calcular todas las sumas de prefijos para la matriz, las consultas de rango se pueden calcular en tiempo constante. Sin embargo, las actualizaciones de la matriz requieren volver a calcular todas las sumas de prefijos, lo que hace que el proceso sea ineficiente. El árbol de Fenwick se creó para resolver este problema al admitir consultas de rango y actualizaciones de puntos en tiempo logarítmico con tiempo de construcción lineal. El árbol de Fenwick funciona haciendo que cada celda sea responsable de un rango de otras celdas en función del valor de su bit menos significativo.

  • 05:50:00 En esta sección del video, el instructor analiza los árboles de Fenwick y cómo funcionan para las consultas de rango. Muestra un diagrama con una matriz basada en uno y la representación binaria de cada número. El diagrama muestra los bits menos significativos responsables de sí mismos y todas las demás celdas responsables de un rango de 2, 4, 8 o 16 celdas. Para realizar una consulta de rango, el instructor explica cómo calcular la suma del prefijo hasta cierto índice en cascada hacia abajo hasta llegar a cero. Demuestra cómo encontrar la suma del prefijo para un índice específico y cómo hacer una suma de intervalo entre dos índices dados.

  • 05:55:00 Aprendemos a calcular sumas de prefijos usando un efecto de cascada y cómo realizar un algoritmo de consulta de rango usando árboles de Fenwick. El cálculo de la suma de prefijos implica comenzar en un índice dado y restar el bit menos significativo del valor hasta que llegue a cero, y luego sumar todos los valores durante cada resta. El algoritmo de consulta de rango utiliza árboles Fenwick donde tomamos la diferencia entre las sumas de prefijos para consultas de rango. El algoritmo requiere manipulación de bits y proporciona un pequeño algoritmo ordenado para un cálculo más rápido. El autor del video recomienda ver el video de consulta de rango de árbol de Fenwick anterior para obtener más contexto sobre cómo se configura el árbol y cómo se realizan las operaciones en él.

parte 7

  • 06:00:00 El ingeniero de Google explica el concepto de actualizaciones de puntos y la construcción del árbol de Fenwick. Las actualizaciones de puntos implican agregar valores al árbol en un índice específico y encontrar las celdas responsables de ese rango de responsabilidad. Mientras tanto, la construcción lineal del árbol de Fenwick implica actualizar la celda inmediata responsable de un valor al propagar los valores por todo el árbol en su lugar, lo que da como resultado un árbol de Fenwick completamente funcional. El proceso de propagación se basa en la idea en cascada de actualizar el padre responsable de un valor específico.

  • 06:05:00 En esta sección del tutorial, se explica en detalle el concepto de un árbol Fenwick. Un árbol de Fenwick es una estructura de datos que se utiliza para realizar rápidamente consultas de rango y actualizaciones de puntos en una matriz de valores. La estructura de datos utiliza un tipo de indexación binaria en la que cada celda es responsable de propagar su valor a su matriz y así sucesivamente. También se analiza el algoritmo de construcción de un árbol de Fenwick, que consiste en convertir una matriz de valores en un árbol de Fenwick mediante la clonación de la matriz original y el cálculo de la celda principal para cada elemento en la nueva estructura de árbol. Se muestra el código fuente para la implementación de un árbol de Fenwick en Java y está disponible en un repositorio de GitHub.

  • 06:10:00 El instructor explica cómo crear una clase de árbol Fenwick y sus diferentes constructores. También explica las sumas de prefijos, lo que permite calcular la suma de prefijos de uno a i, ambos inclusive. El video también cubre cómo agregar desde una actualización de punto y un método adicional para establecer el índice igual a k. El instructor enfatiza la importancia de utilizar la manipulación binaria y la estructura de datos de matriz de sufijos, que es muy útil en el procesamiento de cadenas.

  • 06:15:00 Se introduce el concepto de sufijos y conjuntos de sufijos, con un ejemplo de construcción de un conjunto de sufijos para la palabra "camello". La matriz de sufijos es una matriz de índices ordenados que permite una representación comprimida de los sufijos ordenados sin almacenar los sufijos en sí, lo que lo convierte en una alternativa eficiente en cuanto al espacio para un árbol de sufijos. La matriz de prefijos comunes más largos (LCP), que almacena cuántos caracteres tienen en común dos sufijos ordenados, también se presenta como una pieza importante de información asociada con la matriz de sufijos, con un ejemplo de construcción de la matriz LCP para un determinado cadena.

  • 06:20:00 El video analiza la aplicación de matrices de sufijos y matrices LCP para encontrar y contar subcadenas únicas de una manera más eficiente que el algoritmo ingenuo que requiere mucho espacio. Mediante el uso de la información almacenada dentro de la matriz LCP, proporciona no solo una solución rápida, sino también eficiente en cuanto al espacio. La matriz LCP representa el número compartido de caracteres entre dos sufijos adyacentes de la cadena original. Al examinar los valores de LCP, se puede determinar qué subcadenas se repiten y eliminarlas para contar todas las subcadenas únicas de manera efectiva.

  • 06:25:00 El hablante analiza el problema de encontrar la subcadena común más larga compartida entre al menos k de n cadenas dadas. Un enfoque para resolver este problema es la programación dinámica, pero puede volverse difícil de manejar rápidamente. Un mejor enfoque es usar una matriz de sufijos, que puede encontrar la solución en tiempo lineal. Para hacer esto, el orador explica que primero concatenamos todas las cadenas en una cadena más grande, agregando valores centinela únicos entre cada cadena para evitar que se mezclen los sufijos. Luego, construimos la matriz de sufijos para esta cadena concatenada, lo que nos permite encontrar la subcadena común más larga de K cadenas al buscar K cadenas con diferentes colores que comparten el mayor valor de LCP.

  • 06:30:00 El video tutorial explica cómo encontrar la subcadena común más larga de k colores diferentes dentro de una cadena usando una técnica de ventana deslizante. El enfoque es ajustar el tamaño de la ventana para que contenga k sufijos de diferentes colores y consultar el valor LCP mínimo dentro de ese rango. La consulta de rango mínimo se puede resolver mediante una solución lineal o una estructura de datos de consulta de rango mínimo, como un árbol de segmentos. El tutorial también recomienda usar una tabla hash para realizar un seguimiento de los colores en la ventana. La ventana deslizante se expande hacia abajo para capturar los colores que faltan y se reduce cuando se cumplen los criterios.

  • 06:35:00 En esta sección del video, el instructor demuestra un ejemplo de cómo resolver el problema de la subcadena común más larga con una matriz de sufijos. Los valores de LCP de ventana y LCS de ventana ayudan a rastrear el prefijo común más largo y los valores de subcadena común más largos para la ventana actual, mientras que la longitud de LCS y el conjunto de LCS rastrean los mejores valores hasta el momento. El ejemplo usa cuatro cadenas y un mínimo de dos cadenas del grupo de cuatro para compartir la subcadena común más larga. El instructor demuestra cómo expandir y reducir la ventana mientras busca la subcadena común más larga, sugiere un desafío para que los espectadores consulten el sitio web de Cast y proporciona un enlace a una implementación del algoritmo en GitHub.

  • 06:40:00 El video explica el proceso de resolución del problema de la subcadena común más larga utilizando la técnica de la ventana deslizante. Al expandir y reducir el tamaño de la ventana y usar la matriz de prefijos comunes más larga para identificar las subcadenas comunes, el algoritmo encuentra una solución con una complejidad de tiempo lineal. Luego, el video presenta el problema de la subcadena repetida más larga y explica cómo usar la matriz de prefijos comunes más larga para encontrar de manera eficiente la subcadena repetida más larga en una cadena dada, en comparación con el enfoque ingenuo que requiere N cuadrado de tiempo y mucha memoria.

  • 06:45:00 El ingeniero de Google enseña sobre el uso de una matriz de sufijos y una matriz LCP para encontrar la subcadena repetida más larga. El valor LCP en un índice da la longitud del prefijo común más largo entre dos sufijos adyacentes. El valor máximo en la matriz LCP da la longitud de la subcadena repetida más larga. En el caso de empates, se deben encontrar todos los valores más largos posibles. Luego, el ingeniero explica la importancia de los árboles de búsqueda binarios equilibrados y cómo se diferencian de los árboles de búsqueda binarios tradicionales en cuanto a que se ajustan automáticamente para mantener una altura logarítmica en relación con la cantidad de nodos que contienen, lo que hace que la inserción y la eliminación sean extremadamente rápidas. El concepto clave para lograr esto son las rotaciones de árboles, y se discutirán más adelante en el video.

  • 06:50:00 Se explica el concepto de invariante de árbol y rotaciones de árbol en árboles de búsqueda binarios balanceados. Un árbol invariante es una regla impuesta a un árbol que debe cumplirse al final de cada operación, lo cual se asegura aplicando una serie de rotaciones de árboles. Las rotaciones de árboles son transformaciones legítimas que mueven los nodos en un árbol sin romper la invariante del árbol de búsqueda binaria si se mantienen el orden y la ubicación de los nodos. El proceso de rotación a la derecha se explica en detalle y se analizan los pasos necesarios para actualizar los punteros cuando los nodos tienen referencias tanto a los nodos secundarios como a los principales.

  • 06:55:00 El video tutorial se enfoca en demostrar cómo insertar nodos en un árbol AVL usando la técnica de rotación de árboles mientras también explica las propiedades que mantienen balanceados los árboles AVL. Primero, el video explica qué es un árbol AVL y su significado como el primer tipo de árbol de búsqueda binaria balanceada. Luego, el video presenta el factor de equilibrio, que es la diferencia entre la altura del subárbol derecho y el subárbol izquierdo. El video enfatiza que el factor de equilibrio de cada nodo debe ser menos uno, cero o más uno para mantener el equilibrio del árbol AVL. Luego, el tutorial procede a discutir cómo manejar los casos cuando esto no es cierto, lo que se puede resolver con rotaciones de árboles.

parte 8

  • 07:00:00 El instructor explica los cuatro casos distintos de rotaciones necesarias para equilibrar un árbol pesado a la izquierda en un árbol AVL. El instructor también proporciona un pseudocódigo para insertar un nodo en un árbol AVL y explica los métodos de actualización y equilibrio. El método de actualización calcula la altura y el factor de equilibrio de un nodo, mientras que el método de equilibrio verifica si el factor de equilibrio de un nodo viola la propiedad del árbol AVL y determina la rotación adecuada para reequilibrar el árbol. Los casos izquierda-derecha y derecha-izquierda también se explican, ya que se reducen a casos izquierda-izquierda y derecha-derecha después de la primera rotación.

  • 07:05:00 El video explica cómo eliminar elementos de un árbol de avielle, que es muy similar a eliminar elementos de un árbol de búsqueda binaria normal. El proceso de eliminación se puede dividir en dos pasos: encontrar el elemento y reemplazarlo con un nodo sucesor para mantener invariable el árbol de búsqueda binaria. Encontrar el nodo implica comparar el elemento de destino con los nodos del árbol hasta que se encuentra una coincidencia o la búsqueda llega al final del árbol. El proceso de reemplazo depende de si el nodo a eliminar es un nodo hoja o solo tiene un subárbol izquierdo o derecho, siendo el nodo sucesor el hijo inmediato en los dos últimos casos.

  • 07:10:00 El instructor explica cómo eliminar un nodo de un árbol de búsqueda binaria y brinda ejemplos para los tres casos de eliminación. El primer caso es cuando el nodo a eliminar no tiene hijos, el segundo es cuando tiene un hijo y el último es cuando tiene dos hijos. El instructor también explica cómo aumentar el método de eliminación del árbol de búsqueda binario para árboles AVL simplemente agregando dos líneas de código para garantizar que el árbol permanezca equilibrado y que el factor de equilibrio y los valores de altura se mantengan actualizados. Finalmente, el instructor proporciona un enlace a su repositorio de GitHub donde los espectadores pueden encontrar el código fuente del árbol AVL y una demostración en vivo del árbol AVL en acción.

  • 07:15:00 El instructor brinda una explicación del código fuente para la implementación de un árbol AVL recursivo en Java. El árbol AVL acepta un argumento de tipo genérico y almacena el valor dentro del nodo, que debe ser comparable. La subclase de nodo almacena los punteros secundarios izquierdo y derecho, y el factor de altura y equilibrio del nodo. El árbol se puede mostrar en el terminal usando la interfaz de la impresora del árbol, y los métodos públicos como el tamaño, está vacío y el conjunto contiene se proporcionan en el código. El método de inserción también se explica utilizando casos base y valores comparativos para determinar si una inserción fue exitosa o no.

  • 07:20:00 Se explica el método de inserción privada en el árbol AVL, que inserta nuevos nodos en el subárbol izquierdo o derecho, mientras actualiza el factor de equilibrio y la altura de los nodos en consecuencia. El método de actualización actualiza la altura y el factor de equilibrio de un nodo, y el método de equilibrio llama a los métodos de rotación necesarios para mantener el equilibrio del árbol. Se explican los casos izquierda-izquierda, izquierda-derecha, derecha-derecha y derecha-izquierda, y se enfatiza el orden de los métodos de actualización después de la rotación como crucial para que el árbol AVL mantenga su equilibrio.

  • 07:25:00 El instructor analiza el método de eliminación de la estructura de datos del árbol de búsqueda binaria. Explica que para eliminar un elemento, el método primero verifica si el elemento existe en el árbol y luego llama al método privado de eliminación. El instructor describe los cuatro casos que pueden surgir durante la eliminación y propone una heurística para determinar de qué subárbol eliminar cuando se intenta eliminar un nodo con ambos subárboles. Finalmente, les recuerda a los espectadores que llamen al método de actualización y reequilibrio en la devolución de llamada del método de eliminación para garantizar que el árbol permanezca equilibrado a pesar de las eliminaciones de nodos.

  • 07:30:00 El ingeniero de Google presenta la cola de prioridad indexada, una estructura de datos que admite actualizaciones y eliminaciones rápidas de pares clave-valor. Resuelve el problema de poder buscar rápidamente y cambiar dinámicamente los valores en una cola de prioridad, lo que puede ser útil en diversas situaciones, como la sala de espera de un hospital donde los pacientes deben ser atendidos primero por la prioridad más alta. El ingeniero proporciona un ejemplo de pacientes con diferentes prioridades y cómo la cola de prioridad indexada puede ayudar a actualizar las prioridades sobre la marcha.

  • 07:35:00 El video analiza las colas de prioridad de índice que permiten la actualización dinámica eficiente de prioridades para ciertos elementos. El primer paso para usar una cola de prioridad de índice es asignar valores de índice a todas las claves, creando un mapeo bidireccional. Este mapeo debe ser bidireccional y puede facilitarse con una tabla hash bidireccional. La razón para usar valores de índice en las claves es habilitar la indexación en matrices, que es a menudo la forma en que se implementan las colas de prioridad.

  • 07:40:00 El orador presenta el concepto de una cola de prioridad de índice y explica las operaciones que debe admitir, incluida la eliminación de claves, obtener el valor asociado con una clave, verificar si existe una clave en la cola de prioridad, obtener el índice de clave con el valor más pequeño, obtener el valor más pequeño en el índice, poder insertar y actualizar pares de valores clave, y las operaciones de actualización especializadas aumentan y disminuyen la clave. La complejidad temporal de todas estas operaciones es constante o logarítmica. El orador también proporciona un repaso de la estructura de datos de la cola de prioridad tradicional, que incluye cómo funciona el montón binario, cómo insertar un nuevo valor en la cola de prioridad y cómo eliminar elementos de ella.

  • 07:45:00 ¿Cómo implementamos una cola de prioridad indexada con un montón binario? El primer paso es asignar a cada elemento un valor de índice único y un valor inicial para la cola de prioridad de índice. Luego, usamos una cola de prioridad indexada mínima para ordenar primero por el valor más bajo, y mantenemos un mapa de posición para decirnos el índice de un nodo en el montón para cualquier índice clave dado. Además, mantenemos una tabla de búsqueda inversa para encontrar la clave de un nodo determinado. Esta información nos permite acceder y manipular eficientemente la cola de prioridad para una variedad de aplicaciones, como priorizar pacientes en un hospital o clientes en un restaurante.

  • 07:50:00 El video explica cómo realizar operaciones útiles, como insertar, actualizar y eliminar pares clave-valor en una cola de prioridad de índice. El proceso de inserción es similar a una cola de prioridad normal, pero con el paso adicional de actualizar la posición y los mapas inversos. El video proporciona un pseudocódigo para el proceso de inserción, que muestra cómo se mueve el nodo hacia arriba a través del montón hasta que se satisface la invariante del montón. El proceso de intercambio implica actualizar la posición y los mapas inversos, pero no la matriz de valores, que permanece indexada por el índice clave en lugar del índice del nodo. El video también aborda brevemente el sondeo y la eliminación de pares clave-valor, que implican pasos similares a los de la inserción, pero a la inversa.

  • 07:55:00 El video explica cómo se mejora la eliminación de elementos de una cola de prioridad indexada de una complejidad de tiempo lineal a una complejidad de tiempo logarítmica, haciendo uso de búsquedas de posición de nodo que ahora son de tiempo constante. El video brinda un ejemplo paso a paso de cómo eliminar nodos, incluido el intercambio de nodos, el almacenamiento de pares de valores clave antes de la eliminación, la limpieza de los nodos eliminados y la restauración del montón invariante moviendo el nodo intercambiado hacia arriba o hacia abajo. Además, se proporciona un pseudocódigo para eliminar pares clave-valor, que muestra una implementación breve de cinco líneas y un proceso de limpieza de tres líneas. Finalmente, el video describe el método de sincronización y cómo funciona, así como las actualizaciones de pares clave-valor, que son similares para eliminar pero también toman un tiempo logarítmico.
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...
 

Programación en C Curso completo gratis


Programación en C Curso completo gratis

00:00:00 - 01:00:00 El video "Curso completo de programación en C gratis" enseña a los espectadores cómo instalar el compilador gcc, configurar un IDE y escribir código C. El video cubre los conceptos básicos de la programación en C, incluido cómo usar instrucciones printf, comentarios, secuencias de escape y especificadores de formato para mostrar diferentes tipos de datos. El instructor explica cómo crear e inicializar variables y cómo usar operadores aritméticos y de incremento/decremento. Además, el video cubre la aceptación de la entrada del usuario usando scanf y el formato de salida usando printf. El instructor también analiza funciones matemáticas útiles en C y cómo usarlas para calcular la circunferencia y el área de un círculo según la entrada del usuario para el radio. El video enfatiza que aunque C es un lenguaje difícil, cualquiera puede aprenderlo con persistencia y esfuerzo.

01:00:00 - 02:00:00 El video de YouTube "C Programming Full Course for free" enseña conceptos de programación en lenguaje C. En esta sección de video, el instructor cubre temas como sentencias if/else, sentencias switch, operadores lógicos, funciones y bucles. El instructor explica las sentencias condicionales, lo que permite que el programa tome decisiones en función de las condiciones, y cómo la sentencia switch es una versión más eficiente de la sentencia else if. Además, el instructor profundiza para mostrar cómo convertir unidades de temperatura, crear un programa de calculadora simple, usar operadores lógicos para mejorar la eficiencia del programa y cómo usar funciones para minimizar la redundancia de código. Finalmente, el instructor explica el operador ternario y cómo las funciones de cadena pueden ayudar en la creación de programas.

02:00:00 - 03:00:00 Este curso completo de programación en C cubre una amplia gama de temas, comenzando con la explicación de la diferencia entre un ciclo while y do-while, y cómo usar ciclos anidados para crear formas. Luego, el video continúa para cubrir los conceptos básicos de las matrices y cómo recorrer y mostrar elementos en una matriz unidimensional, antes de pasar a matrices bidimensionales y cómo crear una cuadrícula o tabla de datos 2D. Luego, el instructor presenta el concepto de intercambio de variables, algoritmos de clasificación como la clasificación de burbujas, y enseña sobre estructuras y typedef en C, así como también cómo generar números aleatorios y hacer un juego de adivinanzas. En general, este curso proporciona una comprensión completa y profunda de los conceptos de programación C.

03:00:00 - 04:00:00 Este video de YouTube titulado "Curso completo de programación en C gratis" cubre una amplia gama de temas de programación en C, incluida la creación de juegos como adivinanzas de números y juegos de preguntas, y cubre conceptos como memoria, punteros, operadores bit a bit y E/S de archivos. Además, el video explica cómo crear un juego de Tic Tac Toe que utiliza bucles for anidados y declaraciones if para verificar si hay un ganador y generar movimientos aleatorios para el jugador de la computadora. El instructor brinda explicaciones y demostraciones claras a lo largo del video, lo que lo convierte en un recurso valioso para cualquier persona interesada en aprender a programar en C.

04:00:00 - 04:00:00 El instructor continúa construyendo el juego Tic-Tac-Toe en C, agregando una marca para asegurarse de que el lugar elegido esté vacío antes de realizar un movimiento y creando una función para imprimir el ganador. Luego agregan una opción de "reproducir de nuevo" usando un ciclo do while y restablecen las variables al comienzo de cada ciclo. El código se compartirá en la sección de comentarios para que los usuarios lo utilicen.

Parte 1

  • 00:00:00 El autor explica la importancia de aprender C, que es un lenguaje de nivel medio que actúa como puente entre el software de alto nivel y el hardware de bajo nivel. C se originó en la década de 1970 y se usa ampliamente para varios propósitos, incluida la escritura de compiladores, sistemas operativos y bases de datos. El YouTuber también brinda instrucciones sobre cómo configurar un IDE e instalar las extensiones y el compilador necesarios para comenzar a escribir código C. Sin embargo, el YouTuber advierte que C es un lenguaje difícil para los principiantes, pero con persistencia y esfuerzo cualquiera puede aprenderlo.

  • 00:05:00 El video explica cómo instalar gcc en un sistema Mac o Linux y cómo agregar la ruta al compilador gcc debajo de las variables de entorno. Una vez instalado gcc, el video procede a explicar cómo configurar la tarea de compilación predeterminada para que VS Code sepa cómo compilar el programa. El video recomienda aumentar el tamaño de la fuente y habilitar el autoguardado para ahorrar dolores de cabeza más adelante. El video también repasa los conceptos básicos de la programación en C e incluye funciones importantes como hashtag include, std para entrada/salida estándar de io e print f paréntesis. Finalmente, el video enfatiza la necesidad de agregar la instrucción return 0 al final de la función principal para verificar si hay errores.

  • 00:10:00 En esta sección del tutorial de programación en C, el instructor muestra cómo usar instrucciones printf para imprimir texto y cómo agregar un nuevo carácter de línea usando una secuencia de escape. También demuestra cómo compilar y ejecutar un archivo C mediante el símbolo del sistema y explica el propósito de los comentarios en la programación C. El video cubre los conceptos básicos de la programación en C y brinda consejos útiles para principiantes.

  • 00:15:00 En esta sección del video tutorial sobre programación en C, el instructor explica cómo usar comentarios y secuencias de escape en su código. Los comentarios se utilizan para explicaciones, descripciones o notas para cualquier persona que lea el código. Los comentarios de una sola línea se realizan con dos barras inclinadas, mientras que los comentarios de varias líneas se realizan con una barra inclinada seguida de un asterisco y terminan con un asterisco seguido de una barra inclinada. Las secuencias de escape, por otro lado, son combinaciones de caracteres que especifican acciones dentro de una línea de texto o una cadena. Las secuencias de escape más utilizadas son para crear nuevas líneas y tabulaciones dentro de cadenas de texto. El instructor también demuestra cómo mostrar comillas, comillas simples y barras invertidas mediante secuencias de escape.

  • 00:20:00 el video explica cómo crear variables en programación C. Primero, debe declarar una variable y asignar un nombre y tipo de datos a esta variable. A continuación, debe inicializar esta variable estableciéndola igual a algún valor. El video brinda ejemplos de diferentes tipos de datos, incluidos números enteros, puntos flotantes, caracteres y matrices. El video también explica cómo mostrar el valor almacenado dentro de una variable usando una instrucción printf y un especificador de formato.

  • 00:25:00 En esta sección del video, el instructor explica cómo usar especificadores de formato para mostrar diferentes tipos de datos en programación C. Por ejemplo, para mostrar una matriz de caracteres, use el signo de porcentaje seguido de 's' para la cadena. Para mostrar una variable de carácter, use el porcentaje c, y para mostrar un número de punto flotante, use el porcentaje f. El instructor también analiza tipos de datos como caracteres, flotantes, enteros y dobles, con dobles que tienen 64 bits de precisión y retienen más dígitos significativos que flotantes. También se introducen booleanos, almacenando verdadero o falso y usando un byte de memoria. Los diferentes especificadores de formato y las formas de personalizarlos se discutirán en el próximo video.

  • 00:30:00 Aprendemos que los valores booleanos se pueden mostrar usando el porcentaje d con uno que se refiere a verdadero y cero a falso. Los caracteres pueden almacenar números enteros dentro del rango de 128 negativo a 127 positivo, y sus representaciones se muestran usando especificadores de formato de porcentaje d o porcentaje c. Las variables sin signo duplican nuestro rango de números positivos tanto para caracteres como para shorts, por lo que char puede almacenar números entre 0 y 255, mientras que shorts puede almacenar dígitos desde 32 768 negativos hasta 32 767 positivos si están firmados, y de 0 a 65 535 si no están firmados. Aprendemos que puede usar short en lugar de short int como abreviatura. Los enteros pueden almacenar números enteros que pueden ser valores positivos o negativos.

  • 00:35:00 Es importante tener en cuenta que existen diferentes especificadores de formato para diferentes tipos de datos y usar uno incorrecto puede generar errores o resultados inesperados. Si bien hay muchos tipos de datos disponibles en la programación C, en este curso nos centraremos principalmente en caracteres, matrices de caracteres, dobles, booleanos y enteros.

  • 00:40:00 El instructor explica los especificadores de formato, que definen y dan formato a los tipos de datos que se mostrarán de una manera específica. Para establecer un ancho de campo mínimo para mostrar la salida, se agrega un número después del signo de porcentaje para asignar espacios específicos. El uso de un signo negativo después del signo de porcentaje a la izquierda alinea los datos. El video también cubre las constantes, que son valores fijos que el programa no puede alterar durante su ejecución. Para convertir una variable en una constante, el tipo de datos está precedido por la palabra clave 'const' y se sigue la convención de mayúsculas para nombrar la constante. También se cubren operadores aritméticos como suma, resta, multiplicación y división, donde la división con números enteros puede truncar partes decimales, lo que requiere el uso de float o double para almacenar el resultado, y el operador de módulo se usa para obtener el resto de cualquier división.

  • 00:45:00 El instructor explica los operadores aritméticos en la programación C, incluido el módulo, que se puede usar para determinar rápidamente si un número es par o impar al encontrar el resto cuando se divide por 2. El video también cubre los operadores de incremento y decremento, que se puede usar para aumentar o disminuir una variable en 1, y operadores de asignación aumentada, que permiten a los usuarios realizar una operación aritmética en una variable y asignar el resultado a la misma variable mediante un atajo. Finalmente, el instructor brinda una descripción general de cómo aceptar la entrada del usuario con la función scanf y las indicaciones en la programación C.

  • 00:50:00 El instructor explica cómo aceptar entradas de usuario en la programación C utilizando la función scanf con el especificador de formato adecuado para el tipo de variable que se utiliza. La sección cubre la aceptación de enteros y cadenas, con la advertencia de que aceptar cadenas con espacios requiere la función fgets en lugar de scanf debido a los espacios en blanco. El instructor también explica cómo formatear la cadena después de usar fgets para deshacerse de los caracteres de nueva línea. La sección finaliza con una descripción general del formato de declaración printf para mejorar la legibilidad.

  • 00:55:00 En esta sección del video, el instructor analiza funciones matemáticas útiles en C al incluir el archivo de encabezado matemático. Las funciones de raíz cuadrada, potencia, redondeo (usando techo y piso), valor absoluto, logaritmos y trigonometría se explican con ejemplos de cómo usarlas en el código. Más tarde, el instructor demuestra cómo escribir un programa que calcule la circunferencia de un círculo en función de la entrada del usuario para el radio, y va más allá para calcular y mostrar el área del círculo usando la fórmula pi por el radio al cuadrado.

Parte 2

  • 01:00:00 En esta sección del video, el instructor demuestra cómo calcular la circunferencia y el área de un círculo utilizando el lenguaje de programación C y cómo encontrar la hipotenusa de un triángulo rectángulo, lo que requiere el uso de la función de raíz cuadrada del archivo de encabezado math.h. El instructor también presenta declaraciones if y cómo se usan para agregar opciones a un programa al verificar las condiciones y ejecutar el código en consecuencia. Demuestra cómo usar la condición mayor o igual que y el operador de comparación de signos dobles iguales, así como también cómo usar declaraciones else para proporcionar una salida diferente cuando una condición es falsa.

  • 01:05:00 el video analiza las sentencias if y las sentencias if en programación C. Estas declaraciones permiten que el programa verifique si una condición es verdadera y ejecutar un subconjunto específico de código si lo es, y si no, el programa bajará al siguiente bloque para verificar otra condición. Si todas las condiciones se evalúan como falsas, entonces el programa ejecutará el código que está dentro del bloque else. Además, el video presenta el uso de una instrucción switch como una alternativa más eficiente al uso de varias declaraciones else if. La instrucción switch permite probar la igualdad de un valor frente a muchos casos utilizando la palabra clave case. Finalmente, el video enfatiza la importancia de agregar una declaración de interrupción después de cada caso en una declaración de cambio para salir del interruptor una vez que se haya encontrado un caso coincidente.

  • 01:10:00 En esta sección del video, el instructor enseña cómo crear un programa que convierta la temperatura de Celsius a Fahrenheit o viceversa. El programa acepta la entrada del usuario para la unidad de medida (Celsius o Fahrenheit) y la temperatura actual, y luego usa declaraciones if/else y las fórmulas apropiadas para realizar la conversión. El instructor también demuestra cómo usar la función to_upper para manejar la distinción entre mayúsculas y minúsculas y cómo usar scanf para aceptar números de punto flotante. El programa le pide al usuario que ingrese y muestra la temperatura convertida.

  • 01:15:00 En esta sección del curso, el instructor demuestra cómo crear un programa en C que convierte unidades de temperatura (Celsius a Fahrenheit y viceversa) según la entrada del usuario. El programa solicita al usuario que ingrese la temperatura y la unidad de medida, acepta la entrada usando scanf y luego usa una serie de declaraciones condicionales para convertir las unidades de temperatura según sea necesario. El instructor explica el uso de especificadores de formato, la fórmula de conversión de Celsius a Fahrenheit y la instrucción switch para manejar diferentes tipos de operaciones en el flujo del programa. El programa final se publica en la sección de comentarios para su descarga y revisión.

  • 01:20:00 En esta sección del video, el instructor demuestra cómo crear un programa de calculadora simple en C que puede realizar sumas, restas, multiplicaciones y divisiones. El programa utiliza una declaración de cambio para determinar qué operación realizar en función de la entrada del usuario. Además, se explica el uso de operadores lógicos, específicamente el operador "y", que verifica si un conjunto de condiciones es verdadera. El instructor brinda ejemplos de cómo usar operadores lógicos para verificar si una temperatura cae dentro de un cierto rango y cómo incluir variables booleanas en las verificaciones de condición.

  • 01:25:00 Se discute el operador lógico o y el operador no lógico. El operador lógico or comprueba si al menos una condición es verdadera, mientras que el operador no lógico invierte el estado de una condición. El operador o se puede usar para verificar múltiples condiciones agregando más barras verticales. Por otro lado, el operador not puede ofrecer más opciones para la forma en que se escribe un programa. Estos operadores lógicos pueden ayudar a crear condiciones más complejas y mejorar la eficiencia de un programa.

  • 01:30:00 El instructor enseña sobre el uso de funciones en programación C para evitar repetir el mismo código. Al crear una nueva función, el código se puede escribir una vez y luego reutilizar varias veces simplemente llamando a la función. Luego, el instructor pasa a discutir argumentos y parámetros, con un ejemplo de pasar matrices de caracteres y números enteros como argumentos a una función. Los parámetros deben declararse en la declaración de la función para que la función reconozca las variables que se le pasan. Sin un conjunto coincidente de parámetros, no se puede llamar a la función.

  • 01:35:00 En esta sección de la transcripción, el orador explica el concepto de declaración de devolución y cómo puede devolver un valor a la función de llamada. Demuestran un ejemplo de una función llamada "cuadrado" que aceptará un argumento, elevará al cuadrado ese argumento y luego devolverá el resultado a la función de llamada. También analizan la sintaxis del operador trinario, un atajo para usar una declaración if-else al asignar o devolver un valor, y muestran un ejemplo de cómo se puede usar para encontrar el máximo de dos números enteros. El orador también enfatiza la importancia de hacer coincidir el tipo de datos cuando se usa la palabra clave return dentro de la declaración de la función.

  • 01:40:00 Aprendemos sobre el operador ternario, que sirve como atajo para usar una instrucción if-else al asignar o devolver un valor. El operador consta de una condición, seguida de un signo de interrogación, un valor para devolver si la condición es verdadera, dos puntos y el valor para devolver si la condición es falsa. También analizamos los prototipos de funciones, que garantizan que las llamadas a una función se realicen con el número y tipo de argumentos correctos. Al agregar un prototipo de función antes de la función principal, podemos evitar un comportamiento inesperado y recibir errores si se usan argumentos incorrectos.

  • 01:45:00 En esta sección del video, el instructor explica los prototipos de funciones en C y sus ventajas, además de presentar algunas funciones de cadena útiles que ya están escritas en C, como longitud de cadena, comparación de cadena, reducción de cadena, cadena cat superior y cadena. El instructor da ejemplos de cómo funciona cada una de estas funciones y demuestra sus resultados. La función de comparación de cadenas devuelve cero si las dos cadenas que se comparan son iguales y otros números si no lo son. El instructor finaliza la sección incluyendo un fragmento de código que utiliza estas funciones de cadena.

  • 01:50:00 El instructor cubre bucles, que repiten una sección de código un número limitado de veces. Brinda un ejemplo de contar del 1 al 10 usando un bucle for y explica las tres declaraciones requeridas para un bucle for: declarar un índice, definir una condición sobre cuánto tiempo repetir el código y una forma de incrementar o disminuir el índice. También demuestra diferentes formas de incrementar y decrementar el índice. Luego, el instructor pasa a explicar los bucles while, que repiten una sección de código posiblemente un número ilimitado de veces siempre que se cumpla cierta condición, y da un ejemplo de solicitar a los usuarios su nombre hasta que el usuario ingrese una respuesta válida.

  • 01:55:00 En esta sección del video, el instructor demuestra cómo usar fgets en lugar de scanf para la entrada del usuario en la programación C. Luego usan un bucle while para pedirle al usuario que ingrese su nombre y le gritan si no lo ingresaron correctamente. Luego, el instructor pasa a discutir el ciclo do-while y proporciona una demostración de un programa que le pide al usuario que ingrese tantos números como desee, siempre que sean mayores que cero, y calcula la suma de esos números.

parte 3

  • 02:00:00 En esta sección del curso completo de programación en C, el instructor explica la diferencia entre un ciclo while y un ciclo do-while en C. Un ciclo while primero verifica la condición y luego ejecuta el código si la condición es verdadero, un bucle do-while ejecuta el código una vez y luego verifica la condición para ver si es verdadera antes de continuar. El instructor demuestra esto con un código de ejemplo y explica cómo modificar un ciclo while en un ciclo do-while. La sección también cubre bucles anidados, que es un bucle dentro de otro bucle, y demuestra un ejemplo del uso de bucles anidados para imprimir un rectángulo de símbolos en función de los valores de entrada del usuario para filas, columnas y símbolos.

  • 02:05:00 En esta sección del video, el instructor demuestra cómo crear formas rectangulares usando bucles anidados en C. Le permite al usuario ingresar un símbolo y el número de filas y columnas para el rectángulo, pero también muestra cómo para borrar el búfer de entrada para permitir la entrada adecuada del usuario. El instructor también explica la diferencia entre las instrucciones continue y break dentro del contexto de los bucles de C, donde continue omitirá el resto de una sección de código y forzará la siguiente iteración de un bucle, mientras que break saldrá de un bucle por completo. Finalmente, el instructor define el concepto de matrices como una estructura de datos que puede almacenar muchos valores del mismo tipo de datos y muestra cómo convertir una variable en una matriz.

  • 02:10:00 El video cubre el concepto de matrices en el lenguaje de programación C. Las matrices son una forma de almacenar múltiples valores del mismo tipo de datos en una estructura de datos de tamaño fijo. El video demuestra cómo inicializar una matriz y acceder a elementos específicos utilizando números de índice. Hay varias formas de inicializar una matriz, como asignar valores inmediatamente o asignar valores más adelante en el programa. El video también explica cómo recorrer e imprimir todos los elementos de una matriz usando un bucle for.

  • 02:15:00 El video cubre cómo recorrer y mostrar los elementos de una matriz en programación C. El instructor demuestra el uso de un ciclo for y una instrucción printf, con el índice del ciclo for que se usa para acceder a los elementos de la matriz. También muestran cómo calcular la cantidad de veces que el ciclo debe iterar utilizando el tamaño del operador, que se actualizará automáticamente si se agregan o eliminan elementos de la matriz. Luego, el instructor pasa a crear una matriz bidimensional, que es una matriz en la que cada elemento es en sí mismo una matriz. Demuestran cómo inicializar y organizar una matriz bidimensional, utilizando el ejemplo de una cuadrícula o tabla de datos simple.

  • 02:20:00 El instructor repasa cómo declarar y asignar valores a una matriz bidimensional en programación C. También explican cómo mostrar los elementos de una matriz bidimensional mediante bucles anidados y el especificador de formato "d". Luego, el instructor muestra cómo calcular el número de filas y columnas de una matriz bidimensional usando el tamaño del operador y el tamaño de una de las filas, y usando el tamaño de uno de los elementos que se encuentran dentro de la primera fila. La sección concluye con un ejemplo de cómo probar el código con una nueva fila agregada a la matriz 2D.

  • 02:25:00 En esta sección del video, el instructor explica cómo crear una matriz bidimensional en C, que es una matriz de matrices donde cada elemento es una matriz completa. Se utilizan dos índices para acceder a uno de los elementos: uno para la fila y otro para la columna. El instructor también muestra cómo crear una matriz de cadenas, que es una matriz 2D de caracteres individuales, excepto que cada elemento es una cadena. Para mostrar una matriz de cadenas, se puede usar un bucle for. Finalmente, el instructor explica cómo se pueden intercambiar variables en C introduciendo una tercera variable como almacenamiento temporal para el valor. El intercambio de variables es importante en la clasificación de algoritmos, que se tratará en el próximo tema.

  • 02:30:00 El instructor enseña cómo intercambiar los valores de dos variables en C, tanto para matrices enteras como de caracteres. Usando variables temporales y la función de copia de cadenas, el instructor muestra cómo intercambiar valores y evitar comportamientos inesperados con matrices de caracteres si la longitud del segundo argumento es menor que la del primero. El instructor también sugiere imaginar las variables como vasos que contienen líquido para comprender mejor el intercambio de valores y proporciona un código de muestra en la sección de comentarios. A continuación, el instructor explica cómo escribir un programa para clasificar elementos dentro de una matriz, primero con una matriz de enteros y luego con una matriz de caracteres. El instructor declara una función separada para ordenar y usa bucles for anidados para iterar a través de la matriz y comparar valores para ordenar.

  • 02:35:00 El disertante discute cómo ordenar los elementos de una matriz en C usando el algoritmo de clasificación de burbujas. Explican el uso de variables temporales y declaraciones if, y cómo el tamaño del número que se ordena afecta su posición final en la matriz. El orador también demuestra cómo ordenar una matriz de caracteres cambiando el tipo de datos y la función de impresión. Luego introducen el concepto de estructuras como una forma de organizar miembros relacionados en un bloque de memoria, con la capacidad de imitar objetos del mundo real. Una estructura se define mediante la palabra clave struct seguida de un nombre de etiqueta y un conjunto de llaves para representar a sus miembros.

  • 02:40:00 En esta sección del video, el instructor enseña sobre estructuras y typedef en el lenguaje de programación C. Las estructuras permiten a un programador agrupar valores relacionados bajo un nombre en un bloque de memoria, y estos pueden usarse para asignar valores a miembros con diferentes tipos de datos. La palabra clave typedef le da un apodo a un tipo de datos existente, lo que facilita el uso del tipo de datos en el código. El instructor también muestra un ejemplo de cómo crear una estructura con tres miembros y asignarles valores. El video proporciona un código de muestra para los usuarios que deseen usarlo.

  • 02:45:00 La estructura se crea fuera de la función principal y se le asigna un nombre de etiqueta, "estudiante", y contiene una matriz de caracteres para el nombre y una variable flotante para el GPA. Se inicializa una matriz de cuatro estudiantes y luego se coloca dentro de una matriz llamada "estudiantes". Usando un bucle for, el programa recorre la matriz e imprime el nombre y el GPA de cada estudiante usando el operador de acceso de miembro de punto. Finalmente, el video explica que si usamos la palabra clave "typedef" con una estructura, ya no necesitamos usar la palabra clave struct para crear la estructura y, en su lugar, podemos usar el apodo que le asignamos.

  • 02:50:00 El instructor enseña sobre la creación de matrices de estructuras en C, donde cada elemento de la matriz es una estructura que contiene datos para cada estudiante, como el nombre y el GPA. El instructor también repasa el uso de enumeraciones, que son tipos definidos por el usuario de identificadores de enteros con nombre que pueden hacer que un programa sea más legible al reemplazar los valores enteros con nombres asociados, lo que hace que el código sea más fácil de entender para el programador y cualquier persona que revise el código. Se describe la estructura de las enumeraciones y el instructor demuestra cómo usar las enumeraciones en declaraciones if-else para imprimir resultados diferentes según el valor de una variable de enumeración.

  • 02:55:00 En esta sección del video, el instructor demuestra cómo generar números aleatorios en programación C. La hora actual se usa para generar una semilla para la función rand, que genera un número aleatorio entre 0 y 32767. Para obtener un número aleatorio dentro de un rango dado, se puede usar el operador de módulo. El instructor brinda un ejemplo de cómo generar un número aleatorio entre 1 y 6 (para lanzar un dado) y para lanzar tres dados. También se introduce un juego de adivinanzas utilizando el conocimiento de generar números aleatorios. Se establecen constantes para el rango mínimo y máximo y se solicita al usuario que adivine el número. El programa usa la función rand para generar un número aleatorio entre el rango dado, y el usuario recibe retroalimentación para ajustar su conjetura hasta que se ingresa el número correcto.

parte 4

  • 03:00:00 El instructor enseña cómo crear un juego de adivinanzas de números en C, donde el programa genera un número aleatorio entre dos valores específicos, pide al usuario que adivine el número y proporciona comentarios si la suposición es demasiado alta o demasiado baja. , o correcto. El programa utiliza un bucle do-while para garantizar que se realice al menos una suposición y cuenta el número de suposiciones realizadas por el usuario. El instructor también agrega algunas decoraciones de texto para que el resultado sea más atractivo visualmente. Este ejemplo demuestra el uso de condicionales, bucles, entrada de usuario y generación de números aleatorios en C.

  • 03:05:00 El instructor muestra cómo crear un juego de preguntas en C. El juego usa una matriz de caracteres bidimensionales para almacenar las preguntas y una matriz de caracteres bidimensionales separada para almacenar las opciones. Las respuestas correctas se almacenan en una matriz de caracteres unidimensional. El juego calcula la cantidad de preguntas que tiene y usa un ciclo for para recorrerlas una por una, mostrándolas junto con sus posibles opciones. Para hacer esto, el instructor usa un bucle for anidado que comienza con cada cuarta cadena dentro de la matriz de opciones. Este bucle for se repite cuatro veces, mostrando las cuatro opciones posibles para cada pregunta.

  • 03:10:00 El instructor explica cómo crear un juego de preguntas simple en C que le haga preguntas al usuario y verifique sus respuestas. El código usa un bucle for anidado para mostrar las preguntas y opciones, acepta la entrada del usuario usando scanf y convierte los caracteres en minúsculas a mayúsculas usando la función "toupper". Luego, el programa verifica si la suposición del usuario coincide con la respuesta correcta e incrementa la puntuación en consecuencia. Una vez respondidas todas las preguntas, el programa muestra la puntuación final. El instructor también explica brevemente los operadores bit a bit y demuestra cómo usar cinco operadores bit a bit diferentes en C.

  • 03:15:00 Aprendemos sobre operaciones bit a bit en programación C. Empezamos con el operador AND, que, cuando se aplica a dos números binarios, asigna un uno a nuestro resultado solo si ambos bits correspondientes son uno. Luego pasamos al operador OR, que asigna un uno a nuestro resultado si alguno de los bits correspondientes es uno. El operador OR exclusivo asigna un uno al resultado si solo un bit correspondiente es uno. También aprendemos sobre los operadores de desplazamiento a la izquierda y a la derecha que desplazan bits en un número binario hacia la izquierda o hacia la derecha. Desplazar los bits a la izquierda efectivamente duplica el número, mientras que desplazarlos a la derecha tiene el efecto contrario.

  • 03:20:00 El video explica la memoria en la programación C, que es una matriz de bytes dentro de la RAM, donde cada unidad es un bloque de memoria que puede contener un valor. Una dirección de memoria apunta a la ubicación de un bloque de memoria dentro de la RAM, y es como una dirección de calle. Al declarar una variable, aparta algunos bloques de memoria para contener un valor que está asociado con una dirección de memoria. Cada variable usa un bloque de memoria de un byte, y el video muestra las direcciones de memoria y los tamaños de varios caracteres como ejemplos. El video también explica brevemente los valores hexadecimales, que usan números del 0 al 9 y letras de la a a la f para crear 16 valores posibles para cada dígito. Finalmente, el video cubre los tipos de datos cortos, que usan dos bytes de memoria.

  • 03:25:00 El instructor explica los conceptos básicos de la memoria en la programación C, incluido cómo las variables utilizan los bloques de memoria y cómo las matrices utilizan varios bloques de memoria en función de su tamaño y tipo de datos. También presenta el concepto de punteros, que contienen una dirección de memoria como valor para otra variable, y explica cómo se pueden usar para realizar ciertas tareas más fácilmente. El instructor demuestra cómo mostrar el valor y la dirección de una variable y cómo crear un puntero del mismo tipo de datos que la variable a la que apunta.

  • 03:30:00 Aprendemos sobre punteros en programación C. Los punteros se declaran usando un asterisco como operador indirecto y una convención de nomenclatura común es usar una "p" minúscula seguida del nombre de la variable con la primera letra en mayúscula. El valor de un puntero es una dirección, y podemos acceder al valor almacenado en esa dirección usando el operador de direccionamiento indirecto. Es importante asegurarse de que los tipos de datos del puntero y la variable a la que apunta sean coherentes. Los punteros también se pueden pasar como argumentos a las funciones, lo que permite que la función acceda y modifique el valor almacenado en la variable a la que apunta. Además, los punteros se pueden declarar e inicializar en dos pasos, pero asignar un valor de inmediato es una buena práctica.

  • 03:35:00 El instructor explica los punteros de la programación en C. Un puntero es una variable que contiene una dirección de memoria para otra variable, matriz y más. Para declarar un puntero, utiliza el operador de direccionamiento indirecto. Para asignar un valor a un puntero, utiliza el mismo operador. El instructor muestra cómo escribir en un archivo en C usando punteros, fopen, fwrite y fclose. Para escribir en un archivo, debe crear un puntero a un archivo y usar `fprintf` para escribir en el archivo. El instructor también demuestra E/S de archivos eliminando un archivo y escribiendo en un archivo en una ubicación específica en el directorio de una computadora.

  • 03:40:00 El instructor muestra cómo leer el contenido de un archivo en programación C creando un puntero con el tipo de datos "archivo" y usando la función fopen para abrir el archivo. El instructor demuestra cómo usar un búfer para contener una matriz de caracteres para contener una línea del documento de texto a la vez y cómo leer una sola línea del archivo usando la función fgets. La sección también incluye cómo mostrar todas las líneas de un archivo usando un ciclo while y cómo agregar la detección de archivos para verificar si el archivo existe antes de intentar leerlo.

  • 03:45:00 En esta sección del video, el instructor repasa los prototipos de funciones que se utilizarán en el programa, incluidas las funciones para restablecer el tablero, imprimir el tablero, verificar los espacios libres, mover el jugador, mover la computadora, verificar el ganador y ganador de la impresión. Después de declarar estas funciones, el instructor analiza algunas variables globales que se utilizarán, incluida una matriz 2D de caracteres denominada tablero, así como constantes para los caracteres del jugador y de la computadora. La función principal se analiza a continuación, donde declara una variable local para el ganador, la establece en un espacio vacío, reinicia el tablero y la imprime. El video también incluye detalles sobre los bucles for anidados que se usan en la función de reinicio de la placa y una instrucción printf que se usa en la placa de impresión.

  • 03:50:00 En esta sección del curso completo de programación en C, el instructor explica cómo crear un bucle while en la función principal que rodeará la función de la placa de impresión. La condición del bucle while es que si el ganador es un espacio vacío y el valor devuelto al invocar la función de verificación de espacios libres no es igual a cero, el bucle continuará. La función de comprobación de espacios libres también se crea utilizando dos bucles for anidados para recorrer la matriz 2D de caracteres y disminuir la variable local de espacios libres si hay algún lugar ocupado. Se explica la función de movimiento del jugador que solicita al usuario que ingrese números de fila y columna para realizar un movimiento, y verifica si el lugar está ocupado o no. La función de verificación del ganador también se crea para verificar cada fila en busca de una condición ganadora y para verificar cada columna en busca de una condición ganadora.

  • 03:55:00 El instructor repasa el código para verificar las filas, columnas y diagonales en busca de un ganador en un juego de Tic Tac Toe. Explican el uso de bucles for y declaraciones if para iterar a través de los elementos en el tablero de juego y buscar coincidencias. Si hay un ganador, la función devuelve el valor del carácter del elemento ganador. Si no, se devuelve un carácter vacío. Luego, el instructor proporciona el código para el movimiento de la computadora, lo que implica generar coordenadas aleatorias para colocar su símbolo en el tablero. Antes de generar números aleatorios, el programa verifica si hay espacios disponibles en el tablero.

  • 04:00:00 El instructor continúa construyendo el juego Tic Tac Toe en C. Agrega una verificación para asegurarse de que el lugar generado sea un espacio vacío antes de realizar un movimiento. Si no hay más espacios disponibles, se invoca la función "imprimir ganador" con un espacio vacío, lo que significa que el juego es un empate. Explican que esta función es bastante fácil ya que imprime "Tú ganas" si el ganador es el jugador, "Tú pierdes" si el ganador es la computadora y "Es un empate" si no hay ganador. El instructor implementa una opción de "reproducir de nuevo" mediante un ciclo do while y restablece las variables ganador y de respuesta al comienzo de cada ciclo. El juego se ejecuta y prueba varias veces, y el instructor explica cada paso. Finalmente, mencionan que el código se publicará en la sección de comentarios para que los usuarios lo utilicen.
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...
 

Conceptos fundamentales de la programación orientada a objetos


Conceptos fundamentales de la programación orientada a objetos

Los cuatro conceptos fundamentales de la programación orientada a objetos son abstracción, encapsulación, herencia y polimorfismo. Antes de profundizar en sus significados, es importante entender qué es un objeto. Un objeto representa algo del mundo real, que puede ser físico, como un automóvil o un libro, o no físico, como una cita con el dentista o una cuenta bancaria.

En el contexto de la programación orientada a objetos, un objeto se refiere a cualquier cosa de interés para la aplicación de software que se está desarrollando, donde los datos deben almacenarse y procesarse. Los objetos también se conocen como entidades.

La abstracción es el primer concepto fundamental, que implica simplificar la realidad centrándose solo en los datos relevantes y las tareas relacionadas con un objeto. Al diseñar una aplicación para procesar datos sobre una persona, por ejemplo, solo se consideran los datos y las operaciones necesarias.

Para crear objetos mediante programación, se requiere una clase. Una clase sirve como plantilla para crear objetos y la escribe un programador para definir los atributos (también conocidos como campos o propiedades) y las operaciones (también conocidas como comportamientos o métodos) de un objeto. Los atributos describen los datos del objeto, mientras que las operaciones representan las acciones que puede realizar el objeto.

La encapsulación es el segundo concepto fundamental e implica ocultar la complejidad del funcionamiento interno de un objeto de otros programas y programadores. A menudo se denomina ocultación de información porque los datos y las funciones dentro de un objeto están unidos y protegidos de interferencias externas. Los programadores experimentados suelen crear clases que utilizan los programadores principiantes, y las bibliotecas de clases compiladas protegen la propiedad intelectual.

La herencia es el tercer concepto fundamental, que permite que una clase derive sus métodos y propiedades de otra clase. Esto lleva a una jerarquía de clases, donde las subclases heredan de una superclase. Por ejemplo, una clase de empleado hereda de una clase de persona y una clase de cliente también hereda de la clase de persona. Esto crea un tipo de relación, con subclases que amplían las propiedades y métodos de su superclase.

El polimorfismo, el último concepto fundamental, permite que una clase implemente métodos heredados a su manera. Diferentes subclases de la misma superclase pueden tener diferentes implementaciones para los métodos heredados. El polimorfismo permite que diferentes formas de objetos con la misma interfaz se comporten de manera diferente, según la implementación de su subclase específica.

En resumen, la abstracción simplifica la realidad, la encapsulación oculta la complejidad, la herencia establece jerarquías de clases y el polimorfismo permite diversas implementaciones de métodos heredados. Estos conceptos fundamentales forman la base de la programación orientada a objetos.

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 ...
 

Curso de Programación Orientada a Objetos (POO) en C++


Curso de Programación Orientada a Objetos (POO) en C++

Este video proporciona una descripción general de la programación orientada a objetos (POO) en C++. Explica los conceptos fundamentales de OOP, como clases, objetos y métodos. El instructor demuestra la creación de una clase de C++ y sus miembros, enfatizando la importancia de declarar variables como tipos de datos definidos por el usuario. Los modificadores de acceso como privado, público y protegido se explican en relación con el acceso a miembros de objetos.

El video también cubre la implementación de los principios de programación orientada a objetos, incluida la encapsulación, la abstracción, la herencia y el polimorfismo. Muestra ejemplos de cómo se aplican estos principios en el código, como la creación de constructores y clases abstractas. El instructor destaca los beneficios de OOP, como simplificar el desarrollo de software y ocultar la complejidad de los usuarios.

Además, el video explora el concepto de herencia, donde una clase derivada hereda propiedades de una clase base. El instructor demuestra el proceso de creación de clases derivadas y explica cómo pueden tener sus propias propiedades únicas además de las heredadas.

El video concluye con discusiones sobre funciones virtuales y polimorfismo. Explica cómo el polimorfismo permite que los objetos y métodos tengan múltiples formas, lo que permite usar una referencia de clase principal con objetos de clase secundaria. Se introduce el concepto de funciones virtuales, enfatizando que la versión más derivada de una función se ejecuta cuando se la invoca.

En general, este video tiene como objetivo proporcionar una comprensión integral de la programación orientada a objetos en C ++, cubriendo conceptos esenciales, principios e implementaciones prácticas. La instructora alienta a los espectadores a seguir su canal, Code Beauty, y agradece los comentarios sobre los videos.

  • 00:00:00 Este video explica los conceptos básicos de la programación orientada a objetos y cómo funciona en la práctica. Las clases son un concepto clave en la programación orientada a objetos, y las variables deben declararse como tipos de datos definidos por el usuario para poder usarlas.

  • 00:05:00 En este video, se crea una clase de C++ y se agregan miembros. La clase tiene tres atributos, nombre, empresa y edad. Se crea una instancia de la clase y se le asigna el número de variable.

  • 00:10:00 En este video, el instructor explica cómo acceder a los miembros de un objeto en C++. Los modificadores de acceso, como privado, público y protegido, determinan cómo se puede acceder a los miembros de un objeto. Un método de clase se puede utilizar para describir el comportamiento de un objeto.

  • 00:15:00 Este video explica cómo funciona la programación orientada a objetos (POO) en C++. Se crea una función con el tipo de valor devuelto void y se llama a la función con la misma sintaxis que la función que se introdujo. A continuación, la función se invoca cinco veces, cada vez con un nombre de empleado y una empresa diferentes. A continuación, los nombres de los empleados y los valores de la empresa se copian en un nuevo objeto de empleado y los atributos del objeto de empleado se establecen en los valores de los valores recién copiados.

  • 00:20:00 En este video, el instructor explica las tres reglas para crear constructores en C++. La primera regla es que un constructor tiene el mismo nombre que la clase a la que pertenece, la segunda es que un constructor debe ser público y la tercera es que un constructor debe ser accesible. Al crear un constructor, es importante tener en cuenta las reglas descritas en este video. Si un constructor no sigue una de estas reglas, se generará un error.

  • 00:25:00 En este video, el instructor explica los conceptos básicos de la programación orientada a objetos, incluidos los conceptos de clases, objetos y métodos. Luego pasa a describir cuatro principios clave de la programación orientada a objetos: encapsulación, abstracción, herencia y polimorfismo. Finalmente, explica cómo implementar estos conceptos en un ejemplo de código.

  • 00:30:00 Este video presenta la programación orientada a objetos (POO) en C++. Una clase es una estructura que encapsula datos y métodos públicos que otras clases pueden invocar para acceder y modificar los datos. Para proporcionar encapsulación, los campos de clase son privados y los captadores y definidores son públicos.

  • 00:35:00 En este video, un instructor de un curso de C++ analiza los principios de la programación orientada a objetos (POO). El instructor analiza cómo la encapsulación y la abstracción ayudan a ocultar datos complejos detrás de una interfaz simplificada. El instructor también explica cómo se pueden aplicar las reglas de validación a los métodos de establecimiento de propiedades privadas.

  • 00:40:00 En este video, el presentador explica cómo la programación orientada a objetos (POO) puede simplificar el desarrollo de software ocultando la complejidad a los usuarios. Usan un ejemplo de un teléfono inteligente para ilustrar cómo OOP puede hacer que un proceso complejo parezca simple. Luego demuestran cómo crear un contrato que hace que un lado de un sistema parezca simple mientras oculta la complejidad del sistema del usuario.

  • 00:45:00 Este video explica el concepto de programación orientada a objetos (POO) en C++. El video explica cómo crear una clase abstracta que requiere implementación para una función virtual y cómo probar la función para ver si un empleado en particular puede obtener una promoción.

  • 00:50:00 En este video, el autor es promovido y luego, si esa persona es menor de 30 años, esa persona no será promovida. Esto nos permite implementar un contrato que en realidad es una clase abstracta y esa clase abstracta o ese contrato tiene solo una regla y esa regla es esta función virtual pura aquí que se llama pedir promoción. Entonces, cualquier clase que firme este contrato, cualquier clase que herede de este empleado abstracto, que es esta clase aquí, tendrá que proporcionar la implementación de este método aquí. Lo probamos y, como puede ver, no obtuve un ascenso y John lo hizo, así que esa es la idea de la abstracción. Y este método de solicitud de promoción es solo ese botón que mencionamos en su teléfono inteligente al comienzo de este capítulo. El tercer principio de la programación orientada a objetos del que quiero hablar se llama herencia. La idea de la herencia es la siguiente: existe esta clase base, también conocida como superclase o clase principal, y luego está la clase derivada, también conocida como clase secundaria o subclase.

  • 00:55:00 En este video, un instructor de un curso de C++ demuestra cómo funciona la programación orientada a objetos mediante la creación de una clase derivada de una clase base existente. Las propiedades de la clase base son luego heredadas por la clase derivada, que también obtiene sus propias propiedades específicas para la clase de desarrollador.

  • 01:00:00 En este video, el instructor explica cómo funciona la programación orientada a objetos en C++. Explica cómo una clase de desarrollador hereda de una clase de empleado y cómo se puede usar el constructor de la clase de empleado para inicializar ciertas propiedades de la clase de desarrollador. Luego, el instructor muestra cómo se puede crear un método en la clase de desarrollador para probar si las propiedades se han establecido correctamente. Finalmente, demuestra cómo cerrar la clase de desarrollador.

  • 01:05:00 En este video, el instructor analiza los conceptos de herencia y polimorfismo de la programación orientada a objetos (POO). Demuestra cómo usar estos conceptos para resolver un problema con un ejemplo de código. Finalmente, el instructor demuestra cómo hacer una clase que herede de otra clase.

  • 01:10:00 Este video proporciona una breve descripción general de la programación orientada a objetos (POO) en C++. El video explica cómo crear una clase de maestro que hereda de una clase de empleado e implementa una función de preparación de lección. El video también analiza algunos de los problemas que pueden surgir al crear y usar clases de programación orientada a objetos, y cómo resolverlos.

  • 01:15:00 En este video, el instructor explica el concepto de programación orientada a objetos (POO) en C++. El polimorfismo se refiere a la capacidad de un objeto o un método para tener muchas formas. Un uso común del polimorfismo en la programación es cuando se usa una referencia de clase principal para referirse a un objeto de una clase secundaria. Este ejemplo demuestra cómo funciona el polimorfismo volviendo a la función principal e invocando el nuevo método de trabajo en las clases de desarrollador y profesor, que heredan ambas de la clase de empleado.

  • 01:20:00 Este video cubre los conceptos básicos de la programación orientada a objetos en C++. La primera parte del video cubre la historia de la programación orientada a objetos y cómo se diferencia de otros paradigmas de programación. La segunda parte del video explica cómo crear un puntero a una clase base y cómo hacer que un método de trabajo sea virtual en una clase de empleado. Finalmente, el video demuestra cómo funciona el puntero y cómo funciona el programa como resultado.

  • 01:25:00 En este video, el instructor analiza el concepto de funciones virtuales y polimorfismo en C++. Explica que, cuando se invoca una función virtual, se ejecuta la versión más derivada de la función. Esto significa que, si una función no se implementa en las clases derivadas de una clase, en su lugar se invocará la clase de desarrollador de la clase. También señala que, con el polimorfismo, los diferentes tipos de empleados pueden tratarse como si fueran un objeto grande, lo que les permite ser referenciados con un puntero de clase base.

  • 01:30:00 Este video presenta la programación orientada a objetos (POO) en C++. Analiza cómo OOP hace que la programación sea más organizada y más fácil de entender. La presentadora también recomienda que los espectadores sigan su canal, codifiquen belleza y se suscriban allí. Finalmente, la presentadora alienta a los espectadores a dejar comentarios sobre sus videos.
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...
Razón de la queja: