2016-03-04 57 views
-3

为什么我得到0的输出?我认为我的角度转换和我的等式可能存在问题,但是摆弄它并移动一些东西总会给我相同的结果。为什么我得到0的输出0

我的目标是写一个C代码,将计算角度θ为任何两个给定的矢量u和v。

#include <stdio.h> 
#include <math.h> 


int main() 

{ 
    double ux, uy; 
    double vx, vy; 
    double inner_product(double vx, double vy, double ux, double uy); 
    double v; 
    double u; 
    double i; 
    double x; 
    double k; 
    double pi; 
    double angle; 
    double p; 
    ux = 1.0; 
    uy = 1.0; 
    vx = 1.0; 
    vy = 1.0; 



    printf ("input value for ux\n", ux); 
    scanf_s ("%f", &ux); 

    printf ("input value for uy\n", uy); 
    scanf_s ("%f", &uy); 

    printf ("input value for vx\n", vx); 
    scanf_s ("%f", &vx); 

    printf("input value for vy\n", vy); 
    scanf_s ("%f", &vy); 

    u = ux * vx; 
    v = uy * vy; 
    i = u * v; 
    x = u * u; 
    k = v * v; 
    pi = acos(-1.0); 
    p = acos(i/(sqrt(x * k))); 
    angle = ((p * 180)/pi); //converting from radians to degrees 


    printf("%f", angle); 

return; 

} 
+0

一个很好的开始将启用编译器警告,并消除它们。看看前几个'printf'调用。您传递的是未使用的值。为什么?删除它们。 –

+0

@TomKarzes通过删除ux = ...我得到未初始化的错误,我将如何能够消除这些错误? – DanielRossi

+0

@DanielRossi 1.初始化要读取的变量以防万一读数失败或检查读函数的返回值以检查读数是否成功。 2.删除'printf()'*的未使用*参数。请注意,'printf()'上的多余参数只是被评估和忽略,所以它们不会有害。 – MikeCAT

回答

2

数学错误是在以下几点:

p = acos(i/(sqrt(x * k))); 

将其更改为:

p = acos((ux*vx + uy*vy)/(sqrt(ux*ux + uy*uy) * sqrt(vx*vx + vy*vy))); 

这只是点积由两个长度划分。

0

%f%lf说明符已被使用通过读取具有类型double数据scanf()家庭。

注意%f应该用于打印数据经由printf()家庭有类型double因为float将自动转换到double为可变数量的参数。

+0

将它改为%lf仍然给我输出0 – DanielRossi

+0

“请注意,'%f'应该用于打印'double'类型的数据 - 不好的建议。由于C99'printf'也支持'%lf',它使用'double'。恰恰相反,为了保持一致性,'%f'应该总是保留为'float'和'float',在'printf'和'scanf'中都是。类型'double'的值应该总是与'%lf'一起使用,同样在'printf'和'scanf'中。在C99 *中特别增加了对'printf'中'%lf'的支持,以支持这种一致性。 – AnT

+0

@DanielRossi你的意见是什么?我输入了'180.000000',输入'10 20 -30 40'。检查你的配方。 – MikeCAT

1

你的公式是错误的。 正确的是:

|U|=√[Ux^2+Uy^2] 
|V|=√[Vx^2+Vy^2] 
U*V=(Ux,Uy)(Vx,Vy)=Ux*Uy+Vx*Vy 
cos=U*V/[|U|*|V|] 
相关问题