Índice Temático del Apunte¶
Prerrequisitos: Una computadora con Windows o GNU/Linux y disposición para compilar ejemplos en Linux/WSL2.
Objetivos: 1. Ubicar el capítulo previo necesario para un tema nuevo. 2. Planificar una ruta de estudio por bloques y dependencias.
Comprobación de salida: elegí un tema del Bloque 4 e identificá los capítulos que debés dominar antes de estudiarlo.
El material de estudio de la cátedra está organizado físicamente en cuatro bloques didácticos secuenciales. Esta estructura proporciona un andamiaje progresivo para el desarrollo de tus habilidades de programación.
El entorno¶
Para Windows y Linux, la cátedra ha creado un conjunto de scripts que se encargan de la
creación del espacio de trabajo, que además, está separado de la configuración
de lo que esté en la cátedra. INGCOM
Este se encarga de descargar todas las herramientas necesarias para trabajar, compilar, editar y ejecutar el código que desarrollaras.
Podés verificar la instalación con:
gcc --version
make --versionLos ejemplos se compilan, salvo indicación contraria, con:
gcc -Wall -Wextra -std=c11 -pedantic archivo.c -o programaMetodología de estudio¶
En cada capítulo seguí este ciclo: leé el objetivo, ejecutá el ejemplo mínimo, modificá una sola condición para observar su efecto y recién entonces resolvé los ejercicios. Conservá los warnings del compilador: son parte de la retroalimentación, no texto para ignorar. Si un capítulo depende de otro, volvé al concepto previo antes de memorizar una solución.
Matriz de dependencias conceptuales¶
| Para estudiar | Antes dominá | Resultado esperado |
|---|---|---|
| Bloque 1 | lógica elemental y uso de terminal | programas C pequeños compilables |
| Bloque 2 | variables, control y funciones | explicar direcciones, vida útil y recursos |
| Bloque 3 | punteros, memoria dinámica y testing básico | diseñar y probar TADs |
| Bloque 4 | bloques 1–3, contratos y compilación modular | integrar APIs y recursos de sistema |
Bloque 1: Fundamentos del Control de Flujo y Modularización¶
Este bloque introduce la sintaxis básica de C, la gestión del estado, las bifurcaciones y los lazos, la descomposición modular, la compilación automatizada de proyectos y las bases lógicas de la verificación de software.
1. Fundamentos de Algoritmos: Representación de lógica, diagramas de flujo y variables.
2. Introducción a C y Estado: Sintaxis básica, tipos primitivos, roles de variables y estado del programa.
3. Estructuras de Control de Flujo: Decisiones condicionales, lazos (estructuras de repetición) y manejo del buffer de entrada.
4. Modularización y Ámbitos: Firmas de funciones, ámbitos de almacenamiento (
static) y descomposición top-down.5. Fases de Compilación en C: Cabeceras
.h, preprocesador, enlazado y argumentos demain.6. Testing y Aserciones Básicas: Introducción al patrón AAA, la macro
asserty la cobertura de ramas.7. Introducción a Contratos de Software: Precondiciones, postcondiciones e invariantes de lazo informales.
8. Automatización con Makefiles: Compilación incremental, grafo de dependencias y objetivos ficticios (.PHONY).
Bloque 2: Memoria¶
Este bloque avanza desde la ubicación y representación de un valor hasta la administración explícita de recursos. No es una lista de técnicas intercambiables: cada etapa activa un conocimiento necesario para la siguiente.
1. Modelo de Memoria: Objetos, duración y modelo práctico de stack/heap. MMU, TLB y cachés se tratan como ampliación dentro del mismo capítulo.
2. Números, tamaños y representación: Límites de representación,
sizeof,size_ty desbordamientos.3. Conversión de Tipos (Casts): Promoción entera, coerción aritmética implícita y conversión explícita.
4. Indirección Física y Punteros: Punteros, operador de dirección
&, indirección*y pasaje por dirección.5. Arreglos Unidimensionales y Strings: Secuencias, decaimiento a puntero y gestión segura de cadenas de caracteres.
6. Memoria Dinámica en el Heap: Alocación con
malloc/free, propiedad de recursos y detección de fugas.7. Aritmética de Direcciones y Matrices Dinámicas: Aritmética de punteros, doble indirección y matrices dinámicas básicas.
8. Estructuras y Tipos Compuestos:
struct, punteros a estructuras y layout básico verificable.9. Alias de Tipos (typedef): Creación de alias de tipos personalizados y reglas de estilo.
10. Tipos Enumerativos (enum): Constantes nombradas, namespaces y switch defensivo.
11. Persistencia y Archivos de Texto: Punteros, cadenas y ciclo de vida de recursos con
FILE *.
Las ampliaciones de allocator, stack frames en ensamblador, hardware de
memoria, memcpy/aliasing, AoS/SoA y punto flotante están integradas como
secciones opcionales dentro de cada capítulo principal (marcadas como
“Lectura avanzada” o “Alcance”) y no son prerrequisitos del recorrido
anterior.
Bloque 3: Algoritmos y Estructuras de Datos¶
Uso de matrices multidimensionales, Tipos de Datos Abstractos (TADs), estructuras lineales con contratos informales y formales, análisis asintótico de complejidad e introducción a la recursividad.
1. Matrices Multidimensionales: Disposición Row-Major en RAM y optimización de localidad espacial para evitar fallos de caché.
2. Tipos de Datos Abstractos (TAD): Definición de TAD, interfaces y contratos aplicados a la estructura Secuencia (listas enlazadas).
3. Pilas, Colas y Deques: Estructuras con restricciones semánticas de acceso LIFO y FIFO.
4. Testing Avanzado y Automatización: Frameworks de pruebas personalizadas y testing basado en propiedades.
5. Diseño por Contratos y Aserciones: Precondiciones, postcondiciones e invariantes de estructura usando
assert.hen C estándar.6. Complejidad Algorítmica: Eficiencia de algoritmos y de TADs, notación asintótica Big-O, límites de hardware y P vs NP.
7. Introducción a la Recursividad: Fundamentos de recursión simple y anatomía cualitativa del Stack Frame.
Las transferencias desde el Bloque 2 se concentran en tres puentes opcionales:
El análisis de stack frames en ensamblador x86-64 vive en el Bloque 2
(bloque_2_memoria/1_modelo_memoria.md, sección “Anatomía de un Stack
Frame”).
Bloque 4: Temas Avanzados¶
Tópicos de optimización a bajo nivel, encapsulamiento, manipulación de bits, recursividad avanzada y diseño arquitectónico de APIs robustas en C.
1. Índice de Temas Avanzados: Resumen y guía didáctica de contenidos avanzados.
2. Callbacks y Genericidad: Punteros a funciones y diseño paramétrico empleando punteros genéricos
void*.3. Encapsulamiento y Tipos Opacos: Ocultamiento estricto de información mediante tipos de datos incompletos en C.
4. Archivos Binarios: Persistencia en disco de estructuras binarias mediante
freadyfwrite.5. Operaciones Bitwise: Álgebra de Boole a nivel de bit y máscaras.
6. Manipulación de Bitmaps (BMP): Lectura, edición y escritura de imágenes rasterizadas BMP.
7. Recursividad Avanzada: Backtracking y optimización cualitativa.
8. C Idiomático y Patrones: Modismos del lenguaje C y refactorización orientada a seguridad.
9. Diseño de APIs: Principios para interfaces cohesivas y seguras.
10. Ingeniería de APIs: Modularización a gran escala y versionado de interfaces.
11. Concurrencia e Hilos: Hilos POSIX (
pthreads) y primitivas de sincronización.12. Programación con Sockets: Comunicación en red mediante sockets UNIX.