Fundamentos de programación en C, por Nacho Cabanes
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
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 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 cont actar conmigo a través de mi web.
Revisión actual: 0.90 Revisión 0.90– Página 1
Fundamentos de programación en C, por Nacho Cabanes
Contenido 0. Conceptos básicos sobre programación _______________________________ _ ______________________________________________ ________________ 6 0.1. Lenguajes de alto nivel y de bajo nivel.____________________________________________ 6 0.2. Ensambladores, Ensambladores, compiladores e intérpretes _____________________________ ________________________________________ ___________ 7 0.3. Pseudocódigo _____________________________ ___________________________________________________________ ____________________________________ ______ 8 1. Toma de contacto con C _____________________________ ___________________________________________________________ ______________________________ 10 1.1 Escribir un texto en C _______________________________________________ __________ 11 1.1.1. Cómo Cómo probar este programa programa en Linux _______________ _______________________ _______________ _______________ ____________ ____ 12 1.1.2. Cómo Cómo probar probar este programa programa en Windows Windows _______________ ______________________ _______________ _______________ _________ __ 14 1.2. Mostrar números enteros en pantalla _____________________________ ____________________________________________ _______________ 15 1.3. Operaciones aritméticas básicas ___________________________________________ _____________ ___________________________________ _____ 16 1.3.1. Orden Orden de priorida prioridad d de los operadore operadoress _______________ _______________________ _______________ _______________ ____________ ____ 16 1.3.2. Introduc Introducción ción a los problemas problemas de desbordamiento desbordamiento _______________ ______________________ _______________ ___________ ___ 17 1.4. Introducción a las variables: int ____________________________ ________________________________________________ ____________________ 1.4.1. Definic Definición ión de variables: variables: números números enteros _______________ ______________________ _______________ _______________ _________ __ 1.4.2. Asigna Asignación ción de valores valores _______________ ______________________ _______________ _______________ _______________ _______________ _________ __ 1.4.3. Mostrar Mostrar el valor valor de una variable variable en pantall pantallaa _______________ _______________________ _______________ ______________ _______
17 17 17 18
1.5. Identificadores__________________ Identificadores________________________________________________ _____________________________________________ _______________ 19 1.6. Comentarios ______________________________________________________ ________________________ ________________________________________ __________ 20 1.7. Datos por el usuario: scanf____________________________ scanf _____________________________________________________ _________________________ 21 2. Tipos de datos básicos__________________________ básicos ________________________________________________________ ___________________________________ _____ 22 2.1. Tipo de datos entero _____________________________________________________ _____ 2.1.1. Tipos de enteros: enteros: signed/unsigne signed/unsigned, d, short/long _______________ _______________________ _______________ _____________ ______ 2.1.2. Problemática: asignaciones y tamaño de los números; distintos esp acios ocupados según el sistema sistema _______________ _______________________ _______________ _______________ _______________ _______________ _______________ _______________ ___________ ___ 2.1.3. Unidades de medida empleadas en informática (1): bytes, kilobytes, megabytes...________ megabytes...________ 2.1.4. Unidad Unidades es de medida medida empleadas empleadas en informáti informática ca (2): los bits ______________ ______________________ ___________ ___ 2.1.5. Sistemas Sistemas de numeración: numeración: 1- Sistema Sistema binario _______________ _______________________ _______________ ______________ _______ 2.1.6. Sistemas Sistemas de numeración: numeración: 2- Sistema octal _______________ ______________________ _______________ _______________ _________ __ 2.1.7. Sistemas de numeración: 3- Sistema hexadecimal_______________________ __________ 2.1.8. Formato Formato de constantes constantes enteras: oct, hex___________________ hex___________________________ _______________ ______________ _______ 2.1.9. Represen Representació tación n interna de los enteros enteros _______________ _______________________ _______________ _______________ ____________ ____ 2.1.10. 2.1.10. Increment Incremento o y decremento________ decremento________________ _______________ ______________ _______________ _______________ _____________ ______ 2.1.11. 2.1.11. Operacione Operacioness abreviadas: abreviadas: += _______________ ______________________ _______________ _______________ _______________ ____________ ____ 2.1.12. 2.1.12. Modificadores Modificadores de acceso: const, const, volatile _______________ ______________________ _______________ _______________ _________ __
22 22
23 24 25 26 28 29 31 32 34 35 35
2.2. Tipo de datos real ______________________________ ____________________________________________________________ ______________________________ 36 2.2.1. Simple Simple y doble precisión precisión _______________ _______________________ _______________ _______________ _______________ ______________ _______ 36 2.2.2. Mostrar Mostrar en pantalla pantalla números reales reales _______________ ______________________ _______________ _______________ ______________ _______ 36 2.3. Operador de tamaño: sizeof ___________________________ ____________________________________________________ _________________________ 38 2.4. Operador de molde: molde: (tipo) operando___________________________________ operando_____________________________________________ __________ 39 2.5. Tipo Tipo de datos carácter carácter __________________________ ________________________________________________________ ______________________________ 40 2.5.1. Secuenc Secuencias ias de escape: \n y otras. ______________ ______________________ _______________ _______________ _______________ _________ __ 41 2.5.2. Introduc Introducción ción a las dificulta dificultades des de las cadenas cadenas de texto texto _______________ ______________________ ______________ _______ 41 3. Estructuras de control_____________________ control___________________________________________________ ________________________________________ __________ 42 3.1. Estructuras alternativas ______________________________ _______________________________________________________ _________________________ 3.1.1. if___________________ if___________________________ _______________ _______________ _______________ _______________ _______________ ______________ _______ 3.1.2. if y sentencias compuestas compuestas ______________ ______________________ _______________ _______________ _______________ ______________ _______ 3.1.3. Operadores relacionales: <, <=, >, >=, ==, !=__________________________ __________ 3.1.4. if-else if-else _______________ _______________________ _______________ _______________ _______________ _______________ _______________ ______________ _______
42 42 43 43 44
Revisión 0.90– Página 2
Fundamentos de programación en C, por Nacho Cabanes
3.1.5. Operadore Operadoress lógicos: &&, ||, ! _______________ ______________________ _______________ _______________ _______________ ____________ ____ 3.1.6. Cómo Cómo funciona realmente realmente la condición en un “if” _______________ ______________________ _______________ ___________ ___ 3.1.7. El El peligro peligro de la asignac asignación ión en un “if” “if” _______________ _______________________ _______________ _______________ ____________ ____ 3.1.8. Introduc Introducción ción a los diagrama diagramass de flujo _______________ _______________________ _______________ _______________ ____________ ____ 3.1.9. Operador condicional: condicional: ? _______________ ______________________ _______________ _______________ _______________ _______________ ________ _ 3.1.10. 3.1.10. switch switch _______________ _______________________ _______________ _______________ _______________ _______________ _______________ _____________ ______
46 46 47 50 52 53
3.2. Estructuras Estructuras repetitivas __________________________ ________________________________________________________ ______________________________ 3.2.1. while while _______________ _______________________ _______________ _______________ _______________ _______________ _______________ ______________ _______ 3.2.2. do ... while _______________ ______________________ _______________ _______________ _______________ _______________ _______________ ___________ ___ 3.2.3. for_____________ for_____________________ _______________ _______________ _______________ _______________ _______________ _______________ ____________ ____
54 54 55 56
3.3. Sentencia break: termina el bucle ___________________________ _______________________________________________ ____________________ 59 3.4. Sentencia continue: fuerza fuerza la siguiente iteración ______________________________ ___________________________________ _____ 60 3.5. Sentencia goto ____________________________ __________________________________________________________ ___________________________________ _____ 62 3.6. Más sobre diagramas de flujo. Diagramas Diagramas de Chapin. ______________________________ 63 3.7. Recomendación de uso de los distintos tipos de bucle bucle _______________________________ __________________________ _____ 65 4. Entrada/salida básica__________________________ básica________________________________________________________ ___________________________________ _____ 67 4.1. printf ____________________________________________________________ ______________________________ ________________________________________ __________ 67 4.2. scanf __________________________ ________________________________________________________ _____________________________________________ _______________ 69 4.3. putchar_______________________________________ putchar_________ ____________________________________________________________ ______________________________ 70 4.4. getchar _____________________________ ___________________________________________________________ ________________________________________ __________ 71 5.
Arrays y estructuras __________________________ ________________________________________________________ ___________________________________ _____ 73 5.1. Conceptos Conceptos básicos sobre sobre tablas _____________________________ _________________________________________________ ____________________ 5.1.1. Defini Definición ción de una una tabla y acceso acceso a los datos _______________ _______________________ _______________ ______________ _______ 5.1.2. Valor inicial inicial de una tabla _______________ _______________________ _______________ _______________ _______________ ______________ _______ 5.1.3. Recorriendo Recorriendo los elementos elementos de una tabla_________________ tabla________________________ _______________ _______________ _________ __
73 73 74 74
5.2. Cadenas de caracteres _______________________________ _ _______________________________________________________ _________________________ 5.2.1. Definici Definición. ón. Lectura desde teclado teclado ______________ ______________________ _______________ _______________ _______________ ________ _ 5.2.2. Cómo Cómo acceder a las letras que forman una cadena____________ cadena____________________ _______________ _____________ ______ 5.2.3. Longitud Longitud de la cadena. _______________ ______________________ _______________ _______________ _______________ _______________ _________ __ 5.2.4. Entrada/ Entrada/salida salida para para cadenas: cadenas: gets, puts ______________ ______________________ _______________ _______________ ____________ ____ 5.2.5. Asignan Asignando do a una cadena el valor valor de otra: strcpy, strcpy, strncpy; strcat strcat _______________ ______________________ _______ 5.2.6. Compa Comparando rando cadenas cadenas:: strcmp _______________ ______________________ _______________ _______________ _______________ ___________ ___ 5.2.7. Otras Otras funciones funciones de cadenas: cadenas: sprintf, sprintf, sscanf, strstr, strstr, … ______________ ______________________ _______________ ________ _ 5.2.8. Valor Valor inicial inicial de una cadena cadena de texto texto _______________ ______________________ _______________ _______________ _____________ ______
75 75 76 77 78 78 80 82 83
5.3. Tablas bidimensionales___________ bidimensionales_________________________________________ _____________________________________________ _______________ 84 5.4. Arrays indeterminados. ______________________________ _________________________ 85 5.5. Estructuras ________________________________________ _________________________ 5.5.1. Defini Definición ción y acceso acceso a los datos _______________ _______________________ _______________ _______________ _______________ _________ __ 5.5.2. Arrays Arrays de estructuras estructuras ______________ ______________________ _______________ _______________ _______________ _______________ ___________ ___ 5.5.3. Estructuras Estructuras anidadas_____ anidadas_____________ _______________ _______________ _______________ _______________ _______________ _____________ ______
85 85 87 87
5.6 Ejemplo completo ______________________________ ____________________________________________________________ ______________________________ 88 5.7 Ordenaciones simples _____________________________________ _______ __________________________________________________ ____________________ 92 6. Manejo de ficheros ___________________________________________ ____________________ 94 6.1. Escritura en un fichero de texto________________________ texto_________________________________________________ _________________________ 94 6.2. Lectura Lectura de un fichero fichero de texto ______________________________ __________________________________________________ ____________________ 95 6.3. Lectura Lectura hasta el final del fichero ____________________________ ________________________________________________ ____________________ 96 6.4. Ficheros con tipo __________________________ ________________________________________________________ ___________________________________ _____ 97 Revisión 0.90– Página 3
Fundamentos de programación en C, por Nacho Cabanes
6.5 Leer y escribir letra a letra _____________________________________________________ 98 6.6 Modos de apertura___________________________________ apertura_____ _______________________________________________________ _________________________ 98 6.7 Ficheros binarios _________________________________________ ____________________ 98 6.8 Ejemplo: Ejemplo: copiador de ficheros ______________________________ __________________________________________________ ____________________ 99 6.9 Acceder a cualquier posición de un fichero ______________________________ _______________________________________ _________ 101 6.10 Ejemplo: leer información de un fichero BMP _______________________________ ___________________________________ ____ 102 6.11. Ficheros especiales 1: la impresora ______________________________ ____________________________________________ ______________ 105 6.12. Ficheros especiales 2: salida de errores_________________ errores_________________________________________ ________________________ 106 6.13. Un ejemplo ejemplo de lectura y escritura: TAG de un MP3 __________________________ ______________________________ ____ 106 7. Introducción a las funciones ______________________________ ______________________________________________________ ________________________ 109 7.1. Diseño modular modular de programas: Descomposición modular modular __________________________ ____________ ______________ 109 7.2. Conceptos Conceptos básicos sobre sobre funciones __________________________ _____________________________________________ ___________________ 109 7.3. Parámetros de una función ___________________________ ___________________________________________________ ________________________ 110 7.4. Valor Valor devuelto por una función _____________________________ ________________________________________________ ___________________ 110 7.5. El valor de retorno “void”. “void”. El valor de retorno de “main”__________________________ “main” __________________________ 111 7.6. Variables locales y variables globales ___________________________________________ 112 7.7. Los conflictos de nombres en las variables ______________________________ _______________________________________ _________ 114 7.8. El orden importa __________________________ ________________________________________________________ __________________________________ ____ 116 7.9. Algunas funciones útiles ______________________________ ______________________________________________________ ________________________ 7.9.1. Números Números aleatorios aleatorios _______________ _______________________ _______________ _______________ _______________ _______________ __________ __ 7.9.2. Funcion Funciones es matemáticas matemáticas _______________ _______________________ _______________ ______________ _______________ _______________ _______ 7.9.3. Pero Pero casi todo son son funciones… funciones… _______________ _______________________ _______________ _______________ _______________ ________ _
117 117 119 120
7.10. Recursividad ____________________________ __________________________________________________________ __________________________________ ____ 121 7.11. Cómo Cómo interrumpir interrumpir el programa. ______________________________________________ ___________________________ ___________________ 123 8. Cómo depurar los programas ______________________________ ______________________________________________________ ________________________ 124 8.1. Conceptos básicos sobre depuración ______________________________ ____________________________________________ ______________ 124 8.2. Ejemplos Ejemplos de algunos entornos ______________________________ _________________________________________________ ___________________ 124 9. Punteros y gestión dinámica de memoria ______________________________ ____________________________________________ ______________ 127 9.1. ¿Por qué usar estructuras dinámicas? ____________________________ __________________________________________ ______________ 127 9.2. ¿Qué son los punteros? __________________________ _______________________________________________________ _____________________________ 128 9.3. Repasemos Repasemos con un ejemplo ejemplo sencillo____________________________________ sencillo______ _______________________________________ _________ 131 9.4. Aritmética de punteros __________________________ _______________________________________________________ _____________________________ 132 9.5. Punteros y funciones: parámetros por referencia _________________________________ ________________________ _________ 133 9.6. Punteros y arrays ______________________________ ___________________________________________________________ _____________________________ 135 9.7. Arrays Arrays de punteros _____________________________ __________________________________________________________ _____________________________ 136 9.8. Punteros y estructuras _______________________________________________________ _______________________________ ________________________ 137 9.9. Opciones de la línea de comandos: parámetros de “main”__________________________ “main” __________________________ 138 9.10. Estructuras dinámicas habituales 1: las listas enlazadas___________________________ 139 9.11. Estructuras dinámicas habituales habituales 2: los árboles binarios __________________________ 145 9.12. Indirección múltiple _______________________________________________ _________ 149 9.13. Un ejemplo: ejemplo: copiador de ficheros en una pasada _____________________________ _________________________________ ____ 149 Revisión 0.90– Página 4
Fundamentos de programación en C, por Nacho Cabanes
10. Bibliotecas de uso frecuente ______________________________ ______________________________________________________ ________________________ 151 10.1. Llamadas Llamadas al sistema: system _________________________________________________ ____________________ _____________________________ 151 10.2. Temporización___________________________ Temporización_________________________________________________________ __________________________________ ____ 151 10.3. Pantalla y teclado con con Turbo Turbo C ____________________________ _______________________________________________ ___________________ 154 10.4. Acceso a pantalla en Linux: curses.h___________________________________________ 156 10.5. Juegos multiplataforma: multiplataforma: SDL _____________________________ ________________________________________________ ___________________ 10.5.1. 10.5.1. Dibujando Dibujando una imagen imagen de fondo fondo y un personaje personaje _______________ ______________________ _______________ __________ __ 10.5.2. 10.5.2. Un personaje personaje móvil móvil ______________ ______________________ _______________ _______________ _______________ _______________ __________ __ 10.5.3. 10.5.3. Imágenes Imágenes transparen transparentes, tes, escribir escribir texto y otras otras mejoras mejoras _______________ ______________________ ____________ _____ 10.5.4. 10.5.4. El doble buffer buffer _______________ ______________________ _______________ _______________ _______________ _______________ _____________ ______ 10.5.5. 10.5.5. El bucle de juego (game loop) _______________ _______________________ _______________ _______________ _______________ ________ _
159 159 162 163 164 165
11. Otras características avanzadas de C ____________________________ _______________________________________________ ___________________ 167 11.1 Operaciones con bits _______________________________________________ _________________ _______________________________________ _________ 167 11.2 Directivas del preprocesador ______________________________ _________________________________________________ ___________________ 11.2.1. 11.2.1. Constantes Constantes simbólicas: simbólicas: #define ______________ ______________________ _______________ _______________ _______________ ________ _ 11.2.2 11.2.2 Inclusión Inclusión de ficheros: ficheros: #include _______________ _______________________ _______________ _______________ _______________ ________ _ 11.2.3. 11.2.3. Compilación Compilación condicional: condicional: #ifdef, #endif _______________ ______________________ _______________ _______________ ________ _ 11.2.4. 11.2.4. Otras directi directivas vas _______________ ______________________ _______________ _______________ _______________ _______________ ____________ _____
168 169 171 172 174
11.3. Programas Programas a partir de varios fuentes __________________________________________ _______________________ ___________________ 11.3.1. 11.3.1. Creación Creación desde la línea de comandos____ comandos___________ _______________ _______________ _______________ _______________ _______ 11.3.2. 11.3.2. Introducción Introducción al al uso de la herramienta herramienta Make Make ______________ ______________________ _______________ _____________ ______ 11.3.3. 11.3.3. Introducció Introducción n a los “proyectos”____ “proyectos”____________ _______________ ______________ _______________ _______________ ____________ _____
175 175 179 183
11.4 Uniones y campos campos de bits__________________________________ bits____ _________________________________________________ ___________________ 184 11.5. El El operador coma __________________________________________________________ __________________________________ ________________________ 185 11.6. Enumeraciones ___________________________________________________ _________ 186 11.7. Definición de tipos _____________________________________________________ ____ 187 Apéndice 1. Revisiones de este texto________________________________________________ texto________________________ ________________________ 189 Apéndice 2. Soluciones Soluciones a algunos de de los ejercicios propuestos_____________ propuestos___________________________ ______________ 191
Revisión 0.90– Página 5