Vista previa del material en texto
viii | Prefacio excepciones. En cada etapa del proyecto se escriben los controladores para probar las clases conforme se crean. Esta organización muestra en acción al diseño y la programación orientados a objetos. Debido a que algunos de los ejemplos pequeños empleados en un capítulo encuentran su camino en el código de caso práctico, estos ejemplos han sido cambiados para que sean congruentes con los nuevos casos prácticos. Ejercicios Con excepción del capítulo 17, todos los ejercicios son nuevos. El número de ejercicios ha sido ampliado por entre veinte y treinta por ciento. Todos los problemas de programación son nuevos. Lenguaje orientado a objetos La lista TDA del capítulo 13 ha sido cambiada eliminando la operación Print e introduciendo un par de iteradores, Reset y GetNestItem. Este cambio proporciona mejor encapsulación. La lista no necesita saber nada acerca de los ítems que contiene. La lista simplemente devuelve objetos al programa cliente, que debe conocer cuáles son los objetos. La desventaja en este diseño se señala en el capítulo 14. Las operaciones Delete y BinSearch usan operadores relaciona- les, lo que limita el tipo de ítem a tipos integrados. En este capítulo, los operadores relacionales se remplazan por operaciones LessThan y Equal; la documentación establece que ItemType debe llevar a cabo estas operaciones. Se analizan también los conceptos de responsabilidades de acción y responsabilidades de conocimiento. El uso de clases para construir ítems cada vez más complejos se remarca en los casos prácticos. Cada clase se prueba de modo independiente, remarcando la importancia de probar. C++ y programación orientada a objetos Algunos profesores rechazan a la familia de lenguajes C (C, C++, Java) por ser demasiado permisiva y conducente a escribir programas no legibles y difíciles de descifrar. Nuestra experiencia no apoya este punto de vista, siempre que el uso de características de lenguaje se modele de manera apropiada. El hecho de que la familia C permita un estilo de programación conciso y compacto no se puede etiquetar simplemente como “bueno” o “malo”. Casi cualquier lenguaje de programación se puede usar para escribir en un estilo que es demasiado conciso e inteligente para que sea entendido con facilidad. La familia C se puede de hecho de esta manera con más frecuencia que los otros lenguajes, pero se ha encontrado que con instrucción cuidadosa en ingeniería de software y un estilo de pro- gramación que sea directo, disciplinado y libre de características de lenguaje intrincadas, los alumnos pueden aprender a usar C++ para producir código claro y legible. Se debe remarcar que aunque se usa C++ como un vehículo para enseñar conceptos de compu- tación, el libro no es un manual de lenguaje y no intenta hacer una cobertura completa de C++. Ciertas características de lenguaje, sobrecarga del operador, argumentos por omisión, información tipo tiempo de ejecución y mecanismos para formas avanzadas de herencia, por nombrar algunas, se omiten en un esfuerzo por no abrumar con mucho, demasiado rápido, al alumno principiante. Hay diversas opiniones acerca de cuándo introducir el tema de la programación orientada a ob- jetos (POO). Algunos profesores abogan por una inmersión en la POO desde el principio, mientras que otros (para quienes está dirigido este libro) favorecen un método más heterogéneo, en el que tanto la descomposición funcional como el diseño orientado a objetos se presentan como herramientas de diseño. La organización del capítulo de Programación y resolución de problemas con C++ refl eja un enfoque de transición a la POO. Aunque se provee una presentación anticipada del diseño orientado a objetos en el capítulo 4, se retrasa una discusión enfocada hasta el capítulo 14, después que los alumnos han adquirido bases fi rmes en el diseño de algoritmos, abstracción de control y abstracción de datos con clases. Sinopsis El capítulo 1 está diseñado para crear un entendimiento confortable entre los alumnos y el tema. Se presentan los conceptos básicos de hardware y software, se plantean cuestiones de ética en compu- tación y se introducen y refuerzan técnicas de resolución de problemas en un caso práctico de reso- lución de problemas. En lugar de abrumar inmediatamente al alumno con los distintos tipos numéricos disponibles en C++, el capítulo 2 se concentra en sólo dos tipos: char y string. (Para el último, se usa la clase de DALEPref.indd viiiDALEPref.indd viii 4/12/06 18:38:554/12/06 18:38:55 www.FreeLibros.me Prefacio | ix cadena ISO/ANSI proporcionada por la biblioteca estándar.) Con menos tipos de datos que seguir, los alumnos pueden centrar su atención en la estructura general del programa y lograr un comienzo temprano en la creación y ejecución de un programa simple. En el capítulo 3 se continúa con el análisis de los tipos numéricos de C++ y se procede con material sobre expresiones aritméticas, lla- madas de función y salida. A diferencia de muchos libros que detallan todos los tipos de datos de C++ y todos los operadores a la vez, estos dos capítulos se enfocan en los tipos de cadena int, fl oat, char y string, y los operadores aritméticos básicos. Los detalles de los otros tipos de datos y los operadores de C++ más elaborados se posponen hasta el capítulo 10. Las metodologías de descomposición funcional y de diseño orientado a objetos son un objetivo principal en el capítulo 4, y el análisis se escribe con un saludable grado de formalismo. El tratamien- to anticipado del diseño orientado a objetos en el libro es más superfi cial que la descomposición funcional. Sin embargo, los alumnos ganan la perspectiva oportuna de que hay dos, no sólo una, metodologías de diseño de uso extendido y que cada una sirve para un propósito específi co. El dise- ño orientado a objetos se cubre a profundidad en el capítulo 14. En el capítulo 4 se cubre también la entrada y la entrada y salida de archivos. La introducción temprana de archivos permite la asignación de problemas de programación que requiere el uso de archivos de datos muestrales. Los alumnos aprenden a reconocer funciones en los capítulos 1 y 2 y aprenden a usar las fun- ciones de biblioteca estándar en el capítulo 3. El capítulo 4 refuerza los conceptos básicos de llama- das de función, paso de argumentos y bibliotecas de función. El capítulo 4 relaciona también funcio- nes con la ejecución de diseños modulares, y comienza el análisis de diseño de interfaz que es esencial para escribir funciones apropiadas. El capítulo 5 comienza con datos booleanos, pero su propósito principal es introducir el concep- to de fl ujo de control. La selección, con estructuras If-Then e If-Then-Else, se emplea para demostrar la distinción entre orden físico de declaraciones y orden lógico. Se desarrolla también el concepto de estructuras de control anidadas. El capítulo 5 concluye con una sección larga de Prueba y depuración que se amplía en el análisis de diseño modular al introducir precondiciones y poscondiciones. El re- paso de algoritmo y el repaso de código se introducen como medios para evitar errores, y el segui- miento de la ejecución se usa para hallar errores que se pudieron haber cometido en el código. También se cubre de forma extensa la validación de datos y estrategias de prueba en esta sección. El capítulo 6 se dedica a las estrategias de control de bucles y operaciones iterativas por medio de sintaxis de la declaración While. En vez de introducir estructuras sintácticas múltiples, nuestro método es enseñar los conceptos de iteración usando sólo la declaración While. Sin embargo, debido a que muchos profesores nos han expresado que prefi eren mostrar a los alumnos la sintaxis para las declaraciones de iteración de C++ a la vez, el examen de las declaraciones For y Do-While del capí- tulo 9 se pueden cubrir después del capítulo 6. Por el capítulo 7 los alumnos ya se sienten cómodos con la descomposición de problemas en módulos y el uso defunciones de biblioteca, y son receptivos a la idea de escribir sus propias funcio- nes. Así, el capítulo 7 se centra en pasar argumentos por valor y cubre el fl ujo de control en llamadas de función, argumentos o parámetros, variables locales y diseño de interfaz. La cobertura del diseño de interfaz incluye precondiciones y poscondiciones en la documentación de interfaz, abstracción de control, encapsulación y ocultación física contra conceptual de una ejecución. En el capítulo 8 se amplía el análisis para incluir parámetros de referencia, alcance y tiempo de vida, talones y contro- ladores, y más sobre el diseño de interfaz, inclusive efectos secundarios. En el capítulo 9 se cubren las demás estructuras de control de C++ (Switch, Do-While y For), junto con las declaraciones Break y Continue. Estas estructuras son útiles pero no necesarias. El ca- pítulo 9 es un punto terminal natural para primer trimestre de una serie de cursos introductorios en dos trimestres. El capítulo 10 comienza la transición entre la orientación de estructuras de control de la primera mitad del libro y la orientación de tipo de datos abstractos de la segunda mitad. Se examinan los tipos de datos simples integrados en términos del conjunto de valores presentados por cada tipo y las operaciones permisibles en esos valores. Se introducen operadores adicionales de C++ y se examinan en detalle los problemas de presentación de punto fl otante y precisión. Los tipos simples defi nidos por el usuario, archivos de encabezado escritos por el usuario y coerción de tipo están entre los otros temas cubiertos en este capítulo. DALEPref.indd ixDALEPref.indd ix 4/12/06 18:38:574/12/06 18:38:57 www.FreeLibros.me x | Prefacio El capítulo 11 comienza con una explicación de tipos de datos simples contra estructurados. Se introduce el registro (struct en C++) como una estructura de datos heterogénea, se describe la sintaxis para tener acceso a sus componentes y se demuestra cómo combinar tipos de registro en una estruc- tura de registro jerárquica. De esta base, se procede al concepto de abstracción de datos y se da una defi nición precisa para la noción de un TDA, remarcando la separación de especifi cación y ejecución. El mecanismo de clase de C++ se introduce como una representación del lenguaje de programación de un TDA. Se remarcan los conceptos de encapsulación, ocultación de información y miembros de clase pública y privada. Se describe la compilación separada de archivos de programa, y los alumnos aprenden la técnica de colocar una declaración y ejecución de clase en dos archivos separados: el archivo de especifi cación (.h) y el archivo de ejecución (.ccp). En el capítulo 12 se introduce el arreglo como una estructura de datos homogénea a cuyos com- ponentes se tiene acceso por posición y no por nombre. Los arreglos adimensionales se examinan a profundidad, incluso arreglos de structs y arreglos de objetos de clase. El material sobre arreglos multidimensionales completa la discusión. El capítulo 13 integra el material de los capítulos 11 y 12 defi niendo la lista como un TDA. Debido a que ya se han introducido las clases y los arreglos, se puede distinguir claramente entre arreglos y listas desde el principio. El arreglo es una estructura de datos de tamaño fi jo, integrada. La lista es una estructura de tamaño variable, defi nida por el usuario, representada en este capítulo como una variable de longitud y un arreglo de ítems aglutinados en un objeto de clase. Los elemen- tos de la lista son aquellos elementos del arreglo de la posición 0 hasta la longitud de posición �1. En este capítulo, se diseñan clases de C++ para TDA de listas no clasifi cadas y clasifi cadas, y se co- difi can los algoritmos de lista como funciones de miembros de clase. Se usa la notación Big-O para comparar los distintos algoritmos de búsqueda y clasifi cación desarrollados para estos TDA. Por úl- timo, se examinan cadenas de C a fi n de dar a los alumnos cierta visión de cómo se podría ejecutar la abstracción de nivel superior (una cadena como una lista de caracteres) en términos de abstracción de nivel bajo (un arreglo char con terminación nula). En el capítulo 14 se amplían los conceptos de abstracción de datos y clases C++ a una explora- ción de desarrollo de software orientado a objetos. El diseño orientado a objetos, introducido de manera breve en el capítulo 4, se revisa con mayor profundidad. Los alumnos aprenden a distinguir entre relaciones de herencia y composición durante la fase de diseño y las clases derivadas de C++ se emplean para poner en práctica la herencia. En este capítulo se introducen también funciones virtua- les de C++, que apoyan el polimorfi smo en la forma de enlace de operaciones a objetos en tiempo de ejecución. En el capítulo 15 se examinan tipos de punteros y referencia. Se presenta a los punteros como una forma de hacer más efi cientes a los programas y de permitir la asignación en tiempo de ejecución de datos de programa. La cobertura de estructuras de datos dinámicos continúa en el capítulo 16, en el que se presentan listas enlazadas, algoritmos de listas enlazadas y representaciones alternas de listas enlazadas. En el capítulo 17 se introducen plantillas de C++ y el manejo de excepción, y en el capítulo 18 se concluye el texto con la cobertura de la recursión. No hay consenso en cuanto al mejor lugar para introducir estos temas. Se cree que es mejor esperar hasta por lo menos el segundo semestre para cu- brirlos. Sin embargo, se ha incluido este material para los profesores que lo han solicitado. Ambos capítulos han sido diseñados de modo que puedan ser asignados para leer junto con capítulos previos. Se sugiere la siguiente lectura de prerrequisitos para los temas de los capítulos 17 y 18: Sección o secciones Tema Prerrequisito 17.1 Funciones de plantilla Capítulo 10 17.2 Clases de plantilla Capítulo 13 17.3 Excepciones Capítulo 11 18.1-18.3 Recursión con variables simples Capítulo 8 18.4 Recursión con arreglos Capítulo 12 18.5 Recursión con variables de puntero Capítulo 16 DALEPref.indd xDALEPref.indd x 4/12/06 18:38:584/12/06 18:38:58 www.FreeLibros.me