- ES Español

- EN English

5.1. 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:
- htmlonly

Español

English - Prerrequisitos: Ninguno
5.1.1. Justificación ↑ Volver arriba
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 ↑ Volver arriba
- Introducir los conceptos fundamentales de programación.
- Desarrollar la capacidad de abstracción usando lenguaje de programación.
- Desarrollar habilidades de resolución de problemas mediante el pensamiento algorítmico.
- Comprender estructuras de datos básicas y sus aplicaciones.
- Dominar el lenguaje de programación Python para la resolución de problemas.
5.1.3. Contribución a los resultados (Outcomes) ↑ Volver arriba
- 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 ↑ Volver arriba
5.1.4.1. Introducción a la Programación y su Historia (4 horas) [Habilidades AG-C08,AG-C12] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013; Brookshear and Brylow, 2019a)
Temas
- Breve historia de la computación y los lenguajes de programación.
- Visión general del lenguaje de programación Python.
- Entornos y herramientas de programación.
- Estructura básica y ejecución de programas.
- Escritura, ejecución y depuración de programas simples.
Aprendizaje esperado (Learning Outcomes)
- Identificar tendencias importantes en la historia de la computación. [Familiarizarse]
- Discutir el contexto histórico de los paradigmas de lenguajes de programación. [Familiarizarse]
- Comparar la vida diaria antes y después de las computadoras personales e Internet. [Evaluar]
- Escribir, compilar y ejecutar un programa simple en Python. [Usar]
5.1.4.2. Fundamentos de Sistemas de Tipos (6 horas) [Habilidades AG-C08,AG-C12] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013)
Temas
- Un tipo como un conjunto de valores junto con un conjunto de operaciones:
- Tipos primitivos (por ejemplo, números, booleanos)
- Tipos compuestos construidos a partir de otros tipos (por ejemplo, registros/estructuras, uniones, arreglos, listas, funciones, referencias usando operaciones de conjuntos) enumerate
- Seguridad de tipos y errores causados por usar valores inconsistentemente dados sus tipos pretendidos
- Objetivos y limitaciones del tipado estático y dinámico: detectar y eliminar errores lo antes posible.
- Tipos de datos primitivos en Python (int, float, str, bool).
- Conversión de tipos y casting.
Aprendizaje esperado (Learning Outcomes)
- Describir, tanto para un tipo primitivo como para uno compuesto, los valores que tienen ese tipo [Familiarizarse]
- Describir ejemplos de errores de programa detectados por un sistema de tipos [Familiarizarse]
- Usar tipos y mensajes de error de tipos para escribir y depurar programas [Usar]
- Explicar el sistema de tipado dinámico de Python. [Familiarizarse]
5.1.4.3. Fundamentos de Programación Orientada a Objetos (14 horas) [Habilidades AG-C08,AG-C12] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013; Brookshear and Brylow, 2019a)
Temas
- Programación imperativa como subconjunto de la programación orientada a objetos.
- Definición de clases: campos, métodos y constructores.
- Propiedades dinámicas vs estáticas.
- Variables, expresiones y asignaciones.
- Operaciones de entrada y salida.
- Sentencias condicionales (if, elif, else).
- Estructuras de iteración (bucles for, bucles while).
- Bucles anidados y sentencias de control de bucle.
- Fundamentos del manejo de excepciones.
Aprendizaje esperado (Learning Outcomes)
- Componer una clase a través del diseño, implementación y prueba para cumplir con los requisitos de comportamiento [Usar]
- Predecir y validar el flujo de control en un programa usando despacho dinámico [Evaluar]
- Usar mecanismos de encapsulación orientados a objetos como interfaces y miembros privados [Usar]
- Implementar programas usando estructuras condicionales e iterativas. [Usar]
- Depurar programas con errores de sintaxis y lógicos. [Usar]
- 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] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013; Hunt and Thomas, 1999)
Temas
- Definición e invocación de funciones.
- Mecanismos de paso de parámetros (por valor, por referencia).
- Valores de retorno y múltiples retornos.
- Alcance y tiempo de vida de variables (local, global, nonlocal).
- Fundamentos de recursión.
- Expresiones lambda y funciones de orden superior.
- Funciones como objetos de primera clase.
- Documentación y prueba de funciones.
Aprendizaje esperado (Learning Outcomes)
- Definir e implementar funciones con paso de parámetros adecuado. [Usar]
- Explicar la diferencia entre paso por valor y paso por referencia. [Familiarizarse]
- Implementar soluciones recursivas a problemas simples. [Usar]
- Usar expresiones lambda para construcciones de programación funcional. [Usar]
- 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] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013)
Temas
- Listas y operaciones con listas (indexación, segmentación, mutabilidad).
- Tuplas e inmutabilidad.
- Diccionarios y mapeo clave-valor.
- Conjuntos y operaciones con conjuntos.
- Cadenas como secuencias.
- Comprensión de listas y expresiones generadoras.
- Algoritmos básicos de búsqueda y ordenamiento.
- Introducción a la complejidad algorítmica para operaciones básicas.
Aprendizaje esperado (Learning Outcomes)
- Implementar programas usando listas, diccionarios y conjuntos. [Usar]
- Elegir estructuras de datos apropiadas para problemas dados. [Evaluar]
- Explicar las compensaciones entre diferentes estructuras de datos. [Familiarizarse]
- Implementar operaciones básicas de búsqueda y ordenamiento en listas. [Usar]
5.1.4.6. Fundamentos de Programación Orientada a Objetos (10 horas) [Habilidades AG-C08,AG-C12] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Guttag, 2013)
Temas
- Subclases, herencia (incluyendo herencia múltiple) y sobrescritura de métodos.
- Despacho dinámico: definición de llamada a método.
- Idiomas orientados a objetos para encapsulación:
- Privacidad, ocultación de datos y visibilidad de miembros de clase.
- Interfaces que revelan solo firmas de métodos.
- Clases base abstractas, rasgos (traits) y mixins. enumerate
- Clases y objetos en Python.
- Atributos y métodos.
- Fundamentos de herencia y polimorfismo.
- Encapsulamiento y ocultación de información.
Aprendizaje esperado (Learning Outcomes)
- Construir una jerarquía de clases simple utilizando subclases que permita reutilizar código para subclases distintas [Usar]
- 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]
- 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]
- Diseñar e implementar clases simples en Python. [Usar]
- 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] ↑ Volver arriba
Referencias Bibliográficas: (Guttag, 2013; Cormen et al., 2009)
Temas
- Paradigmas:
- Fuerza Bruta (por ejemplo, búsqueda lineal, ordenamiento por selección, viajante de comercio, mochila)
- Disminuir y Vencer:
- Por una Constante (por ejemplo, ordenamiento por inserción, ordenamiento topológico)
- Por un Factor Constante (por ejemplo, búsqueda binaria)
- Por un Tamaño Variable (por ejemplo, Euclides) enumerate
- Dividir y Vencer (por ejemplo, búsqueda binaria, quicksort, mergesort, Strassen)
- Voraz (por ejemplo, Dijkstra, Kruskal, Mochila)
- Transformar y Vencer:
- Simplificación de instancia (por ejemplo, encontrar duplicados mediante preordenamiento de lista)
- Cambio de representación (por ejemplo, heapsort)
- Reducción de problema (por ejemplo, mínimo común múltiplo, programación lineal)
- Programación dinámica (por ejemplo, Floyd, Marshall, Bellman-Ford) enumerate
- Compromisos espacio vs tiempo (por ejemplo, hash) enumerate
- Iteración vs recursión (por ejemplo, factorial, búsqueda en árbol)
- Estrategias de descomposición de problemas.
- Técnicas de diseño de algoritmos.
- Estrategias de depuración y prueba.
- Seguimiento de la ejecución del programa.
Aprendizaje esperado (Learning Outcomes)
- Para cada uno de los paradigmas en esta unidad:
- Explicar sus características definitorias
- Explicar un ejemplo que demuestre el paradigma incluyendo cómo este ejemplo satisface las características del paradigma. enumerate [Familiarizarse]
- Dar ejemplos de algoritmos iterativos y recursivos que resuelvan el mismo problema, explicar los beneficios y desventajas de cada enfoque [Usar]
- Evaluar si un enfoque voraz conduce a una solución óptima [Evaluar]
- Aplicar técnicas sistemáticas de depuración para localizar y corregir errores. [Usar]
- 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] ↑ Volver arriba
Referencias Bibliográficas: (Zelle, 2010; Hunt and Thomas, 1999)
Temas
- Uso de entornos de programación modernos (IDEs, notebooks).
- Mejores prácticas de búsqueda y reutilización de código.
- Uso de bibliotecas estándar y APIs.
- Técnicas de depuración y prueba.
- Fundamentos de control de versiones.
- Documentación de código y guías de estilo.
- Entornos virtuales y gestión de paquetes.
Aprendizaje esperado (Learning Outcomes)
- Usar herramientas de desarrollo modernas efectivamente. [Usar]
- Aplicar principios de reutilización de código mediante bibliotecas y APIs. [Usar]
- Depurar y probar programas sistemáticamente. [Usar]
- Seguir estándares de codificación y prácticas de documentación. [Familiarizarse]
- Gestionar paquetes y entornos de Python. [Familiarizarse]
5.1.5. Referencias Bibliográficas ↑ Volver arriba
Zelle, J. M. (2010). Python Programming: An Introduction to Computer Science. Franklin, Beedle & Associates Inc, 2nd edition.
Guttag, J. V. (2013). Introduction to Computation and Programming Using Python. MIT Press, 1st edition.
Brookshear, J. G. and Brylow, D. (2019a). Computer Science: An Overview. Pearson, global edition edition.
Hunt, A. and Thomas, D. (1999). The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley, 1st edition.
Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. (2009). Introduction to Algorithms. MIT Press, 3rd edition.