4.10. Ejercicios

Las soluciones a los ejercicios se pueden encontrar en el documento electrónico titulado «The Thinking in C++ Annotated Solution Guide», disponible por poco dinero en www.BruceEckel.com.

  1. En la librería C estándar, la función puts() imprime un array de caracteres a la consola (de modo que puede escribir puts("Hola")). Escriba un program C que use puts() pero que no incluya <stdio.h> o de lo contrario declare la función. Compile ese programa con su compilador de C. (algunos compiladores de C++ no son programas distintos de sus compiladores de C, es ese caso puede que necesite averiguar que opción de línea de comando fuerza una compilación C.) Ahora compílelo con el compilador C++ y preste atención a la diferencia.

  2. Cree una declaración de struct con un único método, entonces cree una definición para ese método. Cree un objeto de su nuevo tipo de dato, e invoque el método.

  3. Cambie su solución al Ejercicio 2 para que la struct sea declarada en un fichero de cabecera convenientemente «guardado», con la definición en un fichero cpp y el main() en otro.

  4. Cree una struct con un único atributo de tipo entero, y dos funciones globales, cada una de las cuales acepta un puntero a ese struct. La primera función tiene un segundo argumento de tipo entero y asigna al entero de l struct el valor del argumento, la segunda muestra el entero de la struct. Prueba las funciones.

  5. Repita el Ejercicio 4 pero mueva las función de modo que sean métodos de la struct, y pruebe de nuevo.

  6. Cree una clase que (de forma redundante) efectúe la selección de atributos y una llamada a método usando la palabra reservada this (que indica a la dirección del objeto actual)

  7. Cree una Stach que mantenga doubles. Rellénela con 25 valores double, después muéstrelos en consola.

  8. Repita el Ejercicio 7 con Stack.

  9. Cree un fichero que contenga una función f() que acepte un argumento entero y lo imprima en consola usando la función printf() de <stdio> escribiendo: printf("%d\n", i) donde i es el entero que desea imprimir. Cree un fichero separado que contenga main(), y este fichero declare f() pero aceptando un argumento float. Invoque f() desde main(). Intente compilar y enlazar el programa con el compilador C++ y vea qué ocurre. Ahora compile y enlace el programa usando el compilador C, y vea que ocurre cuando se ejecuta. Explique el comportamiento.

  10. Averigüe cómo generar lenguaje ensamblador con su compilador C y C++. Escriba una función en C y una struct con un único miembro en C++. Genere la salida en lenguaje ensamblador para cada una de ellas y encuentre los nombres de ambas funciones, de modo que pueda ver qué tipo de «decoración» aplica el compilador a dichos nombres.

  11. Escriba un programa con código condicionalmente-compilado en main(), para que cuando se defina un valor del preprocesador, se muestre un mensaje, pero cuando no se defina, se imprima otra mensaje distinto. Compile este experimentando con un #define en el programa, después averigüe la forma de indicar al compilador definiciones de preprocesador en la línea de comandos y experimente con ello.

  12. Escriba un programa que use assert() con un argumento que siempre sea falso (cero) y vea que ocurre cuando lo ejecuta. Ahora compílelo con #define NDEBUG y ejecútelo de nuevo para ver la diferencia.

  13. Cree un tipo abstracto de dato que represente un cinta de vídeo en una tienda de alquiler. Considere todos los datos y operaciones que serían necesarias para que el tipo Video funcione con el sistema de gestión de la tienda. Incluya un método print() que muestre información sobre el Video

  14. Cree un objeto Pila que almacene objetos Video del Ejercicio 13. Cree varios objetos Video, guárdelos en la Stack y entonces muéstrelos usando Video::print().

  15. Escriba un programa que muestre todos los tamaños de los tipos de datos fundamentales de su computadora usando sizeof.

  16. Modifique Stash para usar vector<char> como estructura de datos subyacente.

  17. Cree dinámicamente espacio de almacenamiento para los siguiente tipos usando new: int, long, un array de 100 char, un array de 100 float. Muestre sus direcciones y libérelos usando delete.

  18. Escriba una función que tome un argumento char*. Usando new, pida alojamiento dinámico para un array de char con un tamaño igual al argumento pasado a la función. Usando indexación de array, copie los caracteres del argumento al array dinámico (no olvide el terminador nulo) y devuelva el puntero a la copia. En su main(), pruebe la función pasando una cadena estática entre comillas, después tome el resultado y páselo de nuevo a la función. Muestre ambas cadenas y punteros para poder ver que tienen distinta ubicación. Mediante delete libere todo el almacenamiento dinámico.

  19. Haga un ejemplo de estructura declarada con otra estructura dentro (un estructura anidada). Declare atributos en ambas structs, y declare y defina métodos en ambas structs. Escriba un main() que pruebe los nuevos tipos.

  20. ¿Cómo de grande es una estructura? Escriba un trozo de código que muestre el tamaño de varias estructuras. Cree estructuras que tengan sólo atributos y otras que tengan atributos y métodos. Después cree una estructura que no tenga ningún miembro. Muestre los tamaños de todas ellas. Explique el motivo del tamaño de la estructura que no tiene ningún miembro.

  21. C++ crea automáticamente el equivalente de typedef para structs, tal como ha visto en este capítulo. También lo hace para las enumeraciones y las uniones. Escriba un pequeño programa que lo demuestre.

  22. Cree una Stack que maneje Stashes. Cada Stash mantendrá cinco líneas procedentes de un fichero. Cree las Stash usando new. Lea un fichero en su Stack, después muéstrelo en su forma original extrayéndolo de la Stack.

  23. Modifique el Ejercicio 22 de modo que cree una estructura que encapsule la Stack y las Stash. El usuario sólo debería añadir y pedir líneas a través de sus métodos, pero debajo de la cubierta la estructura usa una Stack(pila) de Stashes.

  24. Cree una struct que mantenga un int y un puntero a otra instancia de la misma struct. Escriba una función que acepte como parámetro la dirección de una de estas struct y un int indicando la longitud de la lista que se desea crear. Esta función creará una cadena completa de estas struct (una lista enlazada), empezando por el argumento (la cabeza de la lista), con cada una apuntando a la siguiente. Cree las nuevas struct usando new, y ponga la posición (que número de objeto es) en el int. En la última struct de la lista, ponga un valor cero en el puntero para indicar que es el último. Escriba una segunda función que acepte la cabeza de la lista y la recorra hasta el final, mostrando los valores del puntero y del int para cada una.

  25. Repita el ejercicio 24, pero poniendo las funciones dentro de una struct en lugar de usar struct y funciones «crudas».