PRÓL PRÓLOG OGO O A LA 2.ª 2.ª EDIC EDICIÓ IÓN N
INTRODUCCIÓN Bienvenido a Programación Programación en C, 2ª edición. El prólogo de la primera edición se abría con el interrogante ¿Por qué un libro de C al principio del siglo XXI ? El libro efectivamente lo escribimos en el año 2000 y fue publicado en el año 2001. En esta ocasión y cuatro años después, hemos escrito la nueva edición en el 2004 y 2005, y s e publicará en el 2005. ¿Qué ha cambiado desde entonces en el mundo de la programación? Realmente, poco y mucho. C sigue siendo el lenguaje más utilizado para aprender fundamentos y técnicas de programación tanto en la universidad como en los institutos tecnológicos y centros de formación profesional. C++ sigue reinando en el aprendizaje de la programación orientada a objetos y Java con C# se han erigido como los lenguajes por excelencia en el mundo profesional de programación, ingeniería de software, ingeniería web, telecomunicaciones y en general, industria del software. C es un lenguaje ideal para aprender programación de computadoras. C es un lenguaje muy compacto ya que su sintaxis es sencilla y fácil para aprender a escribir aplicaciones reales. Es también un lenguaje muy potente ya que se utiliza mucho en programación en todos los niveles, desde controladores de dispositivos y componentes de sistemas operativos hasta aplicaciones a gran escala. Existen compiladores de C para cualquier entorno de programación y de sistemas operativos, tales como Windows, Unix, Linux, Mac, etc., de modo que cuando usted haya aprendido C estará en condiciones de programar en cualquier cualquier contexto y entorno actual. También observará que C en una base excelente para continuar su formación en programación orientada a objetos con C++ y luego migrar a Java o C# en función del ambiente profesional en que se desenvuelva.. Todas las carreras universitarias de Ciencias e Ingeniería, así como los estudios de Formación Profesional, requieren un curso básico de algoritmos y de programación con un lenguaje potente y profesional pero que sea simple y fácil de utilizar. utilizar. C es idóneo para aprender a programar directamente las técnicas algorítmicas y de programación o bien en paralelo con asignaturas tales como Introducci Introducción, ón, Fundamentos Fundamentos o MetodoMetodología de la Programación cuando se utiliza un lenguaje algorítmico o un lenguaje de programación estructurada. C sigue siendo el lenguaje universal más utilizado y recomendado en planes de estudio de universidades y centros de formación de todo el mundo. Organizaciones como ACM, IEEE, colegios profesionales, siguen recomendando la necesidad del conocimiento en profundidad de técnicas y de lenguajes de programación estructurada con el objetivo de “acomodar” la formación del estudiante a la concepción, diseño y construcción de algoritmos y de estructuras de datos. El conocimiento profundo de algoritmos algoritmos unido a técnicas fiables, rigurosas y eficientes de programación preparan al estudiante o al autodidacta para un alto rendimiento en programación y para asumir los retos de la programación orientada a objetos en una primera fase y las técnicas y métodos inherentes a ingeniería de software en otra fase más avanzada.
XX mmProgramación en C: Metodología, algoritmos y estructura de datos
UN ENFOQUE CLÁSICO Y A LA VEZ INNOVADOR EN ELAPRENDIZAJE DE C La experiencia alcanzada con los varios años de vida de la primera edición de Programación en C. Metodología, algoritmos y estructuras de datos y su uso en facultades y escuelas de ingeniería, institutos tecnológicos y centros de formación profesional, nos ha llevado a considerar la necesidad de mantener el estilo de la primera edición intentando añadir nuevas características que redundasen en el aprendizaje eficiente de la programación en C, no sólo en el aspecto estético del libro sino y fundamentalmente en su estructura docente. Así pues, las características más distintivas de esta nueva edición son: Cada capítulo comienza con la enumeración del contenido de cada capítulo, una breve introducción que oriente al lector sobre los temas a tratar y una relación de términos y palabras clave que se introducirán como nuevos o bien se reiterará su uso por la importancia que pueda tener en el aprendizaje: • Ejemplos frecuentes para ayudar al aprendizaje. • Consejos teóricos y prácticos “A recordar” • “Consejos de programación” como ayuda al lector en su formación en programación • Sintaxis de las reglas gramaticales del lenguaje C • Ejecuciones de muestra de ejemplos y programas en C que permitan al lector habituarse en la depuración y puesta a punto de sus programas • Resumen al final de cada capítulo que facilite al lector la asimilación de los conceptos más importantes del mismo a modo de compendio y recordatorio teórico-práctico. • Ejercicios y Problemas propuestos al lector en cada capítulo, con el objetivo fundamental de evaluar y medir su progresión en el aprendizaje de la programación en C, tanto en el diseño y construcción del programa fuente, sino probando su eficiencia compilando y poniendo a punto el programa con el compilador que utilice en su centro académico en las prácticas de programación en el laboratorio o en sus horas de estudio en casa.
DIFERENCIAS IMPORTANTES CON LA PRIMERA EDICIÓN DE PROGRAMACIÓN EN C El libro se ha revisado en su totalidad y se ha vuelto a escribir conservando gran parte del contenido inicial. Se ha corregido y depurado la teoría, ejemplos y ejercicios, y se han incluido nuevos conceptos, ejemplos y ejercicios prácticos cuando se ha visto su necesidad desde el punto de vista docente y sobre todo en proceso de aprendizaje. Numerosos lectores, alumnos y colegas españoles y latinoamericanos nos han sugerido mejoras, nos han señalado erratas o incluso errores que teníamos en la primera edición, pero sobre todo nos han propuesto incluyamos algunos temas no tratados en la primera edición o bien ampliar algunos temas que estaban tratados pero no con extensión suficiente como el caso de la importante propiedad de la recursividad en el mundo de la programación profesional. Hemos tratado de incluir todas esas numerosas propuestas y, naturalmente, sus consejos. Esperamos haber sabido interpretar todas estas consideraciones de nuestros lectores y colegas, a los que desde ahora mismo deseamos agradecer su confianza en nuestra obra y su generosidad en la crítica de la primera edición. Sus críticas constructivas nos han animado constantemente en la escritura de esta segunda edición. Los capítulos que se han escrito nuevos son: 8, Recursividad (en la primera edición se incluían los conceptos básicos en el capítulo de funciones); 10, Algoritmos de ordenación y Búsqueda; 16, Organización de datos en un archivo y 17 Tipos abstractos de datos (TAD/Objetos). Otro cambio notable en la organización del libro se ha producido en los apéndices. La incorporación de los capítulos anteriores a la segunda edición, obligaba a un aumento considerable en el número total de páginas del libro cosa que por muchas razones no deseábamos, por lo que hemos optado por no incluir los apéndices de la 1ª edición e incluir sólo algunos imprescindibles en la edición en papel e incorporar los apéndices en
Prólogo a la 2.ª ediciónmm XXI
la página Web oficial del libro. Sin emb argo, la autorización de McGraw-Hi ll permite que el lector de esta segunda edición pueda tener todos los apéndices de la primera edición, así como alguno nuevo más, en la dirección oficial de Internet del libro (http:// www.mhe.es/joyanes) donde podrá consultar todos ellos y descargarse en su computadora aquellos que desee y necesite para su aprendizaje y formación actual o futura. También se incluirá en la página oficial del libro además de los apéndices, material didáctico complementario de los autores con normas, reglas, ejercicios y problemas resueltos, apuntes de clase, bibliografía actualizada, sitios web de referencia en programación, etc. que ayuden de forma gradual el aprendizaje del lector en su trayectoria profesional de programador o bien en sus estudios de informática o de sistemas computacionales, o en las diferentes ingenierías y áreas científicas.
LIBRO COMPLEMENTARIO DE LA SEGUNDA EDICIÓN DE PROGRAMACIÓN EN C Esta segunda edición al igual que la primera edición puede ser estudiada o leída en paralelo con la obra Programación en C. Libro de Problemas, de los autores de esta obra y de los profesores Andrés Castillo y Lucas Sánchez, editada por McGraw-Hill y que es una colección completa de ejercicios y problemas de programación. Pensando en esta nueva edición los cuatro autores anteriores hemos escrito un nuevo libro Problemas de C. en la colección Schaum de McGraw-Hill eminentemente teórico-práctico como son todos los pertenecientes a esta colección con el objetivo de ayudar a los lectores a superar sus exámenes y pruebas prácticas y mejorar su aprendizaje, que si bien tiene un carácter totalmente autónomo, se ha concebido y escrito de modo que propone y resuelve ejercicios y problemas propuestos en la segunda edición con una temática y contenido similar. Cualquiera de ambos libros puede ayudar al lector interesado en una formación complementaria totalmente práctica y paralela al contenido de esta segunda edición. De igual forma en la página Web oficial de McGraw-Hill, el lector podrá encontrar numerosos ejercicios y problemas propuestos y resueltos de programación en C (http:// www.mhe.es/joyanes)
¿QUÉ NECESITA PARA UTILIZAR ESTE LIBRO? Programación en C, 2ª edición, está diseñado para enseñar métodos de escritura de programas útiles tan rápido y fácil como sea posible, aprendiendo a la par tanto la sintaxis y funcionamiento del lenguaje de programación como las técnicas de programación y los fundamentos de construcción de algoritmos básicos. El contenido se ha escrito pensando en la posibilidad de que el lector sea:
• Una persona novata en la programación que desea aprender acerca de la programación y escritura de programas en C desde el principio. • Una persona con conocimientos básicos de programación que ha seguido cursos de iniciación en algoritmos o en lenguajes clásicos como BASIC o PASCAL o bien C++ o Java. El libro es eminentemente didáctico para enseñanza reglada de la programación de computadoras, pero no presupone ningún conocimiento previo de programación , por lo que puede ser también utilizado por lectores autodidactas con o sin formación en informática o en ciencias computacionales. Para utilizar este libro y obtener el máximo rendimiento. Se necesitará una computadora con un compilador C, una biblioteca instalada de modo que se puedan ejecutar los ejemplos del libro y un editor de texto para preparar sus archivos de código fuente. Existen numerosos compiladores de C en el mercado y también numerosas versiones shareware (libres de costes) disponibles en Internet. Idealmente., se debe elegir un compilador que sea compatible con la versión estándar de C del American Nacional Standards Institute (ANSI) que es la versión empleada en la escritura de este libro. La mayoría de los actuales compila-
XXIImmProgramación en C: Metodología, algoritmos y estructura de datos
dores disponibles de C++ , comerciales o de dominio público, soportan C, por lo que tal vez ésta pueda ser una opción muy recomendable. Usted puede utilizar cualquier editor de texto, tales como Notepad o Vi, para crear sus archivos de programas fuente, aunque será mucho mejor utilizar un editor específico para editar código C, como los que suelen venir con los entornos integrados de desarrollo bien para Windows bien para Linux. Sin embargo, no deberá utilizar un procesador de textos, tipo Microsoft Word, ya que normalmente los procesadores de texto o de tratamiento de textos comerciales, incrustan o “embeben” códigos de formatos en el texto que no serán entendidos por su compilador. En cualquier forma si usted sigue un curso reglado, el mejor método para estudiar este libro es seguir los consejos de su maestro y profesor tanto para su formación teórica como para su formación práctica. Si usted es un autodidacta o estudia de modo autónomo, la recomendación entonces será que compile, ejecute y depure de errores sus programas, tanto los propuestos en el libro, como los que usted diseñe, a medida que vaya leyendo el libro, tratando de entender la lógica del algoritmo y la sintaxis del lenguaje en cada ejercicio que realice.
¿CÓMO ESTÁ ORGANIZADO EL LIBRO? Todos los capítulos siguen una estructura similar que respeta el formato de la primera edición. Así, cada capítulo comienza con un extracto del contenido, una breve introducción al capítulo y una lista de los conceptos y términos más importantes del capítulo. La descripción teórica y práctica se acompaña de numerosos ejemplos y ejercicios prácticos con el objetivo fundamental de que el lector/alumno vaya aprendiendo a la par que sigue y estudia su contenido. A continuación se incluye un resumen con un recordatorio de los conceptos teóricos y/o prácticos más importantes del capítulo. Por último se incluyen una serie de descripciones de ejercicios de nivel de iniciación y medio, junto con otra lista de enunciados de problemas propuestos, con el objetivo fundamental que el lector/alumno practique y vea la progresión realizada con el seguimiento del libro así co mo de sus clases teórico-prácticas en s u centro de enseñanza. El libro se ha dividido en tres partes que buscan facilitar la lectura y estudio por parte del lector/alumno o bien la organización del profesor o maestro para la impartición de sus clases, de modo que pueda organizarse sus clases en la manera que mejor considere para conseguir la máxima eficacia y el objetivo final de un aprendizaje correcto y el dominio de la programación en C tanto a nivel de iniciación como a nivel medio, que le faculten para iniciar su profesión de “programador de C” o bien pasar a “cursos de nivel avanzado de programación en C” o inclusive de programación de sistemas. La parte I “Metodología de la programación” es una introducción a las computadoras, a los lenguajes de programación y a las técnicas y herramientas típicas de programación con independencia del lenguaje de programación utilizado. La parte II “Fundamentos de algoritmos y programación en C” es un primer curso de introducción a la programación de computadoras utilizando el lenguaje C; en general, este curso será similar a cualquier curso de Introducción a la programación, Metodología de la Programación o Fundamentos de Programación con C como herramienta de programación; , inclusive no le será difícil su adaptación a cualquier lenguaje de programación algorítmico con unas reglas sencillas de traducción de sintaxis entre lenguajes. La parte III “Estructura de Datos”, es un curso de nivel medio sobre un tema tan importante en la programación como es la organización de los datos en estructuras de datos y de la información; esta parte se debería estudiar a continuación de la primera parte, aunque el orden de los temas puede quedar al arbitrio del lector y o del profesor y maestro; en cualquier forma constituyen temas avanzados en C y son requisito imprescindible para la programación profesional en C; en esta parte se estudia también el concepto de Tipos Abstractos de Datos (TAD, ADT en inglés, Abstract Data Type) y su implementación en C que será la base para el estudio posterior de la programación orientada a objetos a nivel teórico y posteriormente práctico con lengua jes como C++, C# o Java.
Prólogo a la 2.ª ediciónmm XXIII
Capítulo 1. Introducción a las computadoras y a los lenguajes de programación. Explica y describe los
Capítulo 2.
Capítulo 3.
Capítulo 4.
Capítulo 5. Capítulo 6.
Capítulo 7.
Capítulo 8.
Capítulo 9. Capítulo 10.
conceptos fundamentales de la computación y de los lenguajes de programación. El conocimiento completo del contenido del capítulo no es requisito imprescindible para el conocimiento y aprendizaje de los restantes capítulos aunque si es fundamental en su formación de programación. Por estas circunstancias el lector/alumno puede optar por su estudio en una sola vez o bien graduar el aprendizaje a lo largo de todo su curso de programación. Siempre se cuenta también con el profesor y maestro que podrá orientar al alumno en su progresión docente. Para los lectores que no hayan recibido ningún curso de introducción a las computadoras o a la informática les recomendamos su lectura antes de pasar al siguiente capítulo y luego una relectura en el momento y forma que ellos mismos consideren. Este capítulo ha sido actualizado totalmente respecto a la primera edición y se han introducido tanto los conceptos fundamentales y genéricos tradicionales como las últimas innovaciones tecnológicas que más afectan al mundo de la programación. Metodología de la programación y desarrollo de software. Se introduce al lector en los conceptos fundamentales de algoritmos y sus herramientas de representación. Asimismo, se describen los tipos clásicos de programación con especial énfasis en la programación estructurada soporte del lenguaje C. Una breve introducción al ciclo de vida del software y a los métodos formales de verificación de programas pretende que el lector se mentalice desde el comienzo de su formación en programación en la importancia de estos temas en el desarrollo de software fiable y eficiente. El lenguaje C. Elementos básicos. Introduce a la estructura y los componentes principales de un programa en C. Enseña los significados de los elementos fundamentales de todo programa, tales como datos, constantes, variables y las operaciones básicas de entrada/salida. Operadores y expresiones. Se describe el uso de los operadores aritméticos, relacionales y lógicos para la manipulación de operaciones y expresiones en C. Se estudian también operadores especiales y conversiones de tipos, junto con reglas de prioridad y asociatividad de los operadores en las expresiones y operaciones matemáticas. Estructuras de selección: sentencias if y switch. Introduce a las sentencias de selección básicas y fundamentales en cualquier programa. Se examina el uso de sentencias compuestas o bloques así como el uso de operadores condicionales y evaluación de expresiones lógicas. Estructuras de control: bucles. Se aprende el concepto de bucle o lazo y el modo de controlar la ejecución de un programa mediante las sentencias for, while y do-while. También se explica el concepto de anidamiento de bucles y bucles vacíos; se proporcionan ejemplos útiles para el diseño eficiente de bucles. Funciones. Examina las funciones en C, una parte importante de la programación. Se describe el concepto de programación estructurada – un método de diseño de programas que enfatiza en el enfoque descendente para la resolución de problemas mediante la descomposición de un problema grande en problemas de menor nivel que se implementan a su vez con funciones. Recursividad. La recursividad o propiedad de una función o expresión de llamarse a sí misma es una de las técnicas más importantes en la construcción de algoritmos. Por esta razón se dedica un capítulo completo al aprendizaje de las funciones recursivas. En la primera edición este concepto se estudiaba dentro del capítulo de funciones. Arrays (listas y tablas). Explica un método sencillo pero potente de almacenamiento de datos. Se aprende como agrupar datos similares en arrays o “arreglos” (listas y tablas) numéricas Algoritmos de ordenación y búsqueda.. Enseña los métodos para ordenar listas y tablas, así cómo búsqueda de datos en listas y tablas. Se estudian los algoritmos clásicos más sencillos y eficientes tanto de ordenación como de búsqueda.
XXIV mmProgramación en C: Metodología, algoritmos y estructura de datos
Capítulo 11 Estructuras y uniones. Se describen conceptos básicos de estructuras, uniones y enumeraciones: declaración, definición, iniciación, uso y tamaño. Las operaciones fundamentales de acceso a estructuras, arrays de estructuras y estructuras anidadas se analizan también en este capítulo. En el capítulo se muestra de modo práctico como usar estructuras y uniones para conseguir las necesidades del programa; se explican las diferencias entre estructuras y uniones, así como el uso de la palabra reservada typedef. Capítulo 12. Punteros (Apuntadores). Presenta una de las características más potentes y eficientes del lenguaje C, los punteros. Este capítulo proporciona explicación detallada de los punteros, arrays de punteros, punteros de cadena, aritmética de punteros, punteros constantes, punteros como argumentos de funciones, punteros a funciones y a estructuras. De un modo práctico aprende el modo de utilizar punteros a punteros y cómo se pueden utilizar los arrays de punteros para manipular las cadenas, que se estudiarán en profundidad en el capítulo 14. Capítulo 13. Asignación dinámica de memoria. Se describe la gestión dinámica de la memoria y las funciones asociadas para esas tareas: alloc( ), free( ), calloc( ) y realloc( ). Se proporcionan reglas de funcionamiento de esas funciones y reglas para asignación de memoria. Capítulo 14. Cadenas. Se describe el concepto de cadena (string) así como las relaciones entre punteros, arrays y cadenas en C. Se introducen conceptos básicos de manipulación de cadenas junto con operaciones básicas tales como longitud, concatenación, comparación, conversión y búsqueda de caracteres y cadenas. Se describen las funciones más notables de la biblioteca string.h. Capítulo 15. Entrada y salida de archivos. Se estudia el concepto de flujo (stream) y los diferentes métodos de apertura de archivos, junto con los conceptos de archivos binarios y funciones para el acceso aleatorio. Muestra de un modo práctico como C utiliza los flujos, examina los flu jos predefinidos y el modo práctico de trabajar con la pantalla, la impresora y el teclado. Capítulo 16. Organización de datos en un archivo. Los conceptos clásicos de registros y organización de archivos se estudian en el capítulo. Dos tipos de archivo especiales tales como los secuenciales indexados y con direccionamiento hash son motivo de estudio específico. Por último se analizan métodos de ordenación de archivo tanto externa como por mezcla directa. Capítulo 17 Tipos de datos (TAD/Objetos). La programación orientada a objetos es el paradigma más importante después del paradigma estructurado. El rol de la abstracción, la modularidad y los tipos abstractos de datos son analizados en este capítulo. Se desciben la especificación e implementación de tipos abstractos de datos en C como primer nivel de objetos. Capítulo 18. Listas enlazadas. Una lista enlazada es una estructura de datos que mantiene una colección de elementos, pero el número de ellos no se conoce por anticipado o varía en un rango amplio., La lista enlazada se compone de elementos que contienen un valor y un puntero. El capítulo describe los fundamentos teóricos, tipos de listas y operaciones que se pueden realizar en la lista enlazada. Capítulo 19. Pilas y colas. Las estructuras de datos más utilizadas desde el punto de vista de abstracción e implementación son las pilas y colas. Su estructura, diseño y manipulación de los algoritmos básicos se explican en el capítulo. Capítulo 20 Árboles. Las estructuras de datos no lineales y dinámicas son muy utilizadas en programación. Los árboles son una de las estructuras más conocidas en algoritmia y en programación ya que son la base para las técnicas de programación avanzada.
Prólogo a la 2.ª ediciónmm XXV
APÉNDICES
A Compilación de programas C en Windows B Bibliografía y recursos de programación APÉNDICES DISPONIBLES EN LA WEB
W1 W2 W3 W4 W5 W6 W7 W8 W9
Código ASCII Palabras reservadas C/C++ Lenguaje ANSI C. Guía de referencia Guía de sintaxis ANSI/ISO C++ Biblioteca de funciones ANSI C Recursos de C (libros, revistas, web) C versus C++ Prioridad de operadores C/C++ Lenguaje algorítmico UPSAM 2.0