проблема с использованием уравнения в функции - PullRequest
1 голос
/ 27 февраля 2011

Напишите программу, которая определяет, как далеко и как долго будет путешествовать камень, когда вы сбросите его со скалы. Нажмите здесь, чтобы скопировать файл toss.txt на рабочий стол (щелкните правой кнопкой мыши имя файла и выберите «Сохранить как»). Файл содержит высоту обрыва в метрах.

Программа будет:

  1. Откройте файл toss.txt и считайте высоту обрыва в переменную двойной точности, затем эхо-печать значения высоты обрыва на экране с соответствующей меткой.

  2. Спросите пользователя, под каким углом брошен камень (90 градусов - прямо вверх, а 0 градусов - прямо вперед) и скорость, с которой камень брошен (в милях в час).

  3. Убедитесь, что угол больше или равен 0 и меньше или равен 90. Если это не так, программа завершает работу и выводит соответствующее сообщение об ошибке на экран.

  4. Убедитесь, что скорость меньше или равна 100 миль в час и больше или равна 0 миль в час. Если это не так, программа завершает работу и выводит соответствующее сообщение об ошибке на экран.

  5. Если угол и скорость действительны, программа выполняет вычисления следующим образом:

    1. Преобразует мили в час в метры в секунду.

    2. Преобразует угол в радианы.

    3. Рассчитывает время, пройденное с использованием следующих уравнений:

      , где

    4. Рассчитывает расстояние, пройденное в горизонтальном направлении, используя:

  6. Выводит время и расстояние, пройденное в горизонтальном направлении, на экран с соответствующими метками.

  7. Печатает соответствующее сообщение, сообщающее пользователю, было ли пройденное расстояние в горизонтальном направлении больше, меньше или равно высоте скалы.

    /* This program */
    
    using namespace std;
    
    #include<iostream>
    #include<cmath>
    #include<iomanip>
    #include<fstream>
    
    int readit ();
    int calcit (double, double, double);
    
    int main()
    {
        readit ();
    
        system ("pause");
    
        return 0;
    }
    
    int readit ()
    {
        double hite, angl, v;
    
        ifstream datain ( "toss.txt" );
    
        datain >> hite;
    
        cout << "The cliff height is " << hite << " meters"<< endl;
    
        cout << "Enter the angle in degrees (from horizontal) the rock is thrown: "
             << endl;
    
        cin >> angl;
    
        if (angl>=0 && angl<=90)
        {
           cout << endl << "The angle you have entered is "<<angl<< endl <<endl;
        } 
           else
        {
           cout << "The angle you have entered is not acceptable" << endl;
    
           return 0;
        }
    
        cout << "Enter the velocity in mph the rock is thrown: " << endl;
    
        cin >> v;
    
        if (v>=0 && v<=100)
        {
           cout << endl << "The velocity at which the rock is thrown is "<<v<<
                 " mph" << endl << endl;
        } 
           else
        {
           cout << "The velocity you have entered is not acceptable" << endl;
    
           return 0;
        }
    
        calcit (hite, angl, v);
    }
    
    int calcit (double hite, double angl, double v)
    {
        double tyme, dist;
    
        v = v * (1609.344/3600);
    
        angl = angl*(M_PI/180);
    
        tyme = -v*sin(angl) + (sqrt((v*sin(angl)*v*sin(angl)) + 2*9.8*hite)/9.8) + (2*(v*sin(angl))/9.8);
    
        dist = (tyme * v) * cos(angl);
    
        cout << tyme << " " << dist <<endl;
    
    
    
    
    }
    

Я пытаюсь определить правильное время прохождения камня до того, как он упадет на землю, но я продолжаю получать неправильные ответы. Я не уверен, поворачиваю ли я уравнение, чтобы выяснить, когда рок будет в воздухе, пока не произойдет воздействие на язык с ++. у кого есть идеи ??? Мне действительно нужно закончить этот чертов проект.

Ответы [ 4 ]

2 голосов
/ 27 февраля 2011

Исходя из уравнения для y (высота выше 0) для камня, мы имеем

y = h + v*sin(a)*t - g/2*t^2

