23 de noviembre de 2016

Ejercicios selectos (arreglos).

  1. Modifique el Ejemplo 6.1 de tal forma que imprima los 15 elementos del arreglo arreglo antes del ciclo for de la línea 13, con la finalidad de verificar que los elementos no inicializados explícitamente, son implícitamente inicializados a 0, tal y como se describe en el blog.
  2. Para el Ejemplo 6.1 suponga que N es 5 (línea 7) y que los inicializadores (línea 10) son: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ¿Qué sucede si existen más inicializadores que número de elementos para el arreglo? Haga un programa que compruebe su respuesta.
  3. Considere el Ejemplo 6.2 ¿Qué sucede si en lugar de que N sea 5, se cambia para que sea 500 o 5000?
  4. Basándose en el Ejemplo 6.3, haga un programa que procese arreglos de tipo float, no olvide modificar también los especificadores de formato correspondientes.
  5. Basándose en el ejercicio anterior, haga un programa que almacene un grupo de n calificaciones (cambie el tipo de dato a float), y determine con funciones:
    1. Cuál es la menor (float menor(float a[ ], int n);).
    2. Cuál es la mayor (float mayor(float a[ ], int n);).
    3. Cuáles y cuántas son aprobatorias y reprobatorias (void imprimeAprobatoriasReprobatorias(float a[ ], int n, float criterio);).
    4. Su media aritmética o promedio (float promedio(float a[ ], int n);).
     6. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void rellenaArreglo(int a[ ], int n, int rango);. La función deberá inicializar los n elementos del arreglo a, con números aleatorios definidos entre 0 y rango - 1. Así por ejemplo, si rango es 100, el arreglo a deberá contener n números entre 0 y 99.
     7. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void inicializaArreglo(int a[ ], int n, int valor);. La función deberá inicializar los n elementos del arreglo a, con el valor valor.
     8. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void imprimeArreglo(const int a[ ], int n, int c);. La función deberá imprimir en la salida estándar los n elementos del arreglo a, con c elementos por renglón.
     9. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void copiaArreglo(const int original[ ], int copia[ ], int n);. La función deberá copiar los n elementos del arreglo original en el arreglo copia.
     10. Escriba un programa que mida el tiempo en segundos para cada una de las funciones del Ejemplo 6.4. La intención de este ejercicio es determinar si existe o no una mejora en la eficiencia con las modificaciones descritas en el blog, ya que el algoritmo de ordenamiento no cambia, sólo se ha hecho, en principio, más eficiente. Para ello, su programa deberá:
  • Declarar dos arreglos de al menos 50,000 elementos cada uno.
  • Utilizar una función para inicializar uno de ellos con números aleatorios (Ejercicio 6).
  • Utilizar una función para copiar el arreglo inicializado en el segundo arreglo declarado (Ejercicio 9).
  • Enviar uno de los arreglos a la función burbuja y medir el tiempo que le toma ordenar los elementos.
  • Enviar el otro arreglo (la copia) a la función burbujaMejorado y medir el tiempo que le toma ordenar los elementos.
     11. Escriba un programa que pruebe las funciones del Ejemplo 6.5. Pruebe con datos leídos desde el teclado, con datos aleatorios, y verifique que las funciones de búsqueda trabajan de acuerdo a lo esperado. Nota: No olvide que la búsqueda binaria tiene como pre requisito que el conjunto de datos esté ordenado.
     12. Realice una prueba de escritorio para la función busquedaBinaria del Ejemplo 6.5 para que busque las siguientes claves: -4, 22, 1 y 13. Utilice el siguiente conjunto de búsqueda: -20, -4, 0, -9, 7, 10, 15, 22.
     13. Una vez que haya realizado las pruebas de escritorio propuestas en el ejercicio anterior, realice una implementación recursiva de la búsqueda binaria con base en la descripción hecha en el blog respecto de ésta.

