4 de enero de 2017

Ejercicios selectos (doble apuntador).

  1. Tomando como base el Ejemplo 7.7, pruebe que las líneas 24 y 25 son intercambiables y reescriba la línea 26 utilizando notación de apuntadores en lugar de la notación de arreglos.
  2. La línea 30 del programa del Ejemplo 7.8 está comentada, ¿qué sucedería si se descomenta dicha línea, se compila y ejecuta nuevamente el programa? Determine su respuesta y posteriormente compruébese.
  3. Modifique la biblioteca de funciones del Ejemplo 7.7 para que las funciones trabajen con valores de tipo double. Genere una nueva biblioteca de funciones que gestione matrices con dicho tipo de dato.
  4. Escriba un programa que defina y pruebe una función con el siguiente prototipo: double **resta(double **a, double **b, int m, int n). La función deberá calcular la resta de la matriz a menos la matriz b de manera análoga a como lo hace la función suma del Ejemplo 7.7.
  5. Agregue la función resta del ejercicio anterior a la biblioteca de funciones creada en el Ejercicio 3.
  6. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void imprimeTranspuesta(double **a, int m, int n). La función deberá imprimir en la salida estándar la matriz transpuesta de a. La matriz transpuesta se genera convirtiendo los renglones en columnas y viceversa.
  7. Escriba un programa que defina y pruebe una función con el siguiente prototipo: double **transpuesta(double **a, int m, int n). La función deberá regresar la matriz transpuesta de a. La matriz transpuesta se genera convirtiendo los renglones en columnas y viceversa.
  8. Agregue la función transpuesta del ejercicio anterior a la biblioteca de funciones creada en el Ejercicio 3.
  9. Escriba un programa que defina y pruebe una función con el siguiente prototipo: int esSimetrica(double **a, int n). La función deberá determinar si la matriz a es o no simétrica. Una matriz simétrica es aquella que es igual con su matriz transpuesta.
  10. Agregue la función esSimetrica del ejercicio anterior a la biblioteca de funciones creada en el Ejercicio 3.
  11. Escriba un programa que defina y pruebe una función con el siguiente prototipo: double **producto(double **a, double **b, int m, int n, int l). La función deberá calcular el producto de las matrices a y b regresando su resultado. Investigue cómo se define y obtiene el producto de matrices antes de intentar realizar este ejercicio.
  12. Agregue la función producto del ejercicio anterior a la biblioteca de funciones creada en el Ejercicio 3.
  13. Considere el Triángulo de Pascal. Escriba un programa que, utilizando una matriz, calcule y presente el triángulo de Pascal. Sugerencia: llene inicialmente la matriz con 0's y al final imprima espacios para los ceros y los valores correspondientes para los coeficientes calculados.
  14. Sea A una matriz cuadrada, i.e. con el mismo número de renglones que de columnas. La matriz inversa de A, denotada por A*, se define como: A x A* = A* x A = I donde I es la matriz identidad. Escriba un programa defina y pruebe una función con el siguiente prototipo: double **inversa(double **a, int n). La función deberá calcular (si existe) la matriz inversa de la matriz a, tome en cuenta que si la matriz inversa de a no existe, la función deberá regresar NULL. Investigue cómo se calcula la matriz inversa de una matriz y utilice el método que más le convenga. Sugerencia: utilice el método de Gauss-Jordan.
  15. Agregue la función inversa del ejercicio anterior a la biblioteca de funciones creada en el Ejercicio 3.
  16. Escriba un programa que represente un laberinto por medio de una matriz, de tal forma que su programa:
    1. Permita generar con asignación dinámica de memoria una matriz cuadrada de tamaño n donde n > 2 . La matriz almacenará únicamente 0's y 1's, y se identificará como laberinto.
    2. Lea un entero que represente el porcentaje de obstáculos o de 1's que contendrá la matriz, de tal forma que si la matriz es de 10 x 10 por ejemplo y el porcentaje es 40, se deberán generar 40 1's de los 100 posibles valores a almacenar en la matriz. Determine el porcentaje con una división entera, es decir, sin considerar fracciones.
    3. Piense en una forma de distribuir los obstáculos sobre toda la matriz, tomando en consideración el porcentaje de 1's especificado en el punto anterior. Puede generar números aleatorios que representen los índices y colocar el obstáculo en esa posición siempre y cuando no exista ya uno ahí o corresponda a la entrada/salida del laberinto.
    4.  La siguiente figura muestra un laberinto de 5 x 5 con el 35% de obstáculos:
    5. Genere una sucesión de laberintos distintos en cada ejecución y asegúrese de que en la posición (0, 0) y (n - 1, n - 1) haya siempre 0's, ya que representan el inicio y la meta del laberinto respectivamente. Las reglas para caminar por el laberinto son las siguientes:
      1. Se intenta avanzar primero hacia la derecha, si se puede avanzar se continúa con este criterio, en otro caso, se prueba el siguiente criterio.
      2. Se intenta avanzar hacia abajo, si se puede avanzar se inicia recursivamente el intento de avance, si no se puede hacia abajo, se prueba el siguiente criterio.
      3. Se intenta avanzar hacia la izquierda, si se puede avanzar se inicia recursivamente el intento de avance, en caso de que no, se intenta con el siguiente criterio.
      4. Se intenta avanzar hacia arriba, si se puede, se inicia recursivamente el intento de avance hasta encontrar la meta (posición (n - 1, n - 1)).
    6. Su programa deberá encontrar, si existe, una solución al laberinto representado por la matriz laberinto haciendo uso de recursividad, donde los 0's representan caminos y los 1's obstáculos. Obviamente, los límites de la matriz representan también obstáculos. La solución estará indicada en formato de coordenadas de renglones y columnas, y por la naturaleza recursiva, la salida puede estar dada de la meta al inicio del laberinto. Para el laberinto representado en la figura anterior por ejemplo, la solución es: (4, 4) <= (4, 3) <= (4, 2) <= (3, 2) <= (2, 2) <= (1, 2) <= (1, 1) <= (0, 1) <= (0, 0).
    16. Con base en los Ejemplos 7.7 y 7.8, generalice las ideas expuestas en el blog para generar una estructura tridimensional como la de la entrada Arreglos de n dimensiones. La idea es que su programa permita leer valores de la entrada estándar para que sean asignados a su estructura tridimensional; así mismo, se requiere poder visualizar dichos valores en la salida estándar. Note que tendrá que hacer uso de un triple apuntador.
    17. Usando como referencia el Ejemplo 7.9 para procesar los argumentos en la invocación de programas, escriba un programa que procese entradas como las siguientes:
  •       $cambiaBase 101010101010 2 5
  •       $cambiaBase 1a4DEA 15 4
  •       $cambiaBase Fea 16 12
  •       $cambiaBase 12343102 5
   En general:   $cambiaBase Nb1 b1 b2, donde Nb1 es un número en base b1 y b2 representa la base a la que se convertirá Nb1 por medio de su programa. Su programa deberá también:
