Introducción a la Programación — Programa del curso

Docente: Gerson Garrido

1. Descripción

En Introducción a la Computación ustedes aprendieron a escribir programas pequeños en C. Este curso les enseña a escribir programas que no caben en la cabeza: a descomponer un problema difícil, a esconder detalles detrás de una buena interfaz y a convencerse, con pruebas y con herramientas, de que el resultado es correcto.

Las primeras semanas repasan rápido lo esencial de C. Después vienen las ideas nuevas: qué pasa en la memoria durante una llamada, punteros, memoria dinámica, programas en varios archivos, tipos propios, recursión, backtracking y funciones como valores. El curso termina con un intérprete de un lenguaje pequeño, que reúne todo lo anterior. Se organiza en cuatro partes:

  1. Repaso y entornos — lo esencial de C, cómo leer código y el modelo de entornos.
  2. Memoria y abstracción — punteros, memoria dinámica, módulos y tipos.
  3. Recursión — recursión, recursión en árbol, backtracking y funciones como valores.
  4. Un intérprete — datos recursivos, análisis sintáctico y evaluación.

No hay libro de texto: los apuntes son el texto del curso. Los términos técnicos siguen la guía de estilo, y el glosario reúne los principales.

2. Carga horaria

Componente Horas/semana Formato
Teoría 2 h Una sesión
Laboratorio 4 h Dos sesiones de 2 h

3. Resultados de aprendizaje

Al finalizar el curso, el estudiante será capaz de:

  1. Explicar qué pasa en la memoria al ejecutar un programa, dibujando marcos de llamada, alcance y tiempo de vida.
  2. Usar punteros y memoria dinámica sin fugas ni accesos inválidos, y comprobarlo con ASan y valgrind.
  3. Dividir un programa en módulos con una interfaz clara, ocultando la representación con tipos opacos.
  4. Definir tipos adecuados al problema con typedef, enum, struct y uniones etiquetadas, y reconocer el comportamiento indefinido.
  5. Resolver problemas con recursión, recursión en árbol y backtracking, y razonar por qué un programa recursivo es correcto y termina.
  6. Pasar funciones como valores con punteros a función y un contexto void *.
  7. Escribir pruebas que se apoyen en la interfaz, y depurar con método usando gdb y las herramientas de diagnóstico.
  8. Leer código ajeno, entenderlo y extenderlo sin romperlo.
  9. Construir un intérprete pequeño: análisis léxico, análisis sintáctico y evaluación recursiva.

4. Bibliografía

Texto del curso: los apuntes, un capítulo por semana. No se requiere comprar ningún libro.

5. Calendario

Este es el calendario oficial del curso. Cada semana enlaza a su guía con objetivos, temas y actividades de laboratorio. Los temas marcados con ✂️ se pueden comprimir o pasar a lectura autónoma si se pierden clases por feriados. Las semanas 8 y 16 son de exámenes y no tienen clases regulares.

Sem. Teoría (2 h) Laboratorio (4 h) Práctica o examen
1 Presentación · Repaso: tipos, control, funciones y assert Entorno y programas de repaso
2 Repaso: arreglos, cadenas, struct y archivos · Cómo leer código Leer un programa ajeno y extenderlo
3 El modelo de entornos: marcos, alcance y tiempo de vida Imágenes: filtros y marcos en gdb
4 Punteros: paso por puntero, arreglos y punteros, const Transformar imágenes con punteros Práctica 1
5 Memoria dinámica: malloc, free, ownership, ASan y valgrind Imágenes de cualquier tamaño y cacería de fugas
6 Varios archivos: encabezados, make, tipos opacos y pruebas por la interfaz Dividir un programa en módulos con sus pruebas
7 Tipos: typedef, enum, uniones etiquetadas · ✂️ Conversiones · Comportamiento indefinido Un valor con varios tipos Práctica 2
8 Examen parcial (semanas 1 a 7)
9 Recursión: caso base, razonar por inducción, recursión e iteración Recursión en arreglos y cadenas
10 Recursión en árbol: flood fill, cuadrículas · ✂️ Memoización Buscaminas
11 Backtracking: permutaciones, subconjuntos, N reinas y poda Resolver sudokus Práctica 3
12 Funciones como valores: punteros a función, callbacks, qsort y contexto void * Un solucionador genérico
13 Datos recursivos: árboles de expresión, evaluar · ✂️ Simplificar Álgebra de expresiones
14 Análisis léxico y análisis sintáctico descendente recursivo Parser del lenguaje Mini Práctica 4
15 El intérprete: variables, funciones y marcos · Repaso Terminar y probar el intérprete
16 Examen final (todo el curso)

6. Prácticas

Hay cuatro prácticas individuales, en las semanas 4, 7, 11 y 14. Esa semana, una de las dos sesiones de laboratorio es para la práctica y la otra sigue con el laboratorio de la guía. El formato y las reglas están en practicas/README.md.

7. Políticas

  • Trabajo: individual. Se puede discutir ideas, pero cada estudiante escribe su propio código y debe poder explicarlo. Copiar soluciones de otras personas o de internet cuenta como plagio.

Herramientas e IA

Las herramientas del entorno del curso se usan todo el tiempo. La IA generativa no se usa en ningún trabajo del curso: laboratorios, prácticas ni exámenes. El curso entrena justo lo que esa IA haría por ustedes: leer un programa, dibujar su memoria y encontrar el error.

Herramienta ¿Se permite?
Diagnósticos del compilador (gcc -Wall -Wextra), sanitizers (ASan, UBSan), valgrind y gdb Sí. Son parte del curso
Documentación oficial (páginas man, cppreference, manuales de gcc y make) y búsqueda web Sí, para consultar cómo funciona algo. No para buscar la solución de un ejercicio
Autocompletado del editor que completa nombres, firmas o paréntesis, sin generar funciones enteras Sí
Correctores de ortografía, traductores y herramientas de accesibilidad Sí
Formateadores y linters de código, como clang-format o cppcheck Sí
IA generativa para pedir explicaciones, sin que escriba código No
IA generativa que escribe código, aunque sea una parte No

Cómo declararlo. Si usan una herramienta permitida que no viene en el entorno del curso, como un traductor o un linter, lo dicen en un comentario al inicio del archivo que entregan: qué herramienta y para qué. Las del entorno no hace falta declararlas.

Explicarlo de palabra. En cualquier laboratorio o práctica se les puede pedir que expliquen su código de palabra: qué hace una línea, por qué la escribieron así o qué pasa si se cambia.

8. Entorno de trabajo

Todo se hace en un mismo entorno, con el compilador de C, gdb, valgrind, make y Git ya instalados. Se abre con GitHub Codespaces o con Docker. Instrucciones en labs/README.md.