5.1. BIC01. Introducción a la Computación (Obligatorio)
- Semestre: 1er Sem. Créditos: 4
- Horas del curso: Teoría: 2 horas; Laboratorio: 4 horas;
- Sílabo:


Español

English - Prerrequisitos: Ninguno
5.1.1. Justificación
Este es el primer curso de la secuencia de cursos introductorios a la Ciencia de la Computación. Este curso introduce a los participantes a los conceptos fundamentales de programación usando Python. Los temas incluyen tipos de datos, estructuras de control, funciones, listas, recursión, y la mecánica de ejecución, prueba y depuración. La programación es uno de los pilares de la Ciencia de la Computación; cualquier profesional en el área necesitará programar para materializar sus modelos y propuestas.
5.1.2. Objetivos Generales
- 1.
- Introducir los conceptos fundamentales de programación.
- 2.
- Desarrollar la capacidad de abstracción usando lenguaje de programación.
- 3.
- Desarrollar habilidades de resolución de problemas mediante el pensamiento algorítmico.
- 4.
- Comprender estructuras de datos básicas y sus aplicaciones.
- 5.
- Dominar el lenguaje de programación Python para la resolución de problemas.
5.1.3. Contribución a los resultados (Outcomes)
-
AG-C08) Análisis de Problemas: Identifica, formula y analiza problemas complejos de computación. (Familiarity)
-
AG-C12) Aplica la teoría de la ciencia de la computación y los fundamentos de desarrollo de software para producir soluciones basadas en computadora. (Usage)
5.1.4. Contenido
5.1.4.1. Introducción a la Programación y su Historia (4 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013, Brookshear and Brylow, 2019a]
Temas
- 1.
- Breve historia de la computación y los lenguajes de programación.
- 2.
- Visión general del lenguaje de programación Python.
- 3.
- Entornos y herramientas de programación.
- 4.
- Estructura básica y ejecución de programas.
- 5.
- Escritura, ejecución y depuración de programas simples.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Identificar tendencias importantes en la historia de la computación. [Familiarizarse]
- 2.
- Discutir el contexto histórico de los paradigmas de lenguajes de programación. [Familiarizarse]
- 3.
- Comparar la vida diaria antes y después de las computadoras personales e Internet. [Evaluar]
- 4.
- Escribir, compilar y ejecutar un programa simple en Python. [Usar]
5.1.4.2. Sistemas de Tipos I: Fundamentos (6 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013]
Temas
- 1.
- Un tipo como un conjunto de valores junto con un conjunto de operaciones:
- a)
- Tipos primitivos (por ejemplo, números, booleanos)
- b)
- Tipos compuestos construidos a partir de otros tipos (por ejemplo, registros/estructuras, uniones, arreglos, listas, funciones, referencias usando operaciones de conjuntos)
- 2.
- Seguridad de tipos y errores causados por usar valores inconsistentemente dados sus tipos pretendidos
- 3.
- Objetivos y limitaciones del tipado estático y dinámico: detectar y eliminar errores lo antes posible.
- 4.
- Tipos de datos primitivos en Python (int, float, str, bool).
- 5.
- Conversión de tipos y casting.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Describir, tanto para un tipo primitivo como para uno compuesto, los valores que tienen ese tipo [Familiarizarse]
- 2.
- Describir ejemplos de errores de programa detectados por un sistema de tipos [Familiarizarse]
- 3.
- Usar tipos y mensajes de error de tipos para escribir y depurar programas [Usar]
- 4.
- Explicar el sistema de tipado dinámico de Python. [Familiarizarse]
5.1.4.3. Programación Orientada a Objetos I: Fundamentos (14 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013, Brookshear and Brylow, 2019a]
Temas
- 1.
- Programación imperativa como subconjunto de la programación orientada a objetos.
- 2.
- Definición de clases: campos, métodos y constructores.
- 3.
- Propiedades dinámicas vs estáticas.
- 4.
- Variables, expresiones y asignaciones.
- 5.
- Operaciones de entrada y salida.
- 6.
- Sentencias condicionales (if, elif, else).
- 7.
- Estructuras de iteración (bucles for, bucles while).
- 8.
- Bucles anidados y sentencias de control de bucle.
- 9.
- Fundamentos del manejo de excepciones.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Componer una clase a través del diseño, implementación y prueba para cumplir con los requisitos de comportamiento [Usar]
- 2.
- Predecir y validar el flujo de control en un programa usando despacho dinámico [Evaluar]
- 3.
- Usar mecanismos de encapsulación orientados a objetos como interfaces y miembros privados [Usar]
- 4.
- Implementar programas usando estructuras condicionales e iterativas. [Usar]
- 5.
- Depurar programas con errores de sintaxis y lógicos. [Usar]
- 6.
- Diseñar e implementar algoritmos simples usando bucles. [Usar]
5.1.4.4. Funciones y paso de parámetros (10 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013, Hunt and Thomas, 1999]
Temas
- 1.
- Definición e invocación de funciones.
- 2.
- Mecanismos de paso de parámetros (por valor, por referencia).
- 3.
- Valores de retorno y múltiples retornos.
- 4.
- Alcance y tiempo de vida de variables (local, global, nonlocal).
- 5.
- Fundamentos de recursión.
- 6.
- Expresiones lambda y funciones de orden superior.
- 7.
- Funciones como objetos de primera clase.
- 8.
- Documentación y prueba de funciones.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Definir e implementar funciones con paso de parámetros adecuado. [Usar]
- 2.
- Explicar la diferencia entre paso por valor y paso por referencia. [Familiarizarse]
- 3.
- Implementar soluciones recursivas a problemas simples. [Usar]
- 4.
- Usar expresiones lambda para construcciones de programación funcional. [Usar]
- 5.
- Diseñar funciones con alcance y documentación apropiados. [Evaluar]
5.1.4.5. Estructuras de datos básicas (10 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013]
Temas
- 1.
- Listas y operaciones con listas (indexación, segmentación, mutabilidad).
- 2.
- Tuplas e inmutabilidad.
- 3.
- Diccionarios y mapeo clave-valor.
- 4.
- Conjuntos y operaciones con conjuntos.
- 5.
- Cadenas como secuencias.
- 6.
- Comprensión de listas y expresiones generadoras.
- 7.
- Algoritmos básicos de búsqueda y ordenamiento.
- 8.
- Introducción a la complejidad algorítmica para operaciones básicas.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Implementar programas usando listas, diccionarios y conjuntos. [Usar]
- 2.
- Elegir estructuras de datos apropiadas para problemas dados. [Evaluar]
- 3.
- Explicar las compensaciones entre diferentes estructuras de datos. [Familiarizarse]
- 4.
- Implementar operaciones básicas de búsqueda y ordenamiento en listas. [Usar]
5.1.4.6. Programación Orientada a Objetos I: Fundamentos (10 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Guttag, 2013]
Temas
- 1.
- Subclases, herencia (incluyendo herencia múltiple) y sobrescritura de métodos.
- 2.
- Despacho dinámico: definición de llamada a método.
- 3.
- Idiomas orientados a objetos para encapsulación:
- a)
- Privacidad, ocultación de datos y visibilidad de miembros de clase.
- b)
- Interfaces que revelan solo firmas de métodos.
- c)
- Clases base abstractas, rasgos (traits) y mixins.
- 4.
- Clases y objetos en Python.
- 5.
- Atributos y métodos.
- 6.
- Fundamentos de herencia y polimorfismo.
- 7.
- Encapsulamiento y ocultación de información.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Construir una jerarquía de clases simple utilizando subclases que permita reutilizar código para subclases distintas [Usar]
- 2.
- Explicar la relación entre la herencia orientada a objetos (compartición de código y sobrescritura) y el subtipado (la idea de que un subtipo sea usable en un contexto que espera el supertipo) [Familiarizarse]
- 3.
- Comparar y contrastar los beneficios y costos/impacto de usar herencia (subclases) y composición (específicamente, cómo basar la composición en funciones de orden superior) [Evaluar]
- 4.
- Diseñar e implementar clases simples en Python. [Usar]
- 5.
- Explicar los beneficios de la POO para la organización del código. [Familiarizarse]
5.1.4.7. Estrategias Algorítmicas (6 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Guttag, 2013, Cormen et al., 2009]
Temas
- 1.
- Paradigmas:
- a)
- Fuerza Bruta (por ejemplo, búsqueda lineal, ordenamiento por selección, viajante de comercio, mochila)
- b)
- Disminuir y Vencer:
- 1)
- Por una Constante (por ejemplo, ordenamiento por inserción, ordenamiento topológico)
- 2)
- Por un Factor Constante (por ejemplo, búsqueda binaria)
- 3)
- Por un Tamaño Variable (por ejemplo, Euclides)
- c)
- Dividir y Vencer (por ejemplo, búsqueda binaria, quicksort, mergesort, Strassen)
-
d)
- Voraz (por ejemplo, Dijkstra, Kruskal, Mochila)
- e)
- Transformar y Vencer:
- 1)
- Simplificación de instancia (por ejemplo, encontrar duplicados mediante preordenamiento de lista)
- 2)
- Cambio de representación (por ejemplo, heapsort)
- 3)
- Reducción de problema (por ejemplo, mínimo común múltiplo, programación lineal)
- 4)
- Programación dinámica (por ejemplo, Floyd, Marshall, Bellman-Ford)
- f )
- Compromisos espacio vs tiempo (por ejemplo, hash)
- 2.
- Iteración vs recursión (por ejemplo, factorial, búsqueda en árbol)
- 3.
- Estrategias de descomposición de problemas.
- 4.
- Técnicas de diseño de algoritmos.
- 5.
- Estrategias de depuración y prueba.
- 6.
- Seguimiento de la ejecución del programa.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Para cada uno de los paradigmas en esta unidad:
- a)
- Explicar sus características definitorias
- b)
- Explicar un ejemplo que demuestre el paradigma incluyendo cómo este ejemplo satisface las características del paradigma.
[Familiarizarse]
- 2.
- Dar ejemplos de algoritmos iterativos y recursivos que resuelvan el mismo problema, explicar los beneficios y desventajas de cada enfoque [Usar]
- 3.
- Evaluar si un enfoque voraz conduce a una solución óptima [Evaluar]
- 4.
- Aplicar técnicas sistemáticas de depuración para localizar y corregir errores. [Usar]
- 5.
- Analizar la complejidad algorítmica para problemas simples. [Familiarizarse]
5.1.4.8. Métodos Modernos de Desarrollo y Uso de Herramientas (4 horas) [Habilidades AG-C08,AG-C12]
Referencias Bibliográficas: [Zelle, 2010, Hunt and Thomas, 1999]
Temas
- 1.
- Uso de entornos de programación modernos (IDEs, notebooks).
- 2.
- Mejores prácticas de búsqueda y reutilización de código.
- 3.
- Uso de bibliotecas estándar y APIs.
- 4.
- Técnicas de depuración y prueba.
- 5.
- Fundamentos de control de versiones.
- 6.
- Documentación de código y guías de estilo.
- 7.
- Entornos virtuales y gestión de paquetes.
Aprendizaje esperado (Learning Outcomes)
- 1.
- Usar herramientas de desarrollo modernas efectivamente. [Usar]
- 2.
- Aplicar principios de reutilización de código mediante bibliotecas y APIs. [Usar]
- 3.
- Depurar y probar programas sistemáticamente. [Usar]
- 4.
- Seguir estándares de codificación y prácticas de documentación. [Familiarizarse]
- 5.
- Gestionar paquetes y entornos de Python. [Familiarizarse]