tamaño: 42456B

Anuncio
FUNDAMENTOS DE INFORMÁTICA 1º IEM - ITL
Práctica 9: Punteros y memoria dinámica
CÓDIGO TÍPICO ASIGNACIÓN DINÁMICA DE MEMORIA:
pi=(int*)calloc(n, sizeof(int)); //asigno n elementos tipo int
if(pi==NULL) {
printf("Error al asignar memoria\n");
}
else{
...
pi[3]=7; //se utiliza igual que un vector estático
...
free(pi);
}
Este código cumple lo siguiente
• Sólo se accede a la memoria si ha sido asignada correctamente
• Si falla la asignación, se da un mensaje de error y la memoria ni se utiliza ni se intenta liberar.
• La memoria se libera con free cuando ya no hace falta.
Programa 1
Escribir un programa para leer una frase y recortarla al encontrar un carácter determinado. En este caso
se utilizará una función que maneja dos frases y va copiando caracteres de la frase1 en la frase2
La variable frase1 puede declararse en main como vector estático de tipo char, sin embargo frase2
debe declararse como puntero a char. Los pasos que se deben seguir son:
•
Leer frase1 con fgets, (versión segura de gets), y un carácter con scanf
•
Buscar el carácter dentro de la frase (mediante BuscarCaracter()) para determinar cuál será
la longitud de la frase resultante. Esta función devolverá dicha longitud, mediante paso por
referencia
•
Asignar memoria dinámica a la frase2 mediante calloc
•
Llamar a void Transformar(char *frase1, char *frase2, char c) para rellenar frase2
•
Mostrar por pantalla frase1 y frase2
•
Liberar la memoria asignada a frase2.
Nota: Hay que tener en cuenta los siguientes casos especiales en las funciones BuscarCaracter()
y Transformar():
•
La frase original puede estar vacía. En ese caso la frase resultante también estará vacía.
•
El carácter puede no estar contenido en la frase original. En ese caso la frase resultante será
igual a la frase original (se copian todos los caracteres).
Programa 2
Este ejercicio va a consistir en leer dos vectores de números de longitud variable (longitud que decidirá
el usuario y por lo tanto será necesario asignar dinámicamente memoria a los dos vectores) y
posteriormente calcular su producto escalar con otra función, devolviendo dicho resultado al programa
principal, que deberá mostrar tanto el resultado del producto escalar como los dos vectores.
El proceso descrito se repetirá un número indeterminado de veces a voluntad del usuario.
No olvidar liberar la memoria asignada dinámicamente cuando corresponda.
El producto escalar de dos vectores vec1 y vec2 de dimensión n es:
1
n
pe =∑ vec1[i] vec2[i]
i =1
Los prototipos de las funciones que se van a utilizar son:
•
Función para leer cualquiera de los vectores:
void LeerVector (float *vector, int n);
•
Función para calcular el producto escalar de dos vectores v1 y v2, y devuelve dicho
valor:
float ProductoEscalar (float *v1, float *v2, int n);
•
Función para mostrar cualquiera de los vectores:
void ImprimirVector (float *v, int n);
Programa 3
Escribir un programa que copie los números impares de un vector a otro, siguiendo los siguientes
pasos:
1. El programa principal lee un vector de enteros v1 de longitud variable (longitud que decidirá el
usuario y se debe asignar dinámicamente memoria al mismo). La lectura se realiza mediante una
función LeerVec().
2. A continuación se llama a la función ContarImpares() que cuenta cuántos números impares
hay en el vector y lo devuelve por referencia.
3. Asigna memoria dinámica a otro vector de enteros v2 (con capacidad para guardar posteriormente
los impares)
4. Llama a la función CopiaImpares(). Dicha función copia los números impares que hay en v1 al
vector v2
5. Llama a la función Mostrar() para mostrar por pantalla el vector resultante
6. Libera memoria. (Normalmente no se especifica en el enunciado este paso, el alumno siempre debe
recordar que al final debe liberar memoria)
Ejercicios de repaso. (Opcional)
•
Escribir un programa que calcule el producto de 2 matrices enteras, mediante llamada a una
función. El programa principal debe declarar 2 matrices (tamaño 3x3), e inicializarlas leyendo los
datos de teclado. A continuación se llamará a la función ProdMat() para calcular el producto de
ambas. El resultado no se muestra dentro de esta función sino en main, después de la llamada.
•
Escribir una nueva versión de la función Menu(), donde en lugar de devolver la opción elegida
por el usuario por valor (mediante el return), la devuelva por referencia (uso de puntero).
Escribir también el programa principal que llamaría a dicha función Menu()
Informe de la práctica
El informe de la práctica debe incluir: introducción, código fuente y salida comentada de los ejercicios
propuestos
2
Descargar