Resolución de ejercicios

Anuncio
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.
Descargar