- Ajuste el Ejemplo 7.1 para que:
- Imprima el contenido del apuntador bPtr, es decir, la dirección en memoria de a que almacena bPtr.
- Modifique el valor de la variable a a través de aPtr.
- Declare una nueva variable de tipo entero b, asígnele un valor, haga que bPtr apunte a ella, y cambie el valor de b a través de bPtr.
- Trate de asignar directamente un valor distinto de cero (no use el operador de dirección) a cualquiera de los apuntadores ¿Qué sucede y por qué?
- Reescriba desde cero el Ejemplo 7.2. El objetivo de este ejercicio es replicar dicho ejemplo desde su perspectiva y compresión de los conceptos explicados en el blog.
- Modifique el Ejemplo 7.3 para que lea una cadena de la entrada estándar, y la envíe a las funciones imprimeAlReves e imprimeSinEspacios.
- Determine lo que realiza la siguiente función sin ejecutarla. Posteriormente, corrobore su respuesta con un programa que pruebe la función.
- Escriba un programa que pruebe cada una de las funciones de la biblioteca ctype. Su programa deberá probar al menos las funciones descritas en la entrada Aritmética de apuntadores, pero recuerde que dicha biblioteca contiene más funciones.
- Con base en el programa del Ejemplo 7.4, escriba una función análoga a la función convierteAMayusculas que convierta la cadena referida por cPtr a minúsculas; utilice las funciones de la biblioteca ctype descritas en la entrada Aritmética de apuntadores.
- 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 referidos por a con números aleatorios definidos entre 0 y rango - 1.
- 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 referidos por a, con el valor valor.
- 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 referidos por a, con c elementos por renglón.
- Siguiendo la propuesta planteada en el Ejemplo 7.5, escriba una función con el siguiente prototipo: void aMorse(const char *c). La función deberá imprimir en la salida estándar la representación en código Morse de la cadena referida por c. Dicha representación deberá estar separada por tabuladores '\t' por cada carácter de c. Cualquier otra cosa que NO sea una letra, imprimala tal cuál en la salida estándar.
- Con base en el Ejemplo 7.6 y a la notación de aritmética de apuntadores, substituya la línea 24 por el comentario correspondiente de la misma línea, y compruebe la equivalencia de la notación. Realice lo mismo intercambiando las líneas 26 y 27, y las líneas 28 y 29 respectivamente.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: int *copiaArreglo(const int *original, int n). La función deberá copiar los n elementos referidos por original en un arreglo que haya sido creado utilizando memoria dinámica dentro de la función, mismo que será utilizado como valor de retorno para la función.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: char *copiaCadena(const char *original). La función deberá copiar los elementos referidos por original, en un arreglo de caracteres que haya sido creado utilizando memoria dinámica dentro de la función, mismo que será utilizado como su valor de retorno.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: int compara(const char *c1, const char *c2 ). La función deberá determinar si los elementos referidos por c1 son iguales (regresa 1) o no (regresa 0) a los elementos referidos por c2.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: void imprimeAlReves(const char *original). La función deberá imprimir invertidos los elementos referidos por original. La función deberá usar recursividad para imprimir al revés los elementos referidos por original.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: char *invierteCadena(const char *original). La función deberá copiar invertidos los elementos referidos por original, en un arreglo de caracteres que haya sido creado utilizando memoria dinámica dentro de la función, mismo que será utilizado como su valor de retorno.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: void quitaEspacios(char *c). La función deberá eliminar (si los hubiera) cualquiera de los tipos de espacios de la cadena referida por c. Note que la función modifica la cadena original, por lo que deberá asegurarse de terminar adecuadamente la cadena con el fin de cadena '\0'.
- 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 referidos por c constituyen (regresa 1) o no (regresa 0) un palíndromo. Tome en cuenta que la función deberá ignorar espacios, signos de puntuación, signos de admiración e interrogación, comillas, etcétera, y que no hará distinción entre mayúsculas y minúsculas; se puede auxiliar de las funciones desarrolladas hasta el momento en los ejercicios y en los ejemplos del blog.
- Escriba un programa que defina y pruebe una función con el siguiente prototipo: void podar(char *c). La función deberá eliminar de la cadena c los espacios, si los hubiera, que se encuentren al principio y al final de c.
- Sugerencia: utilice la función isspace (ctype.h) para determinar cualquier tipo de espacio.
- Utilice notación y aritmética de apuntadores para desarrollar sus habilidades en el manejo de los apuntadores.
Se presentan más de 90 ejemplos resultado de un proceso evolutivo y ecléctico de fuentes, y simbiótico con relación a la experiencia docente y de trabajo con estudiantes con fundamento y adecuaciones del método constructivista (Piaget) teniendo como premisa fundamental: aprender haciendo.
14 de diciembre de 2016
Ejercicios selectos (apuntadores).
Etiquetas:
Apuntadores,
Arreglos,
cadenas,
char,
fin de cadena,
números aleatorios,
operador de desreferencia,
operador de dirección,
Parámetros por referencia,
Recursividad,
referencia
7 de diciembre de 2016
Encuesta Kahoot
Esta encuesta es con fines estrictamente cualitativos, no afecta en ningún sentido los resultados de su evaluación o del curso en general.
Puede ser contestada de manera anónima utilizando un seudónimo.
Para iniciarla, da clic aquí y espera las instrucciones del profesor.
Lo que se dice en el siguiente video en lo referente a Colombia y los colombianos, aplica también para México y los mexicanos:
Puede ser contestada de manera anónima utilizando un seudónimo.
Para iniciarla, da clic aquí y espera las instrucciones del profesor.
Lo que se dice en el siguiente video en lo referente a Colombia y los colombianos, aplica también para México y los mexicanos:
23 de noviembre de 2016
Ejercicios selectos (arreglos).
- 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.
- 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.
- Considere el Ejemplo 6.2 ¿Qué sucede si en lugar de que N sea 5, se cambia para que sea 500 o 5000?
- 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.
- 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:
- Cuál es la menor (float menor(float a[ ], int n);).
- Cuál es la mayor (float mayor(float a[ ], int n);).
- Cuáles y cuántas son aprobatorias y reprobatorias (void imprimeAprobatoriasReprobatorias(float a[ ], int n, float criterio);).
- 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. Considere que si rango < 2 , entonces, deberá llenar el arreglo con un número aleatorio sin restricción, i.e., tal cual lo que regresa la función rand( ).
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.
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.
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:
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.
- La ruta nos aportó otro paso natural.
- . . .
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.
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.
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.
Suscribirse a:
Entradas (Atom)

