Ошибки вычисления в цикле while - PullRequest
1 голос
/ 16 февраля 2012

Я получил это, чтобы работать хорошо, но когда скорость достигает определенной скорости, он хочет, чтобы она оставалась этой скоростью, а не увеличивалась.Код делает это до некоторой степени, но когда я распечатываю значения один, значения достигают 270, а затем снижаются до 250. Я не хочу, чтобы это превышало 250 когда-либо.Кроме того, приличная переменная продолжает двигаться вверх, если она не останется той же самой величиной, когда максимальная скорость достигнута, или это правильно, и она ведет себя правильно, это просто кажется мне неправильным?Что я получаю, так это то, должно ли пройденное расстояние быть больше, если объект достиг предельной скорости, которую я установил равной 250 каждую секунду?Или я должен установить код по-разному?Например, есть ли в нем оператор if, чтобы сказать, что если mySpeed ​​= maxSpeed, то использовать только приличную ставку по-определенному?Ну, это прямо из книги по физике, так что ... Спасибо за любую помощь

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;

    namespace JumpSimR
    {
      class Program
      {
    static void Main(string[] args)
    {
        //non modifiable constants
        const double maxSpeed = 250; //terminal velocity
        const double g = 32.17; //imeriial unity feet per sec g = dv/dt

        //variablbes used for player
        double mySpeed;         //current spped of person
        double myAlt;           //altitude of the person
        double myDist;          //distance travled for jump
        double t;               //time in simulation
        //parachute variables
        bool deploy;
        bool lCord;
        bool rCord;


        double alt;

        //get the alttitude from user input
        Console.WriteLine("Enter Jump Altitued:");
        Console.WriteLine("a for 30000 Ft");
        Console.WriteLine("b for 25000 Ft");
        Console.WriteLine("c for 15000 Ft");
        String alt1 = Console.ReadLine();
        if (alt1.Equals("a"))
        {
            alt = 30000;
        }
        else if (alt1.Equals("b"))
        {
            alt = 25000;
        }
        else { alt = 15000; }
        Console.WriteLine("The Hight of the jump is " + alt);

        myAlt = alt; //assign player alt to jump hight
        t = 1;
        mySpeed = 0;
        deploy = false;

        while(myAlt > 0)
        {
            if (maxSpeed > mySpeed){
                mySpeed = g * t;
            }
            else if (mySpeed >= maxSpeed) 
            {
                mySpeed = maxSpeed;
            }

            myDist = mySpeed * t; //distace = velocity * time

            if (0 > myAlt - myDist) { myAlt = 0; } else { myAlt -= myDist; } //subtract distance travled from starting alt
            Console.WriteLine("My Speed: " + mySpeed);
            Console.WriteLine("My Distance: " + myDist);
            Console.WriteLine("Altitude: " + myAlt);
            t++;

        }

        // keep screen from going away
        // when run from VS.NET
        Console.ReadLine();

    }
}
        }  

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

Уберите остальное, вы позволили ему передать максимум для этой одной итерации:

        if (maxSpeed > mySpeed){
            mySpeed = g * t;
        }
        if (mySpeed >= maxSpeed) 
        {
            mySpeed = maxSpeed;
        }
2 голосов
/ 16 февраля 2012

В дополнение к проблеме максимальной скорости, ваш расчет расстояния также неверен.Вы сделали нечто вроде противоположной ошибки, которую я сделал в своем первоначальном ответе, вы не учитываете ускорение.

myDist = mySpeed * t; //distace = velocity * time

необходимо изменить на

myDist += mySpeed; //Old distance + current time slice's speed;

Если бы у вас не было изменения ускорения, вы могли бы использовать X t = X 0 + V 0 t + (1/2) в 2 fomula, но с момента изменения (оно меняется с 32,17 до 0 раз mySpeed >= maxSpeed), поэтому вы должны суммироватьтекущую позицию, используя каждый раз, когда срезаем текущую скоростьполезный урок

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

формула для позиции: X t = X 0 + V 0 t + (1/2) при 2 , а формула скорости равна v t = v 0 t + a

V 0 = 0 и X 0 = alt для вашей игры, поэтому ваш код может быть упрощен до

while(myAlt > 0)
{
    myAlt = alt + .5 * g * t * t; // Starting Velocity was 0 so we left it out.
    mySpeed = g * t; // Starting Velocity was 0 so we left it out.
    Console.WriteLine("My Speed: " + mySpeed);
    Console.WriteLine("My Distance: " + (alt - myAlt));
    Console.WriteLine("Altitude: " + myAlt);
    t++;

}

PS Если больше нечего обрабатывать, я нахожу Debugger.Break () более полезна, чем Console.ReadLine (), для предотвращения закрытия программы.

1 голос
/ 16 февраля 2012

Вы вычисляете новый mySpeed после , проверяя, меньше ли он максимальной скорости - вы должны сделать этот расчет до этого.Чтобы упростить ваш код, вы также можете использовать Math.Min() вместо ваших if чеков:

mySpeed =  g * t;
mySpeed  = Math.Min(maxSpeed, mySpeed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...