Fundamentos de programación en C
Este texto pretende ser una introducción a la programación de ordenadores en lenguaje C.
Se ha revisado con la intención que su nivel sea el razonable para una asignatura de “Fundamentos de programación” o similar, aunque quizá algunos centros (especialmente universitarios) exijan un nivel más alto que el que se cubre.
Está organizado de una forma ligeramente distinta a los libros de texto “convencionales”, procurando incluir ejercicios prácticos lo antes posible, para evitar que un exceso de teoría en los primeros temas haga el texto pesado de seguir.
Aun así, este texto no pretende “sustituir a un profesor”, sino servir de apoyo para que los alumnos no pierdan tiempo en tomar apuntes. Pero es trabajo del profesor aclarar las dudas que surjan y proponer muchos más ejercicios que los que figuran aquí.
Este texto ha sido escrito por Nacho Cabanes. Si quiere conseguir la última versión, estará en mi página web:
www.nachocabanes.com
La última versión de este curso, tanto para consultar en línea como en formato PDF, se podrá encontrar en el apartado sobre Lenguaje C:
www.nachocabanes.com/c
Este texto es de libre distribución (“gratis”). Se puede distribuir a otras personas libremente, siempre y cuando no se modifique.
Este texto se distribuye "tal cual", sin garantía de ningún tipo, implícita ni explícita. Aun así, mi intención es que resulte útil, así que le rogaría que me comunique cualquier error que encuentre.
Para cualquier sugerencia, no dude en contactar conmigo a través de mi web.
Contenido
- 0. Conceptos básicos sobre programación
- 0.1. Lenguajes de alto nivel y de bajo nivel
- 0.2. Ensambladores, compiladores e intérpretes
- 0.3. Pseudocódigo
- 1. Toma de contacto con C
- 1.1 Escribir un texto en C
- 1.1.1. Cómo probar este programa en Linux
- 1.1.2. Cómo probar este programa en Windows
- 1.2. Mostrar números enteros en pantalla
- 1.3. Operaciones aritméticas básicas
- 1.3.1. Orden de prioridad de los operadores
- 1.3.2. Introducción a los problemas de desbordamiento
- 1.4. Introducción a las variables: int
- 1.4.1. Definición de variables: números enteros
- 1.4.2. Asignación de valores
- 1.4.3. Mostrar el valor de una variable en pantalla
- 1.5. Identificadores
- 1.6. Comentarios
- 1.7. Datos por el usuario: scanf
- 2. Tipos de datos básicos
- 2.1. Tipo de datos entero
- 2.1.1. Tipos de enteros: signed/unsigned, short/long
- 2.1.2. Problemática: asignaciones y tamaño de los números; distintos espacios ocupados según el sistema
- 2.1.3. Unidades de medida empleadas en informática (1): bytes, kilobytes, megabytes...
- 2.1.4. Unidades de medida empleadas en informática (2): los bits
- 2.1.5. Sistemas de numeración: 1- Sistema binario
- 2.1.6. Sistemas de numeración: 2- Sistema octal
- 2.1.7. Sistemas de numeración: 3- Sistema hexadecimal
- 2.1.8. Formato de constantes enteras: oct, hex
- 2.1.9. Representación interna de los enteros
- 2.1.10. Incremento y decremento
- 2.1.11. Operaciones abreviadas: +=
- 2.1.12. Modificadores de acceso: const, volatile
- 2.2. Tipo de datos real
- 2.2.1. Simple y doble precisión
- 2.2.2. Mostrar en pantalla números reales
- 2.3. Operador de tamaño: sizeof
- 2.4. Operador de molde: (tipo) operando
- 2.5. Tipo de datos carácter
- 2.5.1. Secuencias de escape: \n y otras.
- 2.5.2. Introducción a las dificultades de las cadenas de texto
- 3. Estructuras de control
- 3.1. Estructuras alternativas
- 3.1.1. if
- 3.1.2. if y sentencias compuestas
- 3.1.3. Operadores relacionales: <, <=, >, >=, ==, !=
- 3.1.4. if-else
- 3.1.5. Operadores lógicos: &&, ||, !
- 3.1.6. Cómo funciona realmente la condición en un “if”
- 3.1.7. El peligro de la asignación en un “if”
- 3.1.8. Introducción a los diagramas de flujo
- 3.1.9. Operador condicional: ?
- 3.1.10. switch
- 3.2. Estructuras repetitivas
- 3.2.1. while
- 3.2.2. do ... while
- 3.2.3. for
- 3.3. Sentencia break: termina el bucle
- 3.4. Sentencia continue: fuerza la siguiente iteración
- 3.5. Sentencia goto
- 3.6. Más sobre diagramas de flujo. Diagramas de Chapin.
- 3.7. Recomendación de uso de los distintos tipos de bucle
- 4. Entrada/salida básica
- 4.1. printf
- 4.2. scanf
- 4.3. putchar
- 4.4. getchar
- 5. Arrays y estructuras
- 5.1. Conceptos básicos sobre tablas
- 5.1.1. Definición de una tabla y acceso a los datos
- 5.1.2. Valor inicial de una tabla
- 5.1.3. Recorriendo los elementos de una tabla
- 5.2. Cadenas de caracteres
- 5.2.1. Definición. Lectura desde teclado
- 5.2.2. Cómo acceder a las letras que forman una cadena
- 5.2.3. Longitud de la cadena.
- 5.2.4. Entrada/salida para cadenas: gets, puts
- 5.2.5. Asignando a una cadena el valor de otra: strcpy, strncpy; strcat
- 5.2.6. Comparando cadenas: strcmp
- 5.2.7. Otras funciones de cadenas: sprintf, sscanf
- 5.2.8. Valor inicial de una cadena de texto
- 5.3. Tablas bidimensionales
- 5.4. Arrays indeterminados.
- 5.5. Estructuras
- 5.5.1. Definición y acceso a los datos
- 5.5.2. Arrays de estructuras
- 5.5.3. Estructuras anidadas
- 5.6 Ejemplo completo
-
6. Manejo de ficheros
- 6.1. Escritura en un fichero de texto
- 6.2. Lectura de un fichero de texto
- 6.3. Lectura hasta el final del fichero
- 6.4. Ficheros con tipo
- 6.5 Leer y escribir letra a letra
- 6.6 Modos de apertura
- 6.7 Ficheros binarios
- 6.8 Ejemplo: copiador de ficheros
- 6.9 Acceder a cualquier posición de un fichero
- 6.10 Ejemplo: leer información de un fichero BMP
- 6.11. Ficheros especiales 1: la impresora
- 6.12. Ficheros especiales 2: salida de errores
- 6.13. Un ejemplo de lectura y escritura: TAG de un MP3
-
7. Introducción a las funciones
- 7.1. Diseño modular de programas: Descomposición modular
- 7.2. Conceptos básicos sobre funciones
- 7.3. Parámetros de una función
- 7.4. Valor devuelto por una función
- 7.5. El valor de retorno “void”. El valor de retorno de “main”
- 7.6. Variables locales y variables globales
- 7.7. Los conflictos de nombres en las variables
- 7.8. El orden importa
- 7.9. Algunas funciones útiles
- 7.9.1. Números aleatorios
- 7.9.2. Funciones matemáticas
- 7.9.3. Pero casi todo son funciones…
- 7.10. Recursividad
- 7.11. Cómo interrumpir el programa.
-
8. Cómo depurar los programas
- 8.1. Conceptos básicos sobre depuración
- 8.2. Ejemplos de algunos entornos
-
9. Punteros y gestión dinámica de memoria
- 9.1. ¿Por qué usar estructuras dinámicas?
- 9.2. ¿Qué son los punteros?
- 9.3. Repasemos con un ejemplo sencillo
- 9.4. Aritmética de punteros
- 9.5. Punteros y funciones: parámetros por referencia
- 9.6. Punteros y arrays
- 9.7. Arrays de punteros
- 9.8. Punteros y estructuras
- 9.9. Parámetros de “main”
- 9.10. Estructuras dinámicas habituales 1: las listas enlazadas
- 9.11. Estructuras dinámicas habituales 2: los árboles binarios
- 9.12. Indirección múltiple
- 9.13. Un ejemplo: copiador de ficheros en una pasada
-
10. Bibliotecas de uso frecuente
- 10.1. Llamadas al sistema: system
- 10.2. Temporización
- 10.3. Pantalla y teclado con Turbo C
- 10.4. Acceso a pantalla en Linux: curses.h
- 10.5. Juegos multiplataforma: SDL
-
11. Otras características avanzadas de C
- 11.1 Operaciones con bits
- 11.2 Directivas del preprocesador
- 11.2.1. Constantes simbólicas: #define
- 11.2.2 Inclusión de ficheros: #include
- 11.2.3. Compilación condicional: #ifdef, #endif
- 11.2.4. Otras directivas
- 11.3. Programas a partir de varios fuentes
- 11.3.1. Creación desde la línea de comandos
- 11.3.2. Introducción al uso de la herramienta Make
- 11.3.3. Introducción a los “proyectos”
- 11.4 Uniones y campos de bits
- 11.5. El operador coma
- 11.6. Enumeraciones
- 11.7. Definición de tipos
Soluciones a los ejercicios propuestos