, который превращается в

g/2 T^2 - v*sin(a)*T - h == 0

когда мы решаем для конечного условия y(T)=0.

Это дает

T = v*sin(a)/g + sqrt(v*sin(a)*v*sin(a) + 2*g*h)/g

Я просто не могу понять, откуда взялась первая часть -v*sin(angl) в вашем уравнении. Все остальное выглядит просто отлично. Так что, похоже, дело не в вашем коде, а в уравнении, с которого вы начали.

0 голосов
/ 27 февраля 2011

Если в коде есть запутанная формула, просто вводите больше имен переменных, пока значение не станет очевидным.До тех пор, пока вы не переназначаете разные значения одним и тем же переменным, это не вызовет путаницы в программе.

int calcit (double hite_meters, double angl_deg, double v_mph)
{
    double const gravity = 9.8;
    double v_ms = v_mph * (1609.344/3600);
    double angl_rad = angl_deg * (M_PI/180);
    double v_vertical = v_ms * sin( angl_rad );
    double time_up = v_vertical / gravity; // [m/s] / [m/s^2] = [s]
    double time_down_over_cliff = time_up;
    // use quadratic formula t = ( -v - ( v^2 - 4gd )^1/2 ) / 2g:
    double time_under_cliff = ( - v_vertical
         - sqrt( ( v_vertical * v_vertical )
               - ( 4 * - gravity * hite_meters ) ) // negative gravity = down
        ) / ( 2 * - gravity ); // ( [m/s] + ([m/s]^2 - [m/s^2]*[m])^1/2 ) / [m/s^2]
                             // = [m/s] / [m/s^2] = [s]
    double time_total = time_up + time_down_over_cliff + time_under_cliff;
    double v_horizontal = v_ms * cos( angl_rad );
    double dist_horizontal = v_ms * time_total;

    cout << time_total << " " << dist_horizontal <<endl;
}

Каждая строка кода создает новую, релевантную часть информации.При преобразовании в новый модуль я ввожу новую переменную с новым именем.Формулы, включающие более одной единицы, получают типы единиц, объясненные в комментарии.Это должно помочь выявить ошибки преобразования единиц измерения, которые в противном случае я не могу вам помочь.

Написание такого рода кода включает в себя больше набора текста, но время, сэкономленное на расчесывании головы и обращении за помощью, больше, чем восполняетэто.

Сама программа не менее эффективна.Что еще более важно, его можно легко изменить, чтобы он не превратился в неэффективный беспорядок после нескольких ревизий.

0 голосов
/ 27 февраля 2011

Требуемое уравнение:

s =ut + 1/2 at^2

s = Total distance traveled.   (Height of the cliff)
u = Starting velocity          (In your case negative as you are throwing
                                away from the target. And take into account
                                that not all the starting velocity is away
                                from the target (eg angle 0 mean u = 0))
a = acceleration               (9.81 m/s2)
t = time                       (The value you want to calculate).

Переставить формулу для решения для t

Чтобы найти решение для t, где s = 0 ...
Эта формулаВы базовый квадратик:

y = a.x^2 + b.x + c

Where:
    x/y     are variables.
    a/b/c   are constants.

Решение для квадратного уравнения, где у равен 0, равно:

x = [ -b ± sqrt(b^2 - 4ac) ] / 2a

Notice the ± symbol. There are actually two solutions to the problem.
You should be able to deduce which one is correct for you as the other
is probably negative.

In your particular case the map is:

   x ==> t
   y ==> 0

   a ==> 1/2.g
   b ==> u
   c ==> -s
0 голосов
/ 27 февраля 2011

Я бы предложил несколько вещей, чтобы немного «очистить» код:

  • Если функции возвращают int, убедитесь, что они действительно что-то возвращают. (основной не должен, но другие функции делают).

  • Рассчитайте v * sin (ang1) один раз, а затем используйте его в своей формуле. Не только эффективнее, но и сделает ваш код более понятным.

  • Подобно тому, как вы дали Пи «постоянную», сделайте это с другими числами, которые вы используете, например, 9,8 (гравитационная сила?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...