Solución a la Tarea 4: Centro de un Vector
Esta tarea se puede resolver en dos etapas: Primero leemos los datos y
luego calculamos el centro. Para lo primero podemos usar la
función:
void
lee(int *n, long int x[])
{
int i;
scanf("%d", n);
for (i = 0; i <= *n;
i++)
scanf("%ld",
&x[i]);
}
Para calcular el centro también podemos usar una función.
Observe que ésta trabaja probando cada uno de los valores de c hasta que encuentra uno que
satisface las condiciones del problema. ¿Porqué
sólo probamos valores de c desde 1 hasta n-1? Las variables izq y der acumulan los
términos de las sumas izquierda y derecha. ¿Porqué
incluimos el término i = c en ambas sumas? Si estas sumas son
iguales, el parámetro *s
se modifica para que valga el valor de la suma común y se
regresa el valor correspondiente de c. Si las sumas nunca son
iguales, entonces *s
queda con valor 0 y se regresa un -1. Note que, como esta
función calcula dos valores, al menos uno debía ser un
parámetro por referencia. Note también que izq y der deben ser long int, pues pueden tomar
valores muy grandes. ¿Qué tan grandes?
int
centro(int n, long int x[], long int *s)
{
int c, i;
long int izq, der;
*s = 0;
for (c = 1; c < n; c++)
{
izq = der = 0;
for (i = 0; i
<= c; i++)
izq += (c - i)*x[i];
for (i = c; i
<= n; i++)
der += (i - c)*x[i];
if (izq ==
der) {
*s
= izq;
return c;
}
}
return -1;
}
Finalmente, el programa principal simplemente usa las dos funciones
anteriores:
int
main(void)
{
int c, n;
long int s, x[1001];
lee(&n, x);
c = centro(n, x, &s);
printf("%d %ld\n", c, s);
return 0;
}
Los valores de entrada y salida empleados para la evaluación
fueron los siguientes:
Entrada
Salida
1 1
1
-1 0
2 1 1
1
1 1
3 1 2 1
1
-1 0
4 6 2 3 0
1
1 6
5 2 3 4 7 6
5
3 16
6 3 1 4 1 5 8
8 4 24
7 2 7 1 8 2 7 4 8
4 39
8 1 2 3 5 3 1 1 2 3 4 21
9 4 5 2 3 1 5 6 8 9 1 5 53
10 3 1 6 2 2 7 7 6 6 6 7 6 64
Para probar su tarea en UNIX, escriban la instrucción gcc centroNN.c -o centro para
compilar su programa, y la instrucción ./centro para correrlo.
En este caso, cada prueba vale dos puntos: uno para c y otro para s.
Algunos
errores comúnes fueron: (a) No leer las n+1 componentes del
vector. (b) No probar todos los valores de c entre 1 y n-1. (c) No
calcular las sumas correctamente. (d) No usar números de tipo
long int (aunque no
probé con números muy grandes).