Ejercicios de la sesión 2 de C resueltos 1. Encuentra los errores que hay en el siguiente trozo de código e indica la razón. #include <stdio.h> void media (int *a, int tam) /* 2 errores en esta función */ /* Calcula la media de un array de enteros de tamaño tam y devuelve el valor resultante */ { register float tot= 0; int i= 0; for (; i<=tam; i++) tot+= *a++; return tot/tam; } void minimo (int tam, a[]; float *res} /* 4 errores aquí */ /* Calcula el mínimo de un array de enteros de tamaño tam y almacena el resultado en res */ { res= a[tam]; for (; tam;) *res= *res < a[--tam] ? *res : a[tam]; return; } int main (void) /* 3 errores */ { int eje[3]= {3, 5, 1, 9, 3, 6, 9}; printf("Media: %g\n", media(eje, 7)); printf("Mínimo: %g\n", minimo(eje, 7); return; } Solución: Los errores se marcan a continuación en rojo y con un comentario en negrita: #include <stdio.h> void media(int *a, int tam) /* 2 errores en esta función */ // <-Debe devolver un float en lugar de void /* Calcula la media de un array de enteros de tamaño tam y devuelve el valor resultante */ { register float tot = 0; int i = 0; for (; i <= tam; i++) // <- Acceso a la posición n del array fuera de los limites tot += *a++; return tot / tam; } void minimo(int tam, a[]; float *res} /* 4 errores aquí */ // <- Definición de parámetros mal (falta el tipo del array, sobra el ;) // <- Uso de } en lugar de ) al final de la lista de parámetros /* Calcula el mínimo de un array de enteros de tamaño tam y almacena el resultado en res */ { res = a[tam]; // <- Acceso fuera de los límites for (; tam;) *res = *res < a[--tam] ? *res : a[tam]; return; // <- No es necesario, pero no está mal } int main(void) /* 3 errores */ { int eje[3] = {3, 5, 1, 9, 3, 6, 9}; // <- La mitad de los valores no sirven printf("Media: %g\n", media(eje, 7)); printf("Mínimo: %g\n", minimo(eje, 7); // <- No devuelve nada, falta un parentesis return; // <- Debe devolver un entero } 2. Escribe un procedimiento que reciba como entrada una matriz de float de tamaño n × m, donde n y m se pasan como parámetros. La función debe calcular el máximo y el mínimo de cada fila y columna. Esta función debe usar otras funciones más elementales, que calculen el máximo o el mínimo de una sola fila o columna. El resultado final deben ser dos arrays de registros con pares (max: double; min: double). Escribe un programa para probar el funcionamiento de la función. Solución: Una posible implementación se muestra en el siguiente código: include <stdio.h> #include <stdlib.h> /** * Tipo registro para guardar el máximo y el minimo de un vector */ typedef struct { double max; double min; } minmax; /** * La función maximovector calcula el valor mayor de una secuencia "a" * de tamaño "cuantos" cuyos miembros están separados por * "salto" posiciones en memoria */ float maximovector(float *a, int salto, int cuantos) { float max; int i = 1; for (max = a[0]; i < cuantos; i++) { if (a[i * salto] > max) max = a[i * salto]; } return max; } /** * La función minimovector calcula el valor menor de una secuencia "a" * de tamaño "cuantos" cuyos miembros están separados por * "salto" posiciones en memoria */ float minimovector(float *a, int salto, int cuantos) { float min; int i = 1; for (min = a[0]; i < cuantos; i++) { if (a[i * salto] < min) min = a[i * salto]; } return min; } /** * calculaminmax es un procedimiento que recibe como entrada una matriz de float de * tamaño n × m, donde n y m se pasan como parámetros. La función calcula * el máximo y el mínimo de cada fila y columna. El resultado final son dos arrays * de registros del tipo minmax con los pares (max: double; min: double) */ void calculaminmax(float *a, int m, int n, minmax filas[], minmax columnas[]) { int i; /* Primero calcularemos los valores para las filas, cada fila tiene "n" valores */ for (i = 0; i < m; i++) { filas[i].max = maximovector(a + i*n, 1, n); filas[i].min = minimovector(a + i*n, 1, n); } /* Y despúes para las columnas, cuyos "m" miembros están separados por "n" posiciones */ for (i = 0; i < n; i++) { columnas[i].max = maximovector(a + i, n, m); columnas[i].min = minimovector(a + i, n, m); } } /** * Programa de prueba del procedimiento calculaminmax */ int main(void) { int i; float f[2][3] = {{1, 2, 0} , {4, 2, 5}}; minmax filas[2], columnas[3]; calculaminmax(f[0], 2, 3, filas, columnas); printf("Resultado:\n"); for (i=0; i < 2; i++) { printf("* Fila nº %d: max: %f, min %f\n", i, filas[i].max, filas[i].min); } for (i=0; i < 3; i++) { printf("* Columna nº %d: max: %f, min %f\n", i, columnas[i].max, columnas[i].min); } return EXIT_SUCCESS; } 3. ¿Por qué son válidas las primeras dos asignaciones siguientes pero no la tercera? char cadena1[]= "Bien"; char *cadena2= "OK"; char cadena3[10]; cadena3= "Mal"; Solución: Está mal porque se hace una asignación entre arrays, operación no permitida en C.