Quiz 03

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:


#include 

int 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;
}
]]>

Evaluación

  1. [40%] Implemente la función 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.
  2. [40%] Implemente la función dot_product() que recibe dos arreglos de números reales de igual tamaño y retorna el resultado de calcular su producto punto.
  3. [20%] ¿Qué hace el programa anterior si se invoca con un único número como parámetro? ¿qué hace si se invoca con un número impar de números reales? Estudie el cuerpo de la función main() para responder.
  4. [20% Opcional] Implemente la función print_vector() sin declarar ninguna variable local en el cuerpo de la función.