Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - 2013a
Profesor Jeisson Hidalgo-Céspedes
. Duración máxima: 20 minutos.
El producto escalar o producto punto (dot product) de dos vectores en \(\mathbb{R}^n\) es un número real que resulta de sumar el producto de cada entrada de ambos vectores. Algebraicamente si \(\vec{a}\) y \(\vec{b}\) son dos vectores definidos como \[\vec{a} = \left\langle a_1, a_2, \cdots, a_n\right\rangle\] \[\vec{b} = \left\langle b_1, b_2, \cdots, b_n\right\rangle\] su producto punto denotado por \(\vec{a} \cdot \vec{b}\) equivale al escalar \[\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n = \sum_{i=1}^{n}a_i b_i \]
Por ejemplo, en los 4 primeros quices del curso un estudiante \(A\) obtuvo las notas 100, 95, 0, 100, mientras que el estudiante \(B\) obtuvo 55, 85, 80 y 30. Dado que los quices estaban pesados en proporción a su grado de dificultad en 20%, 30%, 40% y 10% ¿cuál estudiante obtuvo mejor nota de quices? Para resolver problemas como este, se quiere un programa que reciba los valores de los dos vectores como argumentos de invocación, los imprima y calcule su producto punto, algo como:
* <0.2, 0.3, 0.4, 0.1> = 58.50 $ ./dotprod 55 85 80 30 .2 .3 .4 .1 <55.0, 85.0, 80.0, 30.0> * <0.2, 0.3, 0.4, 0.1> = 71.50 ]]>
El siguiente código fuente en C implementa esta funcionalidad, pero está incompleto:
#includeint main(int argc, char* argv[]) { if ( argc <= 2 ) return 0; double values[argc - 1]; for ( int i = 1; i < argc; ++i ) values[i - 1] = atof( argv[i] ); int n = argc / 2; print_vector(values, n); printf(" * "); print_vector(values + n, n); printf(" = %.2lf\n", dot_product(values, values + n, n) ); return 0; } ]]>
print_vector()
que recibe un arreglo de números reales y los imprime en la pantalla entre dos paréntesis angulares. Note que los valores se deben separar por comas, excepto el último.dot_product()
que recibe dos arreglos de números reales de igual tamaño y retorna el resultado de calcular su producto punto.main()
para responder.print_vector()
sin declarar ninguna variable local en el cuerpo de la función.