| title | Bienvenida a Programación 1 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| authors |
|
|||||||||||||
| affiliations |
|
Les damos la bienvenida a la cursada de Programación 1, una materia fundamental del primer año de la carrera de Ingeniería en Computación de la Universidad Nacional de Río Negro.
Este es un espacio donde encontrarán el material de estudio, las guías de trabajos prácticos, la bibliografía recomendada y, por qué no, algún que otro meme para amenizar el viaje.
Antes de sumergirnos en el lenguaje C, es crucial entender una idea central que guiará toda la materia: programar no es solo aprender una sintaxis, es desarrollar una forma de pensar. El lenguaje es la herramienta, pero el verdadero desafío y la habilidad que buscamos forjar residen en la construcción de soluciones lógicas y estructuradas a problemas complejos.
Programar es dar instrucciones precisas a una computadora, una entidad que no interpreta ambigüedades. Cada paso debe estar perfectamente definido. Omitir un detalle puede hacer que todo falle. Por ello, aprenderemos a pensar como una máquina en términos de lógica, pero también a estructurar el pensamiento como un ser humano inteligente.
:::{figure} apunte/bloque_1_fundamentos/2/think.jpg :alt: Roll Safe thinking :align: center
Pensar es más importante que escribir. :::
Este apunte está organizado para acompañarlos de manera gradual en su aprendizaje. El contenido se divide en varias secciones clave:
El material principal de la materia está estructurado en cinco bloques progresivos:
- Bloque 1: Fundamentos: Bases de la computación, control de flujo, funciones, recursividad introductoria y nociones de contratos.
- Bloque 2: Estructuración y Proyectos: Compilación, Makefiles, alias de tipos y enumeraciones.
- Bloque 3: Disposición de Memoria y Estructuras Estáticas: Modelo de memoria (Stack y Code), secuencias, matrices, punteros y estructuras de datos estáticas.
- Bloque 4: Gestión Dinámica de Recursos e Interfaces: Memoria dinámica (Heap), aritmética de punteros, archivos de texto, punteros a funciones, tipos opacos, TADs (listas, pilas y colas), testing y contratos formales.
- Bloque 5: Temas Avanzados: Archivos binarios, operaciones bitwise, manipulación de imágenes BMP, recursividad avanzada, C idiomático y diseño de APIs.
Las prácticas y cuadernillos de autoevaluación están organizados para seguir de cerca cada bloque del apunte. Es el campo de entrenamiento fundamental para fijar conceptos y resolver problemas mediante código real.
La cátedra hace uso extensivo de control de versiones con Git y GitHub, por lo que es de lectura recomendada.
Disponemos de un Índice de Guías complementarias que cubren herramientas del ecosistema de desarrollo. Si estás comenzando, debés seguir la guía para configurar tu Entorno de Desarrollo paso a paso.
:::{warning} ¡No se detengan por las herramientas! Si encuentran problemas en esta etapa, es crucial que los resuelvan cuanto antes. No dejen que una dificultad con la configuración frene su aprendizaje. Consulten en clase o en el espacio de Discussions del proyecto. :::
A lo largo de la cursada, haremos hincapié en la importancia de escribir código claro, consistente y legible. Adherirse a un conjunto de reglas de estilo no es una restricción arbitraria, sino una práctica profesional fundamental que facilita la colaboración y el mantenimiento del software.
Un buen estilo eleva la calidad del código no solo en su funcionalidad, sino también en su claridad. Para más detalles, pueden consultar la regla sobre la claridad y prolijidad ({ref}0x0000h).
Para los ejercicios de mayor complejidad que requieran modularización avanzada, estructuración en múltiples archivos o para la entrega de Trabajos Prácticos (TPs), la cátedra provee un repositorio base que debés clonar y utilizar:
- Plantilla de Proyecto: INGCOM-UNRN-P1/plantilla-TP
Este repositorio plantilla incluye un Makefile preconfigurado para automatizar las tareas del ciclo de vida del software:
make: Compila el programa principal (main.cyprueba.c).make run: Ejecuta el programa del archivo principal (main).make test: Ejecuta el suite de pruebas unitarias (prueba).make clean: Limpia los archivos binarios compilados e intermedios (.o,.a,.exe).make librerias: Compila todas las librerías compartidas del proyecto.make ejercicio1: Compila el ejercicio 1 (pudiendo compilar los demás modificando el número final).
Important
- Luego de cargar las librerías en tu espacio de trabajo, no olvides compilarlas con
make libreriasantes de darles uso en tus ejercicios. - Recordá no enviar nunca archivos compilados o intermedios al control de versiones de Git. Ejecutá
make cleanen la raíz del proyecto antes de hacer un commit o push.
Este sitio es un proyecto vivo y en constante mejora. Está construido con MyST Markdown, una herramienta que combina la simplicidad de Markdown con la potencia de la documentación técnica.
Si encuentran errores, tienen sugerencias para mejorar una explicación o quieren añadir nuevo material, ¡sus contribuciones son bienvenidas! Participar en el proyecto es una excelente manera de aprender y de ayudar a sus compañeros.
Para ejecutar el sitio en su computadora, la forma más sencilla es usar uv:
$> uvx --from mystmd myst startEste comando se encargará de instalar todo lo necesario para previsualizar los cambios en tiempo real.
Este sitio abraza la filosofía de "documentos como código". Todo el contenido, incluyendo el texto y los diagramas, se escribe en texto plano. Usamos MyST Markdown para el contenido, y los diagramas se generan directamente desde el código fuente usando herramientas como Mermaid y Svgbob.
Esto significa que los diagramas de flujo, esquemas y otras visualizaciones son tan fáciles de editar y versionar como el resto del apunte. ¡Animate a proponer mejoras visuales también!
- A gonmolina por la ayuda inicial con MyST Markdown.