2016-03-04 88 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|] 
相關問題