Cadenas.

      1. Siguiendo las ideas expuestas en el blog respecto a los arreglos de caracteres (cadenas), escriba un programa que defina y pruebe una función con el siguiente prototipo: void copiaCadena(const char original[ ], char copia[ ]);. La función deberá copiar los elementos de la cadena original, en la cadena copia.
     2. Escriba un programa que defina y pruebe una función con el siguiente prototipo: void invierteCadena(const char original[ ], char invertida[ ]);. La función deberá copiar invertidos o al revés los elementos de la cadena original, en la cadena invertida. Puede utilizar las funciones desarrolladas con anterioridad.
     3. Las cadenas (arreglos de caracteres) no pueden ser comparadas utilizando el operador "==". Para este ejercicio, construya una función con el siguiente prototipo: int esIgualCon(const char c1[ ], const char c2[ ]);. La función deberá comparar la cadena c1 con la cadena c2, y regresar 1 si c1 es exactamente igual a c2 y 0 en caso contrario. Nota: la función determina la coincidencia exacta, tome en cuenta que las cadenas "Hola" y "hola" son distintas aunque digan lo mismo.
     4. Un palíndromo es una expresión que representa o expresa lo mismo si se lee de izquierda a derecha que de derecha a izquierda, como por ejemplo:
  • Madam.
  • 2002.
  • Anita lava la tina.
  • Dabale arroz a la zorra el abad.
  • .  .  .
      Escriba un programa que defina y pruebe una función con el siguiente prototipo: int esPalindromo(const char c[ ]);. La función deberá determinar si los elementos de la cadena c constituyen (regresa 1) o no (regresa 0) un palíndromo. Puede apoyarse de las funciones desarrolladas hasta el momento y por ahora, asuma que los elementos de la cadena no contendrán espacios y que todos los caracteres serán introducidos en minúsculas.
      5.  Escriba un programa que defina y pruebe una función con el siguiente prototipo: int cuentaPalabras(const char c[ ]);. La función deberá contar y retornar el número de palabras de la cadena c. Considere y analice todas las formas posibles en las que puede aparecer una palabra en una frase: signos de puntuación, interrogación, admiración, etcétera.
     6. Escriba un programa que defina y pruebe una función con el siguiente prototipo: int cambiaOcurrencia(char c[ ], char viejo, char nuevo);. La función deberá cambiar el carácter viejo por el carácter nuevo en toda la cadena c todas las veces que aparezca. La función regresa el número de cambios que realizó o cero si no hubo ningún cambio.
     7. Escriba un programa que obtenga la CURP (Clave Única de Registro de Población). La CURP se obtiene de la siguiente forma (verifique estas reglas para su propia CURP):
  • Primera letra y primera vocal del primer apellido.
  • Primera letra del segundo apellido.
  • Primera letra del nombre de la persona, en casos como José o María, de ser posible, se tomará la primera letra del segundo nombre.
  • Últimas dos cifras del año de nacimiento.
  • Dos cifras del mes de nacimiento.
  • Dos cifras del día de nacimiento .
  • Sexo de la persona: H (Hombre) o M (Mujer).
  • Dos Letras, correspondientes a la entidad de nacimiento. La entidad de nacimiento se obtiene como la primera letra de la entidad y la última consonante. En caso de extranjeros es NE (Nacido en el Extranjero).
  • Consonante del primer apellido (la primera si el primer apellido empieza con vocal, la segunda si empieza en consonante).
  • Consonante del segundo apellido (la primera si el primer apellido empieza con vocal, la segunda si empieza en consonante).
  • Consonante del nombre de la persona (la primera si el primer apellido empieza con vocal, la segunda si empieza en consonante).
  • Dos dígitos para evitar duplicidad (genérelos aleatoriamente).
  • En casos en los que las personas no tienen segundo apellido, o que la letra que corresponde insertar sea la letra Ñ, se utilizará en su lugar la X. Esto lo puede hacer desde la captura de datos para facilitar las cosas.
     8. Escriba un programa que defina y pruebe una función con el siguiente prototipo: int terminaCon(const char c1[ ], const char c2[ ]);. La función deberá determinar si la cadena c1 termina con la cadena c2. Si c2 aparece al final de c1, la función regresa 1 y 0 en caso contrario. Ejemplos:
  • terminaCon("Esto es un ejemplo", "templo"); (regresa 0).
  • terminaCon("Esto es un ejemplo", "contemplo"); (regresa 0).
  • terminaCon("Esto es un ejemplo", "es un ejemplo"); (regresa 1).
  • terminaCon("Zona de desastre", "sastre"); (regresa 1).
  • terminaCon("Zona de desastre", "tu sastre"); (regresa 0).
  • terminaCon("Zona de desastre", "zona de desastre"); (regresa 0).
  • terminaCon("Zona de desastre", "La zona de desastre"); (regresa 0).
     9. Escriba un programa que defina y pruebe una función con el siguiente prototipo: int contiene(const char c1[ ], const char c2[ ]); . La función deberá determinar si la cadena c1 contiene a la cadena c2. Si c2 aparece en alguna parte de c1, la función regresa 1 y 0 en caso contrario.
     10. Escriba una función con el siguiente prototipo: void imprimeAlReves(const char c[ ]); . La función deberá imprimir al revés recursivamente la cadena referida por c. Sugerencia: utilice el modificador static.