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:
- Repaso y entornos — lo esencial de C, cómo leer código y el modelo de entornos.
- Memoria y abstracción — punteros, memoria dinámica, módulos y tipos.
- Recursión — recursión, recursión en árbol, backtracking y funciones como valores.
- 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:
- Explicar qué pasa en la memoria al ejecutar un programa, dibujando marcos de llamada, alcance y tiempo de vida.
- Usar punteros y memoria dinámica sin fugas ni accesos inválidos, y comprobarlo con ASan y valgrind.
- Dividir un programa en módulos con una interfaz clara, ocultando la representación con tipos opacos.
- Definir tipos adecuados al problema con
typedef,enum,structy uniones etiquetadas, y reconocer el comportamiento indefinido. - Resolver problemas con recursión, recursión en árbol y backtracking, y razonar por qué un programa recursivo es correcto y termina.
- Pasar funciones como valores con punteros a función y un contexto
void *. - Escribir pruebas que se apoyen en la interfaz, y depurar con método usando
gdby las herramientas de diagnóstico. - Leer código ajeno, entenderlo y extenderlo sin romperlo.
- 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.