Verificar que Nb1 represente un número válido en la base b1, en caso de que no, deberá indicar dicha situación e identificar el primer dígito inválido:



Verificar que b1, b2 pertenezcan al conjunto {2, 3, . . ., 16}, ya que cualquier otra base se procesará e indicará como incorrecta.

Considerar que si b2 no se especifica, entonces Nb1 se convertirá a base 10 por omisión de b2.

Procesar mayúsculas o minúsculas en Nb1 para las bases que contienen letras como parte de sus "dígitos".

    18. Escriba un programa que permita realizar las cuatro operaciones aritméticas básicas de suma, resta, multiplicación y división para dos números de cualquier cantidad de “dígitos” representados en la misma base b, donde b pertenece al conjunto {2, 3, . . ., 16}.

    Tome en cuenta que ninguno de los tipos de datos de C tiene la capacidad solicitada, por lo que su programa deberá valerse de cadenas para la representación de dichos números, y realizar la implementación de las operaciones aritméticas tomando en cuenta dicha representación así como la manipulación simbólica de los "dígitos". En este sentido, es de esperarse que el resultado esté dado también por medio de una cadena, pero esto será transparente para el usuario.

     El programa no debe convertir los números a base 10, sino realizar las operaciones en la misma base en la que se expresan. Al igual que en el ejercicio anterior, su programa deberá:
  • Procesar y obtener antes que nada la base b de los operandos.
  • Presentar un menú con las opciones de operaciones aritméticas al estilo del Ejemplo 7.13, y utilizar un arreglo de apuntadores a funciones para invocar a la operación correspondiente de suma, resta, multiplicación o división.
  • Verificar que b pertenezcan al conjunto {2, 3, . . ., 16}, ya que cualquier otra base se procesará e indicará como incorrecta.
  • Verificar que los operandos representen un número válido en la base b, en caso de que no, deberá indicar dicha situación e identificar el primer dígito inválido.
  • Procesar mayúsculas o minúsculas en los operandos para las bases que contienen letras como parte de sus "dígitos".
Sugerencias:
  • Analice y resuelva primero el caso para la base 10, con la finalidad de poder generalizar su solución hacia las demás bases.
  • Resuelva primero las operaciones de suma y resta, y las de multiplicación y división resuélvalas con sumas y restas sucesivas respectivamente.