Logo Studenta

programacion c ejercicios resueltos-4


User badge image

Juan Gimenez

¡Estudia con miles de materiales!

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

Más contenidos de este tema