Проблема с написанием кода для движения снаряда

Я пытаюсь написать этот код, который вычисляет конечную высоту и продолжительность полета для снаряда, в то время как пользователь должен указать значения смещения, начальной скорости и угла запуска. Ошибок компиляции нет, но это скорее логическая ошибка, с которой я имею дело. Окончательное значение высоты совершенно неверно, как и продолжительность. Также после того, как я ввожу угол запуска, он не мгновенно вычисляет высоту и время. Вместо этого мне нужно нажать клавишу «вниз», а затем Enter для расчета. Я вызываю компилятор [ gcc -Wall -Werror -ansi -o task2.out task2.c -lm], за которым следует строка [./task2.out]

#include <stdio.h> /* access to scanf, printf functions */
#include <math.h> /* access to trignometric functions */
#define g 9.8 /* acceleration due to gravity constant */
int main(void){
    double v, theta, t, x, h2;
    /* v = initial velocity
    theta = launch angle
    t = time
    x = horizontal displacement
    h2 = final height
    */

    printf("Enter range of projectile>");
    scanf("%lf", &x); /* assigned x as a long float */

    printf("Enter velocity>");
    scanf("%lf", &v); /* assigned v as a long float */

    printf("Enter angle>");
    scanf("%lf", &theta); /* assigned theta as a long float */

    scanf("%lf", &t); /* assigned t as a long float */
    t = x/v*cos(theta); /* formula for time */

    scanf("%lf", &h2); /* assigned h2 as a long float */
    h2 = (t*v*sin(theta)) - (0.5*g*t*t); /* formula for height */

    printf("Projectile final height was %.2lf metres./n", h2); 
    printf("Projectile duration was %.2lf seconds", t );

    return 0;       
}

person garageman    schedule 24.03.2020    source источник
comment
Пожалуйста, инициализируйте переменные и проверяйте возвращаемое значение scanf() во всех случаях.   -  person Yunnosch    schedule 24.03.2020
comment
Вы получаете t от пользователя и тут же перезаписываете его результатом вычисления. Почему ?   -  person Paul R    schedule 24.03.2020
comment
Что вы увидите, если распечатаете все входные значения сразу после их сканирования?   -  person Yunnosch    schedule 24.03.2020
comment
Почему бы вам не использовать отладчик?   -  person armagedescu    schedule 24.03.2020
comment
Чтобы исправить неправильные значения, попробуйте t = x/(v*cos(theta));, это может исправить одно из них, в зависимости от того, что такое тета. Какую единицу вы ожидаете? Градусы(360)? Радианы (2 Пи)?   -  person Yunnosch    schedule 24.03.2020
comment
Второе значение, вероятно, должно быть h2 = (t*v*sin(theta)) - (0.25*g*t*t);, потому что максимальная высота достигается через половину времени. Предполагая вакуум и плоскую среду.   -  person Yunnosch    schedule 24.03.2020
comment
Я не совсем доволен людьми, которые задают вопрос, а затем уходят. Вздох.   -  person Yunnosch    schedule 24.03.2020


Ответы (2)


It doesn't instantly calculate. Это потому, что вы пытаетесь прочитать дополнительный номер

scanf("%lf", &t); /* assigned t as a long float */

Удалите эту строку. Формула в следующей строке вычисляет время.

Та же ошибка для высоты,

scanf("%lf", &h2); /* assigned h2 as a long float */

Удалите и эту строку.

person john    schedule 24.03.2020
comment
Точнее, дважды. Но как это объясняет неправильные значения? - person Yunnosch; 24.03.2020
comment
Вы имеете в виду, не спрашивая об этом, например, printf("Enter time>"); - person Paul Ogilvie; 24.03.2020
comment
@Yunnosch Да, я пропустил это. Я понятия не имею о неправильных значениях, но мог бы также исправлять одну ошибку за раз. - person john; 24.03.2020
comment
Именно поэтому множественные вопросы не приветствуются. - person Yunnosch; 24.03.2020

Предполагая несколько вещей (вакуум, плоская среда, большой радиус земли, угол, заданный через 2 Pi для полного круга, а не 360), ваши расчеты должны быть

t = x/(v*cos(theta));

потому что вам нужно разделить на горизонтальную часть скорости, а не на скорость, а затем умножить на косинус углов.

h2 = (t*v*sin(theta)) - (0.25*g*t*t);

Потому что максимальная высота достигается после половины продолжительности, а не после полной продолжительности.
Вот почему интеграл ускорения, связанного с гравитацией (0,5 * g * t * t), нужно вычесть только наполовину.

Проблема с необходимостью вводить больше вещей, чем просто числа, уже освещена в более раннем ответе Джона, см. Там.

person Yunnosch    schedule 24.03.2020