2016-03-04 6 views
-3

Почему я получаю вывод 0? Я думаю, что есть что-то не так в моей конверсии угла и, возможно, в моем уравнении, но все же возиться с ним и перемещать какой-то материал всегда дает мне тот же результат.Почему я получаю вывод 0

Моя цель состоит в том, чтобы написать код C, который вычисляет угол & для любых двух заданных векторов и и 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 следует использовать для печати данные, имеющего тип double через printf() семьи, потому что float будет автоматически преобразован в double аргументах переменного числа.

+0

Изменение этого параметра на% lf по-прежнему дает мне результат 0 – DanielRossi

+0

«Обратите внимание, что'% f' следует использовать для печати данных с типом 'double'" - плохой совет. Поскольку C99 'printf' также поддерживает'% lf', который работает с 'double'. Совсем наоборот, для согласованности '% f' должен быть * всегда * зарезервирован только для' float' и 'float' только в' printf' и 'scanf'. Значения типа 'double' должны * всегда * использоваться с'% lf', опять же, как в 'printf', так и' scanf'. Поддержка '% lf' в' printf' была добавлена ​​в C99 * специально * для поддержки этой согласованности. – 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|] 
Смежные вопросы