Este libro introduce al lector en la programación en C de manera gradual, sin necesidad de conocimientos previos. A lo largo de sus capítulos se incluyen cientos de ejemplos repartidos estratégicamente para ilustrar cada idea, junto con más de 200 ejercicios propuestos cada uno acompañado de su solución, que permiten practicar y afianzar los contenidos, de manera que el lector pueda comprobar su progreso y, al mismo tiempo, aprender distintas formas de abordar un mismo problema.
El lenguaje C tiene una larga tradición en el mundo de la ingeniería y la computación, y en el se apoyan otros muchos lenguajes modernos. Aprender C significa adquirir un conocimiento profundo de los fundamentos de la programación, de la relación entre el código y la máquina, y de los principios que siguen vigentes en entornos actuales. C, con su sencillez y potencia, ofrece al principiante una oportunidad única de comprender de verdad cómo se construye un programa desde sus cimientos.
Este libro no pretende únicamente enseñar a programar en C, sino formar en el arte de pensar de manera algorítmica, rigurosa y creativa. Su meta es que el lector, desarrolle una herramienta intelectual que les sea útil durante toda su vida profesional como ingeniero.
1 Introducción a los ordenadores y los lenguajes de programación
1.1 Sistemas de numeración. El sistema binario
1.2 El Ordenador
1.3 El sistema operativo
1.4 El sistema de archivos
1.5 Lenguajes de programación
1.6 Algoritmos
2 Instalación y primeros pasos
2.1 Herramientas de trabajo
2.2 El primer programa: Hola mundo
2.3 Comentarios en los programas
2.4 Recursos online
2.5 Conclusión
3 Tipos de datos y variables
3.1 Lenguajes completos
3.2 Expresiones
3.3 Introducción a los tipos de datos
3.4 Tipos de datos primitivos
3.5 Variables y asignación de valores
3.6 Operadores en C
3.7 Orden de precedencia de los operadores
3.8 Tipos personalizados con el operador typedef
3.9 Entrada y salida básica: printf(), puts() y scanf()
Ejercicios propuestos
4 Bifurcaciones
4.1 Bifurcaciones
4.2 Diagramas de flujo
4.3 Instrucciones de bloque
4.4 Valores booleanos
4.5 La instrucción if ... else
4.6 Bifurcaciones if sin rama else
4.7 if anidados
4.8 La instrucción if...else if...else
4.9 Elección de alternativas con switch
4.10 El operador ternario
Ejercicios propuestos
5 Bucles
5.1 Introducción
5.2 Bucles while
5.3 El bucle for
5.4 Bucles do... while
5.5 Modificación de flujo en bucles: break, continue y return
5.6 Bucles infinitos
5.7 Algoritmos clásicos basados en bucles
5.8 La instrucción goto
Ejercicios propuestos
6 Arrays
6.1 Definición de array en C
6.2 Creación de variables de tipo array
6.3 Acceso a las componentes de un array
6.4 El tamaño del array
6.5 Arrays multidimensionales
6.6 Tipos de arrays personalizados con typedef
6.7 Algoritmos básicos que utilizan arrays
6.8 Algoritmos de conteo y búsqueda secuencial
Ejercicios propuestos
7 Funciones
7.1 Motivación: ¿por qué utilizar funciones?
7.2 Definición de funciones
7.3 Declaración (prototipo) de funciones
7.4 Ámbito y duración de las variables
7.5 Funciones recursivas
7.6 Arrays como parámetros de funciones
7.7 Buenas prácticas en la definición de funciones
7.8 Parámetros en la función main()
7.9 Organización modular del código fuente
Ejercicios propuestos
8 Cadenas de caracteres
8.1 Declaración e inicialización de cadenas
8.2 Entrada y salida de cadenas
8.3 Recorrido y manipulación de cadenas
8.4 Tipos de datos personalizados para cadenas
Ejercicios propuestos
9 Estructuras
9.1 El concepto de la lógica de negocio
9.2 Definición de estructuras
9.3 Estructuras complejas
9.4 Utilización del operador de asignación con estructuras
9.5 El operador typedef con estructuras
9.6 Uso de estructuras en funciones
9.7 Formas singulares de declaración de estructuras
9.8 Campos de bits en estructuras
9.9 Notación UML
Ejercicios propuestos
10 Uniones y enumeraciones
10.1 Introducción
10.2 Enumeraciones (enum)
10.3 Uniones (union)
10.4 Combinación de enum y union: uniones etiquetadas
10.5 Aplicaciones prácticas
10.6 Buenas prácticas y estilo
Ejercicios propuestos
11 Punteros
11.1 Introducción: ¿Por qué se necesitan punteros?
11.2 Direcciones de memoria y el operador &
11.3 Declaración e inicialización de punteros
11.4 Inicialización de punteros
11.5 El operador de indirección *
11.6 Punteros y arrays. Aritmética de punteros
11.7 Punteros y funciones
11.8 Punteros a estructuras
11.9 Punteros y cadenas de caracteres
11.10 Punteros y const
11.11 Punteros nulos y punteros inválidos
11.12 Buenas prácticas y errores comunes
11.13 Tamaño de tipos y memoria: sizeof y size_t
11.14 Punteros a void
11.15 Punteros a funciones
Ejercicios propuestos
12 Funciones para manipular cadenas de caracteres
12.1 Introducción
12.2 Medir la longitud de una cadena
12.3 Comparar cadenas
12.4 Concatenar cadenas
12.5 Buscar caracteres y subcadenas
12.6 Inicialización de cadenas
12.7 Casos prácticos
12.8 Consideraciones sobre seguridad y portabilidad
12.9 Resumen y tabla de funciones
12.10 Otras funciones de string.h
Ejercicios propuestos
13 Estructuras complejas de datos
13.1 Introducción
13.2 Arrays estáticos
13.3 Arrays con huecos
13.4 Arrays compactados
13.5 Soluciones mixtas
Ejercicios propuestos
14 Entrada y salida por pantalla
14.1 Introducción
14.2 E/S de caracteres individuales
14.3 Salidas con formato: printf()
14.4 Entradas con formato: scanf()
14.5 Entrada y salida sobre cadenas de caracteres
Ejercicios propuestos
15 Lectura y escritura de ficheros
15.1 Forma de almacenamiento de los ficheros
15.2 Concepto de fichero
15.3 Ficheros de texto y ficheros binarios
15.4 Operativa básica con ficheros
15.5 Apertura de un fichero
15.6 Cierre del fichero
15.7 Escritura de ficheros binarios
15.8 Lectura de ficheros binarios
15.9 El cursor del fichero
15.10 Comprobación de errores de lectura o escritura
15.11 Escritura de ficheros de texto
15.12 Lectura de ficheros de texto con f s c a n f () y f g e t s()
Ejercicios propuestos
16 Asignación dinámica de memoria
16.1 ¿Por qué necesitamos memoria dinámica?
16.2 Conceptos básicos
16.3 Funciones para asignar memoria
16.4 Algunos ejemplos
16.5 Errores comunes y problemas típicos
16.6 Herramientas para detectar errores
16.7 Asignación dinámica en estructuras complejas
Ejercicios propuestos
17 La biblioteca estándar de C
17.1 Introducción
17.2 Funciones para cálculos matemáticos
17.3 Números complejos: complex.h
17.4 Generación de números aleatorios
17.5 La biblioteca time.h
17.6 Tipos y conversiones
17.7 Utilidades varias
Ejercicios propuestos
18 Programación modular en C
18.1 Introducción a la programación modular
18.2 Estructura básica de un programa modular en C
18.3 La directiva include
18.4 Guardas de inclusión
18.5 Declaraciones y definiciones
18.6 La palabra clave extern
18.7 Proceso de compilación y enlace
18.8 Organización de proyectos
18.9 Ejemplos prácticos
18.10 Resumen y buenas prácticas
Ejercicios propuestos
19 Caracteres y cadenas Unidoce
19.1 Introducción
19.2 Conceptos sobre codificación de caracteres
19.3 Unicode y codificaciones UTF-8, UTF-16 y UTF-32
19.4 Caracteres y cadenas multibyte en C
19.5 El tipo wchar_t y las cadenas de caracteres anchos
19.6 La función setlocale() y el entorno regional
19.7 Entrada y salida con cadenas anchas
19.8 Code Pages en la consola de Windows
19.9 Conversión entre codificaciones
19.10 Buenas prácticas para trabajar con Unicode en C
19.11 Análisis de compatibilidad y portabilidad
Ejercicios propuestos